From fff1b2a4dc87e10eb0b4898b8e218e05dbf98e7f Mon Sep 17 00:00:00 2001 From: david Date: Fri, 5 Oct 2007 14:48:18 +0000 Subject: [PATCH] =?UTF-8?q?Importaci=C3=B3n=20inicial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.SDAC@3 6f543ec7-021b-7e4c-98c9-62eafc7fb9a8 --- .../4.10.0.10/1/CRGrid/Help/CRControls.cnt | 41 + .../4.10.0.10/1/CRGrid/Help/CRControls.hlp | Bin 0 -> 79497 bytes .../Images/CoreLab.Vcl.CRGrid.TCRDBGrid.bmp | Bin 0 -> 1782 bytes .../Images/CoreLab.Vcl.CRGrid.TCRDBGrid16.bmp | Bin 0 -> 822 bytes .../Images/CoreLab.Vcl.CRGrid.TCRDBGrid32.bmp | Bin 0 -> 3126 bytes .../Delphi8/CoreLab.Vcl.CRGrid.TCRDBGrid.bmp | Bin 0 -> 822 bytes .../CRGrid/Source/CBuilder5/crcontrols50.bpk | 126 + .../CRGrid/Source/CBuilder5/crcontrols50.cpp | 22 + .../CRGrid/Source/CBuilder5/crcontrols50.res | Bin 0 -> 1324 bytes .../CRGrid/Source/CBuilder6/crcontrols60.bpk | 126 + .../CRGrid/Source/CBuilder6/crcontrols60.cpp | 22 + .../CRGrid/Source/CBuilder6/crcontrols60.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/CRGrid/Source/CRControls.res | Bin 0 -> 1848 bytes .../1/CRGrid/Source/CRControls10p.res | Bin 0 -> 4056 bytes .../4.10.0.10/1/CRGrid/Source/CRControls9.res | Bin 0 -> 888 bytes .../1/CRGrid/Source/CRControlsReg.pas | 42 + internal/4.10.0.10/1/CRGrid/Source/CRGrid.inc | 168 + internal/4.10.0.10/1/CRGrid/Source/CRGrid.pas | 4171 ++++++ internal/4.10.0.10/1/CRGrid/Source/CRGrid.res | Bin 0 -> 1668 bytes .../1/CRGrid/Source/Delphi10/CRControls.reg | 4 + .../CRGrid/Source/Delphi10/CRControls100.cfg | 45 + .../CRGrid/Source/Delphi10/CRControls100.res | Bin 0 -> 1324 bytes .../Source/Delphi10/CoreLab.Vcl.bdsproj | 220 + .../1/CRGrid/Source/Delphi10/CoreLab.Vcl.cfg | 42 + .../1/CRGrid/Source/Delphi10/CoreLab.Vcl.dpk | 96 + .../1/CRGrid/Source/Delphi10/CoreLab.Vcl.reg | 7 + .../1/CRGrid/Source/Delphi10/CoreLab.snk | Bin 0 -> 596 bytes .../Source/Delphi10/crcontrols100.bdsproj | 181 + .../CRGrid/Source/Delphi10/crcontrols100.dpk | 39 + .../CRGrid/Source/Delphi11/CRControls105.res | Bin 0 -> 1324 bytes .../Source/Delphi11/CoreLab.Vcl.bdsproj | 203 + .../1/CRGrid/Source/Delphi11/CoreLab.Vcl.cfg | 39 + .../1/CRGrid/Source/Delphi11/CoreLab.Vcl.dpk | 96 + .../1/CRGrid/Source/Delphi11/CoreLab.snk | Bin 0 -> 596 bytes .../Source/Delphi11/crcontrols105.bdsproj | 183 + .../CRGrid/Source/Delphi11/crcontrols105.cfg | 42 + .../CRGrid/Source/Delphi11/crcontrols105.dpk | 39 + .../1/CRGrid/Source/Delphi5/crcontrols50.cfg | 41 + .../1/CRGrid/Source/Delphi5/crcontrols50.dof | 110 + .../1/CRGrid/Source/Delphi5/crcontrols50.dpk | 36 + .../1/CRGrid/Source/Delphi5/crcontrols50.res | Bin 0 -> 1324 bytes .../1/CRGrid/Source/Delphi6/crcontrols60.cfg | 41 + .../1/CRGrid/Source/Delphi6/crcontrols60.dof | 108 + .../1/CRGrid/Source/Delphi6/crcontrols60.dpk | 38 + .../1/CRGrid/Source/Delphi6/crcontrols60.res | Bin 0 -> 1324 bytes .../1/CRGrid/Source/Delphi7/crcontrols70.cfg | 44 + .../1/CRGrid/Source/Delphi7/crcontrols70.dof | 150 + .../1/CRGrid/Source/Delphi7/crcontrols70.dpk | 38 + .../1/CRGrid/Source/Delphi7/crcontrols70.res | Bin 0 -> 1324 bytes .../CRGrid/Source/Delphi8/CoreLab.Vcl.bdsproj | 170 + .../1/CRGrid/Source/Delphi8/CoreLab.Vcl.cfg | 42 + .../1/CRGrid/Source/Delphi8/CoreLab.Vcl.dpk | 96 + .../1/CRGrid/Source/Delphi8/CoreLab.Vcl.reg | 7 + .../1/CRGrid/Source/Delphi8/CoreLab.snk | Bin 0 -> 596 bytes .../1/CRGrid/Source/Delphi9/CRControls.reg | 4 + .../1/CRGrid/Source/Delphi9/CRControls90.cfg | 43 + .../1/CRGrid/Source/Delphi9/CRControls90.res | Bin 0 -> 1324 bytes .../CRGrid/Source/Delphi9/CoreLab.Vcl.bdsproj | 170 + .../1/CRGrid/Source/Delphi9/CoreLab.Vcl.cfg | 42 + .../1/CRGrid/Source/Delphi9/CoreLab.Vcl.dpk | 96 + .../1/CRGrid/Source/Delphi9/CoreLab.Vcl.reg | 7 + .../1/CRGrid/Source/Delphi9/CoreLab.snk | Bin 0 -> 596 bytes .../Source/Delphi9/crcontrols90.bdsproj | 172 + .../1/CRGrid/Source/Delphi9/crcontrols90.dpk | 39 + .../4.10.0.10/1/CRGrid/Source/Net/CRGrid.inc | 1 + .../Source/Net/CoreLab.Vcl.CRControlsReg.pas | 17 + .../CRGrid/Source/Net/CoreLab.Vcl.CRGrid.pas | 5 + .../CoreLab.DbTools.Interfaces.dll | Bin 0 -> 94208 bytes .../4.10.0.10/1/Demos/InstallDemoObjects.sql | 155 + .../1/Demos/UninstallDemoObjects.sql | 28 + .../Miscellaneous/CBuilder/BDS2006.bdsproj | 221 + .../Win32/Miscellaneous/CBuilder/BDS2006.cpp | 34 + .../Win32/Miscellaneous/CBuilder/BDS2006.res | Bin 0 -> 4396 bytes .../CBuilder/CBuilder2007.cbproj | 104 + .../Miscellaneous/CBuilder/CBuilder2007.cpp | 34 + .../Miscellaneous/CBuilder/CBuilder2007.res | Bin 0 -> 4396 bytes .../Miscellaneous/CBuilder/CBuilder5.bpr | 129 + .../Miscellaneous/CBuilder/CBuilder5.cpp | 21 + .../Miscellaneous/CBuilder/CBuilder5.res | Bin 0 -> 876 bytes .../Miscellaneous/CBuilder/CBuilder6.bpr | 146 + .../Miscellaneous/CBuilder/CBuilder6.cpp | 21 + .../Miscellaneous/CBuilder/CBuilder6.res | Bin 0 -> 876 bytes .../Win32/Miscellaneous/CBuilder/Main.cpp | 60 + .../Win32/Miscellaneous/CBuilder/Main.dfm | Bin 0 -> 1956 bytes .../Demos/Win32/Miscellaneous/CBuilder/Main.h | 53 + .../Win32/Miscellaneous/CBuilder/ReadMe.txt | 7 + .../Demos/Win32/Miscellaneous/Dll/DLLMain.dfm | 92 + .../Demos/Win32/Miscellaneous/Dll/DLLMain.pas | 149 + .../Demos/Win32/Miscellaneous/Dll/ExeMain.dfm | 203 + .../Demos/Win32/Miscellaneous/Dll/ExeMain.pas | 193 + .../Win32/Miscellaneous/Dll/MS_DLL.bdsproj | 158 + .../Demos/Win32/Miscellaneous/Dll/MS_DLL.cfg | 41 + .../Demos/Win32/Miscellaneous/Dll/MS_DLL.dpr | 36 + .../Miscellaneous/Dll/MS_DLLGroup.bdsgroup | 20 + .../Win32/Miscellaneous/Dll/MS_DLLGroup.bpg | 23 + .../Win32/Miscellaneous/Dll/MS_Exe.bdsproj | 158 + .../Demos/Win32/Miscellaneous/Dll/MS_Exe.cfg | 41 + .../Demos/Win32/Miscellaneous/Dll/MS_Exe.dpr | 14 + .../Demos/Win32/Miscellaneous/Dll/MS_Exe.res | Bin 0 -> 1540 bytes .../Demos/Win32/Miscellaneous/Dll/ReadMe.txt | 10 + .../Win32/Miscellaneous/FailOver/About.dfm | 108 + .../Win32/Miscellaneous/FailOver/About.pas | 67 + .../Win32/Miscellaneous/FailOver/Data.dfm | 112 + .../Win32/Miscellaneous/FailOver/Data.pas | 96 + .../Miscellaneous/FailOver/FailOver.bdsproj | 173 + .../Win32/Miscellaneous/FailOver/FailOver.dpr | 15 + .../Win32/Miscellaneous/FailOver/FailOver.res | Bin 0 -> 876 bytes .../FailOver/FailOver_VclNet.bdsproj | 184 + .../FailOver/FailOver_VclNet.dpr | 17 + .../FailOver/FailOver_VclNet.res | Bin 0 -> 876 bytes .../Win32/Miscellaneous/FailOver/Main.dfm | 758 ++ .../Win32/Miscellaneous/FailOver/Main.pas | 533 + .../Win32/Miscellaneous/FailOver/ReadMe.txt | 10 + .../Win32/Miscellaneous/Midas/Client.bdsproj | 160 + .../Win32/Miscellaneous/Midas/Client.cfg | 37 + .../Win32/Miscellaneous/Midas/Client.dpr | 13 + .../Win32/Miscellaneous/Midas/Client.res | Bin 0 -> 1540 bytes .../Win32/Miscellaneous/Midas/ClientForm.dfm | 179 + .../Win32/Miscellaneous/Midas/ClientForm.pas | 149 + .../Demos/Win32/Miscellaneous/Midas/Data.dfm | 55 + .../Demos/Win32/Miscellaneous/Midas/Data.pas | 100 + .../Win32/Miscellaneous/Midas/MidasGroup.bpg | 24 + .../Win32/Miscellaneous/Midas/Midas_TLB.dcr | Bin 0 -> 32 bytes .../Win32/Miscellaneous/Midas/Midas_TLB.pas | 100 + .../Win32/Miscellaneous/Midas/ReadMe.txt | 9 + .../Win32/Miscellaneous/Midas/Server.bdsproj | 158 + .../Win32/Miscellaneous/Midas/Server.cfg | 41 + .../Win32/Miscellaneous/Midas/Server.dpr | 17 + .../Win32/Miscellaneous/Midas/Server.res | Bin 0 -> 1540 bytes .../Win32/Miscellaneous/Midas/Server.tlb | Bin 0 -> 1568 bytes .../Win32/Miscellaneous/Midas/ServerForm.dfm | 180 + .../Win32/Miscellaneous/Midas/ServerForm.pas | 160 + .../Win32/Miscellaneous/Midas/Server_TLB.pas | 119 + .../Win32/Miscellaneous/Performance/Debug.pas | 76 + .../Win32/Miscellaneous/Performance/Main.dfm | 808 ++ .../Win32/Miscellaneous/Performance/Main.pas | 1171 ++ .../Performance/Performance.bdsproj | 158 + .../Miscellaneous/Performance/Performance.cfg | 41 + .../Miscellaneous/Performance/Performance.dpr | 13 + .../Miscellaneous/Performance/Performance.res | Bin 0 -> 876 bytes .../Miscellaneous/Performance/ReadMe.txt | 8 + .../Miscellaneous/VirtualTableCB/Data1.vtd | Bin 0 -> 8438 bytes .../Miscellaneous/VirtualTableCB/Main.cpp | 86 + .../Miscellaneous/VirtualTableCB/Main.dfm | 527 + .../Win32/Miscellaneous/VirtualTableCB/Main.h | 68 + .../Miscellaneous/VirtualTableCB/ReadMe.txt | 9 + .../Miscellaneous/VirtualTableCB/VTable.bpr | 134 + .../Miscellaneous/VirtualTableCB/VTable.cpp | 33 + .../Miscellaneous/VirtualTableCB/VTable.res | Bin 0 -> 876 bytes .../Win32/SdacDemo/Base/CategoryFrame.dfm | 5 + .../Win32/SdacDemo/Base/CategoryFrame.pas | 193 + .../Win32/SdacDemo/Base/CategoryFrame.xfm | 5 + .../1/Demos/Win32/SdacDemo/Base/DacDemo.inc | 13 + .../1/Demos/Win32/SdacDemo/Base/DemoBase.pas | 416 + .../1/Demos/Win32/SdacDemo/Base/DemoForm.dfm | 937 ++ .../1/Demos/Win32/SdacDemo/Base/DemoForm.pas | 667 + .../1/Demos/Win32/SdacDemo/Base/DemoForm.xfm | 792 ++ .../1/Demos/Win32/SdacDemo/Base/DemoFrame.dfm | 7 + .../1/Demos/Win32/SdacDemo/Base/DemoFrame.pas | 57 + .../1/Demos/Win32/SdacDemo/Base/DemoFrame.xfm | 13 + .../Demos/Win32/SdacDemo/Base/HtmlConsts.pas | 142 + .../1/Demos/Win32/SdacDemo/Base/SdacAbout.dfm | 3078 +++++ .../1/Demos/Win32/SdacDemo/Base/SdacAbout.pas | 127 + .../Win32/SdacDemo/Base/SdacDemoForm.dfm | 896 ++ .../Win32/SdacDemo/Base/SdacDemoForm.pas | 184 + .../1/Demos/Win32/SdacDemo/Base/WindowsXP.res | Bin 0 -> 648 bytes .../Win32/SdacDemo/CRDBGrid/CRDBGrid.dfm | 264 + .../Win32/SdacDemo/CRDBGrid/CRDBGrid.pas | 129 + .../SdacDemo/CachedUpdates/CachedUpdates.dfm | 372 + .../SdacDemo/CachedUpdates/CachedUpdates.pas | 319 + .../SdacDemo/CachedUpdates/UpdateAction.dfm | 139 + .../SdacDemo/CachedUpdates/UpdateAction.pas | 48 + .../SdacDemo/ConnectDialog/ConnectDialog.dfm | 115 + .../SdacDemo/ConnectDialog/ConnectDialog.pas | 93 + .../SdacDemo/ConnectDialog/ConnectForm.dfm | 112 + .../SdacDemo/ConnectDialog/ConnectForm.pas | 123 + .../ConnectDialog/InheritedConnectForm.dfm | 43 + .../ConnectDialog/InheritedConnectForm.pas | 32 + .../SdacDemo/ConnectDialog/MyConnectForm.dfm | 151 + .../SdacDemo/ConnectDialog/MyConnectForm.pas | 128 + .../Win32/SdacDemo/FetchAll/FetchAll.dfm | 188 + .../Win32/SdacDemo/FetchAll/FetchAll.pas | 100 + .../FilterAndIndex/FilterAndIndex.dfm | 311 + .../FilterAndIndex/FilterAndIndex.pas | 206 + .../1/Demos/Win32/SdacDemo/Loader/Fetch.dfm | 62 + .../1/Demos/Win32/SdacDemo/Loader/Fetch.pas | 72 + .../1/Demos/Win32/SdacDemo/Loader/Loader.dfm | 185 + .../1/Demos/Win32/SdacDemo/Loader/Loader.pas | 245 + .../SdacDemo/LongStrings/LongStrings.dfm | 186 + .../SdacDemo/LongStrings/LongStrings.pas | 138 + .../SdacDemo/MasterDetail/MasterDetail.dfm | 277 + .../SdacDemo/MasterDetail/MasterDetail.pas | 189 + .../Win32/SdacDemo/Pictures/Pictures.dfm | 170 + .../Win32/SdacDemo/Pictures/Pictures.pas | 107 + .../Win32/SdacDemo/Pictures/Sandstone.bmp | Bin 0 -> 32854 bytes .../1/Demos/Win32/SdacDemo/Pictures/World.bmp | Bin 0 -> 21718 bytes .../1/Demos/Win32/SdacDemo/Query/Query.dfm | 310 + .../1/Demos/Win32/SdacDemo/Query/Query.pas | 276 + .../1/Demos/Win32/SdacDemo/SdacDemo.bdsproj | 164 + .../1/Demos/Win32/SdacDemo/SdacDemo.cfg | 41 + .../1/Demos/Win32/SdacDemo/SdacDemo.dof | 2 + .../1/Demos/Win32/SdacDemo/SdacDemo.dpr | 51 + .../1/Demos/Win32/SdacDemo/SdacDemo.res | Bin 0 -> 876 bytes .../SdacDemo/ServerCursors/ServerCursors.dfm | 230 + .../SdacDemo/ServerCursors/ServerCursors.pas | 136 + .../SdacDemo/ServiceBroker/ServiceBroker.dfm | 312 + .../SdacDemo/ServiceBroker/ServiceBroker.pas | 279 + .../1/Demos/Win32/SdacDemo/Sql/Sql.dfm | 139 + .../1/Demos/Win32/SdacDemo/Sql/Sql.pas | 216 + .../Win32/SdacDemo/StoredProc/StoredProc.dfm | 157 + .../Win32/SdacDemo/StoredProc/StoredProc.pas | 170 + .../StoredProcUpdates/StoredProcUpdates.dfm | 101 + .../StoredProcUpdates/StoredProcUpdates.pas | 133 + .../1/Demos/Win32/SdacDemo/Table/Table.dfm | 180 + .../1/Demos/Win32/SdacDemo/Table/Table.pas | 176 + .../1/Demos/Win32/SdacDemo/Text/Text.dfm | 162 + .../1/Demos/Win32/SdacDemo/Text/Text.pas | 100 + .../Demos/Win32/SdacDemo/Threads/Threads.dfm | 391 + .../Demos/Win32/SdacDemo/Threads/Threads.pas | 382 + .../Win32/SdacDemo/Threads/ThreadsData.dfm | 36 + .../Win32/SdacDemo/Threads/ThreadsData.pas | 33 + .../Win32/SdacDemo/UpdateSQL/UpdateSQL.dfm | 362 + .../Win32/SdacDemo/UpdateSQL/UpdateSQL.pas | 191 + .../Win32/SdacDemo/VirtualTable/Data1.xml | 121 + .../Win32/SdacDemo/VirtualTable/VTable.dfm | 565 + .../Win32/SdacDemo/VirtualTable/VTable.pas | 201 + .../Win32/SdacDemo/VirtualTable/VTable.xfm | 581 + .../MSSQLCompact/MSSQLCompact.bdsproj | 173 + .../MSSQLCompact/MSSQLCompact.cfg | 44 + .../MSSQLCompact/MSSQLCompact.dpr | 13 + .../MSSQLCompact/MSSQLCompact.res | Bin 0 -> 876 bytes .../MSSQLCompact/MSSQLCompact_VclNet.bdsproj | 183 + .../MSSQLCompact/MSSQLCompact_VclNet.dpr | 15 + .../MSSQLCompact/MSSQLCompact_VclNet.res | Bin 0 -> 876 bytes .../TechnologySpecific/MSSQLCompact/Main.dfm | 353 + .../TechnologySpecific/MSSQLCompact/Main.pas | 268 + .../MSSQLCompact/ReadMe.txt | 7 + .../TechnologySpecific/MSSQLCompact/test.sdf | Bin 0 -> 36864 bytes .../ThirdParty/FastReport/FR3/Demo/FRDemo.dpr | 15 + .../ThirdParty/FastReport/FR3/Demo/FRDemo.res | Bin 0 -> 3372 bytes .../ThirdParty/FastReport/FR3/Demo/Unit1.dfm | 832 ++ .../ThirdParty/FastReport/FR3/Demo/Unit1.pas | 74 + .../ThirdParty/FastReport/FR3/Demo/Unit2.dfm | 60 + .../ThirdParty/FastReport/FR3/Demo/Unit2.pas | 31 + .../ThirdParty/FastReport/FR3/ReadMe.txt | 10 + .../ThirdParty/FastReport/FR3/dclfrxSDAC5.cfg | 42 + .../ThirdParty/FastReport/FR3/dclfrxSDAC5.dpk | 39 + .../ThirdParty/FastReport/FR3/dclfrxSDAC5.res | Bin 0 -> 1536 bytes .../ThirdParty/FastReport/FR3/dclfrxSDAC6.dpk | 39 + .../ThirdParty/FastReport/FR3/dclfrxSDAC7.dpk | 39 + .../ThirdParty/FastReport/FR3/file_id.diz | 5 + .../FastReport/FR3/frxDACComponents.pas | 527 + .../FastReport/FR3/frxDACEditor.pas | 73 + .../ThirdParty/FastReport/FR3/frxSDAC5.bpk | 44 + .../ThirdParty/FastReport/FR3/frxSDAC5.cfg | 41 + .../ThirdParty/FastReport/FR3/frxSDAC5.cpp | 26 + .../ThirdParty/FastReport/FR3/frxSDAC5.dpk | 46 + .../ThirdParty/FastReport/FR3/frxSDAC5.res | Bin 0 -> 1536 bytes .../ThirdParty/FastReport/FR3/frxSDAC6.bpk | 147 + .../ThirdParty/FastReport/FR3/frxSDAC6.cfg | 42 + .../ThirdParty/FastReport/FR3/frxSDAC6.cpp | 17 + .../ThirdParty/FastReport/FR3/frxSDAC6.dpk | 47 + .../ThirdParty/FastReport/FR3/frxSDAC6.res | Bin 0 -> 1536 bytes .../ThirdParty/FastReport/FR3/frxSDAC7.cfg | 41 + .../ThirdParty/FastReport/FR3/frxSDAC7.dpk | 48 + .../ThirdParty/FastReport/FR3/frxSDAC7.res | Bin 0 -> 1536 bytes .../FastReport/FR3/frxSDACComponents.pas | 340 + .../FastReport/FR3/frxSDACEditor.pas | 54 + .../ThirdParty/FastReport/FR3/frxSDACRTTI.pas | 65 + .../ThirdParty/FastReport/FR3/frxSDACReg.dcr | Bin 0 -> 492 bytes .../ThirdParty/FastReport/FR3/frxSDACReg.pas | 38 + .../FastReport/FR3/frxsDACComponents.res | Bin 0 -> 460 bytes .../FastReport/FR4/CBuilder5/frxSDAC5.bpk | 92 + .../FastReport/FR4/CBuilder5/frxSDAC5.cpp | 27 + .../FastReport/FR4/CBuilder5/fsDAC5.bpk | 106 + .../FastReport/FR4/CBuilder5/fsDAC5.cpp | 24 + .../FastReport/FR4/CBuilder5/fsSDAC5.bpk | 108 + .../FastReport/FR4/CBuilder5/fsSDAC5.cpp | 26 + .../FastReport/FR4/CBuilder6/frxSDAC6.bpk | 147 + .../FastReport/FR4/CBuilder6/frxSDAC6.cpp | 17 + .../FastReport/FR4/CBuilder6/fsDAC6.bpk | 121 + .../FastReport/FR4/CBuilder6/fsDAC6.cpp | 18 + .../FastReport/FR4/CBuilder6/fsSDAC6.bpk | 124 + .../FastReport/FR4/CBuilder6/fsSDAC6.cpp | 18 + .../FR4/Delphi10/dclfrxSDAC10.bdsproj | 175 + .../FastReport/FR4/Delphi10/dclfrxSDAC10.dpk | 40 + .../FR4/Delphi10/dclfsSDAC10.bdsproj | 19 + .../FastReport/FR4/Delphi10/dclfsSDAC10.dpk | 42 + .../FastReport/FR4/Delphi10/frxDAC10.bdsproj | 175 + .../FastReport/FR4/Delphi10/frxDAC10.dpk | 46 + .../FastReport/FR4/Delphi10/frxSDAC10.bdsproj | 175 + .../FastReport/FR4/Delphi10/frxSDAC10.dpk | 51 + .../FastReport/FR4/Delphi10/fsDAC10.bdsproj | 19 + .../FastReport/FR4/Delphi10/fsDAC10.dpk | 41 + .../FastReport/FR4/Delphi10/fsSDAC10.bdsproj | 19 + .../FastReport/FR4/Delphi10/fsSDAC10.dpk | 43 + .../FastReport/FR4/Delphi11/dclfrxSDAC11.dpk | 40 + .../FR4/Delphi11/dclfrxSDAC11.dproj | 82 + .../FastReport/FR4/Delphi11/dclfsSDAC11.dpk | 42 + .../FastReport/FR4/Delphi11/dclfsSDAC11.dproj | 83 + .../FastReport/FR4/Delphi11/frxDAC11.dpk | 46 + .../FastReport/FR4/Delphi11/frxDAC11.dproj | 83 + .../FastReport/FR4/Delphi11/frxSDAC11.dpk | 51 + .../FastReport/FR4/Delphi11/frxSDAC11.dproj | 88 + .../FastReport/FR4/Delphi11/fsDAC11.dpk | 41 + .../FastReport/FR4/Delphi11/fsDAC11.dproj | 81 + .../FastReport/FR4/Delphi11/fsSDAC11.dpk | 43 + .../FastReport/FR4/Delphi11/fsSDAC11.dproj | 83 + .../FastReport/FR4/Delphi5/dclfrxSDAC5.dpk | 39 + .../FastReport/FR4/Delphi5/dclfsSDAC5.dpk | 41 + .../FastReport/FR4/Delphi5/frxDAC5.dpk | 46 + .../FastReport/FR4/Delphi5/frxSDAC5.dpk | 49 + .../FastReport/FR4/Delphi5/fsDAC5.dpk | 41 + .../FastReport/FR4/Delphi5/fsSDAC5.dpk | 43 + .../FastReport/FR4/Delphi6/dclfrxSDAC6.dpk | 40 + .../FastReport/FR4/Delphi6/dclfsSDAC6.dpk | 42 + .../FastReport/FR4/Delphi6/frxDAC6.dpk | 46 + .../FastReport/FR4/Delphi6/frxSDAC6.dpk | 51 + .../FastReport/FR4/Delphi6/fsDAC6.dpk | 41 + .../FastReport/FR4/Delphi6/fsSDAC6.dpk | 43 + .../FastReport/FR4/Delphi7/dclfrxSDAC7.dpk | 40 + .../FastReport/FR4/Delphi7/dclfsSDAC7.dpk | 42 + .../FastReport/FR4/Delphi7/frxDAC7.dpk | 46 + .../FastReport/FR4/Delphi7/frxSDAC7.dpk | 49 + .../FastReport/FR4/Delphi7/fsDAC7.dpk | 41 + .../FastReport/FR4/Delphi7/fsSDAC7.dpk | 43 + .../FR4/Delphi9/dclfrxSDAC9.bdsproj | 173 + .../FastReport/FR4/Delphi9/dclfrxSDAC9.dpk | 40 + .../FastReport/FR4/Delphi9/dclfsSDAC9.bdsproj | 19 + .../FastReport/FR4/Delphi9/dclfsSDAC9.dpk | 42 + .../FastReport/FR4/Delphi9/frxDAC9.bdsproj | 173 + .../FastReport/FR4/Delphi9/frxDAC9.dpk | 46 + .../FastReport/FR4/Delphi9/frxSDAC9.bdsproj | 173 + .../FastReport/FR4/Delphi9/frxSDAC9.dpk | 51 + .../FastReport/FR4/Delphi9/fsDAC9.bdsproj | 168 + .../FastReport/FR4/Delphi9/fsDAC9.dpk | 41 + .../FastReport/FR4/Delphi9/fsSDAC9.bdsproj | 168 + .../FastReport/FR4/Delphi9/fsSDAC9.dpk | 43 + .../ThirdParty/FastReport/FR4/Demo/FRDemo.dpr | 15 + .../ThirdParty/FastReport/FR4/Demo/FRDemo.res | Bin 0 -> 3372 bytes .../ThirdParty/FastReport/FR4/Demo/Unit1.dfm | 794 ++ .../ThirdParty/FastReport/FR4/Demo/Unit1.pas | 74 + .../ThirdParty/FastReport/FR4/Demo/Unit2.dfm | 60 + .../ThirdParty/FastReport/FR4/Demo/Unit2.pas | 31 + .../ThirdParty/FastReport/FR4/ReadMe.txt | 37 + .../ThirdParty/FastReport/FR4/file_id.diz | 5 + .../FastReport/FR4/frxDACComponents.pas | 513 + .../FastReport/FR4/frxDACEditor.pas | 50 + .../FastReport/FR4/frxSDACComponents.pas | 404 + .../FastReport/FR4/frxSDACComponents.res | Bin 0 -> 900 bytes .../FastReport/FR4/frxSDACEditor.pas | 77 + .../ThirdParty/FastReport/FR4/frxSDACRTTI.pas | 69 + .../ThirdParty/FastReport/FR4/frxSDACReg.dcr | Bin 0 -> 1868 bytes .../ThirdParty/FastReport/FR4/frxSDACReg.pas | 38 + .../ThirdParty/FastReport/FR4/fs_idacrtti.pas | 620 + .../ThirdParty/FastReport/FR4/fs_isdacreg.dcr | Bin 0 -> 1852 bytes .../ThirdParty/FastReport/FR4/fs_isdacreg.pas | 39 + .../FastReport/FR4/fs_isdacrtti.pas | 214 + .../Win32/ThirdParty/FastReport/ReadMe.txt | 10 + .../ThirdParty/InfoPower/Demo/IPDemo.cfg | 41 + .../ThirdParty/InfoPower/Demo/IPDemo.dpr | 13 + .../ThirdParty/InfoPower/Demo/IPDemo.res | Bin 0 -> 1540 bytes .../Win32/ThirdParty/InfoPower/Demo/Main.dfm | 371 + .../Win32/ThirdParty/InfoPower/Demo/Main.pas | 69 + .../Demos/Win32/ThirdParty/InfoPower/MSIP.pas | 299 + .../Win32/ThirdParty/InfoPower/MSIPPack.cfg | 41 + .../Win32/ThirdParty/InfoPower/MSIPPack.dpk | 41 + .../Win32/ThirdParty/InfoPower/MSIPPack.res | Bin 0 -> 1540 bytes .../Win32/ThirdParty/InfoPower/ReadMe.txt | 6 + .../ThirdParty/IntraWeb/IW5/IntraWeb.dof | 3 + .../ThirdParty/IntraWeb/IW5/IntraWeb.dpr | 35 + .../ThirdParty/IntraWeb/IW5/IntraWeb.res | Bin 0 -> 876 bytes .../ThirdParty/IntraWeb/IW5/IntraWebISAPI.dpr | 45 + .../Win32/ThirdParty/IntraWeb/IW5/ReadMe.txt | 10 + .../IntraWeb/IW5/ServerController.dfm | 43 + .../IntraWeb/IW5/ServerController.pas | 275 + .../Win32/ThirdParty/IntraWeb/IW5/uBase.dfm | 463 + .../Win32/ThirdParty/IntraWeb/IW5/uBase.pas | 243 + .../IntraWeb/IW5/uCachedUpdates.dfm | 1163 ++ .../IntraWeb/IW5/uCachedUpdates.pas | 479 + .../Win32/ThirdParty/IntraWeb/IW5/uData.dfm | 33 + .../Win32/ThirdParty/IntraWeb/IW5/uData.pas | 153 + .../Win32/ThirdParty/IntraWeb/IW5/uMain.dfm | 839 ++ .../Win32/ThirdParty/IntraWeb/IW5/uMain.pas | 177 + .../ThirdParty/IntraWeb/IW5/uMasterDetail.dfm | 1013 ++ .../ThirdParty/IntraWeb/IW5/uMasterDetail.pas | 251 + .../Win32/ThirdParty/IntraWeb/IW5/uQuery.dfm | 615 + .../Win32/ThirdParty/IntraWeb/IW5/uQuery.pas | 229 + .../ThirdParty/IntraWeb/IW7/IntraWeb.bdsproj | 332 + .../ThirdParty/IntraWeb/IW7/IntraWeb.dpr | 41 + .../ThirdParty/IntraWeb/IW7/IntraWeb.res | Bin 0 -> 876 bytes .../IntraWeb/IW7/IntraWebISAPI.bdsproj | 328 + .../ThirdParty/IntraWeb/IW7/IntraWebISAPI.dpr | 55 + .../ThirdParty/IntraWeb/IW7/IntraWebISAPI.res | Bin 0 -> 876 bytes .../Win32/ThirdParty/IntraWeb/IW7/ReadMe.txt | 10 + .../IntraWeb/IW7/ServerController.dfm | 79 + .../IntraWeb/IW7/ServerController.pas | 279 + .../Win32/ThirdParty/IntraWeb/IW7/uBase.dfm | 603 + .../Win32/ThirdParty/IntraWeb/IW7/uBase.pas | 245 + .../IntraWeb/IW7/uCachedUpdates.dfm | 1405 ++ .../IntraWeb/IW7/uCachedUpdates.pas | 481 + .../Win32/ThirdParty/IntraWeb/IW7/uData.dfm | 29 + .../Win32/ThirdParty/IntraWeb/IW7/uData.pas | 149 + .../Win32/ThirdParty/IntraWeb/IW7/uMain.dfm | 1089 ++ .../Win32/ThirdParty/IntraWeb/IW7/uMain.pas | 183 + .../ThirdParty/IntraWeb/IW7/uMasterDetail.dfm | 1263 ++ .../ThirdParty/IntraWeb/IW7/uMasterDetail.pas | 255 + .../Win32/ThirdParty/IntraWeb/IW7/uQuery.dfm | 809 ++ .../Win32/ThirdParty/IntraWeb/IW7/uQuery.pas | 231 + .../Win32/ThirdParty/QuickReport/Main.dfm | 51 + .../Win32/ThirdParty/QuickReport/Main.pas | 49 + .../Win32/ThirdParty/QuickReport/QReport.cfg | 41 + .../Win32/ThirdParty/QuickReport/QReport.dpr | 15 + .../Win32/ThirdParty/QuickReport/QReport.res | Bin 0 -> 1540 bytes .../Win32/ThirdParty/QuickReport/ReadMe.txt | 13 + .../Win32/ThirdParty/QuickReport/Report1.dfm | 985 ++ .../Win32/ThirdParty/QuickReport/Report1.pas | 78 + .../ThirdParty/ReportBuilder/EndUser.dpr | 13 + .../ThirdParty/ReportBuilder/EndUser.res | Bin 0 -> 876 bytes .../Win32/ThirdParty/ReportBuilder/ReadMe.txt | 10 + .../ReportBuilder/Reports/Orders.rtm | 592 + .../Win32/ThirdParty/ReportBuilder/daSDAC.pas | 763 ++ .../ThirdParty/ReportBuilder/myEURpt.dfm | 1159 ++ .../ThirdParty/ReportBuilder/myEURpt.pas | 260 + .../Win32/ThirdParty/ReportBuilder/rbSDAC.cfg | 41 + .../Win32/ThirdParty/ReportBuilder/rbSDAC.dpk | 42 + .../Win32/ThirdParty/ReportBuilder/rbSDAC.res | Bin 0 -> 1536 bytes .../dotNet/Miscellaneous/ASPNet/Global.asax | 2 + .../dotNet/Miscellaneous/ASPNet/Global.pas | 99 + .../dotNet/Miscellaneous/ASPNet/ReadMe.txt | 8 + .../dotNet/Miscellaneous/ASPNet/Web.bdsproj | 186 + .../dotNet/Miscellaneous/ASPNet/Web.config | 77 + .../Demos/dotNet/Miscellaneous/ASPNet/Web.dpr | 82 + .../dotNet/Miscellaneous/ASPNet/WebForm.aspx | 136 + .../dotNet/Miscellaneous/ASPNet/WebForm.pas | 265 + .../dotNet/Miscellaneous/ASPNet/WebForm.resx | 109 + .../dotNet/Miscellaneous/Failover/About.nfm | 108 + .../dotNet/Miscellaneous/Failover/About.pas | 67 + .../dotNet/Miscellaneous/Failover/Data.nfm | 112 + .../dotNet/Miscellaneous/Failover/Data.pas | 96 + .../Failover/FailOver_VclNet.bdsproj | 184 + .../Failover/FailOver_VclNet.dpr | 17 + .../Failover/FailOver_VclNet.res | Bin 0 -> 876 bytes .../dotNet/Miscellaneous/Failover/Main.nfm | 758 ++ .../dotNet/Miscellaneous/Failover/Main.pas | 533 + .../Miscellaneous/WinForms/DataSet.bdsproj | 177 + .../dotNet/Miscellaneous/WinForms/DataSet.dpr | 81 + .../Miscellaneous/WinForms/MainForm.pas | 312 + .../Miscellaneous/WinForms/MainForm.resx | 208 + .../dotNet/Miscellaneous/WinForms/ReadMe.txt | 7 + .../dotNet/SdacDemo/Base/CategoryFrame.nfm | 5 + .../dotNet/SdacDemo/Base/CategoryFrame.pas | 193 + .../1/Demos/dotNet/SdacDemo/Base/DacDemo.inc | 13 + .../1/Demos/dotNet/SdacDemo/Base/DemoBase.pas | 416 + .../1/Demos/dotNet/SdacDemo/Base/DemoForm.nfm | 937 ++ .../1/Demos/dotNet/SdacDemo/Base/DemoForm.pas | 667 + .../Demos/dotNet/SdacDemo/Base/DemoFrame.nfm | 7 + .../Demos/dotNet/SdacDemo/Base/DemoFrame.pas | 57 + .../Demos/dotNet/SdacDemo/Base/HtmlConsts.pas | 142 + .../Demos/dotNet/SdacDemo/Base/SdacAbout.nfm | 3078 +++++ .../Demos/dotNet/SdacDemo/Base/SdacAbout.pas | 127 + .../dotNet/SdacDemo/Base/SdacDemoForm.nfm | 896 ++ .../dotNet/SdacDemo/Base/SdacDemoForm.pas | 184 + .../dotNet/SdacDemo/CRDBGrid/CRDBGrid.nfm | 264 + .../dotNet/SdacDemo/CRDBGrid/CRDBGrid.pas | 129 + .../SdacDemo/CachedUpdates/CachedUpdates.nfm | 372 + .../SdacDemo/CachedUpdates/CachedUpdates.pas | 319 + .../SdacDemo/CachedUpdates/UpdateAction.nfm | 139 + .../SdacDemo/CachedUpdates/UpdateAction.pas | 48 + .../SdacDemo/ConnectDialog/ConnectDialog.nfm | 115 + .../SdacDemo/ConnectDialog/ConnectDialog.pas | 93 + .../SdacDemo/ConnectDialog/ConnectForm.nfm | 112 + .../SdacDemo/ConnectDialog/ConnectForm.pas | 123 + .../ConnectDialog/InheritedConnectForm.nfm | 43 + .../ConnectDialog/InheritedConnectForm.pas | 32 + .../SdacDemo/ConnectDialog/MyConnectForm.nfm | 151 + .../SdacDemo/ConnectDialog/MyConnectForm.pas | 128 + .../dotNet/SdacDemo/FetchAll/FetchAll.nfm | 188 + .../dotNet/SdacDemo/FetchAll/FetchAll.pas | 100 + .../FilterAndIndex/FilterAndIndex.nfm | 311 + .../FilterAndIndex/FilterAndIndex.pas | 206 + .../1/Demos/dotNet/SdacDemo/Loader/Fetch.nfm | 62 + .../1/Demos/dotNet/SdacDemo/Loader/Fetch.pas | 72 + .../1/Demos/dotNet/SdacDemo/Loader/Loader.nfm | 185 + .../1/Demos/dotNet/SdacDemo/Loader/Loader.pas | 245 + .../SdacDemo/LongStrings/LongStrings.nfm | 186 + .../SdacDemo/LongStrings/LongStrings.pas | 138 + .../SdacDemo/MasterDetail/MasterDetail.nfm | 277 + .../SdacDemo/MasterDetail/MasterDetail.pas | 189 + .../dotNet/SdacDemo/Pictures/Pictures.nfm | 170 + .../dotNet/SdacDemo/Pictures/Pictures.pas | 107 + .../1/Demos/dotNet/SdacDemo/Query/Query.nfm | 310 + .../1/Demos/dotNet/SdacDemo/Query/Query.pas | 276 + .../dotNet/SdacDemo/SdacDemo_VclNet.bdsproj | 222 + .../Demos/dotNet/SdacDemo/SdacDemo_VclNet.cfg | 47 + .../Demos/dotNet/SdacDemo/SdacDemo_VclNet.dpr | 60 + .../Demos/dotNet/SdacDemo/SdacDemo_VclNet.res | Bin 0 -> 876 bytes .../SdacDemo/ServerCursors/ServerCursors.nfm | 230 + .../SdacDemo/ServerCursors/ServerCursors.pas | 136 + .../SdacDemo/ServiceBroker/ServiceBroker.nfm | 312 + .../SdacDemo/ServiceBroker/ServiceBroker.pas | 279 + .../1/Demos/dotNet/SdacDemo/Sql/Sql.nfm | 139 + .../1/Demos/dotNet/SdacDemo/Sql/Sql.pas | 216 + .../dotNet/SdacDemo/StoredProc/StoredProc.nfm | 157 + .../dotNet/SdacDemo/StoredProc/StoredProc.pas | 170 + .../StoredProcUpdates/StoredProcUpdates.nfm | 101 + .../StoredProcUpdates/StoredProcUpdates.pas | 133 + .../1/Demos/dotNet/SdacDemo/Table/Table.nfm | 180 + .../1/Demos/dotNet/SdacDemo/Table/Table.pas | 176 + .../1/Demos/dotNet/SdacDemo/Text/Text.nfm | 162 + .../1/Demos/dotNet/SdacDemo/Text/Text.pas | 100 + .../Demos/dotNet/SdacDemo/Threads/Threads.nfm | 391 + .../Demos/dotNet/SdacDemo/Threads/Threads.pas | 382 + .../dotNet/SdacDemo/Threads/ThreadsData.nfm | 36 + .../dotNet/SdacDemo/Threads/ThreadsData.pas | 33 + .../dotNet/SdacDemo/UpdateSQL/UpdateSQL.nfm | 362 + .../dotNet/SdacDemo/UpdateSQL/UpdateSQL.pas | 191 + .../dotNet/SdacDemo/VirtualTable/VTable.nfm | 565 + .../dotNet/SdacDemo/VirtualTable/VTable.pas | 201 + .../MSSQLCompact/MSSQLCompact_VclNet.bdsproj | 183 + .../MSSQLCompact/MSSQLCompact_VclNet.dpr | 15 + .../MSSQLCompact/MSSQLCompact_VclNet.res | Bin 0 -> 876 bytes .../TechnologySpecific/MSSQLCompact/Main.nfm | 353 + .../TechnologySpecific/MSSQLCompact/Main.pas | 268 + internal/4.10.0.10/1/FAQ.html | 689 + internal/4.10.0.10/1/History.html | 877 ++ internal/4.10.0.10/1/Lib/D11/CLRClasses.dcu | Bin 0 -> 21962 bytes internal/4.10.0.10/1/Lib/D11/CRAccess.dcu | Bin 0 -> 37472 bytes internal/4.10.0.10/1/Lib/D11/CRBatchMove.dcu | Bin 0 -> 17893 bytes internal/4.10.0.10/1/Lib/D11/CRColFrame.dcu | Bin 0 -> 8338 bytes .../4.10.0.10/1/Lib/D11/CRConnectionPool.dcu | Bin 0 -> 15265 bytes internal/4.10.0.10/1/Lib/D11/CRDataEditor.dcu | Bin 0 -> 6995 bytes internal/4.10.0.10/1/Lib/D11/CREditor.dcu | Bin 0 -> 29866 bytes internal/4.10.0.10/1/Lib/D11/CRFrame.dcu | Bin 0 -> 4458 bytes internal/4.10.0.10/1/Lib/D11/CRParser.dcu | Bin 0 -> 16202 bytes internal/4.10.0.10/1/Lib/D11/CRTabEditor.dcu | Bin 0 -> 8554 bytes internal/4.10.0.10/1/Lib/D11/CRThread.dcu | Bin 0 -> 8184 bytes internal/4.10.0.10/1/Lib/D11/CRXml.dcu | Bin 0 -> 25677 bytes .../1/Lib/D11/DAConnectionEditor.dcu | Bin 0 -> 16372 bytes internal/4.10.0.10/1/Lib/D11/DAConsts.dcu | Bin 0 -> 5932 bytes internal/4.10.0.10/1/Lib/D11/DADataEditor.dcu | Bin 0 -> 7254 bytes internal/4.10.0.10/1/Lib/D11/DADesign.dcu | Bin 0 -> 52694 bytes internal/4.10.0.10/1/Lib/D11/DADesign.res | Bin 0 -> 3680 bytes internal/4.10.0.10/1/Lib/D11/DADesign10p.res | Bin 0 -> 8112 bytes internal/4.10.0.10/1/Lib/D11/DADesign9.res | Bin 0 -> 1760 bytes .../4.10.0.10/1/Lib/D11/DADesignUtils.dcu | Bin 0 -> 19047 bytes .../4.10.0.10/1/Lib/D11/DADualListEditor.dcu | Bin 0 -> 11661 bytes internal/4.10.0.10/1/Lib/D11/DADump.dcu | Bin 0 -> 11936 bytes internal/4.10.0.10/1/Lib/D11/DADumpEditor.dcu | Bin 0 -> 10534 bytes .../4.10.0.10/1/Lib/D11/DADumpProgress.dcu | Bin 0 -> 7520 bytes internal/4.10.0.10/1/Lib/D11/DALoader.dcu | Bin 0 -> 15621 bytes .../4.10.0.10/1/Lib/D11/DAMacrosFrame.dcu | Bin 0 -> 6116 bytes internal/4.10.0.10/1/Lib/D11/DAMenu.dcu | Bin 0 -> 12063 bytes .../1/Lib/D11/DAParamValueEditor.dcu | Bin 0 -> 5293 bytes .../4.10.0.10/1/Lib/D11/DAParamsFrame.dcu | Bin 0 -> 13219 bytes .../4.10.0.10/1/Lib/D11/DAQueryEditor.dcu | Bin 0 -> 8322 bytes .../4.10.0.10/1/Lib/D11/DASPCallFrame.dcu | Bin 0 -> 10614 bytes internal/4.10.0.10/1/Lib/D11/DASQLEditor.dcu | Bin 0 -> 9245 bytes internal/4.10.0.10/1/Lib/D11/DASQLFrame.dcu | Bin 0 -> 6705 bytes .../1/Lib/D11/DASQLGeneratorFrame.dcu | Bin 0 -> 20085 bytes internal/4.10.0.10/1/Lib/D11/DASQLMonitor.dcu | Bin 0 -> 25138 bytes internal/4.10.0.10/1/Lib/D11/DAScript.dcu | Bin 0 -> 25503 bytes .../4.10.0.10/1/Lib/D11/DAScriptEditor.dcu | Bin 0 -> 10429 bytes .../1/Lib/D11/DAStoredProcEditor.dcu | Bin 0 -> 6096 bytes .../4.10.0.10/1/Lib/D11/DATableEditor.dcu | Bin 0 -> 9522 bytes .../4.10.0.10/1/Lib/D11/DAUpdateSQLEditor.dcu | Bin 0 -> 7636 bytes .../4.10.0.10/1/Lib/D11/DAUpdateSQLFrame.dcu | Bin 0 -> 9546 bytes .../4.10.0.10/1/Lib/D11/DAVersionInfo.dcu | Bin 0 -> 1129 bytes internal/4.10.0.10/1/Lib/D11/DBAccess.dcu | Bin 0 -> 241485 bytes internal/4.10.0.10/1/Lib/D11/DBAccess.res | Bin 0 -> 2332 bytes .../4.10.0.10/1/Lib/D11/DBMonitorClient.dcu | Bin 0 -> 2611 bytes .../4.10.0.10/1/Lib/D11/DBMonitorIntf.dcu | Bin 0 -> 2196 bytes .../4.10.0.10/1/Lib/D11/DBToolsClient.dcu | Bin 0 -> 56212 bytes .../4.10.0.10/1/Lib/D11/DBToolsClient.res | Bin 0 -> 7032 bytes internal/4.10.0.10/1/Lib/D11/DBToolsIntf.dcu | Bin 0 -> 3590 bytes internal/4.10.0.10/1/Lib/D11/DacReg.dcu | Bin 0 -> 870 bytes internal/4.10.0.10/1/Lib/D11/DacVcl.dcu | Bin 0 -> 12883 bytes internal/4.10.0.10/1/Lib/D11/Download.dcu | Bin 0 -> 11729 bytes internal/4.10.0.10/1/Lib/D11/HelpUtils.dcu | Bin 0 -> 2518 bytes internal/4.10.0.10/1/Lib/D11/MSAccess.dcu | Bin 0 -> 179921 bytes .../4.10.0.10/1/Lib/D11/MSConnectForm.dcu | Bin 0 -> 8013 bytes .../1/Lib/D11/MSConnectionEditor.dcu | Bin 0 -> 15534 bytes .../4.10.0.10/1/Lib/D11/MSConnectionPool.dcu | Bin 0 -> 6571 bytes internal/4.10.0.10/1/Lib/D11/MSConsts.dcu | Bin 0 -> 8308 bytes internal/4.10.0.10/1/Lib/D11/MSDesign.dcu | Bin 0 -> 35774 bytes internal/4.10.0.10/1/Lib/D11/MSDesign.res | Bin 0 -> 38688 bytes internal/4.10.0.10/1/Lib/D11/MSDesign10p.res | Bin 0 -> 59980 bytes internal/4.10.0.10/1/Lib/D11/MSDesign9.res | Bin 0 -> 26848 bytes .../4.10.0.10/1/Lib/D11/MSDesignUtils.dcu | Bin 0 -> 5567 bytes internal/4.10.0.10/1/Lib/D11/MSDump.dcu | Bin 0 -> 13535 bytes internal/4.10.0.10/1/Lib/D11/MSDumpEditor.dcu | Bin 0 -> 6974 bytes internal/4.10.0.10/1/Lib/D11/MSLoader.dcu | Bin 0 -> 16679 bytes internal/4.10.0.10/1/Lib/D11/MSMenu.dcu | Bin 0 -> 8569 bytes .../4.10.0.10/1/Lib/D11/MSNamesEditor.dcu | Bin 0 -> 6002 bytes .../4.10.0.10/1/Lib/D11/MSParamsFrame.dcu | Bin 0 -> 5772 bytes internal/4.10.0.10/1/Lib/D11/MSParser.dcu | Bin 0 -> 5350 bytes .../4.10.0.10/1/Lib/D11/MSQueryEditor.dcu | Bin 0 -> 7311 bytes internal/4.10.0.10/1/Lib/D11/MSReg.dcu | Bin 0 -> 1741 bytes .../4.10.0.10/1/Lib/D11/MSSPCallFrame.dcu | Bin 0 -> 5593 bytes internal/4.10.0.10/1/Lib/D11/MSSQLEditor.dcu | Bin 0 -> 6876 bytes internal/4.10.0.10/1/Lib/D11/MSSQLMonitor.dcu | Bin 0 -> 7474 bytes internal/4.10.0.10/1/Lib/D11/MSScript.dcu | Bin 0 -> 5433 bytes .../4.10.0.10/1/Lib/D11/MSServiceBroker.dcu | Bin 0 -> 37306 bytes .../1/Lib/D11/MSStoredProcEditor.dcu | Bin 0 -> 7012 bytes .../4.10.0.10/1/Lib/D11/MSUpdateSQLEditor.dcu | Bin 0 -> 5047 bytes internal/4.10.0.10/1/Lib/D11/MemDS.dcu | Bin 0 -> 73676 bytes internal/4.10.0.10/1/Lib/D11/MemData.dcu | Bin 0 -> 133057 bytes internal/4.10.0.10/1/Lib/D11/MemUtils.dcu | Bin 0 -> 12944 bytes internal/4.10.0.10/1/Lib/D11/OLEDBAccess.dcu | Bin 0 -> 178860 bytes internal/4.10.0.10/1/Lib/D11/OLEDBC.dcu | Bin 0 -> 75455 bytes internal/4.10.0.10/1/Lib/D11/OLEDBIntf.dcu | Bin 0 -> 21416 bytes internal/4.10.0.10/1/Lib/D11/SdacAbout.dcu | Bin 0 -> 6940 bytes internal/4.10.0.10/1/Lib/D11/VTDataEditor.dcu | Bin 0 -> 9321 bytes internal/4.10.0.10/1/Lib/D11/VTDesign.dcu | Bin 0 -> 8027 bytes internal/4.10.0.10/1/Lib/D11/VirtualTable.dcu | Bin 0 -> 48945 bytes internal/4.10.0.10/1/Lib/D11/Win32Timer.dcu | Bin 0 -> 4184 bytes internal/4.10.0.10/1/Lib/D11/dac105.bpl | Bin 0 -> 495616 bytes internal/4.10.0.10/1/Lib/D11/dac105.dcp | Bin 0 -> 648729 bytes internal/4.10.0.10/1/Lib/D11/dac105.dcu | Bin 0 -> 2140 bytes internal/4.10.0.10/1/Lib/D11/dac105.res | Bin 0 -> 1532 bytes internal/4.10.0.10/1/Lib/D11/dacvcl105.bpl | Bin 0 -> 28160 bytes internal/4.10.0.10/1/Lib/D11/dacvcl105.dcp | Bin 0 -> 10671 bytes internal/4.10.0.10/1/Lib/D11/dacvcl105.dcu | Bin 0 -> 2497 bytes internal/4.10.0.10/1/Lib/D11/dacvcl105.res | Bin 0 -> 1324 bytes internal/4.10.0.10/1/Lib/D11/dcldac105.bpl | Bin 0 -> 327680 bytes internal/4.10.0.10/1/Lib/D11/dcldac105.dcp | Bin 0 -> 369659 bytes internal/4.10.0.10/1/Lib/D11/dcldac105.dcu | Bin 0 -> 5845 bytes internal/4.10.0.10/1/Lib/D11/dcldac105.res | Bin 0 -> 1324 bytes internal/4.10.0.10/1/Lib/D11/dclsdac105.bpl | Bin 0 -> 342528 bytes internal/4.10.0.10/1/Lib/D11/dclsdac105.dcp | Bin 0 -> 141105 bytes internal/4.10.0.10/1/Lib/D11/dclsdac105.dcu | Bin 0 -> 6280 bytes internal/4.10.0.10/1/Lib/D11/dclsdac105.res | Bin 0 -> 1332 bytes internal/4.10.0.10/1/Lib/D11/sdac105.bpl | Bin 0 -> 365056 bytes internal/4.10.0.10/1/Lib/D11/sdac105.dcp | Bin 0 -> 416478 bytes internal/4.10.0.10/1/Lib/D11/sdac105.dcu | Bin 0 -> 2221 bytes internal/4.10.0.10/1/Lib/D11/sdac105.res | Bin 0 -> 1332 bytes internal/4.10.0.10/1/Lib/D11/sdacVcl.dcu | Bin 0 -> 5195 bytes internal/4.10.0.10/1/Lib/D11/sdacvcl105.bpl | Bin 0 -> 30208 bytes internal/4.10.0.10/1/Lib/D11/sdacvcl105.dcp | Bin 0 -> 14019 bytes internal/4.10.0.10/1/Lib/D11/sdacvcl105.dcu | Bin 0 -> 2890 bytes internal/4.10.0.10/1/Lib/D11/sdacvcl105.res | Bin 0 -> 1332 bytes internal/4.10.0.10/1/License.rtf | Bin 0 -> 3366 bytes internal/4.10.0.10/1/ReadMeSrc.txt | 128 + internal/4.10.0.10/1/Readme.html | 304 + internal/4.10.0.10/1/Sdac.GID | Bin 0 -> 103667 bytes internal/4.10.0.10/1/Sdac.cnt | 655 + internal/4.10.0.10/1/Sdac.hlp | Bin 0 -> 1709689 bytes .../4.10.0.10/1/Source/CBuilder5/Make.bat | 10 + .../4.10.0.10/1/Source/CBuilder5/dac50.bpk | 139 + .../4.10.0.10/1/Source/CBuilder5/dac50.cpp | 42 + .../4.10.0.10/1/Source/CBuilder5/dac50.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/CBuilder5/dcldac50.bpk | 108 + .../4.10.0.10/1/Source/CBuilder5/dcldac50.cpp | 27 + .../4.10.0.10/1/Source/CBuilder5/dcldac50.res | Bin 0 -> 1324 bytes .../1/Source/CBuilder5/dclsdac50.bpk | 100 + .../1/Source/CBuilder5/dclsdac50.cpp | 31 + .../1/Source/CBuilder5/dclsdac50.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/CBuilder5/default.bpr | 134 + .../4.10.0.10/1/Source/CBuilder5/sdac50.bpk | 107 + .../4.10.0.10/1/Source/CBuilder5/sdac50.cpp | 35 + .../4.10.0.10/1/Source/CBuilder5/sdac50.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/CBuilder6/Make.bat | 10 + .../4.10.0.10/1/Source/CBuilder6/dac60.bpk | 159 + .../4.10.0.10/1/Source/CBuilder6/dac60.cpp | 17 + .../4.10.0.10/1/Source/CBuilder6/dac60.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/CBuilder6/dacvcl60.bpk | 122 + .../4.10.0.10/1/Source/CBuilder6/dacvcl60.cpp | 19 + .../4.10.0.10/1/Source/CBuilder6/dacvcl60.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/CBuilder6/dcldac60.bpk | 151 + .../4.10.0.10/1/Source/CBuilder6/dcldac60.cpp | 16 + .../4.10.0.10/1/Source/CBuilder6/dcldac60.res | Bin 0 -> 1324 bytes .../1/Source/CBuilder6/dclsdac60.bpk | 177 + .../1/Source/CBuilder6/dclsdac60.cpp | 16 + .../1/Source/CBuilder6/dclsdac60.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/CBuilder6/default.bpr | 113 + .../4.10.0.10/1/Source/CBuilder6/sdac60.bpk | 175 + .../4.10.0.10/1/Source/CBuilder6/sdac60.cpp | 16 + .../4.10.0.10/1/Source/CBuilder6/sdac60.res | Bin 0 -> 1332 bytes .../1/Source/CBuilder6/sdacvcl60.bpk | 152 + .../1/Source/CBuilder6/sdacvcl60.cpp | 17 + .../1/Source/CBuilder6/sdacvcl60.res | Bin 0 -> 1332 bytes internal/4.10.0.10/1/Source/CLRClasses.pas | 1172 ++ internal/4.10.0.10/1/Source/CRAccess.pas | 1696 +++ internal/4.10.0.10/1/Source/CRBatchMove.pas | 695 + .../4.10.0.10/1/Source/CRConnectionPool.pas | 725 + internal/4.10.0.10/1/Source/CRParser.pas | 1054 ++ internal/4.10.0.10/1/Source/CRThread.pas | 371 + internal/4.10.0.10/1/Source/CRXml.pas | 1018 ++ internal/4.10.0.10/1/Source/CoreLab.snk | Bin 0 -> 596 bytes internal/4.10.0.10/1/Source/DAConsts.pas | 115 + internal/4.10.0.10/1/Source/DADump.pas | 416 + internal/4.10.0.10/1/Source/DALoader.pas | 605 + internal/4.10.0.10/1/Source/DASQLMonitor.pas | 1141 ++ internal/4.10.0.10/1/Source/DAScript.pas | 961 ++ internal/4.10.0.10/1/Source/DAVersionInfo.pas | 44 + internal/4.10.0.10/1/Source/DBAccess.pas | 11171 ++++++++++++++++ internal/4.10.0.10/1/Source/DBAccess.res | Bin 0 -> 2332 bytes .../4.10.0.10/1/Source/DBMonitorClient.pas | 139 + internal/4.10.0.10/1/Source/DBMonitorIntf.pas | 117 + internal/4.10.0.10/1/Source/Dac.inc | 219 + internal/4.10.0.10/1/Source/DacClx.pas | 17 + internal/4.10.0.10/1/Source/DacGui.inc | 458 + internal/4.10.0.10/1/Source/DacVcl.pas | 16 + internal/4.10.0.10/1/Source/DacVer.inc | 8 + .../Delphi10/CoreLab.Dac.AdoNet.bdsproj | 187 + .../1/Source/Delphi10/CoreLab.Dac.AdoNet.cfg | 45 + .../1/Source/Delphi10/CoreLab.Dac.AdoNet.dpk | 97 + .../Delphi10/CoreLab.Dac.Design.bdsproj | 213 + .../1/Source/Delphi10/CoreLab.Dac.Design.cfg | 41 + .../1/Source/Delphi10/CoreLab.Dac.Design.dpk | 132 + .../1/Source/Delphi10/CoreLab.Dac.bdsproj | 208 + .../1/Source/Delphi10/CoreLab.Dac.cfg | 40 + .../1/Source/Delphi10/CoreLab.Dac.dpk | 108 + .../Delphi10/CoreLab.Sdac.AdoNet.bdsproj | 187 + .../1/Source/Delphi10/CoreLab.Sdac.AdoNet.cfg | 39 + .../1/Source/Delphi10/CoreLab.Sdac.AdoNet.dpk | 99 + .../Delphi10/CoreLab.Sdac.Design.bdsproj | 204 + .../1/Source/Delphi10/CoreLab.Sdac.Design.cfg | 41 + .../1/Source/Delphi10/CoreLab.Sdac.Design.dpk | 115 + .../1/Source/Delphi10/CoreLab.Sdac.bdsproj | 272 + .../1/Source/Delphi10/CoreLab.Sdac.cfg | 42 + .../1/Source/Delphi10/CoreLab.Sdac.dpk | 107 + internal/4.10.0.10/1/Source/Delphi10/Make.bat | 11 + .../1/Source/Delphi10/dac100.bdsproj | 178 + .../4.10.0.10/1/Source/Delphi10/dac100.cfg | 45 + .../4.10.0.10/1/Source/Delphi10/dac100.dpk | 52 + .../4.10.0.10/1/Source/Delphi10/dac100.res | Bin 0 -> 1324 bytes .../1/Source/Delphi10/dacvcl100.bdsproj | 179 + .../4.10.0.10/1/Source/Delphi10/dacvcl100.cfg | 45 + .../4.10.0.10/1/Source/Delphi10/dacvcl100.dpk | 36 + .../4.10.0.10/1/Source/Delphi10/dacvcl100.res | Bin 0 -> 1324 bytes .../1/Source/Delphi10/dcldac100.bdsproj | 179 + .../4.10.0.10/1/Source/Delphi10/dcldac100.cfg | 44 + .../4.10.0.10/1/Source/Delphi10/dcldac100.dpk | 46 + .../4.10.0.10/1/Source/Delphi10/dcldac100.res | Bin 0 -> 1324 bytes .../1/Source/Delphi10/dclsdac100.bdsproj | 172 + .../1/Source/Delphi10/dclsdac100.cfg | 41 + .../1/Source/Delphi10/dclsdac100.dpk | 44 + .../1/Source/Delphi10/dclsdac100.res | Bin 0 -> 1332 bytes .../1/Source/Delphi10/sdac100.bdsproj | 175 + .../4.10.0.10/1/Source/Delphi10/sdac100.cfg | 42 + .../4.10.0.10/1/Source/Delphi10/sdac100.dpk | 56 + .../4.10.0.10/1/Source/Delphi10/sdac100.res | Bin 0 -> 1332 bytes .../1/Source/Delphi10/sdacvcl100.bdsproj | 175 + .../1/Source/Delphi10/sdacvcl100.cfg | 42 + .../1/Source/Delphi10/sdacvcl100.dpk | 37 + .../1/Source/Delphi10/sdacvcl100.res | Bin 0 -> 1332 bytes internal/4.10.0.10/1/Source/Delphi11/Make.bat | 10 + .../1/Source/Delphi11/SDAC105_Group.groupproj | 84 + .../1/Source/Delphi11/dac105.bdsproj | 182 + .../4.10.0.10/1/Source/Delphi11/dac105.bpi | Bin 0 -> 154868 bytes .../4.10.0.10/1/Source/Delphi11/dac105.cfg | 42 + .../4.10.0.10/1/Source/Delphi11/dac105.dpk | 53 + .../4.10.0.10/1/Source/Delphi11/dac105.dproj | 558 + .../4.10.0.10/1/Source/Delphi11/dac105.res | Bin 0 -> 1532 bytes .../1/Source/Delphi11/dacvcl105.bdsproj | 183 + .../4.10.0.10/1/Source/Delphi11/dacvcl105.bpi | Bin 0 -> 1124 bytes .../4.10.0.10/1/Source/Delphi11/dacvcl105.cfg | 42 + .../4.10.0.10/1/Source/Delphi11/dacvcl105.dpk | 37 + .../1/Source/Delphi11/dacvcl105.dproj | 543 + .../4.10.0.10/1/Source/Delphi11/dacvcl105.res | Bin 0 -> 1532 bytes .../1/Source/Delphi11/dcldac105.bdsproj | 183 + .../4.10.0.10/1/Source/Delphi11/dcldac105.cfg | 41 + .../4.10.0.10/1/Source/Delphi11/dcldac105.dpk | 47 + .../1/Source/Delphi11/dcldac105.dproj | 549 + .../4.10.0.10/1/Source/Delphi11/dcldac105.res | Bin 0 -> 1532 bytes .../1/Source/Delphi11/dclsdac105.bdsproj | 172 + .../1/Source/Delphi11/dclsdac105.cfg | 43 + .../1/Source/Delphi11/dclsdac105.dpk | 56 + .../1/Source/Delphi11/dclsdac105.dproj | 612 + .../1/Source/Delphi11/dclsdac105.res | Bin 0 -> 1540 bytes .../1/Source/Delphi11/sdac105.bdsproj | 175 + .../4.10.0.10/1/Source/Delphi11/sdac105.bpi | Bin 0 -> 74100 bytes .../4.10.0.10/1/Source/Delphi11/sdac105.cfg | 44 + .../4.10.0.10/1/Source/Delphi11/sdac105.dpk | 51 + .../4.10.0.10/1/Source/Delphi11/sdac105.dproj | 567 + .../4.10.0.10/1/Source/Delphi11/sdac105.res | Bin 0 -> 1540 bytes .../1/Source/Delphi11/sdacvcl105.bdsproj | 175 + .../1/Source/Delphi11/sdacvcl105.bpi | Bin 0 -> 2724 bytes .../1/Source/Delphi11/sdacvcl105.cfg | 44 + .../1/Source/Delphi11/sdacvcl105.dpk | 38 + .../1/Source/Delphi11/sdacvcl105.dproj | 556 + .../1/Source/Delphi11/sdacvcl105.res | Bin 0 -> 1540 bytes internal/4.10.0.10/1/Source/Delphi5/Make.bat | 10 + internal/4.10.0.10/1/Source/Delphi5/dac50.cfg | 41 + internal/4.10.0.10/1/Source/Delphi5/dac50.dof | 94 + internal/4.10.0.10/1/Source/Delphi5/dac50.dpk | 54 + internal/4.10.0.10/1/Source/Delphi5/dac50.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/Delphi5/dcldac50.cfg | 41 + .../4.10.0.10/1/Source/Delphi5/dcldac50.dof | 94 + .../4.10.0.10/1/Source/Delphi5/dcldac50.dpk | 41 + .../4.10.0.10/1/Source/Delphi5/dcldac50.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/Delphi5/dclsdac50.cfg | 41 + .../4.10.0.10/1/Source/Delphi5/dclsdac50.dof | 92 + .../4.10.0.10/1/Source/Delphi5/dclsdac50.dpk | 49 + .../4.10.0.10/1/Source/Delphi5/dclsdac50.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/Delphi5/sdac50.cfg | 41 + .../4.10.0.10/1/Source/Delphi5/sdac50.dof | 95 + .../4.10.0.10/1/Source/Delphi5/sdac50.dpk | 54 + .../4.10.0.10/1/Source/Delphi5/sdac50.res | Bin 0 -> 1332 bytes internal/4.10.0.10/1/Source/Delphi6/Make.bat | 10 + internal/4.10.0.10/1/Source/Delphi6/dac60.cfg | 41 + internal/4.10.0.10/1/Source/Delphi6/dac60.dof | 96 + internal/4.10.0.10/1/Source/Delphi6/dac60.dpk | 52 + internal/4.10.0.10/1/Source/Delphi6/dac60.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/Delphi6/dacvcl60.cfg | 41 + .../4.10.0.10/1/Source/Delphi6/dacvcl60.dof | 96 + .../4.10.0.10/1/Source/Delphi6/dacvcl60.dpk | 36 + .../4.10.0.10/1/Source/Delphi6/dacvcl60.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/Delphi6/dcldac60.cfg | 41 + .../4.10.0.10/1/Source/Delphi6/dcldac60.dof | 96 + .../4.10.0.10/1/Source/Delphi6/dcldac60.dpk | 42 + .../4.10.0.10/1/Source/Delphi6/dcldac60.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/Delphi6/dclsdac60.cfg | 41 + .../4.10.0.10/1/Source/Delphi6/dclsdac60.dof | 84 + .../4.10.0.10/1/Source/Delphi6/dclsdac60.dpk | 49 + .../4.10.0.10/1/Source/Delphi6/dclsdac60.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/Delphi6/sdac60.cfg | 42 + .../4.10.0.10/1/Source/Delphi6/sdac60.dof | 84 + .../4.10.0.10/1/Source/Delphi6/sdac60.dpk | 50 + .../4.10.0.10/1/Source/Delphi6/sdac60.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/Delphi6/sdacvcl60.cfg | 42 + .../4.10.0.10/1/Source/Delphi6/sdacvcl60.dof | 103 + .../4.10.0.10/1/Source/Delphi6/sdacvcl60.dpk | 37 + .../4.10.0.10/1/Source/Delphi6/sdacvcl60.res | Bin 0 -> 1332 bytes internal/4.10.0.10/1/Source/Delphi7/Make.bat | 10 + internal/4.10.0.10/1/Source/Delphi7/dac70.cfg | 44 + internal/4.10.0.10/1/Source/Delphi7/dac70.dof | 145 + internal/4.10.0.10/1/Source/Delphi7/dac70.dpk | 52 + internal/4.10.0.10/1/Source/Delphi7/dac70.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/Delphi7/dacvcl70.cfg | 44 + .../4.10.0.10/1/Source/Delphi7/dacvcl70.dof | 145 + .../4.10.0.10/1/Source/Delphi7/dacvcl70.dpk | 36 + .../4.10.0.10/1/Source/Delphi7/dacvcl70.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/Delphi7/dcldac70.cfg | 44 + .../4.10.0.10/1/Source/Delphi7/dcldac70.dof | 148 + .../4.10.0.10/1/Source/Delphi7/dcldac70.dpk | 52 + .../4.10.0.10/1/Source/Delphi7/dcldac70.res | Bin 0 -> 1324 bytes .../4.10.0.10/1/Source/Delphi7/dclsdac70.cfg | 44 + .../4.10.0.10/1/Source/Delphi7/dclsdac70.dof | 142 + .../4.10.0.10/1/Source/Delphi7/dclsdac70.dpk | 50 + .../4.10.0.10/1/Source/Delphi7/dclsdac70.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/Delphi7/sdac70.cfg | 44 + .../4.10.0.10/1/Source/Delphi7/sdac70.dof | 145 + .../4.10.0.10/1/Source/Delphi7/sdac70.dpk | 49 + .../4.10.0.10/1/Source/Delphi7/sdac70.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/Delphi7/sdacvcl70.cfg | 44 + .../4.10.0.10/1/Source/Delphi7/sdacvcl70.dof | 130 + .../4.10.0.10/1/Source/Delphi7/sdacvcl70.dpk | 38 + .../4.10.0.10/1/Source/Delphi7/sdacvcl70.res | Bin 0 -> 1332 bytes .../Source/Delphi8/CoreLab.Dac.AdoNet.bdsproj | 197 + .../1/Source/Delphi8/CoreLab.Dac.AdoNet.cfg | 46 + .../1/Source/Delphi8/CoreLab.Dac.AdoNet.dpk | 97 + .../Source/Delphi8/CoreLab.Dac.Design.bdsproj | 202 + .../1/Source/Delphi8/CoreLab.Dac.Design.cfg | 40 + .../1/Source/Delphi8/CoreLab.Dac.Design.dpk | 129 + .../1/Source/Delphi8/CoreLab.Dac.bdsproj | 197 + .../1/Source/Delphi8/CoreLab.Dac.cfg | 41 + .../1/Source/Delphi8/CoreLab.Dac.dpk | 108 + .../Delphi8/CoreLab.Sdac.AdoNet.bdsproj | 176 + .../1/Source/Delphi8/CoreLab.Sdac.AdoNet.cfg | 41 + .../1/Source/Delphi8/CoreLab.Sdac.AdoNet.dpk | 99 + .../Delphi8/CoreLab.Sdac.Design.bdsproj | 189 + .../1/Source/Delphi8/CoreLab.Sdac.Design.cfg | 41 + .../1/Source/Delphi8/CoreLab.Sdac.Design.dpk | 114 + .../1/Source/Delphi8/CoreLab.Sdac.bdsproj | 181 + .../1/Source/Delphi8/CoreLab.Sdac.cfg | 43 + .../1/Source/Delphi8/CoreLab.Sdac.dpk | 107 + internal/4.10.0.10/1/Source/Delphi8/Make.bat | 10 + .../Source/Delphi9/CoreLab.Dac.AdoNet.bdsproj | 170 + .../1/Source/Delphi9/CoreLab.Dac.AdoNet.cfg | 45 + .../1/Source/Delphi9/CoreLab.Dac.AdoNet.dpk | 97 + .../Source/Delphi9/CoreLab.Dac.Design.bdsproj | 205 + .../1/Source/Delphi9/CoreLab.Dac.Design.cfg | 40 + .../1/Source/Delphi9/CoreLab.Dac.Design.dpk | 132 + .../1/Source/Delphi9/CoreLab.Dac.bdsproj | 196 + .../1/Source/Delphi9/CoreLab.Dac.cfg | 41 + .../1/Source/Delphi9/CoreLab.Dac.dpk | 108 + .../Delphi9/CoreLab.Sdac.AdoNet.bdsproj | 185 + .../1/Source/Delphi9/CoreLab.Sdac.AdoNet.cfg | 39 + .../1/Source/Delphi9/CoreLab.Sdac.AdoNet.dpk | 99 + .../Delphi9/CoreLab.Sdac.Design.bdsproj | 206 + .../1/Source/Delphi9/CoreLab.Sdac.Design.cfg | 41 + .../1/Source/Delphi9/CoreLab.Sdac.Design.dpk | 119 + .../1/Source/Delphi9/CoreLab.Sdac.bdsproj | 191 + .../1/Source/Delphi9/CoreLab.Sdac.cfg | 42 + .../1/Source/Delphi9/CoreLab.Sdac.dpk | 104 + internal/4.10.0.10/1/Source/Delphi9/Make.bat | 11 + .../4.10.0.10/1/Source/Delphi9/dac90.bdsproj | 170 + internal/4.10.0.10/1/Source/Delphi9/dac90.cfg | 43 + internal/4.10.0.10/1/Source/Delphi9/dac90.dpk | 52 + internal/4.10.0.10/1/Source/Delphi9/dac90.res | Bin 0 -> 1324 bytes .../1/Source/Delphi9/dacvcl90.bdsproj | 170 + .../4.10.0.10/1/Source/Delphi9/dacvcl90.cfg | 43 + .../4.10.0.10/1/Source/Delphi9/dacvcl90.dpk | 36 + .../4.10.0.10/1/Source/Delphi9/dacvcl90.res | Bin 0 -> 1324 bytes .../1/Source/Delphi9/dcldac90.bdsproj | 172 + .../4.10.0.10/1/Source/Delphi9/dcldac90.cfg | 43 + .../4.10.0.10/1/Source/Delphi9/dcldac90.dpk | 47 + .../4.10.0.10/1/Source/Delphi9/dcldac90.res | Bin 0 -> 1324 bytes .../1/Source/Delphi9/dclsdac90.bdsproj | 172 + .../4.10.0.10/1/Source/Delphi9/dclsdac90.cfg | 41 + .../4.10.0.10/1/Source/Delphi9/dclsdac90.dpk | 50 + .../4.10.0.10/1/Source/Delphi9/dclsdac90.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/Delphi9/sdac90.bdsproj | 172 + .../4.10.0.10/1/Source/Delphi9/sdac90.cfg | 41 + .../4.10.0.10/1/Source/Delphi9/sdac90.dpk | 54 + .../4.10.0.10/1/Source/Delphi9/sdac90.res | Bin 0 -> 1332 bytes .../1/Source/Delphi9/sdacvcl90.bdsproj | 172 + .../4.10.0.10/1/Source/Delphi9/sdacvcl90.cfg | 41 + .../4.10.0.10/1/Source/Delphi9/sdacvcl90.dpk | 37 + .../4.10.0.10/1/Source/Delphi9/sdacvcl90.res | Bin 0 -> 1332 bytes .../4.10.0.10/1/Source/Design/CRColFrame.dfm | 21 + .../4.10.0.10/1/Source/Design/CRColFrame.pas | 261 + .../4.10.0.10/1/Source/Design/CRColFrame.xfm | 21 + .../1/Source/Design/CRDataEditor.dfm | 83 + .../1/Source/Design/CRDataEditor.pas | 134 + .../1/Source/Design/CRDataEditor.xfm | 83 + .../4.10.0.10/1/Source/Design/CREditor.dfm | 87 + .../4.10.0.10/1/Source/Design/CREditor.pas | 1255 ++ .../4.10.0.10/1/Source/Design/CREditor.xfm | 83 + .../4.10.0.10/1/Source/Design/CRFldLinks.dfm | 166 + .../4.10.0.10/1/Source/Design/CRFldLinks.pas | 543 + .../4.10.0.10/1/Source/Design/CRFldLinks.xfm | 155 + .../4.10.0.10/1/Source/Design/CRFrame.dfm | 8 + .../4.10.0.10/1/Source/Design/CRFrame.pas | 115 + .../4.10.0.10/1/Source/Design/CRFrame.xfm | 8 + .../4.10.0.10/1/Source/Design/CRTabEditor.dfm | 40 + .../4.10.0.10/1/Source/Design/CRTabEditor.pas | 250 + .../4.10.0.10/1/Source/Design/CRTabEditor.xfm | 29 + .../1/Source/Design/DAConnectionEditor.dfm | 415 + .../1/Source/Design/DAConnectionEditor.pas | 533 + .../1/Source/Design/DAConnectionEditor.xfm | 411 + .../1/Source/Design/DADataEditor.dfm | 45 + .../1/Source/Design/DADataEditor.pas | 137 + .../1/Source/Design/DADataEditor.xfm | 45 + .../4.10.0.10/1/Source/Design/DADesign.pas | 2015 +++ .../4.10.0.10/1/Source/Design/DADesign.res | Bin 0 -> 3680 bytes .../4.10.0.10/1/Source/Design/DADesign10p.res | Bin 0 -> 8112 bytes .../4.10.0.10/1/Source/Design/DADesign9.res | Bin 0 -> 1760 bytes .../1/Source/Design/DADesignUtils.pas | 625 + .../1/Source/Design/DADualListEditor.dfm | 363 + .../1/Source/Design/DADualListEditor.pas | 328 + .../1/Source/Design/DADualListEditor.xfm | 363 + .../1/Source/Design/DADumpEditor.dfm | 130 + .../1/Source/Design/DADumpEditor.pas | 249 + .../1/Source/Design/DADumpEditor.xfm | 128 + .../1/Source/Design/DADumpProgress.dfm | 78 + .../1/Source/Design/DADumpProgress.pas | 213 + .../1/Source/Design/DADumpProgress.xfm | 76 + .../1/Source/Design/DAMacrosFrame.dfm | 62 + .../1/Source/Design/DAMacrosFrame.pas | 119 + .../1/Source/Design/DAMacrosFrame.xfm | 62 + internal/4.10.0.10/1/Source/Design/DAMenu.pas | 646 + .../1/Source/Design/DAParamValueEditor.dfm | 26 + .../1/Source/Design/DAParamValueEditor.pas | 90 + .../1/Source/Design/DAParamValueEditor.xfm | 26 + .../1/Source/Design/DAParamsFrame.dfm | 124 + .../1/Source/Design/DAParamsFrame.pas | 455 + .../1/Source/Design/DAParamsFrame.xfm | 124 + .../1/Source/Design/DAQueryEditor.dfm | 30 + .../1/Source/Design/DAQueryEditor.pas | 171 + .../1/Source/Design/DAQueryEditor.xfm | 31 + .../1/Source/Design/DASPCallFrame.dfm | 99 + .../1/Source/Design/DASPCallFrame.pas | 258 + .../1/Source/Design/DASPCallFrame.xfm | 101 + .../4.10.0.10/1/Source/Design/DASQLEditor.dfm | 40 + .../4.10.0.10/1/Source/Design/DASQLEditor.pas | 215 + .../4.10.0.10/1/Source/Design/DASQLEditor.xfm | 40 + .../4.10.0.10/1/Source/Design/DASQLFrame.dfm | 31 + .../4.10.0.10/1/Source/Design/DASQLFrame.pas | 149 + .../4.10.0.10/1/Source/Design/DASQLFrame.xfm | 31 + .../1/Source/Design/DASQLGeneratorFrame.dfm | 137 + .../1/Source/Design/DASQLGeneratorFrame.pas | 628 + .../1/Source/Design/DASQLGeneratorFrame.xfm | 140 + .../1/Source/Design/DAScriptEditor.dfm | 61 + .../1/Source/Design/DAScriptEditor.pas | 246 + .../1/Source/Design/DAScriptEditor.xfm | 61 + .../1/Source/Design/DAStoredProcEditor.dfm | 2 + .../1/Source/Design/DAStoredProcEditor.pas | 79 + .../1/Source/Design/DAStoredProcEditor.xfm | 2 + .../1/Source/Design/DATableEditor.dfm | 114 + .../1/Source/Design/DATableEditor.pas | 231 + .../1/Source/Design/DATableEditor.xfm | 117 + .../1/Source/Design/DAUpdateSQLEditor.dfm | 15 + .../1/Source/Design/DAUpdateSQLEditor.pas | 164 + .../1/Source/Design/DAUpdateSQLEditor.xfm | 15 + .../1/Source/Design/DAUpdateSQLFrame.dfm | 57 + .../1/Source/Design/DAUpdateSQLFrame.pas | 261 + .../1/Source/Design/DAUpdateSQLFrame.xfm | 57 + .../1/Source/Design/DBToolsClient.pas | 2145 +++ .../1/Source/Design/DBToolsClient.res | Bin 0 -> 7032 bytes .../4.10.0.10/1/Source/Design/DBToolsIntf.pas | 131 + internal/4.10.0.10/1/Source/Design/DacReg.pas | 48 + .../4.10.0.10/1/Source/Design/Download.dfm | 137 + .../4.10.0.10/1/Source/Design/Download.pas | 277 + .../4.10.0.10/1/Source/Design/HelpUtils.pas | 140 + .../1/Source/Design/MSConnectionEditor.dfm | 76 + .../1/Source/Design/MSConnectionEditor.pas | 459 + .../4.10.0.10/1/Source/Design/MSDesign.pas | 1098 ++ .../4.10.0.10/1/Source/Design/MSDesign.res | Bin 0 -> 38688 bytes .../4.10.0.10/1/Source/Design/MSDesign10p.res | Bin 0 -> 59980 bytes .../4.10.0.10/1/Source/Design/MSDesign9.res | Bin 0 -> 26848 bytes .../1/Source/Design/MSDesignUtils.pas | 129 + .../1/Source/Design/MSDumpEditor.dfm | 49 + .../1/Source/Design/MSDumpEditor.pas | 129 + internal/4.10.0.10/1/Source/Design/MSMenu.pas | 276 + .../1/Source/Design/MSNamesEditor.dfm | 5 + .../1/Source/Design/MSNamesEditor.pas | 105 + .../1/Source/Design/MSParamsFrame.dfm | 2 + .../1/Source/Design/MSParamsFrame.pas | 76 + .../1/Source/Design/MSQueryEditor.dfm | 48 + .../1/Source/Design/MSQueryEditor.pas | 102 + internal/4.10.0.10/1/Source/Design/MSReg.pas | 69 + .../1/Source/Design/MSSPCallFrame.dfm | 19 + .../1/Source/Design/MSSPCallFrame.pas | 79 + .../4.10.0.10/1/Source/Design/MSSQLEditor.dfm | 30 + .../4.10.0.10/1/Source/Design/MSSQLEditor.pas | 98 + .../1/Source/Design/MSStoredProcEditor.dfm | 48 + .../1/Source/Design/MSStoredProcEditor.pas | 80 + .../1/Source/Design/MSUpdateSQLEditor.dfm | 5 + .../1/Source/Design/MSUpdateSQLEditor.pas | 43 + .../4.10.0.10/1/Source/Design/SdacAbout.dfm | 3148 +++++ .../4.10.0.10/1/Source/Design/SdacAbout.pas | 181 + .../1/Source/Design/VTDataEditor.dfm | 81 + .../1/Source/Design/VTDataEditor.pas | 223 + .../1/Source/Design/VTDataEditor.xfm | 80 + .../4.10.0.10/1/Source/Design/VTDesign.pas | 275 + internal/4.10.0.10/1/Source/MSAccess.pas | 5787 ++++++++ internal/4.10.0.10/1/Source/MSConnectForm.dfm | 132 + internal/4.10.0.10/1/Source/MSConnectForm.pas | 185 + .../4.10.0.10/1/Source/MSConnectionPool.pas | 213 + internal/4.10.0.10/1/Source/MSConsts.pas | 126 + internal/4.10.0.10/1/Source/MSDump.pas | 486 + internal/4.10.0.10/1/Source/MSLoader.pas | 564 + internal/4.10.0.10/1/Source/MSParser.pas | 238 + internal/4.10.0.10/1/Source/MSSQLMonitor.pas | 237 + internal/4.10.0.10/1/Source/MSScript.pas | 139 + .../4.10.0.10/1/Source/MSServiceBroker.pas | 1241 ++ internal/4.10.0.10/1/Source/Make.bat | 277 + internal/4.10.0.10/1/Source/MemDS.pas | 3921 ++++++ internal/4.10.0.10/1/Source/MemData.pas | 9028 +++++++++++++ internal/4.10.0.10/1/Source/MemUtils.pas | 1682 +++ .../1/Source/Net/CoreLab.Dac.CRAccess.pas | 5 + .../1/Source/Net/CoreLab.Dac.CRBatchMove.pas | 5 + .../Net/CoreLab.Dac.CRConnectionPool.pas | 5 + .../1/Source/Net/CoreLab.Dac.CRParser.pas | 5 + .../1/Source/Net/CoreLab.Dac.DAConsts.pas | 3 + .../1/Source/Net/CoreLab.Dac.DADump.pas | 5 + .../1/Source/Net/CoreLab.Dac.DALoader.pas | 5 + .../1/Source/Net/CoreLab.Dac.DASQLMonitor.pas | 5 + .../1/Source/Net/CoreLab.Dac.DAScript.pas | 5 + .../1/Source/Net/CoreLab.Dac.DBAccess.pas | 5 + .../Net/CoreLab.Dac.DBMonitorClient.pas | 5 + .../Source/Net/CoreLab.Dac.DBMonitorIntf.pas | 5 + .../1/Source/Net/CoreLab.Dac.DacVcl.pas | 5 + .../1/Source/Net/CoreLab.Dac.DataAdapter.pas | 339 + .../Net/CoreLab.Dac.Design.CRColFrame.pas | 6 + .../Net/CoreLab.Dac.Design.CRDataEditor.pas | 6 + .../Net/CoreLab.Dac.Design.CREditor.pas | 6 + .../Source/Net/CoreLab.Dac.Design.CRFrame.pas | 6 + .../Net/CoreLab.Dac.Design.CRTabEditor.pas | 6 + .../CoreLab.Dac.Design.DAConnectionEditor.pas | 6 + .../Net/CoreLab.Dac.Design.DADataEditor.pas | 6 + .../Net/CoreLab.Dac.Design.DADesign.pas | 7 + .../Net/CoreLab.Dac.Design.DADesignUtils.pas | 6 + .../CoreLab.Dac.Design.DADualListEditor.pas | 8 + .../Net/CoreLab.Dac.Design.DADumpEditor.pas | 8 + .../Net/CoreLab.Dac.Design.DADumpProgress.pas | 8 + .../Net/CoreLab.Dac.Design.DAMacrosFrame.pas | 6 + .../Source/Net/CoreLab.Dac.Design.DAMenu.pas | 9 + .../CoreLab.Dac.Design.DAParamValueEditor.pas | 6 + .../Net/CoreLab.Dac.Design.DAParamsFrame.pas | 6 + .../Net/CoreLab.Dac.Design.DAQueryEditor.pas | 6 + .../Net/CoreLab.Dac.Design.DASPCallFrame.pas | 6 + .../Net/CoreLab.Dac.Design.DASQLEditor.pas | 6 + .../Net/CoreLab.Dac.Design.DASQLFrame.pas | 6 + ...CoreLab.Dac.Design.DASQLGeneratorFrame.pas | 6 + .../Net/CoreLab.Dac.Design.DAScriptEditor.pas | 6 + .../CoreLab.Dac.Design.DAStoredProcEditor.pas | 6 + .../Net/CoreLab.Dac.Design.DATableEditor.pas | 6 + .../CoreLab.Dac.Design.DAUpdateSQLEditor.pas | 6 + .../CoreLab.Dac.Design.DAUpdateSQLFrame.pas | 6 + .../Net/CoreLab.Dac.Design.DBToolsClient.pas | 5 + .../Net/CoreLab.Dac.Design.DBToolsIntf.pas | 5 + .../Source/Net/CoreLab.Dac.Design.DacReg.pas | 22 + .../Net/CoreLab.Dac.Design.Download.pas | 5 + .../Net/CoreLab.Dac.Design.HelpUtils.pas | 7 + .../Net/CoreLab.Dac.Design.VTDataEditor.pas | 6 + .../Net/CoreLab.Dac.Design.VTDesign.pas | 5 + .../1/Source/Net/CoreLab.Dac.MemDS.pas | 5 + .../1/Source/Net/CoreLab.Dac.MemData.pas | 5 + .../1/Source/Net/CoreLab.Dac.MemUtils.pas | 5 + .../1/Source/Net/CoreLab.Dac.VirtualTable.pas | 5 + .../1/Source/Net/CoreLab.Dac.Win32Timer.pas | 5 + .../1/Source/Net/CoreLab.Sdac.CRThread.pas | 5 + .../1/Source/Net/CoreLab.Sdac.DataAdapter.pas | 20 + .../Net/CoreLab.Sdac.Design.DataAdapter.pas | 9 + ...CoreLab.Sdac.Design.MSConnectionEditor.pas | 7 + .../Net/CoreLab.Sdac.Design.MSDesign.pas | 8 + .../Net/CoreLab.Sdac.Design.MSDesignUtils.pas | 6 + .../Net/CoreLab.Sdac.Design.MSDumpEditor.pas | 8 + .../Source/Net/CoreLab.Sdac.Design.MSMenu.pas | 8 + .../Net/CoreLab.Sdac.Design.MSNamesEditor.pas | 7 + .../Net/CoreLab.Sdac.Design.MSParamsFrame.pas | 7 + .../Net/CoreLab.Sdac.Design.MSQueryEditor.pas | 7 + .../Source/Net/CoreLab.Sdac.Design.MSReg.pas | 82 + .../Net/CoreLab.Sdac.Design.MSSPCallFrame.pas | 7 + .../Net/CoreLab.Sdac.Design.MSSQLEditor.pas | 7 + ...CoreLab.Sdac.Design.MSStoredProcEditor.pas | 7 + .../CoreLab.Sdac.Design.MSUpdateSQLEditor.pas | 7 + .../Net/CoreLab.Sdac.Design.SdacAbout.pas | 8 + .../1/Source/Net/CoreLab.Sdac.MSAccess.pas | 5 + .../Source/Net/CoreLab.Sdac.MSConnectForm.pas | 5 + .../Net/CoreLab.Sdac.MSConnectionPool.pas | 5 + .../1/Source/Net/CoreLab.Sdac.MSConsts.pas | 5 + .../1/Source/Net/CoreLab.Sdac.MSDump.pas | 5 + .../1/Source/Net/CoreLab.Sdac.MSLoader.pas | 5 + .../1/Source/Net/CoreLab.Sdac.MSParser.pas | 5 + .../Source/Net/CoreLab.Sdac.MSSQLMonitor.pas | 8 + .../1/Source/Net/CoreLab.Sdac.MSScript.pas | 8 + .../Net/CoreLab.Sdac.MSServiceBroker.pas | 5 + .../1/Source/Net/CoreLab.Sdac.OLEDBAccess.pas | 5 + .../1/Source/Net/CoreLab.Sdac.OLEDBC.pas | 5 + .../1/Source/Net/CoreLab.Sdac.OLEDBIntf.pas | 1356 ++ .../1/Source/Net/CoreLab.Sdac.SdacVcl.pas | 5 + .../CoreLab.VirtualTable.Design.DacReg.pas | 21 + internal/4.10.0.10/1/Source/Net/Dac.inc | 1 + internal/4.10.0.10/1/Source/Net/DacGui.inc | 1 + internal/4.10.0.10/1/Source/Net/DacVer.inc | 1 + internal/4.10.0.10/1/Source/Net/SdacGui.inc | 1 + internal/4.10.0.10/1/Source/OLEDBAccess.pas | 10207 ++++++++++++++ internal/4.10.0.10/1/Source/OLEDBC.pas | 5448 ++++++++ internal/4.10.0.10/1/Source/OLEDBIntf.pas | 832 ++ internal/4.10.0.10/1/Source/Sdac.inc | 13 + internal/4.10.0.10/1/Source/SdacGui.inc | 107 + internal/4.10.0.10/1/Source/SdacVcl.pas | 14 + internal/4.10.0.10/1/Source/SdacVer.inc | 9 + internal/4.10.0.10/1/Source/VirtualTable.pas | 1849 +++ internal/4.10.0.10/1/Source/Win32Timer.pas | 164 + internal/4.10.0.10/1/Source/dac.bmk | 216 + .../CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp | Bin 0 -> 1782 bytes ...CoreLab.Dac.CRBatchMove.TCRBatchMove16.bmp | Bin 0 -> 822 bytes ...CoreLab.Dac.CRBatchMove.TCRBatchMove32.bmp | Bin 0 -> 3126 bytes ...CoreLab.Dac.VirtualTable.TVirtualTable.bmp | Bin 0 -> 1782 bytes ...reLab.Dac.VirtualTable.TVirtualTable16.bmp | Bin 0 -> 822 bytes ...reLab.Dac.VirtualTable.TVirtualTable32.bmp | Bin 0 -> 3126 bytes ...CoreLab.Sdac.DataAdapter.MSDataAdapter.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSConnection.bmp | Bin 0 -> 1782 bytes .../CoreLab.Sdac.MSAccess.TMSConnection16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSConnection32.bmp | Bin 0 -> 3126 bytes .../CoreLab.Sdac.MSAccess.TMSDataSource.bmp | Bin 0 -> 1782 bytes .../CoreLab.Sdac.MSAccess.TMSDataSource16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSDataSource32.bmp | Bin 0 -> 3126 bytes .../CoreLab.Sdac.MSAccess.TMSMetadata.bmp | Bin 0 -> 1782 bytes .../CoreLab.Sdac.MSAccess.TMSMetadata16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSMetadata32.bmp | Bin 0 -> 3126 bytes .../CoreLab.Sdac.MSAccess.TMSQuery.bmp | Bin 0 -> 1784 bytes .../CoreLab.Sdac.MSAccess.TMSQuery16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSQuery32.bmp | Bin 0 -> 3128 bytes .../_Images_/CoreLab.Sdac.MSAccess.TMSSQL.bmp | Bin 0 -> 1782 bytes .../CoreLab.Sdac.MSAccess.TMSSQL16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSSQL32.bmp | Bin 0 -> 3126 bytes .../CoreLab.Sdac.MSAccess.TMSStoredProc.bmp | Bin 0 -> 1784 bytes .../CoreLab.Sdac.MSAccess.TMSStoredProc16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSStoredProc32.bmp | Bin 0 -> 3128 bytes .../CoreLab.Sdac.MSAccess.TMSTable.bmp | Bin 0 -> 1784 bytes .../CoreLab.Sdac.MSAccess.TMSTable16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSTable32.bmp | Bin 0 -> 3128 bytes .../CoreLab.Sdac.MSAccess.TMSUpdateSQL.bmp | Bin 0 -> 1784 bytes .../CoreLab.Sdac.MSAccess.TMSUpdateSQL16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSUpdateSQL32.bmp | Bin 0 -> 3128 bytes .../_Images_/CoreLab.Sdac.MSDump.TMSDump.bmp | Bin 0 -> 1782 bytes .../CoreLab.Sdac.MSDump.TMSDump16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSDump.TMSDump32.bmp | Bin 0 -> 3126 bytes .../CoreLab.Sdac.MSLoader.TMSLoader.bmp | Bin 0 -> 1782 bytes .../CoreLab.Sdac.MSLoader.TMSLoader16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSLoader.TMSLoader32.bmp | Bin 0 -> 3126 bytes ...oreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp | Bin 0 -> 1782 bytes ...eLab.Sdac.MSSQLMonitor.TMSSQLMonitor16.bmp | Bin 0 -> 822 bytes ...eLab.Sdac.MSSQLMonitor.TMSSQLMonitor32.bmp | Bin 0 -> 3126 bytes .../CoreLab.Sdac.MSScript.TMSScript.bmp | Bin 0 -> 1782 bytes .../CoreLab.Sdac.MSScript.TMSScript16.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSScript.TMSScript32.bmp | Bin 0 -> 3126 bytes ....Sdac.MSServiceBroker.TMSServiceBroker.bmp | Bin 0 -> 1782 bytes ...dac.MSServiceBroker.TMSServiceBroker16.bmp | Bin 0 -> 822 bytes ...dac.MSServiceBroker.TMSServiceBroker32.bmp | Bin 0 -> 3126 bytes .../CoreLab.Sdac.SdacVcl.TMSConnectDialog.bmp | Bin 0 -> 1782 bytes ...oreLab.Sdac.SdacVcl.TMSConnectDialog16.bmp | Bin 0 -> 822 bytes ...oreLab.Sdac.SdacVcl.TMSConnectDialog32.bmp | Bin 0 -> 3126 bytes .../CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp | Bin 0 -> 822 bytes ...CoreLab.Dac.VirtualTable.TVirtualTable.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSConnection.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSDataSource.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSMetadata.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSQuery.bmp | Bin 0 -> 822 bytes .../Delphi8/CoreLab.Sdac.MSAccess.TMSSQL.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSStoredProc.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSTable.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSAccess.TMSUpdateSQL.bmp | Bin 0 -> 822 bytes .../Delphi8/CoreLab.Sdac.MSDump.TMSDump.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSLoader.TMSLoader.bmp | Bin 0 -> 822 bytes ...oreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.MSScript.TMSScript.bmp | Bin 0 -> 822 bytes ....Sdac.MSServiceBroker.TMSServiceBroker.bmp | Bin 0 -> 822 bytes .../CoreLab.Sdac.SdacVcl.TMSConnectDialog.bmp | Bin 0 -> 822 bytes .../4.10.0.10/1/_Images_/Delphi8/Thumbs.db | Bin 0 -> 8704 bytes internal/4.10.0.10/1/_Images_/Thumbs.db | Bin 0 -> 56832 bytes 1208 files changed, 200587 insertions(+) create mode 100644 internal/4.10.0.10/1/CRGrid/Help/CRControls.cnt create mode 100644 internal/4.10.0.10/1/CRGrid/Help/CRControls.hlp create mode 100644 internal/4.10.0.10/1/CRGrid/Images/CoreLab.Vcl.CRGrid.TCRDBGrid.bmp create mode 100644 internal/4.10.0.10/1/CRGrid/Images/CoreLab.Vcl.CRGrid.TCRDBGrid16.bmp create mode 100644 internal/4.10.0.10/1/CRGrid/Images/CoreLab.Vcl.CRGrid.TCRDBGrid32.bmp create mode 100644 internal/4.10.0.10/1/CRGrid/Images/Delphi8/CoreLab.Vcl.CRGrid.TCRDBGrid.bmp create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CBuilder5/crcontrols50.bpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CBuilder5/crcontrols50.cpp create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CBuilder5/crcontrols50.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.bpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.cpp create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CRControls.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CRControls10p.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CRControls9.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CRControlsReg.pas create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CRGrid.inc create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CRGrid.pas create mode 100644 internal/4.10.0.10/1/CRGrid/Source/CRGrid.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/CRControls.reg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/CRControls100.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/CRControls100.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.bdsproj create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.reg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.snk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/crcontrols100.bdsproj create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi10/crcontrols100.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi11/CRControls105.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.bdsproj create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.snk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi11/crcontrols105.bdsproj create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi11/crcontrols105.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi11/crcontrols105.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.dof create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.dof create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.dof create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.bdsproj create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.reg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.snk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/CRControls.reg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/CRControls90.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/CRControls90.res create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.bdsproj create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.cfg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.reg create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.snk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/crcontrols90.bdsproj create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Delphi9/crcontrols90.dpk create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Net/CRGrid.inc create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Net/CoreLab.Vcl.CRControlsReg.pas create mode 100644 internal/4.10.0.10/1/CRGrid/Source/Net/CoreLab.Vcl.CRGrid.pas create mode 100644 internal/4.10.0.10/1/DbToolsInterfaces/CoreLab.DbTools.Interfaces.dll create mode 100644 internal/4.10.0.10/1/Demos/InstallDemoObjects.sql create mode 100644 internal/4.10.0.10/1/Demos/UninstallDemoObjects.sql create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder2007.cbproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder2007.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder2007.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder5.bpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder5.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder5.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder6.bpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder6.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder6.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/Main.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/Main.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/Main.h create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/DLLMain.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/DLLMain.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ExeMain.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ExeMain.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLLGroup.bdsgroup create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLLGroup.bpg create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/About.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/About.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Data.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Data.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Main.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Main.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ClientForm.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ClientForm.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Data.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Data.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/MidasGroup.bpg create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Midas_TLB.dcr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Midas_TLB.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.tlb create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ServerForm.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ServerForm.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server_TLB.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Debug.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Main.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Main.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Data1.vtd create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Main.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Main.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Main.h create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.bpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/CategoryFrame.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/CategoryFrame.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/CategoryFrame.xfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DacDemo.inc create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoBase.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.xfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.xfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/HtmlConsts.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacAbout.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacAbout.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacDemoForm.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacDemoForm.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/WindowsXP.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/CRDBGrid/CRDBGrid.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/CRDBGrid/CRDBGrid.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/CachedUpdates.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/CachedUpdates.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/UpdateAction.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/UpdateAction.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectDialog.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectDialog.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectForm.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectForm.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/InheritedConnectForm.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/InheritedConnectForm.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/MyConnectForm.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/MyConnectForm.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/FetchAll/FetchAll.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/FetchAll/FetchAll.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/FilterAndIndex/FilterAndIndex.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/FilterAndIndex/FilterAndIndex.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Fetch.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Fetch.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Loader.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Loader.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/LongStrings/LongStrings.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/LongStrings/LongStrings.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/MasterDetail/MasterDetail.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/MasterDetail/MasterDetail.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Pictures.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Pictures.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Sandstone.bmp create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/World.bmp create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Query/Query.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Query/Query.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.dof create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServerCursors/ServerCursors.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServerCursors/ServerCursors.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServiceBroker/ServiceBroker.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServiceBroker/ServiceBroker.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Sql/Sql.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Sql/Sql.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProc/StoredProc.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProc/StoredProc.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProcUpdates/StoredProcUpdates.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProcUpdates/StoredProcUpdates.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Table/Table.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Table/Table.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Text/Text.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Text/Text.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/Threads.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/Threads.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/ThreadsData.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/ThreadsData.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/UpdateSQL/UpdateSQL.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/UpdateSQL/UpdateSQL.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/Data1.xml create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.xfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/Main.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/Main.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/test.sdf create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/FRDemo.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/FRDemo.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit1.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit1.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit2.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit2.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC6.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC7.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/file_id.diz create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxDACComponents.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxDACEditor.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.bpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.bpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC7.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC7.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC7.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACComponents.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACEditor.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACRTTI.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACReg.dcr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACReg.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxsDACComponents.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/frxSDAC5.bpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/frxSDAC5.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsDAC5.bpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsDAC5.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsSDAC5.bpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsSDAC5.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/frxSDAC6.bpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/frxSDAC6.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsDAC6.bpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsDAC6.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsSDAC6.bpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsSDAC6.cpp create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfrxSDAC10.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfrxSDAC10.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfsSDAC10.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfsSDAC10.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxDAC10.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxDAC10.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxSDAC10.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxSDAC10.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsDAC10.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsDAC10.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsSDAC10.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsSDAC10.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfrxSDAC11.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfrxSDAC11.dproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfsSDAC11.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfsSDAC11.dproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxDAC11.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxDAC11.dproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxSDAC11.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxSDAC11.dproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsDAC11.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsDAC11.dproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsSDAC11.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsSDAC11.dproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/dclfrxSDAC5.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/dclfsSDAC5.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/frxDAC5.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/frxSDAC5.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/fsDAC5.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/fsSDAC5.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/dclfrxSDAC6.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/dclfsSDAC6.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/frxDAC6.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/frxSDAC6.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/fsDAC6.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/fsSDAC6.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/dclfrxSDAC7.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/dclfsSDAC7.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/frxDAC7.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/frxSDAC7.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/fsDAC7.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/fsSDAC7.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfrxSDAC9.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfrxSDAC9.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfsSDAC9.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfsSDAC9.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxDAC9.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxDAC9.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxSDAC9.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxSDAC9.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsDAC9.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsDAC9.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsSDAC9.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsSDAC9.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/FRDemo.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/FRDemo.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit1.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit1.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit2.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit2.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/file_id.diz create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxDACComponents.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxDACEditor.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACComponents.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACComponents.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACEditor.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACRTTI.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACReg.dcr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACReg.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_idacrtti.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacreg.dcr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacreg.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacrtti.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/Main.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/Main.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/MSIP.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/MSIPPack.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/MSIPPack.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/MSIPPack.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.dof create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWebISAPI.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/ServerController.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/ServerController.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uBase.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uBase.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uCachedUpdates.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uCachedUpdates.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uData.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uData.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMain.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMain.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMasterDetail.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMasterDetail.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uQuery.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uQuery.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ServerController.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ServerController.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uBase.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uBase.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uCachedUpdates.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uCachedUpdates.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uData.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uData.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMain.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMain.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMasterDetail.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMasterDetail.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uQuery.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uQuery.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Main.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Main.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Report1.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Report1.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/EndUser.dpr create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/EndUser.res create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/Reports/Orders.rtm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/daSDAC.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/myEURpt.dfm create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/myEURpt.pas create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.cfg create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.dpk create mode 100644 internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.res create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Global.asax create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Global.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.config create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.dpr create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.aspx create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.resx create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/About.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/About.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Data.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Data.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.dpr create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.res create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Main.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Main.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/DataSet.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/DataSet.dpr create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/MainForm.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/MainForm.resx create mode 100644 internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/ReadMe.txt create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/CategoryFrame.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/CategoryFrame.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DacDemo.inc create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoBase.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoForm.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoForm.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoFrame.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoFrame.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/HtmlConsts.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacAbout.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacAbout.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacDemoForm.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacDemoForm.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CRDBGrid/CRDBGrid.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CRDBGrid/CRDBGrid.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/CachedUpdates.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/CachedUpdates.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/UpdateAction.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/UpdateAction.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectDialog.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectDialog.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectForm.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectForm.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/InheritedConnectForm.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/InheritedConnectForm.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/MyConnectForm.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/MyConnectForm.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FetchAll/FetchAll.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FetchAll/FetchAll.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FilterAndIndex/FilterAndIndex.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FilterAndIndex/FilterAndIndex.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Fetch.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Fetch.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Loader.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Loader.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/LongStrings/LongStrings.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/LongStrings/LongStrings.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/MasterDetail/MasterDetail.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/MasterDetail/MasterDetail.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Pictures/Pictures.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Pictures/Pictures.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Query/Query.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Query/Query.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.cfg create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.dpr create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.res create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServerCursors/ServerCursors.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServerCursors/ServerCursors.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServiceBroker/ServiceBroker.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServiceBroker/ServiceBroker.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Sql/Sql.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Sql/Sql.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProc/StoredProc.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProc/StoredProc.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProcUpdates/StoredProcUpdates.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProcUpdates/StoredProcUpdates.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Table/Table.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Table/Table.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Text/Text.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Text/Text.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/Threads.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/Threads.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/ThreadsData.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/ThreadsData.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/UpdateSQL/UpdateSQL.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/UpdateSQL/UpdateSQL.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/VirtualTable/VTable.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/SdacDemo/VirtualTable/VTable.pas create mode 100644 internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.bdsproj create mode 100644 internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.dpr create mode 100644 internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.res create mode 100644 internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/Main.nfm create mode 100644 internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/Main.pas create mode 100644 internal/4.10.0.10/1/FAQ.html create mode 100644 internal/4.10.0.10/1/History.html create mode 100644 internal/4.10.0.10/1/Lib/D11/CLRClasses.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRAccess.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRBatchMove.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRColFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRConnectionPool.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRDataEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CREditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRParser.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRTabEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRThread.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/CRXml.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAConnectionEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAConsts.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DADataEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DADesign.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DADesign.res create mode 100644 internal/4.10.0.10/1/Lib/D11/DADesign10p.res create mode 100644 internal/4.10.0.10/1/Lib/D11/DADesign9.res create mode 100644 internal/4.10.0.10/1/Lib/D11/DADesignUtils.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DADualListEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DADump.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DADumpEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DADumpProgress.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DALoader.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAMacrosFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAMenu.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAParamValueEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAParamsFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAQueryEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DASPCallFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DASQLEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DASQLFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DASQLGeneratorFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DASQLMonitor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAScript.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAScriptEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAStoredProcEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DATableEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAUpdateSQLEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAUpdateSQLFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DAVersionInfo.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DBAccess.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DBAccess.res create mode 100644 internal/4.10.0.10/1/Lib/D11/DBMonitorClient.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DBMonitorIntf.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DBToolsClient.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DBToolsClient.res create mode 100644 internal/4.10.0.10/1/Lib/D11/DBToolsIntf.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DacReg.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/DacVcl.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/Download.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/HelpUtils.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSAccess.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSConnectForm.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSConnectionEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSConnectionPool.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSConsts.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSDesign.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSDesign.res create mode 100644 internal/4.10.0.10/1/Lib/D11/MSDesign10p.res create mode 100644 internal/4.10.0.10/1/Lib/D11/MSDesign9.res create mode 100644 internal/4.10.0.10/1/Lib/D11/MSDesignUtils.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSDump.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSDumpEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSLoader.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSMenu.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSNamesEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSParamsFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSParser.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSQueryEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSReg.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSSPCallFrame.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSSQLEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSSQLMonitor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSScript.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSServiceBroker.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSStoredProcEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MSUpdateSQLEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MemDS.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MemData.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/MemUtils.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/OLEDBAccess.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/OLEDBC.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/OLEDBIntf.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/SdacAbout.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/VTDataEditor.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/VTDesign.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/VirtualTable.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/Win32Timer.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/dac105.bpl create mode 100644 internal/4.10.0.10/1/Lib/D11/dac105.dcp create mode 100644 internal/4.10.0.10/1/Lib/D11/dac105.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/dac105.res create mode 100644 internal/4.10.0.10/1/Lib/D11/dacvcl105.bpl create mode 100644 internal/4.10.0.10/1/Lib/D11/dacvcl105.dcp create mode 100644 internal/4.10.0.10/1/Lib/D11/dacvcl105.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/dacvcl105.res create mode 100644 internal/4.10.0.10/1/Lib/D11/dcldac105.bpl create mode 100644 internal/4.10.0.10/1/Lib/D11/dcldac105.dcp create mode 100644 internal/4.10.0.10/1/Lib/D11/dcldac105.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/dcldac105.res create mode 100644 internal/4.10.0.10/1/Lib/D11/dclsdac105.bpl create mode 100644 internal/4.10.0.10/1/Lib/D11/dclsdac105.dcp create mode 100644 internal/4.10.0.10/1/Lib/D11/dclsdac105.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/dclsdac105.res create mode 100644 internal/4.10.0.10/1/Lib/D11/sdac105.bpl create mode 100644 internal/4.10.0.10/1/Lib/D11/sdac105.dcp create mode 100644 internal/4.10.0.10/1/Lib/D11/sdac105.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/sdac105.res create mode 100644 internal/4.10.0.10/1/Lib/D11/sdacVcl.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/sdacvcl105.bpl create mode 100644 internal/4.10.0.10/1/Lib/D11/sdacvcl105.dcp create mode 100644 internal/4.10.0.10/1/Lib/D11/sdacvcl105.dcu create mode 100644 internal/4.10.0.10/1/Lib/D11/sdacvcl105.res create mode 100644 internal/4.10.0.10/1/License.rtf create mode 100644 internal/4.10.0.10/1/ReadMeSrc.txt create mode 100644 internal/4.10.0.10/1/Readme.html create mode 100644 internal/4.10.0.10/1/Sdac.GID create mode 100644 internal/4.10.0.10/1/Sdac.cnt create mode 100644 internal/4.10.0.10/1/Sdac.hlp create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/Make.bat create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/dac50.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/dac50.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/dac50.res create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/dcldac50.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/dcldac50.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/dcldac50.res create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.res create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/default.bpr create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/sdac50.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/sdac50.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder5/sdac50.res create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/Make.bat create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dac60.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dac60.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dac60.res create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.res create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dcldac60.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dcldac60.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dcldac60.res create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.res create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/default.bpr create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/sdac60.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/sdac60.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/sdac60.res create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.bpk create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.cpp create mode 100644 internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.res create mode 100644 internal/4.10.0.10/1/Source/CLRClasses.pas create mode 100644 internal/4.10.0.10/1/Source/CRAccess.pas create mode 100644 internal/4.10.0.10/1/Source/CRBatchMove.pas create mode 100644 internal/4.10.0.10/1/Source/CRConnectionPool.pas create mode 100644 internal/4.10.0.10/1/Source/CRParser.pas create mode 100644 internal/4.10.0.10/1/Source/CRThread.pas create mode 100644 internal/4.10.0.10/1/Source/CRXml.pas create mode 100644 internal/4.10.0.10/1/Source/CoreLab.snk create mode 100644 internal/4.10.0.10/1/Source/DAConsts.pas create mode 100644 internal/4.10.0.10/1/Source/DADump.pas create mode 100644 internal/4.10.0.10/1/Source/DALoader.pas create mode 100644 internal/4.10.0.10/1/Source/DASQLMonitor.pas create mode 100644 internal/4.10.0.10/1/Source/DAScript.pas create mode 100644 internal/4.10.0.10/1/Source/DAVersionInfo.pas create mode 100644 internal/4.10.0.10/1/Source/DBAccess.pas create mode 100644 internal/4.10.0.10/1/Source/DBAccess.res create mode 100644 internal/4.10.0.10/1/Source/DBMonitorClient.pas create mode 100644 internal/4.10.0.10/1/Source/DBMonitorIntf.pas create mode 100644 internal/4.10.0.10/1/Source/Dac.inc create mode 100644 internal/4.10.0.10/1/Source/DacClx.pas create mode 100644 internal/4.10.0.10/1/Source/DacGui.inc create mode 100644 internal/4.10.0.10/1/Source/DacVcl.pas create mode 100644 internal/4.10.0.10/1/Source/DacVer.inc create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/Make.bat create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dac100.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dac100.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dac100.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dac100.res create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dacvcl100.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dacvcl100.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dacvcl100.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dacvcl100.res create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dcldac100.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dcldac100.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dcldac100.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dcldac100.res create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dclsdac100.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dclsdac100.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dclsdac100.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/dclsdac100.res create mode 100644 internal/4.10.0.10/1/Source/Delphi10/sdac100.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/sdac100.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/sdac100.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/sdac100.res create mode 100644 internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.res create mode 100644 internal/4.10.0.10/1/Source/Delphi11/Make.bat create mode 100644 internal/4.10.0.10/1/Source/Delphi11/SDAC105_Group.groupproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dac105.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dac105.bpi create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dac105.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dac105.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dac105.dproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dac105.res create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dacvcl105.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dacvcl105.bpi create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dacvcl105.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dacvcl105.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dacvcl105.dproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dacvcl105.res create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dcldac105.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dcldac105.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dcldac105.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dcldac105.dproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dcldac105.res create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dclsdac105.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dclsdac105.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dclsdac105.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dclsdac105.dproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/dclsdac105.res create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdac105.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdac105.bpi create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdac105.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdac105.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdac105.dproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdac105.res create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.bpi create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.dproj create mode 100644 internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.res create mode 100644 internal/4.10.0.10/1/Source/Delphi5/Make.bat create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dac50.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dac50.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dac50.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dac50.res create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dcldac50.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dcldac50.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dcldac50.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dcldac50.res create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dclsdac50.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dclsdac50.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dclsdac50.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi5/dclsdac50.res create mode 100644 internal/4.10.0.10/1/Source/Delphi5/sdac50.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi5/sdac50.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi5/sdac50.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi5/sdac50.res create mode 100644 internal/4.10.0.10/1/Source/Delphi6/Make.bat create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dac60.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dac60.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dac60.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dac60.res create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dacvcl60.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dacvcl60.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dacvcl60.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dacvcl60.res create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dcldac60.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dcldac60.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dcldac60.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dcldac60.res create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dclsdac60.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dclsdac60.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dclsdac60.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi6/dclsdac60.res create mode 100644 internal/4.10.0.10/1/Source/Delphi6/sdac60.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi6/sdac60.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi6/sdac60.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi6/sdac60.res create mode 100644 internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.res create mode 100644 internal/4.10.0.10/1/Source/Delphi7/Make.bat create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dac70.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dac70.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dac70.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dac70.res create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dacvcl70.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dacvcl70.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dacvcl70.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dacvcl70.res create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dcldac70.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dcldac70.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dcldac70.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dcldac70.res create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dclsdac70.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dclsdac70.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dclsdac70.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi7/dclsdac70.res create mode 100644 internal/4.10.0.10/1/Source/Delphi7/sdac70.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi7/sdac70.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi7/sdac70.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi7/sdac70.res create mode 100644 internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.dof create mode 100644 internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.res create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi8/Make.bat create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/Make.bat create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dac90.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dac90.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dac90.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dac90.res create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dacvcl90.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dacvcl90.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dacvcl90.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dacvcl90.res create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dcldac90.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dcldac90.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dcldac90.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dcldac90.res create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dclsdac90.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dclsdac90.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dclsdac90.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/dclsdac90.res create mode 100644 internal/4.10.0.10/1/Source/Delphi9/sdac90.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/sdac90.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/sdac90.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/sdac90.res create mode 100644 internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.bdsproj create mode 100644 internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.cfg create mode 100644 internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.dpk create mode 100644 internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.res create mode 100644 internal/4.10.0.10/1/Source/Design/CRColFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/CRColFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/CRColFrame.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/CRDataEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/CRDataEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/CRDataEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/CREditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/CREditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/CREditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/CRFldLinks.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/CRFldLinks.pas create mode 100644 internal/4.10.0.10/1/Source/Design/CRFldLinks.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/CRFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/CRFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/CRFrame.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/CRTabEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/CRTabEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/CRTabEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAConnectionEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAConnectionEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAConnectionEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DADataEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DADataEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DADataEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DADesign.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DADesign.res create mode 100644 internal/4.10.0.10/1/Source/Design/DADesign10p.res create mode 100644 internal/4.10.0.10/1/Source/Design/DADesign9.res create mode 100644 internal/4.10.0.10/1/Source/Design/DADesignUtils.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DADualListEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DADualListEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DADualListEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DADumpEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DADumpEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DADumpEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DADumpProgress.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DADumpProgress.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DADumpProgress.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAMacrosFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAMacrosFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAMacrosFrame.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAMenu.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAParamValueEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAParamValueEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAParamValueEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAParamsFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAParamsFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAParamsFrame.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAQueryEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAQueryEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAQueryEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DASPCallFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DASPCallFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DASPCallFrame.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DASQLEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DASQLEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DASQLEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DASQLFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DASQLFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DASQLFrame.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAScriptEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAScriptEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAScriptEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DATableEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DATableEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DATableEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/DBToolsClient.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DBToolsClient.res create mode 100644 internal/4.10.0.10/1/Source/Design/DBToolsIntf.pas create mode 100644 internal/4.10.0.10/1/Source/Design/DacReg.pas create mode 100644 internal/4.10.0.10/1/Source/Design/Download.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/Download.pas create mode 100644 internal/4.10.0.10/1/Source/Design/HelpUtils.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSConnectionEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/MSConnectionEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSDesign.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSDesign.res create mode 100644 internal/4.10.0.10/1/Source/Design/MSDesign10p.res create mode 100644 internal/4.10.0.10/1/Source/Design/MSDesign9.res create mode 100644 internal/4.10.0.10/1/Source/Design/MSDesignUtils.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSDumpEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/MSDumpEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSMenu.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSNamesEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/MSNamesEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSParamsFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/MSParamsFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSQueryEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/MSQueryEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSReg.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSSPCallFrame.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/MSSPCallFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSSQLEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/MSSQLEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSStoredProcEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/MSStoredProcEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/MSUpdateSQLEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/MSUpdateSQLEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/SdacAbout.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/SdacAbout.pas create mode 100644 internal/4.10.0.10/1/Source/Design/VTDataEditor.dfm create mode 100644 internal/4.10.0.10/1/Source/Design/VTDataEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Design/VTDataEditor.xfm create mode 100644 internal/4.10.0.10/1/Source/Design/VTDesign.pas create mode 100644 internal/4.10.0.10/1/Source/MSAccess.pas create mode 100644 internal/4.10.0.10/1/Source/MSConnectForm.dfm create mode 100644 internal/4.10.0.10/1/Source/MSConnectForm.pas create mode 100644 internal/4.10.0.10/1/Source/MSConnectionPool.pas create mode 100644 internal/4.10.0.10/1/Source/MSConsts.pas create mode 100644 internal/4.10.0.10/1/Source/MSDump.pas create mode 100644 internal/4.10.0.10/1/Source/MSLoader.pas create mode 100644 internal/4.10.0.10/1/Source/MSParser.pas create mode 100644 internal/4.10.0.10/1/Source/MSSQLMonitor.pas create mode 100644 internal/4.10.0.10/1/Source/MSScript.pas create mode 100644 internal/4.10.0.10/1/Source/MSServiceBroker.pas create mode 100644 internal/4.10.0.10/1/Source/Make.bat create mode 100644 internal/4.10.0.10/1/Source/MemDS.pas create mode 100644 internal/4.10.0.10/1/Source/MemData.pas create mode 100644 internal/4.10.0.10/1/Source/MemUtils.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRAccess.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRBatchMove.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRConnectionPool.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRParser.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DAConsts.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DADump.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DALoader.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DASQLMonitor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DAScript.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBAccess.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBMonitorClient.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBMonitorIntf.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DacVcl.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DataAdapter.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRColFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRDataEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CREditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRTabEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAConnectionEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADataEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADesign.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADesignUtils.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADualListEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADumpEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADumpProgress.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAMacrosFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAMenu.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAParamValueEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAParamsFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAQueryEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASPCallFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLGeneratorFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAScriptEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAStoredProcEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DATableEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAUpdateSQLEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAUpdateSQLFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DBToolsClient.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DBToolsIntf.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DacReg.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.Download.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.HelpUtils.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.VTDataEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.VTDesign.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemDS.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemData.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemUtils.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.VirtualTable.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Win32Timer.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.CRThread.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.DataAdapter.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.DataAdapter.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSConnectionEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDesign.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDesignUtils.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDumpEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSMenu.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSNamesEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSParamsFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSQueryEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSReg.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSSPCallFrame.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSSQLEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSStoredProcEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSUpdateSQLEditor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.SdacAbout.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSAccess.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConnectForm.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConnectionPool.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConsts.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSDump.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSLoader.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSParser.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSSQLMonitor.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSScript.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSServiceBroker.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBAccess.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBC.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBIntf.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.SdacVcl.pas create mode 100644 internal/4.10.0.10/1/Source/Net/CoreLab.VirtualTable.Design.DacReg.pas create mode 100644 internal/4.10.0.10/1/Source/Net/Dac.inc create mode 100644 internal/4.10.0.10/1/Source/Net/DacGui.inc create mode 100644 internal/4.10.0.10/1/Source/Net/DacVer.inc create mode 100644 internal/4.10.0.10/1/Source/Net/SdacGui.inc create mode 100644 internal/4.10.0.10/1/Source/OLEDBAccess.pas create mode 100644 internal/4.10.0.10/1/Source/OLEDBC.pas create mode 100644 internal/4.10.0.10/1/Source/OLEDBIntf.pas create mode 100644 internal/4.10.0.10/1/Source/Sdac.inc create mode 100644 internal/4.10.0.10/1/Source/SdacGui.inc create mode 100644 internal/4.10.0.10/1/Source/SdacVcl.pas create mode 100644 internal/4.10.0.10/1/Source/SdacVer.inc create mode 100644 internal/4.10.0.10/1/Source/VirtualTable.pas create mode 100644 internal/4.10.0.10/1/Source/Win32Timer.pas create mode 100644 internal/4.10.0.10/1/Source/dac.bmk create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Dac.CRBatchMove.TCRBatchMove16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Dac.CRBatchMove.TCRBatchMove32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Dac.VirtualTable.TVirtualTable.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Dac.VirtualTable.TVirtualTable16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Dac.VirtualTable.TVirtualTable32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.DataAdapter.MSDataAdapter.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSConnection.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSConnection16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSConnection32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSDataSource.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSDataSource16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSDataSource32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSMetadata.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSMetadata16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSMetadata32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSQuery.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSQuery16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSQuery32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSSQL.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSSQL16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSSQL32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSStoredProc.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSStoredProc16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSStoredProc32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSTable.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSTable16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSTable32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSUpdateSQL.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSUpdateSQL16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSUpdateSQL32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSDump.TMSDump.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSDump.TMSDump16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSDump.TMSDump32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSLoader.TMSLoader.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSLoader.TMSLoader16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSLoader.TMSLoader32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSScript.TMSScript.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSScript.TMSScript16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSScript.TMSScript32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSServiceBroker.TMSServiceBroker.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSServiceBroker.TMSServiceBroker16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSServiceBroker.TMSServiceBroker32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.SdacVcl.TMSConnectDialog.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.SdacVcl.TMSConnectDialog16.bmp create mode 100644 internal/4.10.0.10/1/_Images_/CoreLab.Sdac.SdacVcl.TMSConnectDialog32.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Dac.VirtualTable.TVirtualTable.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSConnection.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSDataSource.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSMetadata.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSQuery.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSSQL.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSStoredProc.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSTable.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSUpdateSQL.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSDump.TMSDump.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSLoader.TMSLoader.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSScript.TMSScript.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSServiceBroker.TMSServiceBroker.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.SdacVcl.TMSConnectDialog.bmp create mode 100644 internal/4.10.0.10/1/_Images_/Delphi8/Thumbs.db create mode 100644 internal/4.10.0.10/1/_Images_/Thumbs.db diff --git a/internal/4.10.0.10/1/CRGrid/Help/CRControls.cnt b/internal/4.10.0.10/1/CRGrid/Help/CRControls.cnt new file mode 100644 index 0000000..23619c8 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Help/CRControls.cnt @@ -0,0 +1,41 @@ +:TITLE TCRDBGrid Component +:BASE CRControls.hlp +1 Compatibility=Compatibility_CRControls@CRControls.hlp>Main +1 Support=Compatibility_CRControls_2@CRControls.hlp>Main +1 TCRColumn +2 Description=TCRColumn@CRControls.hlp>Main +2 Properties +3 FilterExpression=TCRColumn_FilterExpression@CRControls.hlp>Main +3 FloatDigits=TCRColumn_FloatDigits@CRControls.hlp>Main +3 FloatFormat=TCRColumn_FloatFormat@CRControls.hlp>Main +3 FloatPrecision=TCRColumn_FloatPrecision@CRControls.hlp>Main +3 SortOrder=TCRColumn_SortOrder@CRControls.hlp>Main +3 SortSequence=TCRColumn_SortSequence@CRControls.hlp>Main +3 SummaryMode=TCRColumn_SummaryMode1@CRControls.hlp>Main +3 TotalString=TCRColumn_TotalString@CRControls.hlp>Main +3 TotalValue=TCRColumn_TotalValue@CRControls.hlp>Main +1 TCRDBGrid +2 Description=TCRDBGrid@CRControls.hlp>Main +2 Properties +3 Filtered=TCRDBGrid_Filtered@CRControls.hlp>Main +3 LevelDelimiterChar=TCRDBGrid_LevelDelimiterChar@CRControls.hlp>Main +3 Columns=TCRDBGrid_Columns@CRControls.hlp>Main +3 OptionsMenu=TCRDBGrid_OptionsMenu@CRControls.hlp>Main +3 OptionsEx=TCRDBGrid_OptionsEx@CRControls.hlp>Main +2 Methods +3 ActivateFilterEdit=TCRDBGrid_ActivateFilterEdit@CRControls.hlp>Main +3 ActivateSearchEdit=TCRDBGrid_ActivateSearchEdit@CRControls.hlp>Main +3 AdjustColumns=TCRDBGrid_AdjustColumns@CRControls.hlp>Main +3 ApplyFilter=TCRDBGrid_ApplyFilter@CRControls.hlp>Main +3 CalcTitleLevel=TCRDBGrid_CalcTitleLevel@CRControls.hlp>Main +3 ClearFilters=TCRDBGrid_ClearFilters1@CRControls.hlp>Main +3 ClearSorting=TCRDBGrid_ClearSorting@CRControls.hlp>Main +3 DataChanged=TCRDBGrid_DataChanged@CRControls.hlp>Main +3 GetGridSize=TCRDBGrid_GetGridSize@CRControls.hlp>Main +3 GetTitleLevel=TCRDBGrid_GetTitleLevel@CRControls.hlp>Main +2 Events +3 OnGetCellParams=TCRDBGrid_OnGetCellParams@CRControls.hlp>Main +3 OnMemoClick=TCRDBGrid_OnMemoClick@CRControls.hlp>Main +2 Working with TCRDBGrid component +3 Using Filter Bar=TCRDBGrid_usingfilterbar@CRControls.hlp>Main +3 Using Search Bar=TCRDBGrid_usingsearchbar@CRControls.hlp>Main diff --git a/internal/4.10.0.10/1/CRGrid/Help/CRControls.hlp b/internal/4.10.0.10/1/CRGrid/Help/CRControls.hlp new file mode 100644 index 0000000000000000000000000000000000000000..f8f1ba914f8b79e92e011031389b8eeb7e5c13ef GIT binary patch literal 79497 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Images/CoreLab.Vcl.CRGrid.TCRDBGrid.bmp b/internal/4.10.0.10/1/CRGrid/Images/CoreLab.Vcl.CRGrid.TCRDBGrid.bmp new file mode 100644 index 0000000000000000000000000000000000000000..761b4c8096db315df71200be474e5be8dee53f9f GIT binary patch literal 1782 zcmcJOJ4_T&6o%KBnAlibTUl8cwZY2H7)uky!otR9EDUN;I&F+bF$PcxA&7_|Mg??% zAnSrW1O(RQwd{L$W_D(F_Axu}I}gvy#mQ#0AVfE3ZqAu=?zjKBbMCQ|(k`F#I|A!| zc=m2SI~>pF3qXEi4}P3NSOWj_w{h?QHlTuo*{)OlSHpAR$Nj;E&QF(G2d}h`^aSSJ zEYzpR$E!o|Juh*##XognH1Z@-c$Cv>zEyU2B=$81-;PY;tY-^^uDNjRTyFQD4y!G+ z{4gWd1dBU+7+-t(_Oo{$4s3@vc&&DD8LSsOhR=k=CQ5ve5sm`q4ee`7)HV0H1y}$M zT`|?o;?&j7(b|yMOo^L%x^uv}_58id*`jmp_1M{^YL2a^zV##CKGM~E{`ldo*tw?O z+9d(&`Q2CiX6px+Q=rluk>s**F1-;N?an9G*w`|=@so`#LddMn(<`%dc;!5~CL>#1Rl8CZ$nvm5AOQoVrJ# zfeP{qsEyX@)}<3cwz2Pv%P|y5mjzuaBcW(-EU{W4r*eeKW+0TQgiJ)G%zFR##i1-Y zA;@#4wP0D373t;l?9k*7mjlIHv6yDEWmA&V z7vc+!BwEW;z*m`+l1nONOwQV;CncAqL|BZ4gy5Te3;l(IfFl{Q2$e`EA)%o0oK~VCR9Qk{(h8kY$hghP zu1l#^F%^~)UJhipXI?#qZt9w$sfH>8(2y!fETc*hl?xE6@a^)X%49(jgfbD6vJol0 z1_$NgSf*|o$V7lrY!1wT$m>E`=WUKwWHc_Puq1S6bI7<%L|_b{I}gV+4bzr{Oii^p zis(qT!hr({E=%k`ao}of+wi^k E1w;!ZRsaA1 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Images/CoreLab.Vcl.CRGrid.TCRDBGrid16.bmp b/internal/4.10.0.10/1/CRGrid/Images/CoreLab.Vcl.CRGrid.TCRDBGrid16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1b373890ca9bd3f2de8c275b4311a533d43f1a1f GIT binary patch literal 822 zcmaiw&r1SP5XaY~Yjo_`txiEw9_rR1h!E;hbSR4sb?DZmf1rZIqChGTDMDK$4^c=E zfrODF_%k#7QC6FZtJ%`3yX(5I!6zaj+c59(H7H+LAmjyVtndyiY?zNn>_vU&NDaX~xSct+Z;(2Bu6*nOzH*_pzN9`MwRK z3=E~|bI<&9ZN86HSkfbUJD9hY!{v$LwmE5WFGfXErl|3-gqa@FU16S1eb7`g`yLP8 zk(v0@SIABI9zd_y{kj6OacHN2<`QV0yvIC3l2jF|0uPK>WO$n5GD*YXT@^U7%)$hLq51DLyduv_6`{(Pfv@})gr6**OSSOu$^Rz) FIe&4+F6vnd@^#Q~)PZcjnNJvOjqJIEOB!ocpkvAeh3T07}(g!4Hr6QpSl9VEK zQR2`nq)BO-B2ps)bra$w&cXwfq!7D_YsYrH#P--@&pu$IrZU=%G6HIfUQG@qN_(*4I6P9X_}}`!N6V3w3qV|H&tG@JYV7H|!%mANG+O zH?ZI32$Mgro}ZZhsAsITtN&=%z_GKJPYg|ZCYRl>>>%UTJ@U^?_)knMd@_5hXD!hY z%D=jhd1`$9iJqlrKli?W?uz3Av^%3Cj>-AlDSqA8-TUL7E6x5y`-;%LDGp|&kHe)` zmV^V}WgAD5`-dWrU0CV6%qa`PKTll23U{e8jXr-vNA zb56d&?_K%LpAI}Xn{QbubTR(Puy~lAAN+=a$OC=BwhoUIFMxcxJ-V+rPdc0C&cWyB z1?T)H!zG7bKN#KD8*1(7bsoNt%^RnNn}}cJ=Xdg7KZ5*38$F?;pIx{QtnzAk^o^=QM$4zwY*O9cf~llqaylv}Bl1=lrW9X4a(8qL7Ikuw2SG1vGZ!hiApUk-NpC8th@89wQ%*UA9C;j03?cIZa z;maks(91==B!Hk5vl?6=gdFE5lnl8*2#mkc)<1#zzU9)teSXSMg*B6)v({>UM(otkxUx*vx8h_y^zE^un0WKYo42J2T(f z{@&tmYYv%jpnpqO8DB9JiTG3qsx?C3d=!GafT?C;N-C;UgS5MNUas&xqqron2B(SeR2 zJ`$BhM?g+7n5YH0NNk|5YxAv&Y4RvIpA<`S<#H-8#pbmFlT$uTiiMnPx!R)%E^6^B z7V)u6!yrD&4Y?|^&6kRH2%;?~3IQF#r(drVw5=>qQKK*v#!v%9<5g)ZSG~RT?SE#Si5mh-=r(d2;Kh)aph|Su3 zIz9Km_>e1>Ems4DAQ$u>fx9%Cssk1#lPe#vvD$ogcyds|D@;o!b%bHdmE=SrkX&gr fmCzB86Ptedl$N8>1i9AYV?^xL`uqI(|6chMFHSKi literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Images/Delphi8/CoreLab.Vcl.CRGrid.TCRDBGrid.bmp b/internal/4.10.0.10/1/CRGrid/Images/Delphi8/CoreLab.Vcl.CRGrid.TCRDBGrid.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1b373890ca9bd3f2de8c275b4311a533d43f1a1f GIT binary patch literal 822 zcmaiw&r1SP5XaY~Yjo_`txiEw9_rR1h!E;hbSR4sb?DZmf1rZIqChGTDMDK$4^c=E zfrODF_%k#7QC6FZtJ%`3yX(5I!6zaj+c59(H7H+LAmjyVtndyiY?zNn>_vU&NDaX~xSct+Z;(2Bu6*nOzH*_pzN9`MwRK z3=E~|bI<&9ZN86HSkfbUJD9hY!{v$LwmE5WFGfXErl|3-gqa@FU16S1eb7`g`yLP8 zk(v0@SIABI9zd_y{kj6OacHN2<`QV0yvIC3l2jF|0uPK>WO$n5GD*YXT@^U7%)$hLq51DLyduv_6`{(Pfv@})gr6**OSSOu$^Rz) FIe& + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=Core Lab Controls +ProductVersion=6.10.1.10 +Comments= + +[HistoryLists\hlIncludePath] +Count=5 +Item0=..\;..;..\..\..\Dac\Source;$(BCB)\include;$(BCB)\include\vcl +Item1=..\;..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;..\..\..\ODac\Source +Item2=..\;..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder5;..\..\..\ODac\Source;..\..\..\ODac\Source\CBuilder5 +Item3=..\;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder5;..\..\..\ODac\Source;..\..\..\ODac\Source\CBuilder5 +Item4=..\;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=4 +Item0=..\;..;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder5;..\..\..\ODac\Source;..\..\..\ODac\Source\CBuilder5;$(BCB)\lib;$(BCB)\lib\obj +Item1=..\;..;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder5;..\..\..\ODac\Source;..\..\..\ODac\Source\CBuilder5 +Item2=..\;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder5;..\..\..\ODac\Source;..\..\..\ODac\Source\CBuilder5 +Item3=D:\Program Files\Borland\CBuilder5\Projects\Lib;..\;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=. + +[HistoryLists\hIBPIOutputDir] +Count=1 +Item0=. + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + + diff --git a/internal/4.10.0.10/1/CRGrid/Source/CBuilder5/crcontrols50.cpp b/internal/4.10.0.10/1/CRGrid/Source/CBuilder5/crcontrols50.cpp new file mode 100644 index 0000000..8eebbd2 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/CBuilder5/crcontrols50.cpp @@ -0,0 +1,22 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("CRControls50.res"); +USEPACKAGE("vcl50.bpi"); +USEPACKAGE("Vcldb50.bpi"); +USEUNIT("..\CRControlsReg.pas"); +USEPACKAGE("dac50.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/CRGrid/Source/CBuilder5/crcontrols50.res b/internal/4.10.0.10/1/CRGrid/Source/CBuilder5/crcontrols50.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.bpk b/internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.bpk new file mode 100644 index 0000000..7eab5a8 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.bpk @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=Core Lab Controls +ProductVersion=6.10.1.10 +Comments= + +[HistoryLists\hlIncludePath] +Count=5 +Item0=..\;..;..\..\..\Dac\Source;$(BCB)\include;$(BCB)\include\vcl +Item1=..\;..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;..\..\..\ODac\Source +Item2=..\;..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\..\..\ODac\Source;..\..\..\ODac\Source\CBuilder6 +Item3=..\;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\..\..\ODac\Source;..\..\..\ODac\Source\CBuilder6 +Item4=..\;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=4 +Item0=..\;..;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\..\..\Odac\Source;..\..\..\Odac\Source\CBuilder6;$(BCB)\lib;$(BCB)\lib\obj +Item1=..\;..;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\..\..\Odac\Source;..\..\..\Odac\Source\CBuilder6 +Item2=..\;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\..\..\Odac\Source;..\..\..\Odac\Source\CBuilder6 +Item3=D:\Program Files\Borland\CBuilder6\Projects\Lib;..\;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=. + +[HistoryLists\hIBPIOutputDir] +Count=1 +Item0=. + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + + diff --git a/internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.cpp b/internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.cpp new file mode 100644 index 0000000..7b61468 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.cpp @@ -0,0 +1,22 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("CRControls60.res"); +USEPACKAGE("vcl60.bpi"); +USEPACKAGE("Vcldb60.bpi"); +USEUNIT("..\CRControlsReg.pas"); +USEPACKAGE("dac60.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.res b/internal/4.10.0.10/1/CRGrid/Source/CBuilder6/crcontrols60.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/CRControls.res b/internal/4.10.0.10/1/CRGrid/Source/CRControls.res new file mode 100644 index 0000000000000000000000000000000000000000..25c48446ec0327736f8c9e5f78b7f7949f4ba4c6 GIT binary patch literal 1848 zcmcJONlX+$6o$(sCfqoBG@d*eWAvmaH8I4S(M0j!!Ha7=7?-Hr^kOtFF@j16!EqPk z0y;oY928MdaU4Kk_L=UU?w+2dr}yf`*Hh3LTMvY2<#o?{U9Z0RU)3vw5Ly9`N7F|&3x zF`$A&*q&4SSG}W=D=$M$fma7xyAQYbJsSAp%|d>9aIiK6-}jNswgf-!@1MSwC|u4N z8$ML(Iua|dhMx2dky+mo2tD)Q#5vR++!fJVSoKmy-ViD-dBmai^qHGaeH>U0U&y=G zA!+bF(9yd)EZ<<{iy3Jna2~R#EpfcL(@P)%Na%^FEtX6j3G_FHN(x|f-LX5*SxP`{d{cijmM4OC8B4puK3B;=N_lPqy;J|WaC15 zCfxrZpZLkg#`&2a{PY-v+~gN_VuX!+I`;V8&TrCnTE38$*S#&Ey9~M=JKfghaU85W zn(C;MEsLnqmoydBd%)%HcB_m(-ZJMn_#vdQwSE$ccy) z3;%_KfumTe44GIeVX0tB~2)Okwd(i)r6=(x+tPARELITcY7eh$no%=~&R(>4vu z&@EjBprur>T*j3mE*Buw;q3CX&SgOogenzNveQcXCv23Dv&$t_#%-rRIRpjO0SBss l4TtK?YCFMY!J>f6JfL7!<6*-A1(zlEpEz(e7Hs5R`~uBXD(wIO literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/CRControls10p.res b/internal/4.10.0.10/1/CRGrid/Source/CRControls10p.res new file mode 100644 index 0000000000000000000000000000000000000000..b688ddfb2dfa628e93c9e93614d24add523bb38b GIT binary patch literal 4056 zcmds3S!`5Q7`|;G#OMQ$J`rAwBqkBQ{O9Im4=%!B zzWEg}FVbb;I`zjfpx#@6cQ{e|^TjqN#7aTR9rc ztn5!Sjo~G`TPb}w;0yc5L*9|w?atuHz~r4i|BY^pKRz(oH>qAFx4mJ#pI(u(XdTizIkQS7*L4KV!O~Wa0 zkrGic8pN2N^6>tVjCW{edR+&NrpR(SAtfRh3!w=d;rzon^w`SZbLdTZ41A1LNl^GS z5Try{j7@<{etJ!oRFMb0oQg|qNQ?w>=yB!8cB-63FXW4@*O+26U~*$?A=b%f#TIaK zTh;*o?LUnVE66bLwzq?&_tGV6aYhL){4;o{wd04wEt@K9w^Y_`J#cb+!v)8MemgM* zrz;fg3Gu62ySBIX?!0>U@clr=aC}W~c=74cR}NoW`b*n42OmT&(8it3k8-s0weQmL zHpi*bu0Z(!TQ!lY4|6|y(yOkq3(iH0nuGHiye}Oas5#zd$^0n(WA#&3)v%&FzF{D- zXCiIKFLVYA>b&!6+}rjwSol;en9>1$AB$hQt8UrVc-cUr(!k&0Nv$^I2Yz9lcW#Y) zbH#&1MO9(vlCwf3vHzCtseh-3wdCL7Nn7{@^}abrhBs9lvC}{8_|v_OB?Lc7<+t=- z&xgVviieOv#mE$M0 zu6A*fiiODF>V1y&=PDdCu8){lVa0Qlo%yi!Y&Nqx;Jv7@79@t z;XmD;%VE});$123awvARtGD^uU_-mB@Ai-#Uy}qpajM8EdnXfr1mCdr*rdO6(B1e~drL=eOMBPpi=AzqJ)6qE?z?l}Lbmjy$)bTTC;~_Di6Mxs zaRrJ`9!Y}*rlh!-_6b>cJPk|yE`#fGbl0gdLRItjj{h)70h&|yk# z4J{$4F~u!-dWFf6eE6!Y%7g`ukaC9DI!%ij#jrI}2O@&tLs3yg1l-AwDQrPl1jZ28 zv*T;Js?u9feB!ahU8y@I43CYYtivu+6Y*HMlj*KzY66Sd@KJpNA6-=xf)8`UT?O96 z=aS|XQl>kRD5&{U_O&R8$L=%4Oh^hA{C4@!w@tgFs1HFgAP*~*HSzT zEn!LxL9<^Te4}Co6H-BIu(cx5pdxK@LNVQyxD&YosliEVN+TlR bPQ+ai*HVn6Cb;Wt_(&1Ys#|LL9}NBl=9^(x literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/CRControls9.res b/internal/4.10.0.10/1/CRGrid/Source/CRControls9.res new file mode 100644 index 0000000000000000000000000000000000000000..f8f338f625754b8a290f32fe909e3609ee2e7987 GIT binary patch literal 888 zcmZQzU|>)H;{X347|28c8q5p~20)Sj|Cty<7@Qe`7+e^f7~FxhCy)gJ0s@>YFijdj zh5!^ZGDtv#fo7nC0|yS=HqwJ22pdiU8CU^OFyS_icg5BD)9921@xZJsE%F&w^Lq!p?nR zUiI3jZ7om`4+vO#A`YVd{1?_WZ`CX2;86^e3S53V_8Qpy^IsU3J-6!J1{B=AY}0~NKl5IE^*#NCVd-m=?#&SOub(}7{p7)`hj%XRUGd`1m8X|aJ~@9B$WGsO zq5J*+wLkuMz5gG1_kZk)LlE`<|Nr~<_s`#7KY?ogeEs^F5R1X`N7n4 z*XLchy7>Ct6(=r2)B~mPBcN-6Dj@*q{{Im0?;lVX(3W2x-~N320?7XU{QmbRcfLNn zj$Qr#|3EeW{`~&^<>Rl9Z-DF{uO0)ne0y>mO+8QwKSEOvbr0BlAp7sHAAi1o0h;jZ pDhEa3nE literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/CRControlsReg.pas b/internal/4.10.0.10/1/CRGrid/Source/CRControlsReg.pas new file mode 100644 index 0000000..8720445 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/CRControlsReg.pas @@ -0,0 +1,42 @@ + +////////////////////////////////////////////////// +// CRControls +// Copyright (c) 2000-2006 Core Lab. All right reserved. +// CRControls registration +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +unit CRControlsReg; +{$ENDIF} + +{$I CRGrid.inc} + +interface + +uses + Classes, CRGrid; + +procedure Register; + +implementation + +{$IFNDEF CLR} + {$IFDEF VER9} + {$R CRControls9.res} + {$ELSE} + {$R CRControls.res} + {$ENDIF} + {$IFDEF VER10P} + {$R CRControls10p.res} + {$ENDIF} +{$ELSE} + {$R CRControls.res} +{$ENDIF} + +procedure Register; +begin + RegisterComponents('Data Controls', [TCRDBGrid]); +end; + +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/CRGrid.inc b/internal/4.10.0.10/1/CRGrid/Source/CRGrid.inc new file mode 100644 index 0000000..898acf5 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/CRGrid.inc @@ -0,0 +1,168 @@ +{$DEFINE DAC600} + +{$IFNDEF LINUX} + {$DEFINE MSWINDOWS} +{$ENDIF} + +{$IFDEF VER120} { Delphi 4 } + {$DEFINE D4} + {$DEFINE VER4} + + {$DEFINE VER34} + {$DEFINE VER4P} +{$ENDIF} + +{$IFDEF VER130} { Delphi 5 } +{$IFNDEF BCB} + {$DEFINE D5} + {$DEFINE VER5} + + {$DEFINE VER5P} +{$ENDIF} +{$ENDIF} + +{$IFDEF VER140} { Delphi 6, Kylix 1, Kylix 2 } +{$IFNDEF BCB} + {$DEFINE D6} + {$DEFINE VER6} + + {$DEFINE VER5P} + {$DEFINE VER6P} +{$ENDIF} +{$ENDIF} + +{$IFDEF VER150} { Delphi 7 } +{$IFNDEF BCB} + {$DEFINE D7} + {$DEFINE VER7} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} +{$ENDIF} +{$ENDIF} + +{$IFDEF VER160} { Delphi 8 } +{$IFDEF DAC450} + DAC 4.50 does not support Delphi 8!!! +{$ENDIF} + {$DEFINE D8} + {$DEFINE VER8} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} + {$DEFINE VER8P} +{$ENDIF} + +{$IFDEF VER170} { Delphi 9 } + {$DEFINE D9} + {$DEFINE VER9} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} + {$DEFINE VER8P} + {$DEFINE VER9P} +{$ENDIF} + +{$IFDEF VER180} { Delphi 10 } + {$DEFINE D10} + {$DEFINE VER10} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} + {$DEFINE VER8P} + {$DEFINE VER9P} + {$DEFINE VER10P} +{$ENDIF} + +{$IFDEF VER185} { Delphi 11 } + {$DEFINE D11} + {$DEFINE VER11} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} + {$DEFINE VER8P} + {$DEFINE VER9P} + {$DEFINE VER10P} + {$DEFINE VER11P} +{$ENDIF} + + +{$IFDEF VER125} { C++ Builder 4 } + {$DEFINE BCB} + {$DEFINE CB4} + {$DEFINE VER4} + + {$DEFINE VER34} + {$DEFINE VER4P} + {$ObjExportAll On} +{$ENDIF} + +{$IFDEF VER130} { C++ Builder 5 } +{$IFDEF BCB} + {$DEFINE CB5} + {$DEFINE VER5} + + {$DEFINE VER5P} + {$ObjExportAll On} +{$ENDIF} +{$ENDIF} + +{$IFDEF VER140} { C++ Builder 6 } +{$IFDEF BCB} + {$DEFINE CB6} + {$DEFINE VER6} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$ObjExportAll On} +{$ENDIF} +{$ENDIF} + +{$IFDEF INTERNAL} +{$IFDEF BCB} + {$DEFINE BDE_SHARED} // Use TUpdateAction from DBTables +{$ENDIF} +{$ENDIF} + +// old + +{$IFDEF VER100} { Delphi 3 } + {$DEFINE D3} + {$DEFINE D3_CB3} + {$DEFINE VER34} + {$DEFINE VER3+} +{$ENDIF} + +{$IFDEF VER110} { C++ Builder 3 } + {$DEFINE CB} + {$DEFINE CB3} + {$DEFINE D3_CB3} + {$DEFINE VER34} + {$DEFINE VER3+} + {$ObjExportAll On} +{$ENDIF} + +{$IFDEF VER7} + {$WARN UNSAFE_TYPE OFF} + {$WARN UNSAFE_CODE OFF} + {$WARN UNSAFE_CAST OFF} +{$ENDIF} + +{$IFDEF VER6P} + {$WARN SYMBOL_PLATFORM OFF} + {$WARN SYMBOL_DEPRECATED OFF} + {$WARN UNIT_PLATFORM OFF} + {$WARN UNIT_DEPRECATED OFF} +{$ENDIF} + +{$IFDEF VER6P} + {$WARN SYMBOL_PLATFORM OFF} + {$WARN SYMBOL_DEPRECATED OFF} + {$WARN UNIT_PLATFORM OFF} + {$WARN UNIT_DEPRECATED OFF} +{$ENDIF} diff --git a/internal/4.10.0.10/1/CRGrid/Source/CRGrid.pas b/internal/4.10.0.10/1/CRGrid/Source/CRGrid.pas new file mode 100644 index 0000000..35dfc35 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/CRGrid.pas @@ -0,0 +1,4171 @@ + +////////////////////////////////////////////////// +// CRControls +// Copyright (c) 2000-2006 Core Lab. All right reserved. +// CRGrid component +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I CRGrid.inc} + +unit CRGrid; + +{$ENDIF} + +interface + +uses +{$IFDEF VER6P} + Variants, +{$ENDIF} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Grids, DBGrids, DB, StdCtrls, Menus, DBAccess, ComCtrls; + +type + TCRDBGrid = class; + +{ TCRColumn } + + TSortOrder = (soNone, soAsc, soDesc); + TSummaryMode = (smNone, smSum, smAvr, smMax, smMin, smLabel); + + TOnMemoClick = procedure (Sender: TObject; Column: TColumn) of object; + + TCRColumnTitle = class(TColumnTitle) + private + function GetCaption: string; + function IsCaptionStored: boolean; + + protected + procedure SetCaption(const Value: string); + + published + property Caption: string read GetCaption write SetCaption stored IsCaptionStored; + end; + + TCRColumn = class (TColumn) + private + FMinWidth: integer; + FTotalString: string; + FTotalValue: Variant; + FTotalLoaded: boolean; + FSummaryMode: TSummaryMode; + FTotalFloat: extended; + FTotalInt: int64; + FFloatDigits: integer; + FFloatPrecision: integer; + FFloatFormat: TFloatFormat; + FFilterExpression: string; + FTableSpacePercent: double; + + function GetSortOrder: TSortOrder; + procedure SetSortOrder(Value: TSortOrder); + function GetSortSequence: integer; + procedure SetSortSequence(Value: integer); + function GetTotalString: string; + function GetTotalValue: Variant; + procedure SetSummaryMode(Value: TSummaryMode); + procedure SetFloatDigits(const Value: integer); + procedure SetFloatFormat(const Value: TFloatFormat); + procedure SetFloatPrecision(const Value: integer); + procedure SetFilterExpression(const Value: string); + procedure SetWidth(const Value: integer); + function GetWidth: integer; + procedure SetVisible(Value: Boolean); + function GetVisible: Boolean; + procedure ResetTotal; + procedure LoadTotal; + procedure SetTotal; + function CanBeSorted: boolean; + + protected + function CreateTitle: TColumnTitle; override; + procedure ChangedTitle(Rebild: boolean); + function GetFilterExpression(const RawFilter: string): string; + + public + constructor Create(Collection: TCollection); override; + procedure Assign(Source: TPersistent); override; + property TotalString: string read GetTotalString write FTotalString; + property TotalValue: Variant read GetTotalValue; + + published + property Width: integer read GetWidth write SetWidth; + property Visible: Boolean read GetVisible write SetVisible; + property FilterExpression: string read FFilterExpression write SetFilterExpression; + property MinWidth: integer read FMinWidth write FMinWidth default 0; + property SortOrder: TSortOrder read GetSortOrder write SetSortOrder default soNone; + property SortSequence: integer read GetSortSequence write SetSortSequence default 0; + property SummaryMode: TSummaryMode read FSummaryMode write SetSummaryMode default smNone; + property FloatFormat: TFloatFormat read FFloatFormat write SetFloatFormat default ffGeneral; + property FloatPrecision: integer read FFloatPrecision write SetFloatPrecision default 0; + property FloatDigits: integer read FFloatDigits write SetFloatDigits default 0; + + end; + + TCRDBGridColumns = class(TDBGridColumns) + private + function GetColumn(Index: Integer): TCRColumn; + procedure SetColumn(Index: Integer; Value: TCRColumn); + procedure ColumnAdded; + public + property Items[Index: Integer]: TCRColumn read GetColumn write SetColumn; default; + end; + +{ TGridTitleEdit } + + TCRGridTitleEdit = class(TCustomStaticText) + private + FCRDBGrid: TCRDBGrid; + FEdit: TEdit; + FAsFilter: boolean; + FActiveColumn: TColumn; + FFilterExpressions: array of string; + FEditingFilter: boolean; + + procedure SetCRDBGrid(const Value: TCRDBGrid); + procedure FEditKeyPress(Sender: TObject; var Key: char); + procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL; + procedure FEditKeyDown(Sender: TObject; var Key: word; + Shift: TShiftState); + procedure FEditChange(Sender: TObject); + procedure FEditExit(Sender: TObject); + procedure ProcessEdit; + procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; + procedure GotoUpperCell; + procedure GotoLowerCell; + procedure GotoNextCell; + procedure GotoPrevCell; + procedure SetEditingFilter(const Value: boolean); + procedure PostFilter; + + protected + procedure PaintWindow(DC: HDC); override; + procedure KeyDown(var Key: word; Shift: TShiftState); override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: integer); override; + procedure DoExit; override; + procedure WMChar(var Message: TWMChar); message WM_CHAR; + + public + constructor Create(AOwner: TComponent); override; + procedure SetFocus; override; + procedure ActivateAt(ARect: TRect; ActiveColumn: TColumn; AsFilter: boolean); + procedure SetClientRect(ARect: TRect); + procedure StartEdit; + procedure StopEdit(AcceptChanges: boolean); + + property CRDBGrid: TCRDBGrid read FCRDBGrid write SetCRDBGrid; + property Edit: TEdit read FEdit; + property EditingFilter: boolean read FEditingFilter write SetEditingFilter; + end; + +{ TMemoEditorForm } + + TMemoEditorForm = class (TCustomForm) + private + FMemo: TMemo; + FOKBtn: TButton; + FCancelBtn: TButton; + FReadOnly: boolean; + FCheckBox: TCheckBox; + procedure SetReadOnly(const Value: boolean); + procedure MemoKeyDown(Sender: TObject; var Key: word; + Shift: TShiftState); + procedure CheckBoxClick(Sender: tobject); + public + constructor Create(AOwner: TComponent); override; + function CloseQuery: boolean; override; + property ReadOnly: boolean read FReadOnly write SetReadOnly; + end; + +{ TCRDBGrid } + + TCRDBGridOptionEx = (dgeEnableSort, dgeFilterBar, dgeLocalFilter, {$IFNDEF DAC450}dgeLocalSorting, {$ENDIF}dgeRecordCount, + dgeSearchBar, dgeStretch, dgeSummary); + TCRDBGridOptionsEx = set of TCRDBGridOptionEx; + + TGridDrawStateEx = set of (geHighlight, geActiveRow, geMultiSelected); + + TGetCellParamsEvent = procedure (Sender: TObject; Field: TField; + AFont: TFont; var Background: TColor; State: TGridDrawState; StateEx: TGridDrawStateEx) of object; + + TSortColInfo = class + public + Index: integer; + Desc: boolean; + end; + + TIndicatorColButton = (icbNone, icbMenu, icbFilter, icbSearch); + +{$IFDEF VER6P} + TCRGridDataLink = class(TGridDataLink) + protected + FDataSetChanging: boolean; + + procedure DataSetChanged; override; + end; +{$ENDIF} + + TCRDBGrid = class(TCustomDBGrid) + private + FDefaultDrawing: boolean; + FOptionsEx: TCRDBGridOptionsEx; + FSoft: boolean; + FOnGetCellParams: TGetCellParamsEvent; + FExecSorting: boolean; + FExecColAjust: boolean; + FSortInfo: TList; + FActiveRowSelected: boolean; + FTitleButtonDown: integer; + FTitleBarUp: boolean; + FOldTitleButtonDown: integer; + FCellButtonDown: integer; + FCellButtonRow: integer; + FCellButtonCol: integer; + FCellButtonPressed: boolean; + FCellButtonRect: TRect; + FCellButtonBRect: TRect; + FTotalYOffset: integer; + FOnMemoClick: TOnMemoClick; + FLevelDelimiterChar: char; + FIndicatorColBtnDown: TIndicatorColButton; + FOldIndicatorColBtnDown: TIndicatorColButton; + FOptionsMenu: TPopupMenu; + FOptionsMenuDef: TPopupMenu; + CRGridTitleEdit: TCRGridTitleEdit; + FStatusRect: TRect; + FFiltered: boolean; + FContinueEditingFilter: boolean; + FMemoWidth: integer; + FMemoHeight: integer; + FMemoWordWrap: boolean; + + procedure SetOptionsEx(Value: TCRDBGridOptionsEx); + procedure UpdateHeaderHeight; + procedure RecordChanged(Field: TField); + procedure DrawButton(X,Y: integer; State: boolean); + function IsOnButton(X, Y: integer): boolean; + function GetButtonRect(Cell: TGridCoord): TRect; + procedure SetLevelDelimiterchar(const Value: char); + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SetCursor; + function CalcSearchBar(Column: TColumn): TRect; + function CalcFilterBar(Column: TColumn): TRect; + function MouseInFilterBar(X, Y: integer; Column: TColumn = nil): boolean; + function MouseInFilterEdit(X, Y: integer; Column: TColumn = nil): boolean; + function MouseInSortBar(X, Y: integer; Column: TColumn = nil): boolean; + function MouseInSortEdit(X,Y: integer;Column: TColumn = nil): boolean; + function MouseInLowerstLevel(X, Y: integer; Column: TColumn = nil): boolean; + procedure DoOnMemoClick(Column: TColumn); + + procedure DrawTitleBarCell(Canvas: TCanvas; Column: TColumn; Rect: TRect; Text: string); + procedure DrawTitleIndicatorCell(Canvas: TCanvas; ARect: TRect); + function GetIndicatorButton(X,Y: integer): TIndicatorColButton; + procedure IndicatorClick(Button: TIndicatorColButton; X, Y: integer); + procedure BuildMenu; + procedure FilteredItemClick(Sender: TObject); + procedure FilterItemClick(Sender: TObject); + procedure SearchItemClick(Sender: TObject); + procedure CalcTableSpacePercent; + procedure SetFiltered(const Value: boolean); + procedure UpdateRowCount; + function GetColumns: TCRDBGridColumns; + procedure SetColumns(const Value: TCRDBGridColumns); + + protected + FHeaderHeight: integer; + FExecSizing: boolean; + + function GetClientRect: TRect; override; + procedure Loaded; override; + function CreateColumns: TDBGridColumns; override; + {$IFDEF VER6P} + function CreateDataLink: TGridDataLink; override; + {$ENDIF} + + procedure Reorder; + function FindSortColInfo(Index: integer; var SortNum: integer): TSortColInfo; + + procedure ColWidthsChanged; override; + procedure Resize; override; + procedure ResizeColumns(ResizedColumn: integer = -1); + function EndColumnDrag(var Origin, Destination: integer; + const MousePt: TPoint): boolean; override; + + procedure DrawColumnCell(const Rect: TRect; DataCol: integer; + Column: TColumn; State: TGridDrawState); override; + procedure GetCellProps(Field: TField; AFont: TFont; var Background: TColor; + State: TGridDrawState; StateEx:TGridDrawStateEx); dynamic; + procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override; + + procedure KeyDown(var Key: word; Shift: TShiftState); override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: integer); override; + + procedure LinkActive(Value: boolean); override; + procedure Paint;override; + procedure ResetTotals; + procedure LoadTotals; + function CanEditShow: boolean; override; + procedure TopLeftChanged; override; + procedure DoExit; override; + procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL; + procedure TitleClick(Column: TColumn); override; + + procedure MoveColRow(ACol, ARow: Longint; MoveAnchor, Show: Boolean); + function DataToRawColumn(ACol: Integer): Integer; + procedure InvalidateCol(ACol: Longint); + procedure InvalidateRow(ARow: Longint); + + procedure LayoutChanged; override; + + property DefaultRowHeight; + property DataLink; + public + function GetGridSize: integer; + constructor Create(Owner: TComponent); override; + procedure DataChanged; //override; + destructor Destroy; override; + + procedure ClearSorting; + procedure ClearFilters; + procedure ActivateFilterEdit(Column: TColumn); + procedure ActivateSearchEdit(Column: TColumn); + + property Canvas; + property SelectedRows; + procedure CalcTitleLevel(Level: integer; var aRect: TRect); + function GetTitleLevel(Level: integer): TRect; + procedure ApplyFilter; + procedure AdjustColumns; + property Col; + property Row; + property TopRow; + property LeftCol; + property OptionsMenu: TPopupMenu read FOptionsMenu write FOptionsMenu; + + published + property DefaultDrawing: boolean read FDefaultDrawing write FDefaultDrawing + default True; + property LevelDelimiterChar: char read FLevelDelimiterchar write SetLevelDelimiterchar default '|'; + property Filtered: boolean read FFiltered write SetFiltered default True; + property OptionsEx: TCRDBGridOptionsEx read FOptionsEx write SetOptionsEx + default [dgeEnableSort, dgeLocalFilter, {$IFNDEF DAC450}dgeLocalSorting, {$ENDIF}dgeRecordCount]; + property OnMemoClick: TOnMemoClick read FOnMemoClick write FOnMemoClick; + property OnGetCellParams: TGetCellParamsEvent read FOnGetCellParams + write FOnGetCellParams; + + property Align; + property Anchors; + property BiDiMode; + property BorderStyle; + property Color; + property Columns: TCRDBGridColumns read GetColumns write SetColumns stored False; + property Constraints; + property Ctl3D; + property DataSource; + property DragCursor; + property DragMode; + property Enabled; + property FixedColor; + property Font; + property ImeMode; + property ImeName; + property Options; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ReadOnly; + property ShowHint; + property TabOrder; + property TabStop; + property TitleFont; + property Visible; + property OnCellClick; + property OnColEnter; + property OnColExit; + property OnColumnMoved; + property OnDrawDataCell; { obsolete } + property OnDrawColumnCell; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEditButtonClick; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + property OnTitleClick; + end; + +resourcestring + SFiltered = 'Filtered'; + SFilterBar = 'Filter bar'; + SSearchBar = 'Search bar'; + sWordWrap = 'Word Wrap'; + SOK = '&OK'; + SCancel = '&Cancel'; + SClose = '&Close'; + fmtModifiedWarning = 'Field "%s" is modified. Save?'; + +implementation + +uses + Math, CRParser, MemDS +{$IFDEF CLR} + ,MemUtils ,System.Threading, Types, WinUtils +{$ENDIF} + ; + +{$R CRGrid.res} + +var + bmpSortAsc: TBitmap; + bmpSortDesc: TBitmap; + DrawBitmap: TBitmap; + bmpFilter: TBitmap; + bmpSearch: TBitmap; + bmpMenu: TBitmap; + bmpActiveFilter: TBitmap; + bmpEditMode: TBitmap; + UserCount: integer; + +type + TInthernalEdit = class(TEdit) + end; + +{$IFNDEF CLR} + _TCustomGrid = class(TCustomGrid) + end; +{$ENDIF} + +function GetCaptionDepth(const Str: string; Delim: char): integer; +var + i: integer; + St: string; +begin + Result := 0; + if Str = '' then + Exit; + Result := 1; + i := Pos(Delim, Str); + St := Str; + while i > 0 do begin + Inc(Result); + St[i] := #255; + i := Pos(Delim, St); + end; +end; + +function GetCaptionLevel(const Str: string; Level: integer; Delim: char): string; +var + i,j: integer; + St: string; +begin + j := 0; + Result := ''; + if Str = '' then + Exit; + i := Pos(Delim, Str); + St := Str; + while (Level > 0) and (I > 0) do begin + Dec(Level); + St[i] := #255; + if Level <= -2 then begin + Result := Copy(St, j + 1, i - 1); + exit; + end; + j := i; + i := Pos(Delim, St); + end; + if Level <= 0 then begin + if i = 0 then + i := Length(St) + j + else + Dec(i); + Result := Copy(Str, j + 1, i - j); + exit; + end; +end; + +{ TCRColumn } + +function TCRColumn.GetSortOrder: TSortOrder; +var + SortColInfo: TSortColInfo; + NumSort: integer; +begin + if not CanBeSorted then begin + Result := soNone; + exit; + end; + SortColInfo := TCRDBGrid(Grid).FindSortColInfo(Index, NumSort); + + if SortColInfo <> nil then + if SortColInfo.Desc then + Result := soDesc + else + Result := soAsc + else + Result := soNone; +end; + +procedure TCRColumn.SetSortOrder(Value: TSortOrder); +var + SortColInfo: TSortColInfo; + NumSort: integer; +begin + if not CanBeSorted then + Exit; + + SortColInfo := TCRDBGrid(Grid).FindSortColInfo(Index, NumSort); + if SortColInfo <> nil then begin + case Value of + soNone: begin + if NumSort > 0 then + Dec(NumSort); + TSortColInfo(TCRDBGrid(Grid).FSortInfo[NumSort]).Free; + TCRDBGrid(Grid).FSortInfo.Delete(NumSort) + end; + soAsc: + SortColInfo.Desc := False; + soDesc: + SortColInfo.Desc := True; + end; + TCRDBGrid(Grid).Reorder; + end + else + if Value <> soNone then begin + SortColInfo := TSortColInfo.Create; + SortColInfo.Index := Index; + SortColInfo.Desc := Value = soDesc; + TCRDBGrid(Grid).FSortInfo.Add(SortColInfo); + TCRDBGrid(Grid).Reorder; + end; +end; + +function TCRColumn.GetSortSequence: integer; +begin + TCRDBGrid(Grid).FindSortColInfo(Index, Result); +end; + +procedure TCRColumn.SetFilterExpression(const Value: string); +begin + FFilterExpression := Value; +end; + +procedure TCRColumn.SetSortSequence(Value: integer); +begin +end; + +function TCRColumn.GetTotalString: string; +begin + if Assigned(Field) and (Field.DataSet.Active) then + if (FSummaryMode = smNone) then + Result := '' + else begin + if not FTotalLoaded then + LoadTotal; + Result := FTotalString + end + else + Result := ''; +end; + +function TCRColumn.GetTotalValue: Variant; +begin + Result := Unassigned; + if Assigned(Field) and (Field.DataSet.Active) then + if (SummaryMode = smLabel) then + Result := FTotalString + else + if (FSummaryMode = smNone) then + Result := Unassigned + else begin + if not FTotalLoaded then + LoadTotal; + Result := FTotalValue + end + else + Result := Unassigned; +end; + +procedure TCRColumn.ResetTotal; +begin + FTotalLoaded := False; +end; + +procedure TCRColumn.LoadTotal; +begin + if (SummaryMode <> smLabel) and Assigned (Field) then begin + TCRDBGrid(Grid).LoadTotals; + if Assigned (Field) then + case Field.DataType of + ftSmallint, ftInteger, ftWord, ftLargeint: + if SummaryMode = smAvr then + begin + FTotalValue := FTotalFloat; + FTotalString := FloatToStrF(FTotalFloat, FFloatFormat, FFloatPrecision, FFloatDigits) + end + else + begin + FTotalValue := {$IFNDEF VER6P}Integer({$ENDIF}FTotalInt{$IFNDEF VER6P}){$ENDIF}; + FTotalString := IntToStr(FTotalInt); + end; + ftFloat, ftCurrency: + begin + FTotalValue := FTotalFloat; + FTotalString := FloatToStrF(FTotalFloat, FFloatFormat, FFloatPrecision, FFloatDigits); + end; + else + begin + FTotalValue := Unassigned; + FTotalString := ''; + end; + end + end; +end; + +procedure TCRColumn.SetSummaryMode(Value: TSummaryMode); +begin + if Value <> smNone then + if (Value <> smLabel) and Assigned(Field) then + if not (Field.DataType in [ftSmallint, ftInteger, ftWord, ftLargeint, ftFloat, ftCurrency]) then + Value := smNone; + if FSummaryMode <> Value then begin + FSummaryMode := Value; + ResetTotal; + if Assigned(Grid) then + Grid.Invalidate; + end; +end; + +procedure TCRColumn.SetTotal; +begin + FTotalLoaded := True; + if (SummaryMode <> smLabel) and Assigned (Field) then + case Field.DataType of + ftSmallint, ftInteger, ftWord, ftLargeint: + if SummaryMode = smAvr then + begin + FTotalValue := FTotalFloat; + FTotalString := FloatToStrF(FTotalFloat, FFloatFormat, FFloatPrecision, FFloatDigits) + end + else + begin + FTotalValue := {$IFNDEF VER6P}Integer({$ENDIF}FTotalInt{$IFNDEF VER6P}){$ENDIF}; + FTotalString := IntToStr(FTotalInt); + end; + ftFloat, ftCurrency: + begin + FTotalValue := FTotalFloat; + FTotalString := FloatToStrF(FTotalFloat, FFloatFormat, FFloatPrecision, FFloatDigits); + end; + else + begin + FTotalValue := Unassigned; + FTotalString := ''; + end; + end +end; + +procedure TCRColumn.SetFloatDigits(const Value: integer); +begin + FFloatDigits := Value; + if (SummaryMode <> smLabel) and Assigned (Field) then begin + case Field.DataType of + ftSmallint, ftInteger, ftWord, ftLargeint: + if SummaryMode = smAvr then + FTotalString := FloatToStrF(FTotalFloat,FFloatFormat,FFloatPrecision,FFloatDigits); + ftFloat, ftCurrency: + FTotalString := FloatToStrF(FTotalFloat,FFloatFormat,FFloatPrecision,FFloatDigits); + end; + if Assigned(Grid)then + Grid.Invalidate; + end; +end; + +procedure TCRColumn.SetFloatFormat(const Value: TFloatFormat); +begin + FFloatFormat := Value; + if (SummaryMode <> smLabel) and Assigned(Field) then begin + case Field.DataType of + ftSmallint, ftInteger, ftWord, ftLargeint: + if SummaryMode = smAvr then + FTotalString := FloatToStrF(FTotalFloat, FFloatFormat, FFloatPrecision, FFloatDigits); + ftFloat, ftCurrency: + FTotalString := FloatToStrF(FTotalFloat, FFloatFormat, FFloatPrecision, FFloatDigits); + end; + if Assigned(Grid) then + Grid.Invalidate; + end; +end; + +procedure TCRColumn.SetFloatPrecision(const Value: integer); +begin + FFloatPrecision := Value; + if (SummaryMode <> smLabel) and Assigned(Field) then begin + case Field.DataType of + ftSmallint, ftInteger, ftWord, ftLargeint: + if SummaryMode = smAvr then + FTotalString := FloatToStrF(FTotalFloat, FFloatFormat, FFloatPrecision, FFloatDigits); + ftFloat, ftCurrency: + FTotalString := FloatToStrF(FTotalFloat, FFloatFormat, FFloatPrecision, FFloatDigits); + end; + if Assigned(Grid) then + Grid.Invalidate; + end; +end; + +procedure TCRColumn.Assign(Source: TPersistent); +begin + if Source is TCRColumn then begin + if Assigned(Collection) then + Collection.BeginUpdate; + inherited Assign(Source); + try + FSummaryMode := TCRColumn(Source).FSummaryMode; + FMinWidth := TCRColumn(Source).FMinWidth; + FTotalString := TCRColumn(Source).FTotalString; + FTotalValue := TCRColumn(Source).FTotalValue; + FTotalLoaded := TCRColumn(Source).FTotalLoaded; + FSummaryMode := TCRColumn(Source).FSummaryMode; + FTotalFloat := TCRColumn(Source).FTotalFloat; + FTotalInt := TCRColumn(Source).FTotalInt; + FFloatDigits := TCRColumn(Source).FFloatDigits; + FFloatPrecision := TCRColumn(Source).FFloatPrecision; + FFloatFormat := TCRColumn(Source).FFloatFormat; + finally + if Assigned(Collection) then + Collection.EndUpdate; + end; + end + else + inherited Assign(Source); +end; + +function TCRColumn.CanBeSorted: boolean; +begin + if Assigned(Field) then + Result := {$IFNDEF DAC600} (Field.FieldKind = fkData) and {$ENDIF} not (Field.DataType in [ftFmtMemo, + ftMemo{$IFNDEF VER4}, ftOraClob {$ENDIF}]) + else + Result := False; +end; + +function TCRColumn.GetFilterExpression(const RawFilter: string): string; + + function GetSignString(var ConstStr: string): string; + var + Buf: string; + begin + Result := ''; + ConstStr := ''; + Buf := Trim(RawFilter); + if Buf = '' then + Exit; + + case Buf[1] of + '=': begin + Result := '='; + ConstStr := Copy(Buf, 2, Length(Buf) - 1); + end; + '<', '>': begin + if (Length(Buf) >= 2) and ((Buf[2] = '=') or (Buf[2] = '>')) then begin + Result := Copy(Buf, 1, 2); + ConstStr := Copy(Buf, 3, Length(Buf) - 2); + end + else begin + Result := Buf[1]; + ConstStr := Copy(Buf, 2, Length(Buf) - 1); + end; + end; + else + begin + Result := '='; + ConstStr := Copy(Buf, 1, Length(Buf)); + end; + end; + ConstStr := TrimLeft(ConstStr); + end; + +var + Sign, ConstStr: string; + s: string; + i: integer; +begin + Result := ''; + if RawFilter = '' then + Exit; + if Assigned (Field) then begin + Sign := GetSignString(ConstStr); + if (Sign = '') or (ConstStr = '') then + Exit; + case Field.DataType of + ftSmallint, ftInteger, ftWord, ftLargeint: + StrToInt(ConstStr); // test for exception + ftFloat, ftCurrency: + StrToFloat(ConstStr); // test for exception + ftDate: begin + StrToDate(ConstStr); // test for exception + ConstStr := '''' + ConstStr + ''''; + end; + ftDateTime: begin + StrToDateTime(ConstStr); // test for exception + ConstStr := '''' + ConstStr + ''''; + end; + ftTime: begin + StrToTime(ConstStr); // test for exception + ConstStr := '''' + ConstStr + ''''; + end; + ftString,ftWideString: begin + if not (dgeLocalFilter in TCRDBGrid(Grid).OptionsEx) + and ((Sign = '=') or (Sign = '<>')) then begin + for i := 1 to Length(ConstStr) do + if ConstStr[i] = '*' then + ConstStr[i] := '%'; + if Sign = '=' then + Sign := ' LIKE ' + else + Sign := ' NOT LIKE '; + end; + if (Field.DataSet is TCustomDADataSet) and (TCustomDADataSet(Field.DataSet).Options.QuoteNames) then + Result := TDBAccessUtils.QuoteName(TCustomDADataSet(Field.DataSet), Field.FieldName) + Sign + + AnsiQuotedStr(ConstStr,'''') + else + Result := Field.FieldName + Sign + AnsiQuotedStr(ConstStr,''''); + Exit; + end; + ftBoolean: begin /// (cr12227) + if (TBooleanField(Field).DisplayValues <> '') and (pos(';', TBooleanField(Field).DisplayValues) > 0) then begin + s := copy(TBooleanField(Field).DisplayValues, 0, pos(';', TBooleanField(Field).DisplayValues) - 1); + if AnsiUpperCase(ConstStr) = AnsiUpperCase(s) then begin + result := Field.FieldName + Sign + 'True'; + Exit; + end + else begin + s := copy(TBooleanField(Field).DisplayValues, pos(';', TBooleanField(Field).DisplayValues) + 1, length(TBooleanField(Field).DisplayValues)); + if AnsiUpperCase(ConstStr) = AnsiUpperCase(s) then begin + result := Field.FieldName + Sign + 'False'; + Exit; + end; + end; + end; + end; + end; + end; + Result := Field.FieldName + Sign + ConstStr; +end; + +procedure TCRColumn.ChangedTitle(Rebild: boolean); +begin + if Rebild then + if Assigned(Grid) then + TCRDBGrid(Grid).LayoutChanged; +end; + +function TCRColumn.CreateTitle: TColumnTitle; +begin + Result := TCRColumnTitle.Create(Self); +end; + +constructor TCRColumn.Create(Collection: TCollection); +begin + inherited; + FMinWidth := 0; + TCRDBGridColumns(Collection).ColumnAdded; +end; + +procedure TCRColumn.SetWidth(const Value: integer); +begin + if Value > FMinWidth then + inherited Width := Value + else + inherited Width := FMinWidth + //if assigned(grid) then + // FTableSpaceProcent := Width / TCRDBGrid(grid).GetGridSize; +end; + +function TCRColumn.GetWidth: integer; +begin + Result := inherited Width; +end; + +procedure TCRColumn.SetVisible(Value: Boolean); +var + OldVisible: boolean; +begin + OldVisible := inherited Visible; + + inherited Visible := Value; + + if (OldVisible <> Value) and Assigned(Grid) and + (dgeStretch in TCRDBGrid(Grid).OptionsEx) and (not TCRDBGrid(Grid).FExecSizing) then + begin + TCRDBGrid(Grid).FExecSizing := True; + TCRDBGrid(Grid).ResizeColumns; + TCRDBGrid(Grid).FExecSizing := False; + end; +end; + +function TCRColumn.GetVisible: Boolean; +begin + Result := inherited Visible; +end; + +{ TCRDBGridColumns } + +function TCRDBGridColumns.GetColumn(Index: Integer): TCRColumn; +begin + Result := TCRColumn(inherited Items[Index]); +end; + +procedure TCRDBGridColumns.SetColumn(Index: Integer; Value: TCRColumn); +begin + inherited Items[Index] := Value; +end; + +procedure TCRDBGridColumns.ColumnAdded; +begin + TCRDBGrid(Grid).CalcTableSpacePercent; +end; + +{ TCRDBGrid } + +procedure UsesBitmap; +begin + if UserCount = 0 then + DrawBitmap := TBitmap.Create; + Inc(UserCount); +end; + +procedure ReleaseBitmap; +begin + Dec(UserCount); + if UserCount = 0 then + DrawBitmap.Free; +end; + +constructor TCRDBGrid.Create(Owner: TComponent); +begin + inherited Create(Owner); + Columns.State := csDefault; + FSortInfo := TList.Create; + FOptionsMenuDef := TPopupMenu.Create(Self); + FFiltered := True; + UsesBitmap; + FOnMemoClick := nil; + FLevelDelimiterChar := '|'; + inherited DefaultDrawing := False; + FDefaultDrawing := True; + FSoft := False; + SetOptionsEx([dgeEnableSort, dgeLocalFilter, {$IFNDEF DAC450}dgeLocalSorting, {$ENDIF}dgeRecordCount]); + DefaultColWidth := 60; // DEBUG + + FExecSizing := False; + FTitleButtonDown := -1; + FOldTitleButtonDown := -1; + FIndicatorColBtnDown := icbNone; + FOldIndicatorColBtnDown := icbNone; + FCellButtonDown := -1; + CRGridTitleEdit := TCRGridTitleEdit.Create(Self); + InsertControl(CRGridTitleEdit); + BuildMenu; +end; + +procedure TCRDBGRid.ActivateSearchEdit(Column: TColumn); +var + CellRect: TRect; +begin + if not (Assigned(Column) and (dgeSearchBar in OptionsEx)) then + Exit; + CellRect := CalcSearchBar(Column); + InflateRect(CellRect, -5, -5); + if not (dgRowLines in Options) then + Dec(CellRect.Top); + CRGridTitleEdit.ActivateAt(CellRect, Column, False); +end; + +destructor TCRDBGrid.Destroy; +begin + ReleaseBitmap; + ClearSorting; + ClearFilters; + FSortInfo.Free; + FOptionsMenuDef.Free; + + inherited; +end; + +procedure TCRDBGrid.Loaded; +var + Stretched: Boolean; +begin + Stretched := False; + if dgeStretch in OptionsEx then begin + Stretched := True; + Exclude(FOptionsEx, dgeStretch); + end; + inherited; + if Stretched then Include(FOptionsEx, dgeStretch); + CalcTableSpacePercent; + FOptionsMenuDef.Items[0].Checked := FFiltered; + FOptionsMenuDef.Items[2].Checked := dgeFilterBar in OptionsEx; + FOptionsMenuDef.Items[3].Checked := dgeSearchBar in OptionsEx; + +end; + +function TCRDBGrid.CreateColumns: TDBGridColumns; +begin + Result := TCRDBGridColumns.Create(Self, TCRColumn); +end; + +{$IFDEF VER6P} +function TCRDBGrid.CreateDataLink: TGridDataLink; +begin + Result := TCRGridDataLink.Create(Self); +end; +{$ENDIF} + +procedure TCRDBGrid.Resize; +begin + inherited; + + CRGridTitleEdit.StopEdit(False); + if (dgeStretch in FOptionsEx) and not(csLoading in ComponentState) and + (not FExecSizing) then begin + FExecSizing := True; + try + ResizeColumns; + finally + FExecSizing := False; + end; + end; + if CRGridTitleEdit.Focused then begin + if CRGridTitleEdit.FAsFilter then + ActivateFilterEdit(CRGridTitleEdit.FActiveColumn) + else + ActivateSearchEdit(CRGridTitleEdit.FActiveColumn); + end; + Invalidate; +end; + +procedure TCRDBGrid.ColWidthsChanged; +var + i: integer; + ResizedColumn: integer; +begin + if (dgeStretch in FOptionsEx) and not(csLoading in ComponentState) and + (not FExecSizing) then begin + FExecSizing := True; + ResizedColumn := -1; + for i := 0 to Columns.Count - 1 do + if ColWidths[i + IndicatorOffset] <> Columns[i].Width then begin + ResizedColumn := i; + break; + end; + + if ResizedColumn <> -1 then begin + if ColWidths[ResizedColumn + IndicatorOffset] <= TCRColumn(Columns[ResizedColumn]).MinWidth then + ColWidths[ResizedColumn + IndicatorOffset] := TCRColumn(Columns[ResizedColumn]).MinWidth; + + ResizeColumns(ResizedColumn); + //ResizeColumns(-1); + end; + + FExecSizing := False; + end + else + if not (csLoading in ComponentState) and (not FExecSizing) then + CalcTableSpacePercent; + + inherited; +end; + +function TCRDBGrid.GetGridSize: integer; +begin + Result := ClientWidth - 1; + if dgIndicator in Options then + Dec(Result, IndicatorWidth); + if dgColLines in Options then + Dec(Result, Columns.Count*GridLineWidth); +end; + +procedure TCRDBGrid.ResizeColumns(ResizedColumn: integer); +const + MinWidth = 10; +var + i: integer; + GridSize, ColumnsSize:integer; + UnresizedSize: integer; + K: double; + Curr,Prev: double; + Width: integer; + MinimizeRest: boolean; + VisiblePercent: double; + //Sized : integer; + + function Max(i1,i2: integer): integer; + begin + if i1 > i2 then + Result := i1 + else + Result := i2 + end; + +begin + if Columns.Count = 0 then + Exit; + + GridSize := ClientWidth - 1; + if dgIndicator in Options then + Dec(GridSize, IndicatorWidth); + if dgColLines in Options then + for i := 0 to Columns.Count - 1 do + if TCRColumn(Columns[i]).Visible then + Dec(GridSize, GridLineWidth); + + if ResizedColumn > -1 then begin + ColumnsSize := 0; + UnresizedSize := 0; + MinimizeRest := False; + for i := 0 to Columns.Count - 1 do begin + if i <= ResizedColumn then begin + Inc(UnresizedSize, ColWidths[i + IndicatorOffset]); + if i = ResizedColumn then + if ColumnsSize + ColWidths[i + IndicatorOffset] + + (Columns.Count - i) * MinWidth > GridSize then begin + ColWidths[i + IndicatorOffset] := GridSize - ColumnsSize - + (Columns.Count - i - 1) * MinWidth; + MinimizeRest := True; + end + else + if i = Columns.Count - 1 then + ColWidths[i + IndicatorOffset] := GridSize - ColumnsSize; + end + else + if MinimizeRest {(ResizedColumn >= 0) and (ColumnsSize + (Columns.Count - i)*MinWidth >= GridSize)} then + ColWidths[i + IndicatorOffset] := MinWidth; + + Inc(ColumnsSize, ColWidths[i + IndicatorOffset]); + end; + + if ColumnsSize = UnresizedSize then + Exit; + + K := (GridSize - UnresizedSize) / (ColumnsSize - UnresizedSize); + + ColumnsSize := 0; + Prev := 0; + for i := 0 to Columns.Count - 1 do begin + if i <= ResizedColumn then + Curr := Prev + ColWidths[i + IndicatorOffset] + else + begin + Curr := Prev + ColWidths[i + IndicatorOffset]*K; + + if i < Columns.Count - 1 then + Width := Round(Curr - Prev) + else + Width := GridSize - ColumnsSize; + + if Width < TCRColumn(Columns[i]).MinWidth then + Width := TCRColumn(Columns[i]).MinWidth; + ColWidths[i + IndicatorOffset] := Width; + end; + Inc(ColumnsSize, ColWidths[i + IndicatorOffset]); + Prev := Curr; + end; + CalcTableSpacePercent; + end + else begin // for full resize + Inc(GridSize,2); + if (dgeStretch in FOptionsEx) then begin + VisiblePercent := 0; + for i := 0 to Columns.Count - 1 do + if TCRColumn(Columns[i]).Visible then + VisiblePercent := VisiblePercent + TCRColumn(Columns[i]).FTableSpacePercent; + if VisiblePercent < 0.0001 then + VisiblePercent := 1; + end + else + VisiblePercent := 1; + for i := 0 to Columns.Count - 1 do + ColWidths[i + IndicatorOffset] := Trunc(TCRColumn(Columns[i]).FTableSpacePercent * GridSize / VisiblePercent); + end; +end; + +{ Grid drawing } + +procedure TCRDBGrid.GetCellProps(Field: TField; AFont: TFont; + var Background: TColor; State: TGridDrawState; StateEx: TGridDrawStateEx); +begin + if Assigned(FOnGetCellParams) then + FOnGetCellParams(Self, Field, AFont, Background, State, StateEx); +end; + +procedure WriteText(ACanvas: TCanvas; ARect: TRect; DX, DY: integer; + const Text: string; Alignment: TAlignment; ARightToLeft: boolean); +const + AlignFlags : array [TAlignment] of integer = + ( DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX, + DT_RIGHT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX, + DT_CENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX ); + RTL: array [boolean] of integer = (0, DT_RTLREADING); +var + B, R: TRect; + Hold, Left: integer; + I: TColorRef; +begin + I := ColorToRGB(ACanvas.Brush.Color); + if GetNearestColor(ACanvas.Handle, I) = I then + begin { Use ExtTextOut for solid colors } + { In BiDi, because we changed the window origin, the text that does not + change alignment, actually gets its alignment changed. } + if (ACanvas.CanvasOrientation = coRightToLeft) and (not ARightToLeft) then + ChangeBiDiModeAlignment(Alignment); + case Alignment of + taLeftJustify: + Left := ARect.Left + DX; + taRightJustify: + Left := ARect.Right - ACanvas.TextWidth(Text) - 3; + else { taCenter } + Left := ARect.Left + (ARect.Right - ARect.Left) shr 1 + - (ACanvas.TextWidth(Text) shr 1); + end; + ACanvas.TextRect(ARect, Left, ARect.Top + DY, Text); + end + else begin { Use FillRect and Drawtext for dithered colors } + DrawBitmap.Canvas.Lock; + try + with DrawBitmap, ARect do { Use offscreen bitmap to eliminate flicker and } + begin { brush origin tics in painting / scrolling. } + Width := Max(Width, Right - Left); + Height := Max(Height, Bottom - Top); + R := Rect(DX, DY, Right - Left - 1, Bottom - Top - 1); + B := Rect(0, 0, Right - Left, Bottom - Top); + end; + with DrawBitmap.Canvas do + begin + Font := ACanvas.Font; + Font.Color := ACanvas.Font.Color; + Brush := ACanvas.Brush; + Brush.Style := bsSolid; + FillRect(B); + SetBkMode(Handle, TRANSPARENT); + if (ACanvas.CanvasOrientation = coRightToLeft) then + ChangeBiDiModeAlignment(Alignment); + DrawText(Handle, PChar(Text), Length(Text), R, + AlignFlags[Alignment] or RTL[ARightToLeft]); + end; + if (ACanvas.CanvasOrientation = coRightToLeft) then + begin + Hold := ARect.Left; + ARect.Left := ARect.Right; + ARect.Right := Hold; + end; + ACanvas.CopyRect(ARect, DrawBitmap.Canvas, B); + finally + DrawBitmap.Canvas.Unlock; + end; + end; +end; + +function TCRDBGrid.GetButtonRect(Cell: TGridCoord): TRect; +var + aCellRect: TRect; +begin + aCellRect := CellRect(Cell.X, Cell.Y); + if (aCellRect.Right - aCellRect.Left < aCellRect.Bottom - aCellRect.Top + 5) + then begin + Result := Rect(0,0,0,0); + exit; + end; + Result.Left := aCellRect.Right - (aCellRect.Bottom - aCellRect.Top)+1; + Result.Right := aCellRect.Right-1; + Result.Top := aCellRect.Top+1; + Result.Bottom := aCellRect.Bottom-1; +end; + +function TCRDBGrid.IsOnButton(X, Y: integer): boolean; +var + Cell: TGridCoord; + Column: TColumn; + aCellRect: TRect; + ButtonRect: TRect; +begin + Cell := MouseCoord(X,Y); + Column := Columns[RawToDataColumn(Cell.X)]; + // detecting - is there a button on cell? + if Assigned(Column.Field) then + Result := Column.Field.DataType in [ftMemo,ftFmtMemo + {$IFNDEF VER4}, ftOraClob {$ENDIF}] + else + Result := False; + aCellRect := CellRect(Cell.X, Cell.Y); + //Result := Result and (gdSelected in State); + if Result and (aCellRect.Right - aCellRect.Left < aCellRect.Bottom - aCellRect.Top + 5) then + Result := False; + if Result then begin // button present + ButtonRect := GetButtonRect(Cell); + Result := PtInRect(ButtonRect,Point(X,Y)) + end + else // there is no button on cell + Result := False; +end; + +procedure TCRDBGrid.DrawButton(X,Y: integer; State: boolean); +var + ButtonRect: TRect; + Cell: TGridCoord; + Hi, i, Diam: integer; + Flag: integer; +begin + Cell.X := X; Cell.Y := Y; + ButtonRect := GetButtonRect(Cell); + Canvas.Brush.Style := bsSolid; + Canvas.Brush.Color := clBtnFace; + Canvas.FillRect(ButtonRect); + Canvas.Pen.Color := clBlack; + Canvas.Pen.Style := psSolid; + Canvas.Brush.Color := clBlack; + + if State then + Flag := BDR_SUNKENINNER + else + Flag := BDR_RAISEDINNER; + + DrawEdge(Canvas.Handle, ButtonRect, Flag, BF_TOPLEFT ); + InflateRect(ButtonRect, -1, -1); + DrawEdge(Canvas.Handle, ButtonRect, Flag, BF_BOTTOMRIGHT); + InflateRect(ButtonRect, 1, 1); + Canvas.MoveTo(ButtonRect.Left, ButtonRect.Bottom - 1); + Canvas.LineTo(ButtonRect.Right - 1, ButtonRect.Bottom - 1); + Canvas.LineTo(ButtonRect.Right - 1, ButtonRect.Top - 1); + + Diam := (ButtonRect.Bottom - ButtonRect.Top) div 7; + Hi := (ButtonRect.Bottom - ButtonRect.Top - Diam) div 2; + inc(ButtonRect.Left,Diam * 2 - 1); + if State then begin + inc(ButtonRect.Left); + inc(ButtonRect.Top); + end; + for i := 0 to 2 do + Canvas.Ellipse(ButtonRect.Left + i * Diam * 2 ,ButtonRect.Top + Hi, ButtonRect.Left + i * Diam * 2 + Diam, ButtonRect.Top + Hi + Diam); +end; + +procedure TCRDBGrid.DrawColumnCell(const Rect: TRect; DataCol: integer; + Column: TColumn; State: TGridDrawState); +const + ThreeDot = '...'; +var + NewBackgrnd: TColor; + Field: TField; + Value: string; + TextWidth: integer; + ThreeDotWidth: integer; + Alignment: TAlignment; + ColWidth: integer; + StateEx: TGridDrawStateEx; + TextMargin: integer; + i: integer; + isDrawButton: boolean; + OldCanvasFont : TFont; + +begin + Field := Column.Field; + if Assigned(Column.Field) then begin + Value := Column.Field.DisplayText; + isDrawButton := Column.Field.DataType in [ftMemo, ftFmtMemo + {$IFNDEF VER4}, ftOraClob {$ENDIF}]; + end + else begin + Value := ''; + isDrawButton := False; + end; + + isDrawButton := isDrawButton and (gdSelected in State) + and not (dgRowSelect in Options); + if isDrawButton and (Rect.Right - Rect.Left < Rect.Bottom - Rect.Top + 5) then + isDrawButton := False; + Alignment := Column.Alignment; + + if Alignment = taRightJustify then + TextMargin:= 4 + else + TextMargin := 2; + + ThreeDotWidth := Canvas.TextWidth(ThreeDot); + TextWidth := Canvas.TextWidth(Value) + TextMargin; + + OldCanvasFont := TFont.Create; + OldCanvasFont.Assign(Canvas.Font); + try + ColWidth := Column.Width; // changes font and brush + Canvas.Font.Assign(OldCanvasFont); + finally + OldCanvasFont.Free; + end; + + if isDrawButton then begin + ColWidth := ColWidth - (Rect.Bottom - Rect.Top); + end; + if TextWidth > ColWidth then begin + if Field is TNumericField then begin + for i := 1 to Length(Value) do + if (Value[i] >= '0') and (Value[i] <= '9') then + Value[i] := '#'; + end + else begin + while (TextWidth > ColWidth) and (Length(Value) > 1) do begin + SetLength(Value, Length(Value) - 1); + TextWidth := Canvas.TextWidth(Value) + TextMargin + ThreeDotWidth; + end; + Value := Value + ThreeDot; + end; + Alignment := taLeftJustify; + end; + + if HighlightCell(Col, Row, Value, State) then begin + Include(StateEx, geHighlight); + if not FActiveRowSelected then + Include(StateEx, geMultiSelected); + end; + if FActiveRowSelected then + Include(StateEx, geActiveRow); + + if HighlightCell(Col, Row, Value, State) then begin + Canvas.Brush.Color := clHighlight; + Canvas.Font.Color := clHighlightText; + end; + + if Enabled then begin + NewBackgrnd := Canvas.Brush.Color; + + GetCellProps(Field, Canvas.Font, NewBackgrnd, State, StateEx); + Canvas.Brush.Color := NewBackgrnd; + end + else + Canvas.Font.Color := clGrayText; + + if FDefaultDrawing then + WriteText(Canvas, Rect, 2, 2, Value, Alignment, + UseRightToLeftAlignmentForField(Column.Field, Alignment)); + + if FDefaultDrawing and (gdSelected in State) + and ((dgAlwaysShowSelection in Options) or Focused) + and not (csDesigning in ComponentState) + and not (dgRowSelect in Options) + and (UpdateLock = 0) + and (ValidParentForm(Self).ActiveControl = Self) + then + Windows.DrawFocusRect(Canvas.Handle, Rect); + + inherited DrawColumnCell(Rect, DataCol, Column, State); + if isDrawButton then + if FCellButtonDown > -1 then + DrawButton(Col, Row, FCellButtonPressed) + else + DrawButton(COl, Row, False); +end; + +procedure TCRDBGrid.ClearSorting; +var + i: integer; +begin + for i := 0 to FSortInfo.Count - 1 do + TSortColInfo(FSortInfo[i]).Free; + FSortInfo.Clear; +end; + +procedure TCRDBGrid.ClearFilters; +var + i: integer; +begin + for i := 0 to Columns.Count - 1 do + TCRColumn(Columns[i]).FilterExpression := ''; +end; + +function TCRDBGrid.FindSortColInfo(Index: integer; var SortNum: integer): TSortColInfo; +var + i: integer; +begin + Result := nil; + SortNum := 0; + for i := 0 to FSortInfo.Count - 1 do + if TSortColInfo(FSortInfo[i]).Index = Index then begin + Result := TSortColInfo(FSortInfo[i]); + if FSortInfo.Count > 1 then + SortNum := i + 1; + break; + end; +end; + +function TCRDBGrid.GetTitleLevel(Level: integer): TRect; +begin + if Columns.Count = 0 then begin + Result := Rect(0, 0, 0, 0); + Exit; + end; + Result.Top := Level*(DefaultRowHeight + 1); + Result.Bottom := Result.Top + (DefaultRowHeight + 1); + Result.Left := 0; + Result.Right := 0; + if dgRowLines in Options then + dec(Result.Bottom); +end; + +procedure TCRDBGrid.CalcTitleLevel(Level: integer; var aRect: TRect); +var + X: TRect; +begin + if Columns.Count = 0 then begin + aRect.Top := 0; + aRect.Bottom:= 0; + Exit; + end; + X := GetTitleLevel(Level); + aRect.Top := X.Top; + aRect.Bottom := X.Bottom; +end; + +procedure TCRDBGrid.DrawCell(ACol,ARow: longint; ARect: TRect; AState: TGridDrawState); +var + FrameOffs: Byte; + + procedure DrawTitleCell(ACol, ARow: integer; Column: TColumn; var AState: TGridDrawState); + const + ScrollArrows: array [boolean, boolean] of integer = + ((DFCS_SCROLLRIGHT, DFCS_SCROLLLEFT), (DFCS_SCROLLLEFT, DFCS_SCROLLRIGHT)); + var + MasterCol: TColumn; + CellRect: TRect; + TitleRect, TextRect, ButtonRect: TRect; + LastTextRect,LastTitleRect: TRect; + i: integer; + InBiDiMode: boolean; + ArrowX, + ArrowY: integer; + SortColInfo: TSortColInfo; + OldBkMode: integer; + OldTextColor: TColor; + SortNum: integer; + Caption: string; + CaptionWidth: integer; + CharWidth: integer; + CurLevel: integer; + LevelHeight: integer; + CurCaption: string; + lvCheckLeft, + lvCheckRight, + lvShowCaption, + lvUpBorder, + lvDownBorder, + lvLeftBorder, + lvRightBorder, + lvCheckTextWidth : boolean; + TmpCaption: string; + lvTmpCol: TColumn; + lvTmpColIndex: integer; + lvCaptionXOffset: integer; + lvCaptionAligment : TAlignment; + CellFlag: cardinal; + CaptionDepth: integer; + PressOffset: integer; + begin + CellRect := CalcTitleRect(Column, ARow, MasterCol); + TitleRect := CellRect; + + if MasterCol = nil then begin + Canvas.FillRect(ARect); + Exit; + end; + // Prevent from drawing areas for SEARCH and FILTER Bars + if dgeFilterBar in OptionsEx then + dec(TitleRect.Bottom,DefaultRowHeight + 10); + if dgeSearchBar in OptionsEx then + dec(TitleRect.Bottom,DefaultRowHeight + 10); + + Canvas.Font := MasterCol.Title.Font; + Canvas.Brush.Color := MasterCol.Title.Color; + Canvas.FillRect(ARect); + TextRect := TitleRect; + + Caption := MasterCol.Title.Caption; + lvCheckLeft := True; + lvCheckRight := True; + lvShowCaption:= True; + lvLeftBorder := True; + lvRightBorder:= True; + if TCRColumnTitle(MasterCol.Title).IsCaptionStored then + CaptionDepth := GetCaptionDepth(Caption,FLevelDelimiterChar) + else + CaptionDepth := 1; + FrameOffs := 1; + if (Column.Index = FTitleButtonDown) and (dgRowLines in Options) then + PressOffset := 1 + else + PressOffset := 0; + for CurLevel := 0 to FHeaderHeight - 1 do begin + // Check dependencies + if TCRColumnTitle(MasterCol.Title).IsCaptionStored then + CurCaption := GetCaptionLevel(Caption,CurLevel,FLevelDelimiterChar) + else + if CurLevel = 0 then + CurCaption := Caption + else + CurCaption := ''; + lvDownBorder := (FHeaderHeight - 1 = CurLevel) or (GetCaptionLevel(Caption,CurLevel+1,FLevelDelimiterChar)<>''); + lvUpBorder := (CurCaption <> ''); + lvCaptionXOffset := 0; + if CurCaption <> '' then begin + if lvCheckLeft then begin + lvLeftBorder := True; + lvShowCaption:= True; + if (Column.Index = 0) or (CurLevel = (CaptionDepth-1)) then + lvCheckLeft := False + else begin + lvTmpColIndex := Column.Index-1; + while lvTmpColIndex >= 0 do begin + lvTmpCol := TColumn(MasterCol.Collection.Items[lvTmpColIndex]); + tmpCaption := GetCaptionLevel(lvTmpCol.Title.Caption,CurLevel,FLevelDelimiterChar); + if UpperCase(tmpCaption) <> UpperCase(CurCaption) then begin + if lvTmpColIndex = Column.Index - 1 then + lvCheckLeft := False; + break; + end + else begin + lvShowCaption := False; + lvLeftBorder := False; + inc(lvCaptionXOffset, lvTmpCol.Width); + if dgColLines in Options then + inc(lvCaptionXOffset); + dec(lvTmpColIndex) + end; + end; + end; + end; + if lvCheckRight then begin + lvRightBorder := True; + if (Column.Index = MasterCol.Collection.Count - 1) or (CurLevel = (CaptionDepth-1)) then + lvCheckRight := False + else begin + lvTmpColIndex := Column.Index+1; + lvTmpCol := TColumn(MasterCol.Collection.Items[lvTmpColIndex]); + tmpCaption := GetCaptionLevel(lvTmpCol.Title.Caption,CurLevel,FLevelDelimiterChar); + if UpperCase(tmpCaption) <> UpperCase(CurCaption) then + lvCheckRight := False + else + lvRightBorder := False; + end; + end; + end; + + //Check if we need to control caption width + if Column.Index = MasterCol.Collection.Count - 1 then + lvCheckTextWidth := True + else begin + lvTmpColIndex := Column.Index+1; + lvTmpCol := TColumn(MasterCol.Collection.Items[lvTmpColIndex]); + tmpCaption := GetCaptionLevel(lvTmpCol.Title.Caption,CurLevel,FLevelDelimiterChar); + if UpperCase(tmpCaption) <> UpperCase(CurCaption) then + lvCheckTextWidth := True + else + lvCheckTextWidth := False; + end; + + // draw text for level + TitleRect := CellRect; + CalcTitleLevel(CurLevel,TitleRect); + TextRect := TitleRect; + InflateRect(TextRect,-1,-1); + + if not lvRightBorder then begin + inc(TextRect.Right); + if (dgColLines in Options) then + inc(TextRect.Right); + end; + + if CurLevel <> (CaptionDepth-1) then begin + Canvas.Font := Self.TitleFont; + Canvas.Brush.Color := Self.FixedColor; + lvCaptionAligment := taLeftJustify; + end + else begin + Canvas.Font := MasterCol.Title.Font; + Canvas.Brush.Color := MasterCol.Title.Color; + lvCaptionAligment := MasterCol.Title.Alignment; + end; + Canvas.FillRect(TextRect); + + if lvShowCaption then begin + CaptionWidth := Canvas.TextWidth(CurCaption); + if lvCheckTextWidth and (CaptionWidth > TextRect.Right - TextRect.Left) then begin + while (CaptionWidth > TextRect.Right - TextRect.Left) and (Length(CurCaption) > 1) do begin + SetLength(CurCaption, Length(CurCaption) - 1); + CaptionWidth := Canvas.TextWidth(CurCaption) + Canvas.TextWidth('...'); + end; + CurCaption := CurCaption + '...'; + end; + WriteText(Canvas, TextRect, FrameOffs + PressOffset, + FrameOffs + PressOffset, CurCaption, lvCaptionAligment, IsRightToLeft); + end + else + if CurCaption = '' then + WriteText(Canvas, TextRect, FrameOffs, FrameOffs, '', lvCaptionAligment, + IsRightToLeft) + else begin // mean there is coninue of previous column + if dgColLines in Options then begin + dec(TextRect.Left,1); + dec(lvCaptionXOffset,1); + end; + CaptionWidth := Canvas.TextWidth(CurCaption) - lvCaptionXOffset; + if lvCheckTextWidth and (CaptionWidth > TextRect.Right - TextRect.Left) then begin + while (CaptionWidth > TextRect.Right - TextRect.Left) and (Length(CurCaption) > 1) do begin + SetLength(CurCaption, Length(CurCaption) - 1); + CaptionWidth := Canvas.TextWidth(CurCaption) + Canvas.TextWidth('...') - lvCaptionXOffset; + end; + CurCaption := CurCaption + '...'; + end; + WriteText(Canvas, TextRect, FrameOffs - lvCaptionXOffset, FrameOffs, CurCaption, lvCaptionAligment, + IsRightToLeft); + end; + // draw borders for level + CellFlag := BDR_RAISEDINNER; + if (FTitleButtonDown = Column.Index)and(CurLevel >= CaptionDepth-1) then + CellFlag := BDR_SUNKENINNER; + if not lvDownBorder then begin + Inc(TitleRect.Bottom,1); + Canvas.Pen.Color := clBtnFace; + Canvas.MoveTo(TitleRect.Left,TitleRect.Bottom - 2); + Canvas.LineTo(TitleRect.Right + 1, TitleRect.Bottom - 2); + if dgRowLines in Options then begin + Canvas.MoveTo(TitleRect.Left, TitleRect.Bottom - 1); + Canvas.LineTo(TitleRect.Right + 1, TitleRect.Bottom - 1); + end; + end; + if not lvUpBorder then begin + Canvas.Pen.Color := clBtnFace; + Canvas.MoveTo(TitleRect.Left, TitleRect.Top); + Canvas.LineTo(TitleRect.Right + 1, TitleRect.Top); + end; + if lvRightBorder then begin + if (dgRowLines in Options) and (dgColLines in Options) then + DrawEdge(Canvas.Handle, TitleRect, CellFlag, BF_RIGHT); + end + else + Inc(TitleRect.Right,1); + if dgColLines in Options then begin + Canvas.Pen.Color := clBlack; + Canvas.MoveTo(TitleRect.Right, TitleRect.Top); + Canvas.LineTo(TitleRect.Right, TitleRect.Bottom + 1); + end; + if lvDownBorder and ((dgRowLines in Options) and (dgColLines in Options)) then begin +// if not(dgRowlines in Options) then +// Inc(TitleRect.Bottom); + DrawEdge(Canvas.Handle, TitleRect, CellFlag, BF_BOTTOM); + end; + if dgRowLines in Options then begin + Canvas.Pen.Color := clBlack; + Canvas.MoveTo(TitleRect.Left,TitleRect.Bottom); + Canvas.LineTo(TitleRect.Right + 1,TitleRect.Bottom); + end; + if lvUpBorder and ((dgRowLines in Options) and (dgColLines in Options)) then + DrawEdge(Canvas.Handle, TitleRect, CellFlag, BF_TOP); + + if lvLeftBorder and ((dgRowLines in Options) and (dgColLines in Options)) then + DrawEdge(Canvas.Handle, TitleRect, CellFlag, BF_LEFT); + end; + + // Draw sort indicators + SortColInfo := FindSortColInfo(MasterCol.Index, SortNum); + if (SortColInfo <> nil) then begin + i := SaveDC(Canvas.Handle); + try + if SortNum = 0 then + case Column.Title.Alignment of + taRightJustify: ArrowX := TextRect.Left + 2; + else + ArrowX := TextRect.Right - 12; + end + else begin + Canvas.Font := TitleFont; + CharWidth := Canvas.TextWidth('0'); + ArrowX := TextRect.Right - 12 - CharWidth - 2; + end; + CaptionWidth := GetCaptionDepth(Caption, FLevelDelimiterChar); + CalcTitleLevel(CaptionWidth - 1, TextRect); + ArrowY := TextRect.Top + ((TextRect.Bottom - TextRect.Top - bmpSortAsc.Height) div 2); + CurCaption := GetCaptionLevel(Caption, CaptionWidth - 1, FLevelDelimiterChar); + CaptionWidth := Canvas.TextWidth(CurCaption); + + case Column.Title.Alignment of + taLeftJustify: begin + if TextRect.Left + CaptionWidth + 20 < ArrowX then + ArrowX := TextRect.Left + CaptionWidth + 20; + + if TextRect.Left + CaptionWidth + 4 > ArrowX then begin + ArrowX := TextRect.Left + CaptionWidth + 4; + IntersectClipRect(Canvas.Handle, TextRect.Left, + TextRect.Top, TextRect.Right - 1, TextRect.Bottom); + end; + end; + taRightJustify: begin + if TextRect.Right - CaptionWidth - 20 > ArrowX + 10 then + ArrowX := TextRect.Right - CaptionWidth - 30; + + if TextRect.Right - CaptionWidth - 4 < ArrowX + 10 then begin + ArrowX := TextRect.Right - CaptionWidth - 14; + IntersectClipRect(Canvas.Handle, TextRect.Left, + TextRect.Top, TextRect.Right - 1, TextRect.Bottom); + end; + end; + taCenter: begin + if TextRect.Left + CaptionWidth + + (TextRect.Right - TextRect.Left - CaptionWidth) div 2 + 4 > ArrowX then begin + ArrowX := TextRect.Left + CaptionWidth + (TextRect.Right - TextRect.Left - CaptionWidth) div 2 + 4; + IntersectClipRect(Canvas.Handle, TextRect.Left, + TextRect.Top, TextRect.Right - 1, TextRect.Bottom); + end; + end; + end; + + if SortColInfo.Desc then + Canvas.Draw(ArrowX + PressOffset, ArrowY + PressOffset, bmpSortDesc) + else + Canvas.Draw(ArrowX + PressOffset, ArrowY + PressOffset, bmpSortAsc); + + if SortNum > 0 then begin + OldBkMode := SetBkMode(Canvas.Handle, TRANSPARENT); + OldTextColor := GetTextColor(Canvas.Handle); + SetTextColor(Canvas.Handle, clWhite); + ArrowY := TextRect.Top + ((TextRect.Bottom - TextRect.Top - canvas.textHeight('X')) div 2); + Canvas.TextOut(ArrowX + 12 + PressOffset, ArrowY + PressOffset, IntToStr(SortNum)); + SetTextColor(Canvas.Handle, clGray); + Canvas.TextOut(ArrowX + 11 + PressOffset, ArrowY - 1 + PressOffset, IntToStr(SortNum)); + SetBkMode(Canvas.Handle, OldBkMode); + SetTextColor(Canvas.Handle, OldTextColor); + Canvas.Font := MasterCol.Title.Font; + end; + finally + RestoreDC(Canvas.Handle, i); + end; + end; + + if dgeFilterBar in OptionsEx then begin + TitleRect.Top := TitleRect.Bottom; + if dgRowLines in Options then + Inc(TitleRect.Top); +// if not(dgRowLines in Options) then +// Dec(TitleRect.Top); + TitleRect.Bottom := TitleRect.Top + DefaultRowHeight + 9; + if CRGridTitleEdit.EditingFilter then + DrawTitleBarCell(Canvas,Column,TitleRect, + CRGridTitleEdit.FFilterExpressions[Column.Index]) + else + DrawTitleBarCell(Canvas,Column,TitleRect,TCRColumn(Column).FilterExpression); + end; + if dgeSearchBar in OptionsEx then begin + TitleRect.Top := TitleRect.Bottom ; + if dgRowLines in Options then + Inc(TitleRect.Top); + TitleRect.Bottom := TitleRect.Top + DefaultRowHeight + 9; +// if not(dgRowLines in Options) then +// Dec(TitleRect.Top); + DrawTitleBarCell(Canvas,Column,TitleRect,''); + end; + AState := AState - [gdFixed]; // prevent box drawing later + end; + +var + DrawColumn: TColumn; +begin + if (ARow = 0) and (dgTitles in Options) then begin + if ACol >= IndicatorOffset then begin + DrawColumn := Columns[ACol - IndicatorOffset]; + DrawTitleCell(ACol - IndicatorOffset, ARow, DrawColumn, AState); + end + else begin + inherited DrawCell(ACol, ARow, ARect, AState); + DrawTitleIndicatorCell(Canvas,ARect); + end + end + else begin + if DataLink.Active then + if dgTitles in Options then + FActiveRowSelected := ARow - 1 = DataLink.ActiveRecord + else + FActiveRowSelected := ARow = DataLink.ActiveRecord + else + FActiveRowSelected := False; + inherited DrawCell(ACol, ARow, ARect, AState); + if gdFixed in AState then begin + if dgColLines in Options then begin + Canvas.Pen.color := clBlack; + Canvas.Pen.style := psSolid; + Canvas.MoveTo(aRect.Right, aRect.Top); + Canvas.LineTo(aRect.Right, aRect.Bottom + 1); + end; + if dgRowLines in Options then begin + Canvas.Pen.color := clBlack; + Canvas.Pen.style := psSolid; + Canvas.MoveTo(aRect.Left, aRect.Bottom); + Canvas.LineTo(aRect.Right, aRect.Bottom); + end; + end + end; +end; + +procedure TCRDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: integer); +var + State: TGridState; + DrawInfo: TGridDrawInfo; + Index: longint; + Pos, Ofs: integer; + OldActive: integer; + Cell: TGridCoord; + i: integer; + Column: TColumn; + Value: string; + ColWidth, ValueWidth: integer; +begin + FExecColAjust := False; + + if FGridState = gsNormal then begin + CalcDrawInfo(DrawInfo); + CalcSizingState(X, Y, State, Index, Pos, Ofs, DrawInfo); + end + else + State := FGridState; + + if not (State in [gsColSizing]) and DataLink.Active then begin + if (Button = mbLeft) and (dgTitles in Options) then + begin + Cell := MouseCoord(X,Y); + if Cell.X >= IndicatorOffset then + begin + if not (dgRowSelect in Options) and (Cell.Y >= FixedRows) + and (TopRow + Cell.Y - FixedRows = Row) and IsOnButton(X,Y) + then begin + FCellButtonDown := RawToDataColumn(Cell.X); + FCellButtonRow := Cell.Y; + FCellButtonCol := Cell.X; + FCellButtonBRect := GetButtonRect(Cell); + FCellButtonRect := CellRect(Cell.X,Cell.Y); + //Paint; // ?? + HideEditor; + DrawButton(Cell.X,Cell.Y,PtInRect(FCellButtonBRect,Point(x,y))); + FCellButtonPressed := True; + //invalidaterect(GetButtonRect(Cell)); + Exit; + end; + + if Cell.Y = 0 then + begin + Column := Columns[RawToDataColumn(Cell.X)]; + + if MouseInFilterEdit(X, Y, Column) then + begin + FContinueEditingFilter := True; + ActivateFilterEdit(Column); + Exit; + end + else + if MouseInSortEdit(X, Y, Column) then + begin + ActivateSearchEdit(Column); + Exit; + end; + end; + + if DataLink.Active and (Cell.Y < FixedRows) + and (dgeEnableSort in OptionsEx) and MouseInLowerstLevel(X, Y, nil) + then begin + i := FTitleButtonDown; + FTitleButtonDown := RawToDataColumn(Cell.X); + FOldTitleButtonDown := FTitleButtonDown; + if i > -1 then + InvalidateCol(i+1); + invalidatecol(FTitleButtonDown+1); + + end; + end + else + begin + FIndicatorColBtnDown := GetIndicatorButton(X,Y); + FOldIndicatorColBtnDown := FIndicatorColBtnDown; + if FIndicatorColBtnDown <> icbNone then + InvalidateCol(0); + end; + end; + end; + + if (mbLeft = Button) and (State = gsColSizing) and DataLink.Active then begin + if ssDouble in Shift then begin + Index := Min(RawToDataColumn(MouseCoord(X, Y).X), RawToDataColumn(MouseCoord(X - 7, Y).X)); + if Index < 0 then + Index := Columns.Count - 1; + + Column := Columns[Index]; + ColWidth := 0; + OldActive := DataLink.ActiveRecord; + try + for i := TopRow - 1 to VisibleRowCount - 1 do begin + Datalink.ActiveRecord := i; + if Assigned(Column.Field) then + Value := Column.Field.DisplayText + else + Value := ''; + ValueWidth := Canvas.TextWidth(Value); + if ValueWidth > ColWidth then + ColWidth := ValueWidth; + end; + finally + DataLink.ActiveRecord := OldActive; + end; + + //Column.Width := ColWidth + 4; + ColWidths[Index + IndicatorOffset] := ColWidth + 4; + + FExecColAjust := True; + //MessageBox(0, PChar('Row ' + IntToStr(Row) + #13'Row Count ' + IntToStr(RowCount) + #13'TopRow ' + IntToStr(TopRow) + #13'Vis ' + IntToStr(VisibleRowCount)), '', MB_OK); + end; + if CRGridTitleEdit.Focused or CRGridTitleEdit.Edit.Focused then begin + SendMessage(Handle, WM_SETREDRAW, 0, 0); + try + inherited; + CRGridTitleEdit.Visible := True; + CRGridTitleEdit.SetFocus; + finally + SendMessage(Handle, WM_SETREDRAW, 1, 0); + end; + Column := CRGridTitleEdit.FActiveColumn; + if CRGridTitleEdit.FAsFilter then begin + ActivateFilterEdit(Column); + Exit; + end + else + ActivateSearchEdit(Column); + end; + end; + + InvalidateRect(Handle,{$IFNDEF CLR}@{$ENDIF}FStatusRect,False); + CRGridTitleEdit.EditingFilter := False; + FContinueEditingFilter := False; + inherited; +end; + +procedure TCRDBGrid.MouseMove(Shift: TShiftState; X, Y: integer); +var + State: TGridState; + DrawInfo: TGridDrawInfo; + Index: Longint; + Pos, Ofs: integer; +// Column:TColumn; +// Cell: TGridCoord; + Rect: TRect; + Col: TColumn; +begin + inherited; + + if FGridState = gsNormal then begin + CalcDrawInfo(DrawInfo); + CalcSizingState(X, Y, State, Index, Pos, Ofs, DrawInfo); + end + else + State := FGridState; + if FCellButtonDown > -1 then + begin + FCellButtonPressed := PtInRect(FCellButtonBRect,Point(x,y)); + DrawButton(FCellButtonCol,FCellButtonRow,FCellButtonPressed); + end; + + if (ssLeft in Shift) and (FOldTitleButtonDown > -1) then begin + Rect := CalcTitleRect(Columns[FOldTitleButtonDown], 0, Col); + + if dgeSearchBar in OptionsEx then + Dec(Rect.Bottom,DefaultRowHeight + 10); + if dgeFilterBar in OptionsEx then + Dec(Rect.Bottom,DefaultRowHeight + 10); + + if (FTitleButtonDown = -1) and PtInRect(Rect,Point(X,Y)) then begin + FTitleButtonDown := FOldTitleButtonDown; + InvalidateCol(FTitleButtonDown + 1); + end + else + if (FTitleButtonDown > -1) and ((Y < Rect.Top) or (Y > Rect.Bottom) + or ((X < Self.Left) and (Columns[FTitleButtonDown].Index = 0)) + or ((X > Self.Left + Self.Width) and (Columns[FTitleButtonDown].Index = Columns.Count - 1))) then begin + Index := FTitleButtonDown + 1; + FTitleButtonDown := -1; + InvalidateCol(Index) + end; + end; + + if (ssLeft in Shift) and (FOldIndicatorColBtnDown <> icbNone) then begin + if (FIndicatorColBtnDown = icbNone) + and (GetIndicatorButton(X, Y) = FOldIndicatorColBtnDown) then begin + FIndicatorColBtnDown := FOldIndicatorColBtnDown; + InvalidateCol(0); + end + else + if (FIndicatorColBtnDown <> icbNone) + and (FIndicatorColBtnDown <> GetIndicatorButton(X, Y)) then begin + FIndicatorColBtnDown := icbNone; + InvalidateCol(0) + end; + end; + +{ if not (State in [gsColSizing]) and DataLink.Active then begin + Cell := MouseCoord(X,Y); + if (Cell.X >= IndicatorOffset) and (Cell.Y >= 0) and + (ngTitles in FOptions) and (Cell.Y = 0) + then begin + FTitleButtonDown := RawToDataColumn(Cell.X); + Paint; // ?? + end + else begin + FTitleButtonDown := -1; + Paint; // ?? + end; + end;} +end; + +procedure TCRDBGrid.Reorder; +var + i: integer; + St: string; +begin + if DataLink.Active and + {$IFDEF DAC450} + (DataLink.DataSet is TCustomDADataSet) + {$ELSE} + ( ((DataLink.DataSet is TCustomDADataSet) and not(dgeLocalSorting in OptionsEx)) or + ((DataLink.DataSet is TMemDataSet) and (dgeLocalSorting in OptionsEx)) + ) + {$ENDIF} + then begin + St := ''; + for i := 0 to FSortInfo.Count - 1 do + if TCRColumn(Columns[TSortColInfo(FSortInfo[i]).Index]).CanBeSorted then + begin + if St <> '' then + St := St + ','; + {$IFNDEF DAC450} + if dgeLocalSorting in OptionsEx then + St := St + '''' + Columns[TSortColInfo(FSortInfo[i]).Index].Field.FieldName + '''' + else + {$ENDIF} + St := St + IntToStr(Columns[TSortColInfo(FSortInfo[i]).Index].Field.FieldNo); + if TSortColInfo(FSortInfo[i]).Desc then + St := St + ' DESC'; + end; + {$IFNDEF DAC450} + if dgeLocalSorting in OptionsEx then + TMemDataSet(DataLink.DataSet).IndexFieldNames := St + else + {$ENDIF} + begin + TCustomDADataSet(DataLink.DataSet).SetOrderBy(St); + DataLink.DataSet.Open; + end; + end; +end; + +procedure TCRDBGrid.MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: integer); +var + State: TGridState; + DrawInfo: TGridDrawInfo; + Index, i: Longint; + Pos, Ofs: integer; + Column: TColumn; + Cell: TGridCoord; + SortColInfo: TSortColInfo; + Desc: boolean; + SortColNum: integer; + LastBtn: integer; + Widths: array of integer; +begin + if FGridState = gsNormal then begin + CalcDrawInfo(DrawInfo); + CalcSizingState(X, Y, State, Index, Pos, Ofs, DrawInfo); + end + else + State := FGridState; + + if (mbLeft = Button) and (State = gsColSizing) and DataLink.Active then begin + if CRGridTitleEdit.Focused then begin + inherited; + Column := CRGridTitleEdit.FActiveColumn; + if CRGridTitleEdit.FAsFilter then begin + ActivateFilterEdit(Column); + end + else + ActivateSearchEdit(Column); + end; + end; + + FTitleBarUp := False; + if not (State in [gsColSizing]) and DataLink.Active and not FExecColAjust + then begin + Cell := MouseCoord(X,Y); + + if not (dgRowSelect in Options) then + if FCellButtonDown > -1 then begin + DrawButton(Cell.X,Cell.Y,False); + if FCellButtonDown = RawToDataColumn(Cell.X) then + if FCellButtonPressed then + begin + FCellButtonDown := -1; + FCellButtonRow := -1; + FCellButtonCol := -1; + DoOnMemoClick(Columns[RawToDataColumn(Cell.X)]); + invalidate; + end; + end; + FCellButtonDown := -1; + FCellButtonRow := -1; + FCellButtonCol := -1; + LastBtn := FTitleButtonDown; + FOldTitleButtonDown := -1; + if FTitleButtonDown > -1 then begin + invalidatecol(FTitleButtonDown + 1); + FTitleButtonDown := - 1; + end; + + if (Button = mbLeft) and (Cell.Y = 0) and (dgTitles in Options) then begin + if Cell.X >= IndicatorOffset then + begin + Column := Columns[RawToDataColumn(Cell.X)]; + + if not (MouseInSortBar(X,Y,Column) or MouseInFilterBar(X,Y,Column)) + then begin + FTitleBarUp := True; + + if TCRColumn(Column).CanBeSorted and (dgeEnableSort in OptionsEx) + and MouseInLowerstLevel(X,Y,Column) and (LastBtn = Column.Index) + then begin + FExecSorting := True; + BeginLayout; + try + SetLength(Widths, Columns.Count); + for i := 0 to Columns.Count - 1 do + Widths[i] := Columns[i].Width; + if (DataLink.DataSet <> nil) and + {$IFDEF DAC450} + (DataLink.DataSet is TCustomDADataSet) + {$ELSE} + ( ((DataLink.DataSet is TCustomDADataSet) and not(dgeLocalSorting in OptionsEx)) or + ((DataLink.DataSet is TMemDataSet) and (dgeLocalSorting in OptionsEx)) + ) + {$ENDIF} + then begin + SortColInfo := FindSortColInfo(Column.Index, SortColNum); + Desc := (SortColInfo <> nil) and not SortColInfo.Desc; + + if (ssCtrl in Shift) and (SortColInfo <> nil) then begin + SortColInfo.Free; + if SortColNum > 0 then + Dec(SortColNum); + FSortInfo.Delete(SortColNum); + end + else begin + if not (ssShift in Shift) then + ClearSorting; + if not (ssShift in Shift) or (SortColInfo = nil) then begin + SortColInfo := TSortColInfo.Create; + SortColInfo.Index := Column.Index; + FSortInfo.Add(SortColInfo); + end; + + SortColInfo.Desc := Desc; + end; + + Reorder; + end; + finally + EndLayout; + for i := 0 to Columns.Count - 1 do + Columns[i].Width := Widths[i]; + FExecSorting := False; + end; + end; + end; + end + else + if FIndicatorColBtnDown <> icbNone then begin + FIndicatorColBtnDown := icbNone; + InvalidateCol(0); + IndicatorClick(FOldIndicatorColBtnDown, X, Y); + end; + end; + FOldIndicatorColBtnDown := icbNone; + end; + + inherited; + + FTitleBarUp := False; +end; + +procedure TCRDBGrid.LinkActive(Value: boolean); +var + St: string; + Parser: TParser; + Code: integer; + Lex: string; + i: integer; + FieldName: string; + SortColInfo: TSortColInfo; + Ind: integer; +begin + inherited; + // need to make header to have multilines + CRGridTitleEdit.StopEdit(False); + if not FExecSorting then begin + ClearSorting; + + if Value and (DataLink.DataSet is TCustomDADataSet) + and TCustomDADataSet(DataLink.DataSet).IsQuery + then begin + St := TCustomDADataSet(DataLink.DataSet).GetOrderBy; + //St := GetOrderBy(TOraDataSet(DataLink.DataSet).SQL.Text); + //St := ''; + if St <> '' then begin + Parser := TParser.Create(PChar(St)); + try + Parser.QuotedString := True; + repeat + SortColInfo := nil; + Code := Parser.GetNext(Lex); + + case Code of + lcString: + if Lex[1] = '"' then begin + Lex := Copy(Lex, 2, Length(Lex) - 2); + if Lex <> '' then + Code := lcIdent; + end; + lcNumber: + try + Ind := StrToInt(Lex); + if Ind <= DataLink.DataSet.FieldDefs.Count then begin + Lex := DataLink.DataSet.FieldDefs[Ind - 1].Name; + Code := lcIdent; + end; + except + Exit; + end; + end; + + if Code <> lcIdent then + Exit; + + FieldName := UpperCase(Lex); + + Code := Parser.GetNext(Lex); + if Lex = '.' then begin + Code := Parser.GetNext(Lex); + if Code = lcIdent then begin + FieldName := UpperCase(Lex); + Code := Parser.GetNext(Lex); + end + else + Exit; + end; + + for i := 0 to Columns.Count - 1 do + if (Columns[i].Field <> nil) and (UpperCase(Columns[i].Field.FieldName) = FieldName) + then begin + SortColInfo := TSortColInfo.Create; + SortColInfo.Index := i; + SortColInfo.Desc := False; + FSortInfo.Add(SortColInfo); + break; + end; + + if UpperCase(Lex) = 'DESC' then begin + if SortColInfo <> nil then + SortColInfo.Desc := True; + Code := Parser.GetNext(Lex); + end + else + if UpperCase(Lex) = 'ASC' then + Code := Parser.GetNext(Lex) + else + if (Code <> lcEnd) and (Lex <> ',') then + Exit; + until Code = lcEnd; + finally + Parser.Free; + end; + end; + end; + end; + if Value then + RecordChanged(nil); + + Invalidate; +end; + +procedure TCRDBGrid.UpdateHeaderHeight; +var + Cur, i: integer; + aHeight: integer; +begin + if not (dgTitles in Options) then begin + RowHeights[0]:= DefaultRowHeight; + Exit; + end; + FHeaderHeight := 1; + for i := 0 to Columns.Count - 1 do begin + if TCRColumnTitle(Columns[i].Title).IsCaptionStored then + Cur := GetCaptionDepth(Columns[i].Title.Caption,FLevelDelimiterChar) + else + Cur := 1; + if Cur > FHeaderHeight then + FHeaderHeight := Cur; + end; + aHeight := (DefaultRowHeight + 1) * FHeaderHeight; +// if dgRowLines in Options then +// aHeight := aHeight + FHeaderHeight; +// if not (dgRowLines in Options) then +// Dec(aHeight); // because of always-border cells + if dgeFilterBar in OptionsEx then + aHeight := aHeight + DefaultRowHeight + 10; + + if dgeSearchBar in OptionsEx then + aHeight := aHeight + DefaultRowHeight + 10; + + RowHeights[0]:= aHeight - 1; +end; + +procedure TCRDBGrid.SetOptionsEx(Value: TCRDBGridOptionsEx); +begin + if FOptionsEx <> Value then begin + if ((dgeFilterbar in FOptionsEx) <> (dgeFilterBar in Value)) + or ((dgeSearchbar in FOptionsEx) <> (dgeSearchBar in Value)) + then begin + FOptionsEx := Value; + FOptionsMenuDef.Items[2].Checked := dgeFilterBar in FOptionsEx; + FOptionsMenuDef.Items[3].Checked := dgeSearchBar in FOptionsEx; + LayoutChanged; + UpdateRowCount; + Invalidate; + Exit; + end; + FOptionsEx := Value; + if (dgeStretch in FOptionsEx) then begin + if not FSoft and not (csLoading in ComponentState) then begin + FExecSizing := True; + ResizeColumns; + FExecSizing := False; + end; + FSoft := True; + end + else + FSoft := False; + Invalidate; + end; +end; + +function TCRDBGrid.GetClientRect: TRect; +begin + Result := inherited GetClientRect; + if dgRowLines in options then + Inc(Result.Bottom); + if [dgeSummary,dgeRecordCount] * FOptionsEx <> [] then + Dec(Result.Bottom,DefaultRowHeight + 2); +end; + +procedure TCRDBGrid.LayoutChanged; +begin + inherited; + + CRGridTitleEdit.StopEdit(False); + UpdateHeaderHeight; + //DoubleBuffered := true; +end; + +procedure TCRDBGrid.Paint; +var + TotalWidth: integer; + TotalYOffs: integer; + TotalHeight: integer; + TmpText: string; + + procedure PaintStatusLine(YOffset: integer); + var + Column: TCRColumn; + MasterCol: TColumn; + BrdRect: TRect; + CellRect: TRect; + ColIndex: integer; + FullRect: TRect; + RightBorder: integer; + OldDC: HDC; + begin + OldDC := Canvas.Handle; + Canvas.Handle := 0; + try + FullRect := Rect(0, FTotalYOffset, TotalWidth, FTotalYOffset + DefaultRowHeight + 2); + FStatusRect := FullRect; + // if dgRowLines in Options then + // Inc(FullRect.Top); + Canvas.FillRect(FullRect); + with Canvas do begin + Pen.Color := clBlack; + Pen.Style := psSolid; + if dgRowLines in Options then begin + MoveTo(FullRect.Left, FullRect.Top - 1); + LineTo(FullRect.Right, FullRect.Top - 1); + MoveTo(FullRect.Left, FullRect.Bottom - 2); + LineTo(FullRect.Right, FullRect.Bottom - 2); + end; + if dgColLines in Options then begin + Dec(FullRect.Right); + MoveTo(FullRect.Right, FullRect.Top); + LineTo(FullRect.Right, FullRect.Bottom + 2); + // MoveTo(FullRect.Left , FullRect.Bottom + 2); + // LineTo(FullRect.Left, FullRect.Top); + end; + if (dgRowLines in Options) and (dgColLines in Options) then begin + Dec(FullRect.Bottom, 2); + DrawEdge(Canvas.Handle, FullRect, BDR_RAISEDINNER, BF_BOTTOMRIGHT); + DrawEdge(Canvas.Handle, FullRect, BDR_RAISEDINNER, BF_TOPLEFT); + end; + end; + + if (Columns.Count > 0) and (dgeSummary in FOptionsEx) then begin + RightBorder := GetClientRect.Right - 1; + for ColIndex := RawToDataColumn(LeftCol) to Columns.Count - 1 do begin + Column := TCRColumn(Columns[ColIndex]); + CellRect := CalcTitleRect(Column, 0, MasterCol); + if (CellRect.Left <> 0) or (CellRect.Right <> 0) or + (CellRect.Top <> 0) or (CellRect.Bottom <> 0) + then begin + CellRect.Top := YOffset; + CellRect.Bottom := CellRect.Top + DefaultRowHeight; + if Column.SummaryMode <> smNone then begin + tmpText := TCRColumn(Column).TotalString; + InflateRect(CellRect, 0, -2); + if tmpText <> '' then + WriteText(Canvas, CellRect, 3, 0, tmpText, Column.Alignment,True); + InflateRect(CellRect, 0, 2); + if dgColLines in Options then begin + if dgRowLines in Options then begin + BrdRect := CellRect; + Inc(BrdRect.Bottom); + DrawEdge(Canvas.Handle, BrdRect, BDR_RAISEDINNER, BF_RIGHT); + DrawEdge(Canvas.Handle, BrdRect, BDR_RAISEDINNER, BF_LEFT); + BrdRect.Right := CellRect.Left - 1; + BrdRect.Left := BrdRect.Right - 1; + DrawEdge(Canvas.Handle, BrdRect, BDR_RAISEDINNER, BF_RIGHT); + Dec(BrdRect.Bottom); + end; + + Canvas.Pen.Color := clBlack; + Canvas.MoveTo(CellRect.Left - 1, CellRect.Top - 1); + Canvas.LineTo(CellRect.Left - 1, CellRect.Bottom + 3); + + BrdRect.Left := CellRect.Right + 1; + BrdRect.Right:= BrdRect.Left + 1; + + if Column.Index < MasterCol.Collection.Count - 1 then begin + Inc(BrdRect.Bottom); + DrawEdge(Canvas.Handle, BrdRect, BDR_RAISEDINNER, BF_LEFT); + Dec(BrdRect.Bottom); + Canvas.Pen.Color := clBlack; + Canvas.MoveTo(CellRect.Right, CellRect.Top - 1); + Canvas.LineTo(CellRect.Right, CellRect.Bottom + 3); + end; + end; + end; + end; + if dgeRecordCount in FOptionsEx + then begin + CellRect := FullRect; + InflateRect(CellRect, -2, -2); + CellRect.Right := RightBorder; + if DataLink.Active then + tmpText := IntToStr(DataLink.DataSet.RecNo) + + '/' + IntToStr(DataLink.DataSet.RecordCount) + else + tmpText := '';//'Records count : INACTIVE'; + WriteText(Canvas, CellRect, 0, 0, tmpText, taLeftJustify,True); + end; + end; + end + else begin + if dgeRecordCount in FOptionsEx then begin + CellRect := FullRect; + InflateRect(CellRect, -2, -2); + if DataLink.Active then + tmpText := IntToStr(DataLink.DataSet.RecNo) + + '/' + IntToStr(DataLink.DataSet.RecordCount) + else + tmpText := '';//'Records count : INACTIVE'; + WriteText(Canvas, CellRect, 0, 0, tmpText, taLeftJustify,True); + end; + end; + finally + Canvas.Handle := OldDC; + end; + end; +{$IFNDEF CLR}//TODO +var + Opt: TGridOptions; + Last: TGridOptions; +{$ENDIF} +begin +{$IFNDEF CLR}//TODO + Opt := _TCustomGrid(Self).Options; + Last := Opt; + Opt := Opt - [goFixedVertLine , goFixedHorzLine]; + _TCustomGrid(Self).Options := Opt; +{$ENDIF} + inherited; // Draw standart grid + with Canvas do begin + TotalHeight := GetClientRect.Bottom; + TotalYOffs := TotalHeight; + TotalWidth := GetClientRect.Right; + FTotalYOffset := TotalYOffs; + Canvas.Font.Assign(TitleFont); + Canvas.Brush.Color := clBtnFace; + if [dgeSummary,dgeRecordCount] * FOptionsEx <> [] then + PaintStatusLine(FTotalYOffset); + end; + //_TCustomGrid(Self).Options := Last; +end; + +procedure TCRDBGrid.LoadTotals; +var + ColNom: integer; + Mode: TSummaryMode; + BookM: TBookmark; + Col: TCRColumn; + DataSet: TDataSet; + Field: TField; +begin + if not ((dgeSummary in OptionsEx) and DataLink.Active) or (Columns.Count = 0) then + Exit; + BookM := DataLink.DataSet.GetBookMark; + try + DataSet := DataLink.DataSet; + DataSet.DisableControls; + for ColNom := 0 to Columns.Count - 1 do begin + if (TCRColumn(Columns[ColNom]).SummaryMode <> smLabel) and (not TCRColumn(Columns[ColNom]).FTotalLoaded)and(Assigned(Columns[ColNom].Field)) then begin + Col := TCRColumn(Columns[ColNom]); + Field := Col.Field; + if Col.SummaryMode = smMin then + Col.FTotalInt := Field.AsInteger + else + Col.FTotalInt := 0; + if Col.SummaryMode = smMin then + Col.FTotalFloat := Field.AsFloat + else + Col.FTotalFloat := 0; + Col.FTotalString:= ''; + Col.FTotalValue:= Unassigned; + end; + end; + + DataSet.First; + while not DataSet.Eof do begin + for ColNom := 0 to Columns.Count - 1 do + if (not TCRColumn(Columns[ColNom]).FTotalLoaded) and + Assigned(TCRColumn(Columns[ColNom]).Field) + then begin + Col := TCRColumn(Columns.Items[ColNom]); + Field := Col.Field; + Mode := Col.SummaryMode; + case Col.Field.DataType of + ftSmallint, ftInteger, ftWord, ftLargeint: + case Mode of + smSum: + Col.FTotalInt := Col.FTotalInt + Field.AsInteger; + smAvr: + Col.FTotalInt := Col.FTotalInt + Field.AsInteger; + smMax: + if Col.FTotalInt < Field.AsInteger then + Col.FTotalInt := Field.AsInteger; + smMin: + if Col.FTotalInt > Field.AsInteger then + Col.FTotalInt := Field.AsInteger; + end; + ftFloat, ftCurrency: + case Mode of + smSum: + Col.FTotalFloat := Col.FTotalFloat + Field.AsFloat; + smAvr: + Col.FTotalFloat := Col.FTotalFloat + Field.AsFloat; + smMax: + if Col.FTotalFloat < Field.AsFloat then + Col.FTotalFloat := Field.AsFloat; + smMin: + if Col.FTotalFloat > Field.AsFloat then + Col.FTotalFloat := Field.AsFloat; + end; + end; + end; + DataSet.Next; + end; + for ColNom := 0 to Columns.Count - 1 do + if (not TCRColumn(Columns[ColNom]).FTotalLoaded) and + Assigned(TCRColumn(Columns[ColNom]).Field) + then begin + Col := TCRColumn(Columns.Items[ColNom]); + if (Col.SummaryMode = smAvr) and (DataLink.DataSet.RecordCount > 0) then + case Col.Field.DataType of + ftSmallint, ftInteger, ftWord, ftLargeint: + Col.FTotalFloat := Col.FTotalInt / DataLink.DataSet.RecordCount; + ftFloat, ftCurrency: + Col.FTotalFloat := Col.FTotalFloat / DataLink.DataSet.RecordCount; + end; + Col.SetTotal; + end; + finally + DataLink.DataSet.GotoBookMark(BookM); + DataLink.DataSet.FreeBookMark(BookM); + DataLink.DataSet.EnableControls; + end; +end; + +procedure TCRDBGrid.DataChanged; +begin + ResetTotals; + LoadTotals; + invalidate; +end; + +procedure TCRDBGrid.RecordChanged(Field: TField); +var + i: integer; +begin + if not HandleAllocated then + Exit; + if Field = nil then + DataChanged + else begin + for i := 0 to Columns.Count - 1 do + if Columns[i].Field = Field then + TCRColumn(Columns[i]).ResetTotal; + LoadTotals; + Invalidate; + end; + + inherited; +end; + +procedure TCRDBGrid.ResetTotals; +var + i: integer; +begin + for i := 0 to Columns.Count - 1 do + TCRColumn(Columns[i]).ResetTotal; +end; + +function TCRDBGrid.EndColumnDrag(var Origin, Destination: integer; + const MousePt: TPoint): boolean; +var + Mx,Mn, + Oi: integer; +begin + Result := inherited EndColumnDrag(Origin, Destination, MousePt); + + if Result and (Origin <> Destination) then begin + if Origin > Destination then begin + Mx := Origin; + Mn := Destination + end + else begin + Mx := Destination; + Mn := Origin + end; + Dec(mx); + Dec(mn); + for Oi := 0 to FSortInfo.Count - 1 do begin + if TSortColInfo(FSortInfo[Oi]).Index = Origin - 1 then begin + TSortColInfo(FSortInfo[Oi]).Index := Destination - 1; + //TSortColInfo(FSortInfo[Oi]).Desc := not TSortColInfo(FSortInfo[Oi]).Desc; + continue; + end; + if (TSortColInfo(FSortInfo[Oi]).Index > Mx)or(TSortColInfo(FSortInfo[Oi]).Index < Mn) then + continue; + if Destination < Origin then + Inc(TSortColInfo(FSortInfo[Oi]).Index) + else + Dec(TSortColInfo(FSortInfo[Oi]).Index); + end; + end; +end; + +procedure TCRDBGrid.SetLevelDelimiterchar(const Value: char); +begin + FLevelDelimiterchar := Value; +end; + +procedure TCRDBGrid.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; +begin + GetCursorPos(P); + P := ScreenToClient(P); + if MouseInSortEdit(p.x,p.y) or MouseInFilterEdit(p.x,p.y) then + Windows.SetCursor(LoadCursor(0, IDC_IBEAM)) + else + inherited; +end; + +function TCRDBGrid.MouseInSortBar(X,Y: integer; Column: TColumn = nil): boolean; +var + Index: integer; + Rect: TRect; +begin + Result := False; + if not (dgeSearchBar in OptionsEx) then + Exit; + if Column = nil then begin + Index := DataToRawColumn(MouseCoord(X,Y).X); + Column := Columns[Index]; + end; + Rect := CalcSearchBar(Column); + Result := PtInRect(Rect,Point(x,y)); +end; + +function TCRDBGrid.MouseInSortEdit(X,Y: integer; Column: TColumn = nil): boolean; +var + Index: integer; + Rect: TRect; +begin + Result := False; + if not (dgeSearchBar in OptionsEx) then + exit; + if Column = nil then begin + Index := RawToDataColumn(MouseCoord(X,Y).X); + if Index < 0 then + exit; + Column := Columns[Index]; + end; + Rect := CalcSearchBar(Column); + InflateRect(Rect, -5, -5); + Result := PtInRect(Rect,Point(x,y)) and TCRColumn(Column).CanBeSorted; +end; + +function TCRDBGrid.MouseInFilterBar(X,Y: integer; Column: TColumn = nil): boolean; +var + Index: integer; + Rect: TRect; +begin + Result := False; + if not (dgeFilterBar in OptionsEx) then + Exit; + if Column = nil then begin + Index := DataToRawColumn(MouseCoord(X,Y).X); + if Index < 0 then + Exit; + Column := Columns[Index]; + end; + Rect := CalcFilterBar(Column); + Result := PtInRect(Rect, Point(x,y)); +end; + +function TCRDBGrid.MouseInFilterEdit(X,Y: integer; Column: TColumn = nil): boolean; +var + Index: integer; + Rect: TRect; +begin + Result := False; + if not (dgeFilterBar in OptionsEx) then + Exit; + if Column = nil then begin + Index := RawToDataColumn(MouseCoord(X, Y).X); + if Index < 0 then + Exit; + Column := Columns[Index]; + end; + Rect := CalcFilterBar(Column); + InflateRect(rect, -5, -5); + Result := PtInRect(Rect, Point(x,y)) and TCRColumn(Column).CanBeSorted; +end; + +function TCRDBGrid.CalcSearchBar(Column: TColumn): TRect; +var + Rect: TRect; + MasterCol: TColumn; + aRow: integer; +begin + aRow := 0; + Rect := CalcTitleRect(Column,aRow,MasterCol); + Rect.Top := Rect.Bottom - (DefaultRowHeight + 9); + if not (dgeSearchBar in OptionsEx) then begin + Result.Top := Result.Bottom; + exit; + end; + Result := Rect; +end; + +function TCRDBGrid.CalcFilterBar(Column: TColumn): TRect; +var + Rect: TRect; + MasterCol: TColumn; + aRow: integer; +begin + aRow := 0; + Rect := CalcTitleRect(Column, aRow, MasterCol); + if dgeSearchBar in OptionsEx then + begin + Rect.Bottom := Rect.Bottom - (DefaultRowHeight + 9); + if dgRowLines in Options then + Dec(Rect.Bottom); + end; + Rect.Top := Rect.Bottom - (DefaultRowHeight + 9); +// if not (dgRowLines in Options) then +// Inc(Rect.Top); + Result := Rect; + if not (dgeFilterBar in OptionsEx) then begin + Result.Top := Result.Bottom; + exit; + end; +end; + +procedure TCRDBGrid.ActivateFilterEdit(Column: TColumn); +var + CellRect: TRect; +begin + if not (Assigned(Column) and (dgeFilterBar in OptionsEx)) then + Exit; + CellRect := CalcFilterBar(Column); + InflateRect(CellRect, -5, -5); + if not (dgRowLines in Options) then + Dec(CellRect.Top); + CRGridTitleEdit.ActivateAt(CellRect, Column, True); +end; + +procedure TCRDBGrid.DoOnMemoClick(Column: TColumn); +var + Window: TMemoEditorForm; +begin + if Assigned(FOnMemoClick) then + FOnMemoClick(Self, Column) + else begin + Window := TMemoEditorForm.Create(GetParentForm(Self)); + try + Window.FMemo.Text := AdjustLineBreaks(Column.Field.AsString); + Window.ReadOnly := ReadOnly or Column.Field.ReadOnly or not (dgEditing in Options); + Window.Caption := Column.Field.DisplayName; + if (FMemoWidth > 0) and (FMemoHeight > 0) then begin + Window.Width := FMemoWidth; + Window.Height := FMemoHeight; + end; + Window.FCheckBox.Checked := FMemoWordWrap; + if Window.ShowModal = mrOK then begin + DataLink.DataSet.Edit; + Column.Field.AsString := Window.FMemo.Text; + end; + FMemoWidth := Window.Width; + FMemoHeight := Window.Height; + FMemoWordWrap := Window.FCheckBox.Checked; + finally + Window.Free; + end; + end; +end; + +function TCRDBGrid.MouseInLowerstLevel(X, Y: integer; Column: TColumn = nil): boolean; +var + Index: integer; + Rect: TRect; + MasterCol: TColumn; +begin + Result := False; + if Column = nil then begin + Index := RawToDataColumn(MouseCoord(X, Y).X); + if Index < 0 then + exit; + Column := Columns[Index]; + end; + Index := 0; + Rect := CalcTitleRect(Column, Index, MasterCol); + Index := GetCaptionDepth(Column.Title.Caption, FLevelDelimiterChar); + if Index > 0 then begin + Index := (Index-1) * (DefaultRowHeight + 1); + Rect.Top := Index; + Rect.Bottom := CalcFilterBar(Column).top; + Result := PtInRect(Rect, Point(X, Y)); + end + else + Result := True; +end; + +procedure TCRDBGrid.DrawTitleBarCell(Canvas: TCanvas; Column: TColumn; + Rect: TRect; Text: string); +var + TextRect: TRect; +begin + Canvas.Brush.Color := clBtnFace; + Canvas.Brush.Style := bsSolid; + Canvas.FillRect(Rect); + + if (dgRowLines in Options) and (dgColLines in Options) then begin + DrawEdge(Canvas.Handle, Rect, BDR_RAISEDINNER, BF_BOTTOMRIGHT); + DrawEdge(Canvas.Handle, Rect, BDR_RAISEDINNER, BF_TOPLEFT); + end; + + if TCRColumn(column).CanBeSorted then begin + if (dgRowLines in Options) and (dgColLines in Options) then begin + InflateRect(Rect, -4, -4); + if Rect.Right > Rect.Left then begin + DrawEdge(Canvas.Handle, Rect, BDR_SUNKENINNER, BF_TOPLEFT); + Rect.Bottom := Rect.Bottom + 1; + DrawEdge(Canvas.Handle, Rect, BDR_SUNKENINNER, BF_BOTTOMRIGHT); + InflateRect(Rect, 1, 1); + DrawEdge(Canvas.Handle, Rect, BDR_SUNKENOUTER, BF_TOPLEFT); + DrawEdge(Canvas.Handle, Rect, BDR_SUNKENOUTER, BF_BOTTOMRIGHT); + InflateRect(Rect, 3, 3); + Rect.Bottom := Rect.Bottom - 1; + end + else + InflateRect(Rect, 4, 4); + end; + + TextRect := Rect; + InflateRect(TextRect, -5, -5); + TextRect.Bottom := TextRect.Top + DefaultRowHeight; + if TextRect.Right >= TextRect.Left then begin + Canvas.Brush.Color := clWindow; + Canvas.Brush.Style := bsSolid; + Canvas.FillRect(TextRect); + end; + + InflateRect(TextRect, -2, -2); + if (Text <> '') and (TextRect.Right >= TextRect.Left) then + WriteText(Canvas, TextRect, 0, 0, Text, taLeftJustify, True); + end; + + Canvas.Pen.Color := clBlack; + if dgRowLines in options then begin + Canvas.MoveTo(Rect.Left, Rect.Bottom); + Canvas.LineTo(Rect.Right + 1, Rect.Bottom); + end; + if dgColLines in options then begin + Canvas.MoveTo(Rect.Right, Rect.Top); + Canvas.LineTo(Rect.Right, Rect.Bottom); + end; +end; + +procedure TCRDBGrid.DrawTitleIndicatorCell(Canvas: TCanvas; ARect: TRect); + procedure DrawButton(Rect: TRect; Bmp: TBitmap; IsPressed: boolean); + var + Delta, Flag, PressOffset: integer; + begin + PressOffset := 0; + Delta := Ceil((Rect.Bottom - Rect.Top - Bmp.Height) / 2); + if ((dgRowLines in Options) and (dgColLines in Options)) {or PtInRect(Rect,P)} then begin + if IsPressed then begin + PressOffset := 1; + Flag := BDR_SUNKENINNER + end + else + Flag := BDR_RAISEDINNER; + DrawEdge(Canvas.Handle, Rect, Flag, BF_BOTTOMRIGHT); + DrawEdge(Canvas.Handle, Rect, Flag, BF_TOPLEFT); + end; + Canvas.Draw(Rect.Left + 1 + PressOffset, Rect.Top + Delta + PressOffset, Bmp); + if dgRowLines in Options then begin + Canvas.Pen.Color := clBlack; + Canvas.MoveTo(Rect.Left, Rect.Bottom); + Canvas.LineTo(Rect.Right + 1, Rect.Bottom); + end; + end; +var + Rect: TRect; + Bmp: TBitmap; + i: integer; +begin + Canvas.FillRect(ARect); + Rect := ARect; + + if dgeSearchBar in OptionsEx then begin + Rect.Top := Rect.Bottom - DefaultRowHeight - 9; + if not((dgRowLines in Options) or (dgeFilterBar in OptionsEx)) then + Inc(Rect.Top); + DrawButton(Rect, bmpSearch, FIndicatorColBtnDown = icbSearch); + Dec(Rect.Bottom, DefaultRowHeight + 9); + if dgRowLines in Options then + Dec(Rect.Bottom) + end; + + if dgeFilterBar in OptionsEx then begin + Rect.Top := Rect.Bottom - DefaultRowHeight - 9; + if not((dgRowLines in Options) or (dgeSearchBar in OptionsEx)) then + Inc(Rect.Top); + + if CRGridTitleEdit.EditingFilter then + Bmp := bmpEditMode + else + if FFiltered then begin + Bmp := bmpFilter; + for i := 0 to Columns.Count - 1 do + if TCRColumn(Columns[i]).FilterExpression <> '' then begin + Bmp := bmpActiveFilter; + Break; + end; + end + else + Bmp := bmpFilter; + + DrawButton(Rect, Bmp, FIndicatorColBtnDown = icbFilter); + Dec(Rect.Bottom, DefaultRowHeight + 9); + if (dgRowLines in Options) then + Dec(Rect.Bottom); + end; + + Rect.Top := ARect.Top; + if not(dgRowLines in Options) + and ((dgeSearchBar in OptionsEx) xor (dgeFilterBar in OptionsEx)) then + Inc(Rect.Bottom); + DrawButton(Rect, bmpMenu, FIndicatorColBtnDown = icbMenu); + + Canvas.Pen.Color := clBlack; + if dgColLines in Options then begin + Canvas.MoveTo(ARect.Right, ARect.Top); + Canvas.LineTo(ARect.Right, ARect.Bottom + 1); + end; +end; + +function TCRDBGrid.GetIndicatorButton(X, Y: integer): TIndicatorColButton; +var + Rect: TRect; +begin + Result := icbNone; + Rect := CellRect(0,0); + + if dgeSearchBar in OptionsEx then begin + Rect.Top := Rect.Bottom - DefaultRowHeight - 9; + if not((dgRowLines in Options) or (dgeFilterBar in OptionsEx)) then + Inc(Rect.Top); + if PtInRect(Rect,Point(X,Y)) then + Result := icbSearch; + Dec(Rect.Bottom, DefaultRowHeight + 9); + if dgRowLines in Options then + Dec(Rect.Bottom); + end; + + if dgeFilterBar in OptionsEx then begin + Rect.Top := Rect.Bottom - DefaultRowHeight - 9; + if not((dgRowLines in Options) or (dgeSearchBar in OptionsEx)) then + Inc(Rect.Top); + if PtInRect(Rect,Point(X,Y)) then + Result := icbFilter; + Dec(Rect.Bottom, DefaultRowHeight + 9); + if dgRowLines in Options then + Dec(Rect.Bottom); + end; + + Rect.Top := CellRect(0,0).Top; + if not(dgRowLines in Options) + and ((dgeSearchBar in OptionsEx) xor (dgeFilterBar in OptionsEx)) then + Inc(Rect.Bottom); + if PtInRect(Rect,Point(X,Y)) then + Result := icbMenu; +end; + +procedure TCRDBGrid.IndicatorClick(Button: TIndicatorColButton; X, Y: integer); +var + P: TPoint; +begin + EditorMode := False; + case Button of + icbFilter: + FilterItemClick(FOptionsMenuDef.Items[2]); // watch it + icbSearch: + SearchItemClick(FOptionsMenuDef.Items[3]); // watch it + icbMenu: + begin + P := ClientToScreen(Point(X, Y)); + if FOptionsMenu <> nil then + FOptionsMenu.Popup(P.x, P.y) + else + FOptionsMenuDef.Popup(P.x, P.y); + end; + end; +end; + +procedure TCRDBGrid.BuildMenu; +var + Item: TMenuitem; +begin + while FOptionsMenuDef.Items.Count > 0 do + FOptionsMenuDef.Items.Delete(0); + + Item := TMenuItem.Create(Self); + Item.Caption := SFiltered; + Item.OnClick := FilteredItemClick; + Item.Checked := FFiltered; + FOptionsMenuDef.Items.Add(Item); + + Item := TMenuItem.Create(Self); + Item.Caption := '-'; + FOptionsMenuDef.Items.Add(Item); + + Item := TMenuItem.Create(Self); + Item.Caption := SFilterBar; + Item.OnClick := FilterItemClick; + Item.Checked := dgeFilterBar in OptionsEx; + FOptionsMenuDef.Items.Add(Item); + + Item := TMenuItem.Create(Self); + Item.Caption := SSearchBar; + Item.OnClick := SearchItemClick; + Item.Checked := dgeSearchBar in OptionsEx; + FOptionsMenuDef.Items.Add(Item); +end; + +procedure TCRDBGrid.FilterItemClick(Sender: TObject); +begin + if dgeFilterBar in OptionsEx then begin + OptionsEx := OptionsEx - [dgeFilterBar]; + UpdateRowCount; + end + else + OptionsEx := OptionsEx + [dgeFilterBar]; + (Sender as TMenuItem).Checked := dgeFilterBar in OptionsEx; +end; + +procedure TCRDBGrid.SearchItemClick(Sender: TObject); +begin + if dgeSearchBar in OptionsEx then begin + OptionsEx := OptionsEx - [dgeSearchBar]; + UpdateRowCount; + end + else + OptionsEx := OptionsEx + [dgeSearchBar]; + (Sender as TMenuItem).Checked := dgeSearchBar in OptionsEx; +end; + +procedure TCRDBGrid.CalcTableSpacePercent; +var + ColumnsSize, i: integer; +begin + ColumnsSize := 0; + for i := 0 to Columns.count - 1 do + if ColWidths[i + IndicatorOffset] > 0 then + ColumnsSize := ColumnsSize + ColWidths[i + IndicatorOffset]; + for i := 0 to Columns.Count - 1 do + if ColumnsSize > 0 then + TCRColumn(Columns[i]).FTableSpacePercent := ColWidths[i + IndicatorOffset] / ColumnsSize; +end; + +procedure TCRDBGrid.KeyDown(var Key: word; Shift: TShiftState); +var + Column: TColumn; + i: integer; + + procedure ActivateEdit; + begin + if dgeSearchBar in OptionsEx then begin + ActivateSearchEdit(Column); + Key := 0; + end + else if dgeFilterBar in OptionsEx then begin + ActivateFilterEdit(Column); + Key := 0; + end; + end; +begin + case Key of + VK_UP: + if (dgTitles in Options) and (Row = 1) and ((Shift = [ssShift]) + or (DataLink.Active and ((DataLink.DataSet.RecNo = 1) or (DataLink.DataSet.recordcount = 0)))) then begin + Column := Columns[RawToDataColumn(Col)]; + if TCRColumn(Column).CanBeSorted then + ActivateEdit; + end; + VK_TAB: + if (dgTitles in Options) and (Row = 1) and (Col = IndicatorOffset) + and (Shift = [ssShift]) then begin + for i := Columns.Count - 1 downto 0 do + if TCRColumn(Columns[i]).CanBeSorted then begin + Column := Columns[i]; + MoveColRow(DataToRawColumn(i), TopRow, True, True); + Break; + end; + if Column <> nil then + ActivateEdit; + end; + VK_RETURN: begin + if SelectedField is TMemoField then begin + DoOnMemoClick(Columns[RawToDataColumn(Col)]); + Key := 0; + HideEditor; + end; + end; + end; + case Key of + VK_UP, VK_PRIOR, VK_DOWN, VK_NEXT, VK_HOME, VK_END : + InvalidateRect(Handle,{$IFNDEF CLR}@{$ENDIF}FStatusRect,False); + end; + + inherited; +end; + +function TCRDBGrid.CanEditShow: boolean; +begin + if (Columns.Count > 0) and Assigned(SelectedField) and (SelectedField is TMemoField) then + Result := False + else + Result := inherited CanEditShow; +end; + +procedure TCRDBGrid.TopLeftChanged; +{$IFDEF VER4} +var + R: TRect; + DrawInfo: TGridDrawInfo; +{$ENDIF} +begin + inherited; +{$IFDEF VER4} + if HandleAllocated and (dgTitles in Options) then + begin + CalcFixedInfo(DrawInfo); + R := Rect(0, 0, Width, DrawInfo.Vert.FixedBoundary); + InvalidateRect(Handle, {$IFNDEF CLR}@{$ENDIF}R, False); + end; +{$ENDIF} + InvalidateRect(Handle,{$IFNDEF CLR}@{$ENDIF}FStatusRect,False); +end; + +procedure TCRDBGrid.SetFiltered(const Value: boolean); +begin + if FFiltered <> Value then begin + FFiltered := Value; + FOptionsMenuDef.Items[0].Checked := FFiltered; + if (DataSource = nil) or (DataSource.DataSet = nil) then + Exit; + + if Value then + ApplyFilter; + if dgeLocalFilter in OptionsEx then + DataSource.DataSet.Filtered := Value + else begin + if not Value then + if DataLink.DataSet is TCustomDADataSet then + TCustomDADataSet(DataSource.DataSet).FilterSQL := ''; + end; + end +end; + +procedure TCRDBGrid.UpdateRowCount; +begin + with DataLink do + if Active and (RecordCount > 0) and HandleAllocated then begin + RowCount := 1000; + BufferCount := VisibleRowCount; + if dgTitles in Options then + RowCount := RecordCount + 1 + else + RowCount := RecordCount; + end; + Invalidate; +end; + +procedure TCRDBGrid.ApplyFilter; +var + i: integer; + St, FilterText: string; + OldActiveColumn: integer; +begin + if not FFiltered then + Exit; + + FilterText := ''; + for i := 0 to Columns.Count - 1 do begin + St := TCRColumn(Columns[i]).GetFilterExpression(TCRColumn(Columns[i]).FilterExpression); + if St <> '' then begin + if FilterText <> '' then + FilterText := FilterText + ' AND '; + FilterText := FilterText + St; + end; + end; + + if dgeLocalFilter in OptionsEx then begin + DataSource.DataSet.Filter := FilterText; + DataSource.DataSet.Filtered := FFiltered; +// TOraDataSet(DataSource.DataSet).Filtered := FilterText <> ''; + end + else + if DataSource.DataSet is TCustomDADataSet then begin + OldActiveColumn := -1; + if CRGridTitleEdit.FActiveColumn <> nil then + for i := 0 to Columns.Count - 1 do + if CRGridTitleEdit.FActiveColumn = Columns[i] then begin + OldActiveColumn := i; + Break; + end; + + CRGridTitleEdit.FActiveColumn := nil; + TCustomDADataSet(DataSource.DataSet).FilterSQL := FilterText; + + if OldActiveColumn <> -1 then + CRGridTitleEdit.FActiveColumn := Columns[OldActiveColumn]; + for i := 0 to High(CRGridTitleEdit.FFilterExpressions) do + TCRColumn(Columns[i]).FilterExpression := CRGridTitleEdit.FFilterExpressions[i]; + end; + + ResetTotals; + LoadTotals; +end; + +procedure TCRDBGrid.FilteredItemClick(Sender: TObject); +begin + Filtered := not Filtered; + (Sender as TMenuItem).Checked := FFiltered; +end; + +procedure TCRDBGrid.DoExit; +begin + inherited; + + if not FContinueEditingFilter then + CRGridTitleEdit.EditingFilter := False + else + FContinueEditingFilter := False; +end; + +procedure TCRDBGrid.MoveColRow(ACol, ARow: Longint; MoveAnchor, Show: Boolean); +begin + inherited MoveColRow(ACol, ARow, MoveAnchor, Show); +end; + +function TCRDBGrid.DataToRawColumn(ACol: Integer): Integer; +begin + Result := inherited DataToRawColumn(ACol); +end; + +procedure TCRDBGrid.InvalidateCol(ACol: Longint); +begin + inherited InvalidateCol(ACol); +end; + +procedure TCRDBGrid.InvalidateRow(ARow: Longint); +begin + inherited InvalidateRow(ARow); +end; + +procedure TCRDBGrid.AdjustColumns; +var + Width: array of integer; + i, j, OldActive: integer; + CurWidth: Integer; +begin + if not DataLink.Active then + Exit; + SetLength(Width, Columns.Count); + + OldActive := DataLink.ActiveRecord; + try + for i := TopRow - 1 to VisibleRowCount - 1 do begin + Datalink.ActiveRecord := i; + for j := 0 to Columns.Count - 1 do begin + if Assigned(Columns[j].Field) then + CurWidth := Canvas.TextWidth(Columns[j].Field.DisplayText) + else + CurWidth := 0; + if CurWidth > Width[j] then + Width[j] := CurWidth; + end; + end; + finally + DataLink.ActiveRecord := OldActive; + end; + + for i := 0 to Columns.Count - 1 do begin + CurWidth := Canvas.TextWidth(Columns[i].Title.Caption); + if CurWidth > Width[i] then + ColWidths[i + IndicatorOffset] := CurWidth + 4 + else + ColWidths[i + IndicatorOffset] := Width[i] + 4; + end; +end; + +function TCRDBGrid.GetColumns: TCRDBGridColumns; +begin + Result := TCRDBGridColumns(inherited Columns); +end; + +procedure TCRDBGrid.SetColumns(const Value: TCRDBGridColumns); +begin + inherited Columns.Assign(Value); +end; + +procedure TCRDBGrid.WMMouseWheel(var Message: TWMMouseWheel); +begin + if Message.WheelDelta > 0 then + SendMessage(Handle, WM_KEYDOWN, VK_UP, 0) + else + SendMessage(Handle, WM_KEYDOWN, VK_DOWN, 0); +end; + +procedure TCRDBGrid.TitleClick(Column: TColumn); +begin + if FTitleBarUp then + inherited TitleClick(Column); +end; + +{ TCRColumnTitle } + +function TCRColumnTitle.GetCaption: string; +begin + Result := inherited Caption; +end; + +function TCRColumnTitle.IsCaptionStored: boolean; +begin + Result := (cvTitleCaption in Column.AssignedValues) and + (Caption <> DefaultCaption); +end; + +procedure TCRColumnTitle.SetCaption(const Value: string); +begin + if Value <> inherited Caption then begin + inherited Caption := Value; + + TCRColumn(Column).ChangedTitle(True); + end; +end; + +{ TCRGridTitleEdit } + +procedure TCRGridTitleEdit.ActivateAt(ARect: TRect; ActiveColumn: TColumn; AsFilter: boolean); +begin + if not Assigned(CRDBGrid) then + Exit; + + try + StopEdit(True); + FEdit.Visible := False; + FAsFilter := AsFilter; + FActiveColumn := ActiveColumn; + SetClientRect(ARect); + + if AsFilter then begin + if EditingFilter then + Caption := FFilterExpressions[FActiveColumn.Index] + else + Caption := TCRColumn(FActiveColumn).FilterExpression; + end + else + Caption := ''; + finally + Visible := True; + SetFocus; + end; +end; + +constructor TCRGridTitleEdit.Create(AOwner: TComponent); +begin + inherited; + + if AOwner is TCRDBGrid then + CRDBGrid := AOwner as TCRDBGrid; + Visible := False; + AutoSize := False; + Anchors := Anchors + [akRight]; + Width := 0; + Height := 0; + + FEdit := TEdit.Create(Self); + FEdit.Visible := False; + FEdit.TabStop := False; + FEdit.BorderStyle := bsNone; + FEdit.Width := 0; + FEdit.Height := 0; + InsertControl(FEdit); + FEdit.Parent := Self; + FEdit.ParentFont := False; + FEdit.OnKeyPress := FEditKeyPress; + FEdit.OnKeyDown := FEditKeyDown; + FEdit.OnChange := FEditChange; + FEdit.OnExit := FEditExit; +end; + +procedure TCRGridTitleEdit.DoExit; +begin + inherited; + + FEdit.Visible := False; + Visible := False; +end; + +procedure TCRGridTitleEdit.FEditChange(Sender: TObject); +begin + if not FEdit.Modified then + Exit; + if FAsFilter then + EditingFilter := True + else + ProcessEdit; +end; + +procedure TCRGridTitleEdit.FEditExit(Sender: TObject); +begin + StopEdit(True); +end; + +procedure TCRGridTitleEdit.WMMouseWheel(var Message: TWMMouseWheel); +begin + if Message.WheelDelta > 0 then + SendMessage(Handle, WM_KEYDOWN, VK_UP, 0) + else + SendMessage(Handle, WM_KEYDOWN, VK_DOWN, 0); +end; + +procedure TCRGridTitleEdit.FEditKeyDown(Sender: TObject; var Key: word; + Shift: TShiftState); +var + OldKey: word; + OldWidth : integer; +begin + OldKey := Key; + Key := 0; + case OldKey of + VK_RETURN: begin + OldWidth := Self.Width; + StopEdit(True); + Self.Width := OldWidth; + Visible := True; + SetFocus; + end; + VK_ESCAPE: begin + StopEdit(False); + Visible := True; + SetFocus; + end; + VK_UP: + GotoUpperCell; + VK_DOWN: + GotoLowerCell; + VK_TAB: begin + if Shift = [ssShift] then + GotoPrevCell + else if Shift = [] then + GotoNextCell; + end; + else + Key := OldKey; + end; +end; + +procedure TCRGridTitleEdit.FEditKeyPress(Sender: TObject; var Key: char); +begin + if (Key = #13) or (Key = #27) then + Key := #0; +end; + +procedure TCRGridTitleEdit.GotoLowerCell; +begin + if Assigned(CRDBGrid) then begin + if FAsFilter then begin + StopEdit(True); + EditingFilter := False; + if dgeSearchBar in CRDBGrid.OptionsEx then begin + CRDBGrid.ActivateSearchEdit(FActiveColumn); + Exit; + end; + end; + with CRDBGrid do + if DataLink.Active then begin + Col := DataToRawColumn(FActiveColumn.Index); + DataLink.DataSet.MoveBy(TopRow - Row); + end; + CRDBGrid.SetFocus; + end; +end; + +procedure TCRGridTitleEdit.GotoNextCell; +var + i, Start: integer; +begin + if not (Assigned(FActiveColumn) and Assigned(CRDBGrid)) then + Exit; + StopEdit(True); + if FAsFilter then begin + Start := 0; + for i := FActiveColumn.Index + 1 to CRDBGrid.Columns.Count - 1 do + if TCRColumn(CRDBGrid.Columns[i]).CanBeSorted then begin + CRDBGrid.MoveColRow(CRDBGrid.DataToRawColumn(i), CRDBGrid.TopRow, True, True); + CRDBGrid.ActivateFilterEdit(CRDBGrid.Columns[i]); + Exit; + end; + EditingFilter := False; + end + else + Start := FActiveColumn.Index + 1; + + if dgeSearchBar in CRDBGrid.OptionsEx then + for i := Start to CRDBGrid.Columns.Count - 1 do + if TCRColumn(CRDBGrid.Columns[i]).CanBeSorted then begin + CRDBGrid.MoveColRow(CRDBGrid.DataToRawColumn(i), CRDBGrid.TopRow, True, True); + CRDBGrid.ActivateSearchEdit(CRDBGrid.Columns[i]); + Exit; + end; + + with CRDBGrid do + if DataLink.Active then begin + LeftCol := 1; + Col := DataToRawColumn(0); + DataLink.DataSet.MoveBy(TopRow - Row); + end; + CRDBGrid.SetFocus; +end; + +procedure TCRGridTitleEdit.GotoPrevCell; +var + i, Start: integer; +begin + if not (Assigned(FActiveColumn) and Assigned(CRDBGrid)) then + Exit; + + StopEdit(True); + if not FAsFilter then begin + Start := CRDBGrid.Columns.Count - 1; + for i := FActiveColumn.Index - 1 downto 0 do + if TCRColumn(CRDBGrid.Columns[i]).CanBeSorted then begin + CRDBGrid.MoveColRow(CRDBGrid.DataToRawColumn(i), CRDBGrid.TopRow, True, True); + CRDBGrid.ActivateSearchEdit(CRDBGrid.Columns[i]); + Exit; + end; + end + else + Start := FActiveColumn.Index - 1; + + if dgeFilterBar in CRDBGrid.OptionsEx then + for i := Start downto 0 do + if TCRColumn(CRDBGrid.Columns[i]).CanBeSorted then begin + CRDBGrid.MoveColRow(CRDBGrid.DataToRawColumn(i), CRDBGrid.TopRow, True, True); + CRDBGrid.ActivateFilterEdit(CRDBGrid.Columns[i]); + Exit; + end; +end; + +procedure TCRGridTitleEdit.GotoUpperCell; +begin + if not FAsFilter and (dgeFilterBar in CRDBGrid.OptionsEx) + and Assigned(CRDBGrid) + then begin + CRDBGrid.ActivateFilterEdit(FActiveColumn); + end; +end; + +procedure TCRGridTitleEdit.KeyDown(var Key: word; Shift: TShiftState); +var + OldKey: word; +begin + inherited; + + OldKey := Key; + Key := 0; + case OldKey of + VK_RETURN : + StartEdit; + VK_UP: + GotoUpperCell; + VK_DOWN: + GotoLowerCell; + VK_RIGHT: + GotoNextCell; + VK_LEFT: + GotoPrevCell; + VK_TAB: begin + if Shift = [ssShift] then + GotoPrevCell + else if Shift = [] then + GotoNextCell; + end; + VK_ESCAPE: + if EditingFilter then begin + SetLength(FFilterExpressions,0); + EditingFilter := False; + Caption := TCRColumn(FActiveColumn).FilterExpression; + CRDBGrid.InvalidateRow(0); + Invalidate; + end; + else + Key := OldKey; + end; +end; + +procedure TCRGridTitleEdit.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin + inherited; + + if Focused and (Button = mbLeft) then + StartEdit; +end; + +procedure TCRGridTitleEdit.PaintWindow(DC: HDC); +var + Rect: TRect; + Brush: THandle; + OldBrush: THandle; + OldFont: THandle; + BrushColor: TColor; + FontColor: TColor; +begin + Rect := GetClientRect; + if Focused then begin + BrushColor := clHighlight; + FontColor := clWhite; + end + else begin + BrushColor := Color; + FontColor := Font.Color; + end; + + Brush := CreateSolidBrush(ColorToRGB(BrushColor)); + try + OldBrush := SelectObject(DC, Brush); + FillRect(DC, Rect, Brush); + if Focused then + DrawFocusRect(DC, Rect); + InflateRect(Rect, -2, -2); + SetTextColor(DC, ColorToRGB(FontColor)); + SetBkColor(DC, ColorToRGB(BrushColor)); + OldFont := SelectObject(DC, Font.Handle); + DrawText(DC, PChar(Caption), Length(Caption), Rect, DT_LEFT or DT_VCENTER); + SelectObject(DC, OldFont); + SelectObject(DC, OldBrush); + finally + DeleteObject(Brush); + end; +end; + +procedure TCRGridTitleEdit.PostFilter; +var + i: integer; +begin + StopEdit(True); + if (CRDBGrid = nil) or (Length(FFilterExpressions) = 0) then + Exit; + for i := 0 to High(FFilterExpressions) do begin + TCRColumn(CRDBGrid.Columns[i]).FilterExpression := FFilterExpressions[i]; + end; + CRDBGrid.ApplyFilter; +end; + +procedure TCRGridTitleEdit.ProcessEdit; +begin + if (FActiveColumn = nil) or (CRDBGrid = nil) or not FEdit.Modified then + Exit; + + if FAsFilter then + with CRDBGrid do begin + try + TCRColumn(FActiveColumn).GetFilterExpression(FEdit.Text); + FFilterExpressions[FActiveColumn.Index] := FEdit.Text; + Self.Caption := FFilterExpressions[FActiveColumn.Index]; + except + on EConvertError do begin + FEdit.SelectAll; + raise; + end; + end; + end + else + try + with FActiveColumn.Field do + DataSet.Locate(FieldName, {$IFDEF CLR}Variant{$ENDIF}(FEdit.Text), [loCaseInsensitive,loPartialKey]); + except + on EConvertError do + Exit; + end; +end; + +procedure TCRGridTitleEdit.SetClientRect(ARect: TRect); +begin + Top := ARect.Top; + Left := ARect.Left; + Width := ARect.Right - ARect.Left; + Height := CRDBGrid.DefaultRowHeight; + FEdit.Top := 2; + FEdit.Left := 2; + FEdit.Width := Width - 2; + FEdit.Height := Height - 2; +end; + +procedure TCRGridTitleEdit.SetCRDBGrid(const Value: TCRDBGrid); +begin + FCRDBGrid := Value; +end; + +procedure TCRGridTitleEdit.SetEditingFilter(const Value: boolean); +var + i: integer; +begin + if FEditingFilter <> Value then begin + FEditingFilter := Value; + if Assigned(CRDBGrid) then begin + if not Value then begin + PostFilter; + CRDBGrid.FContinueEditingFilter := False; + end + else + with CRDBGrid do begin + SetLength(FFilterExpressions, Columns.Count); + for i := 0 to Columns.Count - 1 do + FFilterExpressions[i] := TCRColumn(Columns[i]).FilterExpression; + end; + end; + if Assigned(CRDBGrid) and (dgIndicator in CRDBGrid.Options) then + CRDBGrid.InvalidateCol(0); + end; +end; + +procedure TCRGridTitleEdit.SetFocus; +begin + inherited; + Invalidate; +end; + +procedure TCRGridTitleEdit.StartEdit; +begin + if CRDBGrid = nil then + Exit; + if FAsFilter then begin + FEdit.Text := Caption; + end + else + FEdit.Text := ''; + FEdit.Font := CRDBGrid.Font; + FEdit.Modified := False; + FEdit.Visible := True; + FEdit.SetFocus; + Invalidate; +end; + +procedure TCRGridTitleEdit.StopEdit(AcceptChanges: boolean); +begin + if not FEdit.Visible then + Exit; + if AcceptChanges then + ProcessEdit; + CRDBGrid.FContinueEditingFilter := EditingFilter; + FEdit.Modified := False; + FEdit.Visible := False; + if AcceptChanges then + EditingFilter := False; + Invalidate; +// Visible := True; +// SetFocus; +end; + +procedure TCRGridTitleEdit.WMChar(var Message: TWMChar); +begin + inherited; + + if (Message.CharCode > 0) and (Message.CharCode <> VK_TAB) + and (Message.CharCode <> VK_ESCAPE) + then begin + StartEdit; + if Message.CharCode <> VK_RETURN then + SendMessage(FEdit.Handle, Message.Msg , {$IFDEF VER9P}Message.CharCode{$ELSE}TMessage(Message).WParam{$ENDIF}, + {$IFDEF VER9P}Message.KeyData{$ELSE}TMessage(Message).LParam{$ENDIF}); + end; +end; + +procedure TCRGridTitleEdit.WMGetDlgCode(var Message: TWMGetDlgCode); +begin + Message.Result := Message.Result or DLGC_WANTARROWS; + if Assigned(CRDBGrid) and (dgTabs in CRDBGrid.Options) then + Message.Result := Message.Result or DLGC_WANTTAB; +end; + +{ TMemoEditorForm } + +function TMemoEditorForm.CloseQuery: boolean; +begin + Result := inherited CloseQuery; + if FMemo.Modified and (ModalResult <> mrOK) then + case MessageDlg(Format(fmtModifiedWarning,[Caption]), mtConfirmation, mbYesNoCancel, 0) of + mrYes: + ModalResult := mrOK; + mrCancel: + Result := False; + end; +end; + +constructor TMemoEditorForm.Create(AOwner: TComponent); +{$IFDEF CLR} +var + Cookie: LockCookie; +{$ENDIF} +begin +{$IFDEF CLR} + Cookie := GlobalNameSpace.UpgradeToWriterLock(MaxInt); + try + inherited CreateNew(AOwner); + finally + GlobalNameSpace.DowngradeFromWriterLock(Cookie); + end; +{$ELSE} + GlobalNameSpace.BeginWrite; + try + CreateNew(AOwner); + finally + GlobalNameSpace.EndWrite; + end; +{$ENDIF} + + Visible := False; + Position := poScreenCenter; + Width := 530; + Height := 308; + BorderStyle := bsSizeable; + BorderIcons := [biSystemMenu]; + ParentFont := True; + Constraints.MinHeight := 100; + Constraints.MinWidth := 260; + + FMemo := TMemo.Create(Self); + InsertControl(FMemo); + FMemo.Top := 0; + FMemo.Height := 270; + FMemo.Align := alTop; + FMemo.Anchors := FMemo.Anchors + [akBottom]; + FMemo.ScrollBars := ssBoth; + FMemo.OnKeyDown := MemoKeyDown; + + FCheckBox := TCheckBox.Create(Self); + InsertControl(FCheckBox); + FCheckBox.Caption := sWordWrap; + FCheckBox.Left := 8; + FCheckBox.Top := 282; + FCheckBox.Anchors := [akLeft, akBottom]; + FCheckBox.OnClick := CheckBoxClick; + + + FCancelBtn := TButton.Create(Self); + InsertControl(FCancelBtn); + FCancelBtn.Top := 278; + FCancelBtn.Left := Width - FCancelBtn.Width - 4; + FCancelBtn.Anchors := [akRight, akBottom]; + FCancelBtn.Caption := SCancel; + FCancelBtn.Cancel := True; + FCancelBtn.ModalResult := mrCancel; + + FOKBtn := TButton.Create(Self); + InsertControl(FOKBtn); + FOKBtn.Top := FCancelBtn.Top; + FOKBtn.Left := FCancelBtn.Left - FOKBtn.Width - 4; + FOKBtn.Anchors := [akRight, akBottom]; + FOKBtn.Caption := SOK; + FOKBtn.ModalResult := mrOK; + FOKBtn.TabOrder := 1; +end; + +procedure TMemoEditorForm.MemoKeyDown(Sender: TObject; var Key: word; + Shift: TShiftState); +begin + case key of + VK_RETURN: + if Shift = [ssCtrl] then + ModalResult := mrOK; + VK_ESCAPE: + ModalResult := mrCancel; + end; +end; + +procedure TMemoEditorForm.CheckBoxClick(Sender: tobject); +begin + FMemo.WordWrap := FCheckBox.Checked; +end; + +procedure TMemoEditorForm.SetReadOnly(const Value: boolean); +begin + if FReadOnly <> Value then begin + FReadOnly := Value; + FOKBtn.Visible := not Value; + FMemo.ReadOnly := Value; + if Value then + FCancelBtn.Caption := SClose + else + FCancelBtn.Caption := SCancel; + end; +end; + +{$IFDEF VER6P} +{ TCRGridDataLink } + +procedure TCRGridDataLink.DataSetChanged; +begin + inherited; + + if FDataSetChanging or (DataSet.State <> dsBrowse) then + Exit; + + FDataSetChanging := True; + try + TCRDBGrid(Grid).DataChanged; + finally + FDataSetChanging := False; + end; +end; +{$ENDIF} + +initialization + bmpSortAsc := TBitmap.Create; + bmpSortAsc.Handle := LoadBitmap(hInstance, 'SORTASC'); + bmpSortAsc.Transparent := True; + + bmpSortDesc := TBitmap.Create; + bmpSortDesc.Handle := LoadBitmap(hInstance, 'SORTDESC'); + bmpSortDesc.Transparent := True; + + bmpFilter := TBitmap.Create; + bmpFilter.Handle := LoadBitmap(hInstance, 'FILTER'); + bmpFilter.Transparent := True; + + bmpSearch := TBitmap.Create; + bmpSearch.Handle := LoadBitmap(hInstance, 'SEARCH'); + bmpSearch.Transparent := True; + + bmpMenu := TBitmap.Create; + bmpMenu.Handle := LoadBitmap(hInstance, 'MENU'); + bmpMenu.Transparent := True; + + bmpActiveFilter := TBitmap.Create; + bmpActiveFilter.Handle := LoadBitmap(hInstance, 'ACTIVE_FILTER'); + bmpActiveFilter.Transparent := True; + + bmpEditMode := TBitmap.Create; + bmpEditMode.Handle := LoadBitmap(hInstance, 'EDIT'); + bmpEditMode.Transparent := True; + +finalization + bmpSortDesc.Free; + bmpSortAsc.Free; + bmpFilter.Free; + bmpSearch.Free; + bmpMenu.Free; + bmpActiveFilter.Free; + bmpEditMode.Free; +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/CRGrid.res b/internal/4.10.0.10/1/CRGrid/Source/CRGrid.res new file mode 100644 index 0000000000000000000000000000000000000000..0c33e79098d5f81df48d59a9b29717b8c25d5f13 GIT binary patch literal 1668 zcmd5+yG{c^3>*+efFfz>5LJXIC@G1!Adq+o0;1y=C?XwQESlSnf1sp+k}{vdC!DD0 zmhpNm2suO~goG3C*z3K=?063VR_QUCGn}wzW*hVv=W&K(oMM0;qn*5}(^*{b3%U%J zvd_V$PrNvV0`LzJ1C9*og7J9Fg1(SKG~j6O7!lN1a;##EZ_KNkaHklEsa}SdunKR6 zBf~J7xL!GK(m!)7(Er2|_zygTzju{+I4|d!dHX(8Wm(?ne&qdnV(eP(Vjl<8vQI_b zI-QjTkGl*Ov%8jiUYtUqaGa!e2{u=!pfc5mP>@V|vDLyWSSg59_vJ zQ6wA{$F?r!^+hp}vz<%5ZcO)m=%ZjK4>)7iv=7TH`956w!YLGz=A@9ng8mo?habO3 zFunLuNgMKO%=gptxo>Cf<5}o%hE{;N*mfl2xJx92w5WJ9IPO ZZ}9fs>g$hPeZ=ji&NZI$R}_Zf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.bdsproj b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.bdsproj new file mode 100644 index 0000000..9c01c6f --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.bdsproj @@ -0,0 +1,220 @@ + + + + + + + + + + + + CoreLab.Vcl.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Vcl;CoreLab.Dac + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + Core Lab VCL + False + + + + . + + . + ..\;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\dexter\dac\source\delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;D:\Projects\Dexter\Dac\Source + d:\winnt\microsoft.net\framework\v1.1.4322\System.Drawing.dll;Borland.VclDbCtrls;Borland.Vcl;Borland.Delphi;CoreLab.Dac + + + False + + + + + + False + + + + + + False + + True + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 4010 + False + False + False + False + False + 1058 + 1251 + + + + + 6.10.1.10 + + + + + + 6.10.1.10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.cfg b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.cfg new file mode 100644 index 0000000..1319a36 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.cfg @@ -0,0 +1,42 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Vcl;CoreLab.Dac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N0"." +-LN"." +-U"..\;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\dexter\dac\source\delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;D:\Projects\Dexter\Dac\Source" +-O"..\;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\dexter\dac\source\delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;D:\Projects\Dexter\Dac\Source" +-I"..\;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\dexter\dac\source\delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;D:\Projects\Dexter\Dac\Source" +-R"..\;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\dexter\dac\source\delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;D:\Projects\Dexter\Dac\Source" +-Z diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.dpk new file mode 100644 index 0000000..1a07250 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.dpk @@ -0,0 +1,96 @@ +package CoreLab.Vcl; + +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab VCL'} +{$IMPLICITBUILD OFF} + +requires + CoreLab.Dac, + Borland.Delphi, + Borland.Vcl, + Borland.VclDbCtrls, + System.Drawing; + +contains + CoreLab.Vcl.CRControlsReg in '..\Net\CoreLab.Vcl.CRControlsReg.pas', + CoreLab.Vcl.CRGrid in '..\Net\CoreLab.Vcl.CRGrid.pas'; + +[assembly: AssemblyTitle('Core Lab VCL')] +[assembly: AssemblyDescription('Core Lab VCL')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab VCL')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.4010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.reg b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.reg new file mode 100644 index 0000000..7e8b4e5 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.Vcl.reg @@ -0,0 +1,7 @@ +REGEDIT4 + +[HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Known Assemblies] +"[INSTALLDIR]Bin\\CoreLab.Vcl.dll"="CoreLab.Vcl" + +[HKEY_CURRENT_USER\Software\Borland\BDS\4.0\AssemblyFolders\CoreLab.Vcl] +@="[IDEPATH4]bin" diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.snk b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/CoreLab.snk new file mode 100644 index 0000000000000000000000000000000000000000..a57bc467407973793ee7a190cbd511e0316fa2d8 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098WS12}^Vri-N`^e-H8W!1v1<_hKL*y#z zWs+>`?@Sl4<#}qsF}kWu(2WxIbBDuPa%Wm)!ds0u-7HQ02kl_bAoxF0)4}T0-Vo=0 zW*JR>psF-Vaw@NgO)}=)U%sb{b!TdKNj?RYx}b$sjIHy*99Icv{#?Csyg zWmcNDzx37Mjg)FDF-v+ykWH14BXK|4$Ox$KZvx-voRz@w0qRHTrxX<;|K>@@r69#Gf;_7$p`1q5)ZLhlr>peLXVE^JaR<^qeh?6W=SpzD89) z3D2bc*FIQ64B7W*x<7kNkJ*^CbsMZQWsvGL@djSae@f#6-(tIOe8V$+GwXJGJ|; zLb$_SiZ5%`{U$=>Cf=IB))a-g`RT&J>pFG-3<0(3pL=(^Oid*2tFX@sBTnb#A5?g9 i6n4$%54lpp9 + + + + + + + + + + + CRControls100.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + + + + 0 + 44 + 1 + False + False + False + 16384 + 1048576 + 4194304 + CoreLab Controls + False + + + + . + + . + ..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\;..\..\..\Odac\source;..\..\..\ODac\source\Delphi10;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\ + + + + False + + + + + + False + + + + + + False + + True + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 4010 + False + False + False + False + False 1033 + 1252 + + + Core Lab + + 6.10.1.10 + + + + + Core Lab Controls + 6.10.1.10 + + File D:\Program Files\Borland\BDS\4.0\Bin\dacvcl100.bpl not found + File D:\Program Files\Borland\BDS\4.0\Bin\dcldac100.bpl not found + + + diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi10/crcontrols100.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/crcontrols100.dpk new file mode 100644 index 0000000..97e20c3 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi10/crcontrols100.dpk @@ -0,0 +1,39 @@ +package CRControls100; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'CoreLab Controls'} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + dbrtl, + vcldb, + designide, + dac100; + +contains + CRControlsReg in '..\CRControlsReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CRControls105.res b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CRControls105.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.bdsproj b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.bdsproj new file mode 100644 index 0000000..365bc27 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.bdsproj @@ -0,0 +1,203 @@ + + + + + + + + + + + + CoreLab.Vcl.dpk + + + + + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac;CoreLab.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 4096 + 1048576 + 4194304 + Core Lab VCL + + + + + + + D:\Projects\Delphi\CRControls\Source\Delphi11;D:\Program Files\Common Files\Borland Shared\BDS\Shared Assemblies\5.0;D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 + D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll;Borland.VclDbCtrls;Borland.Vcl;Borland.Delphi;D:\Projects\Delphi\CRControls\Source\Delphi11\CoreLab.Dac.dll + + + False + + + + + + False + + + True + False + + + False + + + True + False + 6 + 10 + 1 + 5010 + False + False + False + False + False + 1049 + 1251 + + + + + 6.10.1.10 + + + + + + 6.10.1.10 + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.cfg b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.cfg new file mode 100644 index 0000000..076e430 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.cfg @@ -0,0 +1,39 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.Vcl +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-U"D:\Projects\Delphi\CRControls\Source\Delphi11;D:\Program Files\Common Files\Borland Shared\BDS\Shared Assemblies\5.0;D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727" +-O"D:\Projects\Delphi\CRControls\Source\Delphi11;D:\Program Files\Common Files\Borland Shared\BDS\Shared Assemblies\5.0;D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727" +-I"D:\Projects\Delphi\CRControls\Source\Delphi11;D:\Program Files\Common Files\Borland Shared\BDS\Shared Assemblies\5.0;D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727" +-R"D:\Projects\Delphi\CRControls\Source\Delphi11;D:\Program Files\Common Files\Borland Shared\BDS\Shared Assemblies\5.0;D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727" +-Z diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.dpk new file mode 100644 index 0000000..f4bc59a --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.Vcl.dpk @@ -0,0 +1,96 @@ +package CoreLab.Vcl; + +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab VCL'} +{$IMPLICITBUILD OFF} + +requires + CoreLab.Dac, + Borland.Delphi, + Borland.Vcl, + Borland.VclDbCtrls, + System.Drawing; + +contains + CoreLab.Vcl.CRControlsReg in '..\Net\CoreLab.Vcl.CRControlsReg.pas', + CoreLab.Vcl.CRGrid in '..\Net\CoreLab.Vcl.CRGrid.pas'; + +[assembly: AssemblyTitle('Core Lab VCL')] +[assembly: AssemblyDescription('Core Lab VCL')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab VCL')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.5010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.snk b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/CoreLab.snk new file mode 100644 index 0000000000000000000000000000000000000000..a57bc467407973793ee7a190cbd511e0316fa2d8 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098WS12}^Vri-N`^e-H8W!1v1<_hKL*y#z zWs+>`?@Sl4<#}qsF}kWu(2WxIbBDuPa%Wm)!ds0u-7HQ02kl_bAoxF0)4}T0-Vo=0 zW*JR>psF-Vaw@NgO)}=)U%sb{b!TdKNj?RYx}b$sjIHy*99Icv{#?Csyg zWmcNDzx37Mjg)FDF-v+ykWH14BXK|4$Ox$KZvx-voRz@w0qRHTrxX<;|K>@@r69#Gf;_7$p`1q5)ZLhlr>peLXVE^JaR<^qeh?6W=SpzD89) z3D2bc*FIQ64B7W*x<7kNkJ*^CbsMZQWsvGL@djSae@f#6-(tIOe8V$+GwXJGJ|; zLb$_SiZ5%`{U$=>Cf=IB))a-g`RT&J>pFG-3<0(3pL=(^Oid*2tFX@sBTnb#A5?g9 i6n4$%54lpp9 + + + + + + + + + + + crcontrols105.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 44 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + CoreLab Controls + + + + + + + + + + + False + + + + + + False + + + True + False + + + False + + + True + False + 6 + 10 + 1 + 5010 + False + False + False + False + False + 1033 + 1252 + + + Core Lab + + 6.10.1.10 + + + + + Core Lab Controls + 6.10.1.10 + + + + + diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi11/crcontrols105.cfg b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/crcontrols105.cfg new file mode 100644 index 0000000..affd769 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/crcontrols105.cfg @@ -0,0 +1,42 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-JL +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N0"." +-LE"D:\Documents and Settings\AlexH\My Documents\Borland Studio Projects\Bpl" +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi11;..\;..\..\..\Odac\source;..\..\..\ODac\source\Delphi11;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi11;..\;..\..\..\Odac\source;..\..\..\ODac\source\Delphi11;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi11;..\;..\..\..\Odac\source;..\..\..\ODac\source\Delphi11;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi11;..\;..\..\..\Odac\source;..\..\..\ODac\source\Delphi11;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\" +-Z diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi11/crcontrols105.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/crcontrols105.dpk new file mode 100644 index 0000000..9f5af2a --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi11/crcontrols105.dpk @@ -0,0 +1,39 @@ +package CRControls105; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'CoreLab Controls'} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + dbrtl, + vcldb, + designide, + dac105; + +contains + CRControlsReg in '..\CRControlsReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.cfg b/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.cfg new file mode 100644 index 0000000..3b78e1d --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi5\Projects\Bpl" +-LN"." +-U"..\..\..\Dac\Source;..\..\..\DBAccess\Source;..\..\..\DBAccess\Source\Delphi5;..\..\..\Dac\Source\Delphi5;..\" +-O"..\..\..\Dac\Source;..\..\..\DBAccess\Source;..\..\..\DBAccess\Source\Delphi5;..\..\..\Dac\Source\Delphi5;..\" +-I"..\..\..\Dac\Source;..\..\..\DBAccess\Source;..\..\..\DBAccess\Source\Delphi5;..\..\..\Dac\Source\Delphi5;..\" +-R"..\..\..\Dac\Source;..\..\..\DBAccess\Source;..\..\..\DBAccess\Source\Delphi5;..\..\..\Dac\Source\Delphi5;..\" +-Z diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.dof b/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.dof new file mode 100644 index 0000000..6c46c43 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.dof @@ -0,0 +1,110 @@ +[Compiler] +A=1 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=Core Lab Controls +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\;..\..\..\ODac\source;..\..\..\ODac\source\delphi5 +Packages=vclx30;VCL30;vcldb30;vcldbx30;inetdb30;inet30;VclSmp30;Qrpt30;teeui30;teedb30;tee30;dss30;IBEVNT30;Vcl40;Vcldb40 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=Core Lab Controls +ProductVersion=6.10.1.10 +Comments= +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(DELPHI)\source\vcl;$(DELPHI)\source\rtl\Corba;$(DELPHI)\source\rtl\Sys;$(DELPHI)\source\rtl\Win;$(DELPHI)\source\Internet +[HistoryLists\hlConditionals] +Count=1 +Item0=ODAC +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=14 +Item0=.. +Item1=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\;..\Net;$(DELPHI)\Source\Property Editors +Item2=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\ +Item3=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\;..\Net +Item4=..\;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\Net;$(DELPHI)\Source\Property Editors +Item5=..;$(DELPHI)\source\toolsapi +Item6=..\..\..\Dac\Source;..\;..\Net;$(DELPHI)\Source\Property Editors +Item7=..\..\..\Dac\Source;..\;..\Net +Item8=..\;..\..\..\Dac\Source;..\..\..\ODAC\source;..\..\..\ODAC\source\delphi5 +Item9=$(DELPHI)\Lib\Debug;..\ +Item10=$(DELPHI)\Lib\Debug +Item11=$(DELPHI)\Lib\Debug;$(DELPHI)\source\vcl +Item12=$(DELPHI)\Lib\Debug;$(DELPHI)\source\vcl;$(DELPHI)\source\rtl\Corba;$(DELPHI)\source\rtl\Win;$(DELPHI)\source\Internet +Item13=$(DELPHI)\Lib\Debug;$(DELPHI)\source\vcl;$(DELPHI)\source\rtl\Corba;$(DELPHI)\source\rtl\Sys;$(DELPHI)\source\rtl\Win;$(DELPHI)\source\Internet +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlDCPOutput] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.dpk new file mode 100644 index 0000000..a11f9d7 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.dpk @@ -0,0 +1,36 @@ +package CRControls50; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Controls'} +{$IMPLICITBUILD OFF} + +requires + vcl50, + Vcldb50, + dac50; + +contains + CRControlsReg in '..\CRControlsReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.res b/internal/4.10.0.10/1/CRGrid/Source/Delphi5/crcontrols50.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.cfg b/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.cfg new file mode 100644 index 0000000..72d476e --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi6\Projects\Bpl" +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\;..\..\..\DBAccess\Source;..\..\..\DBAccess\Source\Delphi6" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\;..\..\..\DBAccess\Source;..\..\..\DBAccess\Source\Delphi6" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\;..\..\..\DBAccess\Source;..\..\..\DBAccess\Source\Delphi6" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\;..\..\..\DBAccess\Source;..\..\..\DBAccess\Source\Delphi6" +-Z diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.dof b/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.dof new file mode 100644 index 0000000..240596d --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.dof @@ -0,0 +1,108 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=CoreLab Controls +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\;..\..\..\ODAC\source;..\..\..\ODAC\source\Delphi6 +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=Core Lab Controls +ProductVersion=6.10.1.10 +Comments= +[HistoryLists\hlConditionals] +Count=1 +Item0=ODAC +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=10 +Item0=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\;..\..\..\ODAC\source;..\..\..\ODAC\source\Delphi6 +Item1=..\;..\OraMemo;..\CRGrid;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\..\..\ODAC\source;..\..\..\ODAC\source\Delphi6;$(DELPHI)\Source\Property Editors +Item2=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\ +Item3=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\;..\Net;$(DELPHI)\Source\ToolsAPI;$(DELPHI)\Source\Property Editors +Item4=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\;..\Net +Item5=..\;$(DELPHI)\Source\ToolsAPI +Item6=..\ +Item7=..\;..\OraMemo;..\CRGrid;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\..\..\ODAC\source;..\..\..\ODAC\source\Delphi6;$(DELPHI)\Source\Property Editors;$(DELPHI)\Source\ToolsApi +Item8=..\;..\..\..\Dac\Source;..\Net;..\..\SQLDes\D6;..\..\..\SQLDes;..\..\..\Common;..\..\OraMemo;..\..\..\OraDream;$(DELPHI)\Source\ToolsAPI;$(DELPHI)\Source\Property Editors +Item9=..\;..\..\..\Dac\Source;..\Net;..\..\SQLDes\D6;..\..\..\SQLDes;..\..\..\Common;..\..\OraMemo;..\..\..\OraDream;$(DELPHI)\Source\Property Editors +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlDCPOutput] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.dpk new file mode 100644 index 0000000..6b05abe --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.dpk @@ -0,0 +1,38 @@ +package CRControls60; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'CoreLab Controls'} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + dbrtl, + vcldb, + dac60; + +contains + CRControlsReg in '..\CRControlsReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.res b/internal/4.10.0.10/1/CRGrid/Source/Delphi6/crcontrols60.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.cfg b/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.cfg new file mode 100644 index 0000000..3521e66 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi7\Projects\Bpl" +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\;..\..\..\ODac\source;..\..\..\ODac\source\Delphi7" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\;..\..\..\ODac\source;..\..\..\ODac\source\Delphi7" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\;..\..\..\ODac\source;..\..\..\ODac\source\Delphi7" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\;..\..\..\ODac\source;..\..\..\ODac\source\Delphi7" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.dof b/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.dof new file mode 100644 index 0000000..97c9390 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.dof @@ -0,0 +1,150 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=CoreLab Controls +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\;..\..\..\ODac\source;..\..\..\ODac\source\Delphi7 +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=Core Lab Controls +ProductVersion=6.10.1.10 +Comments= +[HistoryLists\hlConditionals] +Count=1 +Item0=SDAC_TEST;DEBUG +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=3 +Item0=$(DELPHI)\Lib\Debug;D:\Projects\Delphi\Sdac2\Source +Item1=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\;..\..\..\ODAC\source;..\..\..\ODAC\source\Delphi7 +Item2=$(DELPHI)\Lib\Debug +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlOutputDirectorry] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.dpk new file mode 100644 index 0000000..2937dbf --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.dpk @@ -0,0 +1,38 @@ +package CRControls70; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'CoreLab Controls'} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + dbrtl, + vcldb, + dac70; + +contains + CRControlsReg in '..\CRControlsReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.res b/internal/4.10.0.10/1/CRGrid/Source/Delphi7/crcontrols70.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.bdsproj b/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.bdsproj new file mode 100644 index 0000000..d574903 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.bdsproj @@ -0,0 +1,170 @@ + + + + + + + + + + + + CoreLab.Vcl.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Vcl;CoreLab.Dac + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + Core Lab VCL + + + + . + + . + d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\winnt\microsoft.net\framework\v1.1.4322 + d:\winnt\microsoft.net\framework\v1.1.4322\System.Drawing.dll;Borland.VclDbCtrls;CoreLab.Dac;Borland.Vcl;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 2010 + False + False + False + False + False + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.cfg b/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.cfg new file mode 100644 index 0000000..7384060 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.cfg @@ -0,0 +1,42 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Vcl;CoreLab.Dac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\winnt\microsoft.net\framework\v1.1.4322" +-O"d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\winnt\microsoft.net\framework\v1.1.4322" +-I"d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\winnt\microsoft.net\framework\v1.1.4322" +-R"d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\winnt\microsoft.net\framework\v1.1.4322" +-Z diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.dpk new file mode 100644 index 0000000..e26e362 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.dpk @@ -0,0 +1,96 @@ +package CoreLab.Vcl; + +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab VCL'} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + Borland.Vcl, + CoreLab.Dac, + Borland.VclDbCtrls, + System.Drawing; + +contains + CoreLab.Vcl.CRControlsReg in '..\Net\CoreLab.Vcl.CRControlsReg.pas', + CoreLab.Vcl.CRGrid in '..\Net\CoreLab.Vcl.CRGrid.pas'; + +[assembly: AssemblyTitle('Core Lab VCL')] +[assembly: AssemblyDescription('Core Lab VCL')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab VCL')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.2010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.reg b/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.reg new file mode 100644 index 0000000..4c1e956 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.Vcl.reg @@ -0,0 +1,7 @@ +REGEDIT4 + +[HKEY_CURRENT_USER\Software\Borland\BDS\2.0\Known Assemblies] +"[INSTALLDIR]Bin\\CoreLab.Vcl.dll"="CoreLab.Vcl" + +[HKEY_CURRENT_USER\Software\Borland\BDS\2.0\AssemblyFolders\CoreLab.Vcl] +@="[INSTALLDIR]Bin" diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.snk b/internal/4.10.0.10/1/CRGrid/Source/Delphi8/CoreLab.snk new file mode 100644 index 0000000000000000000000000000000000000000..a57bc467407973793ee7a190cbd511e0316fa2d8 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098WS12}^Vri-N`^e-H8W!1v1<_hKL*y#z zWs+>`?@Sl4<#}qsF}kWu(2WxIbBDuPa%Wm)!ds0u-7HQ02kl_bAoxF0)4}T0-Vo=0 zW*JR>psF-Vaw@NgO)}=)U%sb{b!TdKNj?RYx}b$sjIHy*99Icv{#?Csyg zWmcNDzx37Mjg)FDF-v+ykWH14BXK|4$Ox$KZvx-voRz@w0qRHTrxX<;|K>@@r69#Gf;_7$p`1q5)ZLhlr>peLXVE^JaR<^qeh?6W=SpzD89) z3D2bc*FIQ64B7W*x<7kNkJ*^CbsMZQWsvGL@djSae@f#6-(tIOe8V$+GwXJGJ|; zLb$_SiZ5%`{U$=>Cf=IB))a-g`RT&J>pFG-3<0(3pL=(^Oid*2tFX@sBTnb#A5?g9 i6n4$%54lpp9f&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.bdsproj b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.bdsproj new file mode 100644 index 0000000..15f0a38 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.bdsproj @@ -0,0 +1,170 @@ + + + + + + + + + + + + CoreLab.Vcl.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Vcl;CoreLab.Dac + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + Core Lab VCL + + + + . + + . + ..\;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9;d:\winnt\microsoft.net\framework\v1.1.4322 + d:\winnt\microsoft.net\framework\v1.1.4322\System.Drawing.dll;Borland.VclDbCtrls;CoreLab.Dac;Borland.Vcl;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 3010 + False + False + False + False + False + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.cfg b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.cfg new file mode 100644 index 0000000..547855a --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.cfg @@ -0,0 +1,42 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Vcl;CoreLab.Dac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9;d:\winnt\microsoft.net\framework\v1.1.4322" +-O"..\;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9;d:\winnt\microsoft.net\framework\v1.1.4322" +-I"..\;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9;d:\winnt\microsoft.net\framework\v1.1.4322" +-R"..\;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9;d:\winnt\microsoft.net\framework\v1.1.4322" +-Z diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.dpk new file mode 100644 index 0000000..b8fb23a --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.dpk @@ -0,0 +1,96 @@ +package CoreLab.Vcl; + +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab VCL'} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + Borland.Vcl, + CoreLab.Dac, + Borland.VclDbCtrls, + System.Drawing; + +contains + CoreLab.Vcl.CRControlsReg in '..\Net\CoreLab.Vcl.CRControlsReg.pas', + CoreLab.Vcl.CRGrid in '..\Net\CoreLab.Vcl.CRGrid.pas'; + +[assembly: AssemblyTitle('Core Lab VCL')] +[assembly: AssemblyDescription('Core Lab VCL')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab VCL')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.3010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.reg b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.reg new file mode 100644 index 0000000..a3cf991 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.Vcl.reg @@ -0,0 +1,7 @@ +REGEDIT4 + +[HKEY_CURRENT_USER\Software\Borland\BDS\3.0\Known Assemblies] +"[INSTALLDIR]Bin\\CoreLab.Vcl.dll"="CoreLab.Vcl" + +[HKEY_CURRENT_USER\Software\Borland\BDS\3.0\AssemblyFolders\CoreLab.Vcl] +@="[INSTALLDIR]Bin" diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.snk b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/CoreLab.snk new file mode 100644 index 0000000000000000000000000000000000000000..a57bc467407973793ee7a190cbd511e0316fa2d8 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098WS12}^Vri-N`^e-H8W!1v1<_hKL*y#z zWs+>`?@Sl4<#}qsF}kWu(2WxIbBDuPa%Wm)!ds0u-7HQ02kl_bAoxF0)4}T0-Vo=0 zW*JR>psF-Vaw@NgO)}=)U%sb{b!TdKNj?RYx}b$sjIHy*99Icv{#?Csyg zWmcNDzx37Mjg)FDF-v+ykWH14BXK|4$Ox$KZvx-voRz@w0qRHTrxX<;|K>@@r69#Gf;_7$p`1q5)ZLhlr>peLXVE^JaR<^qeh?6W=SpzD89) z3D2bc*FIQ64B7W*x<7kNkJ*^CbsMZQWsvGL@djSae@f#6-(tIOe8V$+GwXJGJ|; zLb$_SiZ5%`{U$=>Cf=IB))a-g`RT&J>pFG-3<0(3pL=(^Oid*2tFX@sBTnb#A5?g9 i6n4$%54lpp9 + + + + + + + + + + + CRControls90.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + CoreLab Controls + + + + . + + . + ..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\;..\..\..\Odac\source;..\..\..\ODac\source\Delphi9;D:\Program Files\Borland\BDS\3.0\source\ToolsAPI\ + rtl;vcl;dbrtl;vcldb;vclx;dclado90;dbxcds;dbexpress;dclib90;dclindy90;xmlrtl;inet;inetdbbde;inetdbxpress;soaprtl;dsnap;dcl31w90;inetdb;bdertl;vcldbx;dclie90;webdsnap;websnap;dss;teeui;teedb;tee;dcldbxcds90;dclact90;dsnapcon;odacvcl90;odac90;CRControls90;dac90;oraprov90;dacvcl90;dcldac90 + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 3010 + False + False + False + False + False + + + + + Core Lab + + 6.10.1.10 + + + + + + 6.10.1.10 + + + diff --git a/internal/4.10.0.10/1/CRGrid/Source/Delphi9/crcontrols90.dpk b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/crcontrols90.dpk new file mode 100644 index 0000000..1692eef --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Delphi9/crcontrols90.dpk @@ -0,0 +1,39 @@ +package CRControls90; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'CoreLab Controls'} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + dbrtl, + vcldb, + dac90, + designide; + +contains + CRControlsReg in '..\CRControlsReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/CRGrid/Source/Net/CRGrid.inc b/internal/4.10.0.10/1/CRGrid/Source/Net/CRGrid.inc new file mode 100644 index 0000000..16825eb --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Net/CRGrid.inc @@ -0,0 +1 @@ +{$I ..\CRGrid.inc} diff --git a/internal/4.10.0.10/1/CRGrid/Source/Net/CoreLab.Vcl.CRControlsReg.pas b/internal/4.10.0.10/1/CRGrid/Source/Net/CoreLab.Vcl.CRControlsReg.pas new file mode 100644 index 0000000..f703569 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Net/CoreLab.Vcl.CRControlsReg.pas @@ -0,0 +1,17 @@ +{$I ..\CRGrid.inc} + +unit CoreLab.Vcl.CRControlsReg; + +{$IFDEF VER9P} + +{$R ..\..\Images\CoreLab.Vcl.CRGrid.TCRDBGrid.bmp} +{$R ..\..\Images\CoreLab.Vcl.CRGrid.TCRDBGrid16.bmp} +{$R ..\..\Images\CoreLab.Vcl.CRGrid.TCRDBGrid32.bmp} + +{$ELSE} + +{$R ..\..\Images\Delphi8\CoreLab.Vcl.CRGrid.TCRDBGrid.bmp} + +{$ENDIF} + +{$I ..\CRControlsReg.pas} diff --git a/internal/4.10.0.10/1/CRGrid/Source/Net/CoreLab.Vcl.CRGrid.pas b/internal/4.10.0.10/1/CRGrid/Source/Net/CoreLab.Vcl.CRGrid.pas new file mode 100644 index 0000000..a8af055 --- /dev/null +++ b/internal/4.10.0.10/1/CRGrid/Source/Net/CoreLab.Vcl.CRGrid.pas @@ -0,0 +1,5 @@ +{$I ..\CRGrid.inc} + +unit CoreLab.Vcl.CRGrid; + +{$I ..\CRGrid.pas} diff --git a/internal/4.10.0.10/1/DbToolsInterfaces/CoreLab.DbTools.Interfaces.dll b/internal/4.10.0.10/1/DbToolsInterfaces/CoreLab.DbTools.Interfaces.dll new file mode 100644 index 0000000000000000000000000000000000000000..18e50a393fd4aaaa5df27ac7f3c59e2ae348f3a7 GIT binary patch literal 94208 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/InstallDemoObjects.sql b/internal/4.10.0.10/1/Demos/InstallDemoObjects.sql new file mode 100644 index 0000000..f1bfcec --- /dev/null +++ b/internal/4.10.0.10/1/Demos/InstallDemoObjects.sql @@ -0,0 +1,155 @@ +CREATE TABLE SDAC_Long_char ( + Code INT IDENTITY (1, 1) PRIMARY KEY, + Title VARCHAR(30), + Value VARCHAR(5000) +); + +CREATE TABLE SDAC_Pictures ( + UID int IDENTITY (1, 1) PRIMARY KEY NOT NULL, + Name VARCHAR(50), + Picture IMAGE +); + +CREATE TABLE Loaded1 ( + uid INT IDENTITY (1, 1) NOT NULL PRIMARY KEY, + Field1 VARCHAR(20), + Field2 VARCHAR(20), + Field3 VARCHAR(20) +); + +CREATE TABLE Loaded2 ( + uid INT IDENTITY (1, 1) NOT NULL PRIMARY KEY, + Field1 VARCHAR(20), + Field2 VARCHAR(20), + Field3 VARCHAR(20) +); + +CREATE TABLE ThreadTable ( + ID INT, + NAME VARCHAR(30) +); + +CREATE TABLE SDAC_Text ( + UID INT IDENTITY PRIMARY KEY, + [Name] NVARCHAR(50), + TextField NTEXT +); + +CREATE TABLE Sdac_Loaded ( + Code INT, + Num INT, + Num1 FLOAT, + Str VARCHAR(50), + Dat DATETIME +); + +CREATE TABLE CRGRID_TEST( + Id int PRIMARY KEY, + Name VARCHAR(10), + Country VARCHAR(30), + City VARCHAR(30), + Street VARCHAR(30), + BirthDate DATETIME, + Job VARCHAR(9), + Hiredate DATETIME, + Sal NUMERIC(7, 2), + Remarks TEXT +); + +INSERT INTO CRGRID_TEST + (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sal) +VALUES + (5001, 'SMITH', 'ENGLAND', 'LONDON', 'BOND st.', '12-OCT-63', 'CLERK','17-DEC-80', 800); +INSERT INTO CRGRID_TEST + (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sal) +VALUES + (5002, 'ALLEN', 'ENGLAND', 'LONDON', 'BAKER st.', '04-MAR-61', 'SALESMAN','20-FEB-81', 1600); +INSERT INTO CRGRID_TEST + (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sal) +VALUES + (5003, 'MARTIN', 'FRANCE', 'LION', 'WEAVER st.', '23-JAN-57', 'MANAGER','02-APR-81', 2900); + + CREATE TABLE DEPT ( + DEPTNO INT PRIMARY KEY, + DNAME VARCHAR(14), + LOC VARCHAR(13) +); +INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK'); +INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS'); +INSERT INTO DEPT VALUES (30,'SALES','CHICAGO'); +INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON'); + +CREATE TABLE emp ( + EMPNO int IDENTITY(1,1) NOT NULL PRIMARY KEY, + ENAME varchar(10) default NULL, + JOB varchar(9) default NULL, + MGR int default NULL, + HIREDATE datetime default NULL, + SAL float default NULL, + COMM float default NULL, + DEPTNO int default NULL + ); +INSERT INTO emp VALUES ('SMITH', 'CLERK', 7902, '1980-12-17 00:00:00', 800, NULL, 20); +INSERT INTO emp VALUES ('ALLEN', 'SALESMAN', 7698, '1981-02-20 00:00:00', 1600, 300, 30); +INSERT INTO emp VALUES ('WARD', 'SALESMAN', 7698, '1981-02-22 00:00:00', 1250, 500, 30); +INSERT INTO emp VALUES ('JONES', 'MANAGER', 7839, '1981-04-02 00:00:00', 2975, NULL, 20); +INSERT INTO emp VALUES ('MARTIN', 'SALESMAN', 7698, '1981-09-28 00:00:00', 1250, 1400, 30); +INSERT INTO emp VALUES ('BLAKE', 'MANAGER', 7839, '1981-05-01 00:00:00', 2850, NULL, 30); +INSERT INTO emp VALUES ('CLARK', 'MANAGER', 7839, '1981-06-09 00:00:00', 2450, NULL, 10); +INSERT INTO emp VALUES ('SCOTT', 'ANALYST', 7566, '1987-07-13 00:00:00', 3000, NULL, 20); +INSERT INTO emp VALUES ('KING', 'PRESIDENT', NULL, '1981-11-17 00:00:00', 5000, NULL, 10); +INSERT INTO emp VALUES ('TURNER', 'SALESMAN', 7698, '1981-09-08 00:00:00', 1500, 0, 30); +INSERT INTO emp VALUES ('ADAMS', 'CLERK', 7788, '1987-07-13 00:00:00', 1100, NULL, 20); +INSERT INTO emp VALUES ('JAMES', 'CLERK', 7698, '1981-12-03 00:00:00', 950, NULL, 30); +INSERT INTO emp VALUES ('FORD', 'ANALYST', 7566, '1981-12-03 00:00:00', 3000, NULL, 20); +INSERT INTO emp VALUES ('MILLER', 'CLERK', 7782, '1982-01-23 00:00:00', 1300, NULL, 10); + +GO + +CREATE PROCEDURE SDAC_InsertEmp + @ENAME nvarchar(20), + @JOB nvarchar(10) +AS + INSERT INTO + EMP (ENAME, JOB) + VALUES + (@ENAME, @JOB) + RETURN @@Identity; + +GO + +CREATE PROCEDURE SDAC_UpdateEmp + @EMPNO int, + @ENAME nvarchar(20), + @JOB nvarchar(10), + @EMPINFO nvarchar(30) OUTPUT +AS + UPDATE EMP + SET + ENAME = @ENAME, JOB = @JOB + WHERE + EMPNO = @EMPNO + SET @EMPINFO = CAST(@EMPNO AS nvarchar) + ' ' + @JOB + RETURN @EMPNO; + +GO + +CREATE PROCEDURE SDAC_DeleteEmp + @EMPNO int, + @Result int OUTPUT +AS + DELETE Emp + WHERE + EmpNO = @EmpNO + SET @Result = @EmpNO + 2; + +GO + +CREATE PROCEDURE "Ten Most High-Paid Employees" AS +BEGIN + SET ROWCOUNT 10 + SELECT Emp.EName AS TenMostHighPaidEmployees, Emp.SAL + FROM Emp + ORDER BY Emp.SAL DESC + SET ROWCOUNT 0 +END; \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/UninstallDemoObjects.sql b/internal/4.10.0.10/1/Demos/UninstallDemoObjects.sql new file mode 100644 index 0000000..36d755e --- /dev/null +++ b/internal/4.10.0.10/1/Demos/UninstallDemoObjects.sql @@ -0,0 +1,28 @@ +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[Loaded1]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [Loaded1]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[Loaded2]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [Loaded2]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[SDAC_Long_char]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [SDAC_Long_char]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[SDAC_Pictures]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [SDAC_Pictures]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[SDAC_DeleteEmp]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) + DROP PROCEDURE [dbo].[SDAC_DeleteEmp]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[SDAC_InsertEmp]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) + DROP PROCEDURE [dbo].[SDAC_InsertEmp]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[SDAC_UpdateEmp]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) + DROP PROCEDURE [dbo].[SDAC_UpdateEmp]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[ThreadTable]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [ThreadTable]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[SDAC_Text]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [SDAC_Text]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[SDAC_Loaded]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [SDAC_Loaded]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[Ten Most High-Paid Employees]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) + DROP PROCEDURE [dbo].[Ten Most High-Paid Employees]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[CRGRID_TEST]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [CRGRID_TEST]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[emp]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [emp]; +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dept]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) + DROP TABLE [dept]; \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.bdsproj b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.bdsproj new file mode 100644 index 0000000..11749a2 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.bdsproj @@ -0,0 +1,221 @@ + + + + + + + + + + + + BDS2006.cpp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + False + + + + + + + False + + False + + True + False + + + False + False + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.cpp b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.cpp new file mode 100644 index 0000000..00754e6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.cpp @@ -0,0 +1,34 @@ +//$$---- EXE CPP ---- +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +//--------------------------------------------------------------------------- +USEFORM("Main.cpp", fmMain); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TfmMain), &fmMain); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + catch (...) + { + try + { + throw Exception(""); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/BDS2006.res new file mode 100644 index 0000000000000000000000000000000000000000..29c38a3b5785fd84b88938586e3552a1b0c19e24 GIT binary patch literal 4396 zcmeHLF-`+95cCOZl!AteD=B#Z5+EuH;7fiE&&bb?nT^M1*7jX;3Zlu1iM{Lf%&vV2 z(uEMh2u#xfnEtZwoz}0AGuYa0cXzF%2TVrb1sH6G3HDsoa?`3QMC5N3O_}L>h===VCzWlBF(#bqd-+mua zht_*zPrsL+|9|MS2Eyt}^&!CGa;@H9>YrSCZq+Me#A<)ix5R1IcRuw! z5bEcjsGsXioRyDwB=BLtoL2VBW=o$O$M&y%y)i<|fRCQO=^>9CoSP4a{@VQ@*@&g@ zeXK6(YhN`Yz}Tw3yYDKW9IO#}k-gD}ReC;_^!Yo(y~;NZ@aTTBpY~Ti;)<~h{F#+} zoA^_G;^~dlGvK4A&-%1qwW>eGs}TXl4y5yb@0<3VR`p-;BG+Pxe{KD65%c|cpZZqQ z#`|B>=krniFY-S1BhHr~7k!#|8DF}81^F+PO zvFC$1M<9|WfpePt?nqwb@jRR7gS7~FiwF?hYrUkA9P$xbHR}smEq&D!8!YO_w0KU) z(R`~uYiRN==qulkt(qG&hkM0>-(UJIu5!IMZ|V7%&cDaOcuU{&Z1s + + + {cbce157e-8e15-4ec4-a246-c41b36b92c56} + CppVCLApplication + CBuilder2007.cpp + Debug Build + + + true + + + true + true + Base + + + true + true + Base + + + exe + JPHNE + d:\Program Files\CoreLab\Sdac for Delphi2006\Demos\Win32\CBuilder + true + Windows + d:\Program Files\CoreLab\Sdac for Delphi2006\Demos\Win32\CBuilder + true + vcl.bpi;rtl.bpi;vclx.bpi;dbrtl.bpi;vcldb.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;vclib.bpi;ibxpress.bpi;xmlrtl.bpi;vclactnband.bpi;inet.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;vclie.bpi;inetdbbde.bpi;inetdbxpress.bpi;IndyCore.bpi;IndySystem.bpi;soaprtl.bpi;dsnap.bpi;IndyProtocols.bpi;teeui.bpi;teedb.bpi;tee.bpi;vcldbx.bpi;dsnapcon.bpi;websnap.bpi;webdsnap.bpi + d:\Program Files\CoreLab\Sdac for Delphi2006\Demos\Win32\CBuilder;D:\Documents and Settings\Ikar\My Documents\Borland Studio Projects;$(BDS)\lib;$(BDS)\lib\obj + true + bdertl.lib;dac105.lib;sdacvcl105.lib;sdac105.lib;dacvcl105.lib + $(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\..\..\Include + true + d:\Program Files\CoreLab\Sdac for Delphi2006\Demos\Win32\CBuilder;$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\..\..\..\Include + d:\Program Files\CoreLab\Sdac for Delphi2006\Demos\Win32\CBuilder;$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\..\..\..\Include + rtl.lib;vcl.lib;dbrtl.lib;vcldb.lib;bdertl.lib;dac105.lib;sdacvcl105.lib;sdac105.lib;dacvcl105.lib + d:\Program Files\CoreLab\Sdac for Delphi2006\Demos\Win32\CBuilder;D:\Documents and Settings\Ikar\My Documents\Borland Studio Projects;$(BDS)\lib;$(BDS)\lib\obj + $(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\..\..\Lib + NO_STRICT + true + d:\Program Files\CoreLab\Sdac for Delphi2006\Demos\Win32\CBuilder + + + false + true + true + false + true + DEBUG;$(DCC_Define) + true + Debug_Build + true + true + $(BDS)\lib\debug;$(ILINK_LibraryPath) + _DEBUG;$(BCC_Defines) + Full + true + + + true + false + Release_Build + $(BDS)\lib\release;$(ILINK_LibraryPath) + NDEBUG;$(BCC_Defines) + None + + + CPlusPlusBuilder.Personality + CppVCLApplication + +FalseFalse1000FalseFalseFalseFalseFalse104912511.0.0.01.0.0.0FalseFalseFalseTrueFalseFalseFalseCBuilder2007.cppFalseTrueTrue + 1 + $(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\..\..\Include + + + 1 + $(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\..\..\Lib + + + + + + + 0 + + + 2 + + +

fmMain
+ Main.h + 1 + + + + Cfg_1 + + + Cfg_2 + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder2007.cpp b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder2007.cpp new file mode 100644 index 0000000..00754e6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder2007.cpp @@ -0,0 +1,34 @@ +//$$---- EXE CPP ---- +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +//--------------------------------------------------------------------------- +USEFORM("Main.cpp", fmMain); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TfmMain), &fmMain); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + catch (...) + { + try + { + throw Exception(""); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder2007.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder2007.res new file mode 100644 index 0000000000000000000000000000000000000000..29c38a3b5785fd84b88938586e3552a1b0c19e24 GIT binary patch literal 4396 zcmeHLF-`+95cCOZl!AteD=B#Z5+EuH;7fiE&&bb?nT^M1*7jX;3Zlu1iM{Lf%&vV2 z(uEMh2u#xfnEtZwoz}0AGuYa0cXzF%2TVrb1sH6G3HDsoa?`3QMC5N3O_}L>h===VCzWlBF(#bqd-+mua zht_*zPrsL+|9|MS2Eyt}^&!CGa;@H9>YrSCZq+Me#A<)ix5R1IcRuw! z5bEcjsGsXioRyDwB=BLtoL2VBW=o$O$M&y%y)i<|fRCQO=^>9CoSP4a{@VQ@*@&g@ zeXK6(YhN`Yz}Tw3yYDKW9IO#}k-gD}ReC;_^!Yo(y~;NZ@aTTBpY~Ti;)<~h{F#+} zoA^_G;^~dlGvK4A&-%1qwW>eGs}TXl4y5yb@0<3VR`p-;BG+Pxe{KD65%c|cpZZqQ z#`|B>=krniFY-S1BhHr~7k!#|8DF}81^F+PO zvFC$1M<9|WfpePt?nqwb@jRR7gS7~FiwF?hYrUkA9P$xbHR}smEq&D!8!YO_w0KU) z(R`~uYiRN==qulkt(qG&hkM0>-(UJIu5!IMZ|V7%&cDaOcuU{&Z1s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=4 +Item0=$(BCB)\include;$(BCB)\include\vcl;$(BCB)\SDAC\Include +Item1=..\..\source;..\..\..\dbaccess\source;$(BCB)\include;$(BCB)\include\vcl +Item2=$(BCB)\include;$(BCB)\include\vcl;$(BCB)\Sdac\Include;..\..\source +Item3=$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=6 +Item0=$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\SDAC\lib +Item1=..\..\source;..\..\..\dbaccess\source;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;..\..\Source\CBuilder5 +Item2=$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\Sdac\Lib;..\..\source;..\..\source\cbuilder4 +Item3=..\..\source\cbuilder3;d:\program files\borland\cbuilder3\lib\release;$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\Sdac\Lib +Item4=d:\program files\borland\cbuilder3\lib\release;$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\Sdac\Lib +Item5=d:\program files\borland\cbuilder3\lib\release;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=2 +Item0=$(BCB)\source\vcl;..\..\source +Item1=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=_RTLDLL;USEPACKAGES +Item1=_RTLDLL + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=1 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder5.cpp b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder5.cpp new file mode 100644 index 0000000..d176065 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder5.cpp @@ -0,0 +1,21 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USERES("CBuilder5.res"); +USEFORM("Main.cpp", fmMain); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TfmMain), &fmMain); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder5.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder5.res new file mode 100644 index 0000000000000000000000000000000000000000..b369156c076dbea4fc87e1cdb77a4e86205ae2cc GIT binary patch literal 876 zcmb7@u}Z{15QhI;0_pS$8!J;<`UWa4?24$bVsWr#rdYUz6Y@B*%%fOZT3&Im{+n!a z2_A@({F#}2GqcOW0zgHDFo@y8zE&g8S(Ei_y}m5QqH6{fbw_1Lzu9xz1mFvi!STzG z5_DZh5H}HB7#zRDz5?oZTH|)KZ!1=6PixFm+qT~C{eH$tCvHAkO*(P6b9%vzRtxU6 z-da9szA;Mo>y?Loedkksx$oCEM(Yr5;z}#4HulJs+HM>st|MnY_OpJ;)snM*!Q*^w zX8m!#O!J*%zrm3kr<^cP`*+SO;u)8M82te^jwXeG77w5?G%1AXKX|O3_osX~Kj$Rn zp`Y)4%1g^r^qxB#IAE;>-p1??AE(TeGd`t~|Ieu_>Q=C-yI;yfhoe3jA5e!205? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=4 +Item0=$(BCB)\include;$(BCB)\include\vcl;$(BCB)\SDAC\Include +Item1=..\..\source;..\..\..\dbaccess\source;$(BCB)\include;$(BCB)\include\vcl +Item2=$(BCB)\include;$(BCB)\include\vcl;$(BCB)\Sdac\Include;..\..\source +Item3=$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=6 +Item0=$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\SDAC\lib +Item1=..\..\source;..\..\..\dbaccess\source;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;..\..\Source\CBuilder5 +Item2=$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\Sdac\Lib;..\..\source;..\..\source\cbuilder4 +Item3=..\..\source\cbuilder3;d:\program files\borland\cbuilder3\lib\release;$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\Sdac\Lib +Item4=d:\program files\borland\cbuilder3\lib\release;$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\Sdac\Lib +Item5=d:\program files\borland\cbuilder3\lib\release;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=2 +Item0=$(BCB)\source\vcl;..\..\source +Item1=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=_RTLDLL;USEPACKAGES +Item1=_RTLDLL + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=1 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder6.cpp b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder6.cpp new file mode 100644 index 0000000..4535698 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder6.cpp @@ -0,0 +1,21 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USERES("CBuilder6.res"); +USEFORM("Main.cpp", fmMain); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TfmMain), &fmMain); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder6.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/CBuilder6.res new file mode 100644 index 0000000000000000000000000000000000000000..b369156c076dbea4fc87e1cdb77a4e86205ae2cc GIT binary patch literal 876 zcmb7@u}Z{15QhI;0_pS$8!J;<`UWa4?24$bVsWr#rdYUz6Y@B*%%fOZT3&Im{+n!a z2_A@({F#}2GqcOW0zgHDFo@y8zE&g8S(Ei_y}m5QqH6{fbw_1Lzu9xz1mFvi!STzG z5_DZh5H}HB7#zRDz5?oZTH|)KZ!1=6PixFm+qT~C{eH$tCvHAkO*(P6b9%vzRtxU6 z-da9szA;Mo>y?Loedkksx$oCEM(Yr5;z}#4HulJs+HM>st|MnY_OpJ;)snM*!Q*^w zX8m!#O!J*%zrm3kr<^cP`*+SO;u)8M82te^jwXeG77w5?G%1AXKX|O3_osX~Kj$Rn zp`Y)4%1g^r^qxB#IAE;>-p1??AE(TeGd`t~|Ieu_>Q=C-yI;yfhoe3jA5e!205? +#pragma hdrstop + +#include "Main.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "MemDS" +#pragma link "DBAccess" +#pragma link "MSAccess" +#pragma link "SdacVcl" +#pragma resource "*.dfm" +TfmMain *fmMain; +//--------------------------------------------------------------------------- +__fastcall TfmMain::TfmMain(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- +void __fastcall TfmMain::btOpenClick(TObject *Sender) +{ + MSQuery->Open(); +} +//--------------------------------------------------------------------------- +void __fastcall TfmMain::btCloseClick(TObject *Sender) +{ + MSQuery->Close(); +} +//--------------------------------------------------------------------------- +void __fastcall TfmMain::btDisconnectClick(TObject *Sender) +{ + MSConnection->Disconnect(); +} +//--------------------------------------------------------------------------- + +void __fastcall TfmMain::btExecuteClick(TObject *Sender) +{ + MSQuery->Execute(); +} +//--------------------------------------------------------------------------- + +void __fastcall TfmMain::FormShow(TObject *Sender) +{ + meSQL->Lines->Assign(MSQuery->SQL); +} +//--------------------------------------------------------------------------- + +void __fastcall TfmMain::meSQLExit(TObject *Sender) +{ + if (meSQL->Lines->Text != MSQuery->SQL->Text) + MSQuery->SQL->Assign(meSQL->Lines); +} +//--------------------------------------------------------------------------- + +void __fastcall TfmMain::btConnectClick(TObject *Sender) +{ + MSConnection->Connect(); +} +//--------------------------------------------------------------------------- + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/Main.dfm b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/Main.dfm new file mode 100644 index 0000000000000000000000000000000000000000..7ea3fe8e1b9da594410ddc566613a2387bb6455f GIT binary patch literal 1956 zcmah~y^`BD5QfMTLF(u3T-oVZ#_`zWRH-RSiapVvk94k#A!<*;1OhZ5q|TthLv}27_OGaYO;>7T|7AIEfUY;n{Nl0 z^J(M{i6VZGB#@^55Vpd9=|{sL^lyap!xt|Gd&*WI+o51WVlQC>#m6Lp-dIDv3O7Wi zpzy_TG!EWR;vd2{!BsShJLWX^=_Tx%@|C!a;i$U#feFw0*UNV^vIVEFLx~7a{Rkwz zG5(RdW6(wCbG8a45CwCoL-CwBk2c~KyJI1@*{Z*wM_}m!tPh=xso>}%FOGJM zDy2Qk#n*Y_tUPa)DAM+OnKsLI!o5tjTsM*5=RWO#(KW|y!gQt)a^eNyz;G-C8xYw< zD~nL0Jv(vk4B!B4zSrSkXL*C!CKd&sbYL6Q8tP=913HdN(`jysPCmJ5BIWDf(MD2=5XRJ6aSWr8j z>c?%~zY$}q{_H{bU!U}Ajo#AlZgivyd-)K_mRYifgKs5WIp)(umiLkEZ(0SkOPG!e zxN6kk@p@QKVyYO7KQ(MF8dn}poXh&O96RT=>5c;h0Xm(_7)j^gK7{5O%KlDF!_hpy> literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/Main.h b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/Main.h new file mode 100644 index 0000000..1683afd --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/Main.h @@ -0,0 +1,53 @@ +//--------------------------------------------------------------------------- +#ifndef MainH +#define MainH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "MemDS.hpp" +#include +#include +#include +#include +#include +#include +#include "DBAccess.hpp" +#include "MSAccess.hpp" +#include +#include "SdacVcl.hpp" +#include +//--------------------------------------------------------------------------- +class TfmMain : public TForm +{ +__published: // IDE-managed Components + TPanel *ToolBar; + TButton *btOpen; + TButton *btClose; + TButton *btExecute; + TDBNavigator *DBNavigator; + TMemo *meSQL; + TDBGrid *DBGrid; + TDataSource *DataSource; + TButton *btDisconnect; + TSplitter *Splitter1; + TButton *btConnect; + TMSQuery *MSQuery; + TMSConnection *MSConnection; + TMSConnectDialog *MSConnectDialog; + void __fastcall btOpenClick(TObject *Sender); + void __fastcall btCloseClick(TObject *Sender); + void __fastcall btDisconnectClick(TObject *Sender); + void __fastcall btExecuteClick(TObject *Sender); + void __fastcall FormShow(TObject *Sender); + void __fastcall meSQLExit(TObject *Sender); + void __fastcall btConnectClick(TObject *Sender); +private: // User declarations +public: // User declarations + __fastcall TfmMain(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TfmMain *fmMain; +//--------------------------------------------------------------------------- +#endif diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/ReadMe.txt new file mode 100644 index 0000000..6928be8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/CBuilder/ReadMe.txt @@ -0,0 +1,7 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +A general demo project about how to create SDAC-based applications with +C++Builder. Lets you execute SQL scripts and work with result sets in a +grid. This is one of the two SDAC demos for C++Builder. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/DLLMain.dfm b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/DLLMain.dfm new file mode 100644 index 0000000..12440a4 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/DLLMain.dfm @@ -0,0 +1,92 @@ +object fmDllMain: TfmDllMain + Left = 448 + Top = 324 + Width = 599 + Height = 330 + Caption = 'MS Data Access Demo - DLL' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poDefaultPosOnly + OnClose = FormClose + OnCreate = FormCreate + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object DBGrid: TDBGrid + Left = 0 + Top = 26 + Width = 591 + Height = 270 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object pnToolBar: TPanel + Left = 0 + Top = 0 + Width = 591 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 394 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 77 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object DBNavigator: TDBNavigator + Left = 153 + Top = 1 + Width = 240 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + end + end + object MSQuery: TMSQuery + SQL.Strings = ( + 'SELECT * FROM Emp') + Left = 24 + Top = 56 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 56 + Top = 56 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/DLLMain.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/DLLMain.pas new file mode 100644 index 0000000..ddd2c17 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/DLLMain.pas @@ -0,0 +1,149 @@ +unit DLLMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Grids, DBGrids, Db, MemDS, StdCtrls, ExtCtrls, DBCtrls, DBAccess, + MSAccess, Buttons; + +type + TfmDllMain = class(TForm) + MSQuery: TMSQuery; + DBGrid: TDBGrid; + DataSource: TDataSource; + pnToolBar: TPanel; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormShow(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +procedure AssignConnection(MSConnection: TMSConnection); cdecl; +procedure ShowForm; cdecl; +procedure HideForms; cdecl; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFNDEF VER130} +{$IFNDEF VER140} +{$IFNDEF CLR} + {$DEFINE XPMAN} + {$R WindowsXP.res} +{$ENDIF} +{$ENDIF} +{$ENDIF} + +{$IFDEF XPMAN} +uses + UxTheme; +{$ENDIF} + +var + ExternalMSConnection: TMSConnection; + FormList: TList; + FormCount: integer; + +procedure AssignConnection(MSConnection: TMSConnection); cdecl; +begin + ExternalMSConnection:= MSConnection; +end; + +procedure ShowForm; cdecl; +begin + with TfmDllMain.Create(Application) do begin + Inc(FormCount); + Caption:= IntToStr(FormCount) + '. ' + Caption; + MSQuery.Connection := ExternalMSConnection; + MSQuery.Active := True; + Show; + end; +end; + +procedure HideForms; cdecl; +begin + while FormList.Count > 0 do begin + TForm(FormList[0]).Free; + FormList.Delete(0); + end; +end; + +procedure TfmDllMain.FormShow(Sender: TObject); +begin + FormList.Add(Self); +end; + +procedure TfmDllMain.FormClose(Sender: TObject; var Action: TCloseAction); +begin + FormList.Remove(Self); + Action := caFree; +end; + +procedure TfmDllMain.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TfmDllMain.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TfmDllMain.FormCreate(Sender: TObject); +{$IFDEF XPMAN} + procedure UpdateStyle(Control: TWinControl); + var + Panel: TPanel; + i: integer; + begin + for i := 0 to Control.ControlCount - 1 do begin + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := False + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := False; + if Control.Controls[i] is TWinControl then begin + if (Control.Controls[i] is TPanel) then begin + Panel := TPanel(Control.Controls[i]); + Panel.ParentBackground := False; + Panel.Color := clBtnFace; + end; + UpdateStyle(TWinControl(Control.Controls[i])); + end; + end; + end; +{$ENDIF} +begin +{$IFDEF XPMAN} + if UseThemes then + UpdateStyle(Self); +{$ENDIF} +end; + +initialization + FormCount:= 0; + FormList:= TList.Create; +finalization + HideForms; + FormList.Free; +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ExeMain.dfm b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ExeMain.dfm new file mode 100644 index 0000000..c3c6743 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ExeMain.dfm @@ -0,0 +1,203 @@ +object fmExeMain: TfmExeMain + Left = 387 + Top = 220 + Width = 625 + Height = 336 + Caption = 'MS Data Access Demo - Application' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object pnToolBar: TPanel + Left = 0 + Top = 0 + Width = 617 + Height = 48 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 2 + Top = 23 + Width = 574 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btFreeDLL: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = '4. Free DLL' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btFreeDLLClick + end + object btLoadDLL: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = '1. Load DLL' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btLoadDLLClick + end + object btShowForm: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = '2. Show Form' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btShowFormClick + end + object btHideForms: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = '3. Hide Form' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btHideFormsClick + end + object DBNavigator: TDBNavigator + Left = 333 + Top = 1 + Width = 240 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + end + object Panel1: TPanel + Left = 2 + Top = 1 + Width = 333 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object btConnect: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Connect' + Flat = True + Transparent = False + OnClick = btConnectClick + end + object btDisconnect: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Disconnect' + Flat = True + Transparent = False + OnClick = btDisconnectClick + end + object btOpen: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 48 + Width = 617 + Height = 261 + Align = alClient + DataSource = DataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object MSConnection: TMSConnection + Database = 'SDACDemos' + Username = 'Sa' + ConnectDialog = MSConnectDialog + Left = 16 + Top = 88 + end + object MSConnectDialog: TMSConnectDialog + SavePassword = True + Caption = 'Connect' + UsernameLabel = 'User Name' + PasswordLabel = 'Password' + ServerLabel = 'Server' + DatabaseLabel = 'Database' + ConnectButton = 'Connect' + CancelButton = 'Cancel' + Left = 48 + Top = 88 + end + object MSQuery: TMSQuery + Connection = MSConnection + SQL.Strings = ( + 'SELECT * FROM Emp') + Left = 16 + Top = 120 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 48 + Top = 120 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ExeMain.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ExeMain.pas new file mode 100644 index 0000000..719e0fd --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ExeMain.pas @@ -0,0 +1,193 @@ +unit ExeMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, Grids, DBGrids, Db, MemDS, DBCtrls, DBAccess, SdacVcl, + MSAccess, Buttons; + +type + TfmExeMain = class(TForm) + MSConnection: TMSConnection; + MSConnectDialog: TMSConnectDialog; + pnToolBar: TPanel; + DBGrid: TDBGrid; + MSQuery: TMSQuery; + DataSource: TDataSource; + Panel2: TPanel; + btFreeDLL: TSpeedButton; + btLoadDLL: TSpeedButton; + btShowForm: TSpeedButton; + btHideForms: TSpeedButton; + DBNavigator: TDBNavigator; + Panel1: TPanel; + btConnect: TSpeedButton; + btDisconnect: TSpeedButton; + btOpen: TSpeedButton; + btClose: TSpeedButton; + procedure btLoadDLLClick(Sender: TObject); + procedure btFreeDLLClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure btShowFormClick(Sender: TObject); + procedure btHideFormsClick(Sender: TObject); + private + hDLL:HModule; + + public + + end; + + TAssignMSConnection = procedure (MSConnection: TMSConnection); cdecl; + TShowForm = procedure; cdecl; + THideForms = procedure; cdecl; + +var + fmExeMain: TfmExeMain; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFNDEF VER130} +{$IFNDEF VER140} +{$IFNDEF CLR} + {$DEFINE XPMAN} + {$R WindowsXP.res} +{$ENDIF} +{$ENDIF} +{$ENDIF} + +{$IFDEF XPMAN} +uses + UxTheme; +{$ENDIF} + +procedure TfmExeMain.btLoadDLLClick(Sender: TObject); +var + AssignMSConnection: TAssignMSConnection; +begin + if hDLL = 0 then begin + hDLL := LoadLibrary('MS_DLL.dll'); + if hDLL <> 0 then begin + @AssignMSConnection := GetProcAddress(hDLL, 'AssignConnection'); + if @AssignMSConnection <> nil then + AssignMSConnection(MSConnection); + MessageDlg('DLL is loaded', mtInformation, [mbOk], 0); + end + else + MessageDlg('Cannot load DLL', mtError, [mbOk], 0); + end; +end; + +procedure TfmExeMain.btShowFormClick(Sender: TObject); +var + ShowForm: TShowForm; +begin + if hDLL <> 0 then begin + @ShowForm := GetProcAddress(hDLL, 'ShowForm'); + if @ShowForm <> nil then + ShowForm; + SetFocus; + end + else + MessageDlg('DLL is not loaded', mtError, [mbOk], 0); +end; + +procedure TfmExeMain.btHideFormsClick(Sender: TObject); +var + HideForms: THideForms; +begin + if hDLL <> 0 then begin + @HideForms := GetProcAddress(hDLL, 'HideForms'); + if @HideForms <> nil then + HideForms; + end + else + MessageDlg('DLL is not loaded', mtError, [mbOk], 0); +end; + +procedure TfmExeMain.btFreeDLLClick(Sender: TObject); +begin + if hDLL <> 0 then begin + FreeLibrary(hDLL); + hDLL:= 0; + end + else + MessageDlg('DLL is not loaded', mtError, [mbOk], 0); +end; + +procedure TfmExeMain.FormCreate(Sender: TObject); +{$IFDEF XPMAN} + procedure UpdateStyle(Control: TWinControl); + var + Panel: TPanel; + i: integer; + begin + for i := 0 to Control.ControlCount - 1 do begin + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := False + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := False; + if Control.Controls[i] is TWinControl then begin + if (Control.Controls[i] is TPanel) then begin + Panel := TPanel(Control.Controls[i]); + Panel.ParentBackground := False; + Panel.Color := clBtnFace; + end; + UpdateStyle(TWinControl(Control.Controls[i])); + end; + end; + end; +{$ENDIF} + +begin +{$IFDEF XPMAN} + if UseThemes then + UpdateStyle(Self); +{$ENDIF} + hDLL:= 0; +end; + +procedure TfmExeMain.btConnectClick(Sender: TObject); +begin + MSConnection.Connect; +end; + +procedure TfmExeMain.btDisconnectClick(Sender: TObject); +begin + MSConnection.Disconnect; +end; + +procedure TfmExeMain.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TfmExeMain.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TfmExeMain.FormClose(Sender: TObject; var Action: TCloseAction); +begin + if hDLL <> 0 then + FreeLibrary(hDLL); +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.bdsproj b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.bdsproj new file mode 100644 index 0000000..effdff8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.bdsproj @@ -0,0 +1,158 @@ + + + + + + + + + + + + MS_DLL.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.cfg b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.cfg new file mode 100644 index 0000000..0cf637a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q+ +-$R+ +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"d:\program files\borland\delphi5\Projects" +-N"d:\program files\borland\delphi5\Projects" +-LE"d:\program files\borland\delphi5\Projects" +-LN"d:\program files\borland\delphi5\Projects" +-U"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-O"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-I"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-R"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.dpr b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.dpr new file mode 100644 index 0000000..f7cf82b --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLL.dpr @@ -0,0 +1,36 @@ + +library MS_DLL; + +{ Important note about DLL memory management: ShareMem must be the + first unit in your library's USES clause AND your project's (select + Project-View Source) USES clause if your DLL exports any procedures or + functions that pass strings as parameters or function results. This + applies to all strings passed to and from your DLL--even those that + are nested in records and classes. ShareMem is the interface unit to + the BORLNDMM.DLL shared memory manager, which must be deployed along + with your DLL. To avoid using BORLNDMM.DLL, pass string information + using PChar or ShortString parameters. } + +uses + ShareMem, + SysUtils, + Classes, + DLLMain in 'DLLMain.pas' {fmDllMain}; + +exports + AssignConnection, + ShowForm, + HideForms; + +var + SaveExit: pointer; + +procedure DllExit; +begin + ExitProc := SaveExit; +end; + +begin +// SaveExit := ExitProc; +// ExitProc := @DllExit; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLLGroup.bdsgroup b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLLGroup.bdsgroup new file mode 100644 index 0000000..80dbec5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLLGroup.bdsgroup @@ -0,0 +1,20 @@ + + + + + + + + + + + + + MS_DLL.bdsproj + MS_Exe.bdsproj + MS_DLL.dll MS_Exe.exe + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLLGroup.bpg b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLLGroup.bpg new file mode 100644 index 0000000..bb9ffe8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_DLLGroup.bpg @@ -0,0 +1,23 @@ +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = MS_DLL.dll MS_Exe.exe +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +MS_Exe.exe: MS_Exe.dpr + $(DCC) + +MS_DLL.dll: MS_DLL.dpr + $(DCC) + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.bdsproj b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.bdsproj new file mode 100644 index 0000000..13766b8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.bdsproj @@ -0,0 +1,158 @@ + + + + + + + + + + + + MS_Exe.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.cfg b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.cfg new file mode 100644 index 0000000..0cf637a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q+ +-$R+ +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"d:\program files\borland\delphi5\Projects" +-N"d:\program files\borland\delphi5\Projects" +-LE"d:\program files\borland\delphi5\Projects" +-LN"d:\program files\borland\delphi5\Projects" +-U"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-O"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-I"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-R"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.dpr b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.dpr new file mode 100644 index 0000000..565bad9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.dpr @@ -0,0 +1,14 @@ +program MS_Exe; + +uses + ShareMem, + Forms, + ExeMain in 'ExeMain.pas' {fmExeMain}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfmExeMain, fmExeMain); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/MS_Exe.res new file mode 100644 index 0000000000000000000000000000000000000000..caf0117846fd75d8d20c9835fc80164a1350e4c2 GIT binary patch literal 1540 zcmah|L2DC16#mi#wuqPPiYd}1;Vy!7eD^_|fMQbg#X{eQK=^-lw)?2S# za_~QR3qi7ApqHLK3tqh0TT)s&e(%lhCJjYj^7hTl_r3SNncV?^Jlz=U9A2>BBQc&P zC#6^}HcR0w?XXq(J%gnjlJb-_Ao(+6*NcRwiApsE~!Pvm3)g_BVR&}{>M6>Ho z&G&Q~EjWJ9y?RvApD>&r2|}lZvQQI3$(qdnOE?^;APJ>`3Nt{aqlAuH2(Wg|?^dH0 zf|KA@D^P;sB=`<6S}c_m?;LjBiVLq^?^wL#RvmwI_j57AJHB75_{|`}pH{oIz0>AF zg1c_F-3$(xk6Bu=y1#dN+6<04m%eqk+iJHPI?o91?zUU4AoxO@0z36?&^l?bfFuZB z3^;2j4oRq=1P$^Pj|f4~w76!}dt^koEX*uq_Zz`J%O%#c{gZh%PLEbjR9*rjE7{+T zF`tgJ#tYNN;}=4&g~0SrV4PyJkvp7=r~l>TI^sR@=&3Wtb4Gq;X%jLY7t_X^ImVo4 z8OIr?uLGE%8*>fM@CfsGPJfIA#@Gh$h1`Y|^7)M33b{ooxXE40U3!|5rK$mJ-7oL)&ArxoR!R3w^2;fL}Tv4d@_ql`7oF>YX$mCJaG zE%Lr9X95LG;vsiipoaTgzsWu+?sW^Bs9=TsUG92?v(==@UFF0zXNi2kYwcBG&voXO z6K(-l$d0*7nb2oHf_WY%roI$K`R)sF9?pRg-jRLpyYp^>kGi!s)!S^wi`IY$#gxF=b literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ReadMe.txt new file mode 100644 index 0000000..46d96fc --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Dll/ReadMe.txt @@ -0,0 +1,10 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demonstrates creating and loading DLLs for SDAC-based projects. This demo +project consists of two parts - an MS_Dll project that creates a DLL of a +form that sends a query to the server and displays its results, and an +MS_Exe project that can be executed to display a form for loading and +running this DLL. Allows you to build a dll for one SDAC-based project +and load and test it from a separate application. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/About.dfm b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/About.dfm new file mode 100644 index 0000000..0d8a146 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/About.dfm @@ -0,0 +1,108 @@ +object AboutForm: TAboutForm + Left = 352 + Top = 192 + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'About FailOver Demo' + ClientHeight = 343 + ClientWidth = 416 + Color = clBtnFace + ParentFont = True + OldCreateOrder = True + Position = poScreenCenter + OnMouseMove = FormMouseMove + PixelsPerInch = 96 + TextHeight = 13 + object Label3: TLabel + Left = 16 + Top = 36 + Width = 156 + Height = 13 + Caption = 'Copyright '#169' 1997-2007 Core Lab' + end + object lbWeb: TLabel + Left = 16 + Top = 306 + Width = 73 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbWebClick + OnMouseMove = lbWebMouseMove + end + object lbDemo: TLabel + Left = 16 + Top = 8 + Width = 119 + Height = 20 + Caption = 'FailOver Demo' + Font.Charset = DEFAULT_CHARSET + Font.Color = clGreen + Font.Height = -16 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object OKBtn: TButton + Left = 319 + Top = 308 + Width = 75 + Height = 24 + Cancel = True + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end + object meAbout: TMemo + Left = 16 + Top = 56 + Width = 385 + Height = 241 + Color = clBtnFace + Lines.Strings = ( + 'This demo program shows how to use DisconnectedMode, Pooling, ' + + 'CachedUpdates and LocalMasterDetail options. Usage of these opti' + + 'ons and ' + + 'usage of the OnConectionLost event are recommended working in un' + + 'stable ' + 'and/or slow network.' + '' + + 'The '#39'Open'#39' button opens two data sets. They are linked by Master' + + '/Detail ' + + 'relationship. You can preconnect to database before opening the ' + + 'datasets, but ' + 'usage of disconnected mode has no advantages in this case.' + '' + + 'The grid above displays the master data set, the grid below disp' + + 'lays the detail ' + + 'data set. The '#39'Kill session'#39' button terminates session on the se' + + 'rver, which ' + + 'causes connection break. This does not work for with all SQL ser' + + 'vers and with ' + + 'all users. The memo at the bottom of the main form keeps track o' + + 'f connection ' + 'messages.' + '' + + 'See the "Working in unstable and slow networks" topic in help fo' + + 'r more ' + 'detailed information.') + TabOrder = 1 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/About.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/About.pas new file mode 100644 index 0000000..79a6909 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/About.pas @@ -0,0 +1,67 @@ +unit About; + +interface +uses + Classes, SysUtils, +{$IFNDEF LINUX} + Windows, Menus, ImgList, StdCtrls, ComCtrls, Buttons, ExtCtrls, Graphics, + Controls, Forms, Dialogs, ShellApi; +{$ELSE} + QMenus, QImgList, QStdCtrls, QComCtrls, QButtons, QExtCtrls, QGraphics, + QControls, QForms, QDialogs; +{$ENDIF} + +type + TAboutForm = class(TForm) + OKBtn: TButton; + Label3: TLabel; + lbWeb: TLabel; + lbDemo: TLabel; + meAbout: TMemo; + procedure lbWebClick(Sender: TObject); + procedure lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + private + { Private declarations } + public + { Public declarations } + end; + +var + AboutForm: TAboutForm; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TAboutForm.lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $4080FF; +end; + +procedure TAboutForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $FF0000; +end; + +procedure TAboutForm.lbWebClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'open', 'www.crlab.com', '', '', SW_SHOW); + lbWeb.Font.Color := $FF0000; +{$ENDIF} +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Data.dfm b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Data.dfm new file mode 100644 index 0000000..9983c11 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Data.dfm @@ -0,0 +1,112 @@ +object DM: TDM + OldCreateOrder = False + Left = 185 + Top = 105 + Height = 227 + Width = 284 + object Connection: TMSConnection + Database = 'master' + Options.DisconnectedMode = True + Options.LocalFailover = True + Pooling = True + Left = 32 + Top = 32 + end + object quDetail: TMSQuery + Connection = Connection + SQL.Strings = ( + 'select * from emp') + Debug = True + CachedUpdates = True + Options.LocalMasterDetail = True + MasterSource = dsMaster + MasterFields = 'DEPTNO' + DetailFields = 'DEPTNO' + Left = 104 + Top = 88 + end + object quMaster: TMSQuery + Connection = Connection + SQL.Strings = ( + 'select * from dept' + '') + Debug = True + CachedUpdates = True + Left = 104 + Top = 32 + end + object dsDetail: TDataSource + DataSet = quDetail + Left = 136 + Top = 80 + end + object dsMaster: TDataSource + DataSet = quMaster + Left = 136 + Top = 24 + end + object scCreate: TMSScript + SQL.Strings = ( + 'CREATE TABLE DEPT (' + ' DEPTNO INT PRIMARY KEY ,' + ' DNAME VARCHAR(14) ,' + ' LOC VARCHAR(13)' + ');' + '' + 'CREATE TABLE EMP (' + ' EMPNO INT IDENTITY PRIMARY KEY,' + ' ENAME VARCHAR(10),' + ' JOB VARCHAR(9),' + ' MGR INT,' + ' HIREDATE DATETIME,' + ' SAL FLOAT,' + ' COMM FLOAT,' + ' DEPTNO INT CONSTRAINT FK_DEPTNO REFERENCES DEPT' + ');' + '' + 'INSERT INTO DEPT VALUES (10,'#39'ACCOUNTING'#39','#39'NEW YORK'#39');' + 'INSERT INTO DEPT VALUES (20,'#39'RESEARCH'#39','#39'DALLAS'#39');' + 'INSERT INTO DEPT VALUES (30,'#39'SALES'#39','#39'CHICAGO'#39');' + 'INSERT INTO DEPT VALUES (40,'#39'OPERATIONS'#39','#39'BOSTON'#39');' + '' + 'INSERT INTO EMP VALUES' + '('#39'SMITH'#39','#39'CLERK'#39',7902,CAST('#39'12/17/80'#39' AS DATETIME),800,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'ALLEN'#39','#39'SALESMAN'#39',7698,'#39'02/20/81'#39',1600,300,30);' + 'INSERT INTO EMP VALUES' + '('#39'WARD'#39','#39'SALESMAN'#39',7698,'#39'02/22/81'#39',1250,500,30);' + 'INSERT INTO EMP VALUES' + '('#39'JONES'#39','#39'MANAGER'#39',7839,'#39'04/02/81'#39',2975,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'MARTIN'#39','#39'SALESMAN'#39',7698,'#39'09/28/81'#39',1250,1400,30);' + 'INSERT INTO EMP VALUES' + '('#39'BLAKE'#39','#39'MANAGER'#39',7839,'#39'05/01/81'#39',2850,NULL,30);' + 'INSERT INTO EMP VALUES' + '('#39'CLARK'#39','#39'MANAGER'#39',7839,'#39'06/09/81'#39',2450,NULL,10);' + 'INSERT INTO EMP VALUES' + '('#39'SCOTT'#39','#39'ANALYST'#39',7566,'#39'07/13/87'#39',3000,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'KING'#39','#39'PRESIDENT'#39',NULL,'#39'11/17/81'#39',5000,NULL,10);' + 'INSERT INTO EMP VALUES' + '('#39'TURNER'#39','#39'SALESMAN'#39',7698,'#39'09/08/81'#39',1500,0,30);' + 'INSERT INTO EMP VALUES' + '('#39'ADAMS'#39','#39'CLERK'#39',7788,'#39'07/13/87'#39',1100,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'JAMES'#39','#39'CLERK'#39',7698,'#39'12/03/81'#39',950,NULL,30);' + 'INSERT INTO EMP VALUES' + '('#39'FORD'#39','#39'ANALYST'#39',7566,'#39'12/03/81'#39',3000,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'MILLER'#39','#39'CLERK'#39',7782,'#39'01/23/82'#39',1300,NULL,10);') + Connection = Connection + Left = 200 + Top = 24 + end + object scDrop: TMSScript + SQL.Strings = ( + 'DROP TABLE EMP;' + 'DROP TABLE DEPT;') + Connection = Connection + Left = 200 + Top = 80 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Data.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Data.pas new file mode 100644 index 0000000..0bbfda2 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Data.pas @@ -0,0 +1,96 @@ +unit Data; + +interface + +uses + Classes, SysUtils, Windows, Menus, ImgList, StdCtrls, ComCtrls, Buttons, + ExtCtrls, Graphics, Controls, Forms, DB, + MemData, DBAccess, MSAccess, MemDS, SdacVcl, DAScript, MSScript; + +type + TDM = class(TDataModule) + Connection: TMSConnection; + quDetail: TMSQuery; + quMaster: TMSQuery; + dsMaster: TDataSource; + dsDetail: TDataSource; + scCreate: TMSScript; + scDrop: TMSScript; + private + public + procedure KillSession; + function InTransaction: boolean; + procedure StartTransaction; + procedure RollbackTransaction; + procedure CommitTransaction; + end; + +const + ProductColor: TColor = $5D5DCC; + +var + DM: TDM; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +uses + Main; + +{ TDM } + +procedure TDM.KillSession; +var + KillConnection: TMSConnection; + Query: TMSQuery; + SPID: string; +begin + Query := TMSQuery.Create(nil); + try + Query.Connection := Connection; + Query.SQL.Text := 'SELECT @@SPID AS ''SPID'''; + Query.Open; + SPID := Query.FieldByName('SPID').AsString; + finally + Query.Free; + end; + KillConnection := TMSConnection.Create(nil); + try + KillConnection.Server := Connection.Server; + KillConnection.Username := Connection.Username; + KillConnection.Password := Connection.Password; + KillConnection.Database := Connection.Database; + KillConnection.LoginPrompt := False; + KillConnection.ExecSQL(Format('KILL %s', [SPID]), []); + finally + KillConnection.Free; + end; +end; + +function TDM.InTransaction: boolean; +begin + Result := Connection.InTransaction; +end; + +procedure TDM.StartTransaction; +begin + Connection.StartTransaction; +end; + +procedure TDM.CommitTransaction; +begin + Connection.Commit; +end; + +procedure TDM.RollbackTransaction; +begin + Connection.Rollback; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.bdsproj b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.bdsproj new file mode 100644 index 0000000..39611f9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.bdsproj @@ -0,0 +1,173 @@ + + + + + + + + + + + + FailOver.dpr + + + 7.0 + + + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000409 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.dpr b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.dpr new file mode 100644 index 0000000..068f0a9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.dpr @@ -0,0 +1,15 @@ +program FailOver; + +uses + Forms, + Main in 'Main.pas' {MainForm}, + Data in 'Data.pas' {DM: TDataModule}, + About in 'About.pas' {AboutForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver.res new file mode 100644 index 0000000000000000000000000000000000000000..c2869c8ddda418d0c5f6f1a8c422f730659835db GIT binary patch literal 876 zcmb7Dv5FKy5Uq6&78AYU94@>K4IPeU1OpW#13e}<`#$5EX140sU`J%>0)vf?^GC#B zllhbj4bAL8XkX3jf`W;~yy<@Rs;g?cr-_K>K+YpD{mZ^TIOtQvOa|@v_~FqZ=qV<1 z;1w{Ty&G%(Z5bh~j8&ja8zV9Je6E@^=zdOpBkTSP0uN9iU4{&Ljgpaofs!euo<}R7`78Ug{CMO zUk+{ya>gzhy|&{po-;mA?R2o=qXW9h2pAk`FAokhk;dpT0+p;5EcfHD@eA_=`~dEO zevb~L;eV~eZ)@m@riOboirkM;;|#T44%ece<|jn-49NKry`$Ikmfizz=mO)x{=64< Q8zwZL9}Ty{ZqbB(1Go+zjsO4v literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.bdsproj b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.bdsproj new file mode 100644 index 0000000..3a6e56e --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.bdsproj @@ -0,0 +1,184 @@ + + + + + + + + + + + + FailOver_VclNet.dpr + + + + + + + + + + + + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + + + + + + + + d:\windows\microsoft.net\framework\v1.1.4322 + d:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll + + + True + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.dpr b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.dpr new file mode 100644 index 0000000..d4fc643 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.dpr @@ -0,0 +1,17 @@ +program FailOver_VclNet; + +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\system.drawing.dll'} + +uses + Forms, + Main in 'Main.pas' {MainForm}, + Data in 'Data.pas' {DM: TDataModule}, + About in 'About.pas' {AboutForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/FailOver_VclNet.res new file mode 100644 index 0000000000000000000000000000000000000000..c2869c8ddda418d0c5f6f1a8c422f730659835db GIT binary patch literal 876 zcmb7Dv5FKy5Uq6&78AYU94@>K4IPeU1OpW#13e}<`#$5EX140sU`J%>0)vf?^GC#B zllhbj4bAL8XkX3jf`W;~yy<@Rs;g?cr-_K>K+YpD{mZ^TIOtQvOa|@v_~FqZ=qV<1 z;1w{Ty&G%(Z5bh~j8&ja8zV9Je6E@^=zdOpBkTSP0uN9iU4{&Ljgpaofs!euo<}R7`78Ug{CMO zUk+{ya>gzhy|&{po-;mA?R2o=qXW9h2pAk`FAokhk;dpT0+p;5EcfHD@eA_=`~dEO zevb~L;eV~eZ)@m@riOboirkM;;|#T44%ece<|jn-49NKry`$Ikmfizz=mO)x{=64< Q8zwZL9}Ty{ZqbB(1Go+zjsO4v literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Main.dfm b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Main.dfm new file mode 100644 index 0000000..a30c0c5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Main.dfm @@ -0,0 +1,758 @@ +object MainForm: TMainForm + Left = 200 + Top = 130 + Width = 820 + Height = 480 + Caption = 'FailOver Demo' + Color = clBtnFace + Constraints.MinHeight = 480 + Constraints.MinWidth = 820 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnActivate = FormActivate + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object pnRight: TPanel + Left = 256 + Top = 49 + Width = 556 + Height = 385 + Align = alClient + BevelOuter = bvNone + ParentColor = True + TabOrder = 0 + object Splitter1: TSplitter + Left = 0 + Top = 331 + Width = 556 + Height = 2 + Cursor = crVSplit + Align = alTop + Beveled = True + Color = clBtnFace + ParentColor = False + ResizeStyle = rsUpdate + end + object pnMiddle: TPanel + Left = 0 + Top = 0 + Width = 556 + Height = 331 + Align = alTop + BevelOuter = bvNone + Constraints.MinHeight = 160 + ParentColor = True + TabOrder = 0 + object Splitter: TSplitter + Left = 0 + Top = 153 + Width = 556 + Height = 2 + Cursor = crVSplit + Align = alTop + Beveled = True + Color = clBtnFace + MinSize = 100 + ParentColor = False + ResizeStyle = rsUpdate + end + object pnDetail: TPanel + Left = 0 + Top = 155 + Width = 556 + Height = 176 + Align = alClient + BevelOuter = bvNone + ParentColor = True + TabOrder = 0 + object DBGrid2: TDBGrid + Left = 0 + Top = 27 + Width = 556 + Height = 149 + Align = alClient + DataSource = DM.dsDetail + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object Panel9: TPanel + Left = 0 + Top = 0 + Width = 556 + Height = 27 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel7: TPanel + Left = 0 + Top = 2 + Width = 242 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object DBNavigator2: TDBNavigator + Left = 1 + Top = 1 + Width = 240 + Height = 22 + DataSource = DM.dsDetail + Flat = True + TabOrder = 0 + end + end + end + end + object pnMaster: TPanel + Left = 0 + Top = 0 + Width = 556 + Height = 153 + Align = alTop + BevelOuter = bvNone + Constraints.MinHeight = 100 + ParentColor = True + TabOrder = 1 + object DBGrid1: TDBGrid + Left = 0 + Top = 1 + Width = 556 + Height = 152 + Align = alBottom + Anchors = [akLeft, akTop, akRight, akBottom] + DataSource = DM.dsMaster + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + end + end + object pnBottom: TPanel + Left = 0 + Top = 333 + Width = 556 + Height = 52 + Align = alClient + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object meLog: TMemo + Left = 0 + Top = 0 + Width = 556 + Height = 52 + Align = alClient + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + end + end + object pnLeft: TPanel + Left = 0 + Top = 49 + Width = 256 + Height = 385 + Align = alLeft + BevelOuter = bvNone + ParentColor = True + TabOrder = 1 + object Panel8: TPanel + Left = 1 + Top = 128 + Width = 243 + Height = 254 + BevelOuter = bvNone + TabOrder = 0 + object cbPooling: TCheckBox + Left = 8 + Top = 138 + Width = 150 + Height = 17 + Caption = 'Pooling' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 6 + OnClick = cbPoolingClick + end + object pnPooling: TPanel + Left = 26 + Top = 157 + Width = 215 + Height = 95 + BevelOuter = bvNone + Color = clGreen + TabOrder = 7 + object Panel10: TPanel + Left = 1 + Top = 1 + Width = 213 + Height = 93 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 0 + object Label2: TLabel + Left = 6 + Top = 54 + Width = 90 + Height = 13 + Caption = 'ConnectionLifetime' + end + object Label3: TLabel + Left = 6 + Top = 8 + Width = 61 + Height = 13 + Caption = 'MaxPoolSize' + end + object Label4: TLabel + Left = 6 + Top = 31 + Width = 58 + Height = 13 + Caption = 'MinPoolSize' + end + object cbValidate: TCheckBox + Left = 6 + Top = 77 + Width = 111 + Height = 14 + Alignment = taLeftJustify + Caption = 'Validate' + TabOrder = 3 + OnClick = cbValidateClick + end + object edMaxPoolSize: TEdit + Left = 104 + Top = 4 + Width = 103 + Height = 21 + TabOrder = 0 + OnExit = edMaxPoolSizeExit + end + object edMinPoolSize: TEdit + Left = 104 + Top = 27 + Width = 103 + Height = 21 + TabOrder = 1 + OnExit = edMinPoolSizeExit + end + object edConnectionLifetime: TEdit + Left = 104 + Top = 50 + Width = 103 + Height = 21 + TabOrder = 2 + OnExit = edConnectionLifetimeExit + end + end + end + object cbCachedUpdates: TCheckBox + Left = 8 + Top = 7 + Width = 150 + Height = 17 + Caption = 'CachedUpdates' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnClick = cbCachedUpdatesClick + end + object cbFailover: TCheckBox + Left = 8 + Top = 88 + Width = 73 + Height = 17 + Caption = 'Failover' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 4 + OnClick = cbFailoverClick + end + object cbLocalMasterDetail: TCheckBox + Left = 8 + Top = 27 + Width = 150 + Height = 17 + Caption = 'LocalMasterDetail' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnClick = cbLocalMasterDetailClick + end + object cbDisconnectedMode: TCheckBox + Left = 8 + Top = 68 + Width = 150 + Height = 17 + Caption = 'DisconnectedMode' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 3 + OnClick = cbDisconnectedModeClick + end + object cbFetchAll: TCheckBox + Left = 8 + Top = 48 + Width = 97 + Height = 17 + Caption = 'FetchAll' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 2 + OnClick = cbFetchAllClick + end + object pnFailover: TPanel + Left = 26 + Top = 106 + Width = 215 + Height = 28 + BevelOuter = bvNone + Color = clGreen + TabOrder = 5 + object Panel16: TPanel + Left = 1 + Top = 1 + Width = 213 + Height = 26 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 0 + object Label7: TLabel + Left = 5 + Top = 7 + Width = 52 + Height = 13 + Caption = 'RetryMode' + end + object coRetryMode: TComboBox + Left = 69 + Top = 3 + Width = 141 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + Items.Strings = ( + 'Default' + 'Raise' + 'Reconnect' + 'ReconnectExecute') + end + end + end + end + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 256 + Height = 122 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 2 + Top = 1 + Width = 253 + Height = 122 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object Panel15: TPanel + Left = 1 + Top = 1 + Width = 251 + Height = 60 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 11 + Top = 6 + Width = 48 + Height = 13 + Alignment = taRightJustify + Caption = 'Updates' + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel12: TPanel + Left = 12 + Top = 26 + Width = 229 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btApply: TSpeedButton + Left = 1 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Apply' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btApplyClick + end + object btCancel: TSpeedButton + Left = 153 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Cancel' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCancelClick + end + object btCommit: TSpeedButton + Left = 77 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Commit' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCommitClick + end + end + end + object Panel17: TPanel + Left = 1 + Top = 62 + Width = 251 + Height = 58 + BevelOuter = bvNone + TabOrder = 1 + object Label6: TLabel + Left = 11 + Top = 6 + Width = 74 + Height = 13 + Alignment = taRightJustify + Caption = 'Transactions' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel5: TPanel + Left = 12 + Top = 26 + Width = 229 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btStartTrans: TSpeedButton + Left = 1 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Start' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btStartTransClick + end + object btCommitTrans: TSpeedButton + Left = 77 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Commit' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCommitTransClick + end + object btRollbackTrans: TSpeedButton + Left = 153 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Rollback' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btRollbackTransClick + end + end + end + end + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 434 + Width = 812 + Height = 19 + Panels = < + item + Width = 208 + end + item + Width = 208 + end + item + Width = 208 + end + item + Width = 50 + end> + end + object pnTop: TPanel + Left = 0 + Top = 0 + Width = 812 + Height = 49 + Align = alTop + BevelOuter = bvNone + ParentColor = True + TabOrder = 3 + OnMouseMove = pnTopMouseMove + object lbAbout: TLabel + Left = 762 + Top = 6 + Width = 34 + Height = 13 + Cursor = crHandPoint + Anchors = [akTop, akRight] + Caption = 'About' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold, fsUnderline] + ParentFont = False + OnClick = lbAboutClick + OnMouseMove = lbAboutMouseMove + end + object Panel18: TPanel + Left = 2 + Top = 1 + Width = 418 + Height = 47 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btConnect: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Connect' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btConnectClick + end + object btDisconnect: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Disconnect' + Enabled = False + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btDisconnectClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btOpenClick + end + object btKillSession: TSpeedButton + Left = 333 + Top = 1 + Width = 84 + Height = 22 + Caption = 'Kill session' + Enabled = False + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btKillSessionClick + end + object btCreate: TSpeedButton + Left = 1 + Top = 24 + Width = 82 + Height = 22 + Caption = 'Create' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btCreateDropClick + end + object btDrop: TSpeedButton + Left = 84 + Top = 24 + Width = 82 + Height = 22 + Caption = 'Drop' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btCreateDropClick + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 24 + Width = 250 + Height = 22 + DataSource = DM.dsMaster + Flat = True + TabOrder = 0 + end + end + object cbDebug: TCheckBox + Left = 685 + Top = 5 + Width = 64 + Height = 17 + Anchors = [akTop, akRight] + Caption = 'Debug' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + OnClick = cbDebugClick + end + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Main.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Main.pas new file mode 100644 index 0000000..aee12c7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/Main.pas @@ -0,0 +1,533 @@ +unit Main; + +interface + +uses + Classes, SysUtils, + Windows, Menus, ImgList, StdCtrls, ComCtrls, Buttons, ExtCtrls, Graphics, + Controls, Forms, Dialogs, Grids, DBCtrls, DBGrids, + DB, MemData, DBAccess, Data, About; + +type + TMainForm = class(TForm) + DBGrid1: TDBGrid; + pnTop: TPanel; + btConnect: TSpeedButton; + btDisconnect: TSpeedButton; + btOpen: TSpeedButton; + btClose: TSpeedButton; + pnMaster: TPanel; + pnRight: TPanel; + pnLeft: TPanel; + pnMiddle: TPanel; + DBGrid2: TDBGrid; + Panel7: TPanel; + DBNavigator2: TDBNavigator; + Panel8: TPanel; + cbFailover: TCheckBox; + cbLocalMasterDetail: TCheckBox; + cbCachedUpdates: TCheckBox; + cbPooling: TCheckBox; + pnPooling: TPanel; + Panel10: TPanel; + cbValidate: TCheckBox; + edMaxPoolSize: TEdit; + edMinPoolSize: TEdit; + edConnectionLifetime: TEdit; + Label2: TLabel; + Label3: TLabel; + Label4: TLabel; + pnBottom: TPanel; + meLog: TMemo; + cbDisconnectedMode: TCheckBox; + cbFetchAll: TCheckBox; + Panel12: TPanel; + btApply: TSpeedButton; + btCancel: TSpeedButton; + btCommit: TSpeedButton; + Label1: TLabel; + Panel5: TPanel; + btStartTrans: TSpeedButton; + btCommitTrans: TSpeedButton; + btRollbackTrans: TSpeedButton; + Label6: TLabel; + StatusBar: TStatusBar; + btKillSession: TSpeedButton; + coRetryMode: TComboBox; + Label7: TLabel; + pnDetail: TPanel; + Splitter: TSplitter; + DBNavigator1: TDBNavigator; + Panel9: TPanel; + lbAbout: TLabel; + pnFailover: TPanel; + Panel16: TPanel; + Panel18: TPanel; + Splitter1: TSplitter; + Panel15: TPanel; + Panel17: TPanel; + Panel1: TPanel; + cbDebug: TCheckBox; + Panel2: TPanel; + btDrop: TSpeedButton; + btCreate: TSpeedButton; + procedure FormCreate(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure cbFailoverClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure cbPoolingClick(Sender: TObject); + procedure edMaxPoolSizeExit(Sender: TObject); + procedure edMinPoolSizeExit(Sender: TObject); + procedure edConnectionLifetimeExit(Sender: TObject); + procedure cbValidateClick(Sender: TObject); + procedure cbCachedUpdatesClick(Sender: TObject); + procedure cbDisconnectedModeClick(Sender: TObject); + procedure FormActivate(Sender: TObject); + procedure cbLocalMasterDetailClick(Sender: TObject); + procedure cbFetchAllClick(Sender: TObject); + procedure btApplyClick(Sender: TObject); + procedure btCommitClick(Sender: TObject); + procedure btCancelClick(Sender: TObject); + procedure btStartTransClick(Sender: TObject); + procedure btCommitTransClick(Sender: TObject); + procedure btRollbackTransClick(Sender: TObject); + procedure btKillSessionClick(Sender: TObject); + procedure lbAboutClick(Sender: TObject); + procedure cbDebugClick(Sender: TObject); + procedure lbAboutMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure pnTopMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure btCreateDropClick(Sender: TObject); + private + FActivated, + FShouldNotUpdateControls: boolean; + procedure OptionsToEditors; + procedure EditorsToOptions; + function GetShouldNotUpdateControls: boolean; + + procedure ConnectionAfterConnect(Sender: TObject); + procedure ConnectionAfterDisconnect(Sender: TObject); + procedure ConnectionConnectionLost(Sender: TObject; + Component: TComponent; ConnLostCause: TConnLostCause; + var RetryMode: TRetryMode); + procedure dsUpdateData(Sender: TObject); + procedure dsDataChange(Sender: TObject; Field: TField); + + procedure ShowPending; + procedure ShowTrans; + public + property ShouldNotUpdateControls: boolean read GetShouldNotUpdateControls; + end; + +var + MainForm: TMainForm; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +{$IFNDEF VER130} +{$IFNDEF VER140} +{$IFNDEF CLR} + {$DEFINE XPMAN} + {$R WindowsXP.res} +{$ENDIF} +{$ENDIF} +{$ENDIF} + +{$IFDEF XPMAN} +uses + UxTheme; +{$ENDIF} + +function TMainForm.GetShouldNotUpdateControls: boolean; +begin + Result := not FActivated or FShouldNotUpdateControls; +end; + +procedure TMainForm.OptionsToEditors; +begin + FShouldNotUpdateControls := True; + cbFailover.Checked := DM.Connection.Options.LocalFailover; + cbPooling.Checked := DM.Connection.Pooling; + with DM.Connection.PoolingOptions do begin + edMaxPoolSize.Text := IntToStr(MaxPoolSize); + edMinPoolSize.Text := IntToStr(MinPoolSize); + edConnectionLifetime.Text := IntToStr(ConnectionLifetime); + cbValidate.Checked := Validate; + end; + cbCachedUpdates.Checked := DM.quDetail.CachedUpdates; + cbLocalMasterDetail.Checked := DM.quDetail.Options.LocalMasterDetail; + cbFetchAll.Checked := DM.quDetail.FetchAll; + cbDisconnectedMode.Checked := DM.Connection.Options.DisconnectedMode; + cbDebug.Checked := DM.quMaster.Debug; + FShouldNotUpdateControls := False; +end; + +procedure TMainForm.EditorsToOptions; +var + OnExit: TNotifyEvent; +begin + if ActiveControl is TEdit then + OnExit := TEdit(ActiveControl).OnExit + else + if ActiveControl is TMemo then + OnExit := TMemo(ActiveControl).OnExit + else + Exit; + if Assigned(OnExit) then + OnExit(nil); +end; + +procedure TMainForm.FormCreate(Sender: TObject); +{$IFDEF XPMAN} + procedure UpdateStyle(Control: TWinControl); + var + Panel: TPanel; + i: integer; + begin + for i := 0 to Control.ControlCount - 1 do begin + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := False + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := False; + if Control.Controls[i] is TWinControl then begin + if (Control.Controls[i] is TPanel) then begin + Panel := TPanel(Control.Controls[i]); + Panel.ParentBackground := False; + Panel.Color := clBtnFace; + end; + UpdateStyle(TWinControl(Control.Controls[i])); + end; + end; + end; +{$ENDIF} + +begin + DM := TDM.Create(nil); + AboutForm := TAboutForm.Create(nil); +{$IFDEF XPMAN} + if UseThemes then + UpdateStyle(Self); +{$ENDIF} + DM.Connection.AfterConnect := ConnectionAfterConnect; + DM.Connection.AfterDisconnect := ConnectionAfterDisconnect;; + DM.Connection.OnConnectionLost := ConnectionConnectionLost; + DM.dsDetail.OnStateChange := dsUpdateData; + DM.dsDetail.OnDataChange := dsDataChange; + DM.dsMaster.OnStateChange := dsUpdateData; + DM.dsMaster.OnDataChange := dsDataChange; + OptionsToEditors; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + DM.Free; + AboutForm.Free; +end; + +procedure TMainForm.FormActivate(Sender: TObject); +begin + FActivated := True; +end; + +procedure TMainForm.btConnectClick(Sender: TObject); +begin + EditorsToOptions; + DM.Connection.Connect; +end; + +procedure TMainForm.btDisconnectClick(Sender: TObject); +begin + EditorsToOptions; + DM.Connection.Disconnect; +end; + +procedure TMainForm.btOpenClick(Sender: TObject); +begin + EditorsToOptions; + DM.quMaster.Open; + DM.quDetail.Open; +end; + +procedure TMainForm.btCloseClick(Sender: TObject); +begin + EditorsToOptions; + DM.quMaster.Close; + DM.quDetail.Close; +end; + +procedure TMainForm.cbDisconnectedModeClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + try + DM.Connection.Options.DisconnectedMode := cbDisconnectedMode.Checked; + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.cbFailoverClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + DM.Connection.Options.LocalFailover := cbFailover.Checked; +end; + +procedure TMainForm.cbPoolingClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + DM.Connection.Pooling := cbPooling.Checked; +end; + +procedure TMainForm.edMaxPoolSizeExit(Sender: TObject); +begin + try + DM.Connection.PoolingOptions.MaxPoolSize := StrToInt(edMaxPoolSize.Text); + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.edMinPoolSizeExit(Sender: TObject); +begin + try + DM.Connection.PoolingOptions.MinPoolSize := StrToInt(edMinPoolSize.Text); + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.edConnectionLifetimeExit(Sender: TObject); +begin + try + DM.Connection.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifetime.Text); + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.cbValidateClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + DM.Connection.PoolingOptions.Validate := cbValidate.Checked; +end; + +procedure TMainForm.cbCachedUpdatesClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + try + DM.quDetail.CachedUpdates := cbCachedUpdates.Checked; + DM.quMaster.CachedUpdates := cbCachedUpdates.Checked; + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.ConnectionConnectionLost(Sender: TObject; + Component: TComponent; ConnLostCause: TConnLostCause; + var RetryMode: TRetryMode); +var + Msg: string; +begin + case ConnLostCause of + clUnknown: + Msg := 'for reasons not known'; + clExecute: + Msg := 'during SQL execution'; + clOpen: + Msg := 'during query opening'; + clApply: + Msg := 'during DataSet.ApplyUpdates'; + clServiceQuery: + Msg := 'during service information request'; + clTransStart: + Msg := 'during transaction start'; + clConnectionApply: + Msg := 'during Connection.ApplyUpdates'; + clConnect: + Msg := 'during connection establishing'; + end; + meLog.Lines.Add(TimeToStr(Now) + ' ' + Component.Name + ' - Connection lost ' + Msg); + if coRetryMode.ItemIndex <> 0 then + RetryMode := TRetryMode(coRetryMode.ItemIndex - 1) +end; + +procedure TMainForm.ConnectionAfterConnect(Sender: TObject); +begin + btConnect.Enabled := False; + btDisconnect.Enabled := True; + btKillSession.Enabled := True; +end; + +procedure TMainForm.ConnectionAfterDisconnect(Sender: TObject); +begin + btDisconnect.Enabled := False; + btKillSession.Enabled := False; + btConnect.Enabled := True; +end; + +procedure TMainForm.dsUpdateData(Sender: TObject); +begin + ShowPending; +end; + +procedure TMainForm.dsDataChange(Sender: TObject; Field: TField); +begin + ShowPending; +end; + +procedure TMainForm.cbLocalMasterDetailClick(Sender: TObject); +begin + try + DM.quDetail.Options.LocalMasterDetail := cbLocalMasterDetail.Checked; + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.cbFetchAllClick(Sender: TObject); +begin + DM.quDetail.FetchAll := cbFetchAll.Checked; + DM.quMaster.FetchAll := cbFetchAll.Checked; +end; + +procedure TMainForm.ShowPending; +begin + if DM.quMaster.UpdatesPending then + StatusBar.Panels[0].Text := 'Master Updates Pending' + else + StatusBar.Panels[0].Text := ''; + if DM.quDetail.UpdatesPending then + StatusBar.Panels[1].Text := 'Detail Updates Pending' + else + StatusBar.Panels[1].Text := ''; +end; + +procedure TMainForm.ShowTrans; +begin + if DM.InTransaction then + StatusBar.Panels[2].Text := 'UpdateTransaction is Active' + else + StatusBar.Panels[2].Text := ''; +end; + +procedure TMainForm.btApplyClick(Sender: TObject); +begin + if DM.quMaster.UpdatesPending then + DM.quMaster.ApplyUpdates; + if DM.quDetail.UpdatesPending then + DM.quDetail.ApplyUpdates; + ShowPending; +end; + +procedure TMainForm.btCommitClick(Sender: TObject); +begin + DM.quMaster.CommitUpdates; + DM.quDetail.CommitUpdates; + ShowPending; +end; + +procedure TMainForm.btCancelClick(Sender: TObject); +begin + if DM.quMaster.UpdatesPending then + DM.quMaster.CancelUpdates; + if DM.quDetail.UpdatesPending then + DM.quDetail.CancelUpdates; + ShowPending; +end; + +procedure TMainForm.btStartTransClick(Sender: TObject); +begin + DM.StartTransaction; + ShowTrans; +end; + +procedure TMainForm.btCommitTransClick(Sender: TObject); +begin + DM.CommitTransaction; + ShowTrans; +end; + +procedure TMainForm.btRollbackTransClick(Sender: TObject); +begin + DM.RollbackTransaction; + ShowTrans; +end; + +procedure TMainForm.btKillSessionClick(Sender: TObject); +begin + try + DM.KillSession; + btKillSession.Enabled := False; + meLog.Lines.Add(TimeToStr(Now) + ' Session was killed'); + except + on e: Exception do + meLog.Lines.Add(TimeToStr(Now) + ' ' + Trim(e.Message)); + end; +end; + +procedure TMainForm.lbAboutMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +begin + lbAbout.Font.Color := $4080FF; +end; + +procedure TMainForm.pnTopMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbAbout.Font.Color := $FF0000; +end; + +procedure TMainForm.lbAboutClick(Sender: TObject); +begin + AboutForm.ShowModal; + lbAbout.Font.Color := $FF0000; +end; + +procedure TMainForm.cbDebugClick(Sender: TObject); +begin + DM.quMaster.Debug := cbDebug.Checked; + DM.quDetail.Debug := cbDebug.Checked; + DM.scCreate.Debug := cbDebug.Checked; + DM.scDrop.Debug := cbDebug.Checked; +end; + +procedure TMainForm.btCreateDropClick(Sender: TObject); +var + s: string; +begin + if Sender = btDrop then + s := 'removed from database' + else + s := 'created in database'; + if MessageDlg(Format('Objects required for the demo will be %s. Continue?', [s]), + mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin + if Sender = btCreate then + DM.scCreate.Execute + else + DM.scDrop.Execute; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/ReadMe.txt new file mode 100644 index 0000000..987563d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/FailOver/ReadMe.txt @@ -0,0 +1,10 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demonstrates the recommended approach to working with unstable networks. +This sample lets you perform transactions and updates in several different +modes, simulate a sudden session termination, and view what happens to your +data state when connections to the server are unexpectedly lost. Shows off +CachedUpdates, LocalMasterDetail, FetchAll, Pooling, and different Failover +modes. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.bdsproj b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.bdsproj new file mode 100644 index 0000000..67e59e6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.bdsproj @@ -0,0 +1,160 @@ + + + + + + + + + + + + Client.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.cfg b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.cfg new file mode 100644 index 0000000..23380bb --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.cfg @@ -0,0 +1,37 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q+ +-$R+ +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"." +-N"." +-LE"." +-LN"." \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.dpr b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.dpr new file mode 100644 index 0000000..7cf2d7c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.dpr @@ -0,0 +1,13 @@ +program Client; + +uses + Forms, + ClientForm in 'ClientForm.pas' {fmClient}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfmClient, fmClient); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Client.res new file mode 100644 index 0000000000000000000000000000000000000000..fab56897ff8332065f8e5042317f9a310d4a83d6 GIT binary patch literal 1540 zcmah|L2DC16#mi#wuqPtUh1VmM8t!%8W2ydSZfN=ij`hV(OQdb5^5z|ddLca_10^b z9Q+U7LXa#N=%r`Rf){W0mXwx`-+QyWNkh?>ynQqCeeb<*W_JJ}M>obghv)3~NQ|e+ zNhvlqHlB$|w>iksXXq(J%gnjhJb-_Ao(+6*NcRwiApsE~!Pvm3)g_BVR&}{>NVDrs z&G&Q~EjWJ9y?j{IpD>&r2|}lZvQQI3(VEQvOE?&)APL2R3Nt{aqlAuH2(Wg|?^dH0 zf|KA@D^P;sB=`<6S|}D3?;Ld9iVLq^?^wL(RvmwI=W`*#JHB75_{|`}pH{oI-IL~i zg1c_F-3<1bk6Buwy0?3B(hQC`m%eqk+iJHPI?o91?zCI2AoxO@0z36?&^m6gfFuZB z2smpf4oRpV2MzKSj|f4~w76!}dt^koEX*uq_Zq<-%O%#c{gZh%PLEcORbB!kE7{+T zF`tgI#tYNN;}=4&g~0SrV1i<^kvp7=r~l>TI^sR@=&4i2Ge&-8X%jLY71G9>I>wx3 z87CO0uK}2(8*>HE@CfsGPJfIA#@Gh$h1`Y|a=DD&3b{ooxXE1_yYMc#BYBou!XlRW ze1ex8&1;8c?Kj7<*tg6dk;_pESM^HTIISq(q$1HI3O|&$h;3|P9VM(`j&TF4tX#rd zl*#+5oJr&{g@@d2o*M3R{RaD_xYsf^QNarNJKXgOXRAq*JIaY`&Jy{6*V?PXp6kpl zCEPqNksWiF$lW5l&zZtqcDH^H4+b=d)@|jN*neY4#VyrPB)+DoD6UYe?060Dm}$*w z?ekudv4S_u+hp9rd#Z`eau=c+a&po))-JRDDcEy*L2jAVK63xtLkht&9i__ioZ%A~ u+`oKt*L7d^{H2?mL9B3Ag)XV?SXKXx0yp(*usbX + end + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 833 + Height = 48 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Panel1: TPanel + Left = 2 + Top = 1 + Width = 499 + Height = 46 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btCancelUpd: TSpeedButton + Left = 416 + Top = 1 + Width = 82 + Height = 22 + Caption = 'CancelUpd' + Flat = True + Transparent = False + OnClick = btCancelUpdClick + end + object btApplyUpd: TSpeedButton + Left = 334 + Top = 1 + Width = 81 + Height = 22 + Caption = 'ApplyUpd' + Flat = True + Transparent = False + OnClick = btApplyUpdClick + end + object btClose: TSpeedButton + Left = 252 + Top = 1 + Width = 81 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 167 + Top = 1 + Width = 84 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btDisconnect: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Disconnect' + Flat = True + Transparent = False + OnClick = btDisconnectClick + end + object brConnect: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Connect' + Flat = True + Transparent = False + OnClick = brConnectClick + end + object DBNavigator1: TDBNavigator + Left = 1 + Top = 24 + Width = 250 + Height = 21 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object ToolBar1: TPanel + Left = 252 + Top = 24 + Width = 246 + Height = 21 + BevelOuter = bvNone + TabOrder = 1 + object DeptNo: TLabel + Left = 7 + Top = 1 + Width = 71 + Height = 21 + Alignment = taCenter + AutoSize = False + Caption = 'EmployeeID' + Layout = tlCenter + end + object edEmployeeID: TEdit + Left = 99 + Top = 1 + Width = 121 + Height = 21 + TabOrder = 0 + Text = '10' + end + end + end + end + object DataSource: TDataSource + DataSet = ClientDataSet + Left = 408 + Top = 252 + end + object ClientDataSet: TClientDataSet + Aggregates = <> + Params = < + item + DataType = ftInteger + Name = 'EmployeeID' + ParamType = ptInput + Value = 10 + end> + ProviderName = 'MSDataSetProvider' + RemoteServer = RemoteServer + Left = 376 + Top = 252 + end + object RemoteServer: TDCOMConnection + ServerGUID = '{706739B2-FB40-49CC-9041-2B82CFFC520C}' + ServerName = 'Server.Datas' + Left = 344 + Top = 253 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ClientForm.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ClientForm.pas new file mode 100644 index 0000000..c010d35 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ClientForm.pas @@ -0,0 +1,149 @@ +unit ClientForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Grids, DBGrids, ToolWin, ComCtrls, Db, DBClient, ExtCtrls, DBCtrls, + StdCtrls, MConnect, MidasCon, Buttons; + +type + TfmClient = class(TForm) + DBGrid: TDBGrid; + DataSource: TDataSource; + ClientDataSet: TClientDataSet; + StatusBar: TStatusBar; + RemoteServer: TDCOMConnection; + Panel2: TPanel; + Panel1: TPanel; + btCancelUpd: TSpeedButton; + btApplyUpd: TSpeedButton; + btClose: TSpeedButton; + btOpen: TSpeedButton; + btDisconnect: TSpeedButton; + brConnect: TSpeedButton; + DBNavigator1: TDBNavigator; + ToolBar1: TPanel; + DeptNo: TLabel; + edEmployeeID: TEdit; + procedure brConnectClick(Sender: TObject); + procedure RemoteServerAfterConnect(Sender: TObject); + procedure RemoteServerAfterDisconnect(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btApplyUpdClick(Sender: TObject); + procedure btCancelUpdClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + fmClient: TfmClient; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFNDEF VER130} +{$IFNDEF VER140} +{$IFNDEF CLR} + {$DEFINE XPMAN} + {$R WindowsXP.res} +{$ENDIF} +{$ENDIF} +{$ENDIF} + +{$IFDEF XPMAN} +uses + UxTheme; +{$ENDIF} + +procedure TfmClient.brConnectClick(Sender: TObject); +begin + RemoteServer.Connected:= True; +end; + +procedure TfmClient.btDisconnectClick(Sender: TObject); +begin + RemoteServer.Connected:= False; +end; + +procedure TfmClient.RemoteServerAfterConnect(Sender: TObject); +begin + StatusBar.Panels[0].Text:= 'Connected'; +end; + +procedure TfmClient.RemoteServerAfterDisconnect(Sender: TObject); +begin + if Assigned(StatusBar) then + StatusBar.Panels[0].Text:= 'Disconnected'; +end; + +procedure TfmClient.btOpenClick(Sender: TObject); +begin + if edEmployeeID.Text <> '' then + ClientDataSet.Params.ParamByName('EmployeeID').AsInteger:= StrToInt(edEmployeeID.Text); + ClientDataSet.Open; + edEmployeeID.Text:= IntToStr(ClientDataSet.Params.ParamByName('EmployeeID').AsInteger); +end; + +procedure TfmClient.btCloseClick(Sender: TObject); +begin + ClientDataSet.Close; +end; + +procedure TfmClient.btApplyUpdClick(Sender: TObject); +begin + ClientDataSet.ApplyUpdates(0); +end; + +procedure TfmClient.btCancelUpdClick(Sender: TObject); +begin + ClientDataSet.CancelUpdates; +end; + +procedure TfmClient.FormCreate(Sender: TObject); +{$IFDEF XPMAN} + procedure UpdateStyle(Control: TWinControl); + var + Panel: TPanel; + i: integer; + begin + for i := 0 to Control.ControlCount - 1 do begin + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := False + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := False; + if Control.Controls[i] is TWinControl then begin + if (Control.Controls[i] is TPanel) then begin + Panel := TPanel(Control.Controls[i]); + Panel.ParentBackground := False; + Panel.Color := clBtnFace; + end; + UpdateStyle(TWinControl(Control.Controls[i])); + end; + end; + end; +{$ENDIF} +begin +{$IFDEF XPMAN} + if UseThemes then + UpdateStyle(Self); +{$ENDIF} +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Data.dfm b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Data.dfm new file mode 100644 index 0000000..1db12e3 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Data.dfm @@ -0,0 +1,55 @@ +object Datas: TDatas + OldCreateOrder = False + OnCreate = DatasCreate + Left = 246 + Top = 272 + Height = 485 + Width = 694 + object MSConnection: TMSConnection + Database = 'Northwind' + AfterConnect = ConnectionChange + AfterDisconnect = ConnectionChange + ConnectDialog = MSConnectDialog + Left = 24 + Top = 16 + end + object Query: TMSQuery + Connection = MSConnection + SQL.Strings = ( + 'SELECT *' + 'FROM Employees' + 'WHERE EmployeeID < :EmployeeID') + Debug = True + Left = 72 + Top = 16 + ParamData = < + item + DataType = ftInteger + Name = 'EmployeeID' + ParamType = ptInput + end> + end + object DataSetProvider: TDataSetProvider + DataSet = Query + ResolveToDataSet = True + Options = [poNoReset] + Left = 128 + Top = 64 + end + object MSConnectDialog: TMSConnectDialog + SavePassword = True + Caption = 'Connect' + UsernameLabel = 'User Name' + PasswordLabel = 'Password' + ServerLabel = 'Server' + ConnectButton = 'Connect' + CancelButton = 'Cancel' + Left = 24 + Top = 64 + end + object MSDataSetProvider: TDataSetProvider + DataSet = Query + Left = 128 + Top = 16 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Data.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Data.pas new file mode 100644 index 0000000..d4b8bc7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Data.pas @@ -0,0 +1,100 @@ +unit Data; + +interface + +uses + Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr, + DBClient, Server_TLB, StdVcl, Db, MemDS, Provider, + DBTables, DBAccess, MSAccess, Dialogs, SdacVcl; + +type + TDatas = class(TRemoteDataModule, IDatas) + MSConnection: TMSConnection; + Query: TMSQuery; + DataSetProvider: TDataSetProvider; + MSConnectDialog: TMSConnectDialog; + MSDataSetProvider: TDataSetProvider; + procedure DatasCreate(Sender: TObject); + procedure DatasDestroy(Sender: TObject); + procedure ConnectionChange(Sender: TObject); + private + { Private declarations } + protected + class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override; + public + { Public declarations } + end; + +var + Datas:TDatas; + +implementation +uses ServerForm; +var + CountConnection:integer; + +{$R *.DFM} + +class procedure TDatas.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); +begin + if Register then + begin + inherited UpdateRegistry(Register, ClassID, ProgID); + EnableSocketTransport(ClassID); + EnableWebTransport(ClassID); + end else + begin + DisableSocketTransport(ClassID); + DisableWebTransport(ClassID); + inherited UpdateRegistry(Register, ClassID, ProgID); + end; +end; + +procedure TDatas.DatasCreate(Sender: TObject); +var + St: string; +begin + if not Assigned(Datas) then begin + Datas := TDatas(Sender); + St := Query.SQL.Text; + + fmServer.meSQL.Lines.Text := St; + fmServer.cbDebug.Checked := Query.Debug; + fmServer.DataSource.DataSet := Query; + fmServer.rbDSResolve.Checked := MSDataSetProvider.ResolveToDataset; + fmServer.rbSQLResolve.Checked := not MSDataSetProvider.ResolveToDataset; + end; + + Inc(CountConnection); + fmServer.StatusBar.Panels[0].Text := 'Count connections ' + IntToStr(CountConnection); +end; + +procedure TDatas.DatasDestroy(Sender: TObject); +begin + if Datas = TDatas(Sender) then begin + if Assigned(fmServer) then + fmServer.DataSource.DataSet := nil; + Datas := nil; + end; + + Dec(CountConnection); + if Assigned(fmServer) then + fmServer.StatusBar.Panels[0].Text := 'Count connections ' + IntToStr(CountConnection); +end; + +procedure TDatas.ConnectionChange(Sender: TObject); +begin + if (Sender as TCustomDAConnection).Connected then + Inc(CountConnection) + else + Dec(CountConnection); + + if Assigned(fmServer) then + fmServer.StatusBar.Panels[0].Text := 'Count connections ' + IntToStr(CountConnection); +end; + +initialization + TComponentFactory.Create(ComServer, TDatas, + Class_Datas, ciMultiInstance{, tmApartment}); +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/MidasGroup.bpg b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/MidasGroup.bpg new file mode 100644 index 0000000..471b6ea --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/MidasGroup.bpg @@ -0,0 +1,24 @@ +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = Server.exe Client.exe +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + + +Server.exe: Server.dpr + $(DCC) + +Client.exe: Client.dpr + $(DCC) + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Midas_TLB.dcr b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Midas_TLB.dcr new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Midas_TLB.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Midas_TLB.pas new file mode 100644 index 0000000..cce80cd --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Midas_TLB.pas @@ -0,0 +1,100 @@ +unit Midas_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1.88.1.0.1.0 $ +// File generated on 02.07.2001 15:36:17 from Type Library described below. + +// ************************************************************************ // +// Type Lib: C:\WINDOWS\SYSTEM\MIDAS.DLL (1) +// IID\LCID: {83F57D68-CA9A-11D2-9088-00C04FA35CFA}\0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (C:\WINDOWS\SYSTEM\stdole2.tlb) +// Parent TypeLibrary: +// (0) v1.0 Server, (D:\Projects\Delphi\MSDAC\Demos\Midas\Delphi5\Server.tlb) +// ************************************************************************ // +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +interface + +uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + MidasMajorVersion = 1; + MidasMinorVersion = 0; + + LIBID_Midas: TGUID = '{83F57D68-CA9A-11D2-9088-00C04FA35CFA}'; + + IID_IAppServer: TGUID = '{1AEFCC20-7A24-11D2-98B0-C69BEB4B5B6D}'; +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + IAppServer = interface; + IAppServerDisp = dispinterface; + +// *********************************************************************// +// Interface: IAppServer +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {1AEFCC20-7A24-11D2-98B0-C69BEB4B5B6D} +// *********************************************************************// + IAppServer = interface(IDispatch) + ['{1AEFCC20-7A24-11D2-98B0-C69BEB4B5B6D}'] + function AS_ApplyUpdates(const ProviderName: WideString; Delta: OleVariant; + MaxErrors: Integer; out ErrorCount: Integer; var OwnerData: OleVariant): OleVariant; safecall; + function AS_GetRecords(const ProviderName: WideString; Count: Integer; out RecsOut: Integer; + Options: Integer; const CommandText: WideString; + var Params: OleVariant; var OwnerData: OleVariant): OleVariant; safecall; + function AS_DataRequest(const ProviderName: WideString; Data: OleVariant): OleVariant; safecall; + function AS_GetProviderNames: OleVariant; safecall; + function AS_GetParams(const ProviderName: WideString; var OwnerData: OleVariant): OleVariant; safecall; + function AS_RowRequest(const ProviderName: WideString; Row: OleVariant; RequestType: Integer; + var OwnerData: OleVariant): OleVariant; safecall; + procedure AS_Execute(const ProviderName: WideString; const CommandText: WideString; + var Params: OleVariant; var OwnerData: OleVariant); safecall; + end; + +// *********************************************************************// +// DispIntf: IAppServerDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {1AEFCC20-7A24-11D2-98B0-C69BEB4B5B6D} +// *********************************************************************// + IAppServerDisp = dispinterface + ['{1AEFCC20-7A24-11D2-98B0-C69BEB4B5B6D}'] + function AS_ApplyUpdates(const ProviderName: WideString; Delta: OleVariant; + MaxErrors: Integer; out ErrorCount: Integer; var OwnerData: OleVariant): OleVariant; dispid 20000000; + function AS_GetRecords(const ProviderName: WideString; Count: Integer; out RecsOut: Integer; + Options: Integer; const CommandText: WideString; + var Params: OleVariant; var OwnerData: OleVariant): OleVariant; dispid 20000001; + function AS_DataRequest(const ProviderName: WideString; Data: OleVariant): OleVariant; dispid 20000002; + function AS_GetProviderNames: OleVariant; dispid 20000003; + function AS_GetParams(const ProviderName: WideString; var OwnerData: OleVariant): OleVariant; dispid 20000004; + function AS_RowRequest(const ProviderName: WideString; Row: OleVariant; RequestType: Integer; + var OwnerData: OleVariant): OleVariant; dispid 20000005; + procedure AS_Execute(const ProviderName: WideString; const CommandText: WideString; + var Params: OleVariant; var OwnerData: OleVariant); dispid 20000006; + end; + +implementation + +uses ComObj; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ReadMe.txt new file mode 100644 index 0000000..eda39af --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ReadMe.txt @@ -0,0 +1,9 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demonstrates using MIDAS technology with SDAC. This project consists of +two parts: a MIDAS server that processes requests to the database and a +thin MIDAS client that displays an interactive grid. This demo shows how +to build thin clients that display interactive components and delegate +all database interaction to a server application for processing. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.bdsproj b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.bdsproj new file mode 100644 index 0000000..0af7363 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.bdsproj @@ -0,0 +1,158 @@ + + + + + + + + + + + + Server.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.cfg b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.cfg new file mode 100644 index 0000000..fc13625 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q+ +-$R+ +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"." +-N"." +-LE"." +-LN"." +-U"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-O"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-I"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-R"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.dpr b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.dpr new file mode 100644 index 0000000..0223a83 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.dpr @@ -0,0 +1,17 @@ +program Server; + +uses + Forms, + ServerForm in 'ServerForm.pas' {fmServer}, + Server_TLB in 'Server_TLB.pas', + Data in 'Data.pas' {Datas: TRemoteDataModule} {Datas: CoClass}; + +{$R *.TLB} + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfmServer, fmServer); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.res new file mode 100644 index 0000000000000000000000000000000000000000..0d846944cbca49cb2bdf9da22f45a8b64da33cb8 GIT binary patch literal 1540 zcmah|L2DC16#mi#wum%6c&V2L5fKm4YCt@-Vy!7eD^_|fMQbg#X^53<=^-lw)?2S# za_~QR3qi7ApqHLK3tqh0TT)s&e(%lhCJjYj^7hTl_r3SNncV?^9Nie}9A2>BBQc&P zC#Bf<_(Ucq-R2-ipQWb|Ei>nG^8o(gc{cFLA>Bh5h6F@}1Y-lAR+lUeS=Hsj5zVeU zHQ&=|wBYzX_v%qmf5LEjBnX`r%0f*DMQbwuFX3>Yf+Q3ND$D|zjuJX*A;8)-zgvx3 z2u^}qEkg;4li)kRXrWkCymQ!f%Pzcny<_pBTXp==-Oq&x@A!VL>^Fl1e_HL<_D-7z z3GTYxb~89&KIUkJ>i*v8X)`$HT>94CZmZpH=sY91yW4KHg5V2r3hdOoLF=T!0+Jwj zA>gc`I3%Hd5;VwHJR$@^)8d*@?~xJVvM{@t-ERc@ESFf%_D|;7I6Yc9QF#fBtYm*T z#(X-?8ZS&6k6#GA76LOrfk}$ZM(%Jfp8l7U>xlQrqo>Xo&l&lZrA^3qTu2*p<`{FH zWt?Q3xdvd0Zp;{-;Sm<_ocCk6>^JGaFe?7E`hIw0z6}+dK*erK3sv##QePiu1>z{(v_=4PRR{O~P?+hsf&vcY3FLH)Y vU~vEP&0W`h+4Glfat5)&ITgCBx?@%SHwxU;ufguH#H>v+2j9m;=2zw~c^GA} literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.tlb b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server.tlb new file mode 100644 index 0000000000000000000000000000000000000000..4d272e2c0eaf2cd84d38a19242bfe3e12f444a4e GIT binary patch literal 1568 zcmeYbb_-!*U}OLRP8Kl55D4T#L>L&DAVP4G8ORcZ^8Q1C0+8PT#2`H&^&nv&#gGET z0YJeMP%(ZGA83FC5i9O{v42lfMOs!LFUh4Wni#D zlD`4udm!;)ZiA_(Hs3^%fkA-{Xd%>2kn?Z>P&haM15*S@gTfBvZx{f%i;=;C0Td;? zK+Md*2bKbft12=QZASu77bs3NfEZ+l1rWmk#100q9WXHv4HAa|SlGe%q|ydZ^I&ma z0pw2rSpo#O%t`>ty>-6Le(i>&Plwq_NPLrJdV$05GoBM1wVTfW3E}~zRgic_?bqg6r!EOj z=wLYDzc}WX98_H4%zG)7s!M`1HXNJ%+B-TI6el3{KnfhLAT|g9dEh7qg&QM~Ed!)M z{sn~t2!PzB%TQdBlAn`mq*s!Y6doQ93KI|jxlNTJH!~%%ST7|fCmdqp@FhX%ez5xv z6fdB>Gm!3NV|aKxIJKxOwJ1Cs + end + object DataSource: TDataSource + Left = 8 + Top = 64 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ServerForm.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ServerForm.pas new file mode 100644 index 0000000..9259a3c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/ServerForm.pas @@ -0,0 +1,160 @@ +unit ServerForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, ExtCtrls, DBCtrls, Db, + Buttons; + +type + TfmServer = class(TForm) + ToolBar: TPanel; + meSQL: TMemo; + DBGrid: TDBGrid; + DataSource: TDataSource; + StatusBar: TStatusBar; + Panel1: TPanel; + btConnect: TSpeedButton; + DBNavigator: TDBNavigator; + btDisconnect: TSpeedButton; + btOpen: TSpeedButton; + btClose: TSpeedButton; + ToolBar1: TPanel; + ToolButton2: TToolButton; + Panel2: TPanel; + ToolButton1: TToolButton; + cbDebug: TCheckBox; + rbDSResolve: TRadioButton; + rbSQLResolve: TRadioButton; + procedure btConnectClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure cbDebugClick(Sender: TObject); + procedure meSQLExit(Sender: TObject); + procedure rbDSResolveClick(Sender: TObject); + procedure rbSQLResolveClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + fmServer: TfmServer; + +implementation + + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFNDEF VER130} +{$IFNDEF VER140} +{$IFNDEF CLR} + {$DEFINE XPMAN} + {$R WindowsXP.res} +{$ENDIF} +{$ENDIF} +{$ENDIF} + +uses +{$IFDEF XPMAN} + UxTheme, +{$ENDIF} + Data; + + + + +procedure TfmServer.btConnectClick(Sender: TObject); +begin + if Assigned(Datas) then + Datas.MSConnection.Connect; +end; + +procedure TfmServer.btDisconnectClick(Sender: TObject); +begin + if Assigned(Datas) then + Datas.MSConnection.Disconnect; +end; + +procedure TfmServer.btOpenClick(Sender: TObject); +begin + if Assigned(Datas) then + Datas.Query.Open; +end; + +procedure TfmServer.btCloseClick(Sender: TObject); +begin + if Assigned(Datas) then + Datas.Query.Close; +end; + +procedure TfmServer.cbDebugClick(Sender: TObject); +begin + if Assigned(Datas) then + Datas.Query.Debug:= cbDebug.Checked; +end; + +procedure TfmServer.meSQLExit(Sender: TObject); +begin + if Assigned(Datas) then + if meSQL.Lines.Text <> Datas.Query.SQL.Text then + Datas.Query.SQL.Assign(meSQL.Lines); +end; + +procedure TfmServer.rbDSResolveClick(Sender: TObject); +begin + if Assigned(Datas) then + Datas.MSDataSetProvider.ResolveToDataset:= rbDSResolve.Checked; +end; + +procedure TfmServer.rbSQLResolveClick(Sender: TObject); +begin + if Assigned(Datas) then + Datas.MSDataSetProvider.ResolveToDataset:= not rbSQLResolve.Checked; +end; + +procedure TfmServer.FormCreate(Sender: TObject); +{$IFDEF XPMAN} + procedure UpdateStyle(Control: TWinControl); + var + Panel: TPanel; + i: integer; + begin + for i := 0 to Control.ControlCount - 1 do begin + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := False + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := False; + if Control.Controls[i] is TWinControl then begin + if (Control.Controls[i] is TPanel) then begin + Panel := TPanel(Control.Controls[i]); + Panel.ParentBackground := False; + Panel.Color := clBtnFace; + end; + UpdateStyle(TWinControl(Control.Controls[i])); + end; + end; + end; +{$ENDIF} +begin +{$IFDEF XPMAN} + if UseThemes then + UpdateStyle(Self); +{$ENDIF} +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server_TLB.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server_TLB.pas new file mode 100644 index 0000000..331a9cb --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Midas/Server_TLB.pas @@ -0,0 +1,119 @@ +unit Server_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1.88.1.0.1.0 $ +// File generated on 02.07.2001 15:36:17 from Type Library described below. + +// ************************************************************************ // +// Type Lib: D:\Projects\Delphi\MSDAC\Demos\Midas\Delphi5\Server.tlb (1) +// IID\LCID: {07DB43ED-D8D6-4119-9861-2B7B79032B5F}\0 +// Helpfile: +// DepndLst: +// (1) v1.0 Midas, (C:\WINDOWS\SYSTEM\MIDAS.DLL) +// (2) v2.0 stdole, (C:\WINDOWS\SYSTEM\stdole2.tlb) +// (3) v4.0 StdVCL, (C:\WINDOWS\SYSTEM\STDVCL40.DLL) +// ************************************************************************ // +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +interface + +uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL, + MIDAS; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + ServerMajorVersion = 1; + ServerMinorVersion = 0; + + LIBID_Server: TGUID = '{07DB43ED-D8D6-4119-9861-2B7B79032B5F}'; + + IID_IDatas: TGUID = '{E79F2D5B-8F47-4CB6-B441-251950054002}'; + CLASS_Datas: TGUID = '{706739B2-FB40-49CC-9041-2B82CFFC520C}'; +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + IDatas = interface; + IDatasDisp = dispinterface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + Datas = IDatas; + + +// *********************************************************************// +// Interface: IDatas +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E79F2D5B-8F47-4CB6-B441-251950054002} +// *********************************************************************// + IDatas = interface(IAppServer) + ['{E79F2D5B-8F47-4CB6-B441-251950054002}'] + end; + +// *********************************************************************// +// DispIntf: IDatasDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E79F2D5B-8F47-4CB6-B441-251950054002} +// *********************************************************************// + IDatasDisp = dispinterface + ['{E79F2D5B-8F47-4CB6-B441-251950054002}'] + function AS_ApplyUpdates(const ProviderName: WideString; Delta: OleVariant; + MaxErrors: Integer; out ErrorCount: Integer; var OwnerData: OleVariant): OleVariant; dispid 20000000; + function AS_GetRecords(const ProviderName: WideString; Count: Integer; out RecsOut: Integer; + Options: Integer; const CommandText: WideString; + var Params: OleVariant; var OwnerData: OleVariant): OleVariant; dispid 20000001; + function AS_DataRequest(const ProviderName: WideString; Data: OleVariant): OleVariant; dispid 20000002; + function AS_GetProviderNames: OleVariant; dispid 20000003; + function AS_GetParams(const ProviderName: WideString; var OwnerData: OleVariant): OleVariant; dispid 20000004; + function AS_RowRequest(const ProviderName: WideString; Row: OleVariant; RequestType: Integer; + var OwnerData: OleVariant): OleVariant; dispid 20000005; + procedure AS_Execute(const ProviderName: WideString; const CommandText: WideString; + var Params: OleVariant; var OwnerData: OleVariant); dispid 20000006; + end; + +// *********************************************************************// +// The Class CoDatas provides a Create and CreateRemote method to +// create instances of the default interface IDatas exposed by +// the CoClass Datas. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoDatas = class + class function Create: IDatas; + class function CreateRemote(const MachineName: string): IDatas; + end; + +implementation + +uses ComObj; + +class function CoDatas.Create: IDatas; +begin + Result := CreateComObject(CLASS_Datas) as IDatas; +end; + +class function CoDatas.CreateRemote(const MachineName: string): IDatas; +begin + Result := CreateRemoteComObject(MachineName, CLASS_Datas) as IDatas; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Debug.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Debug.pas new file mode 100644 index 0000000..5d4a025 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Debug.pas @@ -0,0 +1,76 @@ + +unit Debug; + +interface +uses + Windows; + +type + TTickInfo = class + private + StartTime: DWORD; + StopTime: DWORD; + Working: boolean; + public + procedure Start; + procedure Stop; + + function GetInterval:DWORD; + function GetIntervalSt:string; + end; + +function IntervalToStr(T:DWORD):string; + +implementation +uses + SysUtils; + +procedure TTickInfo.Start; +begin + Working := True; + StartTime := GetTickCount; +end; + +procedure TTickInfo.Stop; +begin + StopTime := GetTickCount; + Working := False; +end; + +function TTickInfo.GetInterval:DWORD; +begin + if Working then + Result := GetTickCount - StartTime + else + Result := StopTime - StartTime; +end; + +function TTickInfo.GetIntervalSt:string; +begin + Result := IntervalToStr(GetInterval); +end; + +function IntervalToStr(T:DWORD):string; +var + St:string; +begin + if T > 60000 then begin + Result := IntToStr(T div 60000) + ':'; + T:= T mod 60000; + end + else + Result:= '0:'; + + if T > 1000 then + Result := Result + IntToStr(T div 1000) + ':' + else + Result := Result + '0:'; + + St:= IntToStr(T mod 1000); + while Length(St) < 3 do + St := '0' + St; + + Result := Result + St; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Main.dfm b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Main.dfm new file mode 100644 index 0000000..04ad5f9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Main.dfm @@ -0,0 +1,808 @@ +object fmMain: TfmMain + Left = 271 + Top = 274 + Width = 814 + Height = 600 + Caption = 'MS SQL Data Access Demos - SDAC performance' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnDestroy = FormDestroy + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 631 + Top = 66 + Height = 507 + Align = alRight + end + object Chart: TChart + Left = 0 + Top = 66 + Width = 631 + Height = 507 + BackWall.Brush.Color = clWhite + BackWall.Color = clSilver + Gradient.EndColor = 12615808 + MarginBottom = 2 + MarginLeft = 2 + MarginRight = 2 + Title.Text.Strings = ( + 'SDAC Performance') + BackColor = clSilver + BottomAxis.Automatic = False + BottomAxis.AutomaticMaximum = False + BottomAxis.AutomaticMinimum = False + BottomAxis.ExactDateTime = False + BottomAxis.Maximum = 5.000000000000000000 + BottomAxis.Title.Caption = 'record count' + Chart3DPercent = 20 + LeftAxis.Title.Caption = 'seconds' + MaxPointsPerPage = 10 + TopAxis.Automatic = False + TopAxis.AutomaticMaximum = False + TopAxis.AutomaticMinimum = False + TopAxis.Visible = False + View3D = False + View3DOptions.Elevation = 360 + View3DOptions.Perspective = 100 + View3DOptions.Rotation = 354 + View3DOptions.Zoom = 99 + Align = alClient + BevelInner = bvLowered + BevelOuter = bvLowered + TabOrder = 0 + object Series1: TLineSeries + HorizAxis = aBothHorizAxis + Marks.ArrowLength = 8 + Marks.BackColor = clRed + Marks.Style = smsValue + Marks.Visible = True + SeriesColor = clRed + Title = 'SDAC' + Pointer.InflateMargins = True + Pointer.Style = psRectangle + Pointer.Visible = False + XValues.DateTime = False + XValues.Name = 'X' + XValues.Multiplier = 1.000000000000000000 + XValues.Order = loAscending + YValues.DateTime = False + YValues.Name = 'Y' + YValues.Multiplier = 1.000000000000000000 + YValues.Order = loNone + end + object Series2: TLineSeries + Marks.ArrowLength = 8 + Marks.BackColor = clGreen + Marks.Style = smsValue + Marks.Visible = True + SeriesColor = clGreen + Title = 'BDE' + Pointer.InflateMargins = True + Pointer.Style = psRectangle + Pointer.Visible = False + XValues.DateTime = False + XValues.Name = 'X' + XValues.Multiplier = 1.000000000000000000 + XValues.Order = loAscending + YValues.DateTime = False + YValues.Name = 'Y' + YValues.Multiplier = 1.000000000000000000 + YValues.Order = loNone + end + object Series3: TLineSeries + Marks.ArrowLength = 20 + Marks.Style = smsValue + Marks.Visible = True + SeriesColor = clYellow + Title = 'ADO' + Pointer.InflateMargins = True + Pointer.Style = psRectangle + Pointer.Visible = False + XValues.DateTime = False + XValues.Name = 'X' + XValues.Multiplier = 1.000000000000000000 + XValues.Order = loAscending + YValues.DateTime = False + YValues.Name = 'Y' + YValues.Multiplier = 1.000000000000000000 + YValues.Order = loNone + end + object Series4: TLineSeries + Marks.ArrowLength = 20 + Marks.BackColor = clBlue + Marks.Style = smsValue + Marks.Visible = True + SeriesColor = clBlue + Title = 'dbExpress' + Pointer.InflateMargins = True + Pointer.Style = psRectangle + Pointer.Visible = False + XValues.DateTime = False + XValues.Name = 'X' + XValues.Multiplier = 1.000000000000000000 + XValues.Order = loAscending + YValues.DateTime = False + YValues.Name = 'Y' + YValues.Multiplier = 1.000000000000000000 + YValues.Order = loNone + end + object Series5: TLineSeries + Marks.ArrowLength = 20 + Marks.BackColor = clFuchsia + Marks.Style = smsValue + Marks.Visible = True + SeriesColor = clFuchsia + Title = 'dbExpSda' + Pointer.InflateMargins = True + Pointer.Style = psRectangle + Pointer.Visible = False + XValues.DateTime = False + XValues.Name = 'X' + XValues.Multiplier = 1.000000000000000000 + XValues.Order = loAscending + YValues.DateTime = False + YValues.Name = 'Y' + YValues.Multiplier = 1.000000000000000000 + YValues.Order = loNone + end + end + object Tollbar: TPanel + Left = 0 + Top = 0 + Width = 806 + Height = 66 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Label1: TLabel + Left = 352 + Top = 37 + Width = 83 + Height = 13 + Caption = 'Fetch Block Size:' + Layout = tlCenter + end + object lbSDAC: TLabel + Left = 27 + Top = 50 + Width = 8 + Height = 13 + Caption = '0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lbBDE: TLabel + Left = 87 + Top = 50 + Width = 8 + Height = 13 + Caption = '0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clGreen + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lbADO: TLabel + Left = 139 + Top = 50 + Width = 8 + Height = 13 + Caption = '0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clYellow + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lbdbExpress: TLabel + Left = 191 + Top = 50 + Width = 8 + Height = 13 + Caption = '0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Bevel1: TBevel + Left = 154 + Top = 0 + Width = 2 + Height = 25 + end + object Bevel2: TBevel + Left = 639 + Top = 0 + Width = 2 + Height = 25 + end + object Bevel3: TBevel + Left = 0 + Top = 24 + Width = 800 + Height = 2 + end + object Bevel4: TBevel + Left = 0 + Top = 64 + Width = 800 + Height = 2 + end + object Bevel5: TBevel + Left = 334 + Top = 26 + Width = 2 + Height = 39 + end + object lbdbExpSda: TLabel + Left = 263 + Top = 50 + Width = 8 + Height = 13 + Caption = '0' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clFuchsia + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object btFetchTest: TButton + Left = 160 + Top = 0 + Width = 75 + Height = 25 + Caption = 'Fetch Test' + TabOrder = 0 + OnClick = btFetchTestClick + end + object btConnect: TButton + Left = 0 + Top = 0 + Width = 75 + Height = 25 + Caption = 'Connect' + TabOrder = 1 + OnClick = btConnectClick + end + object btDisconnect: TButton + Left = 75 + Top = 0 + Width = 75 + Height = 25 + Caption = 'Disconnect' + TabOrder = 2 + OnClick = btDisconnectClick + end + object btMasterDetailTest: TButton + Left = 235 + Top = 0 + Width = 80 + Height = 25 + Caption = 'Master/Detail ' + TabOrder = 3 + OnClick = btMasterDetailTestClick + end + object btSPCallTest: TButton + Left = 315 + Top = 0 + Width = 80 + Height = 25 + Caption = 'StoredProc Call' + TabOrder = 4 + OnClick = btSPCallTestClick + end + object cbSDAC: TCheckBox + Left = 8 + Top = 29 + Width = 57 + Height = 17 + Caption = 'SDAC' + Checked = True + State = cbChecked + TabOrder = 5 + end + object cbBDE: TCheckBox + Left = 68 + Top = 29 + Width = 49 + Height = 17 + Caption = 'BDE' + Checked = True + State = cbChecked + TabOrder = 6 + end + object cbADO: TCheckBox + Left = 120 + Top = 29 + Width = 49 + Height = 17 + Caption = 'ADO' + Checked = True + State = cbChecked + TabOrder = 7 + end + object edFetchRows: TEdit + Left = 438 + Top = 35 + Width = 70 + Height = 21 + Hint = 'FetchRows for SDAC, ROWSET SIZE for BDE, ADO always uses 64' + ParentShowHint = False + ShowHint = True + TabOrder = 8 + Text = 'edFetchRows' + OnExit = edFetchRowsExit + end + object btCreate: TButton + Left = 645 + Top = 0 + Width = 73 + Height = 25 + Caption = 'Create' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 9 + OnClick = btCreateClick + end + object btDrop: TButton + Left = 718 + Top = 0 + Width = 73 + Height = 25 + Caption = 'Drop' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 10 + OnClick = btDropClick + end + object cbMark: TCheckBox + Left = 664 + Top = 37 + Width = 48 + Height = 17 + Caption = 'Marks' + Checked = True + State = cbChecked + TabOrder = 11 + OnClick = cbMarkClick + end + object cbdbExpress: TCheckBox + Left = 172 + Top = 29 + Width = 73 + Height = 17 + Caption = 'dbExpress' + TabOrder = 12 + end + object btnMultiExecuting: TButton + Left = 395 + Top = 0 + Width = 80 + Height = 25 + Caption = 'Multi Executing' + TabOrder = 13 + OnClick = btnMultiExecutingClick + end + object btnInsertPost: TButton + Left = 475 + Top = 0 + Width = 80 + Height = 25 + Caption = 'Insert/Post' + TabOrder = 14 + OnClick = btnInsertPostClick + end + object cbResultLog: TCheckBox + Left = 716 + Top = 37 + Width = 75 + Height = 17 + Caption = 'Result Log' + Checked = True + State = cbChecked + TabOrder = 15 + OnClick = cbResultLogClick + end + object cbdbExpSda: TCheckBox + Left = 244 + Top = 29 + Width = 73 + Height = 17 + Caption = 'dbExpSda' + Checked = True + State = cbChecked + TabOrder = 16 + end + object btEditPost: TButton + Left = 555 + Top = 0 + Width = 81 + Height = 25 + Caption = 'Edit/Post' + TabOrder = 17 + OnClick = btEditPostClick + end + end + object meResult: TMemo + Left = 634 + Top = 66 + Width = 172 + Height = 507 + Align = alRight + ScrollBars = ssVertical + TabOrder = 2 + end + object MSConnection: TMSConnection + Database = 'SDACDemos' + Username = 'Sa' + Left = 72 + Top = 112 + end + object MSQuery: TMSQuery + Connection = MSConnection + FetchRows = 64 + Left = 104 + Top = 112 + end + object scCreate: TMSSQL + Connection = MSConnection + SQL.Strings = ( + 'CREATE TABLE Master (' + ' Code INT,' + ' Field1 VARCHAR(100),' + ' Field2 VARCHAR(100),' + ' Field3 VARCHAR(100)' + ');' + '' + 'CREATE TABLE Detail (' + ' Code INT,' + ' Master INT,' + ' Field1 VARCHAR(100),' + ' Field2 VARCHAR(100)' + ');' + '' + 'CREATE TABLE Loaded (' + ' Code INT,' + ' Field1 VARCHAR(100),' + ' Field2 VARCHAR(100),' + ' Field3 VARCHAR(100),' + ' Field4 VARCHAR(100),' + ' Field5 VARCHAR(100)' + ');' + '' + 'declare' + ' @i INTEGER;' + 'begin' + ' SET @i = 0' + ' WHILE @i < 1000' + ' BEGIN' + ' SET @i = @i + 1' + ' INSERT INTO Master (' + ' Code,' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' @i,' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39',' + ' '#39'23456789012345678901'#39');' + ' END;' + '' + ' SET @i = 0' + ' WHILE @i < 100000 ' + ' BEGIN' + ' SET @i = @i + 1' + ' INSERT INTO Detail (' + ' Code,' + ' Master,' + ' Field1,' + ' Field2)' + ' VALUES (' + ' @i,' + ' @i % 1000 + 1,' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39');' + ' END;' + 'end;' + '' + '' + 'CREATE INDEX Detail_IND ON Detail (Master);') + Debug = True + CommandTimeout = 0 + Left = 648 + Top = 80 + end + object scDrop: TMSSQL + Connection = MSConnection + SQL.Strings = ( + + 'if exists (SELECT * FROM dbo.sysobjects WHERE id = object_id('#39'Ma' + + 'ster_Insert'#39'))' + 'DROP PROCEDURE Master_Insert' + '' + + 'if exists (SELECT * FROM dbo.sysobjects WHERE id = object_id('#39'De' + + 'tail'#39'))' + 'DROP TABLE Detail;' + '' + + 'if exists (SELECT * FROM dbo.sysobjects WHERE id = object_id('#39'Ma' + + 'ster'#39'))' + 'DROP TABLE Master;' + '' + + 'if exists (SELECT * FROM dbo.sysobjects WHERE id = object_id('#39'Lo' + + 'aded'#39'))' + 'DROP TABLE Loaded;') + Debug = True + CommandTimeout = 0 + Left = 680 + Top = 80 + end + object Database: TDatabase + DatabaseName = 'db' + DriverName = 'MSSQL' + LoginPrompt = False + Params.Strings = ( + 'USER NAME=Sa' + 'PASSWORD=' + 'SERVER NAME=ORA' + 'ROWSET SIZE=64') + SessionName = 'Default' + Left = 168 + Top = 112 + end + object BDEQuery: TQuery + DatabaseName = 'db' + Left = 200 + Top = 112 + end + object ADOConnection: TADOConnection + LoginPrompt = False + Provider = 'SQLOLEDB' + Left = 264 + Top = 112 + end + object ADOQuery: TADOQuery + CacheSize = 64 + Connection = ADOConnection + Parameters = <> + Left = 296 + Top = 112 + end + object MSQuery1: TMSQuery + Connection = MSConnection + FetchRows = 64 + Left = 104 + Top = 144 + end + object BDEQuery1: TQuery + DatabaseName = 'db' + Left = 200 + Top = 144 + end + object ADOQuery1: TADOQuery + Connection = ADOConnection + Parameters = <> + Left = 296 + Top = 144 + end + object ADOStoredProc: TADOStoredProc + Connection = ADOConnection + Parameters = <> + Left = 328 + Top = 144 + end + object MSStoredProc: TMSStoredProc + Connection = MSConnection + Left = 136 + Top = 144 + end + object BDEStoredProc: TStoredProc + DatabaseName = 'db' + Left = 232 + Top = 144 + end + object MSSQL: TMSSQL + Connection = MSConnection + CommandTimeout = 0 + Left = 136 + Top = 176 + end + object BorlandSQLConnection: TSQLConnection + ConnectionName = 'MSSQLConnection' + DriverName = 'MSSQL' + GetDriverFunc = 'getSQLDriverMSSQL' + LibraryName = 'dbexpmss.dll' + LoginPrompt = False + Params.Strings = ( + 'DriverName=MSSQL' + 'HostName=ServerName' + 'DataBase=Database Name' + 'User_Name=user' + 'Password=password' + 'BlobSize=-1' + 'LocaleCode=0000' + 'MSSQL TransIsolation=ReadCommited' + 'OS Authentication=False') + VendorLib = 'oledb' + Left = 360 + Top = 112 + end + object BorlandSQLQuery: TSQLQuery + MaxBlobSize = -1 + Params = <> + SQLConnection = BorlandSQLConnection + Left = 392 + Top = 112 + end + object BorlandSQLQuery1: TSQLQuery + MaxBlobSize = -1 + Params = <> + SQLConnection = BorlandSQLConnection + Left = 392 + Top = 144 + end + object BorlandSQLStoredProc: TSQLStoredProc + MaxBlobSize = -1 + Params = <> + SQLConnection = BorlandSQLConnection + Left = 424 + Top = 144 + end + object MSTable: TMSTable + Connection = MSConnection + Left = 136 + Top = 112 + end + object BDETable: TTable + DatabaseName = 'db' + SessionName = 'Default' + Left = 232 + Top = 112 + end + object ADOTable: TADOTable + Connection = ADOConnection + Left = 328 + Top = 112 + end + object DataSetProvider1: TDataSetProvider + DataSet = BorlandSQLTable + Left = 456 + Top = 144 + end + object BorlandClientDataSet: TClientDataSet + Aggregates = <> + Params = <> + ProviderName = 'DataSetProvider1' + Left = 456 + Top = 176 + end + object BorlandSQLTable: TSQLTable + MaxBlobSize = -1 + SQLConnection = BorlandSQLConnection + Left = 424 + Top = 176 + end + object CrLabSQLConnection: TSQLConnection + ConnectionName = 'SQLServerConnection' + DriverName = 'SQLServer' + GetDriverFunc = 'getSQLDriverSQLServer' + LibraryName = 'dbexpsda.dll' + LoginPrompt = False + Params.Strings = ( + 'BlobSize=-1' + 'HostName=Core' + 'DataBase=Northwind' + 'DriverName=SQLServer' + 'User_Name=sa' + 'Password=' + 'LongStrings=True' + 'EnableBCD=True' + 'FetchAll=True') + VendorLib = 'sqloledb.dll' + AfterConnect = CrLabSQLConnectionAfterConnect + Left = 360 + Top = 240 + end + object CrLabSQLQuery: TSQLQuery + MaxBlobSize = -1 + Params = <> + SQLConnection = CrLabSQLConnection + Left = 392 + Top = 240 + end + object CrLabSQLQuery1: TSQLQuery + MaxBlobSize = -1 + Params = <> + SQLConnection = CrLabSQLConnection + Left = 392 + Top = 272 + end + object CrLabSQLTable: TSQLTable + MaxBlobSize = -1 + SQLConnection = CrLabSQLConnection + Left = 424 + Top = 304 + end + object CrLabClientDataSet: TClientDataSet + Aggregates = <> + Params = <> + ProviderName = 'DataSetProvider2' + Left = 456 + Top = 304 + end + object DataSetProvider2: TDataSetProvider + DataSet = CrLabSQLTable + Left = 456 + Top = 272 + end + object CrLabSQLStoredProc: TSQLStoredProc + MaxBlobSize = -1 + Params = <> + SQLConnection = CrLabSQLConnection + Left = 424 + Top = 272 + end + object scCreate2: TMSSQL + Connection = MSConnection + SQL.Strings = ( + 'CREATE PROCEDURE Master_Insert ' + ' @p_Code INT,' + ' @p_Field1 VARCHAR(100),' + ' @p_Field2 VARCHAR(100),' + ' @p_Field3 VARCHAR(100)' + 'AS' + 'begin' + ' INSERT INTO Master (' + ' Code,' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' @p_Code,' + ' @p_Field1,' + ' @p_Field2,' + ' @p_Field3);' + 'end;') + Debug = True + CommandTimeout = 0 + Left = 648 + Top = 112 + end + object MSTable1: TMSTable + Connection = MSConnection + Left = 545 + Top = 186 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Main.pas b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Main.pas new file mode 100644 index 0000000..935c134 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Main.pas @@ -0,0 +1,1171 @@ +unit Main; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, ExtCtrls, Chart, StdCtrls, TeEngine, TeeProcs, Debug, Series, + MemDS, DBAccess, MSAccess, OLEDBAccess, OLEDBC, SdacVcl, + Db, DBTables, ADODB, DBXpress, SqlExpr, FMTBcd, DBClient, Provider; + +type + TfmMain = class(TForm) + MSConnection: TMSConnection; + MSQuery: TMSQuery; + scCreate: TMSSQL; + scDrop: TMSSQL; + Chart: TChart; + Tollbar: TPanel; + btFetchTest: TButton; + meResult: TMemo; + btConnect: TButton; + btDisconnect: TButton; + Database: TDatabase; + BDEQuery: TQuery; + btMasterDetailTest: TButton; + btSPCallTest: TButton; + cbSDAC: TCheckBox; + cbBDE: TCheckBox; + cbADO: TCheckBox; + edFetchRows: TEdit; + Label1: TLabel; + btCreate: TButton; + btDrop: TButton; + ADOConnection: TADOConnection; + ADOQuery: TADOQuery; + cbMark: TCheckBox; + MSQuery1: TMSQuery; + BDEQuery1: TQuery; + ADOQuery1: TADOQuery; + ADOStoredProc: TADOStoredProc; + MSStoredProc: TMSStoredProc; + BDEStoredProc: TStoredProc; + lbSDAC: TLabel; + lbBDE: TLabel; + lbADO: TLabel; + MSSQL: TMSSQL; + cbdbExpress: TCheckBox; + lbdbExpress: TLabel; + BorlandSQLConnection: TSQLConnection; + BorlandSQLQuery: TSQLQuery; + BorlandSQLQuery1: TSQLQuery; + BorlandSQLStoredProc: TSQLStoredProc; + btnMultiExecuting: TButton; + Bevel1: TBevel; + Bevel2: TBevel; + btnInsertPost: TButton; + MSTable: TMSTable; + BDETable: TTable; + ADOTable: TADOTable; + Splitter1: TSplitter; + DataSetProvider1: TDataSetProvider; + BorlandClientDataSet: TClientDataSet; + BorlandSQLTable: TSQLTable; + Bevel3: TBevel; + cbResultLog: TCheckBox; + Bevel4: TBevel; + Bevel5: TBevel; + cbdbExpSda: TCheckBox; + lbdbExpSda: TLabel; + CrLabSQLConnection: TSQLConnection; + CrLabSQLQuery: TSQLQuery; + Series2: TLineSeries; + Series3: TLineSeries; + Series4: TLineSeries; + Series5: TLineSeries; + CrLabSQLQuery1: TSQLQuery; + CrLabSQLTable: TSQLTable; + CrLabClientDataSet: TClientDataSet; + DataSetProvider2: TDataSetProvider; + Series1: TLineSeries; + CrLabSQLStoredProc: TSQLStoredProc; + scCreate2: TMSSQL; + MSTable1: TMSTable; + btEditPost: TButton; + procedure btConnectClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + procedure btFetchTestClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure edFetchRowsExit(Sender: TObject); + procedure btCreateClick(Sender: TObject); + procedure btDropClick(Sender: TObject); + procedure cbMarkClick(Sender: TObject); + procedure btMasterDetailTestClick(Sender: TObject); + procedure btSPCallTestClick(Sender: TObject); + procedure btnMultiExecutingClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure btnInsertPostClick(Sender: TObject); + procedure cbSetInternalNameClick(Sender: TObject); + procedure cbResultLogClick(Sender: TObject); + procedure CrLabSQLConnectionAfterConnect(Sender: TObject); + procedure cbPermitPrepareClick(Sender: TObject); + procedure btEditPostClick(Sender: TObject); + private + TickInfo: TTickInfo; + //LoadCount: integer; + + function FetchTest(DataSet:TDataSet; Recs:integer): integer; + function MasterDetailTest(Master: TDataSet; Detail: TDataSet; Recs: integer): integer; + function SPCallTest(StoredProc: TComponent; Count: integer): integer; + function MultiExecutingTest(Query: TComponent; Count: integer): integer; + function InsertPostTest(Table: TDataSet; Count: integer): integer; + function EditPostTest(Table: TDataSet; Count: integer): integer; + + procedure ExecSQL(const SQL: string); + + procedure CheckConnected; + procedure PrintResults; + + public + constructor Create(Owner:TComponent); override; + destructor Destroy; override; + end; + +var + fmMain: TfmMain; + +implementation + +uses + Variants; + +{$R *.DFM} + +constructor TfmMain.Create(Owner:TComponent); +begin + inherited; + + TickInfo := TTickInfo.Create; + Caption := 'MS SQL Data Access Demos - SDAC ' + SDACVersion + ' performance'; +end; + +destructor TfmMain.Destroy; +begin + TickInfo.Free; + + inherited; +end; + +function TfmMain.FetchTest(DataSet:TDataSet; Recs:integer):integer; +var + i: integer; + OpenTime: integer; + FetchTime: integer; + SQL: string; +begin + SQL := 'SELECT * FROM Detail WHERE Code <= :Recs'; + + if DataSet is TMSQuery then begin + meResult.Lines.Add('> SDAC'); + TMSQuery(DataSet).SQL.Text := SQL; + TMSQuery(DataSet).ParamByName('Recs').AsInteger := Recs + end + else + if DataSet is TQuery then begin + meResult.Lines.Add('> BDE'); + TQuery(DataSet).SQL.Text := SQL; + TQuery(DataSet).ParamByName('Recs').AsInteger := Recs; + end + else + if DataSet is TADOQuery then begin + meResult.Lines.Add('> ADO'); + TADOQuery(DataSet).SQL.Text := SQL; + TADOQuery(DataSet).Parameters.ParamByName('Recs').Value := Recs; + end else + if DataSet is TSQLQuery then begin + meResult.Lines.Add('> dbExpress'); + TSQLQuery(DataSet).SQL.Text := SQL; + TSQLQuery(DataSet).ParamByName('Recs').DataType := ftString; + TSQLQuery(DataSet).ParamByName('Recs').Value := Recs; + end; + + TickInfo.Start; + DataSet.Open; + OpenTime := TickInfo.GetInterval; + meResult.Lines.Add('Opened in ' + IntervalToStr(OpenTime)); + + TickInfo.Start; + + i := 0; + while not DataSet.EOF do begin + Inc(i); + DataSet.Next; + end; + FetchTime := TickInfo.GetInterval; + meResult.Lines.Add('Fetched ' + IntToStr(i) + ' recs in ' + IntervalToStr(FetchTime)); + DataSet.Close; + + Result := OpenTime + FetchTime; +end; + +function TfmMain.MasterDetailTest(Master: TDataSet; Detail: TDataSet; Recs: integer):integer; +var + i, j: integer; + FetchTime: integer; + SQL,SQL1: string; +begin + SQL := 'SELECT * FROM Master WHERE Code <= :Recs'; //RowNum + SQL1 := 'SELECT * FROM Detail WHERE Master = :Code'; + if Master is TMSQuery then begin + meResult.Lines.Add('> SDAC'); + TMSQuery(Master).SQL.Text := SQL; + TMSQuery(Detail).SQL.Text := SQL1; + TMSQuery(Detail).Options.LocalMasterDetail := true; + TMSQuery(Master).ParamByName('Recs').AsInteger := Recs + end + else + if Master is TQuery then begin + meResult.Lines.Add('> BDE'); + TQuery(Master).SQL.Text := SQL; + TQuery(Detail).SQL.Text := SQL1; + TQuery(Master).ParamByName('Recs').AsInteger := Recs; + end + else + if Master is TADOQuery then begin + meResult.Lines.Add('> ADO'); + TADOQuery(Master).SQL.Text := SQL; + TADOQuery(Detail).SQL.Text := SQL1; + TADOQuery(Master).Parameters.ParamByName('Recs').Value := Recs; + end else + if Master is TSQLQuery then begin + meResult.Lines.Add('> dbExpress'); + TSQLQuery(Master).SQL.Text := SQL; + TSQLQuery(Detail).SQL.Text := SQL1; + TSQLQuery(Master).ParamByName('Recs').DataType := ftString; + TSQLQuery(Master).ParamByName('Recs').Value := Recs; + end; + + TickInfo.Start; + Master.Open; + + if Detail is TMSQuery then + TMSQuery(Detail).Prepare + else + if Detail is TQuery then + TQuery(Detail).Prepare + else + if Detail is TADOQuery then + TADOQuery(Detail).Prepared := True + else + if Detail is TSQLQuery then begin + TSQLQuery(Detail).Prepared := True; + TSQLQuery(Detail).ParamByName('Code').DataType := ftInteger; + end; + + i := 0; + j := 0; + while not Master.EOF do begin + if Detail is TMSQuery then + TMSQuery(Detail).ParamByName('Code').AsInteger := Master.FieldByName('Code').AsInteger + else + if Detail is TQuery then + TQuery(Detail).ParamByName('Code').AsInteger := Master.FieldByName('Code').AsInteger + else + if Detail is TADOQuery then + TADOQuery(Detail).Parameters.ParamByName('Code').Value := Master.FieldByName('Code').AsInteger + else + if Detail is TSQLQuery then + TSQLQuery(Detail).ParamByName('Code').Value := Master.FieldByName('Code').AsInteger; + + Detail.Open; + while not Detail.EOF do begin + Inc(j); + Detail.Next; + end; + Detail.Close; + + Inc(i); + Master.Next; + end; + FetchTime := TickInfo.GetInterval; + meResult.Lines.Add('Fetched ' + IntToStr(i) + ' master recs, ' + + IntToStr(j) + ' detail recs in ' + IntervalToStr(FetchTime)); + + if Detail is TMSQuery then + TMSQuery(Detail).UnPrepare + else + if Detail is TQuery then + TQuery(Detail).UnPrepare + else + if Detail is TADOQuery then + TADOQuery(Detail).Prepared := False + else + if Detail is TSQLQuery then + TSQLQuery(Detail).Prepared := False; + + Master.Close; + + Result := FetchTime; +end; + +procedure TMSSQLExecute(Query: TComponent); +begin + TMSSQL(Query).Execute; +end; + +procedure TQueryExecSQL(Query: TComponent); +begin + TQuery(Query).ExecSQL; +end; + +procedure TADOQueryExecSQL(Query: TComponent); +begin + TADOQuery(Query).ExecSQL; +end; + +procedure TSQLQueryExecSQL(Query: TComponent); +begin + TSQLQuery(Query).ExecSQL; +end; + +type + TExecSQLProc = procedure (Query: TComponent); + +function TfmMain.MultiExecutingTest(Query: TComponent; Count: integer): integer; +var + i:integer; + ExecTime:integer; + SQL: string; + ExecSQLProc: TExecSQLProc; +begin + SQL := 'DECLARE @a INT'; + + ExecSQLProc := nil; + if Query is TMSSQL then begin + meResult.Lines.Add('> SDAC'); + TMSSQL(Query).SQL.Text := SQL; + TMSSQL(Query).Prepared := True; + ExecSQLProc := TMSSQLExecute; + end + else + if Query is TQuery then begin + meResult.Lines.Add('> BDE'); + TQuery(Query).SQL.Text := SQL; + TQuery(Query).Prepared := True; + ExecSQLProc := TQueryExecSQL; + end + else + if Query is TADOQuery then begin + meResult.Lines.Add('> ADO'); + TADOQuery(Query).SQL.Text := SQL; + TADOQuery(Query).Prepared := True; + ExecSQLProc := TADOQueryExecSQL; + end else + if Query is TSQLQuery then begin + meResult.Lines.Add('> dbExpress'); + TSQLQuery(Query).SQL.Text := SQL; + TSQLQuery(Query).Prepared := True; + ExecSQLProc := TSQLQueryExecSQL; + end; + + TickInfo.Start; + + for i := 1 to Count do + ExecSQLProc(Query); + + ExecTime := TickInfo.GetInterval; + meResult.Lines.Add('Executed ' + IntToStr(Count) + ' count ' + IntervalToStr(ExecTime)); + + Result := ExecTime; +end; + +function TfmMain.InsertPostTest(Table: TDataSet; Count: integer): integer; +var + i:integer; + ExecTime:integer; + TableName: string; +begin + TableName := 'DETAIL'; + ExecSQL('TRUNCATE TABLE ' + TableName); + + if Table is TMSTable then begin + meResult.Lines.Add('> SDAC'); + TMSTable(Table).TableName := TableName; + + // ~10% performance + TMSTable(Table).SQLInsert.Text := 'INSERT INTO DETAIL (Code, Master, Field1, Field2) VALUES (:Code, :Master, :Field1, :Field2)'; + end + else + if Table is TTable then begin + meResult.Lines.Add('> BDE'); + TTable(Table).TableName := TableName; + end + else + if Table is TADOTable then begin + meResult.Lines.Add('> ADO'); + TADOTable(Table).TableName := TableName; + end else + if Table = BorlandClientDataSet then begin + meResult.Lines.Add('> dbExpress'); + BorlandSQLTable.TableName := TableName; + end else + if Table = CrLabClientDataSet then begin + meResult.Lines.Add('> dbExpSda'); + CrLabSQLTable.TableName := TableName; + end; + + Table.Open; + + TickInfo.Start; + + for i := 1 to Count do begin + Table.Insert; + Table.FieldByName('CODE').Value := i; + Table.FieldByName('Field1').AsString := '01234567890123456789'; + Table.FieldByName('Field2').AsString := '12345678901234567890'; + Table.Post; + end; + + if Table = BorlandClientDataSet then + BorlandClientDataSet.ApplyUpdates(0); + if Table = CrLabClientDataSet then + CrLabClientDataSet.ApplyUpdates(0); + + ExecTime := TickInfo.GetInterval; + Table.Close; + meResult.Lines.Add('Inserted ' + IntToStr(Count) + ' records ' + IntervalToStr(ExecTime)); + + Result := ExecTime; +end; + +procedure TfmMain.ExecSQL(const SQL: string); +var + MSSQL: TMSSQL; +begin + MSSQL := TMSSQL.Create(nil); + try + MSSQL.Connection := MSConnection; + MSSQL.SQL.Text := SQL; + MSSQL.Execute; + finally + MSSQL.Free; + end; +end; + +function TfmMain.SPCallTest(StoredProc: TComponent; Count: integer):integer; +var + i:integer; + ExecTime:integer; +begin + if StoredProc is TMSStoredProc then + meResult.Lines.Add('> SDAC') + else + if StoredProc is TStoredProc then + meResult.Lines.Add('> BDE') + else + if StoredProc is TADOStoredProc then + meResult.Lines.Add('> ADO'); + if StoredProc is TSQLStoredProc then + meResult.Lines.Add('> dbExpress'); + + TickInfo.Start; + for i := 1 to Count do begin + if StoredProc is TMSStoredProc then begin + with TMSStoredProc(StoredProc) do begin + if i = 1 then begin + StoredProcName := 'Master_Insert'; + Prepare; + end; + + ParamByName('p_Code').AsInteger := i; + ParamByName('p_Field1').AsString := '01234567890123456789'; + ParamByName('p_Field2').AsString := '12345678901234567890'; + ParamByName('p_Field3').AsString := '23456789012345678901'; + + Execute; + end; + end + else + if StoredProc is TStoredProc then begin + with TStoredProc(StoredProc) do begin + if i = 1 then begin + StoredProcName := 'MASTER_INSERT'; + Params.Clear; + with TParam(Params.Add) do begin + Name := '@p_Code'; + ParamType := ptInput; + DataType := ftInteger; + end; + + with TParam(Params.Add) do begin + Name := '@p_Field1'; + ParamType := ptInput; + DataType := ftString; + end; + + with TParam(Params.Add) do begin + Name := '@p_Field2'; + ParamType := ptInput; + DataType := ftString; + end; + + with TParam(Params.Add) do begin + Name := '@p_Field3'; + ParamType := ptInput; + DataType := ftString; + end; + Prepare; + end; + + ParamByName('@p_Code').AsInteger := i; + ParamByName('@p_Field1').AsString := '01234567890123456789'; + ParamByName('@p_Field2').AsString := '12345678901234567890'; + ParamByName('@p_Field3').AsString := '23456789012345678901'; + + ExecProc; + end; + end + else + if StoredProc is TADOStoredProc then begin + with TADOStoredProc(StoredProc) do begin + if i = 1 then begin + ProcedureName := 'MASTER_INSERT'; + Parameters.Refresh; + end; + Parameters.ParamByName('@p_Code').Value := i; + Parameters.ParamByName('@p_Field1').Value := '01234567890123456789'; + Parameters.ParamByName('@p_Field2').Value := '12345678901234567890'; + Parameters.ParamByName('@p_Field3').Value := '23456789012345678901'; + + ExecProc; + end; + end else + if StoredProc is TSQLStoredProc then begin + with TSQLStoredProc(StoredProc) do begin + if i = 1 then begin + StoredProcName := 'MASTER_INSERT'; + Prepared := True; + end; + + if StoredProc = BorlandSQLStoredProc then begin + Params.ParamValues['@p_Code'] := i; + Params.ParamValues['@p_Field1'] := '01234567890123456789'; + Params.ParamValues['@p_Field2'] := '12345678901234567890'; + Params.ParamValues['@p_Field3'] := '23456789012345678901'; + end + else + begin + Params.ParamValues['p_Code'] := i; + Params.ParamValues['p_Field1'] := '01234567890123456789'; + Params.ParamValues['p_Field2'] := '12345678901234567890'; + Params.ParamValues['p_Field3'] := '23456789012345678901'; + end; + ExecProc; +// Prepared := false; + end; + end + end; + + ExecTime := TickInfo.GetInterval; + meResult.Lines.Add('Executed ' + IntToStr(Count) + ' times in ' + IntervalToStr(ExecTime)); + + Result := ExecTime; +end; + +procedure TfmMain.FormShow(Sender: TObject); +begin + edFetchRows.Text := IntToStr(MSQuery.FetchRows); +end; + +procedure TfmMain.CheckConnected; +begin + if (not MSConnection.Connected) or + (cbBDE.Checked and not Database.Connected) or + (cbADO.Checked and not ADOConnection.Connected) or + (cbdbExpress.Checked and not BorlandSQLConnection.Connected) or + (cbdbExpSda.Checked and not CrLabSQLConnection.Connected) then + raise Exception.Create('You must connect first!'); +end; + +procedure TfmMain.PrintResults; + procedure Process(CheckBox: TCheckBox; Res: string); + begin + if CheckBox.Checked then + meResult.Lines.Add(CheckBox.Caption + ' ' + Res); + end; + +begin + meResult.Lines.Add('---------------'); + Process(cbSDAC, lbSDAC.Caption); + Process(cbBDE, lbBDE.Caption); + Process(cbADO, lbADO.Caption); + Process(cbdbExpress, lbdbExpress.Caption); + Process(cbdbExpSda, lbdbExpSda.Caption); + meResult.Lines.Add('==============='); +end; + +procedure TfmMain.btConnectClick(Sender: TObject); +begin + edFetchRowsExit(nil); + + if not MSConnection.Connected then begin + MSConnection.Connect; + meResult.Lines.Add('SDAC connected'); + end; + + if cbBDE.Checked and not Database.Connected then begin + Database.Params.Values['USER NAME'] := MSConnection.UserName; + Database.Params.Values['PASSWORD'] := MSConnection.Password; + Database.Params.Values['SERVER NAME'] := MSConnection.Server; + Database.Params.Values['DATABASE NAME'] := MSConnection.Database; + Database.Open; + meResult.Lines.Add('BDE connected'); + end; + + if cbADO.Checked and not ADOConnection.Connected then begin + ADOConnection.ConnectionString := MSConnection.ConnectString; + ADOConnection.Open; + meResult.Lines.Add('ADO connected'); + end; + + if cbdbExpress.Checked and not BorlandSQLConnection.Connected then begin + BorlandSQLConnection.Params.Values['User_Name'] := MSConnection.UserName; + BorlandSQLConnection.Params.Values['Password'] := MSConnection.Password; + BorlandSQLConnection.Params.Values['HostName'] := MSConnection.Server; + BorlandSQLConnection.Params.Values['DataBase'] := MSConnection.Database; + + BorlandSQLConnection.Connected := True; + meResult.Lines.Add('dbExpress connected'); + end; + + if cbdbExpSda.Checked and not CrLabSQLConnection.Connected then begin + CrLabSQLConnection.Params.Values['User_Name'] := MSConnection.UserName; + CrLabSQLConnection.Params.Values['Password'] := MSConnection.Password; + CrLabSQLConnection.Params.Values['HostName'] := MSConnection.Server; + CrLabSQLConnection.Params.Values['DataBase'] := MSConnection.Database; + + CrLabSQLConnection.Connected := True; + meResult.Lines.Add('dbExpSda connected'); + end; +end; + +procedure TfmMain.btDisconnectClick(Sender: TObject); +begin + MSConnection.Disconnect; + BorlandSQLConnection.Connected := false; + CrLabSQLConnection.Connected := false; + ADOConnection.Close; + Database.Close; + meResult.Lines.Add('Disconected'); +end; + +procedure TfmMain.btFetchTestClick(Sender: TObject); +const + Step = 10000; +var + i: integer; + ResSDAC, ResBDE, ResADO, ResdbExp, ResdbExpSda: integer; + mBDE, mADO, mdbExp, mdbExpSda: double; +begin + CheckConnected; + + Chart.Title.Text.Text := 'Fetch Test'; + for i := 0 to Chart.SeriesCount - 1 do + Chart.Series[i].Clear; + Chart.BottomAxis.Minimum := 0; + Chart.BottomAxis.Maximum := 11 * Step; + mBDE := 0; + mADO := 0; + mdbExp := 0; + mdbExpSda := 0; + + for i := 1 to 10 do begin + ResSDAC := 0; + ResBDE := 0; + ResADO := 0; + ResdbExp := 0; + ResdbExpSda := 0; + + meResult.Lines.Add('---------------'); + // BDE + if cbBDE.Checked then begin + ResBDE := FetchTest(BDEQuery, i*Step); + Chart.Series[1].AddXY(i*Step, ResBDE/1000, '', clTeeColor); + end; + // SDAC + if cbSDAC.Checked then begin + ResSDAC := FetchTest(MSQuery, i*Step); + Chart.Series[0].AddXY(i*Step, ResSDAC/1000, '', clTeeColor); + end; + // ADO + if cbADO.Checked then begin + ResADO := FetchTest(ADOQuery, i*Step); + Chart.Series[2].AddXY(i*Step, ResADO/1000, '', clTeeColor); + end; + // dbExpress + if cbdbExpress.Checked then begin + ResdbExp := FetchTest(BorlandSQLQuery, i*Step); + Chart.Series[3].AddXY(i*Step, ResdbExp/1000, '', clTeeColor); + end; + // dbExpSda + if cbdbExpSda.Checked then begin + ResdbExpSda := FetchTest(CrLabSQLQuery, i*Step); + Chart.Series[4].AddXY(i*Step, ResdbExpSda/1000, '', clTeeColor); + end; + + if ResSDAC > 0 then begin + mBDE := ((i - 1)*mBDE + ResBDE/ResSDAC)/i; + mADO := ((i - 1)*mADO + ResADO/ResSDAC)/i; + mdbExp := ((i - 1)*mdbExp + ResdbExp/ResSDAC)/i; + mdbExpSda := ((i - 1)*mdbExpSda + ResdbExpSda/ResSDAC)/i; + lbSDAC.Caption := FloatToStrF(1, ffGeneral, 5, 3); + lbBDE.Caption := FloatToStrF(mBDE, ffGeneral, 5, 3); + lbADO.Caption := FloatToStrF(mADO, ffGeneral, 5, 3); + lbdbExpress.Caption := FloatToStrF(mdbExp, ffGeneral, 5, 3); + lbdbExpSda.Caption := FloatToStrF(mdbExpSda, ffGeneral, 5, 3); + lbBDE.Update; + lbADO.Update; + lbdbExpress.Update; + lbdbExpSda.Update; + end; + + Chart.Update; + end; + PrintResults; +end; + +procedure TfmMain.btMasterDetailTestClick(Sender: TObject); +var + i:integer; + ResSDAC, ResBDE, ResADO, ResdbExp, ResdbExpSda: integer; + mBDE, mADO, mdbExp, mdbExpSda: double; +begin + CheckConnected; + + Chart.Title.Text.Text := 'Master/Detail Test'; + for i := 0 to Chart.SeriesCount - 1 do + Chart.Series[i].Clear; + Chart.BottomAxis.Minimum := 0; + Chart.BottomAxis.Maximum := 110; + + mBDE := 0; + mADO := 0; + mdbExp := 0; + mdbExpSda := 0; + for i := 1 to 10 do begin + ResSDAC := 0; + ResBDE := 0; + ResADO := 0; + ResdbExp := 0; + ResdbExpSda := 0; + + meResult.Lines.Add('---------------'); + // SDAC + if cbSDAC.Checked then begin + ResSDAC := MasterDetailTest(MSQuery, MSQuery1, i*10); + Chart.Series[0].AddXY(i*10, ResSDAC/1000, '', clTeeColor); + end; + // BDE + if cbBDE.Checked then begin + ResBDE := MasterDetailTest(BDEQuery, BDEQuery1, i*10); + Chart.Series[1].AddXY(i*10, ResBDE/1000, '', clTeeColor); + end; + // ADO + if cbADO.Checked then begin + ResADO := MasterDetailTest(ADOQuery, ADOQuery1, i*10); + Chart.Series[2].AddXY(i*10, ResADO/1000, '', clTeeColor); + end; + // dbExpress + if cbdbExpress.Checked then begin + ResdbExp := MasterDetailTest(BorlandSQLQuery, BorlandSQLQuery1, i*10); + Chart.Series[3].AddXY(i*10, ResdbExp/1000, '', clTeeColor); + end; + // dbExpSda + if cbdbExpSda.Checked then begin + ResdbExpSda := MasterDetailTest(CrLabSQLQuery, CrLabSQLQuery1, i*10); + Chart.Series[4].AddXY(i*10, ResdbExpSda/1000, '', clTeeColor); + end; + + if ResSDAC > 0 then begin + mBDE := ((i - 1)*mBDE + ResBDE/ResSDAC)/i; + mADO := ((i - 1)*mADO + ResADO/ResSDAC)/i; + mdbExp := ((i - 1)*mdbExp + ResdbExp/ResSDAC)/i; + mdbExpSda := ((i - 1)*mdbExpSda + ResdbExpSda/ResSDAC)/i; + lbSDAC.Caption := FloatToStrF(1, ffGeneral, 5, 3); + lbBDE.Caption := FloatToStrF(mBDE, ffGeneral, 5, 3); + lbADO.Caption := FloatToStrF(mADO, ffGeneral, 5, 3); + lbdbExpress.Caption := FloatToStrF(mdbExp, ffGeneral, 5, 3); + lbdbExpSda.Caption := FloatToStrF(mdbExpSda, ffGeneral, 5, 3); + lbBDE.Update; + lbADO.Update; + lbdbExpress.Update; + lbdbExpSda.Update; + end; + + Chart.Update; + end; + PrintResults; +end; + +procedure TfmMain.btSPCallTestClick(Sender: TObject); +var + i:integer; + ResSDAC, ResBDE, ResADO, ResdbExp, ResdbExpSda: integer; + mBDE, mADO, mdbExp, mdbExpSda: double; +const + Step = 10; +begin + CheckConnected; + + Chart.Title.Text.Text := 'StoredProc Call Test'; + for i := 0 to Chart.SeriesCount - 1 do + Chart.Series[i].Clear; + Chart.BottomAxis.Minimum := 0; + Chart.BottomAxis.Maximum := 11 * Step; + + mBDE := 0; + mADO := 0; + mdbExp := 0; + mdbExpSda := 0; + for i := 1 to 10 do begin + ResSDAC := 0; + ResBDE := 0; + ResADO := 0; + ResdbExp := 0; + ResdbExpSda := 0; + + meResult.Lines.Add('---------------'); + // SDAC + if cbSDAC.Checked then begin + ResSDAC := SPCallTest(MSStoredProc, i*Step); + Chart.Series[0].AddXY(i*Step, ResSDAC/(Step * 10), '', clTeeColor); + end; + // BDE + if cbBDE.Checked then begin + ResBDE := SPCallTest(BDEStoredProc, i*Step); + Chart.Series[1].AddXY(i*Step, ResBDE/(Step * 10), '', clTeeColor); + end; + // ADO + if cbADO.Checked then begin + ResADO := SPCallTest(ADOStoredProc, i*Step); + Chart.Series[2].AddXY(i*Step, ResADO/(Step * 10), '', clTeeColor); + end; + // dbExpress + if cbdbExpress.Checked then begin + ResdbExp := SPCallTest(BorlandSQLStoredProc, i*Step); + Chart.Series[3].AddXY(i*Step, ResdbExp/(Step * 10), '', clTeeColor); + end; + // dbExpSda + if cbdbExpSda.Checked then begin + ResdbExpSda := SPCallTest(CrLabSQLStoredProc, i*Step); + Chart.Series[4].AddXY(i*Step, ResdbExpSda/(Step * 10), '', clTeeColor); + end; + + if ResSDAC > 0 then begin + mBDE := ((i - 1)*mBDE + ResBDE/ResSDAC)/i; + mADO := ((i - 1)*mADO + ResADO/ResSDAC)/i; + mdbExp := ((i - 1)*mdbExp + ResdbExp/ResSDAC)/i; + mdbExpSda := ((i - 1)*mdbExpSda + ResdbExpSda/ResSDAC)/i; + lbSDAC.Caption := FloatToStrF(1, ffGeneral, 5, 3); + lbBDE.Caption := FloatToStrF(mBDE, ffGeneral, 5, 3); + lbADO.Caption := FloatToStrF(mADO, ffGeneral, 5, 3); + lbdbExpress.Caption := FloatToStrF(mdbExp, ffGeneral, 5, 3); + lbdbExpSda.Caption := FloatToStrF(mdbExpSda, ffGeneral, 5, 3); + lbBDE.Update; + lbADO.Update; + lbdbExpress.Update; + lbdbExpSda.Update; + end; + + Chart.Update; + end; + PrintResults; +end; + +procedure TfmMain.edFetchRowsExit(Sender: TObject); +var + Connected: boolean; +begin + try + MSQuery.FetchRows := StrToInt(edFetchRows.Text); + MSQuery1.FetchRows := StrToInt(edFetchRows.Text); + Connected := Database.Connected; + Database.Close; + Database.Params.Values['ROWSET SIZE'] := edFetchRows.Text; + if Connected then begin + Database.LoginPrompt := False; + Database.Open; + Database.LoginPrompt := True; + end; + ADOQuery.CacheSize := StrToInt(edFetchRows.Text); + ADOQuery1.CacheSize := StrToInt(edFetchRows.Text); + finally + edFetchRows.Text := IntToStr(MSQuery.FetchRows); + end; +end; + +procedure TfmMain.btCreateClick(Sender: TObject); +begin + scCreate.Execute; + scCreate2.Execute; +end; + +procedure TfmMain.btDropClick(Sender: TObject); +begin + scDrop.Execute; +end; + +procedure TfmMain.cbMarkClick(Sender: TObject); +var + i: integer; +begin + for i := 0 to Chart.SeriesCount - 1 do + Chart.Series[i].Marks.Visible := cbMark.Checked; +end; + +(* +procedure TfmMain.MSLoaderPutData(Sender: TMSLoader); +var + i: integer; +begin + for i := 1 to LoadCount do begin + Sender.PutColumnData(0, i, i); + Sender.PutColumnData(1, i, '01234567890123456789'); + end; +end;*) + +procedure TfmMain.btnMultiExecutingClick(Sender: TObject); +var + i:integer; + ResSDAC, ResBDE, ResADO, ResdbExp, ResdbExpSda: integer; + mBDE, mADO, mdbExp, mdbExpSda: double; +begin + CheckConnected; + + Chart.Title.Text.Text := 'MultiExecuting Test'; + for i := 0 to Chart.SeriesCount - 1 do + Chart.Series[i].Clear; + Chart.BottomAxis.Minimum := 0; + Chart.BottomAxis.Maximum := 1100; + + mBDE := 0; + mADO := 0; + mdbExp := 0; + mdbExpSda := 0; + for i := 1 to 10 do begin + ResSDAC := 0; + ResBDE := 0; + ResADO := 0; + ResdbExp := 0; + ResdbExpSda := 0; + + meResult.Lines.Add('---------------'); + // SDAC + if cbSDAC.Checked then begin + ResSDAC := MultiExecutingTest(MSSQL, i*100); + Chart.Series[0].AddXY(i*100, ResSDAC/1000, '', clTeeColor); + end; + // BDE + if cbBDE.Checked then begin + ResBDE := MultiExecutingTest(BDEQuery, i*100); + Chart.Series[1].AddXY(i*100, ResBDE/1000, '', clTeeColor); + end; + // ADO + if cbADO.Checked then begin + ResADO := MultiExecutingTest(ADOQuery, i*100); + Chart.Series[2].AddXY(i*100, ResADO/1000, '', clTeeColor); + end; + // dbExpress + if cbdbExpress.Checked then begin + ResdbExp := MultiExecutingTest(BorlandSQLQuery, i*100); + Chart.Series[3].AddXY(i*100, ResdbExp/1000, '', clTeeColor); + end; + // dbExpSda + if cbdbExpSda.Checked then begin + ResdbExpSda := MultiExecutingTest(CrLabSQLQuery, i*100); + Chart.Series[4].AddXY(i*100, ResdbExpSda/1000, '', clTeeColor); + end; + + if ResSDAC > 0 then begin + mBDE := ((i - 1)*mBDE + ResBDE/ResSDAC)/i; + mADO := ((i - 1)*mADO + ResADO/ResSDAC)/i; + mdbExp := ((i - 1)*mdbExp + ResdbExp/ResSDAC)/i; + mdbExpSda := ((i - 1)*mdbExpSda + ResdbExpSda/ResSDAC)/i; + lbSDAC.Caption := FloatToStrF(1, ffGeneral, 5, 3); + lbBDE.Caption := FloatToStrF(mBDE, ffGeneral, 5, 3); + lbADO.Caption := FloatToStrF(mADO, ffGeneral, 5, 3); + lbdbExpress.Caption := FloatToStrF(mdbExp, ffGeneral, 5, 3); + lbdbExpSda.Caption := FloatToStrF(mdbExpSda, ffGeneral, 5, 3); + lbBDE.Update; + lbADO.Update; + lbdbExpress.Update; + lbdbExpSda.Update; + end; + + Chart.Update; + end; + PrintResults; +end; + +procedure TfmMain.FormDestroy(Sender: TObject); +begin + btDisconnectClick(nil); +end; + +procedure TfmMain.btnInsertPostClick(Sender: TObject); +var + i: integer; + ResSDAC, ResBDE, ResADO, ResdbExp, ResdbExpSda: integer; + mBDE, mADO, mdbExp, mdbExpSda: double; +const + Step = 1000; +begin + CheckConnected; + + Chart.Title.Text.Text := 'Insert / Post Test'; + for i := 0 to Chart.SeriesCount - 1 do + Chart.Series[i].Clear; + Chart.BottomAxis.Minimum := 0; + Chart.BottomAxis.Maximum := 11 * Step; + + mBDE := 0; + mADO := 0; + mdbExp := 0; + mdbExpSda := 0; + for i := 1 to 10 do begin + ResSDAC := 0; + ResBDE := 0; + ResADO := 0; + ResdbExp := 0; + ResdbExpSda := 0; + + meResult.Lines.Add('---------------'); + // SDAC + if cbSDAC.Checked then begin + ResSDAC := InsertPostTest(MSTable, i*Step); + Chart.Series[0].AddXY(i*Step, ResSDAC, '', clTeeColor); + end; + // BDE + if cbBDE.Checked then begin + ResBDE := InsertPostTest(BDETable, i*Step); + Chart.Series[1].AddXY(i*Step, ResBDE, '', clTeeColor); + end; + // ADO + if cbADO.Checked then begin + ResADO := InsertPostTest(ADOTable, i*Step); + Chart.Series[2].AddXY(i*Step, ResADO, '', clTeeColor); + end; + // dbExpress + if cbdbExpress.Checked then begin + ResdbExp := InsertPostTest(BorlandClientDataSet, i*Step); + Chart.Series[3].AddXY(i*Step, ResdbExp, '', clTeeColor); + end; + // dbExpSda + if cbdbExpSda.Checked then begin + ResdbExpSda := InsertPostTest(CrLabClientDataSet, i*Step); + Chart.Series[4].AddXY(i*Step, ResdbExpSda, '', clTeeColor); + end; + + if ResSDAC > 0 then begin + mBDE := ((i - 1)*mBDE + ResBDE/ResSDAC)/i; + mADO := ((i - 1)*mADO + ResADO/ResSDAC)/i; + mdbExp := ((i - 1)*mdbExp + ResdbExp/ResSDAC)/i; + mdbExpSda := ((i - 1)*mdbExpSda + ResdbExpSda/ResSDAC)/i; + lbSDAC.Caption := FloatToStrF(1, ffGeneral, 5, 3); + lbBDE.Caption := FloatToStrF(mBDE, ffGeneral, 5, 3); + lbADO.Caption := FloatToStrF(mADO, ffGeneral, 5, 3); + lbdbExpress.Caption := FloatToStrF(mdbExp, ffGeneral, 5, 3); + lbdbExpSda.Caption := FloatToStrF(mdbExpSda, ffGeneral, 5, 3); + lbBDE.Update; + lbADO.Update; + lbdbExpress.Update; + lbdbExpSda.Update; + end; + + // Chart.Update; + end; + PrintResults; +end; + +procedure TfmMain.cbSetInternalNameClick(Sender: TObject); +var + AConnected: boolean; + ALoginPrompt: boolean; +begin + AConnected := MSConnection.Connected; + ALoginPrompt := MSConnection.LoginPrompt; + MSConnection.Connected := false; + MSConnection.LoginPrompt := false; + MSConnection.Connected := AConnected; + MSConnection.LoginPrompt := ALoginPrompt; +end; + +procedure TfmMain.cbResultLogClick(Sender: TObject); +begin + meResult.Visible := cbResultLog.Checked; + Splitter1.Visible := cbResultLog.Checked; +end; + +const + coFetchAll = TSQLConnectionOption(301); // boolean + coPermitPrepare = TSQLConnectionOption(104); + +procedure TfmMain.CrLabSQLConnectionAfterConnect(Sender: TObject); +begin + CrLabSQLConnection.SQLConnection.SetOption(coFetchAll, Integer(False)); + CrLabSQLConnection.SQLConnection.SetOption(coPermitPrepare, Integer(True)); +end; + +procedure TfmMain.cbPermitPrepareClick(Sender: TObject); +begin + CrLabSQLConnection.Close; +end; + + +function TfmMain.EditPostTest(Table: TDataSet; Count: integer): integer; +const + chrs: array [0..1] of char = ('a', 'b'); +var + i:integer; + ExecTime:integer; + TableName: string; +begin + TableName := 'DETAIL'; + + if Table is TMSTable then begin + meResult.Lines.Add('> SDAC'); + TMSTable(Table).TableName := TableName; + // ~10% performance + TMSTable(Table).SQLInsert.Text := 'INSERT INTO DETAIL (Code, Master, Field1, Field2) VALUES (:Code, :Master, :Field1, :Field2)'; + end; + Table.Open; + if Table.RecordCount = 0 then begin + MessageDlg('Record count in "DETAIL" table must be more than 0!', mtError, [mbOK], 0); + Abort; + end; + + TickInfo.Start; + + for i := 1 to Count do begin + Table.Edit; + Table.FieldByName('CODE').Value := i; + Table.FieldByName('Field1').AsString := '0123456789012345678' + chrs[i mod 2]; + Table.FieldByName('Field2').AsString := '1234567890123456789' + chrs[i mod 2]; + Table.Post; + end; + + if Table = CrLabClientDataSet then + CrLabClientDataSet.ApplyUpdates(0); + + ExecTime := TickInfo.GetInterval; + Table.Close; + meResult.Lines.Add('Edited ' + IntToStr(Count) + ' records ' + IntervalToStr(ExecTime)); + + Result := ExecTime; +end; + +procedure TfmMain.btEditPostClick(Sender: TObject); +const + Step = 100; +var + i: integer; + ResSDAC: integer; +begin + for i := 1 to 10 do begin + ResSDAC := EditPostTest(MSTable, i*Step); + Chart.Series[0].AddXY(i*Step, ResSDAC, '', clGreen); + end; + PrintResults; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.bdsproj b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.bdsproj new file mode 100644 index 0000000..a0834c6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.bdsproj @@ -0,0 +1,158 @@ + + + + + + + + + + + + Performance.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.cfg b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.cfg new file mode 100644 index 0000000..31d44ef --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q+ +-$R+ +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"." +-N"." +-LE"." +-LN"." +-U"d:\program files\borland\delphi7\Lib\Debug;d:\program files\borland\delphi7\Vcl;d:\program files\borland\delphi7\lib;d:\Projects\Delphi\dac\Source\;d:\Projects\Delphi\Sdac\Source\" +-O"d:\program files\borland\delphi7\Lib\Debug;d:\program files\borland\delphi7\Vcl;d:\program files\borland\delphi7\lib;d:\Projects\Delphi\dac\Source\;d:\Projects\Delphi\Sdac\Source\" +-I"d:\program files\borland\delphi7\Lib\Debug;d:\program files\borland\delphi7\Vcl;d:\program files\borland\delphi7\lib;d:\Projects\Delphi\dac\Source\;d:\Projects\Delphi\Sdac\Source\" +-R"d:\program files\borland\delphi7\Lib\Debug;d:\program files\borland\delphi7\Vcl;d:\program files\borland\delphi7\lib;d:\Projects\Delphi\dac\Source\;d:\Projects\Delphi\Sdac\Source\" diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.dpr b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.dpr new file mode 100644 index 0000000..c541065 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.dpr @@ -0,0 +1,13 @@ +program Performance; + +uses + Forms, + Main in 'Main.pas' {fmMain}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfmMain, fmMain); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/Performance/Performance.res new file mode 100644 index 0000000000000000000000000000000000000000..08ba56e99891bf0b2acdfefe927247478e8bf093 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tp^Zst8L_ZP5k&}CsD*#vY_>@g2qZ!Zuev7Sp9#c+ZLacn zSX!pEkgRWK@A82kL*CB3nK!$W+mh^^CJHP~UnH4;YleN+gx}lm{@BAPvk7U=0#sy6=B^AQ5y+7;98)xnKC5zgd8bTHr1WEP zg?4K!Th0+Z;sn~gK)E-5HSfUl66lp^k$cpOKj3Q>*rSQ)6L|arK37m*E{#_1z3#jn i0_YIV?c)|#xWOH9jeGjaw%>(+4GQgcOFX!E?$=7IIa=~GU`(5rQG)e z_%J?#UFr6mw&7cRi-Bei^XE|1k6z52nKujO=zO>{I9V{Jem*@rIXK#%Gq#@WZJ!Np z)ZfmV;b3^YR6iN>rT#2lKN<69Yt5X`CeiWLXnZk=_D0`E(e`*ena!fFSJTUAcX~C6 z4o9D(<>lpQWpg$B?x(x`>-Wx0Gn`ybqaUM-?~{L%>uAXoEi5*ZP+X*n4i=k9C@xXO z7#5pJDBhup2`n~~P`pbOQ&?;!p?HrfX0X^yLNTI>IV?7lP`pnS3s`I>q4=PD%-rye zPV(0OSG*a8=0mR8Wz%amqtIO8nq4@(rpkH5HM?|rO|`SeHM@9vP1Uo`HM@LzP4%W*1Sfsfrxe>@w;#)lp0}Eq2t7!ktgJCU#`iQOY&3Bdd-w zu8AF4b(C{W?8vI4f@@+&RvkUzn%I$5M^CvXc4XDjGp>mpS#|WBYhp)M9lfBM4m)Z` z!O<4i#EzUgD!C?h6atD}8x zPwXgGM`RN_iq+98ZcpqeR!3wLJBroO0kvm>9krw2h-_jWFM&M~OOm z!|jP3CF+Q5Vn>NOI^_1mjuLf5HnF2b9SylXv7etG=ZPI< z;;1B>*ij~qJlVvKGI3OqP3$NWN9K$=&m22yN8x^wP3$NaN1kkAN4dO@Dzb?k<>JVk zbLWX2<>II$o7hn +#pragma hdrstop + +#include "Main.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "MemDS" +#pragma link "VirtualTable" +#pragma resource "*.dfm" +TForm1 *Form1; +//--------------------------------------------------------------------------- +__fastcall TForm1::TForm1(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- + +void __fastcall TForm1::btOpenClick(TObject *Sender) +{ + VirtualTable->Open(); + edField->Text = VirtualTable->Fields->Fields[0]->FieldName; +} +//--------------------------------------------------------------------------- + +void __fastcall TForm1::btCloseClick(TObject *Sender) +{ + VirtualTable->Close(); +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::btAutoFillClick(TObject *Sender) +{ + TField* Field = VirtualTable -> FindField("STRING1"); + for( int i = 1; i <= 100; i++ ){ + VirtualTable -> Append(); + VirtualTable -> FieldByName("NUMBER")->AsInteger = i; + VirtualTable -> FieldByName("STRING")->AsString = "Use Oracle Data Access from Core Lab !!! (" + IntToStr(i) + ")"; + VirtualTable -> FieldByName("DATE")->AsDateTime = Date(); + VirtualTable -> FieldByName("MEMO")->AsString = "Memo value (" + IntToStr(i) + ")"; + + if( Field != NULL ) + VirtualTable -> FieldByName("STRING1")->AsString = "TVirtualTable"; + + VirtualTable -> Post(); + } +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::btAddFieldClick(TObject *Sender) +{ + VirtualTable -> AddField("STRING1", ftString, 30); +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::btDelFieldClick(TObject *Sender) +{ + VirtualTable->DeleteField("STRING1"); +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::btLoadClick(TObject *Sender) +{ + if( OpenDialog->Execute() ) + VirtualTable->LoadFromFile(OpenDialog->FileName); +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::btSaveClick(TObject *Sender) +{ + if( SaveDialog->Execute() ) + VirtualTable->SaveToFile(SaveDialog->FileName); +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::btClearClick(TObject *Sender) +{ + VirtualTable->Clear(); +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::cbFilteredClick(TObject *Sender) +{ + VirtualTable->Filtered = cbFiltered->Checked; +} +//--------------------------------------------------------------------------- +void __fastcall TForm1::btLocateClick(TObject *Sender) +{ + VirtualTable->Locate(edField->Text, Variant(edValue->Text), TLocateOptions()); +} +//--------------------------------------------------------------------------- + diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Main.dfm b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Main.dfm new file mode 100644 index 0000000..a675d34 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Main.dfm @@ -0,0 +1,527 @@ +object Form1: TForm1 + Left = 146 + Top = 113 + Width = 696 + Height = 480 + Caption = 'Form1' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Splitter: TSplitter + Left = 0 + Top = 315 + Width = 688 + Height = 3 + Cursor = crVSplit + Align = alBottom + end + object ToolBar: TToolBar + Left = 0 + Top = 0 + Width = 688 + Height = 26 + TabOrder = 0 + object btOpen: TButton + Left = 0 + Top = 2 + Width = 75 + Height = 22 + Caption = 'Open' + TabOrder = 0 + OnClick = btOpenClick + end + object btClose: TButton + Left = 75 + Top = 2 + Width = 75 + Height = 22 + Caption = 'Close' + TabOrder = 2 + OnClick = btCloseClick + end + object btAutoFill: TButton + Left = 150 + Top = 2 + Width = 75 + Height = 22 + Caption = 'Append 100' + TabOrder = 3 + OnClick = btAutoFillClick + end + object btAddField: TButton + Left = 225 + Top = 2 + Width = 75 + Height = 22 + Caption = 'Add field' + TabOrder = 4 + OnClick = btAddFieldClick + end + object btDelField: TButton + Left = 300 + Top = 2 + Width = 75 + Height = 22 + Caption = 'Del field' + TabOrder = 5 + OnClick = btDelFieldClick + end + object DBNavigator: TDBNavigator + Left = 375 + Top = 2 + Width = 240 + Height = 22 + TabOrder = 1 + end + end + object Panel1: TPanel + Left = 0 + Top = 26 + Width = 688 + Height = 87 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Label1: TLabel + Left = 8 + Top = 33 + Width = 22 + Height = 13 + Caption = 'Field' + end + object Label2: TLabel + Left = 184 + Top = 32 + Width = 27 + Height = 13 + Caption = 'Value' + end + object Label5: TLabel + Left = 7 + Top = 62 + Width = 22 + Height = 13 + Caption = 'Filter' + end + object edField: TEdit + Left = 40 + Top = 29 + Width = 121 + Height = 21 + TabOrder = 0 + end + object edValue: TEdit + Left = 222 + Top = 29 + Width = 121 + Height = 21 + TabOrder = 1 + end + object btLocate: TButton + Left = 357 + Top = 27 + Width = 75 + Height = 25 + Caption = 'Locate' + TabOrder = 2 + OnClick = btLocateClick + end + object edFilter: TEdit + Left = 40 + Top = 58 + Width = 303 + Height = 21 + TabOrder = 3 + end + object cbFiltered: TCheckBox + Left = 360 + Top = 62 + Width = 73 + Height = 17 + Caption = 'Filtered' + TabOrder = 4 + OnClick = cbFilteredClick + end + object btLoad: TButton + Left = 0 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Load...' + TabOrder = 5 + OnClick = btLoadClick + end + object btSave: TButton + Left = 75 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Save...' + TabOrder = 6 + OnClick = btSaveClick + end + object btClear: TButton + Left = 150 + Top = 0 + Width = 70 + Height = 23 + Caption = 'Clear' + TabOrder = 7 + OnClick = btClearClick + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 113 + Width = 688 + Height = 202 + Align = alClient + DataSource = DataSource + TabOrder = 2 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object DBMemo: TDBMemo + Left = 0 + Top = 318 + Width = 688 + Height = 116 + Align = alBottom + DataField = 'MEMO' + DataSource = DataSource + TabOrder = 3 + end + object StatusBar: TStatusBar + Left = 0 + Top = 434 + Width = 688 + Height = 19 + Panels = < + item + Width = 120 + end + item + Width = 120 + end + item + Width = 50 + end> + SimplePanel = False + end + object VirtualTable: TVirtualTable + Active = True + FieldDefs = < + item + Name = 'NUMBER' + DataType = ftFloat + end + item + Name = 'STRING' + DataType = ftString + Size = 50 + end + item + Name = 'DATE' + DataType = ftDateTime + end + item + Name = 'MEMO' + DataType = ftMemo + end> + Left = 488 + Top = 42 + Data = { + 0100040006004E554D424552060000000600535452494E470100320004004441 + 54450B00000004004D454D4F100000000000640000000800000000000000F03F + 2C00557365204F7261636C652044617461204163636573732066726F6D20436F + 7265204C61622021212120283129080000007E3313B5CC420E004D656D6F2076 + 616C756520283129080000000000000000402C00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283229 + 080000007E3313B5CC420E004D656D6F2076616C756520283229080000000000 + 000008402C00557365204F7261636C652044617461204163636573732066726F + 6D20436F7265204C61622021212120283329080000007E3313B5CC420E004D65 + 6D6F2076616C756520283329080000000000000010402C00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 20283429080000007E3313B5CC420E004D656D6F2076616C7565202834290800 + 00000000000014402C00557365204F7261636C65204461746120416363657373 + 2066726F6D20436F7265204C61622021212120283529080000007E3313B5CC42 + 0E004D656D6F2076616C756520283529080000000000000018402C0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 2021212120283629080000007E3313B5CC420E004D656D6F2076616C75652028 + 362908000000000000001C402C00557365204F7261636C652044617461204163 + 636573732066726F6D20436F7265204C61622021212120283729080000007E33 + 13B5CC420E004D656D6F2076616C756520283729080000000000000020402C00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C61622021212120283829080000007E3313B5CC420E004D656D6F2076616C + 756520283829080000000000000022402C00557365204F7261636C6520446174 + 61204163636573732066726F6D20436F7265204C616220212121202839290800 + 00007E3313B5CC420E004D656D6F2076616C7565202839290800000000000000 + 24402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028313029080000007E3313B5CC420F004D656D + 6F2076616C75652028313029080000000000000026402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028313129080000007E3313B5CC420F004D656D6F2076616C75652028313129 + 080000000000000028402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028313229080000007E3313 + B5CC420F004D656D6F2076616C7565202831322908000000000000002A402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028313329080000007E3313B5CC420F004D656D6F207661 + 6C7565202831332908000000000000002C402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283134 + 29080000007E3313B5CC420F004D656D6F2076616C7565202831342908000000 + 000000002E402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028313529080000007E3313B5CC420F + 004D656D6F2076616C75652028313529080000000000000030402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028313629080000007E3313B5CC420F004D656D6F2076616C756520 + 28313629080000000000000031402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028313729080000 + 007E3313B5CC420F004D656D6F2076616C756520283137290800000000000000 + 32402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028313829080000007E3313B5CC420F004D656D + 6F2076616C75652028313829080000000000000033402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028313929080000007E3313B5CC420F004D656D6F2076616C75652028313929 + 080000000000000034402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028323029080000007E3313 + B5CC420F004D656D6F2076616C75652028323029080000000000000035402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028323129080000007E3313B5CC420F004D656D6F207661 + 6C75652028323129080000000000000036402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283232 + 29080000007E3313B5CC420F004D656D6F2076616C7565202832322908000000 + 0000000037402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028323329080000007E3313B5CC420F + 004D656D6F2076616C75652028323329080000000000000038402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028323429080000007E3313B5CC420F004D656D6F2076616C756520 + 28323429080000000000000039402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028323529080000 + 007E3313B5CC420F004D656D6F2076616C756520283235290800000000000000 + 3A402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028323629080000007E3313B5CC420F004D656D + 6F2076616C7565202832362908000000000000003B402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028323729080000007E3313B5CC420F004D656D6F2076616C75652028323729 + 08000000000000003C402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028323829080000007E3313 + B5CC420F004D656D6F2076616C7565202832382908000000000000003D402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028323929080000007E3313B5CC420F004D656D6F207661 + 6C7565202832392908000000000000003E402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283330 + 29080000007E3313B5CC420F004D656D6F2076616C7565202833302908000000 + 000000003F402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028333129080000007E3313B5CC420F + 004D656D6F2076616C75652028333129080000000000000040402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028333229080000007E3313B5CC420F004D656D6F2076616C756520 + 28333229080000000000008040402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028333329080000 + 007E3313B5CC420F004D656D6F2076616C756520283333290800000000000000 + 41402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028333429080000007E3313B5CC420F004D656D + 6F2076616C75652028333429080000000000008041402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028333529080000007E3313B5CC420F004D656D6F2076616C75652028333529 + 080000000000000042402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028333629080000007E3313 + B5CC420F004D656D6F2076616C75652028333629080000000000008042402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028333729080000007E3313B5CC420F004D656D6F207661 + 6C75652028333729080000000000000043402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283338 + 29080000007E3313B5CC420F004D656D6F2076616C7565202833382908000000 + 0000008043402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028333929080000007E3313B5CC420F + 004D656D6F2076616C75652028333929080000000000000044402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028343029080000007E3313B5CC420F004D656D6F2076616C756520 + 28343029080000000000008044402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028343129080000 + 007E3313B5CC420F004D656D6F2076616C756520283431290800000000000000 + 45402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028343229080000007E3313B5CC420F004D656D + 6F2076616C75652028343229080000000000008045402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028343329080000007E3313B5CC420F004D656D6F2076616C75652028343329 + 080000000000000046402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028343429080000007E3313 + B5CC420F004D656D6F2076616C75652028343429080000000000008046402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028343529080000007E3313B5CC420F004D656D6F207661 + 6C75652028343529080000000000000047402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283436 + 29080000007E3313B5CC420F004D656D6F2076616C7565202834362908000000 + 0000008047402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028343729080000007E3313B5CC420F + 004D656D6F2076616C75652028343729080000000000000048402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028343829080000007E3313B5CC420F004D656D6F2076616C756520 + 28343829080000000000008048402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028343929080000 + 007E3313B5CC420F004D656D6F2076616C756520283439290800000000000000 + 49402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028353029080000007E3313B5CC420F004D656D + 6F2076616C75652028353029080000000000008049402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028353129080000007E3313B5CC420F004D656D6F2076616C75652028353129 + 08000000000000004A402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028353229080000007E3313 + B5CC420F004D656D6F2076616C7565202835322908000000000000804A402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028353329080000007E3313B5CC420F004D656D6F207661 + 6C7565202835332908000000000000004B402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283534 + 29080000007E3313B5CC420F004D656D6F2076616C7565202835342908000000 + 000000804B402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028353529080000007E3313B5CC420F + 004D656D6F2076616C7565202835352908000000000000004C402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028353629080000007E3313B5CC420F004D656D6F2076616C756520 + 2835362908000000000000804C402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028353729080000 + 007E3313B5CC420F004D656D6F2076616C756520283537290800000000000000 + 4D402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028353829080000007E3313B5CC420F004D656D + 6F2076616C7565202835382908000000000000804D402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028353929080000007E3313B5CC420F004D656D6F2076616C75652028353929 + 08000000000000004E402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028363029080000007E3313 + B5CC420F004D656D6F2076616C7565202836302908000000000000804E402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028363129080000007E3313B5CC420F004D656D6F207661 + 6C7565202836312908000000000000004F402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283632 + 29080000007E3313B5CC420F004D656D6F2076616C7565202836322908000000 + 000000804F402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028363329080000007E3313B5CC420F + 004D656D6F2076616C75652028363329080000000000000050402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028363429080000007E3313B5CC420F004D656D6F2076616C756520 + 28363429080000000000004050402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028363529080000 + 007E3313B5CC420F004D656D6F2076616C756520283635290800000000000080 + 50402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028363629080000007E3313B5CC420F004D656D + 6F2076616C7565202836362908000000000000C050402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028363729080000007E3313B5CC420F004D656D6F2076616C75652028363729 + 080000000000000051402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028363829080000007E3313 + B5CC420F004D656D6F2076616C75652028363829080000000000004051402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028363929080000007E3313B5CC420F004D656D6F207661 + 6C75652028363929080000000000008051402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283730 + 29080000007E3313B5CC420F004D656D6F2076616C7565202837302908000000 + 000000C051402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028373129080000007E3313B5CC420F + 004D656D6F2076616C75652028373129080000000000000052402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028373229080000007E3313B5CC420F004D656D6F2076616C756520 + 28373229080000000000004052402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028373329080000 + 007E3313B5CC420F004D656D6F2076616C756520283733290800000000000080 + 52402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028373429080000007E3313B5CC420F004D656D + 6F2076616C7565202837342908000000000000C052402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028373529080000007E3313B5CC420F004D656D6F2076616C75652028373529 + 080000000000000053402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028373629080000007E3313 + B5CC420F004D656D6F2076616C75652028373629080000000000004053402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028373729080000007E3313B5CC420F004D656D6F207661 + 6C75652028373729080000000000008053402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283738 + 29080000007E3313B5CC420F004D656D6F2076616C7565202837382908000000 + 000000C053402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028373929080000007E3313B5CC420F + 004D656D6F2076616C75652028373929080000000000000054402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028383029080000007E3313B5CC420F004D656D6F2076616C756520 + 28383029080000000000004054402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028383129080000 + 007E3313B5CC420F004D656D6F2076616C756520283831290800000000000080 + 54402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028383229080000007E3313B5CC420F004D656D + 6F2076616C7565202838322908000000000000C054402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028383329080000007E3313B5CC420F004D656D6F2076616C75652028383329 + 080000000000000055402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028383429080000007E3313 + B5CC420F004D656D6F2076616C75652028383429080000000000004055402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028383529080000007E3313B5CC420F004D656D6F207661 + 6C75652028383529080000000000008055402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283836 + 29080000007E3313B5CC420F004D656D6F2076616C7565202838362908000000 + 000000C055402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028383729080000007E3313B5CC420F + 004D656D6F2076616C75652028383729080000000000000056402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028383829080000007E3313B5CC420F004D656D6F2076616C756520 + 28383829080000000000004056402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028383929080000 + 007E3313B5CC420F004D656D6F2076616C756520283839290800000000000080 + 56402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028393029080000007E3313B5CC420F004D656D + 6F2076616C7565202839302908000000000000C056402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028393129080000007E3313B5CC420F004D656D6F2076616C75652028393129 + 080000000000000057402D00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C6162202121212028393229080000007E3313 + B5CC420F004D656D6F2076616C75652028393229080000000000004057402D00 + 557365204F7261636C652044617461204163636573732066726F6D20436F7265 + 204C6162202121212028393329080000007E3313B5CC420F004D656D6F207661 + 6C75652028393329080000000000008057402D00557365204F7261636C652044 + 617461204163636573732066726F6D20436F7265204C61622021212120283934 + 29080000007E3313B5CC420F004D656D6F2076616C7565202839342908000000 + 000000C057402D00557365204F7261636C652044617461204163636573732066 + 726F6D20436F7265204C6162202121212028393529080000007E3313B5CC420F + 004D656D6F2076616C75652028393529080000000000000058402D0055736520 + 4F7261636C652044617461204163636573732066726F6D20436F7265204C6162 + 202121212028393629080000007E3313B5CC420F004D656D6F2076616C756520 + 28393629080000000000004058402D00557365204F7261636C65204461746120 + 4163636573732066726F6D20436F7265204C6162202121212028393729080000 + 007E3313B5CC420F004D656D6F2076616C756520283937290800000000000080 + 58402D00557365204F7261636C652044617461204163636573732066726F6D20 + 436F7265204C6162202121212028393829080000007E3313B5CC420F004D656D + 6F2076616C7565202839382908000000000000C058402D00557365204F726163 + 6C652044617461204163636573732066726F6D20436F7265204C616220212121 + 2028393929080000007E3313B5CC420F004D656D6F2076616C75652028393929 + 080000000000000059402E00557365204F7261636C6520446174612041636365 + 73732066726F6D20436F7265204C616220212121202831303029080000007E33 + 13B5CC4210004D656D6F2076616C7565202831303029} + end + object DataSource: TDataSource + DataSet = VirtualTable + Left = 520 + Top = 42 + end + object SaveDialog: TSaveDialog + DefaultExt = 'vtd' + FileName = 'Data1.vtd' + Filter = 'Virtual Table Data (*.vtd)|*.vtd|Any File (*.*)|*.*' + Left = 520 + Top = 74 + end + object OpenDialog: TOpenDialog + DefaultExt = 'vtd' + FileName = 'Data1.vtd' + Filter = 'Virtual Table Data (*.vtd)|*.vtd|Any File (*.*)|*.*' + Left = 488 + Top = 74 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Main.h b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Main.h new file mode 100644 index 0000000..f609fcc --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/Main.h @@ -0,0 +1,68 @@ +//--------------------------------------------------------------------------- + +#ifndef MainH +#define MainH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MemDS.hpp" +#include "VirtualTable.hpp" +#include +#include +//--------------------------------------------------------------------------- +class TForm1 : public TForm +{ +__published: // IDE-managed Components + TToolBar *ToolBar; + TButton *btOpen; + TButton *btClose; + TButton *btAutoFill; + TButton *btAddField; + TButton *btDelField; + TDBNavigator *DBNavigator; + TPanel *Panel1; + TLabel *Label1; + TLabel *Label2; + TLabel *Label5; + TEdit *edField; + TEdit *edValue; + TButton *btLocate; + TEdit *edFilter; + TCheckBox *cbFiltered; + TButton *btLoad; + TButton *btSave; + TButton *btClear; + TDBGrid *DBGrid; + TDBMemo *DBMemo; + TSplitter *Splitter; + TStatusBar *StatusBar; + TVirtualTable *VirtualTable; + TDataSource *DataSource; + TSaveDialog *SaveDialog; + TOpenDialog *OpenDialog; + void __fastcall btOpenClick(TObject *Sender); + void __fastcall btCloseClick(TObject *Sender); + void __fastcall btAutoFillClick(TObject *Sender); + void __fastcall btAddFieldClick(TObject *Sender); + void __fastcall btDelFieldClick(TObject *Sender); + void __fastcall btLoadClick(TObject *Sender); + void __fastcall btSaveClick(TObject *Sender); + void __fastcall btClearClick(TObject *Sender); + void __fastcall cbFilteredClick(TObject *Sender); + void __fastcall btLocateClick(TObject *Sender); +private: // User declarations +public: // User declarations + __fastcall TForm1(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TForm1 *Form1; +//--------------------------------------------------------------------------- +#endif diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/ReadMe.txt new file mode 100644 index 0000000..e27f13b --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/ReadMe.txt @@ -0,0 +1,9 @@ +DB Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demonstrates working with the TVirtualTable component. This sample shows +how to fill virtual dataset with data from other datasets, filter data by +a given criteria, locate specified records, perform file operations, and +change data and table structure. This is one of the two demo projects for +C++Builder. diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.bpr b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.bpr new file mode 100644 index 0000000..c670466 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.bpr @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Excluded Packages] +d:\program files\borland\cbuilder6\Bin\oraprov60.bpl=OraProvider package + +[HistoryLists\hlIncludePath] +Count=3 +Item0=$(BCB)\include;$(BCB)\include\vcl +Item1=$(BCB)\include;$(BCB)\include\vcl;C:\Program Files\CoreLab\VTable\Source\CBuilder6\VTable\Include +Item2=d:\projects\delphi\dac\source;..\..\Projects;..\VTable\Demos;$(BCB)\include;$(BCB)\include\vcl;D:\Program Files\Borland\CBuilder6\Odac\Include;D:\Program Files\Borland\CBuilder6\MyDac\Include;D:\Program Files\Borland\CBuilder6\Odac5004\Include;D:\Program Files\Borland\CBuilder6\Odac5003\Include;D:\Program Files\Borland\CBuilder6\VTable\Include + +[HistoryLists\hlLibraryPath] +Count=5 +Item0=$(BCB)\lib\obj;$(BCB)\lib +Item1=C:\Program Files\CoreLab\VTable\Source\CBuilder6\VTable\Lib;$(BCB)\lib\obj;$(BCB)\lib;D:\Projects\Delphi\Dac\Source +Item2=$(BCB)\lib\obj;$(BCB)\lib;D:\Projects\Delphi\Dac\Source +Item3=C:\Program Files\CoreLab\VTable\Source\CBuilder6\VTable\Lib;$(BCB)\lib\obj;$(BCB)\lib +Item4=d:\projects\delphi\dac\source\cbuilder6;d:\projects\delphi\dac\source;..\..\Projects;..\VTable\Demos;$(BCB)\lib\obj;$(BCB)\lib;D:\Program Files\Borland\CBuilder6\Odac\Lib;D:\Program Files\Borland\CBuilder6\MyDac\Lib;D:\Program Files\Borland\CBuilder6\Odac5004\Lib;D:\Program Files\Borland\CBuilder6\Odac5003\Lib;D:\Program Files\Borland\CBuilder6\VTable\Lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.cpp b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.cpp new file mode 100644 index 0000000..810eb2d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.cpp @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +//--------------------------------------------------------------------------- +USEFORM("Main.cpp", Form1); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + catch (...) + { + try + { + throw Exception(""); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.res b/internal/4.10.0.10/1/Demos/Win32/Miscellaneous/VirtualTableCB/VTable.res new file mode 100644 index 0000000000000000000000000000000000000000..5468ae567e714b763510d31fd2096b9014a4b7ff GIT binary patch literal 876 zcmb_bF;2uV5ZrKAqbq2xA|)l#wMYbAq=*9e1y8_5T%?S2_n#}$q(Dlu&!C{N_=1_S zpJbUEDNkr8#P)!7g~>+gQ&5OUK9M((aXI~w}+^AsMBA)L_a-jOn!QJe)3aK z{nV|tTG?;s>+$>#;tiU;IPX=Y9I8Y30?;+In!!ZfhB{lLM#4JK3*e$=8W3hD@k{hG z$R+-b69qYlF^T+H|G=Bf%apem501FNuxrr!b9s '') and (pos(' ', FDemosDescription.Items[FDemosDescription.ItemIndex]) <> 1) and Assigned(FOnNavigate) then begin + FOnNavigate(FDemosDescription.Items[FDemosDescription.ItemIndex]); + end; +end; + +{$ELSE} + +procedure TCategoryFrame.SetDemoDescriptions(Descriptions: TStrings); +var + v: Variant; + HTMLDocument: IHTMLDocument2; + Len: integer; +begin + HTMLDocument := FDemosDescription.Document as IHTMLDocument2; + if Assigned(HTMLDocument) then begin + v := VarArrayCreate([0, 0], varVariant); + v[0] := Descriptions.Text; + HTMLDocument.Write(PSafeArray(TVarData(v).VArray)); + HTMLDocument.Close; + end + else begin + Len := GetEnvironmentVariable(PChar('TEMP'), nil, 0); + if Len > 0 then + begin + SetLength(FTempFileName, Len - 1); + GetEnvironmentVariable(PChar('TEMP'), PChar(FTempFileName), Len); + end; + if Length(FTempFileName) > 1 then begin + if FTempFileName[length(FTempFileName) - 1] <> '\' then + FTempFileName := FTempFileName + '\'; + FTempFileName := FTempFileName + 'DAC_Demo_tmp.html'; + Descriptions.SaveToFile(FTempFileName); + FDemosDescription.Navigate(FTempFileName) + end; + end; +end; + +// Navigation +procedure TCategoryFrame.DemosDescriptionBeforeNavigate2(Sender: TObject; + const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, + Headers: OleVariant; var Cancel: WordBool); +var + Index: integer; + str: string; +begin + str := ExtractFileName(URL); + if (str = 'blank') or (str = ExtractFileName(FTempFileName)) then // navigating 'about:blank', or the html temporary file + Exit; // let navigator to handle + // our handler + Cancel := True; +{$IFNDEF LINUX} + if not TryStrToInt(str, Index) then begin + str := ExtractFilePath(Application.Exename) + copy(url, 4, Length(url) - 3); + ShellExecute(0, 'open', PChar(str), '', '.', SW_SHOW); + exit; + end; +{$ENDIF} + if Assigned(FOnNavigate) then + FOnNavigate(Index); +end; + +{$ENDIF} + +{$IFDEF WIN32} +initialization + OleInitialize(nil); + +finalization + OleUninitialize; +{$ENDIF} + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/CategoryFrame.xfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/CategoryFrame.xfm new file mode 100644 index 0000000..506e173 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/CategoryFrame.xfm @@ -0,0 +1,5 @@ +inherited CategoryFrame: TCategoryFrame + Width = 451 + Height = 304 + Align = alClient +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DacDemo.inc b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DacDemo.inc new file mode 100644 index 0000000..27dc695 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DacDemo.inc @@ -0,0 +1,13 @@ +{$IFNDEF LINUX} + { $DEFINE USE_SYNEDIT} + {$IFNDEF VER130} + {$IFNDEF VER140} + {$IFNDEF CLR} + {$DEFINE XPMAN} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF} +{$IFNDEF CLR} + {$DEFINE HAVE_COMPRESS} +{$ENDIF} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoBase.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoBase.pas new file mode 100644 index 0000000..5bebb5b --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoBase.pas @@ -0,0 +1,416 @@ +unit DemoBase; + +interface + +uses + Classes, SysUtils, DemoFrame, CategoryFrame, DBAccess, MemUtils, +{$IFDEF LINUX} + QControls, QGraphics, QComCtrls, QForms +{$ELSE} + Windows, ComCtrls, Controls, Graphics, Forms, + HTMLConsts, ShellAPI +{$ENDIF} + ; + +type + TDemoType = (dtDemo, dtCategory); + + TDemo = class + protected + FName: string; + FFileName: string; + FHint: string; + FDescription: string; + FDemoType: TDemoType; + FFrameClass: TDemoFrameClass; + FFrame: TDemoFrame; + public + constructor Create(Name, Hint, Description: string; DemoType: TDemoType; FrameClass: TDemoFrameClass; FileName: string = ''); + destructor Destroy; override; + + procedure LoadDemoCode(Strings: TStrings); + procedure LoadFormCode(Strings: TStrings); + procedure OpenDemoFolder; + procedure FreeFrame; + + property Name: string read FName; + property Hint: string read FHint; + property Description: string read FDescription; + property DemoType: TDemoType read FDemoType; + property FrameClass: TDemoFrameClass read FFrameClass; + property Frame: TDemoFrame read FFrame; + end; + + TDemos = class + protected + FDemoTreeNodes: TTreeNodes; + FSelectedDemo: TDemo; + FSupplementaryDemosDescription: TStrings; + function GetSelectedDemo: TDemo; + function GetItems(Index: integer): TDemo; + + function WrapDescription(Demo: TDemo): TStrings; + public + constructor Create(TreeNodes: TTreeNodes); virtual; + destructor Destroy; override; + + procedure RegisterCategory(CategoryName, Hint: string; ImgIndex: integer = -1; SupplementaryDemo: boolean = False); + procedure RegisterDemo(DemoName, DemoHint, DemoDescription, DemoCategory: string; FrameClass: TDemoFrameClass; ImgIndex: integer; FileName: string = ''; SupplementaryDemo: boolean = False); + procedure Clear; + //Navigation + function SelectDemo(DemoIndex: integer): TDemo; //Create demo frame by DemoIndex + + function GetDemoIndex(AbsoluteIndex: integer): integer; + + property Items[Index: integer]: TDemo read GetItems; default; + property SelectedDemo: TDemo read GetSelectedDemo; + end; + +implementation + +const + MainDemosHeader = 'Main Demo Projects'; + SupplementaryDemosHeader = 'Supplementary Demo Projects'; + SupplementaryDemosNote = ' Note, the demo projects listed below are separate projects. ' {$IFNDEF WIN32} + #13#10 {$ENDIF} + ' This project contains only their descriptions and links to their folders.'; + +{$IFNDEF WIN32} +procedure WriteTable(CategoryName, CategoryDescription: string; List: TStrings); +var + strs: TStringList; +begin + List.Add(' '); + List.Add(' ' + CategoryName); + strs := TStringList.Create; + strs.Text := CategoryDescription; + List.AddStrings(strs); + strs.Free; +end; +{$ELSE} +procedure WriteTable(CategoryName, CategoryDescription: string; List: TStrings); +begin + if CategoryName = '' then begin // used to close virtual category + List.Add(''); + Exit; + end; + + List.Add('

' + CategoryName + '

'); + List.Add(''); + List.Add(''); + List.Add(''); + List.Add(''); + List.Add(''); + if CategoryDescription <> '' then begin + List.Add(CategoryDescription); + List.Add('
DemoDescription
'); + end; +end; +{$ENDIF} + +constructor TDemos.Create(TreeNodes: TTreeNodes); +begin + inherited Create; + + if not Assigned(TreeNodes) then + raise Exception.Create('TreeNodes should be set'); + FDemoTreeNodes := TreeNodes; + FSupplementaryDemosDescription := TStringList.Create; +{$IFNDEF WIN32} + FSupplementaryDemosDescription.Text := #13#10' ' + SupplementaryDemosHeader; + FSupplementaryDemosDescription.Add(SupplementaryDemosNote); +{$ENDIF} +end; + +destructor TDemos.Destroy; +begin + Clear; + inherited; +end; + +procedure TDemos.RegisterCategory(CategoryName, Hint: string; ImgIndex: integer = -1; SupplementaryDemo: boolean = False); +var + Node: TTreeNode; + Index: integer; + Category: TDemo; +begin + if SupplementaryDemo then + WriteTable(CategoryName, Hint, FSupplementaryDemosDescription) + else begin + Category := TDemo.Create(CategoryName, Hint, '', dtCategory, TCategoryFrame); + Node := FDemoTreeNodes.AddChildObject(FDemoTreeNodes.GetFirstNode, CategoryName, Category); + if ImgIndex < 0 then + Index := 0 + else + Index := ImgIndex; + Node.ImageIndex := Index; + Node.SelectedIndex := Index; + {$IFNDEF LINUX} + Node.StateIndex := Index; + {$ENDIF} + end; +end; + +procedure TDemos.RegisterDemo(DemoName, DemoHint, DemoDescription, DemoCategory: string; FrameClass: TDemoFrameClass; ImgIndex: integer; FileName: string = ''; SupplementaryDemo: boolean = False); + + function FindCategoryNode(CategoryName: string): TTreeNode; + var + RootNode: TTreeNode; + begin + RootNode := FDemoTreeNodes.GetFirstNode; + if RootNode <> nil then + Result := RootNode.getFirstChild + else + Result := nil; + while Result <> nil do begin + if Result.Text = CategoryName then + break; + Result := Result.getNextSibling; + end; + end; + +{$IFNDEF WIN32} + function CompleteWithSpaces(s: string; ResultLength: word): string; + var + n, i: integer; + begin + result := s; + n := ResultLength - Length(s); + if n > 0 then + for i := 1 to n do + result := result + ' '; + end; +{$ENDIF} + + function ToTableLine(Name, Description, DemoLink: string): string; + begin + {$IFDEF WIN32} + Result := Format(' ' + + '%s%s'#13#10, + [DemoLink, Name, Description]); + {$ELSE} + Result := CompleteWithSpaces(Name, 15) + '- ' + Description + {$IFDEF LINUX}#13{$ELSE}#13#10{$ENDIF}; + {$ENDIF} + end; + +var + CategoryNode, DemoNode: TTreeNode; + Index: integer; + Category, Demo: TDemo; +begin + if SupplementaryDemo then + FSupplementaryDemosDescription.Text := FSupplementaryDemosDescription.Text + ToTableLine(DemoName, DemoDescription, '..\' + DemoCategory + '\' + DemoName) + else begin + CategoryNode := FindCategoryNode(DemoCategory); + if not Assigned(CategoryNode) then + raise Exception.Create('DemoCategory is wrong'); + + Category := TDemo(CategoryNode.Data); + Demo := TDemo.Create(DemoName, DemoHint, DemoDescription, dtDemo, FrameClass, FileName); + DemoNode := FDemoTreeNodes.AddChildObject(CategoryNode, Demo.Name, Demo); + if ImgIndex < 0 then + Index := 1 + else + Index := ImgIndex; + DemoNode.ImageIndex := Index; + DemoNode.SelectedIndex := Index; + {$IFNDEF LINUX} + DemoNode.StateIndex := Index; + {$ENDIF} + + Category.FDescription := Category.FDescription + ToTableLine(DemoName, DemoDescription, IntToStr(DemoNode.AbsoluteIndex)); + end; +end; + +procedure TDemos.Clear; +var + i: integer; +begin + for i := 0 to FDemoTreeNodes.Count - 1 do + if FDemoTreeNodes[i].Data <> nil then + TDemo(FDemoTreeNodes[i].Data).Free; +end; + +function TDemos.GetSelectedDemo: TDemo; +begin + if FSelectedDemo <> nil then + Result := FSelectedDemo + else + raise Exception.Create('No selected demo'); +end; + +function TDemos.GetDemoIndex(AbsoluteIndex: integer): integer; +var + i: integer; +begin + Result := -1; + for i := 0 to FDemoTreeNodes.Count - 1 do + if FDemoTreeNodes[i].AbsoluteIndex = AbsoluteIndex then begin + if FDemoTreeNodes[i].Data <> nil then + Result := i; + Break; + end; +end; + +function TDemos.GetItems(Index: integer): TDemo; +var + i: integer; +begin + i := GetDemoIndex(Index); + if i >= 0 then + Result := TDemo(FDemoTreeNodes[i].Data) + else + raise Exception.Create('Wrong demo index'); +end; + +function TDemos.WrapDescription(Demo: TDemo): TStrings; + +var + CatNode, RootNode: TTreeNode; +begin + Result := TStringList.Create; +{$IFDEF WIN32} + Result.Add(HTMLHeader); + Result.Add('

' + MainDemosHeader + '

'); +{$ELSE} + Result.Add(''); + Result.Add(' ' + MainDemosHeader); + Result.Add(''); +{$ENDIF} + if Demo <> GetItems(0) then //RootCategory + WriteTable(Demo.Name, Demo.Description, Result) + else begin + RootNode := FDemoTreeNodes.GetFirstNode; + CatNode := RootNode.getFirstChild; + while CatNode <> nil do begin + WriteTable(TDemo(CatNode.Data).Name, TDemo(CatNode.Data).Description, Result); + CatNode := CatNode.getNextSibling; + end; +{$IFDEF WIN32} + Result.Add('


' + SupplementaryDemosHeader + '

'); + Result.Add('

' + SupplementaryDemosNote + '

'); +{$ENDIF} + + Result.AddStrings(FSupplementaryDemosDescription); + end; +{$IFDEF WIN32} + Result.Add(HTMLFooter); +{$ENDIF} +end; + +function TDemos.SelectDemo(DemoIndex: integer): TDemo; //Init and show demo by DemoIndex +var + Descriptions: TStrings; +begin + Result := GetItems(DemoIndex); + if (FSelectedDemo <> nil) and (Result <> FSelectedDemo) then + if FSelectedDemo.DemoType <> dtCategory then + FSelectedDemo.FreeFrame //In case of demo selection change we should free demo frame except category description + else + FSelectedDemo.Frame.Hide; + FSelectedDemo := Result; + with FSelectedDemo do + if FFrame = nil then begin + FFrame := FFrameClass.Create(nil); + if DemoType = dtCategory then begin + Descriptions := WrapDescription(FSelectedDemo); + try + TCategoryFrame(FFrame).SetDemoDescriptions(Descriptions); + finally + Descriptions.Free; + end; + end; + end + else + FFrame.Show; +end; + +{TDemo} +constructor TDemo.Create(Name, Hint, Description: string; DemoType: TDemoType; FrameClass: TDemoFrameClass; FileName: string = ''); +begin + inherited Create; + + FName := Name; + if FileName = '' then + FFileName := Name + else + FFileName := FileName; + FHint := Hint; + FDescription := Description; + FFrameClass := FrameClass; + FDemoType := DemoType; +end; + +destructor TDemo.Destroy; +begin + FreeFrame; + + inherited; +end; + +procedure TDemo.LoadDemoCode(Strings: TStrings); +var + FileName: string; +begin + if DemoType = dtCategory then + Strings.Clear + else begin + {$IFDEF LINUX} + FileName := Format('%s/%s/%s.pas', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ELSE} + FileName := Format('%s\%s\%s.pas', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ENDIF} + + if FileExists(FileName) then + Strings.LoadFromFile(FileName) + else + Strings.Clear; + end; +end; + +procedure TDemo.LoadFormCode(Strings: TStrings); +var + FileName: string; +begin + if DemoType = dtCategory then + Strings.Clear + else begin + {$IFDEF LINUX} + FileName := Format('%s/%s/%s.xfm', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ENDIF} + {$IFDEF CLR} + FileName := Format('%s\%s\%s.nfm', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ENDIF} + {$IFDEF WIN32} + FileName := Format('%s\%s\%s.dfm', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ENDIF} + + if FileExists(FileName) then + Strings.LoadFromFile(FileName) + else + Strings.Clear; + end; +end; + +procedure TDemo.OpenDemoFolder; +{$IFNDEF LINUX} +var + FolderName: string; +begin + if DemoType = dtDemo then begin + FolderName := ExtractFilePath(Application.ExeName) + Name; + ShellExecute(0, 'open', PChar(FolderName), '', '.', SW_SHOW); + end; +end; +{$ELSE} +begin + +end; +{$ENDIF} + +procedure TDemo.FreeFrame; +begin + FFrame.Free; + FFrame := nil; +end; + + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.dfm new file mode 100644 index 0000000..631bd91 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.dfm @@ -0,0 +1,937 @@ +object DemoForm: TDemoForm + Left = 71 + Top = 139 + Width = 957 + Height = 500 + Caption = 'Data Access Components demos' + Color = clSilver + Constraints.MinHeight = 500 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + Scaled = False + ShowHint = True + WindowState = wsMaximized + OnCreate = FormCreate + OnDestroy = FormDestroy + OnResize = FormResize + PixelsPerInch = 96 + TextHeight = 13 + object TVSplitter: TSplitter + Left = 216 + Top = 69 + Height = 374 + Beveled = True + Color = 9790720 + MinSize = 150 + ParentColor = False + OnCanResize = TVSplitterCanResize + OnMoved = TVSplitterMoved + end + object MainPanel: TPanel + Left = 219 + Top = 69 + Width = 730 + Height = 374 + Align = alClient + BevelOuter = bvNone + Constraints.MinWidth = 730 + TabOrder = 2 + object pnDemo: TPanel + Left = 0 + Top = 0 + Width = 730 + Height = 374 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + end + object pnSource: TPanel + Left = 0 + Top = 0 + Width = 730 + Height = 374 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + Visible = False + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 443 + Width = 949 + Height = 20 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Panels = < + item + Width = 220 + end + item + Width = 100 + end + item + Width = 480 + end + item + Width = 50 + end> + UseSystemFont = False + end + object PanelUnderTree: TPanel + Left = 0 + Top = 69 + Width = 216 + Height = 374 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object TreeView: TTreeView + Left = 0 + Top = 22 + Width = 351 + Height = 352 + Align = alLeft + HideSelection = False + HotTrack = True + Images = ImageList1 + Indent = 21 + ParentShowHint = False + ReadOnly = True + ShowHint = True + TabOrder = 0 + OnChange = TreeViewChange + OnClick = TreeViewClick + OnKeyDown = TreeViewKeyDown + OnMouseMove = TreeViewMouseMove + end + object ToolBar: TToolBar + Left = 0 + Top = 0 + Width = 216 + Height = 22 + AutoSize = True + ButtonWidth = 28 + Caption = 'ToolBar' + DisabledImages = ilDisabledButtons + EdgeInner = esNone + EdgeOuter = esNone + Flat = True + Images = ilButtons + TabOrder = 1 + object tbBrowseBack: TToolButton + Left = 0 + Top = 0 + Hint = 'Back' + Caption = ' Back ' + DropdownMenu = BackHistoryPopup + ImageIndex = 0 + Style = tbsDropDown + OnClick = tbBrowseBackClick + end + object tbBrowseForward: TToolButton + Left = 41 + Top = 0 + Hint = 'Forward' + DropdownMenu = ForwardHistoryPopup + ImageIndex = 1 + Style = tbsDropDown + OnClick = tbBrowseForwardClick + end + end + end + object pnTopLabel: TPanel + Left = 0 + Top = 0 + Width = 949 + Height = 41 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + object lbTitle: TLabel + Left = 0 + Top = 0 + Width = 949 + Height = 42 + Cursor = crArrow + Align = alTop + Caption = 'DAC demos' + Color = 9790720 + Constraints.MinWidth = 130 + Font.Charset = RUSSIAN_CHARSET + Font.Color = clWhite + Font.Height = -35 + Font.Name = 'Verdana' + Font.Style = [fsBold, fsItalic] + ParentColor = False + ParentFont = False + OnMouseMove = lbTitleMouseMove + end + object lbAbout: TLabel + Left = 854 + Top = 12 + Width = 34 + Height = 13 + Caption = 'About' + Color = 9790720 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold, fsUnderline] + ParentColor = False + ParentFont = False + OnClick = lbAboutClick + OnMouseMove = lbAboutMouseMove + end + end + object Panel2: TPanel + Left = 0 + Top = 41 + Width = 949 + Height = 28 + Align = alTop + BevelOuter = bvNone + TabOrder = 4 + object Shape1: TShape + Left = 0 + Top = 25 + Width = 949 + Height = 3 + Align = alBottom + Brush.Color = 9790720 + Pen.Color = clBtnFace + end + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 375 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 0 + object sbConnect: TSpeedButton + Left = 1 + Top = 1 + Width = 100 + Height = 22 + Hint = 'Connect to database' + Caption = 'Connect' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + Glyph.Data = { + F6050000424DF60500000000000036000000280000001E000000100000000100 + 180000000000C005000000000000000000000000000000000000800080800080 + 8000808000808000808000808000808000808000808000804B40388000808000 + 8080008080008080008080008080008080008080008080008080008080008080 + 00808000803E3E3E800080800080800080800080000080008080008080008080 + 00808000808000808000808000808000808000808000804C40373E352D800080 + 8000808000808000808000808000808000808000808000808000808000808000 + 808000803E3E3E33333380008080008000008000808000808000808000808000 + 808000808000808000807E6A5C80008066574B594B414C403880008080008080 + 0080800080800080800080800080800080800080800080686868800080555555 + 4949493E3E3E8000808000800000800080800080800080800080800080800080 + 8000808000808000807E6B5D72615466564B594B428000808000808000808000 + 808000808000808000808000808000808000808000806868685E5E5E54545449 + 49498000808000800000800080A2C8D864A8C0608D9F5D83964A768D346D8C30 + 70925C8AA38874647E6B5C73615466564B800080800080800080C8C8C8A7A7A7 + 8D8D8D8484847878787070707373738C8C8C7171716868685F5F5F5454548000 + 808000800000800080638CA53FBCE884D5E8A1EBF673E4FF24BEF3039FDE148B + BE45729080008080008080008066574B8000808000808E8E8EBBBBBBD1D1D1E6 + E6E6DFDFDFBCBCBCA0A0A08D8D8D767676800080800080800080555555800080 + 00008000806B94AD44C4F090EAFAA1EBF671D9F424BCF201A7E8039CDA2A6384 + 800080800080800080736154800080800080969696C3C3C3E4E4E4E6E6E6D5D5 + D5BBBBBBA8A8A89D9D9D6666668000808000808000805F5F5F80008000008000 + 806B94AD44C4F08DE4F4A1EBF670D7F224B9EE01A7E8039CDA2F688897806F91 + 7A6A887464800080800080800080969696C3C3C3DFDFDFE6E6E6D3D3D3B8B8B8 + A8A8A89D9D9D6B6B6B7D7D7D77777771717180008080008000008000806B9CAD + 3FBCE88EE4F5A1EBF670D7F224B9EE01A7E8039CDA306B8A8000808000808000 + 808000808000808000809B9B9BBBBBBBDFDFDFE6E6E6D3D3D3B8B8B8A8A8A89D + 9D9D6D6D6D80008080008080008080008080008000008000806B9CB53BB8E67E + E4FEA1EBF672D9F224B9EE01A7E8039CDA326D8D800080800080800080800080 + 8000808000809E9E9EB8B8B8E0E0E0E6E6E6D5D5D5B8B8B8A8A8A89D9D9D7070 + 708000808000808000808000808000800000800080739CB53BB8E67EE4FEA1EB + F66FD7F21FB7EE01A7E8039CDA346F8F80008080008080008080008080008080 + 00809E9E9EB8B8B8E0E0E0E6E6E6D3D3D3B6B6B6A8A8A89D9D9D727272800080 + 800080800080800080800080000080008073A5BD3BB8E67EE4FEA0EAF56ED6F2 + 1FB7EE01A7E8039CDA317092800080800080800080800080800080800080A6A6 + A6B8B8B8E0E0E0E5E5E5D2D2D2B6B6B6A8A8A89D9D9D73737380008080008080 + 0080800080800080000080008073A5BD58C9E78CECFFA0EAF5A6EDF894E7F871 + D9F63CBDE9437C97800080800080800080800080800080800080A6A6A6C5C5C5 + E7E7E7E5E5E5E8E8E8E2E2E2D6D6D6BCBCBC7D7D7D8000808000808000808000 + 8080008000008000806691A2A0DFEAC5F9FDC5F9FDC5F9FDC5F9FDC5F9FDA0DF + EA6691A2800080800080800080800080800080800080919191DBDBDBF4F4F4F4 + F4F4F4F4F4F4F4F4F4F4F4DBDBDB919191800080800080800080800080800080 + 0000800080B8D1DB84AFBF6FA2B46B9BAE6C9DAF6B9BAE6FA2B484AFBFB8D1DB + 800080800080800080800080800080800080D1D1D1AFAFAFA1A1A19B9B9B9D9D + 9D9B9B9BA1A1A1AFAFAFD1D1D180008080008080008080008080008000008000 + 8080008080008080008080008080008080008080008080008080008080008080 + 0080800080800080800080800080800080800080800080800080800080800080 + 8000808000808000808000808000808000808000808000800000} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = sbConnectClick + end + object sbDisconnect: TSpeedButton + Left = 102 + Top = 1 + Width = 100 + Height = 22 + Hint = 'Dsisconnect from database' + Caption = 'Disconnect' + Enabled = False + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + Glyph.Data = { + 9A050000424D9A0500000000000036000000280000001E0000000F0000000100 + 1800000000006405000000000000000000000000000000000000800080800080 + 800080800080800080800080800080AFBBF7800080800080800080CFCBE38000 + 80800080800080800080800080800080800080800080800080800080CBCBCB80 + 0080800080800080D2D2D2800080800080800080000080008080008080008080 + 0080800080800080CFCBE31140FD6178EE8000806176EA3154F2CFCBE3800080 + 800080800080800080800080800080800080800080D2D2D27373739898988000 + 809696967F7F7FD2D2D280008080008000008000808000808000808000808000 + 808000808000803157F90134FF214BF90134FF3155F480008080008080008080 + 00808000808000808000808000808000808000808383836B6B6B7A7A7A6B6B6B + 8080808000808000808000800000800080A2C8D864A8C0608D9F5D83964A768D + 346D8CFFFFFF1140FD0134FF113FFC800080800080800080800080800080C8C8 + C8A7A7A78D8D8D848484787878707070FFFFFF7373736B6B6B72727280008080 + 00808000808000800000800080638CA53FBCE884D5E8A1EBF673E4FFFFFFFF61 + 7CF60134FF0134FF0134FF6178EE8000808000808000808000808E8E8EBBBBBB + D1D1D1E6E6E6DFDFDFFFFFFF9D9D9D6B6B6B6B6B6B6B6B6B9898988000808000 + 8080008000008000806B94AD44C4F090EAFAA1EBF671D9F4BFC8F70134FF3158 + FBFFFFFF3157F91140FDBFC8F7800080800080800080969696C3C3C3E4E4E4E6 + E6E6D5D5D5D5D5D56B6B6B848484FFFFFF838383737373D5D5D5800080800080 + 00008000806B94AD44C4F08DE4F4A1EBF670D7F224B9EEAFBBF7FFFFFF2F6888 + 800080CFCBE3800080800080800080800080969696C3C3C3DFDFDFE6E6E6D3D3 + D3B8B8B8CBCBCBFFFFFF6B6B6B800080D2D2D280008080008080008000008000 + 806B9CAD3FBCE88EE4F5A1EBF670D7F224B9EE01A7E8039CDA306B8A80008080 + 00808000808000808000808000809B9B9BBBBBBBDFDFDFE6E6E6D3D3D3B8B8B8 + A8A8A89D9D9D6D6D6D80008080008080008080008080008000008000806B9CB5 + 3BB8E67EE4FEA1EBF672D9F224B9EE01A7E8039CDA326D8D8000808000808000 + 808000808000808000809E9E9EB8B8B8E0E0E0E6E6E6D5D5D5B8B8B8A8A8A89D + 9D9D7070708000808000808000808000808000800000800080739CB53BB8E67E + E4FEA1EBF66FD7F21FB7EE01A7E8039CDA346F8F800080800080800080800080 + 8000808000809E9E9EB8B8B8E0E0E0E6E6E6D3D3D3B6B6B6A8A8A89D9D9D7272 + 72800080800080800080800080800080000080008073A5BD3BB8E67EE4FEA0EA + F56ED6F21FB7EE01A7E8039CDA31709280008080008080008080008080008080 + 0080A6A6A6B8B8B8E0E0E0E5E5E5D2D2D2B6B6B6A8A8A89D9D9D737373800080 + 800080800080800080800080000080008073A5BD58C9E78CECFFA0EAF5A6EDF8 + 94E7F871D9F63CBDE9437C97800080800080800080800080800080800080A6A6 + A6C5C5C5E7E7E7E5E5E5E8E8E8E2E2E2D6D6D6BCBCBC7D7D7D80008080008080 + 008080008080008000008000806691A2A0DFEAC5F9FDC5F9FDC5F9FDC5F9FDC5 + F9FDA0DFEA6691A2800080800080800080800080800080800080919191DBDBDB + F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4DBDBDB9191918000808000808000808000 + 808000800000800080B8D1DB84AFBF6FA2B46B9BAE6C9DAF6B9BAE6FA2B484AF + BFB8D1DB800080800080800080800080800080800080D1D1D1AFAFAFA1A1A19B + 9B9B9D9D9D9B9B9BA1A1A1AFAFAFD1D1D1800080800080800080800080800080 + 0000800080800080800080800080800080800080800080800080800080800080 + 8000808000808000808000808000808000808000808000808000808000808000 + 808000808000808000808000808000808000808000808000808000800000} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = sbDisconnectClick + end + object btCreate: TSpeedButton + Left = 203 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Create database objects' + Caption = 'Create' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + Glyph.Data = { + 36060000424D3606000000000000360000002800000020000000100000000100 + 1800000000000006000000000000000000000000000000000000800080800080 + AC9584785E4B785E4B785E4B785E4B785E4B785E4B785E4B785E4B785E4B785E + 4B785E4B785E4B8000808000808000809292925B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B800080800080800080 + AC9584FEFCFCFAEEE8F8E9E2F7E5DCF5E0D6F4DCD0F3D7C9F2D2C4F1CFBFEFCB + B9EEC8B5785E4B800080800080800080929292FCFCFCEDEDEDE8E8E8E4E4E4DF + DFDFDBDBDBD5D5D5D1D1D1CDCDCDC9C9C9C6C6C65B5B5B800080800080800080 + AC9584FFFFFFFEFDFBFDF9F7FCF5F2FAF1ECF9EBE5F7E6DEF6E1D7F4DBCFF3D6 + C9F0CBB9785E4B800080800080800080929292FFFFFFFCFCFCF8F8F8F4F4F4F0 + F0F0EAEAEAE5E5E5E0E0E0DADADAD5D5D5C9C9C95B5B5B800080800080800080 + AD9786FFFFFFFFFFFFFEFDFBFEF9F7FCF5F29B9491020202F8E6DEF6E1D7F4DB + CFF0CEBD785E4B800080800080800080949494FFFFFFFFFFFFFCFCFCF8F8F8F4 + F4F4939393020202E5E5E5E0E0E0DADADACCCCCC5B5B5B800080800080800080 + AF9A89A8A6A3020202868381D8D6D6020202020202D6CCC8F9EBE50202020202 + 02A38D82785E4B800080800080800080979797A5A5A5020202828282D6D6D602 + 0202020202CBCBCBEAEAEA0202020202028C8C8C5B5B5B800080800080800080 + B29C8CD9D9D9FFFFFF020202020202FFFDFBD7D5D2020202D6CCC9020202F8E6 + DEF2D5C7785E4B800080800080800080999999D9D9D9FFFFFF020202020202FC + FCFCD4D4D4020202CCCCCC020202E5E5E5D3D3D35B5B5B800080800080800080 + B59F8FFFFFFF020202FFFFFF020202FFFFFFFEFCFC020202D6D0CE020202FAEC + E5F4D9CD785E4B8000808000808000809C9C9CFFFFFF020202FFFFFF020202FF + FFFFFCFCFC020202D0D0D0020202EBEBEBD8D8D85B5B5B800080800080800080 + B9A393020202D9D9D9FFFFFF020202D9D9D9FFFFFF020202D7D4D2020202FBF0 + EBF5DDD1785E4B800080800080800080A0A0A0020202D9D9D9FFFFFF020202D9 + D9D9FFFFFF020202D3D3D3020202EFEFEFDCDCDC5B5B5B800080800080800080 + BBA697D9D9D9020202020202D9D9D9020202020202B9B9B9FFFCFC020202FCF5 + F1F6E2D8785E4B800080800080800080A3A3A3D9D9D9020202020202D9D9D902 + 0202020202B9B9B9FCFCFC020202F4F4F4E1E1E15B5B5B8000808000802AAFDA + 44CBF06BE5FF3BBEE599D8DF91E1F681D0E9FFFFFFFFFFFFFFFFFFFEFCFBFDF9 + F7D9CBC0785E4B800080800080ADADADC7C7C7DFDFDFBBBBBBD3D3D3DEDEDECE + CECEFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8C9C9C95B5B5B80008080008052DAFB + 32B7DF7FE9FD5FC6E693F0FF31B6DFA0E8F9FFFFFFFFFFFFFFFFFFFFFFFFFEFC + FCD9CBC0785E4B800080800080D4D4D4B4B4B4E3E3E3C4C4C4EAEAEAB3B3B3E5 + E5E5FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCC9C9C95B5B5B8000808000807CEAFF + 93F1FFBFF8FFAFE8F4C7FBFF93F1FF9FF0FFFFFFFFFFFFFFFFFFFFFAF0EB785E + 4B785E4B785E4B800080800080E4E4E4EAEAEAF3F3F3E5E5E5F6F6F6EAEAEAEB + EBEBFFFFFFFFFFFFFFFFFFEFEFEF5B5B5B5B5B5B5B5B5B80008080008021AAD9 + 55BFE1AFE8F4F0FFFDB4EBF655BFE138BBE5FFFFFFFFFFFFFFFFFF967E6BF4DB + CED1BAAF785E4B800080800080A9A9A9BDBDBDE5E5E5FCFCFCE8E8E8BDBDBDB9 + B9B9FFFFFFFFFFFFFFFFFF7A7A7AD9D9D9B9B9B95B5B5B8000808000807CEAFF + 96F3FFC7FBFFADE5F3C3FBFF96F3FF8BD7E2FEFDFBFDFBF9FDF9F6967E6BD1BA + AFAC9584800080800080800080E4E4E4ECECECF6F6F6E3E3E3F6F6F6ECECECD1 + D1D1FCFCFCFAFAFAF8F8F87A7A7AB9B9B992929280008080008080008051D9FA + 33B8E08CF1FF5AC2E390F1FF30B6DF4BD2F4BBA696B9A293B69F8FB29C8BB099 + 88800080800080800080800080D3D3D3B5B5B5EAEAEAC0C0C0EAEAEAB3B3B3CD + CDCDA3A3A3A0A0A09C9C9C9999999696968000808000808000808000802AAFDA + 44CBF07CEAFF25AEDB72E8FF4CD4F52AAFDA8000808000808000808000808000 + 80800080800080800080800080ADADADC7C7C7E4E4E4ACACACE1E1E1CECECEAD + ADAD800080800080800080800080800080800080800080800080} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btScriptClick + end + object btDrop: TSpeedButton + Left = 289 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Drop database objects' + Caption = 'Drop' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + Glyph.Data = { + 36060000424D3606000000000000360000002800000020000000100000000100 + 1800000000000006000000000000000000000000000000000000800080800080 + A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A + 77A37A779063608000808000808000807D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D + 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D676767800080800080800080 + A67E78FFE8D2FFE8D2FFE8D1FFE6CEFFE3C5FFDEBDFFDDBAFFD8B2FFD6AEFFD2 + A5FFD2A3936662800080800080800080808080E3E3E3E3E3E3E3E3E3E1E1E1DD + DDDDD7D7D7D6D6D6D0D0D0CECECEC9C9C9C8C8C8696969800080800080800080 + AB817AFFE8D2FFE8D2FFE6CEFFE3C6FFE1C2FFDDBBFFDAB6FFD7B0FFD4A9FFD2 + A4FFD2A3966965800080800080800080838383E3E3E3E3E3E3E1E1E1DDDDDDDB + DBDBD6D6D6D3D3D3CFCFCFCBCBCBC9C9C9C8C8C86C6C6C800080800080800080 + B0837CFFECD9FFECD9FFE8D2FFE6CEFFE3C6FFE1C2FFDDBBFFD9B4FFD7B0FFD4 + A9FFD4A99A6C67800080800080800080858585E8E8E8E8E8E8E3E3E3E1E1E1DD + DDDDDBDBDBD6D6D6D2D2D2CFCFCFCBCBCBCBCBCB6F6F6F800080800080800080 + B6897FFFEEDDFFEEDDFFECD9DFD1D8FFE6CEFFE3C6FFE1C2EFD2BFFFD9B4FFD7 + B0FFD7B09E6F698000808000808000808A8A8AEAEAEAEAEAEAE8E8E8D4D4D4E1 + E1E1DDDDDDDBDBDBCFCFCFD2D2D2CFCFCFCFCFCF727272800080800080800080 + BC8E81FFF2E4FFF2E4CFCBE31342FD637AEEFFE6CE6378EA3356F2EFD2BFFFD9 + B4FFD9B4A2726B8000808000808000808F8F8FEFEFEFEFEFEFD2D2D27474749A + 9A9AE1E1E1979797808080CFCFCFD2D2D2D2D2D2757575800080800080800080 + C39581FFF4E8FFF4E8EFE6E63359F90336FF234DF90336FF3357F4EFD6C5FFDD + BBFFDDBBA5766D800080800080800080949494F1F1F1F1F1F1E6E6E68484846C + 6C6C7B7B7B6C6C6C828282D3D3D3D6D6D6D6D6D6787878800080800080800080 + CA9B84FFF7F0FFF7F0FFF4E8EFE6E61342FD0336FF1341FCEFDBD0FFE3C6FFE0 + C1FFE1C2A8796F800080800080800080999999F5F5F5F5F5F5F1F1F1E6E6E674 + 74746C6C6C747474D9D9D9DDDDDDDADADADBDBDB7B7B7B800080800080800080 + D2A187FFF9F4FFF9F4FFF7F0637EF60336FF0336FF0336FF637AEEFFE6CEFFE3 + C6FFE3C6AC7C718000808000808000809E9E9EF8F8F8F8F8F8F5F5F59F9F9F6C + 6C6C6C6C6C6C6C6C9A9A9AE1E1E1DDDDDDDDDDDD7D7D7D800080800080800080 + D9A88AFFFDFBFFFDFBBFC8F70336FF335AFBDFDAE73359F91342FDDFD1D8FFE6 + CEFFE6CEAE7E74800080800080800080A4A4A4FCFCFCFCFCFCD5D5D56C6C6C86 + 8686DEDEDE848484747474D4D4D4E1E1E1E1E1E1808080800080800080800080 + DFAE8CFFFFFFFFFFFFFFFDFBAFBBF7EFEBF0FFF4E8EFE6E6CFCBE3FFECD9FFC8 + C2FFB0B0B08075800080800080800080A9A9A9FFFFFFFFFFFFFCFCFCCBCBCBEC + ECECF1F1F1E6E6E6D2D2D2E8E8E8CCCCCCB8B8B8818181800080800080800080 + E5B38FFDFDFDFDFDFDFFFFFFFFFFFFFFFFFEFFFAF6FFF9F3FFF5EAF4DECEB281 + 76B28176B28176800080800080800080ADADADFCFCFCFCFCFCFFFFFFFFFFFFFE + FEFEF9F9F9F7F7F7F2F2F2DBDBDB838383838383838383800080800080800080 + EAB891FEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFEFFFAF6FFF9F3F5E1D2B281 + 76EDA757D2AA95800080800080800080B1B1B1FEFEFEFEFEFEFFFFFFFFFFFFFF + FFFFFEFEFEF9F9F9F7F7F7DEDEDE838383969696A8A8A8800080800080800080 + EFBC92FFFFFFFFFFFFFCFCFCFAFAFAF7F7F7F5F5F5F2F1F1F0EDEAE9DAD0B281 + 76D9B198800080800080800080800080B5B5B5FFFFFFFFFFFFFBFBFBFAFAFAF7 + F7F7F5F5F5F1F1F1ECECECD8D8D8838383ADADAD800080800080800080800080 + F2BF94DCA987DCA987DCA987DCA987DCA987DCA987DCA987DCA987DCA987B281 + 76800080800080800080800080800080B7B7B7A4A4A4A4A4A4A4A4A4A4A4A4A4 + A4A4A4A4A4A4A4A4A4A4A4A4A4A4838383800080800080800080800080800080 + 8000808000808000808000808000808000808000808000808000808000808000 + 8080008080008080008080008080008080008080008080008080008080008080 + 0080800080800080800080800080800080800080800080800080} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btScriptClick + end + end + object cbDebug: TCheckBox + Left = 871 + Top = 8 + Width = 68 + Height = 13 + Hint = 'Set Debug property for connection and query components' + Caption = 'Debug' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + TabOrder = 1 + OnClick = cbDebugClick + end + object pnShowSource: TPanel + Left = 440 + Top = 1 + Width = 259 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 2 + object sbDemo: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Show demo' + GroupIndex = 1 + Down = True + Caption = 'Demo' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = sbDemoClick + end + object sbSource: TSpeedButton + Left = 87 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Show demo source code' + GroupIndex = 1 + Caption = 'Demo source' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = sbSourceClick + end + object sbFormText: TSpeedButton + Left = 173 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Show demo form as text' + GroupIndex = 1 + Caption = 'Form as text' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = sbFormTextClick + end + end + object pnOpenDemoDir: TPanel + Left = 720 + Top = 1 + Width = 138 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 3 + object sbOpenDemoDir: TSpeedButton + Left = 1 + Top = 1 + Width = 136 + Height = 22 + Hint = 'Open folder containing the demo source files' + Caption = 'Open demo folder' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 1800000000000003000000000000000000000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF728890628190627A81527281526272425A62424A5232 + 3A42223232222232121A22121212121222FFFFFFFFFFFFFFFFFF72889090A0B0 + 72B0D00290D00290D00290D00290C01288C01281B01281B0227AA0227290224A + 62FFFFFFFFFFFFFFFFFF81889081C0D090A8B081E0FF62D0FF52C8FF52C8FF42 + C0F032B0F032A8F022A0E01290D0226A815B6369FFFFFFFFFFFF8190A081D0F0 + 90A8B090C0D072D8FF62D0FF62D0FF52C8FF52C0FF42B8F032B0F032A8F01288 + D0224A62FFFFFFFFFFFF8190A081D8F081C8E090A8B081E0FF72D0FF62D8FF62 + D0FF62D0FF52C8FF42C0F042B8F032B0F0226A816C8B9AFFFFFF8198A090E0F0 + 90E0FF90A8B090B8C072D8FF62D8FF62D8FF62D8FF62D0FF52D0FF52C8FF42B8 + F032A0E04B6979FFFFFF8198A090E0F0A0E8FF81C8E090A8B081E0FF81E0FF81 + E0FF81E0FF81E0FF81E0FF81E0FF72D8FF72D8FF52A8D087929D90A0A0A0E8F0 + A0E8FFA0E8FF90B0C090B0C090A8B090A8B081A0B081A0B08198A08198A08190 + A08190A081889072889090A0B0A0E8F0A0F0FFA0E8FFA0E8FF81D8FF62D8FF62 + D8FF62D8FF62D8FF62D8FF62D8FF728890FFFFFFFFFFFFFFFFFF90A0B0A0F0F0 + B0F0F0A0F0FFA0E8FFA0E8FF72D8FF90A0A08198A08198A08190A08190907288 + 90FFFFFFFFFFFFFFFFFF90A8B0A0D0E0B0F0F0B0F0F0A0F0FFA0E8FF90A0B0B3 + C9CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF906A52906A52906A52CDD6DA90A8B0 + 90A8B090A8B090A8B090A8B0B6C5CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFD2C7C6906A52906A52FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFF907A62C8BAB3FFFFFFFFFFFFA09081D2CDC7907A62FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D3A09081A08881B098 + 81C5BEB7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentFont = False + Transparent = False + OnClick = sbOpenDemoDirClick + end + end + end + object ImageList1: TImageList + Height = 17 + Left = 616 + Top = 8 + end + object BackHistoryPopup: TPopupMenu + OnPopup = BackHistoryPopupPopup + Left = 8 + Top = 133 + end + object ForwardHistoryPopup: TPopupMenu + OnPopup = ForwardHistoryPopupPopup + Left = 40 + Top = 133 + end + object ilButtons: TImageList + Left = 88 + Top = 141 + Bitmap = { + 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C0D0 + C9007DAC86002C7D31000269090002640700005E0400206323006D967200C3CF + CB0000000000000000000000000000000000000000000000000000000000C0D0 + C9007DAC86002C7D31000269090002640700005E0400206323006D967200C3CF + CB00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000AEC7B600328C + 36000C98220011B62F000DB4250009B21C0006B0160001AE0B00009107001065 + 1400B4C6BB000000000000000000000000000000000000000000AEC7B600328C + 36000C98220011B62F000DB4250009B21C0006B0160001AE0B00009107001065 + 1400B4C6BB000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B0C9B800178C23001CB6 + 45001BBA440017B83A0012B630003CC352001AB72D0008B21B0004AF110000AD + 090000670500B6C7BD00000000000000000000000000B0C9B800178C23001CB6 + 45001BBA440017B83A005DCD720079D588000BB3210008B21B0004AF110000AD + 090000670500B6C7BD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000CCDDD30043A4480023B7530024BE + 580021BD51001CBA45006FD38800FFFFFF00B5E8BE000EB426000AB21D0007B1 + 180002AE0D0010691400C9D5D00000000000CCDDD30043A4480023B7530024BE + 580021BD51001CBA4500D4F2DC00FFFFFF00A6E4B1000EB426000AB21D0007B1 + 180002AE0D0010691400C9D5D000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000009CCEA10017A437002EC26B002CC1 + 660025BF5A0076D69500FFFFFF00FFFFFF009AE0AB0013B6310011B62E000BB3 + 210009B21C00078E120086A88B00000000009CCEA10017A437002EC26B002CC1 + 660025BF5A001CBB470075D69400FFFFFF00FFFFFF00A6E4B10011B62E000BB3 + 210009B21C00078E120086A88B00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040B1410028BB5E002EC26B002EC2 + 6B007CD9A100FFFFFF00FFFFFF00ACE6BF001CBB47001ABA430015B8380012B6 + 30000FB52A000AB21D00227A27000000000040B1410028BB5E002EC26B002EC2 + 6B001CBB47001CBB470025BE590076D69700FFFFFF00FFFFFF00A6E4B10014B7 + 34000FB52A000AB21D00227A2700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040B141002EC26B002EC26B007CD9 + A300FFFFFF00FFFFFF00F1FBF50092DFAC0092DFAC008EDDA3008DDDA2008BDC + 9D0014B7340011B62F00057710000000000040B141002EC26B0062D19000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A8E5 + B60014B7340011B62F0005771000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040B841002EC26B0048CA7E00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF001BBA440017B83A00097E14000000000040B841002EC26B0062D19000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D5F3 + DE001BBA440017B83A00097E1400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040BB410033C36E002EC26B007CD9 + A300FFFFFF00FFFFFF00FFFFFF00A4E4BE0097E1B50097E1B50095E0B10092DF + AC0021BD51001CBA4500077F13000000000040BB410033C36E002EC26B002EC2 + 6B002EC26B002EC26B002EC26B0089DDAC00FFFFFF00FFFFFF00D7F3E2002EC2 + 6B0021BD51001CBA4500077F1300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040BB410044C665003FC776002EC2 + 6B007CD9A300FFFFFF00FFFFFF00D8F4E3003BC674002EC26B002EC26B002CC1 + 660025BF5A0023BE5700238B2C000000000040BB410044C665003FC776002EC2 + 6B002EC26B002EC26B0055CD8700F2FBF600FFFFFF00D8F4E3002EC26B002CC1 + 660025BF5A0023BE5700238B2C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000A2D7A50031BE3C0072D5950052CC + 820035C470007CD9A300FFFFFF00FFFFFF00A4E4BE002EC26B002EC26B002EC2 + 6B002DC26A0033963B009EC8A40000000000A2D7A50031BE3C0072D5950052CC + 820035C470002EC26B00BEECD100FFFFFF00D8F4E3002EC26B002EC26B002EC2 + 6B002DC26A001AA73E009EC8A400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000D7E7DC0040C2400075D6830082DA + A00066D28E0044C879007FDAA400F2FBF60089DDAC002EC26B002EC26B002EC2 + 6B002BBF640023962900C3E2C70000000000D7E7DC0040BB410075D6830082DA + A00066D28E002EC26B002EC26B0097E1B5002EC26B002EC26B002EC26B002EC2 + 6B002BBF640023962900C3E2C700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000C9E3CD0040C2400077D7 + 800098E0AD0076D798005ACE86003AC573002EC26B002EC26B002EC26B0028BD + 5E00189E2600C9E4CD00000000000000000000000000C9E3CD0040BB410077D7 + 800098E0AD0076D798005ACE86003AC573002EC26B002EC26B002EC26B0028BD + 5E00189E2600C9E4CD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000CAE4CE0040C2 + 400047CB490084DA91008CDCA6006AD391004ECB7F002DBF610017B1360043B5 + 4700CAE5CE000000000000000000000000000000000000000000CAE4CE0040BB + 410047CB490084DA91008CDCA6006AD391004ECB7F002DBF610017B1360043B5 + 4700CAE5CE000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DBE9 + DF009AD99D0040C2400040C2400040C2400040C2400040C240009AD99D00DBEA + DE0000000000000000000000000000000000000000000000000000000000DBE9 + DF009AD99D0040C2400040C2400040C2400040C2400040C240009AD99D00DBEA + DE00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00FFFFFFFF00000000E00FE00F00000000 + C007C00700000000800380030000000000010001000000000001000100000000 + 0001000100000000000100010000000000010001000000000001000100000000 + 0001000100000000000100010000000000010001000000008003800300000000 + C007C00700000000E00FE00F0000000000000000000000000000000000000000 + 000000000000} + end + object ilDisabledButtons: TImageList + Left = 120 + Top = 141 + Bitmap = { + 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CCCC + CC009B9B9B005D5D5D00404040003D3D3D00383838004848480086868600CCCC + CC0000000000000000000000000000000000000000000000000000000000CCCC + CC009B9B9B005D5D5D00404040003D3D3D00383838004848480086868600CCCC + CC00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF006868 + 6800656565007B7B7B0076767600727272006F6F6F006A6A6A00575757004343 + 4300C0C0C0000000000000000000000000000000000000000000BFBFBF006868 + 6800656565007B7B7B0076767600727272006F6F6F006A6A6A00575757004343 + 4300C0C0C0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000C1C1C1005F5F5F008383 + 830085858500808080007B7B7B00929292007C7C7C00727272006C6C6C006868 + 68003E3E3E00C2C2C200000000000000000000000000C1C1C1005F5F5F008383 + 83008585850080808000A5A5A500B3B3B30074747400727272006C6C6C006868 + 68003E3E3E00C2C2C20000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000D8D8D8007D7D7D00888888008E8E + 8E008B8B8B0085858500B1B1B100FFFFFF00D5D5D50077777700727272007070 + 70006A6A6A0045454500D2D2D20000000000D8D8D8007D7D7D00888888008E8E + 8E008B8B8B0085858500E8E8E800FFFFFF00CDCDCD0077777700727272007070 + 70006A6A6A0045454500D2D2D200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000BBBBBB0073737300979797009595 + 95008F8F8F00B7B7B700FFFFFF00FFFFFF00C8C8C8007C7C7C007B7B7B007474 + 740072727200595959009B9B9B0000000000BBBBBB0073737300979797009595 + 95008F8F8F0086868600B7B7B700FFFFFF00FFFFFF00CDCDCD007B7B7B007474 + 740072727200595959009B9B9B00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000828282008E8E8E00979797009797 + 9700BDBDBD00FFFFFF00FFFFFF00D3D3D30086868600848484007F7F7F007B7B + 7B0079797900727272005757570000000000828282008E8E8E00979797009797 + 970086868600868686008E8E8E00B8B8B800FFFFFF00FFFFFF00CDCDCD007D7D + 7D00797979007272720057575700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000828282009797970097979700BEBE + BE00FFFFFF00FFFFFF00F8F8F800C7C7C700C7C7C700C2C2C200C2C2C200C0C0 + C0007D7D7D007B7B7B004B4B4B00000000008282820097979700B1B1B100FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D0D0 + D0007D7D7D007B7B7B004B4B4B00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008787870097979700A4A4A400FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00858585008080800051515100000000008787870097979700B1B1B100FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E9E9 + E900858585008080800051515100000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000888888009999990097979700BEBE + BE00FFFFFF00FFFFFF00FFFFFF00D1D1D100CBCBCB00CBCBCB00C9C9C900C7C7 + C7008B8B8B008585850051515100000000008888880099999900979797009797 + 9700979797009797970097979700C5C5C500FFFFFF00FFFFFF00EAEAEA009797 + 97008B8B8B008585850051515100000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000888888009A9A9A009F9F9F009797 + 9700BEBEBE00FFFFFF00FFFFFF00EBEBEB009E9E9E0097979700979797009595 + 95008F8F8F008E8E8E006363630000000000888888009A9A9A009F9F9F009797 + 97009797970097979700AAAAAA00F8F8F800FFFFFF00EBEBEB00979797009595 + 95008F8F8F008E8E8E0063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000C2C2C20087878700B6B6B600A8A8 + A8009B9B9B00BEBEBE00FFFFFF00FFFFFF00D1D1D10097979700979797009797 + 9700979797006F6F6F00B8B8B80000000000C2C2C20087878700B6B6B600A8A8 + A8009B9B9B0097979700DEDEDE00FFFFFF00EBEBEB0097979700979797009797 + 97009797970077777700B8B8B800000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000E1E1E1008C8C8C00B2B2B200BEBE + BE00B1B1B100A1A1A100BFBFBF00F8F8F800C5C5C50097979700979797009797 + 97009393930068686800D6D6D60000000000E1E1E10088888800B2B2B200BEBE + BE00B1B1B1009797970097979700CBCBCB009797970097979700979797009797 + 97009393930068686800D6D6D600000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D9D9D9008C8C8C00B2B2 + B200C8C8C800B9B9B900ABABAB009D9D9D009797970097979700979797009090 + 90006B6B6B00DADADA00000000000000000000000000D9D9D90088888800B2B2 + B200C8C8C800B9B9B900ABABAB009D9D9D009797970097979700979797009090 + 90006B6B6B00DADADA0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000DADADA008C8C + 8C0095959500BABABA00C3C3C300B3B3B300A6A6A600929292007B7B7B008787 + 8700DBDBDB000000000000000000000000000000000000000000DADADA008888 + 880095959500BABABA00C3C3C300B3B3B300A6A6A600929292007B7B7B008787 + 8700DBDBDB000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E4E4 + E400C0C0C0008C8C8C008C8C8C008C8C8C008C8C8C008C8C8C00C0C0C000E4E4 + E40000000000000000000000000000000000000000000000000000000000E4E4 + E400C0C0C0008C8C8C008C8C8C008C8C8C008C8C8C008C8C8C00C0C0C000E4E4 + E400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00FFFFFFFF00000000E00FE00F00000000 + C007C00700000000800380030000000000010001000000000001000100000000 + 0001000100000000000100010000000000010001000000000001000100000000 + 0001000100000000000100010000000000010001000000008003800300000000 + C007C00700000000E00FE00F0000000000000000000000000000000000000000 + 000000000000} + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.pas new file mode 100644 index 0000000..95bbae7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.pas @@ -0,0 +1,667 @@ +{$I DacDemo.inc} + +unit DemoForm; + +interface + +uses +{$IFNDEF WIN32} + Types, +{$ENDIF} + SysUtils, Classes, DB, +{$IFDEF LINUX} + QControls, QStdCtrls, QComCtrls, QGraphics, QMenus, QTypes, QImgList, QForms, + QButtons, QExtCtrls, Qt, QDialogs, +{$ELSE} + Windows, Forms, Messages, Controls, StdCtrls, + Graphics, ImgList, ToolWin, + ComCtrls, Dialogs, ExtCtrls, Tabs, Menus, DBCtrls, Buttons, ShellAPI, +{$IFNDEF VER130} + Variants, +{$ENDIF} +{$ENDIF} +{$IFDEF CLR} + System.ComponentModel, +{$ENDIF} + DBAccess, + DAScript, + DemoBase, + DemoFrame, + CategoryFrame + {$IFDEF XPMAN}, UxTheme{$ENDIF} + {$IFDEF USE_SYNEDIT}, SynMemo, SynEdit, SynEditHighlighter, SynHighlighterPas{$ENDIF} + ; +const + MAX_HISTORY_SIZE = 6; + +type + TDemoForm = class(TForm) + StatusBar: TStatusBar; + ImageList1: TImageList; + PanelUnderTree: TPanel; + TreeView: TTreeView; + MainPanel: TPanel; + Shape1: TShape; + TVSplitter: TSplitter; + pnTopLabel: TPanel; + lbTitle: TLabel; + lbAbout: TLabel; + Panel2: TPanel; + Panel1: TPanel; + sbConnect: TSpeedButton; + sbDisconnect: TSpeedButton; + btCreate: TSpeedButton; + btDrop: TSpeedButton; + cbDebug: TCheckBox; + pnSource: TPanel; + pnDemo: TPanel; + sbDemo: TSpeedButton; + pnShowSource: TPanel; + ToolBar: TToolBar; + tbBrowseBack: TToolButton; + tbBrowseForward: TToolButton; + BackHistoryPopup: TPopupMenu; + ForwardHistoryPopup: TPopupMenu; + ilButtons: TImageList; + ilDisabledButtons: TImageList; + sbSource: TSpeedButton; + sbFormText: TSpeedButton; + pnOpenDemoDir: TPanel; + sbOpenDemoDir: TSpeedButton; + + procedure FormCreate(Sender: TObject); virtual; + procedure TreeViewChange(Sender: TObject; Node: TTreeNode); + procedure TreeViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure TreeViewClick(Sender: TObject); + procedure TreeViewMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure TVSplitterMoved(Sender: TObject); + procedure TVSplitterCanResize(Sender: TObject; var NewSize: Integer; + var Accept: Boolean); + procedure lbAboutClick(Sender: TObject); virtual; + procedure lbAboutMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbTitleMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure cbDebugClick(Sender: TObject); + procedure sbOpenDemoDirClick(Sender: TObject); + procedure sbConnectClick(Sender: TObject); + procedure sbDisconnectClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure HistoryItemClick(Sender: TObject); + procedure sbDemoClick(Sender: TObject); + procedure FormResize(Sender: TObject); + procedure BackHistoryPopupPopup(Sender: TObject); + procedure ForwardHistoryPopupPopup(Sender: TObject); + procedure tbBrowseBackClick(Sender: TObject); + procedure tbBrowseForwardClick(Sender: TObject); + procedure btScriptClick(Sender: TObject); + procedure OnScriptError(Sender: TObject; E: Exception; SQL: String; + var Action: TErrorAction); + procedure sbSourceClick(Sender: TObject); + procedure sbFormTextClick(Sender: TObject); + protected + Demos: TDemos; + ActiveNode: TTreeNode; + //History + History: Array of integer; //Absolute indexes in TreeView + HistoryIndex: integer; //Current History index + HistoryEnd: integer; + IgnoreScriptErrors: boolean; + DropScriptActive: boolean; + DemoSourceLoaded, FormSourceLoaded: boolean; + + //Product customization + function GetConnection: TCustomDAConnection; virtual; abstract; //This function should return DAC product specific connection (i.e. OraSession, MyConnection) + function ApplicationTitle: string; virtual; abstract; //This function should return DAC product specific title + function ProductName: string; virtual; abstract; ////This function should return product name + procedure RegisterDemos; virtual; abstract; //This procedure should regiter DAC product specific demos + //XP manifest + {$IFDEF XPMAN} + procedure ReplaceFlatStyle(Control: TWinControl; Flat: boolean); + {$ENDIF} + //Demo selection + procedure InitializeDemoFrame(Frame: TDemoFrame; DemoType: TDemoType); virtual; + procedure UpdateDemo; + procedure ShowDemo; + procedure ShowDemoSource; + procedure ShowFormSource; + {$IFNDEF WIN32} + procedure OnNavigate(DemoDescription: string); + {$ELSE} + procedure OnNavigate(Index: integer); + {$ENDIF} + //History + procedure SelectDemo; + procedure NavigateHistory(Offset: integer); + procedure GetBackHistory(BackList: TStrings); + procedure GetForwardHistory(ForwardList: TStrings); + procedure DisableBrowse(Back, Forward: boolean); + procedure FillHistoryPopup(BackHistory: boolean); + //Connection + procedure AfterConnect(Sender: TObject); + procedure AfterDisconnect(Sender: TObject); + public +{$IFDEF USE_SYNEDIT} + SourceBrowser: TSynMemo; +{$ELSE} + SourceBrowser: TMemo; +{$ENDIF} + function GetIsXPMan: boolean; + function ProductColor: TColor; virtual; abstract; //This function should return DAC product specific color + procedure ExecCreateScript; virtual; abstract; + procedure ExecDropScript; virtual; abstract; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFDEF XPMAN} + {$R WindowsXP.res} +{$ENDIF} + +procedure TDemoForm.FormCreate(Sender: TObject); +begin + SetLength(History, MAX_HISTORY_SIZE); + HistoryIndex := -1; + Demos := TDemos.Create(TreeView.Items); + RegisterDemos; +{$IFDEF XPMAN} + if GetIsXPMan then begin + ReplaceFlatStyle(Self, False); + pnTopLabel.Color := ProductColor; + end; +{$ENDIF} + +{$IFDEF USE_SYNEDIT} + SourceBrowser := TSynMemo.Create(pnSource); + + SourceBrowser.Highlighter := TSynPasSyn.Create(SourceBrowser); + SourceBrowser.Options := [eoAltSetsColumnMode, eoAutoIndent, eoAutoSizeMaxScrollWidth, eoDisableScrollArrows, eoDragDropEditing, eoDropFiles, eoEnhanceEndKey, eoGroupUndo, eoHideShowScrollbars, eoKeepCaretX, eoShowScrollHint, eoSmartTabDelete, eoSmartTabs, eoTabIndent, eoTabsToSpaces]; + with SourceBrowser.Gutter do begin + Visible := True; + AutoSize := True; + DigitCount := 3; + LeftOffset := 0; + RightOffset := 0; + ShowLineNumbers := True; + Width := 1; + end; +{$ELSE} + SourceBrowser := TMemo.Create(pnSource); + SourceBrowser.ScrollBars := ssVertical; + SourceBrowser.Font.Name := 'Courier New'; + SourceBrowser.Font.Size := 10; +{$ENDIF} + with SourceBrowser do begin + Parent := pnSource; + Align := alClient; + ReadOnly := True; + end; + Resize; + TreeView.Items[0].Expand(True); + TreeView.Items[0].Selected := True; + with GetConnection do begin + AfterConnect := Self.AfterConnect; + AfterDisconnect := Self.AfterDisconnect; + end; + SelectDemo; +end; + +procedure TDemoForm.FormDestroy(Sender: TObject); +begin + with GetConnection do begin + AfterConnect := nil; + AfterDisconnect := nil; + end; + SetLength(History, 0); + Demos.Free; +end; + +//TreeView routines +procedure TDemoForm.TreeViewChange(Sender: TObject; Node: TTreeNode); +begin + if (TreeView.Selected.Data <> nil) then + StatusBar.Panels[0].Text := TDemo(TreeView.Selected.Data).Hint + else + StatusBar.Panels[0].Text := TreeView.Selected.Text; + StatusBar.Repaint; +end; + +procedure TDemoForm.TreeViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + if Key = {$IFDEF LINUX}4100{$ELSE}13{$ENDIF} then + SelectDemo; +end; + +procedure TDemoForm.TreeViewClick(Sender: TObject); +begin + SelectDemo; +end; + +//TreeView Hints +procedure TDemoForm.TreeViewMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +var + Node: TTreeNode; +begin + Node := TreeView.GetNodeAt(X, Y); + if (Node <> nil) and (Node.Data <> nil) then + TreeView.Hint := TDemo(Node.Data).Hint + else + TreeView.Hint := ''; +end; + +//Sizing constraints +procedure TDemoForm.TVSplitterMoved(Sender: TObject); +begin + if PanelUnderTree.ClientWidth = 0 then + PanelUnderTree.ClientWidth := 150; +end; + +procedure TDemoForm.TVSplitterCanResize(Sender: TObject; + var NewSize: Integer; var Accept: Boolean); +begin + Accept := (NewSize >= PanelUnderTree.Constraints.MinWidth) and + ((ClientWidth - MainPanel.Constraints.MinWidth - NewSize) > 0); +end; + +function TDemoForm.GetIsXPMan: boolean; +begin + Result := {$IFDEF XPMAN}UseThemes; {$ELSE} False;{$ENDIF} +end; + +{$IFDEF XPMAN} +procedure TDemoForm.ReplaceFlatStyle(Control: TWinControl; Flat: boolean); +var + i: integer; +begin + for i := 0 to Control.ControlCount - 1 do + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := Flat + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := Flat + else + if Control.Controls[i] is TWinControl then begin + if Control.Controls[i] is TPanel then begin + TPanel(Control.Controls[i]).ParentBackground := False; + TPanel(Control.Controls[i]).Color := clBtnFace; + end; + ReplaceFlatStyle(TWinControl(Control.Controls[i]), Flat); + end; +end; +{$ENDIF} + +//Demo Change +procedure TDemoForm.InitializeDemoFrame(Frame: TDemoFrame; DemoType: TDemoType); +begin + Frame.Connection := GetConnection; + Frame.SetDebug(cbDebug.Checked); + Frame.Parent := pnDemo; + if DemoType = dtCategory then //Attach browser event handlers + TCategoryFrame(Frame).OnNavigate := OnNavigate; +{$IFDEF XPMAN} + if GetIsXPMan then + ReplaceFlatStyle(Frame, False); +{$ENDIF} + Frame.Initialize; +end; + +procedure TDemoForm.UpdateDemo; +var + i: integer; +begin + for i := 1 to StatusBar.Panels.Count - 1 do + StatusBar.Panels[i].Text := ''; + ActiveNode := TreeView.Selected; + if (ActiveNode <> nil) then + with Demos.SelectDemo(ActiveNode.AbsoluteIndex) do begin + InitializeDemoFrame(Frame, DemoType); + DemoSourceLoaded := False; + FormSourceLoaded := False; + if DemoType = dtCategory then begin + pnShowSource.Visible := False; + pnOpenDemoDir.Visible := False; + ShowDemo; + end + else begin + pnShowSource.Visible := True; + {$IFNDEF LINUX} + pnOpenDemoDir.Visible := True; + {$ELSE} + pnOpenDemoDir.Visible := False; + {$ENDIF} + if sbDemo.Down then + ShowDemo + else + if sbSource.Down then + ShowDemoSource + else + ShowFormSource; + end; + Self.Caption := ApplicationTitle + ' - ' + Name; + Application.Title := ApplicationTitle; + end; + StatusBar.Repaint; +end; + +procedure TDemoForm.ShowDemo; +begin + pnSource.Visible := False; + pnDemo.Visible := True; +end; + +procedure TDemoForm.ShowDemoSource; +begin + if not DemoSourceLoaded then begin + Demos.SelectedDemo.LoadDemoCode(SourceBrowser.Lines); + DemoSourceLoaded := True; + FormSourceLoaded := False; + end; + pnSource.Visible := True; + pnDemo.Visible := False; +end; + +procedure TDemoForm.ShowFormSource; +begin + if not FormSourceLoaded then begin + Demos.SelectedDemo.LoadFormCode(SourceBrowser.Lines); + FormSourceLoaded := True; + DemoSourceLoaded := False; + end; + pnSource.Visible := True; + pnDemo.Visible := False; +end; + +//User control +procedure TDemoForm.sbOpenDemoDirClick(Sender: TObject); +begin + Demos.SelectedDemo.OpenDemoFolder; +end; + +procedure TDemoForm.cbDebugClick(Sender: TObject); +begin + Demos.SelectedDemo.Frame.SetDebug(cbDebug.Checked); +end; + +{$IFNDEF WIN32} +procedure TDemoForm.OnNavigate(DemoDescription: string); +var + Node: TTreeNode; + DemoName, CategoryName, FolderName: string; + ListBox: TListBox; + i: integer; +begin + Node := TreeView.Items.GetFirstNode; + DemoName := Trim(Copy(DemoDescription, 1, pos('-', DemoDescription) - 1)); + while Node <> nil do begin + if TDemo(Node.Data).Name = DemoName then begin + TreeView.Selected := Node; + SelectDemo; + break; + end; + Node := Node.GetNext; + end; + // Demo was not found in the tree. This is supplementary demo. + + if (Demos.SelectedDemo.DemoType = dtCategory) and (DemoName <> '') then begin + ListBox := TCategoryFrame(Demos.SelectedDemo.Frame).DemosDescription; + for i := ListBox.ItemIndex downto 0 do + if (ListBox.Items[i] <> '') and (ListBox.Items[i][1] = ' ') then begin + CategoryName := Trim(ListBox.Items[i]); + Break; + end; + end; +{$IFNDEF LINUX} + FolderName := ExtractFilePath(ExtractFileDir(Application.ExeName)) + CategoryName + '\' + DemoName; + ShellExecute(0, 'open', FolderName, '', '.', SW_SHOW); +{$ENDIF} +end; + +{$ELSE} +procedure TDemoForm.OnNavigate(Index: integer); +begin + TreeView.Items[Index].Selected := True; + SelectDemo; +end; +{$ENDIF} + +procedure TDemoForm.lbAboutClick(Sender: TObject); +begin + lbAbout.Font.Color := $FFFFFF; + lbAbout.Cursor := crDefault; +end; + +//About highlite +procedure TDemoForm.lbAboutMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbAbout.Font.Color := TColor($FF00001A); //clHotLight + lbAbout.Cursor := crHandPoint; +end; + +procedure TDemoForm.lbTitleMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbAbout.Font.Color := $FFFFFF; + lbAbout.Cursor := crDefault; +end; + +procedure TDemoForm.sbConnectClick(Sender: TObject); +begin + GetConnection.Connect; +end; + +procedure TDemoForm.sbDisconnectClick(Sender: TObject); +begin + GetConnection.Disconnect; +end; + +procedure TDemoForm.AfterConnect(Sender: TObject); +begin + sbDisconnect.Enabled := True; + sbConnect.Enabled := False; +end; + +procedure TDemoForm.AfterDisconnect(Sender: TObject); +begin + sbDisconnect.Enabled := False; + sbConnect.Enabled := True; +end; + +//History +procedure TDemoForm.SelectDemo; +var + i: integer; +begin + if TreeView.Selected = ActiveNode then //Same demo selected + Exit; + UpdateDemo; + if HistoryIndex = (MAX_HISTORY_SIZE - 1) then + for i := 0 to MAX_HISTORY_SIZE - 2 do + History[i] := History[i + 1] + else + Inc(HistoryIndex); + History[HistoryIndex] := ActiveNode.AbsoluteIndex; + HistoryEnd := HistoryIndex; + DisableBrowse(HistoryIndex = 0, True); +end; + +procedure TDemoForm.NavigateHistory(Offset: integer); +begin + if ((HistoryIndex + Offset) < 0) or ((HistoryIndex + Offset) >= MAX_HISTORY_SIZE) then + raise Exception.Create('Wrong history index'); + HistoryIndex := HistoryIndex + Offset; + TreeView.Items[Demos.GetDemoIndex(History[HistoryIndex])].Selected := True; + DisableBrowse(HistoryIndex = 0, HistoryIndex = HistoryEnd); + UpdateDemo; +end; + +procedure TDemoForm.GetBackHistory(BackList: TStrings); +var + i: integer; +begin + BackList.Clear; + for i := HistoryIndex - 1 downto 0 do + BackList.Add(Demos[History[i]].Name); +end; + +procedure TDemoForm.GetForwardHistory(ForwardList: TStrings); +var + i: integer; +begin + ForwardList.Clear; + for i := HistoryIndex + 1 to HistoryEnd do + ForwardList.Add(Demos[History[i]].Name); +end; + +procedure TDemoForm.DisableBrowse(Back, Forward: boolean); +begin + tbBrowseBack.Enabled := not Back; + tbBrowseForward.Enabled := not Forward; +end; + +procedure TDemoForm.FillHistoryPopup(BackHistory: boolean); +var + NewItem: TMenuItem; + List: TStrings; + i: integer; + HistoryPopup: TPopupMenu; +begin + if BackHistory then + HistoryPopup := BackHistoryPopup + else + HistoryPopup := ForwardHistoryPopup; + HistoryPopup.Items.Clear; + List := TStringList.Create; + if BackHistory then + GetBackHistory(List) + else + GetForwardHistory(List); + for i := 1 to List.Count do begin + NewItem := TMenuItem.Create(HistoryPopup); + HistoryPopup.Items.Add(NewItem); + NewItem.Caption := List[i - 1]; + if BackHistory then + NewItem.Tag := -i + else + NewItem.Tag := i; + NewItem.OnClick := HistoryItemClick; + end; + List.Free; +end; + +procedure TDemoForm.HistoryItemClick(Sender: TObject); +begin + if Sender is TMenuItem then + NavigateHistory(TMenuItem(Sender).Tag); +end; + +procedure TDemoForm.BackHistoryPopupPopup(Sender: TObject); +begin + FillHistoryPopup(True); +end; + +procedure TDemoForm.ForwardHistoryPopupPopup(Sender: TObject); +begin + FillHistoryPopup(False); +end; + +procedure TDemoForm.tbBrowseBackClick(Sender: TObject); +begin + NavigateHistory(-1); +end; + +procedure TDemoForm.tbBrowseForwardClick(Sender: TObject); +begin + NavigateHistory(1); +end; + +procedure TDemoForm.sbDemoClick(Sender: TObject); +begin + ShowDemo; +end; + +procedure TDemoForm.sbSourceClick(Sender: TObject); +begin + ShowDemoSource; +end; + +procedure TDemoForm.sbFormTextClick(Sender: TObject); +begin + ShowFormSource; +end; + +procedure TDemoForm.FormResize(Sender: TObject); +begin + lbAbout.Left := lbAbout.Parent.ClientWidth - 100; + cbDebug.Left := cbDebug.Parent.ClientWidth - 100; + pnOpenDemoDir.Left := cbDebug.Left - (pnOpenDemoDir.Width + 15); + pnShowSource.Left := pnOpenDemoDir.Left - (pnShowSource.Width + 15); +end; + +procedure TDemoForm.OnScriptError(Sender: TObject; E: Exception; + SQL: String; var Action: TErrorAction); +var + OperationStr, + ScriptFileStr, + MessageStr: string; +begin + if DropScriptActive then begin + OperationStr := 'drop'; + ScriptFileStr := 'UninstallDemoObjects.sql'; + end + else begin + OperationStr := 'create'; + ScriptFileStr := 'InstallDemoObjects.sql'; + end; + MessageStr := Format('An error has been occured: %s' + + #$d#$d'You can manually %s objects required for demo by using the ' + + 'following file: %%%s%%\Demos\%s' + + #$d'%%%s%% is the %s installation path on your computer.' + #13#10 + 'Ignore this exception?', + [E.Message, OperationStr, ProductName, ScriptFileStr, ProductName, ProductName]); + Action := eaContinue; + if not IgnoreScriptErrors then + case MessageDlg(MessageStr, mtError, [mbYes, mbNo{$IFNDEF LINUX}, mbYesToAll{$ENDIF}], 0) of + mrNo: + Action := eaAbort; + {$IFNDEF LINUX} + mrYesToAll: + IgnoreScriptErrors := True; + {$ENDIF} + end; +end; + +procedure TDemoForm.btScriptClick(Sender: TObject); +var + s: string; +begin + DropScriptActive := Sender = btDrop; + if DropScriptActive then + s := 'removed from database' + else + s := 'created in database'; + if MessageDlg(Format('Objects required for the demo will be %s. Continue?', [s]), + mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin + IgnoreScriptErrors := False; + GetConnection.Connect; + if Sender = btCreate then + ExecCreateScript + else + ExecDropScript; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.xfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.xfm new file mode 100644 index 0000000..d21e0f9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoForm.xfm @@ -0,0 +1,792 @@ +object DemoForm: TDemoForm + Left = 75 + Top = 162 + Width = 957 + Height = 500 + HorzScrollBar.Range = 219 + VertScrollBar.Range = 89 + ActiveControl = TreeView + Caption = 'Data Access Components demos' + Color = clSilver + Constraints.MinHeight = 500 + Font.Color = clText + Font.Height = 13 + Font.Name = 'helvetica' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + ParentFont = False + Position = poScreenCenter + Scaled = False + ShowHint = True + WindowState = wsMaximized + OnCreate = FormCreate + OnDestroy = FormDestroy + OnResize = FormResize + PixelsPerInch = 75 + object TVSplitter: TSplitter + Left = 216 + Top = 69 + Height = 411 + Beveled = True + Color = 9790720 + MinSize = 150 + OnCanResize = TVSplitterCanResize + OnMoved = TVSplitterMoved + end + object MainPanel: TPanel + Left = 219 + Top = 69 + Width = 738 + Height = 411 + Align = alClient + BevelOuter = bvNone + Constraints.MinWidth = 730 + TabOrder = 2 + object pnDemo: TPanel + Left = 0 + Top = 0 + Width = 738 + Height = 411 + Align = alClient + BevelOuter = bvNone + Color = clButton + ParentColor = False + TabOrder = 1 + end + object pnSource: TPanel + Left = 0 + Top = 0 + Width = 738 + Height = 411 + Align = alClient + BevelOuter = bvNone + Color = clButton + ParentColor = False + TabOrder = 0 + Visible = False + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 480 + Width = 957 + Height = 20 + Font.Color = clButtonText + Font.Height = 11 + Font.Name = 'Tahoma' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + Panels = < + item + Width = 220 + end + item + Width = 100 + end + item + Width = 480 + end + item + end> + ParentFont = False + end + object PanelUnderTree: TPanel + Left = 0 + Top = 69 + Width = 216 + Height = 411 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object TreeView: TTreeView + Left = 0 + Top = 25 + Width = 351 + Height = 386 + Align = alLeft + Columns = <> + Images = ImageList1 + Indent = 21 + ParentShowHint = False + ReadOnly = True + ShowHint = True + TabOrder = 0 + OnChange = TreeViewChange + OnClick = TreeViewClick + OnKeyDown = TreeViewKeyDown + OnMouseMove = TreeViewMouseMove + end + object ToolBar: TToolBar + Left = 0 + Top = 0 + Width = 216 + Height = 25 + AutoSize = True + ButtonHeight = 23 + ButtonWidth = 28 + Caption = 'ToolBar' + Color = clButton + DisabledImages = ilDisabledButtons + EdgeInner = esNone + EdgeOuter = esNone + Flat = True + Images = ilButtons + ParentColor = False + TabOrder = 1 + object tbBrowseBack: TToolButton + Left = 1 + Top = 2 + Height = 23 + Hint = 'Back' + Style = tbsDropDown + Caption = ' Back ' + DropDownMenu = BackHistoryPopup + ImageIndex = 0 + OnClick = tbBrowseBackClick + end + object tbBrowseForward: TToolButton + Left = 43 + Top = 2 + Height = 23 + Hint = 'Forward' + Style = tbsDropDown + Caption = 'tbBrowseForward' + DropDownMenu = ForwardHistoryPopup + ImageIndex = 1 + OnClick = tbBrowseForwardClick + end + end + end + object pnTopLabel: TPanel + Left = 0 + Top = 0 + Width = 957 + Height = 41 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + object lbTitle: TLabel + Left = 0 + Top = 0 + Width = 957 + Height = 42 + Cursor = crArrow + Align = alTop + Caption = 'DAC demos' + Color = 9790720 + Constraints.MinWidth = 130 + Font.CharSet = fcsUnicode + Font.Color = clWhite + Font.Height = 35 + Font.Name = 'Verdana' + Font.Pitch = fpVariable + Font.Style = [fsItalic] + Font.Weight = 40 + ParentColor = False + ParentFont = False + OnMouseMove = lbTitleMouseMove + end + object lbAbout: TLabel + Left = 854 + Top = 12 + Width = 28 + Height = 18 + Caption = 'About' + Color = 9790720 + Font.Color = clWhite + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + Font.Weight = 40 + ParentColor = False + ParentFont = False + OnClick = lbAboutClick + OnMouseMove = lbAboutMouseMove + end + end + object Panel2: TPanel + Left = 0 + Top = 41 + Width = 957 + Height = 28 + Align = alTop + BevelOuter = bvNone + Color = clButton + ParentColor = False + TabOrder = 4 + object Shape1: TShape + Left = 0 + Top = 25 + Width = 957 + Height = 3 + Align = alBottom + Brush.Color = 9790720 + Pen.Color = clButton + Pen.Width = 0 + end + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 375 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + ParentColor = False + TabOrder = 0 + object sbConnect: TSpeedButton + Left = 1 + Top = 1 + Width = 100 + Height = 22 + Hint = 'Connect to database' + Caption = 'Connect' + Flat = True + Font.Color = clBlack + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + Glyph.Data = { + FA050000424DF60500000000000036000000280000001E000000100000000100 + 180000000000C005000000000000000000000000000000000000800080800080 + 8000808000808000808000808000808000808000808000804B40388000808000 + 8080008080008080008080008080008080008080008080008080008080008080 + 00808000803E3E3E800080800080800080800080000080008080008080008080 + 00808000808000808000808000808000808000808000804C40373E352D800080 + 8000808000808000808000808000808000808000808000808000808000808000 + 808000803E3E3E33333380008080008000008000808000808000808000808000 + 808000808000808000807E6A5C80008066574B594B414C403880008080008080 + 0080800080800080800080800080800080800080800080686868800080555555 + 4949493E3E3E8000808000800000800080800080800080800080800080800080 + 8000808000808000807E6B5D72615466564B594B428000808000808000808000 + 808000808000808000808000808000808000808000806868685E5E5E54545449 + 49498000808000800000800080A2C8D864A8C0608D9F5D83964A768D346D8C30 + 70925C8AA38874647E6B5C73615466564B800080800080800080C8C8C8A7A7A7 + 8D8D8D8484847878787070707373738C8C8C7171716868685F5F5F5454548000 + 808000800000800080638CA53FBCE884D5E8A1EBF673E4FF24BEF3039FDE148B + BE45729080008080008080008066574B8000808000808E8E8EBBBBBBD1D1D1E6 + E6E6DFDFDFBCBCBCA0A0A08D8D8D767676800080800080800080555555800080 + 00008000806B94AD44C4F090EAFAA1EBF671D9F424BCF201A7E8039CDA2A6384 + 800080800080800080736154800080800080969696C3C3C3E4E4E4E6E6E6D5D5 + D5BBBBBBA8A8A89D9D9D6666668000808000808000805F5F5F80008000008000 + 806B94AD44C4F08DE4F4A1EBF670D7F224B9EE01A7E8039CDA2F688897806F91 + 7A6A887464800080800080800080969696C3C3C3DFDFDFE6E6E6D3D3D3B8B8B8 + A8A8A89D9D9D6B6B6B7D7D7D77777771717180008080008000008000806B9CAD + 3FBCE88EE4F5A1EBF670D7F224B9EE01A7E8039CDA306B8A8000808000808000 + 808000808000808000809B9B9BBBBBBBDFDFDFE6E6E6D3D3D3B8B8B8A8A8A89D + 9D9D6D6D6D80008080008080008080008080008000008000806B9CB53BB8E67E + E4FEA1EBF672D9F224B9EE01A7E8039CDA326D8D800080800080800080800080 + 8000808000809E9E9EB8B8B8E0E0E0E6E6E6D5D5D5B8B8B8A8A8A89D9D9D7070 + 708000808000808000808000808000800000800080739CB53BB8E67EE4FEA1EB + F66FD7F21FB7EE01A7E8039CDA346F8F80008080008080008080008080008080 + 00809E9E9EB8B8B8E0E0E0E6E6E6D3D3D3B6B6B6A8A8A89D9D9D727272800080 + 800080800080800080800080000080008073A5BD3BB8E67EE4FEA0EAF56ED6F2 + 1FB7EE01A7E8039CDA317092800080800080800080800080800080800080A6A6 + A6B8B8B8E0E0E0E5E5E5D2D2D2B6B6B6A8A8A89D9D9D73737380008080008080 + 0080800080800080000080008073A5BD58C9E78CECFFA0EAF5A6EDF894E7F871 + D9F63CBDE9437C97800080800080800080800080800080800080A6A6A6C5C5C5 + E7E7E7E5E5E5E8E8E8E2E2E2D6D6D6BCBCBC7D7D7D8000808000808000808000 + 8080008000008000806691A2A0DFEAC5F9FDC5F9FDC5F9FDC5F9FDC5F9FDA0DF + EA6691A2800080800080800080800080800080800080919191DBDBDBF4F4F4F4 + F4F4F4F4F4F4F4F4F4F4F4DBDBDB919191800080800080800080800080800080 + 0000800080B8D1DB84AFBF6FA2B46B9BAE6C9DAF6B9BAE6FA2B484AFBFB8D1DB + 800080800080800080800080800080800080D1D1D1AFAFAFA1A1A19B9B9B9D9D + 9D9B9B9BA1A1A1AFAFAFD1D1D180008080008080008080008080008000008000 + 8080008080008080008080008080008080008080008080008080008080008080 + 0080800080800080800080800080800080800080800080800080800080800080 + 8000808000808000808000808000808000808000808000800000} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = sbConnectClick + end + object sbDisconnect: TSpeedButton + Left = 102 + Top = 1 + Width = 100 + Height = 22 + Hint = 'Dsisconnect from database' + Caption = 'Disconnect' + Enabled = False + Flat = True + Font.Color = clBlack + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + Glyph.Data = { + 9E050000424D9A0500000000000036000000280000001E0000000F0000000100 + 1800000000006405000000000000000000000000000000000000800080800080 + 800080800080800080800080800080AFBBF7800080800080800080CFCBE38000 + 80800080800080800080800080800080800080800080800080800080CBCBCB80 + 0080800080800080D2D2D2800080800080800080000080008080008080008080 + 0080800080800080CFCBE31140FD6178EE8000806176EA3154F2CFCBE3800080 + 800080800080800080800080800080800080800080D2D2D27373739898988000 + 809696967F7F7FD2D2D280008080008000008000808000808000808000808000 + 808000808000803157F90134FF214BF90134FF3155F480008080008080008080 + 00808000808000808000808000808000808000808383836B6B6B7A7A7A6B6B6B + 8080808000808000808000800000800080A2C8D864A8C0608D9F5D83964A768D + 346D8CFFFFFF1140FD0134FF113FFC800080800080800080800080800080C8C8 + C8A7A7A78D8D8D848484787878707070FFFFFF7373736B6B6B72727280008080 + 00808000808000800000800080638CA53FBCE884D5E8A1EBF673E4FFFFFFFF61 + 7CF60134FF0134FF0134FF6178EE8000808000808000808000808E8E8EBBBBBB + D1D1D1E6E6E6DFDFDFFFFFFF9D9D9D6B6B6B6B6B6B6B6B6B9898988000808000 + 8080008000008000806B94AD44C4F090EAFAA1EBF671D9F4BFC8F70134FF3158 + FBFFFFFF3157F91140FDBFC8F7800080800080800080969696C3C3C3E4E4E4E6 + E6E6D5D5D5D5D5D56B6B6B848484FFFFFF838383737373D5D5D5800080800080 + 00008000806B94AD44C4F08DE4F4A1EBF670D7F224B9EEAFBBF7FFFFFF2F6888 + 800080CFCBE3800080800080800080800080969696C3C3C3DFDFDFE6E6E6D3D3 + D3B8B8B8CBCBCBFFFFFF6B6B6B800080D2D2D280008080008080008000008000 + 806B9CAD3FBCE88EE4F5A1EBF670D7F224B9EE01A7E8039CDA306B8A80008080 + 00808000808000808000808000809B9B9BBBBBBBDFDFDFE6E6E6D3D3D3B8B8B8 + A8A8A89D9D9D6D6D6D80008080008080008080008080008000008000806B9CB5 + 3BB8E67EE4FEA1EBF672D9F224B9EE01A7E8039CDA326D8D8000808000808000 + 808000808000808000809E9E9EB8B8B8E0E0E0E6E6E6D5D5D5B8B8B8A8A8A89D + 9D9D7070708000808000808000808000808000800000800080739CB53BB8E67E + E4FEA1EBF66FD7F21FB7EE01A7E8039CDA346F8F800080800080800080800080 + 8000808000809E9E9EB8B8B8E0E0E0E6E6E6D3D3D3B6B6B6A8A8A89D9D9D7272 + 72800080800080800080800080800080000080008073A5BD3BB8E67EE4FEA0EA + F56ED6F21FB7EE01A7E8039CDA31709280008080008080008080008080008080 + 0080A6A6A6B8B8B8E0E0E0E5E5E5D2D2D2B6B6B6A8A8A89D9D9D737373800080 + 800080800080800080800080000080008073A5BD58C9E78CECFFA0EAF5A6EDF8 + 94E7F871D9F63CBDE9437C97800080800080800080800080800080800080A6A6 + A6C5C5C5E7E7E7E5E5E5E8E8E8E2E2E2D6D6D6BCBCBC7D7D7D80008080008080 + 008080008080008000008000806691A2A0DFEAC5F9FDC5F9FDC5F9FDC5F9FDC5 + F9FDA0DFEA6691A2800080800080800080800080800080800080919191DBDBDB + F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4DBDBDB9191918000808000808000808000 + 808000800000800080B8D1DB84AFBF6FA2B46B9BAE6C9DAF6B9BAE6FA2B484AF + BFB8D1DB800080800080800080800080800080800080D1D1D1AFAFAFA1A1A19B + 9B9B9D9D9D9B9B9BA1A1A1AFAFAFD1D1D1800080800080800080800080800080 + 0000800080800080800080800080800080800080800080800080800080800080 + 8000808000808000808000808000808000808000808000808000808000808000 + 808000808000808000808000808000808000808000808000808000800000} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = sbDisconnectClick + end + object btCreate: TSpeedButton + Left = 203 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Create database objects' + Caption = 'Create' + Flat = True + Font.Color = clBlack + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + Glyph.Data = { + 3A060000424D3606000000000000360000002800000020000000100000000100 + 1800000000000006000000000000000000000000000000000000800080800080 + AC9584785E4B785E4B785E4B785E4B785E4B785E4B785E4B785E4B785E4B785E + 4B785E4B785E4B8000808000808000809292925B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B800080800080800080 + AC9584FEFCFCFAEEE8F8E9E2F7E5DCF5E0D6F4DCD0F3D7C9F2D2C4F1CFBFEFCB + B9EEC8B5785E4B800080800080800080929292FCFCFCEDEDEDE8E8E8E4E4E4DF + DFDFDBDBDBD5D5D5D1D1D1CDCDCDC9C9C9C6C6C65B5B5B800080800080800080 + AC9584FFFFFFFEFDFBFDF9F7FCF5F2FAF1ECF9EBE5F7E6DEF6E1D7F4DBCFF3D6 + C9F0CBB9785E4B800080800080800080929292FFFFFFFCFCFCF8F8F8F4F4F4F0 + F0F0EAEAEAE5E5E5E0E0E0DADADAD5D5D5C9C9C95B5B5B800080800080800080 + AD9786FFFFFFFFFFFFFEFDFBFEF9F7FCF5F29B9491020202F8E6DEF6E1D7F4DB + CFF0CEBD785E4B800080800080800080949494FFFFFFFFFFFFFCFCFCF8F8F8F4 + F4F4939393020202E5E5E5E0E0E0DADADACCCCCC5B5B5B800080800080800080 + AF9A89A8A6A3020202868381D8D6D6020202020202D6CCC8F9EBE50202020202 + 02A38D82785E4B800080800080800080979797A5A5A5020202828282D6D6D602 + 0202020202CBCBCBEAEAEA0202020202028C8C8C5B5B5B800080800080800080 + B29C8CD9D9D9FFFFFF020202020202FFFDFBD7D5D2020202D6CCC9020202F8E6 + DEF2D5C7785E4B800080800080800080999999D9D9D9FFFFFF020202020202FC + FCFCD4D4D4020202CCCCCC020202E5E5E5D3D3D35B5B5B800080800080800080 + B59F8FFFFFFF020202FFFFFF020202FFFFFFFEFCFC020202D6D0CE020202FAEC + E5F4D9CD785E4B8000808000808000809C9C9CFFFFFF020202FFFFFF020202FF + FFFFFCFCFC020202D0D0D0020202EBEBEBD8D8D85B5B5B800080800080800080 + B9A393020202D9D9D9FFFFFF020202D9D9D9FFFFFF020202D7D4D2020202FBF0 + EBF5DDD1785E4B800080800080800080A0A0A0020202D9D9D9FFFFFF020202D9 + D9D9FFFFFF020202D3D3D3020202EFEFEFDCDCDC5B5B5B800080800080800080 + BBA697D9D9D9020202020202D9D9D9020202020202B9B9B9FFFCFC020202FCF5 + F1F6E2D8785E4B800080800080800080A3A3A3D9D9D9020202020202D9D9D902 + 0202020202B9B9B9FCFCFC020202F4F4F4E1E1E15B5B5B8000808000802AAFDA + 44CBF06BE5FF3BBEE599D8DF91E1F681D0E9FFFFFFFFFFFFFFFFFFFEFCFBFDF9 + F7D9CBC0785E4B800080800080ADADADC7C7C7DFDFDFBBBBBBD3D3D3DEDEDECE + CECEFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8C9C9C95B5B5B80008080008052DAFB + 32B7DF7FE9FD5FC6E693F0FF31B6DFA0E8F9FFFFFFFFFFFFFFFFFFFFFFFFFEFC + FCD9CBC0785E4B800080800080D4D4D4B4B4B4E3E3E3C4C4C4EAEAEAB3B3B3E5 + E5E5FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCC9C9C95B5B5B8000808000807CEAFF + 93F1FFBFF8FFAFE8F4C7FBFF93F1FF9FF0FFFFFFFFFFFFFFFFFFFFFAF0EB785E + 4B785E4B785E4B800080800080E4E4E4EAEAEAF3F3F3E5E5E5F6F6F6EAEAEAEB + EBEBFFFFFFFFFFFFFFFFFFEFEFEF5B5B5B5B5B5B5B5B5B80008080008021AAD9 + 55BFE1AFE8F4F0FFFDB4EBF655BFE138BBE5FFFFFFFFFFFFFFFFFF967E6BF4DB + CED1BAAF785E4B800080800080A9A9A9BDBDBDE5E5E5FCFCFCE8E8E8BDBDBDB9 + B9B9FFFFFFFFFFFFFFFFFF7A7A7AD9D9D9B9B9B95B5B5B8000808000807CEAFF + 96F3FFC7FBFFADE5F3C3FBFF96F3FF8BD7E2FEFDFBFDFBF9FDF9F6967E6BD1BA + AFAC9584800080800080800080E4E4E4ECECECF6F6F6E3E3E3F6F6F6ECECECD1 + D1D1FCFCFCFAFAFAF8F8F87A7A7AB9B9B992929280008080008080008051D9FA + 33B8E08CF1FF5AC2E390F1FF30B6DF4BD2F4BBA696B9A293B69F8FB29C8BB099 + 88800080800080800080800080D3D3D3B5B5B5EAEAEAC0C0C0EAEAEAB3B3B3CD + CDCDA3A3A3A0A0A09C9C9C9999999696968000808000808000808000802AAFDA + 44CBF07CEAFF25AEDB72E8FF4CD4F52AAFDA8000808000808000808000808000 + 80800080800080800080800080ADADADC7C7C7E4E4E4ACACACE1E1E1CECECEAD + ADAD800080800080800080800080800080800080800080800080} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btScriptClick + end + object btDrop: TSpeedButton + Left = 289 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Drop database objects' + Caption = 'Drop' + Flat = True + Font.Color = clBlack + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + Glyph.Data = { + 3A060000424D3606000000000000360000002800000020000000100000000100 + 1800000000000006000000000000000000000000000000000000800080800080 + A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A + 77A37A779063608000808000808000807D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D + 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D676767800080800080800080 + A67E78FFE8D2FFE8D2FFE8D1FFE6CEFFE3C5FFDEBDFFDDBAFFD8B2FFD6AEFFD2 + A5FFD2A3936662800080800080800080808080E3E3E3E3E3E3E3E3E3E1E1E1DD + DDDDD7D7D7D6D6D6D0D0D0CECECEC9C9C9C8C8C8696969800080800080800080 + AB817AFFE8D2FFE8D2FFE6CEFFE3C6FFE1C2FFDDBBFFDAB6FFD7B0FFD4A9FFD2 + A4FFD2A3966965800080800080800080838383E3E3E3E3E3E3E1E1E1DDDDDDDB + DBDBD6D6D6D3D3D3CFCFCFCBCBCBC9C9C9C8C8C86C6C6C800080800080800080 + B0837CFFECD9FFECD9FFE8D2FFE6CEFFE3C6FFE1C2FFDDBBFFD9B4FFD7B0FFD4 + A9FFD4A99A6C67800080800080800080858585E8E8E8E8E8E8E3E3E3E1E1E1DD + DDDDDBDBDBD6D6D6D2D2D2CFCFCFCBCBCBCBCBCB6F6F6F800080800080800080 + B6897FFFEEDDFFEEDDFFECD9DFD1D8FFE6CEFFE3C6FFE1C2EFD2BFFFD9B4FFD7 + B0FFD7B09E6F698000808000808000808A8A8AEAEAEAEAEAEAE8E8E8D4D4D4E1 + E1E1DDDDDDDBDBDBCFCFCFD2D2D2CFCFCFCFCFCF727272800080800080800080 + BC8E81FFF2E4FFF2E4CFCBE31342FD637AEEFFE6CE6378EA3356F2EFD2BFFFD9 + B4FFD9B4A2726B8000808000808000808F8F8FEFEFEFEFEFEFD2D2D27474749A + 9A9AE1E1E1979797808080CFCFCFD2D2D2D2D2D2757575800080800080800080 + C39581FFF4E8FFF4E8EFE6E63359F90336FF234DF90336FF3357F4EFD6C5FFDD + BBFFDDBBA5766D800080800080800080949494F1F1F1F1F1F1E6E6E68484846C + 6C6C7B7B7B6C6C6C828282D3D3D3D6D6D6D6D6D6787878800080800080800080 + CA9B84FFF7F0FFF7F0FFF4E8EFE6E61342FD0336FF1341FCEFDBD0FFE3C6FFE0 + C1FFE1C2A8796F800080800080800080999999F5F5F5F5F5F5F1F1F1E6E6E674 + 74746C6C6C747474D9D9D9DDDDDDDADADADBDBDB7B7B7B800080800080800080 + D2A187FFF9F4FFF9F4FFF7F0637EF60336FF0336FF0336FF637AEEFFE6CEFFE3 + C6FFE3C6AC7C718000808000808000809E9E9EF8F8F8F8F8F8F5F5F59F9F9F6C + 6C6C6C6C6C6C6C6C9A9A9AE1E1E1DDDDDDDDDDDD7D7D7D800080800080800080 + D9A88AFFFDFBFFFDFBBFC8F70336FF335AFBDFDAE73359F91342FDDFD1D8FFE6 + CEFFE6CEAE7E74800080800080800080A4A4A4FCFCFCFCFCFCD5D5D56C6C6C86 + 8686DEDEDE848484747474D4D4D4E1E1E1E1E1E1808080800080800080800080 + DFAE8CFFFFFFFFFFFFFFFDFBAFBBF7EFEBF0FFF4E8EFE6E6CFCBE3FFECD9FFC8 + C2FFB0B0B08075800080800080800080A9A9A9FFFFFFFFFFFFFCFCFCCBCBCBEC + ECECF1F1F1E6E6E6D2D2D2E8E8E8CCCCCCB8B8B8818181800080800080800080 + E5B38FFDFDFDFDFDFDFFFFFFFFFFFFFFFFFEFFFAF6FFF9F3FFF5EAF4DECEB281 + 76B28176B28176800080800080800080ADADADFCFCFCFCFCFCFFFFFFFFFFFFFE + FEFEF9F9F9F7F7F7F2F2F2DBDBDB838383838383838383800080800080800080 + EAB891FEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFEFFFAF6FFF9F3F5E1D2B281 + 76EDA757D2AA95800080800080800080B1B1B1FEFEFEFEFEFEFFFFFFFFFFFFFF + FFFFFEFEFEF9F9F9F7F7F7DEDEDE838383969696A8A8A8800080800080800080 + EFBC92FFFFFFFFFFFFFCFCFCFAFAFAF7F7F7F5F5F5F2F1F1F0EDEAE9DAD0B281 + 76D9B198800080800080800080800080B5B5B5FFFFFFFFFFFFFBFBFBFAFAFAF7 + F7F7F5F5F5F1F1F1ECECECD8D8D8838383ADADAD800080800080800080800080 + F2BF94DCA987DCA987DCA987DCA987DCA987DCA987DCA987DCA987DCA987B281 + 76800080800080800080800080800080B7B7B7A4A4A4A4A4A4A4A4A4A4A4A4A4 + A4A4A4A4A4A4A4A4A4A4A4A4A4A4838383800080800080800080800080800080 + 8000808000808000808000808000808000808000808000808000808000808000 + 8080008080008080008080008080008080008080008080008080008080008080 + 0080800080800080800080800080800080800080800080800080} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btScriptClick + end + end + object cbDebug: TCheckBox + Left = 871 + Top = 8 + Width = 68 + Height = 13 + Hint = 'Set Debug property for connection and query components' + Caption = 'Debug' + Color = clButton + Font.Color = clBlack + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + ParentColor = False + ParentFont = False + TabOrder = 1 + OnClick = cbDebugClick + end + object pnShowSource: TPanel + Left = 440 + Top = 1 + Width = 259 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + ParentColor = False + TabOrder = 2 + object sbDemo: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Show demo' + GroupIndex = 1 + Down = True + Caption = 'Demo' + Flat = True + Font.Color = clBlack + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + ParentFont = False + Transparent = False + OnClick = sbDemoClick + end + object sbSource: TSpeedButton + Left = 87 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Show demo source code' + GroupIndex = 1 + Caption = 'Demo source' + Flat = True + Font.Color = clBlack + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + ParentFont = False + Transparent = False + OnClick = sbSourceClick + end + object sbFormText: TSpeedButton + Left = 173 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Show demo form as text' + GroupIndex = 1 + Caption = 'Form as text' + Flat = True + Font.Color = clBlack + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + ParentFont = False + Transparent = False + OnClick = sbFormTextClick + end + end + object pnOpenDemoDir: TPanel + Left = 720 + Top = 1 + Width = 138 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + ParentColor = False + TabOrder = 3 + object sbOpenDemoDir: TSpeedButton + Left = 1 + Top = 1 + Width = 136 + Height = 22 + Hint = 'Open folder containing the demo source files' + Caption = 'Open demo folder' + Flat = True + Font.Color = clText + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + Glyph.Data = { + 3A030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF728890628190627A81527281526272425A62424A5232 + 3A42223232222232121A22121212121222FFFFFFFFFFFFFFFFFF72889090A0B0 + 72B0D00290D00290D00290D00290C01288C01281B01281B0227AA0227290224A + 62FFFFFFFFFFFFFFFFFF81889081C0D090A8B081E0FF62D0FF52C8FF52C8FF42 + C0F032B0F032A8F022A0E01290D0226A815B6369FFFFFFFFFFFF8190A081D0F0 + 90A8B090C0D072D8FF62D0FF62D0FF52C8FF52C0FF42B8F032B0F032A8F01288 + D0224A62FFFFFFFFFFFF8190A081D8F081C8E090A8B081E0FF72D0FF62D8FF62 + D0FF62D0FF52C8FF42C0F042B8F032B0F0226A816C8B9AFFFFFF8198A090E0F0 + 90E0FF90A8B090B8C072D8FF62D8FF62D8FF62D8FF62D0FF52D0FF52C8FF42B8 + F032A0E04B6979FFFFFF8198A090E0F0A0E8FF81C8E090A8B081E0FF81E0FF81 + E0FF81E0FF81E0FF81E0FF81E0FF72D8FF72D8FF52A8D087929D90A0A0A0E8F0 + A0E8FFA0E8FF90B0C090B0C090A8B090A8B081A0B081A0B08198A08198A08190 + A08190A081889072889090A0B0A0E8F0A0F0FFA0E8FFA0E8FF81D8FF62D8FF62 + D8FF62D8FF62D8FF62D8FF62D8FF728890FFFFFFFFFFFFFFFFFF90A0B0A0F0F0 + B0F0F0A0F0FFA0E8FFA0E8FF72D8FF90A0A08198A08198A08190A08190907288 + 90FFFFFFFFFFFFFFFFFF90A8B0A0D0E0B0F0F0B0F0F0A0F0FFA0E8FF90A0B0B3 + C9CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF906A52906A52906A52CDD6DA90A8B0 + 90A8B090A8B090A8B090A8B0B6C5CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFD2C7C6906A52906A52FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFF907A62C8BAB3FFFFFFFFFFFFA09081D2CDC7907A62FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D3A09081A08881B098 + 81C5BEB7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentFont = False + Transparent = False + OnClick = sbOpenDemoDirClick + end + end + end + object ImageList1: TImageList + Height = 17 + Left = 616 + Top = 8 + end + object BackHistoryPopup: TPopupMenu + OnPopup = BackHistoryPopupPopup + Left = 8 + Top = 133 + end + object ForwardHistoryPopup: TPopupMenu + OnPopup = ForwardHistoryPopupPopup + Left = 40 + Top = 133 + end + object ilButtons: TImageList + Left = 88 + Top = 141 + Bitmap = { + 494D474C01000100100000001000000002000000424D36060000000000003600 + 0000280000002000000010000000010018000000000000060000120B0000120B + 00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0D0C97DAC862C7D3102690902 + 6407005E042063236D9672C3CFCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFC0D0C97DAC862C7D31026909026407005E042063236D9672C3CFCBFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAEC7B6328C360C982211B62F0DB42509 + B21C06B01601AE0B009107106514B4C6BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + AEC7B6328C360C982211B62F0DB42509B21C06B01601AE0B009107106514B4C6 + BBFFFFFFFFFFFFFFFFFFFFFFFFB0C9B8178C231CB6451BBA4417B83A12B6303C + C3521AB72D08B21B04AF1100AD09006705B6C7BDFFFFFFFFFFFFFFFFFFB0C9B8 + 178C231CB6451BBA4417B83A5DCD7279D5880BB32108B21B04AF1100AD090067 + 05B6C7BDFFFFFFFFFFFFCCDDD343A44823B75324BE5821BD511CBA456FD388FF + FFFFB5E8BE0EB4260AB21D07B11802AE0D106914C9D5D0FFFFFFCCDDD343A448 + 23B75324BE5821BD511CBA45D4F2DCFFFFFFA6E4B10EB4260AB21D07B11802AE + 0D106914C9D5D0FFFFFF9CCEA117A4372EC26B2CC16625BF5A76D695FFFFFFFF + FFFF9AE0AB13B63111B62E0BB32109B21C078E1286A88BFFFFFF9CCEA117A437 + 2EC26B2CC16625BF5A1CBB4775D694FFFFFFFFFFFFA6E4B111B62E0BB32109B2 + 1C078E1286A88BFFFFFF40B14128BB5E2EC26B2EC26B7CD9A1FFFFFFFFFFFFAC + E6BF1CBB471ABA4315B83812B6300FB52A0AB21D227A27FFFFFF40B14128BB5E + 2EC26B2EC26B1CBB471CBB4725BE5976D697FFFFFFFFFFFFA6E4B114B7340FB5 + 2A0AB21D227A27FFFFFF40B1412EC26B2EC26B7CD9A3FFFFFFFFFFFFF1FBF592 + DFAC92DFAC8EDDA38DDDA28BDC9D14B73411B62F057710FFFFFF40B1412EC26B + 62D190FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8E5B614B7 + 3411B62F057710FFFFFF40B8412EC26B48CA7EFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFF1BBA4417B83A097E14FFFFFF40B8412EC26B + 62D190FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5F3DE1BBA + 4417B83A097E14FFFFFF40BB4133C36E2EC26B7CD9A3FFFFFFFFFFFFFFFFFFA4 + E4BE97E1B597E1B595E0B192DFAC21BD511CBA45077F13FFFFFF40BB4133C36E + 2EC26B2EC26B2EC26B2EC26B2EC26B89DDACFFFFFFFFFFFFD7F3E22EC26B21BD + 511CBA45077F13FFFFFF40BB4144C6653FC7762EC26B7CD9A3FFFFFFFFFFFFD8 + F4E33BC6742EC26B2EC26B2CC16625BF5A23BE57238B2CFFFFFF40BB4144C665 + 3FC7762EC26B2EC26B2EC26B55CD87F2FBF6FFFFFFD8F4E32EC26B2CC16625BF + 5A23BE57238B2CFFFFFFA2D7A531BE3C72D59552CC8235C4707CD9A3FFFFFFFF + FFFFA4E4BE2EC26B2EC26B2EC26B2DC26A33963B9EC8A4FFFFFFA2D7A531BE3C + 72D59552CC8235C4702EC26BBEECD1FFFFFFD8F4E32EC26B2EC26B2EC26B2DC2 + 6A1AA73E9EC8A4FFFFFFD7E7DC40C24075D68382DAA066D28E44C8797FDAA4F2 + FBF689DDAC2EC26B2EC26B2EC26B2BBF64239629C3E2C7FFFFFFD7E7DC40BB41 + 75D68382DAA066D28E2EC26B2EC26B97E1B52EC26B2EC26B2EC26B2EC26B2BBF + 64239629C3E2C7FFFFFFFFFFFFC9E3CD40C24077D78098E0AD76D7985ACE863A + C5732EC26B2EC26B2EC26B28BD5E189E26C9E4CDFFFFFFFFFFFFFFFFFFC9E3CD + 40BB4177D78098E0AD76D7985ACE863AC5732EC26B2EC26B2EC26B28BD5E189E + 26C9E4CDFFFFFFFFFFFFFFFFFFFFFFFFCAE4CE40C24047CB4984DA918CDCA66A + D3914ECB7F2DBF6117B13643B547CAE5CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + CAE4CE40BB4147CB4984DA918CDCA66AD3914ECB7F2DBF6117B13643B547CAE5 + CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBE9DF9AD99D40C24040C24040 + C24040C24040C2409AD99DDBEADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFDBE9DF9AD99D40C24040C24040C24040C24040C2409AD99DDBEADEFFFF + FFFFFFFFFFFFFFFFFFFF424D7E000000000000003E0000002800000020000000 + 10000000010001000000000040000000120B0000120B00000200000002000000 + FFFFFF0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000} + end + object ilDisabledButtons: TImageList + Left = 120 + Top = 141 + Bitmap = { + 494D474C01000100100000001000000002000000424D36060000000000003600 + 0000280000002000000010000000010018000000000000060000120B0000120B + 00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC9B9B9B5D5D5D4040403D + 3D3D383838484848868686CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFCCCCCC9B9B9B5D5D5D4040403D3D3D383838484848868686CCCCCCFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF6868686565657B7B7B76767672 + 72726F6F6F6A6A6A575757434343C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + BFBFBF6868686565657B7B7B7676767272726F6F6F6A6A6A575757434343C0C0 + C0FFFFFFFFFFFFFFFFFFFFFFFFC1C1C15F5F5F8383838585858080807B7B7B92 + 92927C7C7C7272726C6C6C6868683E3E3EC2C2C2FFFFFFFFFFFFFFFFFFC1C1C1 + 5F5F5F838383858585808080A5A5A5B3B3B37474747272726C6C6C6868683E3E + 3EC2C2C2FFFFFFFFFFFFD8D8D87D7D7D8888888E8E8E8B8B8B858585B1B1B1FF + FFFFD5D5D57777777272727070706A6A6A454545D2D2D2FFFFFFD8D8D87D7D7D + 8888888E8E8E8B8B8B858585E8E8E8FFFFFFCDCDCD7777777272727070706A6A + 6A454545D2D2D2FFFFFFBBBBBB7373739797979595958F8F8FB7B7B7FFFFFFFF + FFFFC8C8C87C7C7C7B7B7B7474747272725959599B9B9BFFFFFFBBBBBB737373 + 9797979595958F8F8F868686B7B7B7FFFFFFFFFFFFCDCDCD7B7B7B7474747272 + 725959599B9B9BFFFFFF8282828E8E8E979797979797BDBDBDFFFFFFFFFFFFD3 + D3D38686868484847F7F7F7B7B7B797979727272575757FFFFFF8282828E8E8E + 9797979797978686868686868E8E8EB8B8B8FFFFFFFFFFFFCDCDCD7D7D7D7979 + 79727272575757FFFFFF828282979797979797BEBEBEFFFFFFFFFFFFF8F8F8C7 + C7C7C7C7C7C2C2C2C2C2C2C0C0C07D7D7D7B7B7B4B4B4BFFFFFF828282979797 + B1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0D0D07D7D + 7D7B7B7B4B4B4BFFFFFF878787979797A4A4A4FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFF858585808080515151FFFFFF878787979797 + B1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E98585 + 85808080515151FFFFFF888888999999979797BEBEBEFFFFFFFFFFFFFFFFFFD1 + D1D1CBCBCBCBCBCBC9C9C9C7C7C78B8B8B858585515151FFFFFF888888999999 + 979797979797979797979797979797C5C5C5FFFFFFFFFFFFEAEAEA9797978B8B + 8B858585515151FFFFFF8888889A9A9A9F9F9F979797BEBEBEFFFFFFFFFFFFEB + EBEB9E9E9E9797979797979595958F8F8F8E8E8E636363FFFFFF8888889A9A9A + 9F9F9F979797979797979797AAAAAAF8F8F8FFFFFFEBEBEB9797979595958F8F + 8F8E8E8E636363FFFFFFC2C2C2878787B6B6B6A8A8A89B9B9BBEBEBEFFFFFFFF + FFFFD1D1D19797979797979797979797976F6F6FB8B8B8FFFFFFC2C2C2878787 + B6B6B6A8A8A89B9B9B979797DEDEDEFFFFFFEBEBEB9797979797979797979797 + 97777777B8B8B8FFFFFFE1E1E18C8C8CB2B2B2BEBEBEB1B1B1A1A1A1BFBFBFF8 + F8F8C5C5C5979797979797979797939393686868D6D6D6FFFFFFE1E1E1888888 + B2B2B2BEBEBEB1B1B1979797979797CBCBCB9797979797979797979797979393 + 93686868D6D6D6FFFFFFFFFFFFD9D9D98C8C8CB2B2B2C8C8C8B9B9B9ABABAB9D + 9D9D9797979797979797979090906B6B6BDADADAFFFFFFFFFFFFFFFFFFD9D9D9 + 888888B2B2B2C8C8C8B9B9B9ABABAB9D9D9D9797979797979797979090906B6B + 6BDADADAFFFFFFFFFFFFFFFFFFFFFFFFDADADA8C8C8C959595BABABAC3C3C3B3 + B3B3A6A6A69292927B7B7B878787DBDBDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DADADA888888959595BABABAC3C3C3B3B3B3A6A6A69292927B7B7B878787DBDB + DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E4E4C0C0C08C8C8C8C8C8C8C + 8C8C8C8C8C8C8C8CC0C0C0E4E4E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFE4E4E4C0C0C08C8C8C8C8C8C8C8C8C8C8C8C8C8C8CC0C0C0E4E4E4FFFF + FFFFFFFFFFFFFFFFFFFF424D7E000000000000003E0000002800000020000000 + 10000000010001000000000040000000120B0000120B00000200000002000000 + FFFFFF0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000} + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.dfm new file mode 100644 index 0000000..08110ca --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.dfm @@ -0,0 +1,7 @@ +object DemoFrame: TDemoFrame + Left = 0 + Top = 0 + Width = 308 + Height = 228 + TabOrder = 0 +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.pas new file mode 100644 index 0000000..6636031 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.pas @@ -0,0 +1,57 @@ +unit DemoFrame; + +interface + +uses + Classes, +{$IFDEF LINUX} + QControls, QStdCtrls, QGraphics, QForms, +{$ELSE} + Forms, Windows, Messages, SysUtils, StdCtrls, Graphics, Controls, Dialogs, + ComCtrls, Buttons, ExtCtrls, DBCtrls, +{$ENDIF} + DBAccess + {$IFNDEF VER130}, Variants{$ENDIF} + ; + +type + TDemoFrame = class(TFrame) + public + Connection: TCustomDAConnection; + procedure Initialize; virtual; + procedure SetDebug(Value: boolean); virtual; + + procedure AssignConnectionTo(Dest: TCustomDAConnection); + end; + + TDemoFrameClass = class of TDemoFrame; + + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TDemoFrame.Initialize; +begin +end; + +procedure TDemoFrame.SetDebug(Value: boolean); +begin +end; + +procedure TDemoFrame.AssignConnectionTo(Dest: TCustomDAConnection); +begin + Dest.Assign(Connection); + Dest.AfterConnect := nil; + Dest.AfterDisconnect := nil; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.xfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.xfm new file mode 100644 index 0000000..aac3159 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/DemoFrame.xfm @@ -0,0 +1,13 @@ +object DemoFrame: TDemoFrame + Left = 0 + Top = 0 + Width = 308 + Height = 228 + Font.Color = clBlack + Font.Height = 11 + Font.Name = 'helvetica' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + TabOrder = 0 +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/HtmlConsts.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/HtmlConsts.pas new file mode 100644 index 0000000..32944d8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/HtmlConsts.pas @@ -0,0 +1,142 @@ +unit HtmlConsts; + +interface + +const + HTMLHeader: string = + ''#13#10 + + ''#13#10 + + ''#13#10 + + ' Samples - Oracle Data Access Components'#13#10 + + ''#13#10 + + ''#13#10 + + ''#13#10; + + HTMLFooter: string = '' + #13#10 + ''; + +implementation + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacAbout.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacAbout.dfm new file mode 100644 index 0000000..0067eb0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacAbout.dfm @@ -0,0 +1,3078 @@ +object SdacAboutForm: TSdacAboutForm + Left = 582 + Top = 202 + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'About SDAC' + ClientHeight = 276 + ClientWidth = 386 + Color = clBtnFace + ParentFont = True + OldCreateOrder = True + Position = poScreenCenter + OnMouseMove = FormMouseMove + PixelsPerInch = 96 + TextHeight = 13 + object Bevel1: TBevel + Left = 8 + Top = 8 + Width = 123 + Height = 263 + end + object Image1: TImage + Left = 9 + Top = 9 + Width = 120 + Height = 260 + AutoSize = True + Picture.Data = { + 07544269746D6170D66D0100424DD66D01000000000036000000280000007800 + 0000040100000100180000000000A06D0100C30E0000C30E0000000000000000 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C26268C26268C26268C26268C27278D27278D27278D27278D27278D27278D27 + 278D26268C26268C26268C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C26268C26268C + 27278D28288D28288E29298E2A2A8F2B2B8F2C2C902D2D902D2D902E2E912E2E + 912E2E912E2E912E2E912D2D902C2C902B2B8F29298E28288E28288D27278D26 + 268C26268C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C26268C27278D28 + 288D28288E29298E2A2A8F2C2C902D2D902E2E91303092323293333393343494 + 3636953737953939963A3A973A3A973A3A973A3A973838963636953434943232 + 933030922E2E912B2B8F29298E28288D27278D26268C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C26268C26268C2727 + 8D28288D28288E29298E2A2A8F2B2B8F2C2C902D2D902E2E9130309232329334 + 34943737953A3A973C3C9840409A42429B45459D47479E49499F4A4A9F49499F + 48489E46469E43439C40409A3C3C983838963434943030922D2D902A2A8F2828 + 8E27278D26268C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C26268C + 26268C27278D27278D27278D26268C26268C25258C25258C25258C25258C2525 + 8C25258C26268C28288E2C2C902F2F913434943A3A9740409A45459D4B4BA051 + 51A35555A55858A75959A85A5AA85858A75555A55151A34B4BA046469E40409A + 3A3A973535953030922D2D9029298E28288D26268C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C26268C26268C26268C + 27278D27278D27278D27278D27278D27278D27278D26268C26268C25258C2525 + 8C2E2E9139399644449C4D4DA15757A65E5EAA6363AD6767AF6868AF6767AF63 + 63AD5E5EAA5757A75050A348489E40409A3A3A973434942E2E912B2B8F28288E + 27278D26268C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C26268C27278D27278D28288D28 + 288E29298E29298E2A2A8F2B2B8F2B2B8F2B2B8F2B2B8F2B2B8F2B2B8F2A2A8F + 2A2A8F29298E28288E28288D27278D25258C28288E39399648489E5656A66262 + AC6A6AB17171B47474B57373B56F6FB36969B06262AC5858A74F4FA245459D3D + 3D993535952F2F912B2B8F28288E27278D26268C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C26268C27278D28288D28288E2929 + 8E2B2B8F2C2C902D2D902E2E912F2F9130309231319231319232329332329331 + 31923131923030922F2F912E2E912E2E912D2D902B2B8F2A2A8F28288E27278D + 26268C2A2A8F3F3F9A5151A36262AC6F6FB37878B87C7CBA7D7DBA7A7AB97373 + B56969B05E5EAA5353A448489E3F3F9A3636953030922C2C9028288E27278D26 + 268C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C26268C27278D28288D28288E29298E + 2B2B8F2D2D902E2E913030923232933434943535953636953737953838963838 + 963838963838963838963737953636953535953434943333933232933030922F + 2F912E2E912C2C902A2A8F28288E27278D25258C3636954D4DA16262AC7272B5 + 7E7EBB8484BE8686BF8181BD7A7AB96F6FB36363AC5656A649499F3F3F9A3636 + 952F2F912B2B8F28288D26268C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C26268C27278D28288D29298E2B + 2B8F2D2D902F2F913131923434943636953838963A3A973B3B983C3C983E3E99 + 3E3E993E3E993E3E993E3E993D3D993C3C983B3B983A3A973A3A973838963737 + 953535953434943333933232933030922E2E912D2D902B2B8F29298E28288D26 + 268C3030924B4BA06363AC7575B68383BE8B8BC28C8CC28787C07E7EBB7272B5 + 6363AD5656A649499F3D3D993434942E2E912A2A8F28288D26268C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C26268C27278D28288D2929 + 8E2C2C902E2E913030923434943636953939963B3B983E3E9940409A41419B42 + 429B43439C43439C43439C3E3E963333872929772424711C1C651B1B6317175E + 12125612125617175E1919631A1A6520206F2323742A2A822F2F8F3030922E2E + 912E2E912C2C902A2A8F28288D26268C2E2E914C4CA16666AE7B7BBA8989C191 + 91C59191C58B8BC28080BC7272B56363AC5353A446469E3B3B983333932D2D90 + 29298E27278D26268C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C26268C27278D28288D + 29298E2C2C902E2E913131923434943838963B3B983E3E9941419B43439C4545 + 9D46469E46469E44449B35358725257119196012125612125612125612125612 + 1256121256121256121256121256121256121256121256121256121256121256 + 1212561717601F1F6F26267F2D2D902D2D902B2B8F29298E28288D26268C3333 + 935151A36D6DB28181BD9090C49696C89494C78C8CC38080BC6F6FB35F5FAB50 + 50A342429B3838963030922B2B8F28288D26268C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C26268C27278D28 + 288D29298E2B2B8F2E2E913131923535953939963D3D9940409A43439C46469E + 48489E49499F4A4A9F3A3A8A26267115155A1212561212561212561212561212 + 5612125612125612125612125612125612125612125612125612125612125612 + 125612125612125612125612125612125612125614145A1D1D6C2727822D2D90 + 2B2B8F29298E28288D25258C3A3A975A5AA87575B68A8AC19696C89A9ACA9696 + C88C8CC27C7CBA6B6BB15A5AA84B4BA03E3E993434942E2E9129298E27278D26 + 268C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2626 + 8C27278D28288E2B2B8F2E2E913131923434943939963D3D9941419B45459D48 + 489E4B4BA04B4BA048489B2E2E7A17175D121256121256121256121256121256 + 12125612125612125613135814145A15155B16165C16165D17175D17175D1616 + 5D16165C15155B14145A13135812125612125612125612125612125612125612 + 125612125615155C2020742B2B8D2A2A8F28288E27278D25258C45459D6464AD + 7F7FBB9292C69C9CCB9D9DCB9696C88888C07777B76464AD5353A444449C3939 + 963030922B2B8F28288D26268C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 26268C27278D28288E2A2A8F2D2D903030923434943838963D3D9941419B4545 + 9D49499F4C4CA14E4EA247479A2C2C7714145912125612125612125612125612 + 125612125714145A16165D1818601A1A621B1B641D1D661D1D671E1E681E1E69 + 1F1F691F1F691E1E691E1E681D1D671C1C651B1B6419196118186016165D1414 + 5A1212571212561212561212561212561212561313591E1E7129298B29298E28 + 288D26268C3030925252A47272B58B8BC29A9ACAA0A0CD9E9ECC9292C68282BD + 6F6FB35C5CA94B4BA03E3E993434942D2D9028288E27278D25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C26268C27278D28288D29298E2C2C902E2E913333933737953C3C9840409A + 45459D4A4A9F4D4DA14F4FA249499B2A2A731313571212561212561212561212 + 5612125715155B17175E1A1A621C1C651E1E6820206B21216D23236F24247125 + 257225257326267427277527277526267425257325257224247123236F21216D + 20206A1E1E681C1C651A1A6217175E15155B1212571212561212561212561212 + 561313581C1C6E28288A28288E27278D25258C40409A6363AC8080BC9696C8A1 + A1CDA3A3CE9B9BCA8C8CC27979B86565AE5252A443439C3737952F2F912A2A8F + 27278D26268C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C26268C27278D28288E2A2A8F2E2E913131923535953A3A9740 + 409A44449C49499F4C4CA15050A35050A1343480141459121256121256121256 + 12125614145917175D1919611D1D661F1F6921216D2323702525732727752929 + 782A2A7A2B2B7B2C2C7D2D2D7E2D2D7E2D2D7F2D2D7F2D2D7E2D2D7E2C2C7D2B + 2B7B2A2A7A29297827277525257323237021216D1F1F691C1C6519196117175D + 1313581212561212561212561212561313591F1F7429298D28288D26268C2E2E + 915252A47474B58E8EC39F9FCCA6A6D0A2A2CE9595C78282BD6E6EB25A5AA849 + 499F3B3B983232932C2C9028288D26268C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C26268C27278D28288D29298E2C2C902F2F913434943939 + 963E3E9943439C48489E4C4CA15050A35151A34343921D1D6312125612125612 + 125612125614145A18185F1B1B631E1E6821216C2323702626742828772B2B7B + 2D2D7E2E2E803030823131843232863333873434883434883434893434893434 + 883434883333873232863131843030822E2E802D2D7E2B2B7B28287726267423 + 237021216C1E1E681B1B6318185F14145A12125612125612125612125615155E + 22227D28288E27278D25258C43439C6767AF8686BF9B9BCAA6A6D0A6A6D09C9C + CB8B8BC27676B76262AC4F4FA240409A3434942E2E9128288E27278D25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C26268C27278D28288E2B2B8F2E2E91323293 + 3636953B3B9840409A46469E4B4BA04F4FA25151A34E4E9E2A2A721212561212 + 5612125612125614145A18185F1B1B641F1F6922226E2525722828762B2B7B2D + 2D7E2F2F8131318433338735358A36368C37378D39398F3939903A3A913A3A92 + 3B3B933B3B933A3A923A3A9139399039398F37378D36368C35358A3333873131 + 842F2F812E2E7E2C2C7B28287625257222226E1F1F691B1B6418185F14145A12 + 125612125612125612125618186525258728288D26268C3535955A5AA87B7BBA + 9595C7A5A5D0AAAAD2A2A2CE9292C67F7FBB6969B05555A545459D3838962F2F + 912A2A8F27278D26268C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C26268C28288D29298E2C2C902F + 2F913434943939963F3F9A44449C49499F4E4EA25151A35353A43A3A8516165A + 12125612125612125614145918185F1B1B641F1F6923236F2626742929782C2C + 7D2F2F8131318434348836368B38388E3939903B3B933C3C953E3E973F3F983F + 3F9940409A41419B41419B41419B40409A40409A3F3F993F3F983E3E973C3C95 + 3B3B9339399038388E3C3C8D43438F3E3E8A3232822C2C7D2929782626742222 + 6E1F1F691B1B6418185F14145912125612125612125613135821217728288D27 + 278D28288E4C4CA17070B48E8EC3A2A2CEAAAAD2A7A7D19999C98686BF7070B4 + 5C5CA94A4A9F3B3B983232932C2C9028288D26268C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C26268C27278D28288D2A2A + 8F2E2E913131923636953B3B9841419B47479E4C4CA15151A35353A44949971F + 1F6612125612125612125613135817175D1A1A631F1F6922226E252574292979 + 2C2C7E2F2F8232328634348A37378D3939913B3B943D3D973F3F9940409C4242 + 9D43439F4343A04444A14545A24545A24545A34545A34545A24545A24444A143 + 43A042429E42429D40409C40409948489B54549F55559D505099474793383889 + 2F2F822C2C7D28287825257422226E1E1E691A1A6317175D1313581212561212 + 561616591D1D6825258527278D25258C40409A6565AE8686BF9E9ECCAAAAD2AA + AAD29F9FCC8D8DC37878B86363AC4F4FA240409A3434942E2E9128288E27278D + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C26268C27278D + 28288E2B2B8F2E2E913333933838963E3E9944449C4A4A9F4F4FA25353A45454 + A332327C12125612125612125612125615155C1A1A621D1D6821216D25257328 + 28782C2C7E2F2F8232328735358B38388F3A3A933D3D963F3F9941419C43439F + 4444A14646A44747A54848A74848A74949A94A4AAA4A4AAA4A4AAA4A4AAA4A4A + AA4A4AAA4949A94848A74848A74646A54646A45151A76060AC6060AA4E4EA04B + 4B9C55559F4F4F9A3B3B8D3232872F2F822C2C7D28287825257221216D1D1D67 + 19196115155B12125616165919195C16165A1F1F7627278D26268C3434945959 + A87B7BBA9797C8A7A7D1ABABD3A4A4CF9494C78080BC6969B05555A544449C38 + 38962F2F912A2A8F27278D26268C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C26268C26 + 268C28288D29298E2C2C903030923434943A3A9740409A46469E4C4CA15151A3 + 5555A54E4E9C21216812125612125612125614145A1818601C1C6620206C2424 + 722828772B2B7D2F2F8232328735358B3838903B3B943E3E9840409C42429E44 + 44A14646A44848A74949A94A4AAA4B4BAC4C4CAD4D4DAF4E4EB04E4EB04E4EB1 + 4E4EB14E4EB14E4EB14E4EB04E4EB04D4DAF4C4CAD4B4BAC5757AF6B6BB76A6A + B55656AA4545A142429E5050A25A5AA452529E41419435358B3232872F2F822B + 2B7D28287724247121216C2020681C1C611C1C5F1A1A5D141458121256191968 + 27278A26268C29298E4D4DA17171B49090C4A4A4CFACACD3A8A8D19A9ACA8686 + BF7070B45B5BA849499F3A3A973131922B2B8F28288D26268C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C26268C27278D28288E2A2A8F2E2E913232933737953D3D9943439C49499F4F + 4FA25353A45656A641418D16165A12125612125612125616165D1A1A631F1F69 + 2323702727752A2A7B2F2F8132328635358B3838903B3B943E3E9840409C4343 + A04545A34747A64949A94B4BAB4C4CAD4E4EAF4F4FB15050B35151B45252B552 + 52B65252B65353B75353B75353B75353B75252B65252B65252B55151B45A5AB7 + 7373C07474BF5B5BB34D4DAC4949A94747A64545A34F4FA45E5EA85757A44444 + 9738389035358B32328630308133337F34347C3131782C2C712424691B1B6013 + 135612125612125615155D23238127278D25258C42429B6666AE8787C09F9FCC + ABABD3ABABD3A0A0CD8D8DC37777B76161AC4D4DA13E3E993333932C2C902828 + 8E26268C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C26268C27278D28288E2B2B8F2E2E913434943939963F3F9A4545 + 9D4B4BA05151A35555A55555A42E2E7612125512125512125514145918185F1D + 1D6621216C2525722929782D2D7E30308334348938388E3B3B923E3E9740409B + 43439F4646A34848A64A4AA94C4CAC4E4EAE4F4FB15050B25252B55353B65454 + B75454B85555B95656BA5656BB5656BB5656BB5656BB5656BB5656BB5656BA55 + 55B95C5CBC7676C67C7CC76262BB5252B34F4FB14E4EAE4C4CAC4A4AA94848A6 + 5454A96262AC5A5AA649499B3E3E9440409248489346468E40408736367F2C2C + 7624246D1D1D6618185E1313571212551212551212561E1E7227278D26268C37 + 37955C5CA97E7EBB9999C9AAAAD2ADADD4A4A4CF9393C67E7EBB6767AF5252A4 + 41419B3535952E2E9129298E27278D25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C26268C28288D29298E2C2C903030923535953A3A97 + 41419B47479E4D4DA15252A45656A64C4C991D1D631212551212551212551616 + 5B1A1A621F1F6823236F2727752B2B7C2F2F8133338736368C3A3A923D3D9640 + 409B43439F4646A34848A64A4AA94C4CAC4E4EAF5050B25252B55353B65454B8 + 5555BA5656BB5757BC5858BE5858BE5959BF5959BF5959C05959C05959C05959 + C05959BF5959BF5959BF6C6CC68787D06E6EC55555BA5454B85353B65252B450 + 50B24E4EAF4C4CAC4C4CAA5454AB6464B06161AC5757A45858A254549D464694 + 3A3A8A3131822B2B7A27277522226E1F1F681A1A6215155A1212561212551212 + 5518186526268A26268C2D2D905151A37575B69393C6A7A7D1AEAED4A9A9D199 + 99C98484BE6D6DB25757A745459D3838962F2F912A2A8F27278D26268C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C26268C27278D28288D2A2A8F2E2E9131319237 + 37953D3D9943439C4A4A9F5050A35454A55757A73C3C86141458121255121255 + 13135718185F1D1D6621216C2525722A2A792D2D7E32328535358A39398F3C3C + 943F3F9942429D4545A24848A64A4AA94D4DAD4E4EB05050B25252B55454B755 + 55BA5656BB5858BD5858BE5959C05A5AC15B5BC25B5BC35C5CC35C5CC45C5CC4 + 5C5CC45C5CC45C5CC45C5CC45C5CC35B5BC26E6EC98C8CD57474CA5A5ABF5858 + BD5656BB5555BA5454B75252B55050B24E4EB04D4DAD5656AE6666B36464AF58 + 58A745459B3F3F9638388F3535893131832D2D7E29297929297326266E222268 + 1C1C6016165916165915155816165E23238127278D25258C46469E6C6CB18C8C + C3A4A4CFAEAED4ABABD39E9ECC8A8AC17373B55D5DA94A4A9F3B3B983131922B + 2B8F28288D26268C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C26268C27278D28288E2B2B8F2E2E + 913333933939963F3F9A45459D4B4BA05151A35656A65454A229297012125512 + 125512125515155A1A1A611F1F6823236F2727752B2B7C30308233338737378D + 3B3B923E3E9742429C4444A04747A54A4AA94C4CAC4E4EB05050B25252B55454 + B85656BA5757BC5858BE5959C05A5AC15B5BC35C5CC45D5DC45D5DC65E5EC65E + 5EC75E5EC75E5EC75E5EC75E5EC75E5EC75E5EC75E5EC75E5EC66565C87E7ED2 + 8B8BD67373CC5E5EC25959C05858BE5757BC5656BA5454B85252B55050B24E4E + AF5454AF5656AE4A4AA64444A041419C3E3E973D3D933C3C8F3D3D8B3F3F8938 + 388233337B2E2E7527276D2222661B1B5F17175A17175A17175A1F1F7427278D + 25258C3D3D996363AC8585BF9F9FCCADADD4AEAED4A3A3CE9090C47979B86262 + AC4E4EA23F3F9A3434942D2D9028288E26268C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C26268C27278D29298E + 2C2C902F2F913434943A3A9740409A47479E4D4DA15353A45757A64F4F9C1E1E + 6312125512125512125617175C1B1B6420206B2525712929782D2D7E32328535 + 358A3939903D3D9540409A43439F4646A34949A84C4CAC4E4EAF5050B25252B5 + 5454B85656BB5757BC5959BF5A5AC05B5BC25C5CC45D5DC45E5EC65E5EC75E5E + C75F5FC86060C96060C96060C96060C96060C96060C96060C96060C96060C960 + 60C95F5FC86565CA8181D49292DA7575CE5E5EC55B5BC25A5AC05858BE5757BC + 5656BA5454B85252B55050B24E4EAF4B4BAB4949A74848A44E4EA35252A25353 + 9E4F4F9942428F3C3C893535812D2D7929297322226B1E1E641A1A5E16165917 + 175A19195C1C1C6A26268A26268C3434945959A87D7DBA9999C9AAAAD2AFAFD5 + A6A6D09595C77F7FBB6868AF5353A442429B3636952E2E9129298E27278D2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C26268C28 + 288D29298E2D2D903030923535953C3C9842429B49499F4F4FA25454A55757A7 + 43438E15155A11115511115514145918185F1D1D6722226D2626742A2A7A2E2E + 8133338736368C3A3A923D3D9741419D4444A14747A64A4AAA4D4DAE4F4FB151 + 51B55353B75555BA5656BC5A5AC05F5FC36161C46262C66363C76464C96363C9 + 6464CA6565CB6464CB6565CD6464CC6363CC6161CC6060CC6060CC6060CC6060 + CC6060CC6060CB6060CB6060CB5F5FC96464CB8080D68F8FDB7A7AD15F5FC75B + 5BC45A5AC25959C15757BE5656BC5555BA5353B75151B54F4FB15252B06161B3 + 6262B15D5DAC5050A34242993C3C9338388D3232862E2E802A2A792525732020 + 6C1C1C6518185F13135812125615155819196125258526268C2C2C905050A374 + 74B59292C6A7A7D1AFAFD5AAAAD29A9ACA8585BF6E6EB25858A746469E3A3A97 + 3030922A2A8F28288D26268C25258C02000002000025258C25258C25258C2626 + 8C27278D28288E2A2A8F2E2E913232933737953E3E9944449C4B4BA05151A356 + 56A65858A733337C11115511115511115515155B1A1A621F1F69232370282876 + 2C2C7D30308334348938388F3C3C943F3F9A43439F4646A44949A84B4BAC4E4E + B05050B35252B65454B95656BC5757BE5D5DC16262C56464C76565C86565C966 + 66CA6565CB6666CB6767CD6666CD6666CE6767CE6666CE6666CE6565CE6262CD + 6161CD6161CD6161CD6161CD6161CC6161CC6161CC6060CC6060CB6767CE7C7C + D59393DD7A7AD26262C95D5DC65B5BC45A5AC25959C05757BE5656BB5656BA5E + 5EBB6F6FC06B6BBB5D5DB35050AB4646A342429E3F3F993B3B9437378E343489 + 3030822B2B7C27277522226E1D1D6719196014145912125612125616165B2222 + 7C26268C25258C45459D6A6AB18B8BC2A3A3CEADADD4ABABD39E9ECC8B8BC275 + 75B65E5EAA4B4BA03D3D993333932C2C9028288E26268C02000002000025258C + 25258C26268C27278D28288E2B2B8F2E2E9134349439399640409A46469E4C4C + A15252A45757A65454A225256C11115511115512125617175D1C1C6420206B25 + 25722929792E2E8032328636368C3A3A923D3D9741419C4444A14747A64A4AAA + 4D4DAE4F4FB25151B55353B85555BB5757BE5959C05C5CC36464C76565C86666 + CA6767CB6767CC6767CB6868CD6767CD6868CE6868CE6767CE6767CF6868CF67 + 67CF6767CF6666CE6363CE6262CE6262CD6262CD6262CD6262CD6161CD6161CC + 6161CC6161CC6868CE8282D88F8FDC7B7BD46565CB5D5DC75C5CC55B5BC45A5A + C25959C06969C57A7AC96F6FC35C5CB94F4FB14C4CAD4A4AA94747A54444A040 + 409B3D3D9639399035358B3131852D2D7E2828772424711F1F691A1A6216165B + 1111551111551313561E1E7227278D25258C3B3B986060AB8282BD9D9DCBABAB + D3ACACD3A3A3CE9191C57B7BBA6565AE5151A341419B3636952E2E9129298E02 + 000002000025258C26268C28288D29298E2C2C903030923535953A3A9741419B + 48489E4E4EA25353A45757A74B4B971A1A5F11115511115514145918185F1D1D + 6722226E2626742B2B7B2F2F8233338837378E3B3B943F3F9942429E4545A348 + 48A84B4BAC4E4EB05050B35353B75454BA5656BC5858BF5959C15B5BC36060C6 + 6767CA6767CA6868CC6868CC6969CE6969CE6868CE6969CE6868CE6868CF6969 + CF6868CF6868D06868D06767D06767D06464CF6262CE6262CE6262CE6262CE62 + 62CE6262CD6262CD6161CD6161CC6161CC6666CE8080D89595DF7878D35F5FC9 + 5D5DC75D5DC65E5EC56A6AC88282D17474CA5A5ABE5454B95252B65050B34D4D + AF4B4BAC4848A74545A342429D3E3E983A3A9236368C3232862E2E802A2A7A25 + 257320206C1C1C6517175E1313571111551212561A1A6726268A26268C323293 + 5656A67979B89595C7A7A7D1ACACD3A6A6D09797C88282BD6C6CB15757A74646 + 9E3A3A9731319202000002000027278D28288D2A2A8F2E2E913232933737953D + 3D9943439C4A4A9F5050A35454A55757A73E3E8814145811115511115515155B + 1A1A621F1F692323702828772C2C7D30308335358A3939903C3C9640409B4444 + A04747A54A4AA94D4DAE4F4FB25151B55353B85555BB5757BE5959C05A5AC25B + 5BC45C5CC66464C96969CB6969CC6969CD6A6ACE6969CF6A6ACF6A6ACF6969CF + 6A6ACF6969CF6969D06969D06868D06868D06868D06767D06565CF6262CE6262 + CE6262CE6262CE6262CE6262CE6262CE6262CD6262CD6161CD6161CC7979D597 + 97E18080D75F5FCA5F5FC95E5EC86E6ECD8383D57676CE6060C45959C05757BE + 5555BB5353B85151B54E4EB14C4CAD4949A94646A443439F3F3F9A3C3C943838 + 8F3434893030822B2B7C27277522226E1D1D6718185F14145911115512125517 + 175F24248426268C28288D4A4A9F6E6EB28C8CC3A2A2CEAAAAD2A8A8D19C9CCB + 8989C17474B55E5EAA4C4CA13F3F9A02000002000028288E2B2B8F2E2E913333 + 933939963F3F9A45459D4B4BA05151A35656A65555A42E2E7611115511115512 + 125617175D1C1C6420206B2525722929792E2E8032328636368C3A3A923D3D97 + 41419D4545A24848A64B4BAB4D4DAF5050B35252B65454BA5656BC5858BF5959 + C15B5BC35C5CC55D5DC75E5EC86565CB6B6BCD6B6BCE6A6ACF6B6BCF6B6BCF68 + 68CF6868CF6969CF6868CF6868D06868D06969D06969D06868D06868D06868D0 + 6565CF6262CE6262CE6262CE6262CE6262CE6262CE6262CE6262CE6262CD6262 + CD6B6BD18B8BDD8D8DDD6D6DD16060CC6060CB6B6BCE8484D87F7FD56464CA5C + 5CC45B5BC35959C15757BE5656BC5454B95252B65050B24D4DAE4A4AAA4747A6 + 4444A140409C3D3D9639399035358B3131842D2D7E2828772424701F1F691A1A + 6215155B11115512125617175B22227C27278D25258C3E3E996262AC8282BD9A + 9ACAA7A7D1A9A9D19F9FCC8F8FC47B7BBA6767AF5454A50200000200002C2C90 + 3030923434943A3A9740409A47479E4D4DA15252A45757A64C4C991D1D631111 + 5511115514145918185F1D1D6722226D2626742B2B7B2F2F8233338837378E3B + 3B943F3F9942429F4646A44949A94C4CAD4E4EB15151B55353B85555BB5757BE + 5959C05A5AC25B5BC45C5CC65D5DC75E5EC85F5FC96666CC6C6CCF6C6CD06C6C + CF6B6BD06B6BD06464CE6262CD6262CE6262CE6262CE6464CF6969D06969D069 + 69D06868D06868D06565CF6262CE6262CE6262CE6262CE6262CE6262CE6262CE + 6262CE6262CE6262CE7E7ED89898E27A7AD76363CE6161CC6060CC8181D88585 + D96A6ACD5E5EC85D5DC75C5CC65B5BC45A5AC25858BF5757BD5555BA5353B750 + 50B34E4EB04B4BAC4848A74545A342429D3E3E983A3A9236368C3232862E2E80 + 2A2A7925257220206B1C1C6417175D1212561212561616591F1F7127278C2626 + 8C3131925454A57575B69191C5A2A2CEA7A7D1A2A2CE9595C78383BE6F6FB302 + 00000200003232933737953C3C9843439C49499F4F4FA25353A45757A641418C + 15155A11115511115515155B1A1A621F1F692323702828772C2C7D3030833434 + 8A3939903C3C9640409B4444A04747A54A4AAA4D4DAE4F4FB25151B55454B956 + 56BC5757BE5959C15B5BC35C5CC45D5DC75E5EC85F5FC95F5FC96060CB6767CE + 6D6DD06D6DD06D6DD16D6DD06C6CD06464CF6262CE6262CE6262CE6262CE6464 + CF6969D06969D06969D06969D06868D06666CF6262CE6262CE6262CE6262CE62 + 62CE6262CE6262CE6262CE6262CE6464CF8D8DDE9292E06969D06262CD6161CD + 7070D28F8FDE7272D36060CB5F5FC95F5FC95D5DC75D5DC65C5CC45A5AC35959 + C05757BE5555BB5353B85151B54F4FB14C4CAD4949A94646A443439F3F3F9A3C + 3C9438388F3434892F2F822B2B7B26267422226D1D1D6718185F141459131356 + 18185B1A1A6425258826268C25258C45459D6767AF8484BE9898C9A3A3CEA2A2 + CE9999C98A8AC10200000200003939963F3F9A45459D4B4BA05050A35454A555 + 55A42D2D7611115511115512125717175E1B1B6420206B2424722929792D2D80 + 31318635358C3939923D3D9741419D4545A24848A64B4BAC4D4DB04F4FB35252 + B75454BA5656BD5757BF5959C25A5AC45B5BC65C5CC75D5DC85E5EC95E5ECA5F + 5FCB6060CC6868CE6D6DD16C6CD16D6DD16D6DD16C6CD16363CF6161CE6161CE + 6161CE6161CE6363CF6969D06969D06868D06868D06868D06565CF6161CE6161 + CE6161CE6161CE6161CE6161CE6161CE6161CE6262CE7070D49696E27F7FDA61 + 61CE6161CD6666CF8282DA8686DB6262CD6060CC5F5FCB5E5ECA5E5EC95D5DC8 + 5C5CC75B5BC55A5AC35858C15757BF5555BC5454BA5353B75151B34D4DAE4B4B + AB4747A64343A03F3F9B3C3C9638389034348A3030832C2C7D2727762323701E + 1E681A1A6215155B16165918185B16165D22227E27278D26268C3434945555A5 + 7474B58C8CC29A9ACA9E9ECC9A9ACA02000002000040409A46469E4C4CA15151 + A35555A54B4B991D1D6311115511115514145A1818601D1D6722226E2626742A + 2A7B2F2F8233338837378E3B3B943E3E994444A04D4DA65555AC5858B15A5AB5 + 5858B75353B85454BB5656BE5858C05959C25B5BC45C5CC65D5DC75E5EC95E5E + C95F5FCB6060CC6060CC6060CC6868CF6E6ED16E6ED16D6DD26D6DD26C6CD163 + 63CF6161CE6161CE6161CE6161CE6363CF6969D06969D06969D06868D06868D0 + 6565CF6161CE6161CE6161CE6161CE6161CE6161CE6161CE6161CE6464CF7B7B + D89595E27272D46161CE6262CE7272D48A8ADD7676D56161CD6161CC6060CC5F + 5FCB5F5FCB5E5EC95D5DC85D5DC75B5BC65A5AC45959C25D5DC26868C46A6AC2 + 6A6AC16B6BBF6262B85959B14F4FAA4646A441419D3D3D9739399235358C3131 + 862D2D8029297924247220206B1B1B641A1A6019195C1616591212561C1C7028 + 288C27278D25258C41419B5F5FAB7979B88C8CC29595C702000002000048489E + 4D4DA15252A45555A53B3B8613135811115512125616165C1A1A631F1F692323 + 702828772C2C7D30308334348A3838903C3C963F3F9B4747A25555AA5A5AB05E + 5EB46060B86262BB6464BE6161C05858BF5858C15A5AC35B5BC55C5CC75D5DC8 + 5E5EC95E5ECA5F5FCB6060CC6060CC6060CC6060CD6969CF6F6FD16E6ED26E6E + D26D6DD26D6DD26363CF6161CE6161CE6161CE6161CE6363CF6A6AD16A6AD169 + 69D06969D06868D06565CF6262CE6363CF6161CE6161CE6161CE6161CE6464CF + 6262CE6868D18989DE8D8DDF6969D16161CE6565CF8080D98B8BDE6969D06262 + CD6161CD6161CC6060CC6060CC5F5FCB5E5EC95E5EC95D5DC85D5DC86565C879 + 79CF8484D18686D18383CD8080CA7A7AC57575C26868B85858AF4646A442429F + 3E3E993B3B9437378E3333882F2F822A2A7B26267422226E1E1E681E1E641C1C + 6012125611115517176226268628288D26268C29298E46469E6161AC7575B602 + 00000200004F4FA25252A44F4F9E27276F11115511115514145918185F1C1C66 + 21216C2525732929792E2E8031318535358B3939913D3D9741419C4848A35656 + AB5C5CB05F5FB46161B86464BC6767BF6868C36969C46666C55B5BC35B5BC55C + 5CC65D5DC75E5EC95F5FCA5F5FCA6060CB6060CB6060CC6161CC6161CC6A6AD0 + 6F6FD26F6FD16E6ED16E6ED16D6DD16464CE6161CD6161CD6161CD6161CD6363 + CE6A6AD06A6AD06A6AD06969D06969D06A6AD07272D47676D57B7BD87A7AD77A + 7AD77D7DD87C7CD87878D68383DB9A9AE48383DB6363CE6363CE6A6AD18686DC + 8181D96565CF6262CC6262CC6161CC6161CC6060CB6060CB5F5FCA5E5EC95E5E + C96C6CCD8383D58F8FD98C8CD78989D48585D08484CE8282CB7D7DC77979C36F + 6FBD5B5BB14646A54343A03F3F9A3C3C9538388F3434893030832C2C7D282877 + 23237024246C25256919195E12125611115516165B23237D28288E28288D2626 + 8C28288E40409A0200000200005151A339398415155911115512125716165C1A + 1A621E1E6923236F2727762B2B7C2F2F8233338837378E3B3B933E3E9942429E + 4949A45959AD5D5DB16161B66363BA6666BD6868C06A6AC36C6CC66D6DC86D6D + C96969CA5D5DC65E5EC85E5EC95F5FCA6060CB6060CB6060CB6060CC6161CC61 + 61CC6161CD6A6AD06F6FD26F6FD26F6FD16E6ED16D6DD16464CE6161CD6161CD + 6161CD6161CD6363CE6A6AD06A6AD06A6AD06A6AD06B6BD08282DA9292E19B9B + E49393E19494E19494E19595E29393E19393E19A9AE48F8FDF7474D56464CE64 + 64CE7272D48B8BDE7777D66464CF6363CE6262CD6262CC6262CC6161CC6060CB + 6060CB5F5FCA6666CD8181D69292DD9191DC8A8AD77E7ED17070CA6969C67272 + C87C7CCA7F7FC97B7BC46E6EBD5454AE4747A64444A141419C3D3D9739399135 + 358B3131852E2E802929792929752C2C7323236A181860141459121256151558 + 1A1A6726268828288E28288D27278D0200000200002020671111551111551515 + 5B1919601D1D6621216D2525732929782D2D7E31318535358A3838903C3C953F + 3F9B4343A04A4AA65959AE5F5FB46262B86565BA6767BE6969C16B6BC46D6DC7 + 6E6EC97070CB7070CC7070CD6C6CCD6060CA5F5FCA6060CB6060CB6060CC6060 + CC6161CC6161CC6262CD6464CE6C6CD07070D26F6FD26F6FD26F6FD16E6ED164 + 64CE6161CD6161CD6161CD6161CD6363CE6B6BD06B6BD06A6AD06A6AD07070D3 + 9B9BE49393E06A6AD07777D67777D67878D67070D37474D47474D56969D06F6F + D26868D06565CE6565CE7878D68B8BDE7070D36363CE6363CE6363CE6262CD62 + 62CC6262CC6161CC6060CB6060CB7474D39090DD9393DE8F8FDB7676D15F5FC6 + 5C5CC35B5BC25C5CC16868C47A7AC98080CA7C7CC66767BA4E4EAD4848A74545 + A242429E3E3E993B3B9337378E3333882F2F822E2E7D32327C2D2D752020691B + 1B6316165D1313571111551313581F1F7529298E29298E020000020000121256 + 15155A18185F1C1C651F1F6A2424702727762B2B7C2F2F8233338737378D3A3A + 923D3D9741419D4444A14C4CA75C5CB06060B56464B96666BC6868C06B6BC26D + 6DC56E6EC76F6FCA7070CB7171CC7272CE7272CF7272CF6D6DCF6161CB6060CB + 6060CC6161CC6161CC6464CE6A6AD06E6ED17070D27070D27070D27070D26F6F + D26F6FD26E6ED16464CE6161CD6161CD6161CD6161CD6363CE6B6BD06B6BD06B + 6BD06A6AD07777D59C9CE48484DB6767CF6767CF6262CD6161CD6161CD6161CD + 6161CD6262CD6464CE6565CE6565CE6666CE7777D68F8FE06868CF6363CE6363 + CE6363CE6363CE6262CD6262CC6262CC6161CC6464CE8383D99595E19595E082 + 82D86262CA5D5DC75C5CC65B5BC45A5AC25858C06969C57F7FCD8080CA7474C3 + 5656B44C4CAD4949A94646A54343A03F3F9B3C3C9538389035358A3232853939 + 8536368028287421216D1E1E6719196116165C12125711115515155F23237C02 + 00000200001818601C1C651F1F6A22226F2626742929792E2E8031318535358A + 38388F3B3B943F3F9A42429E4545A34E4EAA5E5EB26363B76565BB6868BE6A6A + C16C6CC46D6DC66C6CC76767C87272CC7272CD7373CF7373CF7373D17474D274 + 74D16E6ED06161CC6161CC6565CD6C6CD17272D27272D27272D27272D27171D2 + 7070D27070D27070D26F6FD26F6FD16464CE6161CD6161CD6161CD6161CD6464 + CE6C6CD06C6CD06B6BD06B6BD07D7DD79898E38888DC6969D06868CF6868CF65 + 65CE6363CE6161CD6262CD6565CE6666CF6666CF6565CE6666CF7878D68F8FDF + 6A6AD16363CE6363CE6363CE6363CE6363CE6262CD6262CD6262CC6A6ACF8C8C + DE9797E19292DF7272D25F5FCA5E5EC95D5DC75C5CC65B5BC55A5AC36060C37D + 7DCE8585D07F7FCB5D5DBB4F4FB24D4DAE4A4AAA4747A64444A141419D3D3D97 + 3A3A9237378D40408E3E3E8A2F2F7F28287724247120206B1C1C661919611616 + 5C1313581111550200000200001F1F6A22226F2525742929792C2C7D2F2F8233 + 338836368D3939923D3D9740409C4343A14646A54B4BAA5E5EB36363B86666BB + 6868BF6B6BC26D6DC56E6EC86C6CC85F5FC55B5BC66767CB7373CF7373D07474 + D17474D27474D27474D27474D26E6ED16C6CD07373D37373D37373D37272D371 + 71D27171D27171D27070D27070D27070D26F6FD26E6ED16262CE6060CD6060CD + 6060CD6060CD6262CE6B6BD16B6BD16B6BD06A6AD07D7DD89B9BE48484DB6B6B + D16868D06767CF6767CF6767CF6464CE6464CE6666CF6666CF6565CF6565CF66 + 66CF7B7BD78888DD6E6ED36060CD6161CD6262CE6262CE6262CE6262CE6161CD + 6161CD6C6CD08D8DDF9797E38E8EDE6B6BD05F5FCB5E5ECA5D5DC95D5DC85C5C + C65B5BC55C5CC47C7CD08888D48282CF6262C05252B74F4FB34D4DB04A4AAB48 + 48A84444A342429F3E3E9A3B3B954646974848943333872D2D802A2A7B262676 + 2323701F1F6B1D1D661A1A6217175F0200000200002626742929792C2C7D2F2F + 8232328735358B3838903C3C953E3E9A41419E4444A34747A74A4AAB5757B365 + 65BB6868BE6A6AC06C6CC36D6DC56F6FC86E6ECA6060C65B5BC65C5CC75D5DC9 + 6868CD7575D17575D27575D27575D37575D37575D37575D37575D37474D37373 + D37373D37373D37272D37171D27171D27171D27070D27070D27070D26969D060 + 60CD6060CD6060CD6060CD6060CD6060CD6767CF6B6BD16B6BD16B6BD07373D4 + 9E9EE58686DB6B6BD16969D06868D06767CF6767CF6767CF6767CF6666CF6666 + CF6666CF6565CF6565CF7D7DD88484DB6B6BD16060CD6060CD6161CD6262CE62 + 62CE6262CE6262CE6161CD6A6AD18C8CDE9898E39292E07474D46060CB5F5FCB + 5E5ECA5D5DC95D5DC85C5CC76868CB8484D58B8BD78181D16262C35454BA5252 + B85050B44E4EB14B4BAE4848A94646A54343A141419C49499D51519D38388F33 + 33893030842D2D7F29297A26267624247121216D1E1E690200000200002D2D7F + 2F2F8232328735358B37378F3A3A943D3D9840409D4343A14646A54848A94B4B + AD4E4EB16262BA6969BF6B6BC26D6DC56F6FC67171C96E6ECA6161C75C5CC65C + 5CC75D5DC95E5ECA5E5ECA6A6ACF7676D27676D37676D37676D37575D47575D4 + 7575D37474D37474D37373D37373D37373D37272D37171D27171D26F6FD26D6D + D16969D06161CD6060CD6060CD6060CD6060CD6060CD6060CD6161CD6767CF69 + 69D06A6AD07272D39E9EE58585DB6B6BD16969D06969D06868D06868D06767CF + 6767CF6767CF6666CF6666CF6666CF6565CF7979D78989DD6969D06060CD6060 + CD6060CD6161CD6262CE6262CE6262CE6262CE6565CF8585DB9999E49797E286 + 86DC6969D05F5FCB5F5FCB5E5ECA5D5DC96161CA7777D28F8FDB8E8ED98080D2 + 5F5FC35656BE5555BC5353B95151B64F4FB34C4CAF4A4AAB4747A74747A55353 + A75555A43E3E9839399136368D3333883030842D2D802B2B7C29297826267402 + 000002000033338835358C3838903A3A943D3D9840409C4242A04545A44747A7 + 4A4AAB4C4CAF4E4EB25151B56767BF6D6DC36F6FC67070C97272CA7373CB6A6A + CB5C5CC75D5DC85D5DC95E5ECA5F5FCB5F5FCB5F5FCB6A6AD07777D37777D376 + 76D47676D47575D47575D47575D37474D37474D37373D37373D37171D26B6BD1 + 6767CF6363CE6161CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060 + CD6060CD6060CD6060CD6262CE7272D49A9AE38D8DDE6A6AD06A6AD16C6CD16D + 6DD26C6CD16969D06B6BD16767CF6A6AD06666CF6666CF6262CE6A6AD18C8CDF + 6D6DD26060CD6060CD6060CD6060CD6262CE6262CE6262CE6262CE6262CE7575 + D59494E19999E49595E28383DA6C6CD16464CD6060CB6767CD7878D48D8DDB91 + 91DD9090DC7676D05B5BC45858C15757BF5555BD5353BA5252B75050B44E4EB1 + 4B4BAD4E4EAC5B5BAF5757AA43439E3E3E993D3D9641419543439341418F3F3F + 8C3B3B883838840200000200003939913B3B943D3D9840409C4242A04444A247 + 47A64949AA4B4BAE4E4EB15050B45252B75454BA6868C37171C77272C97373CB + 7474CD7575CE7575CF6969CC5D5DC95E5ECA5F5FCB5F5FCB5F5FCC5F5FCC6060 + CC6B6BD07777D47676D47676D47676D47575D47575D47575D37474D37070D268 + 68D06363CE6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD + 6060CD6060CD6060CD6060CD6060CD6060CD6060CD6C6CD29191E19393E18383 + DB8686DB8B8BDD8787DC8888DC8686DC8B8BDE8D8DDE8484DB7373D46363CE60 + 60CD6D6DD28989DD7676D66060CD6060CD6060CD6262CE6363CE6363CE6262CE + 6262CE6262CE6868D08181DA9797E39999E49797E38E8EDF8080D97D7DD78484 + DA9292E09595DF9292DE8888D96767CC5B5BC65A5AC35959C25858C05656BD54 + 54BB5252B85151B54E4EB25757B36666B75757AE4646A44343A04848A05757A5 + 5B5BA353539E4F4F9A4D4D974A4A940200000200003E3E9940409D4242A04444 + A24646A64848A94B4BAC4D4DB04F4FB35151B55252B85454BB5656BD6363C373 + 73CA7474CB7575CE7676CF7676D07777D17878D16A6ACE5F5FCB5F5FCB5F5FCC + 6060CC6060CC6060CD6060CD6B6BD17777D47676D47676D47676D47575D47272 + D36969D06161CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD60 + 60CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6262CE + 7575D58E8EDF9898E39797E39393E19898E39898E39E9EE59696E29797E29F9F + E58383DB6363CE6060CD6868D08484DB8181DA6161CE6060CD6262CE6464CE64 + 64CE6363CE6363CE6262CE6262CE6363CE6B6BD18787DD9595E29999E49898E3 + 9696E29696E29797E29696E19494E18A8ADC6E6ED05F5FC95C5CC75B5BC65A5A + C45959C35858C15656BE5555BC5353BA5252B75E5EBA7070C05555B24A4AAB47 + 47A75252AA6464AF5555A749499F48489C4747994242960200000200004343A1 + 4545A44747A64848A94A4AAC4C4CAF4E4EB25050B45252B75353BA5555BC5656 + BE5858C05B5BC36D6DCA7777CE7878D07878D17979D27878D27979D47A7AD36B + 6BCF5F5FCC6060CC6060CC6060CD6060CD6060CD6060CD6B6BD07676D47676D4 + 7575D46C6CD16262CE6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060 + CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD60 + 60CD6060CD6060CD6060CD6E6ED37171D46F6FD37171D47575D57676D67070D2 + 7373D47979D69393E18E8EDF6A6AD16060CD6363CE7B7BD88B8BDE6B6BD26262 + CE6464CE6464CE6464CE6363CE6363CE6363CE6262CE6161CD6161CD6C6CD27B + 7BD89090E09696E39999E49797E29696E28D8DDE8080D86B6BD05F5FCB5E5ECA + 5D5DC95C5CC75C5CC65B5BC55959C35959C25757C05656BD5656BC6A6AC26F6F + C25454B54D4DB04C4CAD6262B56767B54E4EA84343A141419E40409C3E3E9902 + 00000200004747A84848AA4A4AAC4C4CAF4D4DB24F4FB45151B75252B95454BC + 5555BD5757C05858C25858C35A5AC55C5CC77070CD7878D17979D27979D37979 + D47A7AD47A7AD57878D46C6CD05F5FCC5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F + 5FCD6363CE6565CF6363CE5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD + 5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5F + CD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD6060CD5F5FCD5F5FCD5F + 5FCD5F5FCD6161CE6262CE6161CD7A7AD89797E37575D65F5FCD5F5FCD6F6FD3 + 8C8CDF7C7CD86565CF6464CF6363CE6363CE6363CE6363CE6262CE6161CE5F5F + CD5F5FCD5F5FCD6161CE6767D07979D77B7BD87C7CD87A7AD66F6FD26363CE5E + 5ECB5E5ECB5E5ECB5D5DCA5C5CC95C5CC85B5BC75A5AC65959C45858C25858C1 + 6060C37979CB6666C25252B84F4FB55353B46F6FBE6969BB4C4CAD4747A84545 + A64343A24242A10200000200004B4BAE4C4CB04D4DB24F4FB45151B75252B953 + 53BB5454BD5656BF5757C15858C35959C45A5AC65B5BC75C5CC85F5FC97171D0 + 7A7AD47B7BD47A7AD47A7AD57B7BD57B7BD57A7AD56C6CD15F5FCD5F5FCD5F5F + CD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F + 5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD + 5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5F + CD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD6E6ED39696E38181DA63 + 63CF5F5FCD6363CE8484DC8C8CDE6F6FD46464CF6464CF6363CE6363CE6363CE + 6262CE5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD6060CE6363CE6363CF5F5F + CD5F5FCC5F5FCC5E5ECC5E5ECB5E5ECB5E5ECB5D5DCA5C5CC95C5CC95B5BC75A + 5AC65A5AC55C5CC57171CC7C7CCF5E5EC25454BC5353BA6262BE7B7BC76262BB + 4C4CB04B4BAE4949AB4848AA4747A80200000200004F4FB35050B55151B65252 + B95353BA5454BC5656BE5757BF5858C15959C35A5AC45B5BC55B5BC65C5CC85C + 5CC85D5DC96060CB7373D17B7BD37B7BD47B7BD47B7BD47B7BD57B7BD57A7AD5 + 6C6CD05F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC6565 + CE8787DC9393E16C6CD15F5FCC6262CD7171D39292E08080D86767CF6464CE64 + 64CE6363CD6262CD5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCB5F5FCB5E5ECB5E5ECA5E5ECA5E5E + CA5D5DC95C5CC85C5CC75B5BC66A6ACB8181D27272CB5858C05656BF5B5BBF74 + 74C87C7CCA5D5DBB5050B54F4FB34D4DB14C4CAF4B4BAD0200000200005252B7 + 5353B95454BB5555BC5656BE5757BF5858C15959C35A5AC45A5AC55B5BC65C5C + C75C5CC85D5DC95E5ECA5E5ECA5E5ECA6060CC7373D27C7CD47C7CD47B7BD57B + 7BD57B7BD57B7BD57A7AD56C6CD05F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC6060CD7171D39A9AE38080D96464CD6666CE6666CE8383DA9494 + E06F6FD26565CE6464CE6262CD5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCB5F5FCB + 5E5ECB5E5ECA5E5ECA5E5ECA5D5DC95C5CC86262C97E7ED47E7ED36363C85959 + C35858C16969C78383D07373C85858BD5353B95252B75151B64F4FB44F4FB302 + 00000200005454BC5555BD5656BF5757C05858C15959C35A5AC45A5AC55B5BC6 + 5C5CC75C5CC85D5DC95D5DC95E5ECA5E5ECA5E5ECA5E5ECB5F5FCB6262CC7474 + D37C7CD57C7CD57B7BD57B7BD57B7BD57B7BD57979D46464CE5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC6565CE8989DD9393E07676D46767CE + 6767CE6C6CD18888DC9090DE7171D36363CD6060CC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCB5F5FCB5E5ECB5E5ECB5E5ECA5E5ECA6161CB7C7CD58787DA + 6C6CCD5C5CC65A5AC55F5FC67E7ED28282D26464C65757BF5555BD5454BC5353 + BA5353B95252B80200000200005757C05858C15858C25959C35A5AC45A5AC55B + 5BC65C5CC75C5CC85C5CC85D5DC95E5ECA5E5ECA5E5ECA5E5ECB5E5ECB5F5FCB + 5F5FCB5F5FCC6262CD7474D37C7CD57C7CD57B7BD57B7BD57B7BD57B7BD56666 + CE5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC6060CC7373D496 + 96E18E8EDE6D6DD06767CE6767CE7272D39191DF8989DD6C6CD15F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCB5F5FCB5E5ECB6161CB7A + 7AD58C8CDC7272D15E5EC95C5CC85C5CC76868CB8E8ED97B7BD25D5DC55858C2 + 5858C15757BF5656BF5555BD5454BC0200000200005959C35A5AC45A5AC55B5B + C55B5BC65C5CC75C5CC85C5CC85D5DC95E5ECA5E5ECA5E5ECA5E5ECB5E5ECB5F + 5FCB5F5FCB5F5FCC5F5FCC5F5FCC5F5FCC7171D27C7CD57C7CD57C7CD57B7BD5 + 7B7BD57979D46464CE5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC6B6BD19595E19898E27373D46767CF6767CE6767CE7676D58B8BDD89 + 89DC7272D36060CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CB6363CC7E7ED78A8ADC7777D45E5ECA5E5ECA5D5DC95D5DC96666CB8888D981 + 81D66E6ECD5A5AC55A5AC45959C35858C25858C15757C00200000200005A5AC5 + 5A5AC65B5BC75B5BC85B5BC85C5CC95C5CC95D5DCA5D5DCA5D5DCA5D5DCA5D5D + CB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC6565CE7B7BD57C7CD57C + 7CD57B7BD57B7BD57A7AD56E6ED15E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC6464CE8686DC9797E27E7ED86C6CD16767CF6666CF6666 + CE6767CE7272D38B8BDE8A8ADE7171D36060CD5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC6161CD6C6CD28282DA8B8BDD7676D55D5DCB5D5DCB5D5DCA5D5DCA5D5D + CA5E5ECA6A6ACE8484D98B8BDA6D6DCE5B5BC65A5AC55959C55959C45858C302 + 00000200005B5BC85B5BC85C5CC95C5CC95C5CC95D5DCA5D5DCA5D5DCA5D5DCB + 5D5DCB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC7171 + D27C7CD67C7CD67C7CD57C7CD57B7BD57777D46161CD5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CE8484DB9B9BE47A7AD76464CE6666CF + 6767CF6767CF6666CF6666CE6666CE7070D28181DA8E8EDF8383DA6E6ED26363 + CE5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC6C6CD17979D78989DD8686DC7171D46060CD5E5ECB5E5ECB + 5D5DCB5D5DCB5D5DCA5D5DCA5D5DCA6565CD8B8BDB8C8CDB7070D05E5EC95B5B + C75A5AC65A5AC60200000200005C5CC95D5DCA5D5DCA5D5DCA5D5DCA5D5DCA5D + 5DCB5D5DCB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC6363CE7B7BD57C7CD67C7CD67C7CD57C7CD57C7CD56B6BD05E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CE8282DA9696E27E7ED860 + 60CD5E5ECC6262CD6767CF6767CF6666CF6666CF6666CE6565CE6767CF7272D4 + 8D8DDF8A8ADD8080D97474D56A6AD16464CE5F5FCC5E5ECC5E5ECC6060CD6161 + CD6060CD5F5FCC6666CF6E6ED27C7CD88585DB8C8CDE7D7DD86A6AD15E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECB5E5ECB5D5DCB5D5DCB5D5DCA5D5DCA6666CD8787DB + 9191DF7474D35F5FCA5B5BC85B5BC80200000200005D5DCA5D5DCA5D5DCB5D5D + CB5D5DCB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC6E6ED17D7DD67D7DD67C7CD67C7CD67C7CD67777D4 + 5F5FCC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CE8181DA9898 + E37F7FD96161CD5E5ECC5E5ECC5F5FCC6666CF6767CF6767CF6767CF6666CF66 + 66CE6262CD5F5FCC6262CE7C7CD88484DB8A8ADD8585DB7F7FD97C7CD87272D4 + 7B7BD87979D67676D57373D48181DA8585DB8484DB8989DD7B7BD86F6FD36161 + CD5E5ECC5E5ECC5F5FCC6060CD5F5FCC5E5ECC5E5ECC5E5ECB5E5ECB5E5ECB5D + 5DCB5D5DCB6767CE8787DB8E8EDE7676D46161CC5D5DCA0200000200005E5ECB + 5E5ECB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5F5FCC7777D47E7ED67D7DD67D7DD67C + 7CD67C7CD66B6BD05E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6363CE + 8282DA9595E28282DA6464CE5E5ECC5E5ECC5E5ECC5E5ECC6262CD6767CF6767 + CF6868D07373D47070D26464CE5F5FCC5E5ECC6161CD6868D07171D47B7BD781 + 81DA8282DA8888DC8282DA8282DA8282DA8989DD7F7FD97979D67676D66969D0 + 5E5ECC5E5ECC5E5ECC5E5ECC6060CD7878D67676D66868D05E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECB5E5ECB5E5ECB6969CF8282D99292E07171D35F5FCC02 + 00000200005E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6666CF7C7CD57E7E + D67E7ED67D7DD67D7DD67979D56262CD5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5F5FCC6161CD6363CE6363CE6161CD5F5F + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC7676D59999E38282DA6464CE5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5F5FCC6767CF6767CF7B7BD79696E29595E17A7AD66868D05E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC6060CD6565CF6565CF6868D06969D06969D16161CD6161CD64 + 64CE6060CD5E5ECC5E5ECC5F5FCC6262CD6F6FD38585DB9494E19898E38282DA + 6060CD5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CF9393 + E08484DA6363CD0200000200005E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC63 + 63CE6D6DD17272D27171D27171D27171D27171D27171D27171D27171D27070D2 + 7676D47E7ED67E7ED67E7ED67D7DD67D7DD67272D25F5FCC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6262CD6969CF7070D27373D37373D3 + 7373D37272D26E6ED16767CF6161CD5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC6262CE8A8ADE9393E16C6CD25E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC6666CE7D7DD89797E29898E29898E29C9CE48E8EDE + 7A7AD66868CF6262CD6262CD6262CD6161CD6161CD6161CD6161CD6060CD5F5F + CC5E5ECC5E5ECC5E5ECC5E5ECC5F5FCC6666CF7070D38181DA9292E09595E281 + 81DA8383DB9393E18181DA6464CE5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5F5FCC7272D49090E08181DA5E5ECC0200000200005D5DCC5D5DCC5D5DCC5D5D + CC5D5DCC6868D07A7AD57D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D + 7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67C7CD66969D05D5DCC + 5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5D + CC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6767CF7373D37575D475 + 75D37474D37474D37373D37373D37272D37272D36F6FD26565CF5D5DCC5D5DCC + 5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6262CE7F7FD99999E47B7BD86161 + CE5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5E5ECC7070D39D9DE49595E17575D574 + 74D58888DC9696E29C9CE49191E18787DC7A7AD77070D36767D06363CE6363CE + 6262CE6161CD6161CD5E5ECC5D5DCC6363CE6E6ED37A7AD78585DC9292E19494 + E18585DC7171D46161CD6060CD7676D69494E28888DD6464CF5D5DCC5D5DCC5D + 5DCC5D5DCC5D5DCC7171D48F8FE08C8CDF6C6CD25D5DCC0200000200005D5DCC + 5D5DCC5D5DCC5D5DCC6464CE7C7CD67D7DD67D7DD67D7DD67D7DD67D7DD67D7D + D67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67A + 7AD56363CE5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC + 5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6A6AD07676 + D47676D47575D47575D37575D37474D37474D37373D37373D37373D37272D371 + 71D26868CF5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6868D1 + 8B8BDE9696E27B7BD86565CF5D5DCC5D5DCC5D5DCC5E5ECC7070D49292E09696 + E17878D66767CF6767CF6767CF7272D48080D99090E09595E19595E19494E07F + 7FD96666CF6363CE6363CE6262CE6161CD6161CD5E5ECC7D7DD98E8EDF9191E1 + 8E8EDF8181DA7070D46464CF5D5DCC5D5DCC5D5DCC5F5FCD7A7AD79494E28787 + DD6868D05D5DCC5D5DCC5D5DCC7171D48F8FE09191E17272D45D5DCC5D5DCC02 + 00000200005D5DCB5D5DCB5D5DCB5D5DCB7171D27D7DD57D7DD57D7DD57D7DD5 + 7D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7D + D57D7DD57D7DD57777D35E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 6868CE7777D37676D37676D37676D37575D37272D26F6FD16E6ED17171D17373 + D27373D27272D27272D27171D26565CE5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5E5ECB6B6BD18A8ADE9898E37B7BD76060CC5D5DCB5D5DCB6F6FD3 + 8F8FDF9191E07373D36969CE6868CE6767CE6767CE6767CE6767CE6D6DD07676 + D58080D99B9BE39595E16C6CD16363CD6363CD6363CD6262CD6161CC6161CC87 + 87DC9696E37575D56363CD6262CD5E5ECC5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 6363CD7777D69393E18B8BDE6767CF5E5ECB6F6FD29090E09191E07373D45D5D + CB5D5DCB5D5DCB0200000200005D5DCB5D5DCB5D5DCB5D5DCB7A7AD47D7DD57D + 7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD5 + 7D7DD57D7DD57D7DD57D7DD57D7DD56F6FD15D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB6161CC7575D37777D37777D37676D37474D26868CF6161CC5D5DCB + 5D5DCB6161CC6868CE7171D17373D27272D27272D26F6FD16060CC5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6969D08B8BDE9999E47C7CD863 + 63CD7272D48F8FE08E8EDF6F6FD26464CD6868CF6868CE6868CE6767CE6767CE + 6767CE6666CE6565CE6767CF8888DC9696E16E6ED16363CD6363CD6363CD6363 + CD6262CD6868CF8888DC8D8DDF5E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB6060CC7979D69393E18686DC7B7BD78F8FDF9292E1 + 7272D45E5ECC5D5DCB5D5DCB5D5DCB0200000200005D5DCB5D5DCB5D5DCB5D5D + CB7B7BD57D7DD57D7DD57D7DD57D7DD57D7DD57C7CD57C7CD57C7CD57C7CD57C + 7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57272D26060CC5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB6A6ACF7878D47878D47777D37474D26464CD5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6363CD7171D27373D27272D27272D2 + 6767CE5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6666 + CF8787DC9999E48C8CDE9393E19090E06E6ED25D5DCB5E5ECB6565CD6868CE68 + 68CE6767CE6767CE6767CE6666CE6666CE6969D08686DB9494E17070D26464CD + 6363CD6363CD6363CD6262CD6969CF8787DC8989DD6161CD5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6262CD7474D58C8CDE98 + 98E38C8CDE7373D45D5DCB5D5DCB5D5DCB5D5DCB5D5DCB0200000200005D5DCB + 5D5DCB5D5DCB5D5DCB7B7BD57D7DD57D7DD57D7DD57D7DD57878D46565CE6565 + CD6565CD6565CD6565CD6565CD6565CD6565CD6565CD6565CE6262CD5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5E5ECB7373D27878D47878D47777 + D36969CF5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6868CE73 + 73D27373D27272D26E6ED05E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB6565CE7E7ED99090E08989DD6F6FD25D5DCB5D5DCB5D5D + CB5D5DCB5F5FCC6060CC6060CC6060CC6060CC6060CC5F5FCC6262CD8686DB8F + 8FDF6C6CD16363CD6464CD6363CD6363CD6363CD6565CE8787DC8C8CDE6464CE + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5E5ECB6B6BD17272D46D6DD15E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB02 + 00000200005D5DCB5D5DCB5D5DCB5D5DCB7B7BD57D7DD57D7DD57D7DD57D7DD5 + 7676D35D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6161CC7878D4 + 7878D47878D47575D36161CC5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB6161CC7171D17373D27373D27171D26060CC5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6363CD6868CF6666CF5E5ECB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB8686DC8E8EDF6A6AD06363CD6565CD6464CD6363CD6363CD6363CD86 + 86DC8D8DDF6767CF5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5E5ECC5E5ECB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB0200000200005C5CCB5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D + 7DD57D7DD57D7DD57575D35D5DCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB6363CD7777D47878D47777D47171D25C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6D6DD17272D27272D27171D26161CD5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB8181DA8F8FE06868D06262CD6464CD6464CD6363 + CD6262CD6464CE8787DD8B8BDE6666CF5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005C5CCB5C5CCB5C5CCB5C5C + CB7B7BD57D7DD57D7DD57D7DD57D7DD57575D35D5DCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB6363CD7878D47979D47878D47171D25C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6E6ED17373D27272D2 + 7272D26161CD5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5F5FCC7D7DD99191E16969D06262CD + 6464CE6464CD6363CD6363CD6262CD8888DD8B8BDE6565CF5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005C5CCB + 5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D7DD57D7DD57D7DD57575D35C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6060CC7878D47979D47979D47575 + D36060CC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6060CC71 + 71D27474D37373D27272D25F5FCC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6161CD8181DA8E + 8EDF6868D06363CD6464CE6464CE6464CD6363CD6464CE7F7FDA9090E06363CE + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB02 + 00000200005C5CCB5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D7DD57D7DD57D7DD5 + 7777D46464CE6464CD6464CD6464CD6464CD6464CD6464CD6464CD6464CD6464 + CE6161CD5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5D5DCB7474D3 + 7979D47979D47878D46969CF5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB6868CF7474D37474D37474D36F6FD15D5DCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5E5ECC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC6161CD8181DA9797E27474D56969D07171D36E6ED16F6FD16C6CD17373D489 + 89DE9090E06363CE5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB0200000200005C5CCB5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D + 7DD57D7DD57D7DD57D7DD57B7BD57B7BD57B7BD57B7BD57B7BD57B7BD57B7BD5 + 7B7BD57B7BD57B7BD57B7BD57171D25F5FCC5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB6A6ACF7979D47979D47979D47676D36464CD5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB6363CD7272D27575D37474D37474D36767CE5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5D5DCB6666CE6A6ACF6A6ACF6969CF6969CF + 6868CF6868CF6868CF6767CE7A7AD69696E29999E49595E19090DF9191E09191 + E09797E39898E39393E17C7CD85E5ECC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005C5CCB5C5CCB5C5CCB5C5C + CB7979D47D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D + 7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD56F6FD15C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB6060CC7777D47979D47979D47979D47676D369 + 69CF6060CC5C5CCB5C5CCB6060CC6868CF7474D37676D37575D37575D37272D2 + 6060CC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6565CE6B6BD06B6BD06B + 6BD06A6ACF6969CF6969CF6969CF6868CF6868CF6A6AD07B7BD78989DC8B8BDD + 8C8CDE8F8FDF8E8EDF8282DA8787DD7878D66363CE5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005B5BCB + 5B5BCB5B5BCB5B5BCB7070D27C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7C + D57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD575 + 75D35C5CCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB + 5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB6767CF7979D47979 + D47979D47878D47777D47474D37070D27070D27373D37676D47575D37575D375 + 75D37474D36565CE5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB + 5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5C5CCB6969 + CF6B6BD06A6AD06A6AD06A6AD06969CF6969CF6969CF6868CF6767CF6767CF68 + 68CF6B6BD06A6AD06D6DD16666CE6464CE6969D06565CF5D5DCC5B5BCB5B5BCB + 5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5B + CB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB02 + 00000200005B5BCA5B5BCA5B5BCA5B5BCA6262CC7B7BD47C7CD57C7CD57C7CD5 + 7C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7C + D57C7CD57C7CD57979D46161CC5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA6B6BCF7979D47979D47878D37878D37777D37777D37777D37777D37676 + D37676D37575D37575D26969CE5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5E5ECB6A6ACF6C6CCF6B6BCF6A6ACF6A6ACF6A6ACF6969CF6969CE6969 + CE6868CE6767CE6767CE6767CE6666CE6666CE6565CD6565CD6464CD5D5DCB5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA0200000200005B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6767CE79 + 79D47C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD5 + 7C7CD57C7CD57C7CD57C7CD57C7CD57B7BD46767CE5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA6767CE7575D37979D47878D37878D37777D3 + 7777D37777D37777D37676D37373D26666CE5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA6161CC6C6CCF6C6CCF6C6CCF6B6BCF6A6ACF6A6ACF + 6A6ACF6969CF6969CE6969CE6868CE6767CE6767CE6767CE6666CE6565CD6464 + CD5F5FCB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA0200000200005B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA6060CC6A6ACF6F6FD06E6ED06E6ED06E6ED06E6ED06E6ED06E + 6ED06E6ED06E6ED07373D27C7CD57C7CD57C7CD57C7CD57C7CD57070D15C5CCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6060CB6969CE73 + 73D27777D37777D37777D37676D37272D16868CE6060CB5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6767CE6D6DD06C6CD06C6CCF6C + 6CCF6B6BCF6767CE6363CD6464CD6363CD6363CD6363CC6363CC6262CC6262CC + 6262CC6060CC5D5DCB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA0200000200005B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6464CD7A7AD47C7CD57C7CD57C7CD57C + 7CD57878D36060CB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5C5CCA5F5FCB6262CC6262CC5F5FCB5C5CCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5E5ECB6C6CCF6D6D + D06D6DD06C6CD06C6CCF6A6ACF6060CB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA02 + 00000200005B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5C5CCA7575D27C7C + D57C7CD57C7CD57C7CD57C7CD56969CF5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 6363CD6E6ED06E6ED06D6DD06D6DD06C6CD06969CE5C5CCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA0200000200005A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA6B6BD07B7BD57B7BD57B7BD57B7BD57B7BD57575D35B5BCA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5B5BCA6B6BCF6D6DD06D6DD06D6DD06C6CD06C6CD06363CD5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA0200000200005A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5F5FCC7979D47B7BD57B7BD57B7BD57B7BD57B7BD5 + 6868CF5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA6363CD6F6FD16E6ED06E6ED06D6DD06D6DD06B + 6BD05D5DCB5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA0200000200005A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA6F6FD17B7BD57B7BD57B + 7BD57B7BD57B7BD57676D35D5DCB5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5D5DCB6C6CD06F6FD16F6FD16E6E + D06D6DD06D6DD06666CE5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA02 + 00000200005A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA6262 + CD7A7AD47B7BD57B7BD57B7BD57B7BD57B7BD56C6CD05A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5AC95959C85959C85959C75959C76565CC7070D0 + 6F6FD06F6FD16F6FD16E6ED06D6DD05F5FCC5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA0200000200005A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA6E6ED07B7BD57B7BD57B7BD57B7BD57B7BD57979D46060 + CC5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95A5AC95A5ACA5A5ACA + 5A5ACA5A5ACA5A5AC95A5AC95A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95959C75858C55757C45656C25A + 5AC36C6CCB6E6ECD6F6FCF6F6FD06F6FD16F6FD16666CE5A5AC95A5AC95A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5AC95A5AC95A5AC95A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95A5AC95A5AC95A5AC9 + 5A5AC95A5AC95A5AC95A5ACA5A5ACA0200000200005A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5D5DCB7171D17B7BD57B7BD57B7BD57B7BD5 + 7B7BD57B7BD56363CD5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95A5AC95959C85959C75858C55858C458 + 58C45858C55858C55858C55858C45858C45858C45858C55959C75959C75959C8 + 5959C85959C85959C85959C75959C75959C75959C85959C75858C45656C25555 + BF5353BB5252B95858BA6969C16A6AC56C6CC96D6DCC6D6DCE6D6DCE6666CB59 + 59C55858C45858C55858C65959C75959C85959C85959C85959C85959C85959C8 + 5959C85959C85959C75959C75858C55858C45858C45858C45858C45858C65959 + C75959C75959C75959C85959C85959C75959C75959C75959C75858C55858C458 + 58C45757C45757C35757C35757C45858C45858C55959C70200000200005959CA + 5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959 + CA5959CA5959CA5959CA5959CA5959CA5959CA5C5CCB7070D17A7AD57A7AD57A + 7AD57A7AD57A7AD57A7AD57878D45F5FCC5959CA5959CA5959CA5959CA5959CA + 5959CA5959CA5959CA5959CA5959CA5959CA5959C95858C85757C65656C25454 + C05353BD5353BD5353BD5353BD5353BD5353BD5353BC5353BC5353BD5353BD54 + 54BF5555C05656C25555C15555C15656C25555C15555C15555C15656C25555C1 + 5353BD5252BA5050B54D4DB04B4BAB5050AC6161B56464BA6666BF6969C56969 + C66868C66868C56060C15454BD5353BD5454BE5555C05656C25656C25656C256 + 56C25656C25656C25555C15555C15555C05454BF5353BD5353BD5353BC5353BC + 5353BD5454BF5454C05555C05555C05656C25656C25555C15555C15555C15454 + C05454BE5353BD5353BD5252BB5252BB5252BB5353BC5353BD5454BF5555C102 + 00000200005959C95959C95959C95959C95959C95959C95959C95959C95959C9 + 5959C95959C95959C95959C95959C95959C95959C95959C95B5BCA7070D17A7A + D47A7AD47A7AD47A7AD47A7AD47A7AD47A7AD46969CE5959C95959C95959C959 + 59C95959C95959C95959C95959C95959C95959C95959C95959C95858C75757C3 + 5555C05252BA5050B54F4FB34F4FB24F4FB14F4FB24F4FB34E4EB14E4EB04D4D + AF4E4EB14E4EB14F4FB35151B65151B85151B75151B75151B85151B85151B751 + 51B75151B85151B74F4FB34D4DAE4B4BA94848A245459B45459B5050A35C5CAB + 6060B36363B86565BC6363BA6161B86161B75A5AB54F4FB14F4FB35050B55151 + B85252B85151B85151B85252B85151B85151B75151B75151B64F4FB34E4EB14E + 4EB14E4EB14E4EB14F4FB25050B55151B65151B65151B65151B85151B85151B8 + 5151B85151B85050B54F4FB34F4FB24F4FB14E4EB14E4EB14E4EB04E4EB04E4E + B14F4FB35151B80200000200005959C95959C95959C95959C95959C95959C959 + 59C95959C95959C95959C95959C95959C95959C95959C95959C95959C95C5CCA + 7070D17A7AD47A7AD47A7AD47A7AD47A7AD47A7AD47A7AD46969CE5959C95959 + C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959C959 + 59C85757C55555C05252B94F4FB14B4BAA4A4AA84A4AA64949A64A4AA74A4AA7 + 4949A44848A24848A24848A24848A24949A64B4BA94C4CAB4B4BA94B4BAA4C4C + AC4C4CAC4B4BA94C4CAB4C4CAD4C4CAB4A4AA64848A246469E4242953E3E8D3E + 3E8D4141924C4C9A5757A35B5BAA5E5EAE5D5DAC5A5AA95959A85959A85454A7 + 4B4BA64B4BA94C4CAD4D4DAD4C4CAC4C4CAD4D4DAD4C4CAC4B4BA94B4BA94A4A + A84848A34747A04747A04747A04747A14848A34A4AA84B4BAA4B4BA94B4BA94C + 4CAC4C4CAC4C4CAB4C4CAB4C4CAC4B4BA94A4AA64949A54949A54949A44848A2 + 4747A14747A14848A24949A64D4DAD0200000200005959C95959C95959C95959 + C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959C959 + 59C95C5CCA7070D17A7AD47A7AD47A7AD47A7AD47A7AD47A7AD47A7AD46969CE + 5959C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959 + C95959C95959C95858C75656C25252BA4F4FB14A4AA646469E45459B44449A44 + 449944449A44449A42429540409141419241419241419242429444449A45459B + 44449A44449A46469E45459D44449A45459B46469E45459C4343974242944141 + 923D3D8A3939813939813B3B853C3C8846468F52529954549D53539A51519751 + 51975050985151994D4D9945459A46469E46469E45459D46469E46469E45459C + 4444994444994343974040913E3E8D3F3F8F40408F4040904141934444994545 + 9B44449944449A45459D45459D45459B45459B45459D44449A43439743439743 + 43984343974242944141924141924141934343984848A20200000200005959C9 + 5959C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959 + C95959C95959C95C5CCA7070D17A7AD47A7AD47A7AD47A7AD47A7AD47A7AD47A + 7AD46969CE5959C95959C95959C95959C95959C95959C95959C95F5FCB6161CC + 5F5FCB5959C95959C95959C95959C95858C75454BF5050B54B4BAA46469E4242 + 9441419240409140408F4040914040903D3D8A3B3B853B3B853B3B863B3B853C + 3C883E3E8C3E3E8D3D3D8B3E3E8C3F3F8F3E3E8D3D3D8B3E3E8C40408F42428F + 4D4D926D6DA45D5D9A3A3A8236367A35357937377D37377D38387F4242874D4D + 8F4B4B8C4949884A4A8A4B4B8C4A4A8C4B4B8D4848914141924040913F3F8F40 + 408F4040913E3E8D3D3D8A3D3D8B3C3C883A3A8238387F3939813A3A843B3B84 + 3C3C883E3E8D40408F3E3E8C3E3E8C40408F3F3F8F3E3E8C3F3F8E40408F3E3E + 8D3D3D8B3E3E8C3F3F8F3E3E8D3D3D8B3C3C883C3C883C3C883F3F8E44449A02 + 00000200005959C95959C95959C95959C95959C95959C95959C95959C95959C9 + 5959C95959C95959C95959C95B5BCA7070D07A7AD47A7AD47A7AD47A7AD47A7A + D47A7AD47A7AD46969CE5959C95959C95959C95959C95959C95959C95959C969 + 69CE7878D37A7AD47878D36B6BCF5D5DCA5959C95959C95858C65454BE4F4FB3 + 4A4AA743439840408F3F3F8E3E3E8D3E3E8C3E3E8D3E3E8C3B3B8438387F3939 + 8039398038387F3939803B3B853B3B853939813939813B3B843A3A8338387F3B + 3B824646894C4C8A7777A3E8E8E8B7B7C939398035357835357736367A363679 + 35357837377D41418447478445458147478347478647478647478749498B4747 + 8E3D3D883B3B853B3B863C3C883A3A843939803A3A8239398036367934347636 + 367937377D37377D3939803C3C873C3C883A3A833A3A823B3B863B3B853A3A82 + 3A3A843C3C873A3A843A3A823B3B843C3C883C3C873A3A843939813939803939 + 813C3C884242950200000200005959C95959C95959C95959C95959C95959C959 + 59C95959C95959C95959C95959C95959C95959C96868CE7A7AD47A7AD47A7AD4 + 7A7AD47A7AD47A7AD47A7AD46969CE5959C95959C95959C95959C95959C95959 + C95959C96969CE7A7AD47A7AD47A7AD47A7AD47A7AD47575D26767CE5A5AC958 + 58C65454BD4F4FB35F5FAF6F6FAD6161A13E3E8D3E3E8D3E3E8C4949936A6AA3 + 67679D38387F38387F39398037377D38387F3A3A843A3A8438387F38387E3939 + 8138387E3E3E7D4747814C4C884C4C877777A2EBEBEBBBBBCC57579164649736 + 367A37377D36367A35357837377C5B5B946A6A9A5A5A8D464683484885474785 + 47478649498B4B4B8D4242893A3A823A3A833A3A8439398037377D3939805959 + 9262629362629135357735357936367A37377D3A3A843B3B8439398038387F3A + 3A8239398138387E39398068689D66669A4E4E8B39398051519167679C66669A + 38387E38387E3939803C3C884343970200000200005858C95858C95858C95858 + C95858C95858C95858C95858C95858C95858C95858C95858C95959C97070D179 + 79D47979D47979D47979D47979D47878D36868CE5858C95858C95858C95858C9 + 5858C95858C95858C96868CE7979D47979D47979D47979D47979D47979D47979 + D47979D47474D26464CB6363C5C5C5E0ECECECECECECEAEAEAB0B0CC3F3F8F83 + 83B4E6E6E6E3E3E3E3E3E3D7D7DC5B5B963A3A8466669DE3E3E3B4B4C93B3B88 + 66669DE2E2E2B6B6C848488573739DE9E9E9C0C0D04D4D8A7A7AA7F1F1F1E9E9 + E9E6E6E6E3E3E3C7C7D1505090393981434385C1C1CFE3E3E3E3E3E3E3E3E3A3 + A3BC4A4A8B4A4A8A9292B5E4E4E49393B848488E8A8AB2E3E3E38989B1393983 + 5B5B95CBCBD5E0E0E0E2E2E2E2E2E2E0E0E05A5A9366669BE4E4E4B5B5CA3C3C + 8967679EE3E3E3B5B5C9393983383880C4C4D3E7E7E7E9E9E9BCBCCEAFAFC7E9 + E9E9E6E6E6E4E4E4D6D6DB7D7DA93B3B883F3F8F44449C0200000200005858C9 + 5858C95858C95858C95858C95858C95858C95858C95858C95858C95858C95858 + C95959C97474D27979D47979D47979D47979D47979D46C6CD05858C95858C958 + 58C95858C95858C95858C95858C96868CE7979D37979D37979D37979D37979D3 + 7979D47979D47979D47979D47979D47878D2C6C6EAF8F8F8C0C0DE7979BA8A8A + BEB8B8D46666AAF6F6F6E5E5EB7B7BB49191BDECECECDDDDE23E3E8F6C6CA7E9 + E9E9BBBBD14949957676A8E7E7E7BDBDCE50508D7878A5EEEEEEC6C6D7525293 + 8080B1FBFBFBD5D5E38080B2B1B1CBE9E9E9ADADC83D3D8CB2B2CCECECECA7A7 + C76C6CA8CACADAE9E9E99696BB5050959999BFEAEAEA9999C04F4F999090BAE9 + E9E98E8EB83D3D8CD7D7E1EAEAEA8F8FBB6C6CA66B6BA59999BE60609F6D6DA7 + ECECECBBBBD14141946C6CA7E9E9E9BABACF3D3D8C6B6BA4ECECECD5D5DF4646 + 8C5252929090B860609E3D3D8C4A4A93E6E6E6D8D8DD4040924343984747A302 + 00000200005858C95858C95858C95858C95858C95858C95858C95858C95858C8 + 5858C85757C75757C65757C47070CD7676CF7676CF7777D07777D07777D07171 + CD5D5DC65656C45656C45656C55757C65757C66666CB7676CF7676CE7676CE76 + 76CE7676CE7676CE7676CE7676CE7777D07777D17878D27878D2FFFFFFFFFFFF + 7777C36464B45D5DAA5555A49D9DCBFFFFFFA7A7D14646A045459ED4D4E5F4F4 + F47474B27E7EB5F6F6F6C9C9DD5E5EA58484B7F2F2F2C6C6D857579A8080B1F7 + F7F7CDCDDF58589E8585BAFFFFFFD4D4E75C5CA56464A7F7F7F7F2F2F2424297 + FAFAFAF8F8F85151A344449B8282B9F5F5F5C9C9DC55559FA2A2CBF5F5F5A1A1 + CC5656A89999C8F5F5F59797C77575B5FBFBFBDEDEEA7575B77474B57373B472 + 72B25050A27474B5F7F7F7C4C4DD4747A27474B5F2F2F2C2C2DA44449B7272B2 + F2F2F2C2C2D83F3F913E3E8E3F3F8F8A8ABCBABAD6DCDCE7EFEFEFDFDFE54646 + 9F4848A54C4CAD0200000200005858C95858C95858C95858C95858C95858C958 + 58C95858C85757C75656C55555C35454BF5252BC6262C17171C67171C77171C7 + 7272C87272C87171C76D6DC45A5ABF5252BC5353BE5454BF6363C47373C97272 + C87171C77070C57070C57070C47070C47070C57171C77272C87373CA7575CD76 + 76CFFFFFFFFFFFFF6F6FC36A6AB96565B06262ABA6A6D0FFFFFF9D9DCE4848A6 + 4848A4CECEE6FFFFFF8585BE8A8AC0FFFFFFD5D5E96363AE8A8AC0FEFEFECFCF + E35B5BA28787BAFFFFFFD4D4E75D5DA58888BEFFFFFFD4D4E95F5FAA5E5EA9FF + FFFFFFFFFF5050A2FFFFFFFFFFFF4848A44C4CA58585BEFFFFFFD3D3E75A5AA7 + A8A8D2FFFFFFAAAAD75757B2A0A0D3FFFFFF9F9FD37B7BC2FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFDFDFD7B7BC27B7BC2FFFFFFCFCFE94D4DB17C7CC3FEFEFECC + CCE64B4BAB7A7AC0FBFBFBC9C9E246469F44449C9C9CCBFFFFFFFFFFFFFFFFFF + C0C0E06D6DBA4C4CAE4E4EB25050B80200000200005858C95858C95858C95858 + C95858C95858C95858C95858C85656C55555C15252BC5050B64E4EB25252B167 + 67B96A6ABA6B6BBB6C6CBD6B6BBC6A6ABA6A6AB96767B85454B34E4EB35E5EBA + 6E6EC06D6DBF6C6CBD6B6BBB6A6ABA6A6AB96969B86161B55E5EB46A6ABA6C6C + BD6E6EC17272C87474CBDADAF1FFFFFFB2B2DF6A6AB97979BAABABD29595C5FF + FFFFE6E6F35454AC6D6DB8FFFFFFFFFFFF6B6BB08C8CC1FFFFFFE0E0EF6E6EB4 + ABABD2FFFFFFDFDFEE6868ABA9A9CFFFFFFFD4D4E85555A48484BEFFFFFFDFDF + EE6B6BB28A8AC2FFFFFFE9E9F35C5CA7DCDCEDFFFFFFA0A0D05B5BAAC9C9E2FF + FFFFB2B2D55B5BA8A8A8D3FFFFFFC0C0E35353B8C5C5E7FFFFFFA2A2D95D5DBD + F3F3FAE8E8F65252BC5252BCDCDCF1FFFFFF6868C37F7FCCFFFFFFDCDCF25E5E + C0A2A2DAFFFFFFD1D1EC5050B87F7FC9FFFFFFD0D0EA4C4CAE4B4BACCFCFE9FF + FFFF9595D14F4FB55050B87E7ECB5151BA5252BC5454BF0200000200005858C9 + 5858C95858C95858C95858C95858C95858C95757C65555C15252BC4F4FB44B4B + AB4848A54747A24E4EA55E5EAA6262AC6464AF6262AC6060A96060A96161AA5E + 5EAA5959AA6666B26666B46666B36565B06363AE6262AC6262AB5959A647479E + 45459E4D4DA25959A96565B36D6DBE7070C58D8DD2F6F6FBFFFFFFFFFFFFFFFF + FFD4D4E65C5CA1B7B7D7FFFFFFFFFFFFFFFFFFFFFFFF9494C76060A88A8AC0FF + FFFFF5F5F9FFFFFFFFFFFFFFFFFFD4D4E7FFFFFFFFFFFFFFFFFF9E9ECB434399 + 7676B5FFFFFFF4F4F9FFFFFFFFFFFFFFFFFFA7A7CD5959A17A7AB4F3F3F9FFFF + FFFFFFFFFFFFFFDEDEEC6363A75858A2A7A7D0FFFFFFF4F4FAFFFFFFFFFFFFFF + FFFF7777CE5555C29A9ADBFFFFFFE8E8F7DDDDF3FFFFFFBBBBE75555C38282D3 + FFFFFFF4F4FBFFFFFFFFFFFFFFFFFFA4A4DE5555C1FFFFFFFFFFFFFFFFFFFFFF + FFD1D1EC8B8BD0FFFFFFF4F4FBD1D1EEF4F4FBD2D2EE5555C15555C35656C302 + 00000200005757C85757C85757C85757C85757C85757C85757C75555C35252BC + 4E4EB44949A944449D4040943F3F913F3F9145459256569A5B5B9E59599C5656 + 9756569656569757579759599B5C5CA15D5DA35D5DA35C5CA15C5CA05B5B9E52 + 52994141913D3D8C3D3D8C3E3E8F3F3F9147479D5959AE6565BB6D6DC07979C5 + A6A6D6ACACD3A8A8CC6D6DA554549543438E7E7EB49999C59A9AC76666A94747 + 975B5BA16767A78787B97D7DB47272AEA6A6CB9B9BC455559D6666A79C9CC88D + 8DC03F3F913D3D8C4A4A947272AC7171A96C6CA6A5A5CA9A9AC3535396535395 + 5252956969A3A4A4C8A4A4CA9898C15D5D9D5151965252986A6AAA7C7CBE6565 + BB7F7FCDA4A4DE8383D55757C75757C75757C76D6DCEA5A5E1A5A5E18F8FDA57 + 57C75757C76262CB8484D67979D26D6DCEA5A5E19A9ADD5757C75757C7A5A5E1 + FFFFFFDDDDF38282D37676CD5454C26C6CCBA4A4E0A5A5E0A5A5E16D6DCE5757 + C75757C75757C70200000200005757C85757C85757C85757C85757C85757C857 + 57C75454C25151B94C4CAE4646A23F3F923B3B883A3A85393984393983414189 + 52529352528F4F4F8A4F4F894F4F8A4F4F8951518D5454935656975656975555 + 955555954E4E923F3F8C3B3B873939823838813838813A3A853F3F914747A24C + 4CAD5656B66464BA6868B65F5FA656569651518D4E4E8A3D3D823838813B3B88 + 3C3C8A3C3C8942428E5656985757985757975858995656974E4E9043438E3F3F + 8F3E3E8F3E3E8E3D3D8D3B3B873838813838813939823B3B844A4A8C52529351 + 51914E4E8D4D4D8B4D4D8B4D4D8B4E4E8E5050924E4E8F4C4C8B4C4C8D4B4B8F + 43439145459E4B4BAD5050B85454C15656C65757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C857 + 57C85757C88484D7FFFFFFD2D2F05656C65656C65656C65757C75757C75757C7 + 5757C85757C85757C85757C85757C80200000200005757C85757C85757C85757 + C85757C85757C85757C75454C14F4FB74A4AAB44449D3D3D8C38388137377E36 + 367C36367B3838804040874C4C884B4B834A4A824A4A824A4A804B4B834F4F8A + 51518D51518D51518D4B4B8C3C3C883A3A8639398236367C35357A35357A3737 + 7D3C3C8A45459E4A4AAB4D4DB15E5EB76767B45D5DA35353914D4D8649498139 + 397934347837377F393983393982404088545494555594555594555594545492 + 47478A3B3B883C3C8B3C3C8B3C3C8A3B3B8838388135357935357935357A3636 + 7C39398148488A4D4D8A4A4A854949844949834949834A4A864C4C8B4A4A8648 + 48844646833D3D833C3C8A4343994A4AA94F4FB75454C05656C65757C85757C8 + 5757C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C857 + 57C85757C85757C85757C85757C85757C85757C85757C80200000200005757C8 + 5757C85757C85757C85757C85757C85757C75454C04F4FB77474BC5959A63C3C + 8B37377F36367B3535793434774D4D8B65659C3E3E834848824A4A814A4A8048 + 487E49497F56568C7777A27777A152528C3B3B845B5B975B5B9839398336367D + 35357A35357936367C3C3C8944449D4A4AAB4D4DB27575C18D8DC65E5EA45454 + 924C4C8548488038387734347737377E5E5E986A6AA057579553539355559454 + 549360609A8080AD7676A73B3B883C3C8B3C3C8A3C3C8A5E5E9C67679B656596 + 33337634347735357950508D6B6BA07272A14848814848824949834848826C6C + 9C7777A56B6B9B4545813B3B7F3939823C3C8A43439B4A4AAB5050B85454C156 + 56C65757C85757C85757C85757C85757C85757C85757C85757C85757C85757C8 + 5757C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C802 + 00000200005757C85757C85757C85757C85757C85757C85757C75454C2B2B2DC + ECECECE6E6E6B8B8CDE2E2E2B3B3C635357A70709EE7E7E7E3E3E3CCCCD6CBCB + D4DDDDDD7575A04C4C85616192DFDFE3EAEAEAECECEC8D8DB39999BCE8E8E8E3 + E3E3B4B4C9DDDDDDDBDBDB3838813939833E3E8F4646A14B4BAD8989CDFAFAFA + F2F2F2DADAE3D5D5DDE3E3E37575A13C3C7F5B5B94D4D4DEEFEFEFF1F1F1EFEF + EF9D9DC0565697A8A8C6EFEFEFF1F1F1F2F2F2E6E6EB3E3E8E6262A2D5D5DFE8 + E8E8E7E7E7E7E7E7E8E8E85B5B95B2B2CAEFEFEFECECECECECECDEDEE28B8BB0 + 4E4E8BE4E4E8EEEEEEECECECEAEAEAD0D0D95C5C983C3C893F3F914646A04C4C + AF5151BA5454C25757C75757C85757C85757C85757C85757C85757C85757C857 + 57C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C8 + 5757C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757 + C85757C85757C80200000200005757C85757C85757C85757C85757C85757C857 + 57C78282D3FDFDFDDFDFEC8080BE9D9DC5EAEAEABABACE383880C0C0D3F1F1F1 + 7878AC4A4A95D2D2DDE5E5E57373A74F4F909999BBEFEFEFB7B7CF3C3C885353 + 95F6F6F6F2F2F24B4B976161A3E5E5E5E0E0E03D3D8C3E3E9043439A4949A94E + 4EB4D1D1ECFFFFFF9B9BD16F6FB6D9D9E2E7E7E77B7BAB42428DD6D6E1EDEDED + 9393BF7070AD9797C2A1A1C69999C1F4F4F4D3D3E18E8EBA8686B6D0D0E14141 + 96DEDEE9F1F1F19191BE6D6DA96B6BA59999BE6161A09292BC6262A34040934B + 4B97EDEDEDE0E0E54E4E94A6A6C76666A44C4C997A7AB0E6E6E6ADADC9404093 + 43439A4848A64E4EB35252BC5555C35757C75757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C857 + 57C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C8 + 5757C85757C85757C85757C85757C80200000200005656C85656C85656C85656 + C85656C85656C85656C8A4A4E0FFFFFFA1A1D94C4CB07575BAF3F3F3C1C1D63C + 3C8CBCBCD7FBFBFB9696C44E4EA1C5C5DDEFEFEF7171B343439B9595C4F4F4F4 + 9595C33F3F933E3E91F2F2F8FEFEFE8080BB44449EEFEFEFE6E6E643439C4444 + 9F4747A64D4DB25050BAC5C5E9FFFFFFB3B3E07474BFD0D0E4F2F2F28484B977 + 77B5F7F7F7D2D2E44646A44646A24C4CA46060ABD4D4E8FCFCFC9494C66262AC + 5555A64545A17676BBFFFFFFE3E3EF7575B97373B57272B27070B24F4FA14343 + 9B8C8CC2BBBBDADFDFEBF6F6F6E9E9EF45459E5151A49999CAC6C6DFE6E6EDEE + EEEEB3B3D14545A14747A64C4CB05050B95353C05555C55656C75656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C80200000200005656C8 + 5656C85656C85656C85656C85656C85656C8A4A4E1FFFFFFA3A3DD5050B97C7C + C5FBFBFBC8C8E04242995A5AA5CDCDE4FFFFFFFFFFFFFFFFFFFEFEFE7979C24A + 4AAB9D9DD0FBFBFB9A9ACD44449F44449E7777B9E6E6F3FFFFFFFFFFFFFCFCFC + F2F2F24A4AAC4B4BAE4D4DB35050BA5252BF6B6BCBD6D6F0FFFFFFFFFFFFFFFF + FFFFFFFF8F8FC97F7FC3FFFFFFCFCFE94D4DB24C4CB05151B16767B9D7D7ECFF + FFFF9191CC6969B95C5CB34B4BAD7B7BC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FDFDFD7A7AC19E9ED2FFFFFFFFFFFFFFFFFFC3C3E36E6EBD4B4BADCFCFE9FFFF + FFFFFFFFF3F3FAB3B3DB5656B24C4CB04D4DB35050B95252BF5454C35555C656 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C802 + 00000200005656C85656C85656C85656C85656C85656C85656C88E8EDAFFFFFF + E8E8F75E5EC47F7FCCFFFFFFCFCFE94848A85353AB5555AF4B4BAE7C7CC7E7E7 + F5FFFFFF7F7FCC4F4FB8A1A1D9FFFFFFA0A0D64B4BAE4A4AAD6363B84C4CB059 + 59B98A8ACFFFFFFFFEFEFE5050B95050BA5151BD5353C15454C46060C97272CE + 7575CE9898D9ECECF8FFFFFF9494D36363C0F3F3FAFFFFFF8080CE5252BB8585 + CFA7A7DBB2B2DEFFFFFFCFCFEB7979C76C6CC3ADADDE5B5BBDF3F3FAE8E8F650 + 50BA5050BADCDCF1FFFFFF6767C2D0D0ECFFFFFF9797D65050BB5050B97F7FCC + 5050B9FFFFFFFFFFFF6868C45050BA5C5CBE7272C65050BA5151BB5252BF5454 + C35555C55656C75656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C80200000200005656C85656C85656C85656C85656C85656C856 + 56C85656C8D2D2F0FFFFFFFFFFFFFFFFFFFFFFFFD0D0EC4E4EB57C7CC7FFFFFF + D0D0ECDCDCF1FFFFFFE8E8F75E5EC48181D1FFFFFFFFFFFFFFFFFFFFFFFFA1A1 + D9A2A2DAF3F3FAD1D1EDE8E8F6FFFFFFC6C6EA5353C15353C25454C35555C555 + 55C68383D6FFFFFFDBDBF3E4E4F5FFFFFFECECF87D7DCF6E6ECAA7A7DFFFFFFF + FFFFFFFFFFFFFFFFFFB5B5E47C7CCEE3E3F5FFFFFFFFFFFFFFFFFFFFFFFF5353 + C19898DAFFFFFFE8E8F7DDDDF3FFFFFFBABAE65353C28C8CD6FFFFFFF4F4FBD1 + D1EFF4F4FBD1D1EE5353C1AFAFE2FFFFFFE8E8F7D1D1EFFFFFFFA3A3DE5353C1 + 5454C35454C35555C55656C75656C75656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C80200000200005656C85656C85656C85656 + C85656C85656C85656C85656C85656C89A9ADEA5A5E1A4A4E1FFFFFFD1D1EE52 + 52BF5E5EC28C8CD4A3A3DDA4A4DF9898DC6060CA5656C76060CABBBBE8FFFFFF + BBBBE78282D36A6ACA6B6BCB9898DBA4A4E0A4A4E08E8ED95555C65656C75656 + C75656C75656C85656C86161CC9C9CDFB7B7E7B7B7E7AEAEE48181D57878D278 + 78D27878D28A8AD8B7B7E7B7B7E7AEAEE48181D57878D27878D2A5A5E1B7B7E7 + B0B0E57878D25656C75656C76D6DCEA5A5E1A5A5E18E8EDA5656C75656C75656 + C76D6DCEA5A5E1A5A5E1A5A5E16D6DCE5656C75656C77878D2A5A5E1A5A5E19A + 9ADD6161CB5656C75656C75656C75656C75656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C80200000200005656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C88383 + D6FFFFFFD2D2F05555C55454C45555C55555C55555C65656C75656C85656C856 + 56C8A5A5E2FFFFFFA5A5E15555C65555C65555C65656C75656C75656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C86666CD7878D37878D37878 + D37878D37878D37878D37878D37878D37878D37878D37878D37878D37878D378 + 78D37878D37878D36666CD5656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C802 + 00000200005555C75555C75555C75555C75555C75555C75555C75555C75555C7 + 5555C75555C76C6CCEA4A4E19898DC5555C55454C45454C45454C45454C55555 + C65555C65555C65555C75555C75555C75555C75555C75555C75555C75555C755 + 55C75555C75555C65555C65454C55454C55454C45454C45454C55454C55A5AC8 + 7474D07777D27777D27777D27777D27777D27777D27777D27777D27777D27777 + D27777D27777D27777D27777D27474D15A5AC95555C75555C75555C75555C755 + 55C75555C75555C75555C75555C75555C75555C65555C65555C75555C75555C7 + 5555C75555C75555C75555C75555C75555C75555C75555C75555C75555C75555 + C75555C65555C65454C55454C55454C45454C45454C55454C55555C65555C655 + 55C75555C75555C75555C75555C75555C75555C75555C75555C75555C75555C7 + 5555C75555C75555C75555C75555C75555C75555C75555C75555C75555C75555 + C75555C75555C70200000200005555C75555C75555C75555C75555C75555C755 + 55C75555C75555C75555C75555C65454C55454C45353C25252BF5151BE5151BD + 5151BD5151BD5151BE5252C05353C25454C45454C55555C65555C65555C75555 + C75555C75555C75555C65454C55353C35252C15151BE5151BD5050BB5050BB51 + 51BD5151BE5252C15F5FC77474D07777D17777D17777D17676D07575CF7575CE + 7575CE7575CE7474CD7474CD7575CE7575CE7373CE5F5FC85454C55555C65555 + C65555C75555C75555C75555C75555C75555C65454C55454C45353C35353C253 + 53C25353C35454C45454C55555C65555C75555C75555C75555C75555C75555C7 + 5555C75555C65454C55353C35252C15151BE5151BD5050BB5050BB5151BD5151 + BE5252C15353C35454C55555C65555C65555C65454C55454C45353C35353C353 + 53C35353C25353C25353C35353C35353C35454C45454C55555C65555C65555C7 + 5555C75555C75555C75555C75555C70200000200005555C75555C75555C75555 + C75555C75555C75555C75555C75555C75555C65454C45252C15151BD4F4FB84D + 4DB44C4CB24B4BB04B4BB04C4CB14D4DB34E4EB64F4FB85050BB5252BF5353C2 + 5454C45555C65555C65555C65454C55353C35252BF5050BB4E4EB74C4CB24B4B + AF4A4AAC4A4AAC4B4BAF4C4CB24E4EB75050BB5959C26767C87171CD7272CD71 + 71CB6F6FC86E6EC66E6EC56D6DC36C6CC26C6CC26B6BC26363C05858BE5151BE + 5252C15353C35454C55555C65555C75555C75555C75555C65454C55353C25252 + BF5050BB4F4FB94F4FB95050BB5151BE5353C25454C45555C65555C75555C755 + 55C75555C75555C65454C55353C35252BF5050BB4E4EB74C4CB24B4BAF4A4AAC + 4A4AAC4B4BAF4C4CB24E4EB75050BB5252BF5353C25353C35353C25252C15151 + BE5050BB5050BB4F4FB94F4FB84F4FB84F4FB94F4FBA5050BB5151BE5252C153 + 53C35454C55555C65555C75555C75555C75555C75555C70200000200005555C7 + 5555C75555C75555C75555C75555C75555C75555C75555C65454C45252BF4F4F + B94C4CB24949AB4747A54646A34545A24646A34646A54747A74848A94A4AAC4B + 4BB04D4DB54F4FBA5151BE5353C25454C45454C45353C25151BD4E4EB64B4BAF + 4747A64444A042429B41419942429A43439C4545A24848A84B4BAF4E4EB65050 + BB5151BD5151BD5050BB4E4EB64C4CB14A4AAE4949AB4848A94848A94949AB4A + 4AAD4C4CB14E4EB75050BC5252C15454C45555C65555C75555C75555C75454C5 + 5353C25151BD4E4EB64B4BAF4949AC4949AC4A4AAE4D4DB35050BB5252C05454 + C45555C65555C75555C75555C65454C55353C25151BD4E4EB64B4BAF4747A644 + 44A042429B41419942429A43439C4545A24848A84B4BAF4E4EB65050BB5151BD + 5151BD5050BB4E4EB64C4CB14A4AAE4949AB4848A94848A94949AB4A4AAD4C4C + B14E4EB75050BC5252C15454C45555C65555C75555C75555C75555C75555C702 + 00000200005555C75555C75555C75555C75555C75555C75555C75555C75454C5 + 5252C04F4FB94B4BB04646A542429B4040953E3E923E3E924040954141974242 + 9A43439C44449E4545A24848A84A4AAE4D4DB55050BB5151BE5151BE5050BB4C + 4CB24848A843439C3E3E913B3B893838833737823838843B3B893E3E9042429A + 4545A24949AB4C4CB14D4DB44D4DB54C4CB24949AC4747A544449E4141994040 + 9640409641419944449E4747A54B4BAF4E4EB75151BE5353C25454C55555C755 + 55C75555C65454C45151BD4D4DB54949AA44449F41419941419943439D4747A5 + 4C4CB15050BB5353C25454C55555C75555C65454C55353C25050BB4C4CB34848 + A843439C3E3E913B3B893838833737823838843B3B893E3E9042429A4545A249 + 49AB4C4CB14D4DB44D4DB54C4CB24949AC4747A544449E414199404096404096 + 41419944449E4747A54B4BAF4E4EB75151BE5353C25454C55555C75555C75555 + C75555C75555C70200000200005555C75555C75555C75555C75555C75555C755 + 55C75555C65353C35050BC4C4CB14646A44040953B3B8B393985383884393986 + 3B3B8B3D3D8E3E3E903E3E913E3E913F3F9341419744449E4747A74B4BAF4D4D + B44D4DB44B4BAF4646A34040953A3A8734347B3131722F2F6F30307031317334 + 347B3838833C3C8D4040974444A04747A74949AC4A4AAC4848A84545A1404097 + 3C3C8C38388336367E36367E3838833C3C8C4141994747A54C4CB15050BB5353 + C25454C55555C75555C75555C65252C14F4FB84949AB43439C3C3C8C38388338 + 38823A3A894040954747A54D4DB35151BD5454C45555C65454C55353C25050BB + 4C4CB14646A44040953A3A8734347B3131722F2F6F30307031317334347B3838 + 833C3C8D4040974444A04747A74949AC4A4AAC4848A84545A14040973C3C8C38 + 388336367E36367E3838833C3C8C4141994747A54C4CB15050BB5353C25454C5 + 5555C75555C75555C75555C75555C70200000200005454C75454C75454C75454 + C75454C75454C75454C75454C65151C14D4DB74848AA41419A3A3A8A36368035 + 357E36367F3838853B3B8C3D3D913E3E923C3C8F3B3B8B3939883939883C3C8D + 3F3F9643439F4646A54646A643439E3D3D913737823030722B2B672929622A2A + 622B2B672E2E6E3232773636803A3A893D3D904141994444A04646A54646A645 + 45A341419B3C3C8E3636803131732E2E6C2E2E6C3131733636813E3E924444A2 + 4A4AB04F4FBB5252C25353C55454C75454C75353C45050BD4B4BB14444A13C3C + 8D34347B2F2F702F2F7033337839398741419B4949AC4E4EB95252C25353C552 + 52C35050BD4C4CB34646A53E3E933737823030722B2B672929622A2A622B2B67 + 2E2E6E3232773636803A3A893D3D904141994444A04646A54646A64545A34141 + 9B3C3C8E3636803131732E2E6C2E2E6C3131733636813E3E924444A24A4AB04F + 4FBB5252C25353C55454C75454C75454C75454C75454C70200000200005454C7 + 5454C75454C75454C75454C75454C75454C75353C55050BE4C4CB34646A53E3E + 9338388535357E35357E3838853C3C8E40409742429C42429B3F3F953B3B8C37 + 378335357D35357E3838853B3B8C3E3E933F3F943B3B8C35357E2F2F6F292962 + 26265B26265B2929612D2D6A31317436367F3939873C3C8E3E3E934141994343 + 9E4545A24545A44545A241419A3B3B8C34347B2D2D6A2929622929622D2D6A34 + 347B3D3D904545A34B4BB35050BD5252C35454C65454C75454C65252C24E4EB8 + 4848AA3F3F953636802E2E6C2929622929622E2E6C35357E3E3E934646A54C4C + B55050BE5252C25151BF4D4DB74747A93F3F963737822F2F7029296226265B26 + 265B2929612D2D6A31317436367F3939873C3C8E3E3E9341419943439E4545A2 + 4545A44545A241419A3B3B8C34347B2D2D6A2929622929622D2D6A34347B3D3D + 904545A34B4BB35050BD5252C35454C65454C75454C75454C75454C75454C702 + 00000200005454C75454C75454C75454C75454C75454C75454C75353C55050BD + 4B4BB14444A26A6AA78888B18787AF8888B18B8BB87878B46666B24747A94646 + A643439E3D3D9037378232327630307231317433337936368036368033337839 + 39746F6F9084849BA7A7B4A7A7B69393AB75759E3838853D3D9040409742429C + 43439E4444A14545A34646A54646A64545A441419B3B3B8C3333782B2B652727 + 5B27275B2B2B6533337A3E3E924646A54C4CB55151BF5353C55454C65454C753 + 53C55151BF4C4CB37A7AB86565A03C3C7B2A2A6226265926265B2B2B67333379 + 3C3C8D4444A24B4BB14F4FBB5151BF4F4FBB4A4AAF43439E3939873C3C797070 + 9184849BA7A7B4A7A7B69393AB75759E3838853D3D9040409742429C43439E44 + 44A14545A34646A54646A64545A441419B3B3B8C3333782B2B6527275B27275B + 2B2B6533337A3E3E924646A54C4CB55151BF5353C55454C65454C75454C75454 + C75454C75454C70200000200005454C75454C75454C75454C75454C75454C754 + 54C75353C44F4FBC8E8ECBE4E4EAECECECECECECEFEFEFF2F2F2F5F5F5F5F5F5 + F2F2F2E1E1E8A7A7D05A5AAD4040973737833030722C2C692B2B662C2C692E2E + 6C2E2E6D8181A1D4D4D7E0E0E0E0E0E0E2E2E2E3E3E3E5E5E5E5E5E5CFCFDB85 + 85BD4747A94848AB4848AB4848AC7777C0F7F7F7F3F3F3CBCBDFB9B9D1B0B0C6 + AAAABDA7A7B6B4B4BEDDDDDDE5E5E56565993F3F954747A94E4EB85252C25454 + C65454C65454C65353C44F4FBB4949ACD2D2DEDDDDDDD5D5D5BABAC175759026 + 265B2C2C693333793B3B8C43439E4949AE4D4DB74F4FBB4D4DB64747A83E3E93 + 8686ABD4D4D8E0E0E0E0E0E0E2E2E2E3E3E3E5E5E5E5E5E5CFCFDB8585BD4747 + A94848AB4848AB4848AC7777C0F7F7F7F3F3F3CBCBDFB9B9D1B0B0C6AAAABDA7 + A7B6B4B4BEDDDDDDE5E5E56565993F3F954747A94E4EB85252C25454C65454C6 + 5454C75454C75454C75454C75454C70200000200005454C75454C75454C75454 + C75454C75454C75454C75353C46767C6FDFDFDFAFAFAFAFAFAFBFBFBF1F1F7B4 + B4D99D9DD2A0A0D8C5C5E9FEFEFEF2F2F2E5E5E59393BD42428A2F2F6F292962 + 26265B26265B27275D9C9CB1E9E9E9E9E9E9EBEBEBEFEFEFF3F3F3F7F7F7F8F8 + F8F9F9F9F7F7F7F4F4F4D1D1E67979C74D4DB74D4DB65959BB7C7CC9C4C4E7FC + FCFCF2F2F2E8E8E8E0E0E0DDDDDDDEDEDEA5A5B76C6C9543438841419A4949AE + 5050BD5353C55454C75454C75454C65151C14D4DB66A6AB6EFEFEFE5E5E5DDDD + DDD7D7D7BDBDC32929602F2F7036367F3C3C8D42429D4848AB4C4CB34D4DB64A + 4AB04444A1A5A5C4E9E9E9E9E9E9EBEBEBEFEFEFF3F3F3F7F7F7F8F8F8F9F9F9 + F7F7F7F4F4F4D1D1E67979C74D4DB74D4DB65959BB7C7CC9C4C4E7FCFCFCF2F2 + F2E8E8E8E0E0E0DDDDDDDEDEDEA5A5B76C6C9543438841419A4949AE5050BD53 + 53C55454C75454C75454C75454C75454C75454C75454C70200000200005353C6 + 5353C65353C65353C65353C65353C65353C65252C4A1A1DCFFFFFFFFFFFFFFFF + FF9B9BCC5151AB4848AC4C4CB54F4FBD5252C37474CEF3F3FAF2F2F2E2E2E2B7 + B7C638387126265C2323532222519A9AAEEDEDEDEFEFEFF2F2F2F6F6F6FCFCFC + FFFFFFF2F2F6BFBFDB9C9CCF9F9FD6B8B8E3E7E7F6FEFEFEB8B8E36666C34D4D + B94D4DB94D4DB9CFCFEBFFFFFFF5F5F5EBEBEBE4E4E4B1B1C028285F2D2D6A36 + 368241419B4A4AAF4F4FBD5252C45353C65353C65252C34F4FBC4949AFB1B1D6 + F6F6F6EFEFEFE6E6E6E0E0E0DCDCDC4F4F7F3232783838863D3D9041419B4646 + A74949AE4949AF4747A9ABABCFF1F1F1F0F0F0F2F2F2F6F6F6FCFCFCFFFFFFF2 + F2F6BFBFDB9C9CCF9F9FD6B8B8E3E7E7F6FEFEFEB8B8E36666C34D4DB94D4DB9 + 4D4DB9CFCFEBFFFFFFF5F5F5EBEBEBE4E4E4B1B1C028285F2D2D6A3636824141 + 9B4A4AAF4F4FBD5252C45353C65353C65353C65353C65353C65353C65353C602 + 00000200005353C65353C65353C65353C65353C65353C65353C65252C4A2A2DD + FFFFFFFFFFFF9292CE4848AC4A4AB04C4CB64E4EBB5151C15252C35050BE7C7C + C9FEFEFEECECECDEDEDEA9A9B824245722225070708BECECECF2F2F2F7F7F7FB + FBFBFFFFFFFFFFFF8F8FB13737833F3F974646A74A4AB14C4CB54C4CB69494D3 + E7E7F5FFFFFF4C4CB54C4CB64D4DB7A0A0D7FFFFFFFFFFFFF4F4F4EAEAEA8181 + 9E28285F2D2D6B37378241419C4A4AAF4F4FBD5353C55353C65353C55151C14D + 4DB75353AEF2F2F8FDFDFDF8F8F8F0F0F09B9BB0CDCDD58F8FAF3737833C3C8E + 3E3E9541419B4444A34747A94747A98D8DC6F8F8F8F7F7F7F8F8F8FBFBFBFFFF + FFFFFFFF8F8FB13737833F3F974646A74A4AB14C4CB54C4CB69494D3E7E7F5FF + FFFF4C4CB54C4CB64D4DB7A0A0D7FFFFFFFFFFFFF4F4F4EAEAEA81819E28285F + 2D2D6B37378241419C4A4AAF4F4FBD5353C55353C65353C65353C65353C65353 + C65353C65353C60200000200005353C65353C65353C65353C65353C65353C653 + 53C65353C5B9B9E7FFFFFFD0D0ED4D4DB74C4CB64D4DB94F4FBC5050BE5151C1 + 5050BE4D4DB74747AAE6E6F1F6F6F6E8E8E8DEDEDE6D6D8A222250CFCFD6F1F1 + F1F7F7F7FBFBFBFEFEFEFFFFFF51517C2E2E6E3838853F3F974545A44848AB48 + 48AC4848AB4747A85252ADC1C1E24747A94949AE4A4AB17A7AC5FFFFFFFFFFFF + FBFBFBEFEFEF5B5B842828602D2D6B37378341419C4A4AAF4F4FBD5252C45353 + C55252C34F4FBD4B4BB28E8EC6FFFFFFFFFFFFFFFFFFF9F9F9797999A3A3BCD4 + D4DD3B3B8D3F3F9740409A41419B43439F4545A44545A5E6E6F2FEFEFEFDFDFD + FDFDFDFEFEFEFFFFFF51517C2E2E6E3838853F3F974545A44848AB4848AC4848 + AB4747A85252ADC1C1E24747A94949AE4A4AB17A7AC5FFFFFFFFFFFFFBFBFBEF + EFEF5B5B842828602D2D6B37378341419C4A4AAF4F4FBD5252C45353C55353C5 + 5353C55353C65353C65353C65353C60200000200005353C65353C65353C65353 + C65353C65353C65353C65353C5D1D1EFFFFFFF8A8AD55050BE4F4FBD5050BE50 + 50BF5050BE4F4FBC4C4CB54747AA41419BCACAE0FEFEFEF2F2F2E9E9E99898AC + 666687F1F1F1F5F5F5F9F9F9FBFBFBFBFBFB8989A226265C2E2E6D3737833E3E + 9442429E4444A24343A141419C3F3F973E3E943E3E943F3F9742429E4646A678 + 78C0FFFFFFFFFFFFFEFEFEF1F1F15B5B8428285F2D2D6A37378241419B4949AE + 4E4EBB5151C25252C35050BF4D4DB74747A9D9D9EAFFFFFFFFFFFFFFFFFFFEFE + FE454576676798F4F4F46E6EAE42429E42429E41419B41419B42429E8181BEFF + FFFFFFFFFFFFFFFFFDFDFDFBFBFB8989A326265C2E2E6D3737833E3E9442429E + 4444A24343A141419C3F3F973E3E943E3E943F3F9742429E4646A67878C0FFFF + FFFFFFFFFEFEFEF1F1F15B5B8428285F2D2D6A37378241419B4949AE4E4EBB51 + 51C25252C35252C35252C45252C45353C55353C65353C60200000200005353C6 + 5353C65353C65353C65353C65353C65353C65353C6D1D1F0FFFFFF5252C45252 + C35151C15151C15050BE4E4EBA4B4BB24646A7404099393988E4E4EDFFFFFFFA + FAFAF3F3F3BBBBC98888A6F8F8F8F9F9F9F9F9F9F7F7F7E4E4E823235526265B + 2D2D6B35357F3B3B8D3F3F963F3F973E3E943A3A8B36368234347C34347B3636 + 803A3A8B3F3F977575B9FFFFFFFFFFFFFBFBFBEEEEEE5A5A8127275C2C2C6835 + 357F4040984747AA4C4CB64F4FBD4F4FBC4C4CB64949AE6868B1FFFFFFFFFFFF + FFFFFFFFFFFFD3D3DE2B2B6735357EE2E2EDADADD24545A54444A241419B3F3F + 963F3F979999C8FFFFFFFFFFFFFFFFFFF8F8F8E4E4E824245526265B2D2D6B35 + 357F3B3B8D3F3F963F3F973E3E943A3A8B36368234347C34347B3636803A3A8B + 3F3F977575B9FFFFFFFFFFFFFBFBFBEEEEEE5A5A8127275C2C2C6835357F4040 + 984747AA4C4CB64F4FBD4F4FBD5050BE5050C05151C15252C35353C55353C602 + 00000200005353C65353C65353C65353C65353C65353C65353C65353C69898DD + A3A3E15353C55252C45151C25050BE4D4DB74949AF4444A23E3E943737846767 + 99FFFFFFFFFFFFFFFFFFFEFEFEC5C5D5C8C8D9FFFFFFFEFEFEF9F9F9F3F3F39D + 9DB225255927275D2D2D6B35357E3B3B8D3E3E953E3E953C3C8E373782313174 + 2D2D6B2C2C6A2F2F6F34347B3B3B8C7272B3FFFFFFFFFFFFFAFAFAECECEC5858 + 7F26265A2A2A6533337B3D3D924444A24949AD4B4BB24949AF4747A843439FB1 + B1D3FFFFFFFFFFFFFEFEFEFEFEFE8B8BA82E2E6D3838869A9ACAECECF35252AE + 4545A44040993C3C903B3B8DCBCBE1FFFFFFFFFFFFFFFFFFF5F5F59E9EB42525 + 5927275D2D2D6B35357E3B3B8D3E3E953E3E953C3C8E3737823131742D2D6B2C + 2C6A2F2F6F34347B3B3B8C7272B3FFFFFFFFFFFFFAFAFAECECEC58587F26265A + 2A2A6533337B3D3D924444A24949AD4B4BB34B4BB34C4CB44D4DB74F4FBC5151 + C15252C45353C60200000200005252C65252C65252C65252C65252C65252C652 + 52C65252C65252C65252C65252C55151C34F4FBE4C4CB64747AC42429F3B3B90 + 35357F2E2E70D3D3DFFFFFFFFFFFFFFFFFFFFFFFFF9191B5C9C9DEFFFFFFFFFF + FFFBFBFBF2F2F28484A42828612929632E2E6E35357F3B3B8E3E3E963E3E953A + 3A8D34347D2D2D6C28286127275F2A2A653030733737846F6FAEFFFFFFFFFFFF + F8F8F8EAEAEA57577D24245728286131317639398A3F3F974242A04343A24141 + 9E3E3E96474795F2F2F6FFFFFFFEFEFEFBFBFBFBFBFB4444722F2F713A3A8B5B + 5BADFDFDFD9898CE4444A33E3E95393989373784CACADEFFFFFFFFFFFFFFFFFF + F2F2F28383A32828602929632E2E6E35357F3B3B8E3E3E963E3E953A3A8D3434 + 7D2D2D6C28286127275F2A2A653030733737846F6FAEFFFFFFFFFFFFF8F8F8EA + EAEA57577D24245728286131317639398A3F3F974242A04444A34444A34444A5 + 4747AC4B4BB44D4DBB5050C15252C50200000200005252C65252C65252C65252 + C65252C65252C65252C65252C65252C65252C55151C34F4FBE4C4CB64747AB41 + 419C3A3A8C33337B2D2D6CA3A3B9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFF60609E + CCCCE3FFFFFFFFFFFFFEFEFEF1F1F16161942D2D6D2C2C6B3030733535813B3B + 8E3D3D943D3D933939893232782B2B6727275D26265C2929632F2F723636836F + 6FABFFFFFFFFFFFFF7F7F7E8E8E856567B2424562828602F2F713636823A3A8D + 3C3C913C3C9139398A3636828585B0FFFFFFFFFFFFFCFCFCF8F8F8CECED82929 + 633232783C3C904444A5CECEE9E0E0ED4343A23D3D9437378434347DC9C9DCFF + FFFFFFFFFFFFFFFFF1F1F16060902C2C6A2C2C6A3030733535813B3B8E3D3D94 + 3D3D933939893232782B2B6727275D26265C2929632F2F723636836F6FABFFFF + FFFFFFFFF7F7F7E8E8E856567B2424562828602F2F713636823A3A8D3C3C913D + 3D933C3C923E3E9642429F4747AB4B4BB64F4FBE5151C40200000200005252C6 + 5252C65252C65252C65252C65252C65252C65252C65252C65151C44F4FBF4C4C + B74747AC40409B3939893232783838719F9FB5F5F5F5FCFCFCFFFFFFFFFFFFFF + FFFFCACAE03F3F999C9CD0FFFFFFFFFFFFFFFFFFF5F5F5C6C6D5B6B6C9B9B9CC + E3E3E8F4F4F4F4F4F4EFEFEFE6E6E6DDDDDDD4D4D4BBBBC3A4A4B3ABABBA2C2C + 6A3232793838886F6FAEFFFFFFFFFFFFF5F5F5E6E6E657577E26265B2929632F + 2F7234347E37378437378636368333337B303074D5D5E2FFFFFFFEFEFEF9F9F9 + F4F4F48787A52D2D6D3535813E3E974545A89292CFF8F8F88888C13D3D943737 + 8433337B9292B9FFFFFFFFFFFFFFFFFFF5F5F5C5C5D3B6B6C9B9B9CCE3E3E8F4 + F4F4F4F4F4EFEFEFE6E6E6DDDDDDD4D4D4BBBBC3A4A4B3ABABBA2C2C6A323279 + 3838886F6FAEFFFFFFFFFFFFF5F5F5E6E6E657577E26265B2929632F2F723434 + 7E3737843838863737863737843939893E3E954444A44949B14E4EBC5151C302 + 00000200005252C65252C65252C65252C65252C65252C65252C65252C65252C5 + 5050C14D4DBA4848AF41419E3A3A8B323278515181C4C4CFF2F2F2FAFAFAFFFF + FFFFFFFFFFFFFFF2F2F75A5AA94646A98787CDFFFFFFFFFFFFFFFFFFFDFDFDCD + CDDF9A9AC08F8FB99393BD9696C29898C5B1B1D5EAEAEFECECECE2E2E2DBDBDB + D8D8D8C6C6CF33337B3838863C3C917171B1FFFFFFFFFFFFF4F4F4E5E5E55959 + 852A2A662D2D6D32327835358036368235358033337B30307456568AFCFCFCFE + FEFEFBFBFBF5F5F5EFEFEF3A3A7632327939398A40409B4646AA5555B5F9F9F9 + D8D8E53E3E9638388735357F7878AAFFFFFFFFFFFFFFFFFFFCFCFCCCCCDC9999 + BE8F8FB89393BD9696C29898C5B1B1D5EAEAEFECECECE2E2E2DBDBDBD8D8D8C6 + C6CF33337B3838863C3C917171B1FFFFFFFFFFFFF4F4F4E5E5E55959852A2A66 + 2D2D6D32327835358036368235358134347F34347D3636823B3B904242A04848 + AF4D4DBA5151C30200000200005252C65252C65252C65252C65252C65252C652 + 52C65252C65151C44F4FBE4B4BB44444A53C3C9033337B77779CDEDEE1F1F1F1 + F9F9F9FFFFFFFFFFFFFFFFFFF2F2F86868B24747AC4B4BB54D4DBBE8E8F6FFFF + FFFFFFFFFFFFFF9898CC41419E3E3E963D3D933D3D943E3E973E3E97CBCBE2F8 + F8F8F0F0F0E9E9E9E4E4E4A0A0BF3B3B8D3E3E9741419E9A9ACBFFFFFFFFFFFF + F6F6F6E8E8E85F5F9232327834347D38388639398A8888B37C7CAB35357F3232 + 78A9A9C4FEFEFEFFFFFFFCFCFCF5F5F5B0B0C835358139398A3E3E974444A448 + 48AE4A4AB3CECEE9F3F3F39292C43C3C923A3A8B39398AE5E5F0FFFFFFFFFFFF + FFFFFF9696C73F3F993D3D943D3D933D3D943E3E973E3E97CBCBE2F8F8F8F0F0 + F0E9E9E9E4E4E4A0A0BF3B3B8D3E3E9741419E9A9ACBFFFFFFFFFFFFF6F6F6E8 + E8E85F5F9232327834347D38388639398A8787B27A7AA936368235357F373784 + 3C3C904242A04848AF4D4DBA5151C30200000200005252C65252C65252C65252 + C65252C65252C65252C65252C65151C34D4DBB4848AE40409B43438BABABC1EC + ECECF2F2F2FAFAFAFFFFFFFFFFFFFFFFFFF2F2F86969B54848AD4B4BB54D4DBA + 4E4EBC8A8AD4FFFFFFFFFFFFFFFFFFC3C3E64747AC4545A64343A242429F4141 + 9E41419DF2F2F8FFFFFFFFFFFFF8F8F8F2F2F27B7BB74242A04545A74747AC9C + 9CD2FFFFFFFFFFFFFEFEFEF0F0F0C5C5D54646933C3C913E3E973F3F999898C1 + D0D0DC3B3B8D515195FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA8585BA3F3F984141 + 9E4545A64848AE4B4BB64D4DB9CFCFECFBFBFBF5F5F56767B341419E41419C81 + 81BFFFFFFFFFFFFFFFFFFFC1C1E34646A94444A54343A242429F41419E41419D + F2F2F8FFFFFFFFFFFFF8F8F8F2F2F27B7BB74242A04545A74747AC9C9CD2FFFF + FFFFFFFFFEFEFEF0F0F0C5C5D54646933C3C913E3E973F3F999595BEC8C8D33B + 3B8F3A3A8D3B3B9040409A4545A74A4AB34E4EBD5151C30200000200005151C5 + 5151C55151C55151C55151C55151C55151C55151C54F4FC04B4BB64545A86060 + A5C8C8D6EFEFEFF5F5F5FBFBFBFFFFFFFFFFFFFFFFFFD8D8EA5D5DB24848AF4A + 4AB54B4BB74C4CB84C4CB84D4DBAB8B8E5FFFFFFFFFFFFFFFFFF6363C04949B2 + 4747AE4646AB4646A97777BEFFFFFFFFFFFFFFFFFFFFFFFFCDCDE74646AA4848 + AF4A4AB44A4AB5DBDBF0FFFFFFFFFFFFFFFFFFFEFEFED1D1E4E7E7EE8989C35C + 5CB17E7EC0E6E6EDF2F2F29696C8D9D9EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 6969B74646AA4747AD4949B24B4BB64D4DBB4D4DBCDBDBF1FFFFFFFFFFFFF2F2 + F96C6CBD4646AB4747ADB6B6DFFFFFFFFFFFFFFFFFFF6262BF4949B24747AE46 + 46AB4646A97777BEFFFFFFFFFFFFFFFFFFFFFFFFCDCDE74646AA4848AF4A4AB4 + 4A4AB5DBDBF0FFFFFFFFFFFFFFFFFFFEFEFED1D1E4E7E7EE8989C35C5CB17D7D + BFDEDEE5E4E4E48181BA40409D4242A04444A64848AF4C4CB84E4EBF5050C302 + 00000200005151C55151C55151C55151C55151C55151C55151C55151C44F4FC0 + 4A4AB46767B4E6E6EBF3F3F3F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFA4A4CE5151 + AD4A4AB34B4BB74B4BB74A4AB54949B24848B04A4AB34C4CB8ACACE0FFFFFFFF + FFFFDCDCF25959C04C4CB94B4BB65656B9DBDBF0FFFFFFFFFFFFFFFFFFF3F3FA + 5656B96363C1A0A0DAA0A0DBC4C4E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5252 + AFCECEE9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFC3C3E79E9ED74C4CB94D4DBB4E4EBD7E7ED1C4C4EAFFFFFF + FFFFFFFFFFFFFFFFFFF3F3FAABABDE4C4CB94D4DBBACACE0FFFFFFFFFFFFDCDC + F25959C04C4CB94B4BB65656B9DBDBF0FFFFFFFFFFFFFFFFFFF3F3FA5656B963 + 63C1A0A0DBA1A1DCC4C4E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5555B7CECEEA + FFFFFFFFFFFFFEFEFEF9F9F9F1F1F1E1E1E85252B14848AF4949B24C4CB94E4E + BD4F4FC15151C40200000200005151C55151C55151C55151C55151C55151C551 + 51C55151C44E4EBF5656B9E1E1EDF8F8F8FBFBFBFEFEFEFFFFFFFFFFFFF1F1F6 + 7B7BB24242A14949B14C4CB94C4CB94A4AB44747AE4545A84444A54646AA4949 + B24C4CB97D7DD0DCDCF3FFFFFFE8E8F7ADADE2A1A1DCE7E7F6FFFFFFFFFFFFFF + FFFFC4C4E85959C04E4EBD7171CAD0D0EDD0D0EDDBDBF1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF4646AA4747AC9D9DD4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFD0D0EDD0D0EDD0D0EDD0D0EED0D0EED0D0EED0D0EE5050C25050C25050C396 + 96DBD0D0EFD0D0EFD0D0EFD0D0EFD0D0EFD0D0EFD0D0EE5050C25050C25050C3 + 7F7FD3DCDCF3FFFFFFE8E8F7ADADE2A1A1DCE7E7F6FFFFFFFFFFFFFFFFFFC4C4 + E85A5AC14E4EBE7272CDD0D0EFD0D0EFDCDCF3FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFF4E4EBD4E4EBDA1A1DCFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA9B9BD64D4DBB + 4E4EBD4F4FC05050C25050C35151C40200000200005151C55151C55151C55151 + C55151C55151C55151C55151C44F4FC09E9ED7FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFD5D5E14D4D8B3B3B904343A44949B24B4BB74949B24646AB4343A240409B + 3F3F9A4242A14747AC4A4AB54E4EBE5151C47474D1A2A2E0C5C5EBD1D1EFD0D0 + EFC5C5EBA2A2DE6767CA5050C24F4FC14F4FC04E4EBD4C4CB94A4AB44848AF46 + 46AB5050AC7575BC9B9BCED9D9EC4343A44444A64646AB6060BAB7B7E2F3F3FA + F3F3FBA1A1DE5050C25050C25050C35151C45151C45151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C551 + 51C55151C55151C55151C55151C57474D1A2A2E0C5C5EBD1D1EFD0D0EFC5C5EB + A2A2DE6767CA5050C25050C35151C45151C45151C55151C55151C55151C55D5D + C97F7FD4A2A2E0DCDCF35151C45151C45151C46868CCB9B9E7F3F3FBF3F3FBA2 + A2DF5050C25050C25050C35151C45151C45151C55151C50200000200005151C5 + 5151C55151C55151C55151C55151C55151C55151C54F4FC0F3F3FAFFFFFFFFFF + FFFFFFFFFFFFFFAAAAC32C2C6C33337C3B3B8F41419F4646AB4848AF4545A841 + 419F3E3E963B3B903B3B9040409B4545A74A4AB34E4EBD5151C45151C55151C5 + 5151C55151C55151C55151C55151C55151C45050C34F4FC04D4DBB4A4AB44747 + AD4444A641419F3F3F9A3E3E973E3E963E3E963E3E963E3E973F3F9941419E44 + 44A54747AD4B4BB64E4EBD5050C25151C45151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C551 + 51C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C502 + 00000200005151C55151C55151C55151C55151C55151C55151C55151C57373CE + FFFFFFFFFFFFFFFFFFFFFFFFD4D4E33D3D7B2F2F7233337D3A3A8D3F3F9A4343 + A34444A541419E6C6CAD52529A38388839398B3E3E974444A64949B24E4EBD50 + 50C35151C45151C45050C35050C35151C45151C45050C34F4FC14E4EBD4C4CB8 + 4848AF4444A640409D3D3D943A3A8D39398A38388839398A39398A39398B3939 + 8B39398C3B3B8F3E3E964242A04747AC4B4BB64E4EBF5050C35151C55151C551 + 51C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C551 + 51C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C50200000200005050C55050C55050C55050C55050C55050C550 + 50C55050C57E7ED3FFFFFFFFFFFFFFFFFFFDFDFD7676AC33337E32327C343481 + 38388A3C3C943F3F9B3F3F9B5555A2E9E9E97D7DAE37378639398C3E3E994444 + A84949B44D4DBD4F4FC24F4FC24E4EC04E4EC04D4DBF4E4EC04E4EC04D4DBE4C + 4CBB4949B54646AC4242A13D3D9639398C35358334347F34347F353583373788 + 38388A38388B37378836368636368638388B3D3D964343A44848B24D4DBD4F4F + C25050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C50200000200005050C55050C55050C55050 + C55050C55050C55050C55050C57F7FD4FFFFFFFFFFFFFFFFFFFBFBFB3E3E9839 + 398D37378837378839398C3B3B913C3C943D3D958282B6E9E9E96666A338388B + 3B3B9141419F4646AC4A4AB74D4DBE4E4EC04D4DBF4C4CBB4B4BB94A4AB64A4A + B64A4AB64949B44747AF4444A840409D3B3B9137378733337F32327B32327B34 + 34803737873A3A8F3C3C943C3C9339398D3737883535833737863B3B9141419F + 4747AE4C4CBA4F4FC25050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C50200000200005050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C5F3F3FBFFFFFFFFFF + FFFFFFFF4F4FAD41419F3E3E983D3D963D3D963D3D973E3E983E3E98C1C1D9EC + ECEC6A6AAB3D3D9740409E4444A84848B24C4CBB4E4EC04E4EC04C4CBB4A4AB6 + 4848B14646AD4646AD4646AC4444A84343A43F3F9B3B3B9137378633337F3232 + 7A3E3E8263639B8A8AB58C8CBA8D8DBE7777B640409D3D3D963A3A8E37378738 + 38893B3B9141419F4646AD4B4BB94F4FC25050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C502 + 00000200005050C55050C55050C55050C55050C55050C55050C55050C55050C5 + A2A2E0FFFFFFFFFFFFFFFFFF9A9AD34646AD4444A74242A34242A14242A14242 + A17F7FBFF7F7F7F2F2F27070B74343A64545AB4848B24B4BB94D4DBF4E4EC04D + 4DBD4B4BB94848B24545AB4343A54343A44242A140409E3E3E983B3B90373787 + 3434807B7BA6B8B8CBEBEBEBEFEFEFF3F3F3F4F4F4F1F1F1EBEBEBD9D9E08080 + B93E3E983B3B913B3B913E3E984343A44848B04C4CBB4F4FC25050C55050C550 + 50C55050C55050C55050C45050C45050C44F4FC34F4FC34F4FC34F4FC34F4FC3 + 5050C45050C45050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C50200000200005050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55C5CC8DCDCF3FFFFFFFFFFFFFFFFFF9999D14646AC4444A8 + 4343A64343A58E8EC9F3F3F9FFFFFFFBFBFB7676C14848B24A4AB64C4CBB4D4D + BF4F4FC24E4EC14D4DBD4A4AB64747AF4343A641419F3F3F9B3D3D973B3B9239 + 398D36368665659DD4D4DEF0F0F0F4F4F4F9F9F9FFFFFFB3B3DA7777C38686CE + DADAF0F3F3F3E9E9E97878BA41419F40409E4242A14444A84848B24B4BB94D4D + BE4E4EC04E4EC04E4EC04E4EC04E4EC04D4DBF4D4DBD4D4DBD4C4CBC4C4CBB4C + 4CBB4C4CBC4D4DBD4D4DBF4E4EC14F4FC35050C45050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C50200000200005050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C44F4FC2A0A0DCFFFFFFFFFFFFFF + FFFFF2F2F8CBCBE6CDCDE7F2F2F9FFFFFFFFFFFFFFFFFFFFFFFF7979C74A4AB7 + 4C4CBB4E4EC04F4FC24F4FC34F4FC34D4DBE4B4BB84747AF4343A53F3F9C3D3D + 953A3A8E37378842428AA6A6C4F5F5F5F9F9F9FDFDFDFFFFFFD8D8E95959AA44 + 44A84848B24B4BB95858C0FFFFFFF6F6F6E3E3EA4545AB4444A84444A84646AC + 4747AF4848B24949B54A4AB64A4AB64A4AB64A4AB64949B44949B44848B24848 + B24848B04747AF4747AF4747AF4848B24A4AB64B4BB94D4DBE4E4EC15050C450 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C50200000200005050C4 + 5050C45050C45050C45050C45050C45050C45050C45050C34F4FC14D4DBC4A4A + B65454B48F8FCBA7A7D4CCCCE5CCCCE5CCCCE5C0C0DF9A9ACD9B9BCE8F8FCA77 + 77C15454B44A4AB54C4CBA4E4EBF4F4FC15050C34F4FC24E4EBF8383CB4848B1 + 4444A63F3F9B3C3C9338388A5C5C9ADEDEE8FCFCFCFFFFFFFFFFFFFFFFFF9595 + C13C3C933F3F9A4343A34646AB4848B14A4AB5FFFFFFFFFFFFFAFAFA7777C448 + 48AF4646AC4545AA4545A84444A84444A74444A64343A54343A54343A54343A5 + 4444A64343A54343A54343A44242A24242A14242A14343A44545A84747AE4A4A + B64D4DBC4F4FC15050C35050C45050C45050C45050C45050C45050C45050C450 + 50C45050C45050C45050C45050C45050C45050C45050C45050C45050C45050C4 + 5050C45050C45050C45050C45050C45050C45050C45050C45050C45050C45050 + C45050C45050C45050C45050C45050C45050C45050C45050C45050C45050C402 + 00000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44E4EC2 + 4C4CBD4949B64646AD4141A23E3E993B3B933A3A903A3A903B3B933C3C953D3D + 973E3E9A3F3F9C4040A04343A54545AB4848B24A4AB84D4DBE4E4EC14E4EC1AA + AADFBCBCE14747AF4242A43D3D9839398D8282B1EBEBF0FCFCFCFFFFFFFFFFFF + C9C9DD5E5E9D37378A39398E3B3B933D3D9740409E4242A45E5EB6FFFFFFFFFF + FFCFCFEC6D6DC54848B34646AE4343A74040A03E3E9A3C3C953B3B923B3B913B + 3B923B3B933C3C953D3D973E3E993E3E9A3D3D983C3C963B3B943B3B933C3C95 + 3E3E9A4242A34646AE4A4AB74D4DBE4E4EC24F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC40200000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC34D4DC04B4BB94646AE4141A13B3B93373789353583343482353584 + 37378938388C39398E3A3A8F3A3A8F3A3A913C3C953F3F9C4343A54646AE4A4A + B74C4CBC7C7CD0FFFFFFFCFCFC9898CE40409E52529EB3B3CEF6F6F6FBFBFBFE + FEFEC8C8DB6969A034348236368537378737378737378737378939398D3B3B93 + 9999CACDCDE77777C44949B54949B64848B34545AB4040A03C3C943737893333 + 8031317A31317931317933337E35358337378A39398D3A3A913A3A9139398E38 + 388A37378837378939398D3D3D974242A44747B04B4BBA4E4EC14F4FC34F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC40200000200004F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC34D4DBE4949B54444A83D3D9737378833337E32 + 327C32327D35358338388A3A3A8F3A3A9039398D37378936368636368638388B + 3C3C954141A14545AC4949B54A4AB89292D3E6E6F4FFFFFFFBFBFBF8F8F8F9F9 + F9E0E0E9ABABC768689D33337F36368538388A39398D38388C37378735358333 + 337E33337E3434814444923C3C954141A24545AC4848B24747B14444AA3F3F9C + 39398D32327D2D2D6F2A2A672929652A2A682D2D6F31317A36368539398D3B3B + 933C3C943B3B9238388C3737873636853737873A3A8F3F3F9C4444AA4949B54D + 4DBF4F4FC34F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC40200000200004F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44E4EC24C4CBC4747B14141A23A3A + 9135358332327C32327C35358338388C3C3C953E3E9A3E3E993B3B9338388A34 + 348132327B32327C3535843B3B914040A04545AB4646AE4545AB4040A05555A0 + 6B6BA467679B3C3C7B2E2E7330307834348038388A3B3B933D3D983E3E9A3D3D + 973A3A9036368732327D3030762F2F743131793535833B3B9140409F4444AA46 + 46AE4444A93F3F9D38388C30307829296625255B24245825255D2A2A69313179 + 3737893C3C943F3F9C40409F3F3F9D3C3C963A3A8F38388A37378939398D3E3E + 994343A74848B34C4CBC4E4EC24F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC402 + 00000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44E4EC24B4BBA + 4646AE40409F6868A68787B08686AF8888B28C8CB87777B36363B04343A74242 + A43F3F9B39398E3434802F2F742D2D702F2F763434823A3A9140409E4141A13F + 3F9C3A3A8F3333802E2E732B2B6B3939756565979191B99393C09696C69595C9 + 7171B94E4EAA4242A33F3F9B3A3A903434822F2F752C2C6D2B2B6C2E2E733333 + 803A3A9040409F4444A84444A840409E39398D30307727276222225521215123 + 235850508063639A7676AE9191C39191C79090C78D8DC36060AE3E3E9A3B3B94 + 3A3A903A3A913E3E9A4343A64848B24C4CBC4E4EC24F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC40200000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44E4EC14B4BB98B8BCAE3E3EAECECECECECECEFEFEFF2F2F2F5F5F5F5F5F5 + F2F2F2E1E1E8A5A5CE5757AC3C3C943434812D2D702A2A682A2A692F2F743535 + 833A3A8F3B3B9138388A32327D2D2D6F7C7CA0C1C1D1FBFBFBFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF8F8F8EFEFEFC6C6DB8181BD3F3F9C38388C32327B2B2B6C + 2828642929652D2D6F6969A2FFFFFFF8F8F8D7D7E4B8B8D1AFAFC6A9A9BCA5A5 + B5B3B3BDDDDDDDE6E6E6EFEFEFF7F7F7FCFCFCFEFEFEFBFBFBF5F5F5EEEEEEE6 + E6E68D8DC34141A13E3E9A3E3E9940409E4444A94848B34C4CBC4E4EC24F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC40200000200004E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44D4DC16262C3FDFDFDFAFAFAFAFAFAFBFBFBF1F1F7B2 + B2D89B9BD19D9DD6C3C3E9FEFEFEF2F2F2E5E5E59191BC3F3F882B2B6D272762 + 2727612A2A692E2E753333803434823030796F6F9BDADAE1F9F9F9FEFEFEFFFF + FFFFFFFFD8D8EAA7A7D69D9DD6B7B7E3F3F3FBFFFFFFF7F7F7E9E9E9C8C8D56F + 6FAD3535852D2D7127276225255D272762494984A1A1C6D8D8EBFEFEFEF3F3F3 + E7E7E7E0E0E0DEDEDEE0E0E0E9E9E9D8D8E0B8B8CE9494C19999CD9C9CD5ABAB + E0E7E7F7FFFFFFF6F6F6E1E1E84545AE4343A84141A44242A74545AE4848B54B + 4BBC4D4DC24E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC40200000200004E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44D4DC29E9EDBFFFFFFFFFFFFFFFF + FF9999CB4E4EA94444AA4747B34B4BBC4D4DC17070CDF3F3FAF2F2F2E2E2E2B6 + B6C635357025255D24245B2626602B2B6B2E2E742E2E739393B1F0F0F0F4F4F4 + F9F9F9FFFFFFD6D6E56F6FAE4242A54747B34B4BBC4D4DC14E4EC3A1A1DFFFFF + FFFCFCFCEBEBEBDBDBDB9494B730307928286423235923235928286530307939 + 398ECCCCE5FFFFFFF5F5F5ECECECE8E8E8E8E8E89D9DB125255E2E2E7339398E + 4141A44848B54C4CBF4E4EC4A1A1DFFFFFFFF9F9F97575C74747B34646AF4646 + B04848B54A4ABA4C4CBF4D4DC24E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC402 + 00000200004E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44D4DC29F9FDC + FFFFFFFFFFFF8F8FCD4444AA4545AE4848B44A4AB94C4CBF4D4DC14B4BBC7878 + C7FEFEFEECECECDDDDDDA6A6B623235923235724245B2828652B2B6B9F9FB7EF + EFEFF1F1F1F5F5F5FBFBFBABABC53636873E3E9D4545AE4A4ABB4D4DC14E4EC3 + 4E4EC44E4EC49595DBFFFFFFFEFEFEE9E9E9D9D9D99191B02A2A692323582222 + 5524245B2B2B6D3434839696C6FFFFFFFFFFFFF6F6F6EFEFEFECECEC30306026 + 265F2E2E733939904242A54848B54C4CC04E4EC44E4EC4C4C4EBFFFFFF9D9DD9 + 4A4ABA4949B84949B84A4ABB4C4CBE4D4DC14E4EC34E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC40200000200004E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC3B7B7E6FFFFFFCECEEC4848B54848B54949B74A4ABA4B4BBC4C4CBF + 4B4BBC4848B54343A8E5E5F1F5F5F5E5E5E5D9D9D96A6A8822225624245B2727 + 629E9EB7F0F0F0F2F2F2F5F5F5F9F9F9A8A8C03030783A3A914242A54848B54C + 4CBF4E4EC34E4EC44E4EC44E4EC44E4EC4A1A1DFFFFFFFFBFBFBE6E6E6D6D6D6 + 8383A224245A20205122225528286431317A6D6DABFFFFFFFFFFFFFEFEFEF5F5 + F5B8B8C622225626265F2E2E743939904242A54848B54C4CC04E4EC44E4EC45A + 5AC7F3F3FBD0D0EE4C4CBF4C4CBF4C4CBE4C4CBF4D4DC14D4DC24E4EC34E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC40200000200004E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC3D0D0EFFFFFFF8888D44B4BBC4B4BBC4B4BBC4B + 4BBD4B4BBC4A4ABA4747B34343A83D3D99C9C9DFFBFBFBECECECE0E0E09090A5 + 23235826265F696992F0F0F0F4F4F4F6F6F6F8F8F8DEDEE53737703333803D3D + 984545AC4A4ABA4D4DC24E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4E7E7F6FF + FFFFF4F4F4E0E0E0D3D3D352527A20205020205125255E2E2E736C6CA7FFFFFF + FFFFFFFFFFFFF5F5F5B6B6C522225626265F2E2E743939904242A54848B54C4C + C04E4EC44E4EC44E4EC4B8B8E7FFFFFF4D4DC24D4DC24D4DC24D4DC24E4EC34E + 4EC34E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC40200000200004E4EC3 + 4E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC3D0D0EFFFFFFF4D4DC14D4D + C04C4CBE4C4CBE4B4BBB4949B74646AF4242A43C3C97363686E3E3ECFDFDFDF2 + F2F2E9E9E9B0B0BE26265F36366FE3E3E7F4F4F4F7F7F7F8F8F8F8F8F8797999 + 2B2B6A3535853F3F9D4646AF4B4BBB4E4EC24E4EC34E4EC34E4EC34E4EC34E4E + C34E4EC3A0A0DDFFFFFFFFFFFFECECECDADADAAFAFBA2020501F1F4E2323592B + 2B6D6969A2FFFFFFFFFFFFFFFFFFF2F2F2B3B3C122225626265F2E2E7339398F + 4242A44848B44C4CBF4E4EC34E4EC34E4EC35A5AC77D7DD34E4EC34E4EC35858 + C69999DC8383D55656C64E4EC34E4EC34E4EC34E4EC34E4EC34E4EC35F5FC97A + 7AD26565CB4E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC3 + 4E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4E + C34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC302 + 00000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC39494DB + A0A0DF4D4DC24C4CC14B4BBF4A4ABB4747B44444AC3F3FA03A3A923333826565 + 98FFFFFFFEFEFEF8F8F8F2F2F2B8B8C82A2A6A8989AEF6F6F6F8F8F8F8F8F8F7 + F7F7D8D8DF2323592B2B6D3636893F3FA14646B24B4BBE4D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC36464C8FFFFFFFFFFFFF6F6F6E3E3E3D5D5D55050 + 741E1E4D2222562929696969A0FFFFFFFFFFFFFEFEFEEFEFEFB0B0BE22225625 + 255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC35757C79A9ADD9B9BDD8F8FD95D5DC84E4EC34D4DC34D4DC34D4D + C34D4DC35E5EC97979D27878D26B6BCD4F4FC44D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC30200000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC24C4CC04A4ABB4747B44343A93E3E9D38388D + 32327D2B2B6ED3D3DFFFFFFFFEFEFEFCFCFCF9F9F98B8BAF303079E2E2ECFBFB + FBFAFAFAF8F8F8F3F3F381819B24245A2C2C7037378C4040A24747B34B4BBE4D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34C4CC0F3F3FAFFFFFFFEFEFE + EBEBEBDBDBDB8E8EA21E1E4C21215428286668689EFFFFFFFFFFFFFCFCFCEFEF + EFB0B0BE22225625255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC35757C79B9BDD8E8ED99D9DDE9A9ADD7272CF + 5252C54D4DC34D4DC34D4DC35F5FC97A7AD27373D07A7AD27373D05A5AC74E4E + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC30200000200004D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC24C4CC04A4ABB4747B44242A83D + 3D9A36368A3030792A2A6AA2A2B9FBFBFBFEFEFEFFFFFFFFFFFFFFFFFF5C5C9B + 5E5EA1FFFFFFFFFFFFFBFBFBF6F6F6EFEFEF48486F24245B2C2C7038388D4040 + A34747B44B4BBE4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34C4CC0CE + CEECFFFFFFFFFFFFF2F2F2E2E2E2C3C3C91E1E4C22225529296768689FFFFFFF + FFFFFFFCFCFCEEEEEEAFAFBD22225625255F2E2E7338388F4141A44747B44B4B + BF4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC35858C79C9CDE7878D265 + 65CB9494DB9E9EDE8383D55A5AC74D4DC34D4DC36060C97979D26161CA6060C9 + 7B7BD37878D16565CB4E4EC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC30200000200004D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34C4CC14A4ABC4747 + B44343A93C3C993535872F2F7735356F9E9EB4F5F5F5FCFCFCFFFFFFFFFFFFFF + FFFFC9C9DF3B3B949797C9FFFFFFFFFFFFFCFCFCF4F4F4ECECEC1F1F5024245A + 2C2C7037378C4040A34747B44B4BBE4D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34C4CC0AAAADDFFFFFFFFFFFFF7F7F7E7E7E7E0E0E02B2B5722225629 + 29696969A0FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD22225625255F2E2E7338388F + 4141A44747B44B4BBF4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC35858 + C79C9CDE7474D04E4EC35B5BC88585D6A0A0DF9191DA6363CA4D4DC36161CA79 + 79D25B5BC84D4DC35C5CC87373D07C7CD36D6DCE5353C54D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC302 + 00000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC2 + 4B4BBE4848B84444AC3D3D9B3636892F2F764F4F80C4C4CFF2F2F2FAFAFAFFFF + FFFFFFFFFFFFFFF2F2F75757A74141A4A7A7D6FFFFFFFFFFFFFBFBFBF1F1F1BF + BFC92020502323592B2B6E37378A4040A14646B24B4BBE4D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34B4BBE9D9DD7FFFFFFFFFFFFFAFAFAECECECE3E3 + E35555772323592B2B6D6969A3FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD22225625 + 255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC35858C79C9CDE7575D14F4FC44D4DC35656C67676D19B9BDD9A9A + DD7373D06666CC7979D25C5CC84D4DC34E4EC35757C66A6ACD7C7CD37474D05D + 5DC84E4EC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC30200000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34C4CC14A4ABB4646B14040A238388E30307975759BDEDEE1F1F1F1 + F9F9F9FFFFFFFFFFFFFFFFFFF2F2F76565B14343A94545B0CDCDE9FFFFFFFFFF + FFFBFBFBEEEEEEB0B0BE2020512323592A2A6B3535873F3F9E4545B04A4ABC4D + 4DC24D4DC34D4DC34D4DC34D4DC34D4DC34D4DC24B4BBD9C9CD5FFFFFFFFFFFF + FCFCFCEFEFEFE6E6E656567A25255D2E2E736B6BA7FFFFFFFFFFFFFCFCFCEEEE + EEAFAFBD22225625255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC35858C79D9DDE7575D14F4FC44D4DC34D4DC3 + 4E4EC36868CC9595DBA3A3E09292DA8585D65C5CC84D4DC34D4DC34D4DC35050 + C46363CB7B7BD37A7AD26767CC5252C54D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC30200000200004C4CC34C4CC34C4CC34C4C + C34C4CC34C4CC34C4CC34C4CC34B4BC04848B84343AB3C3C993F3F89AAAAC0EC + ECECF2F2F2FAFAFAFFFFFFFFFFFFFFFFFFF2F2F86565B44242AB4545B24747B5 + CDCDEAFFFFFFFFFFFFFBFBFBECECECAEAEBD2020532222572929683333823C3C + 9A4444AE4949BB4B4BC14C4CC34C4CC34C4CC34C4CC34C4CC34B4BC14848BA9B + 9BD4FFFFFFFFFFFFFDFDFDF1F1F1EAEAEA58587D27276430307B6C6CABFFFFFF + FFFFFFFCFCFCEEEEEEAFAFBD21215625255F2D2D7338388F4040A44646B44B4B + BF4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC35757C79D9DDE7575D14E + 4EC44C4CC34C4CC34C4CC34C4CC35E5EC98A8AD8ADADE4AEAEE47171CF4C4CC3 + 4C4CC34C4CC34C4CC34C4CC35C5CC87575D17E7ED46D6DCE5454C64C4CC34C4C + C34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C + 4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC30200000200004C4CC3 + 4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34A4ABE4646B44141A65D5D + A4C7C7D6EFEFEFF5F5F5FBFBFBFFFFFFFFFFFFFFFFFFD8D8EA5959B04444AE46 + 46B34747B54646B4CDCDEAFFFFFFFFFFFFFBFBFBECECECAEAEBE222256222257 + 27276430307C3A3A944242A84747B74B4BC04C4CC24C4CC34C4CC34C4CC34C4C + C24A4ABE4747B59A9AD0FFFFFFFFFFFFFDFDFDF2F2F2ECECEC4C4C782B2B6D34 + 34846F6FB1FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD21215625255F2D2D7338388F + 4040A44646B44B4BBF4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC35757 + C79D9DDE7575D14E4EC44C4CC34C4CC34C4CC34C4CC34C4CC35656C68989D8B8 + B8E7A6A6E17171CF5454C64C4CC34C4CC34C4CC34C4CC35555C66C6CCE7E7ED4 + 7474D05B5BC84E4EC44C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4C + C34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC302 + 00000200004D4DC34D4DC34D4DC34D4DC34E4EC34E4EC34E4EC34E4EC24C4CBE + 4747B26464B3E6E6EBF3F3F3F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFA4A4CD4F4F + AB4646B14848B54848B54747B34646B0C1C1E3FFFFFFFFFFFFFDFDFDECECECBA + BAC725255D2323592727622E2E7538388C4141A14747B14B4BBC4D4DC14E4EC3 + 4D4DC34D4DC24C4CC04949BA4646AEBFBFDFFFFFFFFFFFFFFDFDFDF3F3F3EFEF + EF2828643131793A3A8F7272B6FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD22225526 + 265F2F2F743A3A904343A54A4AB54E4EC05050C45050C45050C45050C45050C4 + 5050C44E4EC35A5AC79E9EDE7676D14F4FC44D4DC34D4DC34D4DC34D4DC34D4D + C34C4CC36262CA9090DAA2A2E0A3A3E08080D45959C74D4DC34C4CC34C4CC34C + 4CC34E4EC46565CB7D7DD37B7BD36363CB5050C44C4CC34C4CC34C4CC34C4CC3 + 4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4C + C34C4CC34C4CC30200000200005656C65757C75858C75B5BC85D5DC95D5DC95E + 5EC95E5EC85C5CC36161BDE1E1EEF8F8F8FBFBFBFEFEFEFFFFFFFFFFFFF2F2F6 + 8484B45151A65858B55858BD5858BC5656B85454B15656AEA4A4D1FFFFFFFFFF + FFFFFFFFEEEEEEDEDEDE3030692A2A602C2C643333724646895454A05E5EB366 + 66C06A6AC86969CB6464C96363C76161C36060BB5E5EAFDDDDEBFFFFFFFFFFFF + FDFDFDF5F5F5D9D9DF42427850508F5C5CA48C8CC4FFFFFFFFFFFFFCFCFCEEEE + EEB4B4BF34345B3A3A6447477B5959996767B17171C27878CE7C7CD37D7DD37D + 7DD37D7DD37E7ED47E7ED47E7ED38585D6A8A8E28585D66161CA6060CA6060CA + 6060CA6060CA6060CA5E5EC96C6CCE7878D26868CC8F8FDAA7A7E19696DC6262 + CB4F4FC44C4CC34C4CC34C4CC34C4CC35C5CC87878D28080D46E6ECE5252C54C + 4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC3 + 4C4CC34C4CC34C4CC34C4CC34C4CC30200000200006262CB6464CB6868CC6F6F + CF6F6FCF7070CF7171D07272CF7070CAB0B0DCFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFD9D9E26464935A5A9A6868B07070BE6E6EC26868BC6464B46363AD6767A8 + 8F8FBDFFFFFFFFFFFFFFFFFFF2F2F2E0E0E059598835356D33336A3B3B725A5A + 8A68689D7474B07F7FBF8787CB8A8ACE7F7FCB7A7AC87676C07777B77E7EB0FF + FFFFFFFFFFFFFFFFFDFDFDF6F6F6ACACBD66668F7777A68484B9A8A8CFFFFFFF + FFFFFFFCFCFCEEEEEEB9B9C046465E4E4E696060817777A08B8BB99A9ACDA5A5 + DAABABE1ADADE3AEAEE4AEAEE4AFAFE4B0B0E4B1B1E5B2B2E5ACACE39191DA77 + 77D17777D17777D17777D17878D27878D27979D27979D27171CF5A5AC85252C5 + 7C7CD3A4A4E0A7A7E16F6FCF5454C64D4DC34C4CC34C4CC34C4CC35454C66F6F + CF8080D47878D25858C74E4EC44C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C + 4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC30200000200005151C4 + 5151C45656C65B5BC75757C65353C45555C55555C55656C1F5F5FBFFFFFFFFFF + FFFFFFFFFFFFFFB0B0C439396F38387C3E3E8F4B4BA25858AF4F4FB04848A844 + 449F4444974C4C95454592F3F3F8FFFFFFFFFFFFFAFAFAE5E5E57676A4313177 + 2E2E6F3434725050824B4B8C4646974A4AA25B5BB06161B65353B24D4DAC4949 + A54E4E9D9797BDFFFFFFFFFFFFFFFFFFFDFDFDF8F8F86363974646914E4EA253 + 53AE8181C4FFFFFFFFFFFFFBFBFBEDEDEDB1B1BE2A2A572F2F6038387345458C + 4F4FA25858B45E5EC06161C76363C96363CA6363CA6363CA6464CA6565CA6666 + CB6464CA5858C65555C55555C55555C55555C55555C55656C55656C55757C654 + 54C54D4DC24C4CC24E4EC36767CB9D9DDEA9A9E28686D65757C64C4CC24C4CC2 + 4C4CC24C4CC24F4FC36565CB8181D47F7FD36464CA4D4DC24C4CC24C4CC24C4C + C24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC202 + 00000200004C4CC24C4CC25151C45757C65151C44C4CC24C4CC24C4CC27272CD + FFFFFFFFFFFFFFFFFFFFFFFFD4D4E24A4A7F38387531317B36368A42429A4E4E + A54444A43D3D9B6D6DAE55559B42428B3B3B8A9696C6FFFFFFFFFFFFFFFFFFED + EDEDA1A1C234348631317C3434794F4F8442428637378A3A3A944C4CA25252A8 + 4444A33D3D9D3B3B9641418ECDCDDFFFFFFFFFFFFFFFFFFFFEFEFEC5C5D93737 + 8D3D3D9C4242A84444AD7474C1FFFFFFFFFFFFFAFAFAECECECAEAEBD23235B26 + 26612C2C713535873C3C9A4242AA4747B64A4ABD4B4BC04C4CC24C4CC24C4CC2 + 4C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4C + C24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24D4DC25656C59292DAAAAAE29B + 9BDD6565CA4C4CC24C4CC24C4CC24C4CC24C4CC25A5AC77C7CD28181D47171CF + 5151C44C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4C + C24C4CC24C4CC20200000200004B4BC24B4BC25050C45656C65050C44B4BC24B + 4BC24B4BC27D7DD2FFFFFFFFFFFFFFFFFFFDFDFD7676AB4444833D3D7E32327F + 3535883E3E9449499D40409A5252A0F1F1F18585B44141893B3B8C48489DE5E5 + F3FFFFFFFFFFFFFAFAFAE5E5E546469C36368D39398655558D43438835358737 + 378E4747984C4C9C3F3F9738389236368B7171A7FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF6D6DAD3D3D9D4242AA4444B14545B17474C1FFFFFFFFFFFFF8F8F8EAEA + EAADADBF2828672A2A6D2E2E783535893B3B994141A84545B44949BC4A4AC04B + 4BC14B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24C4C + C24C4CC27979D2A5A5E1AAAAE27474D04C4CC24B4BC24B4BC24B4BC24B4BC251 + 51C46E6ECE8181D47B7BD25858C74C4CC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC20200000200004B4BC24B4BC25151C45656 + C65151C44B4BC24B4BC24B4BC27E7ED2FFFFFFFFFFFFFFFFFFFBFBFB3D3D974D + 4D9343438B34348635358A3D3D914646973D3D948181B5EEEEEE6B6BA643438E + 3D3D913D3D9D7474C0FFFFFFFFFFFFFFFFFFF4F4F49797C73D3D9F4141985E5E + 9C49499337378C37378E4545934949963C3C9136368C424290E5E5EFFFFFFFFF + FFFFFFFFFFFFFFFFA3A3CE3E3EA14343AD4545B44747B74646B48282C8FFFFFF + FFFFFFFCFCFCEEEEEEB2B2C62F2F7A30307D3333853838913D3D9D4141A84545 + B44848BA4A4ABF4B4BC14B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24C4CC26767CC9D9DDEACACE38888D75858C64B4B + C24B4BC24B4BC24B4BC24F4FC36363CA8181D48181D46666CB4F4FC34B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC20200000200004B4BC2 + 4B4BC25151C45656C65151C44B4BC24B4BC24B4BC24F4FC3F5F5FCFFFFFFFFFF + FFFFFFFF4E4EAB5656A64B4B9B3B3B9439399440409749499B3F3F97C1C1D9EF + EFEF6D6DAD4A4A9A42429E4141A64444B09191D4FFFFFFFFFFFFFFFFFFF2F2F2 + 6E6EBC4848A86A6AAF5050A23C3C983A3A9748489B4C4C9B3E3E95383891BCBC + DAFFFFFFFFFFFFFFFFFFFFFFFFD8D8EC4141A74444B04747B74848BA4848BB47 + 47B89C9CD6FFFFFFFFFFFFFFFFFFF7F7F7BABAD23838913939933B3B973D3D9E + 4040A64343AE4646B64949BC4A4AC04B4BC14B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24C4CC25959C79090D9 + ADADE39B9BDD6767CC4B4BC24B4BC24B4BC24B4BC24D4DC35959C77C7CD38383 + D57272CF5454C54B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC202 + 00000200004B4BC24B4BC25151C45656C65151C44B4BC24B4BC24B4BC24F4FC3 + B1B1E4FFFFFFFFFFFFFFFFFF9999D25E5EB55454AD4141A43E3EA14545A44E4E + A67F7FBFF8F8F8F4F4F47272B85151A94848AB4545B04747B74949BC9E9EDDF6 + F6FCFFFFFFFFFFFFE9E9F18282C87474BE5757B14141A63F3FA44D4DA65252A7 + 4E4EA7CBCBE5FFFFFFFFFFFFFFFFFFFFFFFFCCCCE85050B44646B44848BA4949 + BD4A4ABF4A4ABE4848BBC2C2E7FFFFFFFFFFFFFFFFFFFFFFFFE7E7EE4B4BA940 + 40A54141A74242AA4444AF4646B44848BA4949BD4A4AC04B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC25353C57F7FD3ABABE3A7A7E17575D04B4BC24B4BC24B4BC24B4BC2 + 4B4BC25353C57070CF8383D57B7BD25B5BC74B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC20200000200004B4BC24B4BC25151C45656C65151C44B4BC24B + 4BC24B4BC24F4FC37676D0DEDEF4FFFFFFFFFFFFFFFFFFA8A8D95A5ABA4646B1 + 4343AD4A4AAF9797D0F3F3FAFFFFFFFBFBFB7777C35757B64D4DB64848B84949 + BC4A4ABF6060C88A8AD7D5D5F0FFFFFFFFFFFFFBFBFBC3C3E38E8ECE4646B244 + 44AF7373BFA4A4D4F3F3F9FFFFFFFFFFFFFFFFFFFFFFFFA0A0D74646B64848BA + 4949BD4A4ABF4B4BC14B4BC17A7AD19E9EDCFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFBCBCE17373C55C5CBC4646B54747B74848BA4949BD4A4ABF4B4BC14B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC25050C46E6ECE9D9DDEAFAFE48888D755 + 55C54B4BC24B4BC24B4BC24B4BC25151C46666CB7F7FD48181D46666CB4D4DC3 + 4B4BC24B4BC24B4BC24B4BC24B4BC20200000200004B4BC24B4BC25151C45656 + C65151C44B4BC24B4BC24B4BC24F4FC36D6DCD5D5DC8A0A0DEFFFFFFFFFFFFFF + FFFFF3F3FACDCDEBCECEECF3F3FAFFFFFFFFFFFFFFFFFFFFFFFF7C7CCC5C5CC1 + 5050BF4B4BBE4A4AC04B4BC16060C97878D16161C97B7BD2C3C3EAFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3FABBBBE57979CB52 + 52BF4A4ABE4A4AC04B4BC14B4BC14B4BC24B4BC2FFFFFFFFFFFFF3F3FBCFCFEE + CECEEDCECEEDCECEEDDBDBF2FFFFFFFEFEFE9C9CD94949BD4949BD4A4ABF4A4A + C04B4BC14B4BC14B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC26161 + C99494DBB0B0E49494DB6868CC4B4BC24B4BC24B4BC24B4BC24C4CC25D5DC87C + 7CD38585D66E6ECE5454C54B4BC24B4BC24B4BC24B4BC20200000200004B4BC2 + 4B4BC25151C45656C65151C44B4BC24B4BC24B4BC24F4FC36E6ECE5D5DC84C4C + C25757C69595DBBABAE7D5D5F1CFCFEECFCFEEC5C5EBA9A9E1A2A2DE9292D97A + 7AD05C5CC66060C75353C44C4CC14B4BC24B4BC26060C97878D16161C94B4BC2 + 4B4BC25F5FC9ABABE2ACACE3C3C3EACFCFEED4D4F0D5D5F0A2A2DE8686D45656 + C35A5AC66868CA5555C44B4BC14B4BC24B4BC24B4BC24B4BC24B4BC27B7BD26F + 6FCE4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC26363CA7B7BD26363CA4B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC25858C78787D6AFAFE4A6A6E17575D05050C44B4BC24B4B + C24B4BC24B4BC25858C67575D08585D67777D15B5BC74B4BC24B4BC24B4BC202 + 00000200004A4AC24A4AC25050C45656C65050C44A4AC24A4AC24A4AC24E4EC3 + 6D6DCE5C5CC84B4BC24A4AC24E4EC36C6CCD6161CA4C4CC34A4AC25353C55E5E + C95151C44A4AC24A4AC25050C46060C95353C54B4BC24A4AC24A4AC26060C978 + 78D26161CA4A4AC24A4AC25353C58181D56464CB4B4BC24A4AC25D5DC86363CA + 5050C44A4AC24A4AC25A5AC86969CC5454C54A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24F4FC47676D1A2A2E0B1B1E5 + 8383D55A5AC84B4BC24A4AC24A4AC24A4AC25050C46B6BCD8282D58080D46161 + CA4E4EC34A4AC20200000200004A4AC24A4AC25050C45656C65050C44A4AC24A + 4AC24A4AC24E4EC36D6DCE5C5CC84B4BC24A4AC24E4EC36D6DCE6262CA4C4CC3 + 4A4AC25353C55F5FC95151C44A4AC24A4AC25050C46161CA5353C54B4BC24A4A + C24A4AC26060C97878D26161CA4A4AC24A4AC25353C58282D56464CB4B4BC24A + 4AC25D5DC86464CB5050C44A4AC24A4AC25A5AC86969CD5454C54A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24B + 4BC26060C99191DAB2B2E59696DC6363CA4A4AC24A4AC24A4AC24A4AC24C4CC3 + 5F5FC97A7AD28484D66B6BCD5252C50200000200004A4AC24A4AC25050C45656 + C65050C44A4AC24A4AC24A4AC24E4EC36E6ECE5C5CC84B4BC24A4AC24E4EC36D + 6DCE6262CA4C4CC34A4AC25353C55F5FC95151C44A4AC24A4AC25050C46161CA + 5353C54B4BC24A4AC24A4AC26060C97979D26161CA4A4AC24A4AC25454C58383 + D56464CB4B4BC24A4AC25D5DC86464CB5050C44A4AC24A4AC25A5AC86969CD54 + 54C54A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24B4BC26060C9ABABE3B3B3E58080D44A4AC24A4AC24A + 4AC24A4AC24A4AC24B4BC26262CA8686D68282D55E5EC90200000200004A4AC2 + 4A4AC25050C45656C65050C44A4AC24A4AC24A4AC24E4EC36E6ECE5C5CC84B4B + C24A4AC24E4EC36D6DCE6262CA4C4CC34A4AC25353C55F5FC95151C44A4AC24A + 4AC25050C46161CA5353C54B4BC24A4AC24A4AC26161CA7A7AD26161CA4A4AC2 + 4A4AC25454C58383D56464CB4B4BC24A4AC25D5DC86464CB5151C44A4AC24A4A + C25A5AC86969CD5454C54A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24D4DC36262CA9E9EDEAEAEE49999DD5959 + C74A4AC24A4AC24A4AC24A4AC24C4CC36262CA8080D48181D56C6CCD4B4BC202 + 00000200004A4AC24A4AC25050C45757C65050C44A4AC24A4AC24A4AC24E4EC3 + 6F6FCE5C5CC84B4BC24A4AC24F4FC46D6DCE6363CA4C4CC34A4AC25353C55F5F + C95151C44A4AC24A4AC25050C46161CA5353C54B4BC24A4AC24A4AC26161CA7A + 7AD26161CA4A4AC24A4AC25454C58383D56464CB4B4BC24A4AC25E5EC96464CB + 5151C44A4AC24A4AC25B5BC86A6ACD5454C54A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC25050C47070CFAEAEE4B0B0E4 + 8383D55050C44A4AC24A4AC24A4AC24A4AC24F4FC46B6BCD8686D67F7FD46060 + C94A4AC24A4AC20200000200004A4AC14A4AC15050C35757C55050C34A4AC14A + 4AC14A4AC14E4EC27070CE5D5DC84B4BC14A4AC14F4FC36D6DCD6363CA4C4CC2 + 4A4AC15353C45F5FC85151C34A4AC14A4AC15050C36161C95353C44B4BC14A4A + C14A4AC16161C97A7AD26161C94A4AC14A4AC15454C48484D56565CA4B4BC14A + 4AC15E5EC86464CA5151C34A4AC14A4AC15B5BC76A6ACC5454C44A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4A + C14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A + 4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4A + C14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC15656C58A8AD7B2 + B2E4A6A6E16969CB4B4BC14A4AC14A4AC14A4AC14A4AC15757C57777D08585D5 + 7575D05353C44A4AC14A4AC14A4AC10200000200004A4AC14A4AC15050C35757 + C55050C34A4AC14A4AC14A4AC14E4EC27070CE5E5EC84B4BC14A4AC14F4FC36F + 6FCE6464CA4C4CC24A4AC15353C45F5FC85252C44A4AC14A4AC15050C36262C9 + 5353C44B4BC14A4AC14A4AC16161C97B7BD26262C94A4AC14A4AC15454C48585 + D56565CA4B4BC14A4AC15E5EC86565CA5151C34A4AC14A4AC15B5BC76B6BCC54 + 54C44A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4A + C14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A + 4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC16464 + CAA1A1DFB2B2E49797DB5656C54B4BC14A4AC14A4AC14A4AC14A4AC16161C980 + 80D38585D56B6BCC4B4BC14A4AC14A4AC14A4AC14A4AC10200000200004949C1 + 4949C14F4FC35757C64F4FC34949C14949C14949C14D4DC27070CE5D5DC84A4A + C14949C14E4EC36E6ECE6363CA4B4BC24949C15252C45F5FC95151C44949C14A + 4AC14F4FC36161C95252C44A4AC14949C14949C16060C97B7BD26161C94949C1 + 4949C15353C48484D56464CA4A4AC14949C15D5DC86464CA5050C34949C14949 + C15A5AC76A6ACC5454C54949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C17272CFADADE3ACACE37E7ED34C4CC24949C14949C14949C14949C14A4A + C16C6CCD8484D57D7DD35E5EC84949C14949C14949C14949C14949C14949C102 + 00000200004949C14949C15050C35757C65050C34949C14949C14949C14D4DC2 + 7070CE5D5DC84A4AC14949C14E4EC36F6FCE6363CA4B4BC24949C15252C45F5F + C95151C44949C14A4AC14F4FC36161C95252C44A4AC14949C14949C16161C97B + 7BD26161C94949C14949C15353C48585D56565CA4A4AC14949C15E5EC86464CA + 5050C34949C14949C15A5AC76A6ACC5454C54949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C15757C68B8BD7B0B0E4A0A0DF6868CC4C4CC24949C14949C14949C1 + 4949C15656C57777D18484D57272CF5656C54A4AC14949C14949C14949C14949 + C14949C14949C10200000200004949C14949C15050C35757C65050C34949C149 + 49C14949C14D4DC27070CE5D5DC84A4AC14949C14E4EC36F6FCE6363CA4B4BC2 + 4949C15252C45F5FC95151C44949C14A4AC14F4FC36262CA5252C44A4AC14949 + C14949C16161C97C7CD26161C94949C14949C15353C48686D66565CA4A4AC149 + 49C15E5EC86565CA5050C34949C14949C15A5AC76B6BCC5454C54949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C16565CA9999DCB0B0E49696DB5C5CC74A4AC14949C149 + 49C14949C14949C16262CA7C7CD28484D56A6ACC5050C34949C14949C14949C1 + 4949C14949C14949C14949C14949C10200000200004949C14949C15050C35757 + C65050C34949C14949C14949C14D4DC27171CF5E5EC84A4AC14949C14E4EC370 + 70CE6363CA4B4BC24949C15353C46060C95151C44949C14A4AC15050C36262CA + 5252C44A4AC14949C14949C16161C97C7CD26262CA4949C14949C15353C48686 + D66666CB4A4AC14949C15E5EC86565CA5050C34949C14949C15B5BC76B6BCC54 + 54C54949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C17676D0A9A9E2ADADE37F7FD35252C44949 + C14949C14949C14949C14D4DC26C6CCD8484D57D7DD35F5FC94C4CC24949C149 + 49C14949C14949C14949C14949C14949C14949C14949C10200000200004949C1 + 4949C15050C35757C65050C34949C14949C14949C14D4DC27171CF5E5EC84A4A + C14949C14E4EC37070CE6363CA4B4BC24949C15353C46060C95151C44949C14A + 4AC15050C36262CA5252C44A4AC14949C14949C16161C97C7CD26262CA4949C1 + 4949C15353C48686D66666CB4A4AC14949C15E5EC86565CA5050C34949C14949 + C15B5BC76B6BCC5454C54949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C15959C78787D6AEAEE49E9EDE6E6ECE + 4E4EC34949C14949C14949C14A4AC15959C77575D08484D57171CF5858C64A4A + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C102 + 00000200004949C14949C15050C35757C65050C34949C14949C14949C14D4DC2 + 7272CF5E5EC84A4AC14949C14E4EC37171CF6262CA4A4AC14949C15353C46060 + C95151C44949C14A4AC15050C36363CA5151C44A4AC14949C14949C16161C97C + 7CD26262CA4949C14949C15454C58686D66363CA4A4AC14949C15E5EC86565CA + 5050C34949C14949C15B5BC76B6BCC5353C44949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14A4AC16666CB9595DBAFAFE492 + 92DA6161C94A4AC14949C14949C14949C14D4DC26262CA7C7CD28383D56969CC + 5050C34949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C10200000200005454C55454C55C5CC86262CA5F5FC95959C65B + 5BC75B5BC75F5FC87777D16464CA5050C34F4FC35555C57676D07171CE6060C8 + 5D5DC86565CB6E6ECE6262C95959C75A5AC76060C87272CF6868CC6363CA6363 + CA6060C97474D08686D66B6BCD5252C45353C45D5DC78E8ED87979D16767CB66 + 66CB7575D07979D16565CB5F5FC95F5FC96F6FCE7F7FD37070CF6969CC6B6BCD + 6B6BCD6C6CCD6C6CCD6C6CCD6C6CCD6D6DCD6D6DCD6D6DCD6E6ECD6F6FCE6F6F + CE6F6FCE6F6FCE7070CE7070CE7070CE7070CE7171CF7171CF7171CF7272CF72 + 72CF7373CF7373CF7373CF7373CF7474CF7171CE6363CA5A5AC75959C75959C7 + 5959C75959C75959C75A5AC75A5AC75656C54D4DC24949C14E4EC37575D0A8A8 + E1AAAAE28383D55252C44949C14949C14949C14949C15050C36C6CCD8383D57B + 7BD26161C94949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C10200000200006767CB6767CB6D6DCE7474 + D07878D17777D17878D17979D27A7AD27C7CD36969CC5B5BC75B5BC75E5EC979 + 79D28383D58282D58282D58585D68282D57979D27676D17777D17B7BD28989D7 + 8A8AD78B8BD88C8CD88C8CD89191DA8C8CD97373CF6363CA6363CA6B6BCD9898 + DC9696DB9595DB9595DB9999DC9494DB8888D78484D58585D69090D99F9FDE9D + 9DDE9D9DDE9E9EDE9F9FDEA0A0DEA0A0DFA1A1DFA2A2E0A3A3E0A4A4E0A4A4E0 + A6A6E1A7A7E1A7A7E1A7A7E1A8A8E2A9A9E2AAAAE2ABABE2ABABE3ACACE3ADAD + E3AEAEE4AEAEE4AFAFE4AFAFE4B0B0E4B0B0E4B2B2E5B2B2E5B3B3E59292DA75 + 75D07575D07575D07575D07676D17676D17676D17A7AD27272CF5757C65B5BC7 + 8484D5AEAEE49C9CDD6D6DCE4C4CC24848C14848C14848C14949C15757C67373 + D08282D57171CF5555C54848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C10200000200005B5BC8 + 5C5CC85D5DC86262CA6666CB6767CB6767CB6868CB6969CC6565CB5858C75454 + C55353C55454C56363CA6C6CCD6E6ECE6E6ECE6E6ECE6C6CCD6666CB6565CB65 + 65CB6767CC7171CF7272D07474D07474D07575D07878D16D6DCE5D5DC85959C7 + 5959C75D5DC87575D07A7AD27B7BD27C7CD27C7CD27474D06F6FCE6F6FCE6F6F + CE7474D07E7ED38181D48181D48181D48383D58383D58383D58484D68484D685 + 85D68585D68686D68787D68787D68888D78989D78989D78989D78989D78B8BD8 + 8B8BD88B8BD88C8CD88C8CD88E8ED98E8ED98E8ED98E8ED98E8ED98E8ED99595 + DBB3B3E58D8DD86666CB6565CB6565CB6565CB6565CB6565CB6363CA7171CF7C + 7CD37474D09595DBAEAEE49191DA5A5AC74949C14848C14848C14848C14B4BC2 + 5F5FC97A7AD28181D46868CC4C4CC24848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C102 + 00000200004848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C15656C6A6A6E17777D14A4AC24848C14848C14848C14848C14848 + C14848C16464CB9B9BDEB0B0E4A9A9E27F7FD44949C14848C14848C14848C148 + 48C14D4DC36A6ACC8181D47C7CD35E5EC84848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C10200000200004848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C15656C6A7A7E17878D14A4AC24848C14848C1 + 4848C14848C14848C15252C49191DAC4C4EBA9A9E26B6BCD4848C14848C14848 + C14848C14949C15151C47373D08181D47272CF5555C54848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C10200000200004848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C15656C6A7A7E17878D14A + 4AC24848C14848C14848C14848C16060C99898DCB7B7E7AFAFE46868CB4848C1 + 4848C14848C14848C14848C15D5DC87C7CD38181D46767CB4C4CC24848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C10200000200004848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C05656 + C5A7A7E17878D14A4AC14848C04848C04848C07272CFA5A5E0ACACE38D8DD87E + 7ED25B5BC64848C04848C04848C04B4BC16B6BCC7F7FD37E7ED35C5CC74848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C002 + 00000200004848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C05656C5A7A7E17878D14A4AC14848C04B4BC18585D5ABABE29E9E + DE6868CB5F5FC87D7DD25B5BC64848C04949C05050C37474CF8181D47373CF53 + 53C44848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C00200000200004848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C05656C5A8A8E17878D14949C05F5FC89797DB + ACACE28C8CD75B5BC64848C06060C87E7ED35A5AC64848C05F5FC87C7CD28181 + D46565CA4F4FC24848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C00200000200004747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C05555C5A8A8E17878D178 + 78D19F9FDEABABE27878D15151C34747C04747C05F5FC87C7CD26060C86868CB + 7F7FD37C7CD25959C64B4BC14747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C00200000200004747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C05555 + C5A8A8E19E9EDEAAAAE29D9DDD6A6ACC4B4BC14747C04747C04747C05D5DC87F + 7FD37A7AD17F7FD36F6FCE5353C44747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C002 + 00000200004747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C05454C4A9A9E2A9A9E28888D65F5FC84949C14747C04747C04747 + C04747C05D5DC87F7FD37B7BD26464CA4E4EC24747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C00200000200004747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C05050C38F8FD97A7AD15252C44848C04747C0 + 4747C04747C04747C04747C05858C67070CE5D5DC84848C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C00200000200004747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04848C05555C54747C047 + 47C04747C04747C04747C04747C04747C04747C04B4BC14D4DC24747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C00200000200004747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C002 + 00000200004747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C00200000200004747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C00200000200004646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C00200000200004646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C002 + 00000200004545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD45 + 45BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD45 + 45BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD45 + 45BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD0200000200004242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242 + B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242 + B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242 + B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B80200000200003F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB1 + 3F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB1 + 3F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB1 + 3F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB10200000200003A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A + 3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A + 3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A + 3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA602 + 0000020000333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 9933339933339933339933339933339933339933339933339933339933339933 + 3399333399333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 9933339933339933339933339933339933339933339933339933339933339933 + 3399333399333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 9933339933339933339933339933339933339933339933339933339933339933 + 3399333399333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 993333993333990200000200002C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C + 8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C + 8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C + 8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A0200000200002323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378232378232378232378 + 2323782323782323782323782323782323782323782323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378232378232378232378 + 2323782323782323782323782323782323782323782323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378232378232378232378 + 2323782323782323782323782323782323782323782323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378020000020000191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196419 + 1964191964191964191964191964191964191964191964191964191964191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196419 + 1964191964191964191964191964191964191964191964191964191964191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196419 + 1964191964191964191964191964191964191964191964191964191964191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196402 + 00000200000E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E + 0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E + 0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E + 0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C02000002000008083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F02000002000008083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F02000002000008083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F02 + 00000200005E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E + 5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E + 5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E + 5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB00200000200005757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757 + AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757 + AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757 + AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC0200000200004A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA6 + 4A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA6 + 4A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA6 + 4A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA60200000200003B3B9F + 3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B + 9E3A3A9C39399A38389838389738389738389738389839399B3A3A9D3B3B9E3B + 3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9E3A3A9C39399A383898383898383898 + 39399A3A3A9D3B3B9E3B3B9F3B3B9E3B3B9E3A3A9C39399B39399A39399A3939 + 9A39399A39399B3A3A9C3B3B9E3B3B9E3B3B9F3B3B9F3B3B9F3B3B9F3B3B9E3A + 3A9D39399A38389838389738389839399A39399B3A3A9D3B3B9E3B3B9F3B3B9F + 3B3B9F3B3B9F3B3B9E3A3A9D39399B39399A39399A39399A39399A39399A3939 + 9A39399A39399A39399A39399A39399A39399A39399A39399B3A3A9C3A3A9D3B + 3B9E3A3A9D39399A38389838389838389939399A39399B39399B39399A39399A + 39399A3A3A9C3B3B9E3B3B9E3B3B9E3A3A9D3A3A9D3A3A9D3A3A9D3A3A9C3939 + 9A38389838389838389939399B3A3A9D3B3B9E3B3B9F3B3B9F3B3B9F3B3B9F02 + 00000200002C2C972C2C972C2C972C2C972C2C972C2C972C2C972C2C972C2C96 + 2B2B952A2A9229298D2727872525832525812424802525812525822525832626 + 8628288B2A2A902B2B952C2C962C2C972B2B952A2A9229298D27278725258225 + 258125258125258226268427278829298D2A2A922B2B942A2A9229298D272787 + 25258325258225258225258327278729298D2A2A922C2C962C2C972C2C972C2C + 962B2B9429298F27278926268425258124248025258126268427278729298D2A + 2A922B2B952C2C972C2C972C2C962B2B942A2A9028288A262686252583252582 + 2525812525822525832626842626852626852626842525822525822525822626 + 8528288A29298F29298F28288A26268424248024248025258226268526268626 + 268525258225258125258327278829298F2A2A922A2A9229298E28288A28288A + 28288927278726268425258124247F25258126268528288B2A2A912B2B952C2C + 972C2C972C2C970200000200001F1F911F1F911F1F911F1F911F1F911F1F911F + 1F911F1F901E1E8D1D1D871B1B7E18187416166C15156815156916166B16166D + 17176E17176F1717711818751A1A7D1C1C861E1E8C1E1E8D1D1D881B1B7F1818 + 7416166C15156815156916166A16166A16166A16166E1818751B1B801D1D871D + 1D871B1B7E1818731515691414631414631515691818731B1B7F1D1D891F1F8F + 1F1F911F1F901E1E8D1C1C8519197A17176E15156715156615156916166C1717 + 701818731919791B1B811D1D891F1F8F1F1F911F1F901E1E8D1C1C861A1A7C18 + 187216166A14146514146214146315156817176F18187318187417177116166C + 15156814146516166A1818741A1A7D1A1A7B1717711515661313611414631616 + 6A17176F17176F16166A1414641414621515681818731B1B801D1D871C1C841A + 1A7B18187317177017177017177016166E16166A151566141463151568181872 + 1B1B7F1D1D8A1F1F8F1F1F911F1F9102000002000016168C16168C16168C1616 + 8C16168C16168C16168C1515881414801212730F0F630D0D570C0C520C0C550E + 0E5D0F0F6610106B10106B1010690F0F640F0F6310106812127313137D141480 + 1212760F0F660D0D570C0C510C0C560E0E5E0F0F630E0E5F0C0C560C0C530D0D + 580F0F6712127613137D1212760F0F670C0C540A0A490A0A490C0C540F0F6712 + 127815158516168A16168C1515891414811111710E0E5F0C0C520B0B4E0C0C55 + 0E0E5E0F0F650F0F660F0F6610106911117113137D15158716168C16168C1515 + 881414811212761010680D0D580B0B4C0909450A0A490C0C530F0F6210106B11 + 116E1010690E0E620D0D580B0B500C0C540E0E6010106D1010690D0D5A0A0A4B + 0A0A470B0B4E0D0D5A0E0E5E0D0D5A0B0B500A0A480A0A490C0C530F0F641212 + 7413137E13137910106A0D0D5A0C0C530C0C560D0D5C0E0E610E0E600D0D580B + 0B4E0B0B4D0D0D5710106913137A15158616168C16168C0200000200000F0F89 + 0F0F890F0F890F0F890F0F890F0F890F0F860E0E7E0C0C6E09095B4545778383 + A1A3A3BAC2C2D5C2C2D9C3C3DCA5A5CC7777B22A2A840B0B6A0A0A610A0A5E0B + 0B660C0C710C0C710A0A635555868383A1C1C1D1C2C2D4A4A4C58585B5383881 + 0808510606440606430808516767A08686BB8686BA8585B28383A582829D8282 + 9D64648F0B0B650D0D780E0E850F0F880F0F890E0E820C0C7438387C8383A4A2 + A2B7C1C1D0C2C2D49494B867679F0A0A640A0A5F0A0A5D0A0A640C0C720E0E80 + 0F0F882D2D988787C38787C18686BC8585B58484AA8383A182829B82829D8383 + A58585B18686B88686BB8686B98585B58585AF65659308085009095B39398485 + 85B2A3A3BFC1C1D19393AB8383A336367328286C8484A8C1C1D082829C54547A + 08084D0A0A640C0C754A4A9E7777B119196907074A54547D8383A4A3A3C1C3C3 + D9A4A4C77575A426266006063F0606420808540B0B6B0E0E7D0F0F870F0F8902 + 00000200000C0C870C0C870C0C870C0C870C0C870C0C870B0B800A0A7265659A + E1E1E9FFFFFFFFFFFFF0F0F4A3A3C38585B88585BEA4A4D0F1F1F8FFFFFF7676 + B209096B08086409096709096B565697F0F0F5FFFFFFFFFFFFE1E1E87474A0C2 + C2DBFFFFFFFFFFFFE1E1EA53537B0404380505436464989494C2FFFFFFFFFFFF + FFFFFFFFFFFF9292A864648E0909650A0A770B0B800B0B800B0B800B0B7AA3A3 + C7FFFFFFFFFFFFFFFFFFC1C1D08383A8B2B2CDF0F0F6E1E1EC55558C07075408 + 085C09096D0B0B7C0C0C852A2A968686C39595CAF1F1F7FFFFFFFFFFFFFFFFFF + FFFFFF9292A88383A59494BCC3C3DEF1F1F8FFFFFFFFFFFFFFFFFFC2C2D70808 + 5B555593FFFFFFFFFFFFFFFFFFFFFFFFA2A2B8B2B2C6FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFE0E0E7B2B2C81818710B0B798585BFFFFFFFD1D1E1C1C1D0FFFFFF + E1E1E8A3A3C2FFFFFFFFFFFFFFFFFFF0F0F433335F04043705054608085E0A0A + 760C0C830C0C870200000200000B0B870B0B870B0B870B0B870B0B870B0B8619 + 1984B2B2D1FFFFFFFFFFFFFFFFFFD1D1DB1616580808680A0A7B0B0B860B0B87 + 1A1A8FD2D2E9FFFFFFC2C2DE18187E0909756666A8FFFFFFFFFFFFFFFFFFB1B1 + C0040441070758090971E1E1EFFFFFFFFFFFFFFFFFFF52527504044107075809 + 0972FFFFFFFFFFFFFFFFFFFFFFFF04043705054807076109096F090973090972 + 090973A3A3CAFFFFFFFFFFFFFFFFFF81819A04044006065307075E171769B2B2 + CAFFFFFF44447706065508086A0A0A7B0B0B850B0B870B0B870B0B879595C9FF + FFFFFFFFFFFFFFFFFFFFFF04043806064C0808690A0A7D1A1A8F6767B4FFFFFF + FFFFFFC2C2DD0909707575B0FFFFFFFFFFFFFFFFFFE1E1EA05054805054B7373 + 9FFFFFFFFFFFFFFFFFFFC1C1CD14144944447E09096E0A0A7F8585C1FFFFFFFF + FFFFFFFFFFA1A1B505054307075C282884FFFFFFFFFFFFFFFFFFF0F0F323234E + 05054307075C0909740B0B820B0B870200000200000B0B870B0B870B0B870B0B + 870B0B870B0B859494C5FFFFFFFFFFFFFFFFFFFFFFFF43436D06065109096D0A + 0A7F0B0B870B0B870B0B871A1A8FD2D2E9FFFFFF8585BF0A0A7DF1F1F7FFFFFF + FFFFFFFFFFFF82829D0404400606520808668484B7FFFFFFFFFFFFFFFFFFC1C1 + CF05054807075E090972FFFFFFFFFFFFFFFFFFFFFFFF03033505054306065507 + 075D07075B07075836367DFFFFFFFFFFFFFFFFFFFFFFFF62628444447144447F + 45458645458344447763638924245C07075709096E0A0A7E0B0B860B0B870B0B + 870B0B878585C1FFFFFFFFFFFFFFFFFFFFFFFF04043806064C0808690A0A7D0B + 0B870B0B878585C3FFFFFFC2C2E00A0A7F191988C2C2E0FFFFFFFFFFFFFFFFFF + B2B2C744447A454581FFFFFFFFFFFFFFFFFFC1C1CE0505410707580909720A0A + 818585C1FFFFFFFFFFFFFFFFFF53537604043F060654080866D1D1E4FFFFFFFF + FFFFFFFFFFA1A1B605054A0808630A0A780B0B840B0B870200000200000B0B87 + 0B0B870B0B870B0B870B0B872A2A93FFFFFFFFFFFFFFFFFFFFFFFFD1D1D90404 + 3C06065209096D0A0A800B0B870B0B870B0B870B0B870B0B840A0A7E0A0A790A + 0A79FFFFFFFFFFFFFFFFFFFFFFFF63638D05054606064F07075D8484B1FFFFFF + FFFFFFFFFFFFC1C1D207075908086B090977FFFFFFFFFFFFFFFFFFFFFFFF0404 + 3C05054506064F06065106064D06064C444480FFFFFFFFFFFFFFFFFFFFFFFFC1 + C1D2C1C1D2C1C1D5FFFFFFFFFFFFFFFFFFFFFFFF73739B0808610909750B0B82 + 0B0B870B0B870B0B870B0B878585C1FFFFFFFFFFFFFFFFFFFFFFFF0404380606 + 4C0808690A0A7D0B0B870B0B870B0B874848A539399E0B0B860B0B860B0B8438 + 38959393BFC2C2D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1C1D006064D + 0808620A0A770B0B838585C1FFFFFFFFFFFFFFFFFF43436804043B06064C0707 + 5AC2C2D7FFFFFFFFFFFFFFFFFFC1C1D207075A09096F0A0A7E0B0B860B0B8702 + 00000200000B0B870B0B870B0B870B0B870B0B876767B3FFFFFFFFFFFFFFFFFF + FFFFFFC1C1CC04043A06064F08086B0A0A7D0B0B870B0B870B0B870B0B840A0A + 7C09096F080866080869C2C2DDFFFFFFFFFFFFFFFFFF9393B907075706065607 + 075AB2B2CDFFFFFFFFFFFFFFFFFFA3A3C409096E0A0A780A0A7AFFFFFFFFFFFF + FFFFFFFFFFFF35356F252569C2C2D5E1E1EAB2B2C9353572171766F0F0F6FFFF + FFFFFFFFFFFFFF17176707075907075CC2C2D7FFFFFFFFFFFFE1E1EB17176C09 + 09720A0A7E0B0B850B0B870B0B870B0B870B0B878585C1FFFFFFFFFFFFFFFFFF + FFFFFF04043806064C0808690A0A7D0B0B870B0B870B0B870B0B870B0B870B0B + 870B0B875858ACC2C2E0E1E1EE9393BC07075B07075B64649CFFFFFFFFFFFFFF + FFFFC1C1D50707600909700A0A7E0B0B858585C1FFFFFFFFFFFFFFFFFF72728E + 04043A050549060656F0F0F5FFFFFFFFFFFFFFFFFF64649A09096C0A0A7B0B0B + 840B0B870B0B870200000200000B0B870B0B870B0B870B0B870B0B877676BCFF + FFFFFFFFFFFFFFFFFFFFFFC1C1CE04043A0505480707610909740A0A800B0B83 + 0A0A810A0A7A09096D07075B06065307075A282881D2D2E7FFFFFFFFFFFFF1F1 + F76666A508086B6565A1FFFFFFFFFFFFFFFFFFD2D2E51818800A0A7E0B0B8229 + 2990FFFFFFFFFFFFFFFFFFFFFFFFD1D1E3B2B2D1FFFFFFFFFFFFFFFFFFA3A3C7 + 0909706666ABFFFFFFFFFFFFFFFFFF7575B009096E27277EFFFFFFFFFFFFFFFF + FF6666A50909760A0A7F0B0B840B0B870B0B870B0B870B0B870B0B858585BFFF + FFFFFFFFFFFFFFFFFFFFFF0404370505490808650A0A790B0B850B0B860B0B87 + 0B0B870B0B870B0B870B0B879595CBFFFFFFFFFFFFF1F1F709097009096D7575 + ADFFFFFFFFFFFFFFFFFF9494BF0909750A0A7E0B0B840B0B868585C0FFFFFFFF + FFFFFFFFFFE0E0E7727292545486C2C2D8FFFFFFFFFFFFFFFFFFB2B2D1090974 + 0A0A7C0B0B830B0B870B0B870B0B870200000200000B0B870B0B870B0B870B0B + 870B0B8739399EFFFFFFFFFFFFFFFFFFFFFFFFC1C1D104044005054606065608 + 08670909730A0A7709097509096DB2B2CDC1C1D405054906065409096C191986 + 8585C3E1E1F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2E66666AE0A0A800B0B + 830B0B86C3C3E1FFFFFFFFFFFFFFFFFFFFFFFFB3B3D7C2C2DFFFFFFFFFFFFFFF + FFFFF1F1F747479D0A0A7F0B0B832A2A95A4A4D2F1F1F8FFFFFFD2D2E7FFFFFF + FFFFFFE1E1EF8585BE0A0A7F0B0B820B0B850B0B870B0B870B0B870B0B870B0B + 850A0A818585BBFFFFFFFFFFFFFFFFFFFFFFFF04043A0505490707600909730A + 0A800B0B840B0B870B0B870B0B870B0B870B0B870B0B877676BCE1E1F0FFFFFF + C2C2E0D2D2E7FFFFFFFFFFFFFFFFFF8585BD0A0A7E0B0B820B0B850B0B860B0B + 858585BEFFFFFFFFFFFFFFFFFFD1D1DAF0F0F4FFFFFFFFFFFFFFFFFFFFFFFFA4 + A4CE1919860A0A810B0B850B0B870B0B870B0B870B0B870200000200000B0B87 + 0B0B870B0B870B0B870B0B870B0B87C3C3E1FFFFFFFFFFFFFFFFFFFFFFFF1616 + 5C06064E06065307075D08086708086B08086B8484B2FFFFFFFFFFFF06065107 + 075D0909710A0A800B0B870B0B871A1A8F4848A54848A54848A40B0B850B0B86 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B8739399E2A2A960B0B + 870B0B8739399E39399E0B0B870B0B870B0B870B0B870B0B870B0B870B0B8739 + 399E4848A54848A42A2A940B0B850B0B860B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B830A0A7D8484B8FFFFFFFFFFFFFFFFFFFFFFFF0505460606 + 4F07075E09096D0A0A7A0B0B820B0B860B0B870B0B870B0B870B0B870B0B870B + 0B870B0B871A1A8F4848A54848A54848A439399C0B0B850B0B860B0B870B0B87 + 0B0B870B0B860B0B828585BCFFFFFFFFFFFFFFFFFF8282A106064C0707604747 + 982A2A920B0B860B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B8702 + 00000200000B0B870B0B870B0B870B0B870B0B870B0B871A1A8FD2D2E9FFFFFF + FFFFFFFFFFFFA3A3C70808620707600808620808660808697474ABFFFFFFFFFF + FFFFFFFF08086609096D0A0A7A0B0B830B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B830A0A7D9494C2FFFFFFFFFFFFFFFFFF + FFFFFF07075D0707600808680909710A0A7A0B0B820B0B860B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B860A0A818585BCFFFFFFFFFFFFFFFFFF8383AB + 07075C08086B0A0A7A0B0B840B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870200000200000B0B870B0B870B0B870B0B870B0B870B0B870B + 0B871A1A8F9595CBFFFFFFFFFFFFFFFFFFE1E1EE7575B14747956666A8C2C2DD + FFFFFFFFFFFFFFFFFFF1F1F70A0A790A0A7D0A0A810B0B850B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B872A2A968585C2A4A4D0F1F1F7FF + FFFFFFFFFFFFFFFFFFFFFFC2C2DC8484BA4747990A0A7A0A0A800B0B840B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B872A2A964848A2C2C2DFFFFFFFFF + FFFFFFFFFF8484B70909720A0A790A0A810B0B860B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870200000200000B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B871A1A8F6767B49595CAC3C3E1C3C3E0C2 + C2E0C2C2E08585C05757A90B0B827676BA6767B30B0B850B0B850B0B860B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B872A2A968585 + C38585C28585C28585C18585C18585C18585C18585C18585C14848A10B0B830B + 0B850B0B860B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B876767B4C3C3 + E1C3C3E1C2C2E0C2C2E0F1F1F88585C00A0A800B0B820B0B850B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870200000200000B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B8702 + 00000200000B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870200000200000B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870200000200000B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000} + end + object Label1: TLabel + Left = 146 + Top = 22 + Width = 230 + Height = 20 + Caption = 'SQL Server Data Access' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -17 + Font.Name = 'Verdana' + Font.Pitch = fpVariable + Font.Style = [fsBold, fsItalic] + ParentFont = False + end + object Label3: TLabel + Left = 146 + Top = 108 + Width = 156 + Height = 13 + Caption = 'Copyright '#169' 1997-2007 Core Lab' + end + object Label5: TLabel + Left = 146 + Top = 132 + Width = 26 + Height = 13 + Caption = 'Web:' + end + object Label6: TLabel + Left = 146 + Top = 156 + Width = 31 + Height = 13 + Caption = 'E-mail:' + end + object lbMail: TLabel + Left = 186 + Top = 156 + Width = 80 + Height = 13 + Cursor = crHandPoint + Caption = 'sdac@crlab.com' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentColor = False + ParentFont = False + OnClick = lbMailClick + OnMouseMove = lbMailMouseMove + end + object lbWeb: TLabel + Left = 186 + Top = 132 + Width = 101 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com/sdac' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbWebClick + OnMouseMove = lbWebMouseMove + end + object Label4: TLabel + Left = 186 + Top = 46 + Width = 119 + Height = 20 + Caption = 'Components' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -17 + Font.Name = 'Verdana' + Font.Pitch = fpVariable + Font.Style = [fsBold, fsItalic] + ParentFont = False + end + object Label10: TLabel + Left = 146 + Top = 180 + Width = 32 + Height = 13 + Caption = 'Forum:' + end + object lbForum: TLabel + Left = 186 + Top = 180 + Width = 109 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com/forums' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbForumClick + OnMouseMove = lbForumMouseMove + end + object OKBtn: TButton + Left = 308 + Top = 248 + Width = 75 + Height = 24 + Cancel = True + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacAbout.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacAbout.pas new file mode 100644 index 0000000..6438bb5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacAbout.pas @@ -0,0 +1,127 @@ + +////////////////////////////////////////////////// +// MS SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC About Window +// Created: 24.07.01 +// Last modified: 14.01.02 +////////////////////////////////////////////////// + +unit SdacAbout; + +interface +uses + Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, +{$IFDEF WIN32} + Jpeg, +{$ENDIF} + Buttons, ExtCtrls; +type + TSdacAboutForm = class(TForm) + OKBtn: TButton; + Image1: TImage; + Label1: TLabel; + Label3: TLabel; + Label5: TLabel; + Label6: TLabel; + lbMail: TLabel; + lbWeb: TLabel; + Label4: TLabel; + Bevel1: TBevel; + Label10: TLabel; + lbForum: TLabel; + procedure lbWebClick(Sender: TObject); + procedure lbMailClick(Sender: TObject); + procedure lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbMailMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbForumMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbForumClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + SdacAboutForm: TSdacAboutForm; + +procedure ShowAbout; + +implementation + +uses + ShellApi; + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure ShowAbout; +begin + with TSdacAboutForm.Create(Application) do + try + ShowModal; + finally + Free; + end; +end; + +procedure TSdacAboutForm.lbWebClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'open', 'http://www.crlab.com/sdac', '', '', SW_SHOW); + lbWeb.Font.Color := $FF0000; +{$ENDIF} +end; + +procedure TSdacAboutForm.lbMailClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'open', 'mailto:sdac@crlab.com', 'zxczxc', '', SW_SHOW); + lbMail.Font.Color := $FF0000; +{$ENDIF} +end; + +procedure TSdacAboutForm.lbForumClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'open', 'www.crlab.com/forums/viewforum.php?f=6', '', '', SW_SHOW); + lbWeb.Font.Color := $FF0000; +{$ENDIF} +end; + +procedure TSdacAboutForm.lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $4080FF; +end; + +procedure TSdacAboutForm.lbMailMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +begin + lbMail.Font.Color := $4080FF; +end; + +procedure TSdacAboutForm.lbForumMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbForum.Font.Color := $4080FF; +end; + +procedure TSdacAboutForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $FF0000; + lbMail.Font.Color := $FF0000; + lbForum.Font.Color := $FF0000; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacDemoForm.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacDemoForm.dfm new file mode 100644 index 0000000..d4b657d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacDemoForm.dfm @@ -0,0 +1,896 @@ +inherited SDACForm: TSDACForm + Left = 190 + Top = 236 + Caption = 'SDACForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited TVSplitter: TSplitter + Color = clGreen + end + inherited pnTopLabel: TPanel + inherited lbTitle: TLabel + Caption = ' SDAC' + Color = clGreen + end + inherited lbAbout: TLabel + Left = 939 + Color = clGreen + end + end + inherited Panel2: TPanel + inherited Shape1: TShape + Brush.Color = clGreen + end + inherited Panel1: TPanel + Color = clGreen + end + inherited pnShowSource: TPanel + Color = clGreen + end + inherited pnOpenDemoDir: TPanel + Color = clGreen + end + end + inherited ImageList1: TImageList + Left = 593 + Top = 15 + Bitmap = { + 494C01010C000E00040010001100FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000004400000001002000000000000044 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000008BB8 + CB00317DA400317DA400317DA400699BB7000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 00000000000000800000000000000000000000000000008000000000000063B6 + D50082E9F70054D5FB003296CF001479B4000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 00000000000000800000000000000080000000800000000000000000000063B6 + D50082E9F70054D5FB003296CF001479B400000000000080000000800000B1A4 + 9A000080000000800000B1A49A00B1A49A000080000000800000634935006349 + 350063493500634935006349350063493500000000000080000000800000B1A4 + 9A000080000000800000B1A49A00B1A49A000080000000800000634935006349 + 3500634935006349350063493500634935000000000000000000000000000000 + 0000BBB0A700000000000000000000000000BBB0A7000000000000000000BBB0 + A7000000000000000000BBB0A700573E2B000000000000800000008000000000 + 00000080000000800000000000000000000000800000008000000000000063B6 + D50082E9F70054D5FB003296CF001479B40000000000BBA69700D2BDA800D4BD + AA00E9D6CA00E9D6CA00E9D7CC00E9D6CA00E9D6CA00E9D6CA00E9D6CA00E7CF + C200E6CEC000E6CCBE00E6CCBD006349350000000000BBA69700D2BDA800D4BD + AA00E9D6CA00E9D6CA00E9D7CC00E9D6CA00E9D6CA00E9D6CA00E9D6CA00E7CF + C200E6CEC000E6CCBE00E6CCBD006349350000000000C4B2A500D8C5B300D9C5 + B500EDDED700EDDDD400ECDCD200ECDBD100EBD9CF00D9C5B500EAD5CA00EAD5 + C900E8D4C800E8D2C600E8D2C500573E2B000000000000000000000000000000 + 000000000000000000000000000000000000DDD3CB00B1A49A006349350063B6 + D50082E9F70054D5FB003296CF001479B40000000000BBA69700FEFEFC00D2BD + A800FDF8F600FCF6F300FBF3EF00FAF0EA00F9ECE600D2BDA800F7E6DE00F6E3 + D900F5E0D500F4DDD200E6CCBE006349350000000000BBA69700FEFEFC00D2BD + A800FDF8F600FCF6F300FBF3EF00FAF0EA00F9ECE600D2BDA800F7E6DE00F6E3 + D900F5E0D500F4DDD200E6CCBE006349350000000000B39D8D00FEFEFC00CDB5 + 9F00FDF7F500FCF5F100FAF1ED00F9EEE700F8EAE300CDB59F00F6E3DA00F5DF + D400F4DCD000F3D9CD00E3C6B700573E2B000000000000000000000000000000 + 000000000000000000000000000000000000BBA69700D5C7BD00F6EFEA00C6E7 + ED009ED7E1009ED7E1009ED7E100699BB70000000000BBA69700D2BDA800D2BD + A800FDFBFA00D2BDA800D2BDA800D2BDA800FAEFEA00D2BDA800F8E9E100D2BD + A800D2BDA800D2BDA800E6CEC0006349350000000000BBA69700D2BDA800D2BD + A800FDFBFA00D2BDA800D2BDA800D2BDA800FAEFEA00D2BDA800F8E9E100AC8F + 7100AC8F7100AC8F7100E6CEC0006349350000000000B39D8D00CDB59F00CDB5 + 9F00FDFAF900CDB59F00CDB59F00CDB59F00F9EDE700CDB59F00F7E6DD00CDB5 + 9F00CDB59F00CDB59F00E3C8B900573E2B000000000000000000000000000000 + 00000000000000000000BBA69700634935006349350063493500634935006349 + 35006349350063493500EFE0D8006349350000000000BBA69700FFFFFF00D2BD + A800FEFDFD00FEFBFB00FDF9F700FCF6F300FBF3EF00D2BDA800F9ECE600F8EA + E200F7E6DD00F6E3D900E7CFC1006349350000000000BBA69700FFFFFF00D2BD + A800FEFDFD00FEFBFB00FDF9F700FCF6F300FBF3EF00D2BDA800F9ECE600F8EA + E200F7E6DD00F6E3D900E7CFC1006349350000000000B39D8D00FFFFFF00CDB5 + 9F00FEFDFD00FEFAFA00FDF8F600FCF5F100FAF1ED00CDB59F00F8EAE300F7E7 + DE00F6E3D900F5DFD400E4C9BA00573E2B000000000000000000E2DEDE00D9DA + D4000000000000000000BBA69700D5C7BD00F6EFEA00F3EAE400F1E5DE00EFE1 + D800D0BEB10063493500F0E4DC006349350000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D2BDA800FCF6F300D2BDA800FAEFEA00D2BD + A800D2BDA800D2BDA800E7D0C3006349350000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D2BDA800FCF6F300D2BDA800FAEFEA00F9ED + E600AC8F7100F7E6DE00E7D0C3006349350000000000B39D8D00CDB59F00CDB5 + 9F00FFFFFF00CDB59F00CDB59F00CDB59F00FCF5F100CDB59F00F9EDE700CDB5 + 9F00CDB59F00CDB59F00E4CABC00573E2B000000000000000000E0DDDD003A87 + 1A00DDD3CB00B1A49A0063493500634935006349350063493500634935006349 + 3500EFE0D80063493500BBA697006349350000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFEFC00FEFBFA00FDF9F700D2BDA800FBF3EF00FAF0 + EB00F9ECE600F7E9E100E8D2C6006349350000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFEFC00FEFBFA00FDF9F700D2BDA800FBF3EF00AC8F + 7100AC8F7100AC8F7100E8D2C6006349350000000000B39D8D00FFFFFF00CDB5 + 9F00FFFFFF00FFFFFF00FFFEFC00FEFAF900FDF8F600CDB59F00FAF1ED00F9EE + E800F8EAE300F6E6DD00E5CDBF00573E2B00000000007CAA680036851600277D + 0400277D0400EAE3DE00F6EFEA00F1E9E200F1E5DE00EFE1D800D0BEB1006349 + 3500F0E4DC0063493500BBA69700BBA6970000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D2BDA800FEFBFA00D2BDA800FCF6F300D2BD + A800D2BDA800D2BDA800E8D3C8006349350000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D2BDA800FEFBFA00D2BDA800FCF6F300FCF3 + EF00AC8F7100F9EDE600E8D3C8006349350000000000B39D8D00CDB59F00CDB5 + 9F00FFFFFF00CDB59F00CDB59F00CDB59F00FEFAF900CDB59F00FCF5F100CDB5 + 9F00CDB59F00CDB59F00E5CEC100573E2B007FAB6B0030820E00000000002F81 + 0D00DDD3CB00FCFAF900D4C6BC00BAA69600BBA69700D2C1B500EFE0D8006349 + 3500BBA6970063493500000000000000000000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFDFD00D2BDA800FDF9F700FCF6 + F300FBF3EF00FAF0EA00E9D5CA006349350000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFDFD00D2BDA800FDF9F700FCF6 + F300FBF3EF00FAF0EA00E9D5CA006349350000000000B39D8D00FFFFFF00CDB5 + 9F00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFDFD00CDB59F00FDF8F600FCF5 + F100FAF1ED00F9EEE700E6D0C400573E2B000000000000000000000000000000 + 0000BBA69700FAF6F300BBA69700F7F1ED00F5EDE700BBA69700F0E4DC006349 + 3500BBA69700BBA69700000000000000000000000000EFAD8C00EFAD9400EFAD + 8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E7845200EF844A00E773 + 4200E7733900E7733900E7733900CE6A370000000000EFAD8C00EFAD9400EFAD + 8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E7845200EF844A00E773 + 4200E7733900E7733900E7733900CE6A370000000000E7A18000E69E7D00E49A + 7800E3957200DF916C00DD8C6500DB865E00D9805700D57B5000D2764800D16F + 4200CE693C00CD653600CA613100C85E2D000000000000000000000000000000 + 0000BBA69700BBA69700FAF6F300F8F4F000F7F0EC00F5ECE600BBA697006349 + 35000000000000000000000000000000000000000000F7B59400FFC6A500FFCE + AD00FFC6A500FFC6A500FFBD9C00FFBD9400FFB58C00FFB58C00FFAD7B00FFAD + 7B00FFA57300FF9C7300F7946300CE69380000000000F7B59400FFC6A500FFCE + AD00FFC6A500FFC6A500FFBD9C00FFBD9400FFB58C00FFB58C00FFAD7B00FFAD + 7B00FFA57300FF9C7300F7946300CE69380000000000E7A18000E69F7D00E49A + 7800E3957100E1916C00DD8C6500DB865E00D9805800D57A5000D3764900D16F + 4200CF6A3C00CD653600CA613100C85D2E00000000002F810D00000000003082 + 0E006C904900BBA69700BBA69700BBA69700BBA69700BBA69700BBA69700BBA6 + 97000000000000000000000000000000000000000000EFAD8C00EFAD8C00EFAD + 8C00EFAD9400EFAD8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E78C + 5A00EF845200E77B4200E77B4200CE69380000000000EFAD8C00EFAD8C00EFAD + 8C00EFAD9400EFAD8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E78C + 5A00EF845200E77B4200E77B4200CE69380000000000E7A18000E69F7D00E49A + 7800E3957100E1916C00DD8C6500DB865E00D9805800D57A5000D3764900D16F + 4200CF6A3C00CD653600CA613100C85D2E00277D0400277D0400368516007CAA + 6800000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000003A871A00E0DDDD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000A7BED7006195 + A800688F9C0031738D00206C910092ADC4000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000447DA500447D + A500447DA500447DA500447DA500000000000000000000800000000000000080 + 00000000000000800000000000000080000000800000000000004692B9005FDA + FF00A1ECF80057D1F60002A8E7003B8EB4000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000447DA5008ADE + F00055C2E6003AB4E100447DA500000000000000000000800000008000000000 + 00000080000000800000000000000000000000800000008000004DA0C9005FD8 + FC00A0EAF60056CEF40003AAEB003286AD00000000000080000000800000B1A4 + 9A000080000000800000B1A49A00B1A49A000080000000800000634935006349 + 3500634935006349350063493500634935000000000000800000008000000000 + 0000008000000080000000000000000000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000008000000000 + 0000008000000080000000000000000000000080000000800000447DA500A1EB + F60081D9EE0050C0E500447DA500000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000050A5C8005ED8 + FC00A0EAF60056CFF40005ACED0027789C0000000000BBA69700D2BDA800D4BD + AA00E9D6CA00E9D6CA00E9D7CC00E9D6CA00E9D6CA00E9D6CA00E9D6CA00E7CF + C200E6CEC000E6CCBE00E6CCBD00634935000000000000000000000000000000 + 0000000000000000000000000000529CED00BECEE30000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000447DA5008DE7 + FA009EE9F50077D4EC00447DA500000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000051A7CB005DD6 + FC00A0EAF60056CFF40001A6E7003A8DB60000000000BBA69700FEFEFC00D2BD + A800FDF8F600FCF6F300FBF3EF00FAF0EA00FAEFEB00E6DBCF00247C0000659F + 4700F9EDE600F5E1D700E6CCBE00634935000000000000000000000000000000 + 000000000000000000000000000082B2E9002D8BF100BECEE300000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000447DA500447D + A5004278A000447DA500447DA500000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000004EA9CD0060DA + FC009EE8F5004DCBF40000A5EB00348BB30000000000BBA69700D2BDA800D2BD + A800FDFBFA00D2BDA800D2BDA800D2BDA800FBF2ED00E6DBCF00FBF3EF00FBF1 + EC00FAEEE800F6E3D900E6CEC0006349350000000000A7BED7006191A900698A + 9D00316F8D002068910092ADC400000000004597F1003E85F400BECEE3000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000996952000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000067B6D0008BEF + FF00ADF8FF008AEFFF0059DDFF005DA8C20000000000BBA69700FFFFFF00D2BD + A800FEFDFD00FEFBFB00FDF9F700FCF6F300FCF5F100E6DBCF005E9C40007AAC + 6000FBF1EC00F8E9E100E8D1C30063493500000000004692B9005FDAFF00A1EC + F80057D1F60002A8E7003B8EB400000000009ABDE7004498F400377FF300BECE + E300000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000996952000000000000000000000000006448370062483700624A34006249 + 35006449350064483700624A3400634833006248370000000000AAD2DE0099D3 + E00095CED7009ED0D500A3D7DD00A8C8D10000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D3BFAB00FCF7F500E6DBCF0097BD8200247C + 0000A5C38F00FBF1ED00EBD8CD00664D3900000000004DA0C9005FD8FC00A0EA + F60056CEF40003AAEB003286AD000000000000000000589EED00408DF4003279 + F300BECEE3000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000099695200000000000000000000000000B7A89500FFFAF700D2BDA700FCF6 + F100F7F2EF00FAE9E000F6E6DF00F7E6DD006149330000000000000000000000 + 00000000000000000000000000000000000000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFEFC00FEFCFB00FEFBFA00E6DBCF00FDF8F6007AAD + 6200247C0000B3CB9F00F0E2DB006F5745000000000050A0C8005ED8FC00A0EA + F60056CFF40005ACED0027789C000000000000000000B2C8E5002F84F3002872 + F2002F74F300BECEE30000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E6CA + BE0070311700E6CABE000000000000000000BDA59900D0BDA800D3BBA700FEF7 + F400D4BCA800D0BCAA00D3BBA700F8E8E1006448370000000000000000000000 + 00000000000000000000000000000000000000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D6C3B000E3D6C80098C18600B2C29800FDFAF800FDF8 + F6004F9531005E9C4000F2E7E10077604E000000000051A2CB005DD6FC00A0EA + F60056CFF40001A6E7003A8DB6000000000000000000000000004694EF00256F + F2002272F2003079F300BECEE3000000000000000000447DA500447DA500447D + A500447DA500447DA50000000000000000000000000000000000E6CABE009C59 + 3900BD69400095492700E6CABE0000000000BBA79500FFFDFD00CFBCA700FAF8 + F800FDF6F300FAF0E900F9EEEA00F9ECE400654A360000000000000000005D8A + 4400337F130036751600000000000000000000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFFFF00FFFFFF007BB0660031820E00B5D1A700A6C8 + 95003284100097BE8200F2E5DF00725B4900000000004EA4CE0060DAFC009EE8 + F5004DCBF40000A5EB00348BB30000000000000000002B87F2003382F300226E + F2002275F2002281F2002D8BF100A6C3E60000000000447DA5008ADEF00055C2 + E6003AB4E100447DA500000000000000000000000000E6CABE00A56C5100D58E + 6B00DD8B6400CC764D00974D2B00E6CABE00BBA69700D4BDA700D1BEA900FEF9 + FB00D4BDA700D2BDA800D2BDA700FBF0EC005F49370000000000000000000000 + 00003485130035861300000000000000000000000000EFAD8C00EFAD9400EFAD + 8C00EFAD8C00EFA58400EFA57B00E7946B00E7AB8D00ECBFA9008E9F5900598D + 2B00588C2A00999D5C00E6B19700CE6A37000000000068B1D1008BEFFF00ADF8 + FF008AEFFF0059DDFF005DA8C200000000000000000082B2E9002F7EF300226D + F2002276F2002281F200000000000000000000000000447DA500A1EBF60081D9 + EE0050C0E5004278A0009969520099695200996952007F503900CF937600E8A7 + 8700E59E7B00E0926C00C2744E0074391F00BFAD9C00FEFAF900D8C5B000FCF7 + F600FCF3EF00F6EAE800FCF1ED00F8EFEE006950350000000000000000003485 + 1300000000006CA15400000000000000000000000000F7B59400FFC6A500FFCE + AD00FFC6A500FFC6A500FFBD9C00FFBD9400E1977300E4A28300E9B59D00EABA + A200E8B79E00E4A98B00D9886000D272430000000000AAD2DE0099D3E00095CE + D7009ED0D500A3D7DD00A8C8D1000000000000000000000000003176F300226E + F2002276F2002380F2002E8AF1000000000000000000447DA5008DE7FA009EE9 + F50077D4EC00447DA500000000000000000000000000E6CABE00A7725800DD9F + 8100EAAA8B00DA977800A2664900E6CABE00E9A98A00E3A08100E49D7C00DD99 + 7600D9957000D8896000D47F5200B37334009A7935003485130034851300A7C0 + 9A000000000000000000000000000000000000000000EFAD8C00EFAD8C00EFAD + 8C00EFAD9400EFAD8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E78C + 5A00EF845200E77B4200E77B4200CE6938000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000009ABDE700217C + F200227EF2002283F2002287F2004696EF0000000000447DA500447DA500447D + A500447DA500447DA50000000000000000000000000000000000E6CABE00A772 + 5800CF937600A7725800E6CABE0000000000EAAC8E00E7A38000E39B7900DF94 + 6E00DC8A6100D7805400D5784B00CE6E3E00C66B370000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E6CA + BE007F503900E6CABE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400C2A6 + A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6 + A400C2A6A400C2A6A40000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 00000000000000000000000000000000000000000000DB322E00DB322E00DB32 + 2E0000000000DB322E0000000000DB322E000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400FEFC + FB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFC + FB00FEFCFB00C2A6A40000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000A5C7D5005F95 + A800678E9C002F728C001E6B900091B1C40000000000DB322E00000000000000 + 000000000000DB322E00DB322E00DF8785000000000000000000A6C7D5006195 + A800688F9C0031738D00206C910092B1C4000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400FEFC + FB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFC + FB00FEFCFB00C2A6A40000000000000000000000000000800000000000000080 + 00000000000000800000000000000080000000800000000000004497B8005FDA + FF00A1ECF80057D1F60002A8E7003B8EB40000000000DB322E00000000000000 + 000000000000DB322E0000000000DB322E0000000000000000004698B8005FDA + FF00A1ECF80057D1F60002A8E7003B8EB40077848F006E7C8500626F7900535F + 6800444E5600333C4300252C3200191F240010151A0010151A0010151A001015 + 1A0010151A0010151A0010151A00000000000000000000000000C2A6A400FEFA + F500FEFCFB00FEFAF500FEFAF500FEFCFB00FEFAF500FEFAF500FEFCFB00FEFA + F500FEFAF500C2A6A40000000000000000000000000000800000008000000000 + 00000080000000800000000000000000000000800000008000004AA4C8005FD8 + FC00A0EAF60056CEF40003AAEB003286AD0000000000DB322E00DB322E00DB32 + 2E0000000000DB322E00DB322E00DB322E0000000000000000004DA5C9005FD8 + FC00A0EAF60056CEF40003AAEB003286AD0079879200A2DFF00072CDEA004BB8 + E20039AEDB002FA9D90028A1D2002398C700228EBC002083AE001B81AB00177E + A9001D799F0021749600191F2400000000000000000000000000C2A6A400FEFA + F500FEFAF500FEFAF500FEFAF500FEFAF500FEFAF500FEFAF500FEFAF500FEFA + F500FEFAF500C2A6A400000000000000000000000000BBA79600BBA69700BBA6 + 9700BBA69700BBA69700BBA69700BBA69700BBA69700BBA697004CA3C6005ED8 + FC00A0EAF60056CFF40005ACED0027789C000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000050A5C8005ED8 + FC00A0EAF60056CFF40005ACED0027789C007C8A9500A9ECF60095E5FC0082DE + FB0075D5FA006CD0F7005DC5F40052BEF00044B4EC0038ABE9002EA4E300229A + DF001890D7001D799F0022292F00000000000000000000000000C2A6A400FEF7 + F000FEF7F000FEF7F000FEF7F000FEF7F000FEF7F000FEF7F000FEF7F000FEF7 + F000FEF7F000C2A6A400000000000000000000000000BBA69700F3E2D900EEE1 + D900EEDED800EBDFD300EEDDD400EBDBD400EADAD400E9DAD1004EA6CA005DD6 + FC00A0EAF60056CFF40001A6E7003A8DB6000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000051A7CB005DD6 + FC00A0EAF60056CFF40001A6E7003A8DB6007F8E9800B6EEF8009BE8FB0095E5 + FC0082DEFB0075D5FA006ACAF4005DC5F4004FBCF00044B4EC0038ABE9002EA4 + E3001F96DC00177EA9002F363D00000000000000000000000000C2A6A400FEF7 + F000FEF7F000FEF7F000FEF7F000FEF3E900FEF7F000FEF7F000FEF3E900FEF7 + F000FEF7F000C2A6A400000000000000000000000000BBA79600F1E1DA00F0E0 + D900CDBAB200CCBCAF00CABBB200CFBBB000EBDBD400CCBAAF004BA8CD0060DA + FC009EE8F5004DCBF40000A5EB00348BB30000000000BBA69700634935006349 + 35006349350063493500634935006349350063493500634935004BA6C90060DA + FC009EE8F5004DCBF40000A5EB00348BB30083959F00B6EEF800ABEDFB009BE8 + FB008BE2FC0082DEFB0075D5FA006ACAF4005DC5F4004FBCF00040B3ED0038AB + E900269EE2001282B4003D454D00000000000000000000000000C2A6A400FEF3 + E900FEF3E900FEF3E900FEF3E900FEF3E900FEF3E900FEF3E900FEF3E900FEF3 + E900FEF3E900C2A6A400000000000000000000000000B8A59600F4E2DB00F1E1 + DA00FFF3ED00FFF3EF00FCF4ED00CCB9B100E9DDD300FFF3ED0065B5D0008BEF + FF00ADF8FF008AEFFF0059DDFF005DA8C20000000000BBA69700EBE6E200EBE4 + E000EAE1DC00D2BDA800E8DCD400E5D3C900E4CFC500D2BDA80067B6D0008BEF + FF00ADF8FF008AEFFF0059DDFF005DA8C20083959F00BEF0F900ABF0F700A5EC + FB009BE8FB008BE2FC007EDCFC0075D5FA0065CCF7005DC5F4004FBCF00040B3 + ED002EA4E3000E8ABF004B555E00000000000000000000000000C2A6A400FFF0 + E200FFF0E200FEF3E900FFEEDE00FEF3E900FFEEDE00FEF3E900FFEEDE00FEF3 + E900FFEEDE00C2A6A400000000000000000000000000BBA79500F1E4DC00EEE3 + DB00F1E2D900F0E0D900EEDED700EDDED500EFDFD300E9DCD400AAD2DE0099D3 + E00095CED7009ED0D500A3D7DD00A8C8D10000000000BBA69700FFFFFE00FEFD + FC00FDFAF900D2BDA800FCF5F100F9EBE400F8E8E000D2BDA800AAD2DE0099D3 + E00095CED7009ED0D500A3D7DD00A8C8D100869AA300BEF0F900B6EEF800B6EE + F800A5ECFB0095E5FC008BE2FC007EDCFC0075D5FA0065CCF7005DC5F4004FBC + F00037A9E7000E8FC70059656D00000000000000000000000000C2A6A400FEF3 + E900FFEEDE00FFF0E200FEF3E900FFEEDE00FFF0E200DDCFC200DDCFC200DDCF + C200DDCFC200C2A6A400000000000000000000000000B9A69700F3E3DC00F5E3 + DC00FFFFFF00FFFFFF00FFFFFF00FBFFFF00FDFFFF00FFFFFE00FFFFFF00FDFF + FF00E4D7CF00E9D7D000624837000000000000000000BBA69700D2BDA800D2BD + A800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BD + A800D2BDA8006349350000000000000000008A9DA700BEF0F900B6EEF800B6EE + F800ABF0F700A5ECFB0095E5FC008BE2FC007EDCFC0071D3FA0065CCF70057C3 + F3004FBCF0001B99CF0065727C00000000000000000000000000C2A6A400FFEE + DE00FFEEDE00FFEEDE00FFEEDE00FFEEDE00FFEEDE00C3B4A800C3B4A800C3B4 + A800C3B4A800C2A6A400000000000000000000000000BBA69700F1E4DC00EEE4 + DA00F0E2DC00F3E2D900F3E2D900F0E0D900ECDED800EADDD500E9DDD300E9DD + D300EBD9D200E9D9D200644934000000000000000000BBA69700FFFFFF00FFFF + FF00FFFEFE00D2BDA800FDFAF900FAF1ED00F9EDE800D2BDA800F7E7DF00F7E4 + DC00F5E1D7006349350000000000000000008FA4AC00BEF0F900BEF0F900BEF0 + F900BEF0F900B4F2F800ABEDFB00A5ECFB0095E5FC008ADFFC007EDCFC0075D5 + FA006ACAF4005DC5F40065727C00000000000000000000000000C2A6A400FFEE + DE00FFEAD700FFEEDE00FFEAD700FFEAD700FFEEDE00B0A29600B0A29600B0A2 + 9600B0A29600C2A6A400000000000000000000000000BBA59A00F3E3DD00F4E5 + DC00FDFFFF00FFFFFF00FFFFFE00FFFFFE00FFFFFE00FFFFFE00FFFFFF00FFFE + FF00E8DCD200E9D9D200624A34000000000000000000BBA69700FFFFFF00FFFF + FF00FFFFFF00D2BDA800FEFCFB00FBF4F100FAF1EC00D2BDA800F8EAE300F7E7 + DF00F6E4DB006349350000000000000000008FA4AC008FA4AC008FA4AC008FA4 + AC008FA4AC008CA0A9008A9DA7008A9DA700869AA300869AA3008395A0008395 + A0008395A0008395A00000000000000000000000000000000000C2A6A400FFEA + D700FFEAD700FFEAD700FFEAD700FFEAD700C9B9AC00FEFAF500FEF7F000E6DA + D900C2A6A40000000000000000000000000000000000BBA59900F4E4DD00F5E2 + DD00F5E3DC00F2E2DB00F0E3DB00EFE1DB00EDE0D800EEDFD600EDDED500EDDD + D600EBDBD400ECDAD300634834000000000000000000BBA69700D2BDA800D2BD + A800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BD + A800D2BDA8006349350000000000000000008FA4AC00B2E4EC00B6EEF800B6EE + F800A9ECF60092E1F3008FA4AC00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400FFEA + D700FFE6D000FFEAD700FFE6D000FFEAD700C5B5A900FEFAF500DDCFC200C2A6 + A4000000000000000000000000000000000000000000E1997100E1966F00E092 + 6E00E1926900DD8E6300DD895F00DC865C00DB815800D97D5200D6794C00D374 + 4800CF724100D06E3E00D26C3C000000000000000000BBA69700FFFFFF00FFFF + FF00FFFFFF00D2BDA800FFFFFF00FDFAF800FCF7F400D2BDA800FAF1EB00F9EE + E700F8EAE300634935000000000000000000000000008FA4AC008FA4AC008FA4 + AC008FA4AC008FA4AC0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400FFE6 + D000FFE6D000FFE6D000FFE6D000FFE6D000C9B9AC00DDCFC200C2A6A4000000 + 00000000000000000000000000000000000000000000E3977300E2977100DF93 + 6F00E0906B00DD8C6600DB896000D9855B00D7825500D47E5000D47A4B00D375 + 4700D2714500D56F3F00D06C3C000000000000000000BBA69700FFFFFF00FFFF + FF00FFFFFF00D2BDA800FFFFFF00FEFBFA00FDF9F700D2BDA800FBF3EF00FAF0 + EA00F9ECE6006349350000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400C2A6 + A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BBA69700BBA69700BBA6 + 9700BBA69700BBA69700BBA69700BBA69700BBA69700BBA69700BBA69700BBA6 + 9700BBA69700BBA697000000000000000000424D3E000000000000003E000000 + 2800000040000000440000000100010000000000200200000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF + BA3FBA3FAABBBA20ABBFABBF98ABABA0AA7FAA7FAAABAA608000800080009320 + 800080008000FF00800080008000FF00800080008000FC00800080008000CC00 + 800080008000C00080008000800080008000800080002003800080008000F003 + 800080008000F00F800080008000A00F8000800080000FFFFFFFFFFFFFFF9FFF + FFFFFFFFFFFFFFFFBA3FBA3FBA3FBA3FAB80ABBFABBFAB81AA40AA7FAA7FAA41 + 93008000933F9301FFC08000FE7FFFC1FFC08000FE3FFFC1FFC08000811FFFF7 + FFC08000810FFFF7004080008187FFF7007F80008183FFE3007F800081C183C1 + 00638000818083800073800081838000006B800081C18380000F8000FFC083C1 + 007FFFFFFFFFFFE3FFFFFFFFFFFFFFFFFFFFC003BA3F8AFFFFFFC003AB80B8C0 + FFFFC003AA40BAC00001C003930088C00001C0038000FFC00001C0038000FFC0 + 0001C003800080000001C003800080000001C003800080000001C00380018003 + 0001C003800180030001C003800180030003C0078001800301FFC00F80018003 + 83FFC01F80018003FFFFC03FFFFF8003} + end + object MSConnection: TMSConnection + Database = 'master' + ConnectDialog = MSConnectDialog1 + Left = 465 + Top = 10 + end + object MSConnectDialog1: TMSConnectDialog + Caption = 'Connect' + UsernameLabel = 'User Name' + PasswordLabel = 'Password' + ServerLabel = 'Server' + DatabaseLabel = 'Database' + ConnectButton = 'Connect' + CancelButton = 'Cancel' + LabelSet = lsCustom + Left = 500 + Top = 10 + end + object scCreate: TMSScript + SQL.Strings = ( + 'CREATE TABLE SDAC_Long_char (' + ' Code INT IDENTITY (1, 1) PRIMARY KEY,' + ' Title VARCHAR(30),' + ' Value VARCHAR(5000)' + ');' + '' + 'CREATE TABLE SDAC_Pictures (' + ' UID int IDENTITY (1, 1) PRIMARY KEY NOT NULL,' + ' Name VARCHAR(50),' + ' Picture IMAGE' + ');' + '' + 'CREATE TABLE Loaded1 (' + ' uid INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,' + ' Field1 VARCHAR(20),' + ' Field2 VARCHAR(20),' + ' Field3 VARCHAR(20)' + ');' + '' + 'CREATE TABLE Loaded2 (' + ' uid INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,' + ' Field1 VARCHAR(20),' + ' Field2 VARCHAR(20),' + ' Field3 VARCHAR(20)' + ');' + '' + 'CREATE TABLE ThreadTable (' + ' ID INT,' + ' NAME VARCHAR(30)' + ');' + '' + 'CREATE TABLE SDAC_Text (' + ' UID INT IDENTITY PRIMARY KEY,' + ' [Name] NVARCHAR(50),' + ' TextField TEXT' + ');' + '' + 'CREATE TABLE Sdac_Loaded (' + ' Code INT,' + ' Num INT,' + ' Num1 FLOAT,' + ' Str VARCHAR(50),' + ' Dat DATETIME' + ');' + '' + 'CREATE TABLE CRGRID_TEST(' + ' Id int PRIMARY KEY,' + ' Name VARCHAR(10),' + ' Country VARCHAR(30),' + ' City VARCHAR(30),' + ' Street VARCHAR(30),' + ' BirthDate DATETIME,' + ' Job VARCHAR(9),' + ' Hiredate DATETIME,' + ' Sal NUMERIC(7, 2),' + ' Remarks TEXT' + ');' + '' + 'INSERT INTO CRGRID_TEST ' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5001, '#39'SMITH'#39', '#39'ENGLAND'#39', '#39'LONDON'#39', '#39'BOND st.'#39', '#39'12-OCT-63'#39', ' + + #39'CLERK'#39','#39'17-DEC-80'#39', 800);' + 'INSERT INTO CRGRID_TEST' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5002, '#39'ALLEN'#39', '#39'ENGLAND'#39', '#39'LONDON'#39', '#39'BAKER st.'#39', '#39'04-MAR-61'#39',' + + ' '#39'SALESMAN'#39','#39'20-FEB-81'#39', 1600);' + 'INSERT INTO CRGRID_TEST ' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5003, '#39'MARTIN'#39', '#39'FRANCE'#39', '#39'LION'#39', '#39'WEAVER st.'#39', '#39'23-JAN-57'#39', ' + + #39'MANAGER'#39','#39'02-APR-81'#39', 2900);' + ' ' + ' CREATE TABLE DEPT (' + ' DEPTNO INT PRIMARY KEY,' + ' DNAME VARCHAR(14),' + ' LOC VARCHAR(13)' + ');' + 'INSERT INTO DEPT VALUES (10,'#39'ACCOUNTING'#39','#39'NEW YORK'#39');' + 'INSERT INTO DEPT VALUES (20,'#39'RESEARCH'#39','#39'DALLAS'#39');' + 'INSERT INTO DEPT VALUES (30,'#39'SALES'#39','#39'CHICAGO'#39');' + 'INSERT INTO DEPT VALUES (40,'#39'OPERATIONS'#39','#39'BOSTON'#39');' + '' + 'CREATE TABLE emp (' + ' EMPNO int IDENTITY(1,1) NOT NULL PRIMARY KEY,' + ' ENAME varchar(10) default NULL,' + ' JOB varchar(9) default NULL,' + ' MGR int default NULL,' + ' HIREDATE datetime default NULL,' + ' SAL float default NULL,' + ' COMM float default NULL,' + ' DEPTNO int default NULL' + ' );' + + 'INSERT INTO emp VALUES ('#39'SMITH'#39', '#39'CLERK'#39', 7902, '#39'1980-12-17 00:0' + + '0:00'#39', 800, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'ALLEN'#39', '#39'SALESMAN'#39', 7698, '#39'1981-02-20 0' + + '0:00:00'#39', 1600, 300, 30);' + + 'INSERT INTO emp VALUES ('#39'WARD'#39', '#39'SALESMAN'#39', 7698, '#39'1981-02-22 00' + + ':00:00'#39', 1250, 500, 30);' + + 'INSERT INTO emp VALUES ('#39'JONES'#39', '#39'MANAGER'#39', 7839, '#39'1981-04-02 00' + + ':00:00'#39', 2975, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'MARTIN'#39', '#39'SALESMAN'#39', 7698, '#39'1981-09-28 ' + + '00:00:00'#39', 1250, 1400, 30);' + + 'INSERT INTO emp VALUES ('#39'BLAKE'#39', '#39'MANAGER'#39', 7839, '#39'1981-05-01 00' + + ':00:00'#39', 2850, NULL, 30);' + + 'INSERT INTO emp VALUES ('#39'CLARK'#39', '#39'MANAGER'#39', 7839, '#39'1981-06-09 00' + + ':00:00'#39', 2450, NULL, 10);' + + 'INSERT INTO emp VALUES ('#39'SCOTT'#39', '#39'ANALYST'#39', 7566, '#39'1987-07-13 00' + + ':00:00'#39', 3000, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'KING'#39', '#39'PRESIDENT'#39', NULL, '#39'1981-11-17 0' + + '0:00:00'#39', 5000, NULL, 10);' + + 'INSERT INTO emp VALUES ('#39'TURNER'#39', '#39'SALESMAN'#39', 7698, '#39'1981-09-08 ' + + '00:00:00'#39', 1500, 0, 30);' + + 'INSERT INTO emp VALUES ('#39'ADAMS'#39', '#39'CLERK'#39', 7788, '#39'1987-07-13 00:0' + + '0:00'#39', 1100, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'JAMES'#39', '#39'CLERK'#39', 7698, '#39'1981-12-03 00:0' + + '0:00'#39', 950, NULL, 30);' + + 'INSERT INTO emp VALUES ('#39'FORD'#39', '#39'ANALYST'#39', 7566, '#39'1981-12-03 00:' + + '00:00'#39', 3000, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'MILLER'#39', '#39'CLERK'#39', 7782, '#39'1982-01-23 00:' + + '00:00'#39', 1300, NULL, 10);' + '' + 'GO' + '' + 'CREATE PROCEDURE SDAC_InsertEmp ' + #9'@ENAME'#9'nvarchar(20),' + #9'@JOB'#9'nvarchar(10)' + 'AS' + #9'INSERT INTO ' + #9#9'EMP (ENAME, JOB) ' + #9'VALUES' + #9#9'(@ENAME, @JOB) ' + #9'RETURN @@Identity;' + '' + 'GO' + '' + 'CREATE PROCEDURE SDAC_UpdateEmp ' + #9'@EMPNO'#9'int,' + #9'@ENAME'#9'nvarchar(20),' + #9'@JOB'#9'nvarchar(10),' + ' @EMPINFO nvarchar(30) OUTPUT' + 'AS' + #9'UPDATE EMP' + #9'SET ' + #9#9'ENAME = @ENAME, JOB = @JOB ' + #9'WHERE' + #9#9'EMPNO = @EMPNO' + ' SET @EMPINFO = CAST(@EMPNO AS nvarchar) + '#39' '#39' + @JOB' + ' RETURN @EMPNO;' + '' + 'GO' + '' + 'CREATE PROCEDURE SDAC_DeleteEmp ' + #9'@EMPNO'#9'int,' + #9'@Result'#9'int OUTPUT' + 'AS' + #9'DELETE Emp' + #9'WHERE' + #9#9'EmpNO = @EmpNO' + #9'SET @Result = @EmpNO + 2;' + '' + 'GO' + '' + 'CREATE PROCEDURE "Ten Most High-Paid Employees" AS' + 'BEGIN' + ' SET ROWCOUNT 10' + ' SELECT Emp.EName AS TenMostHighPaidEmployees, Emp.SAL' + ' FROM Emp' + ' ORDER BY Emp.SAL DESC' + ' SET ROWCOUNT 0' + 'END;'#9) + OnError = OnScriptError + Connection = MSConnection + Left = 465 + Top = 45 + end + object scDrop: TMSScript + SQL.Strings = ( + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'Loaded1]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [Loaded1];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'Loaded2]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [Loaded2];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Long_char]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Long_char];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Pictures]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Pictures];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dbo].[SDAC_DeleteEmp]'#39') AND OBJECTPROPERTY(id, N'#39'IsProcedure'#39') =' + + ' 1)' + ' DROP PROCEDURE [dbo].[SDAC_DeleteEmp];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dbo].[SDAC_InsertEmp]'#39') AND OBJECTPROPERTY(id, N'#39'IsProcedure'#39') =' + + ' 1)' + ' DROP PROCEDURE [dbo].[SDAC_InsertEmp];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dbo].[SDAC_UpdateEmp]'#39') AND OBJECTPROPERTY(id, N'#39'IsProcedure'#39') =' + + ' 1)' + ' DROP PROCEDURE [dbo].[SDAC_UpdateEmp];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'ThreadTable]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [ThreadTable];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Text]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Text];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Loaded]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Loaded];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dbo].[Ten Most High-Paid Employees]'#39') AND OBJECTPROPERTY(id, N'#39'I' + + 'sProcedure'#39') = 1)' + ' DROP PROCEDURE [dbo].[Ten Most High-Paid Employees];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'CRGRID_TEST]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [CRGRID_TEST];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Loaded]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Loaded];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'emp]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [emp];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dept]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [dept];') + OnError = OnScriptError + Connection = MSConnection + Left = 500 + Top = 46 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacDemoForm.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacDemoForm.pas new file mode 100644 index 0000000..db2a022 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/SdacDemoForm.pas @@ -0,0 +1,184 @@ +{$I DacDemo.inc} +unit SdacDemoForm; + +interface + +uses + SysUtils, Classes, DB, + {$IFDEF VER6P} + Variants, + {$ENDIF} + Windows, Messages, Graphics, Controls, Forms, SdacVcl, + Dialogs, Menus, ImgList, StdCtrls, ComCtrls, Buttons, ExtCtrls, ToolWin, + DBAccess, MSAccess, SdacAbout, DemoFrame, DemoForm, DemoBase, DAScript, + MSScript; + +type + TSdacForm = class(TDemoForm) + MSConnection: TMSConnection; + MSConnectDialog1: TMSConnectDialog; + scCreate: TMSScript; + scDrop: TMSScript; + procedure lbAboutClick(Sender: TObject); override; + procedure cbDebugClick(Sender: TObject); + private + { Private declarations } + protected + //Product customization + function GetConnection: TCustomDAConnection; override; + function ApplicationTitle: string; override; + function ProductName: string; override; + procedure RegisterDemos; override; + public + function ProductColor: TColor; override; + procedure ExecCreateScript; override; + procedure ExecDropScript; override; + end; + +var + SdacForm: TSdacForm; + +implementation + +uses + CachedUpdates, +{$IFDEF CRDBGRID} + CRDBGrid, +{$ENDIF} + ConnectDialog, FetchAll, LongStrings, MasterDetail, + Pictures, Query, ServerCursors, Sql, StoredProc, StoredProcUpdates, +{$IFNDEF STD} + ServiceBroker, +{$ENDIF} +{$IFDEF WIN32} + Threads, +{$ENDIF} + FilterAndIndex, Table, Text, UpdateSQL, VTable{$IFNDEF STD}, Loader{$ENDIF}; + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +function TSdacForm.GetConnection: TCustomDAConnection; +begin + Result := MSConnection; +end; + +function TSdacForm.ProductColor: TColor; +begin + Result := clGreen; +end; + +procedure TSdacForm.ExecCreateScript; +begin + scCreate.Execute; +end; + +procedure TSdacForm.ExecDropScript; +begin + scDrop.Execute; +end; + +function TSdacForm.ApplicationTitle: string; +begin + Result := 'SQL Server Data Access Components demos'; +end; + +function TSdacForm.ProductName: string; +begin + Result := 'SDAC'; +end; + +procedure TSdacForm.RegisterDemos; +begin + Demos.RegisterCategory('SDAC Demo', 'SDAC Demo'); + Demos.RegisterCategory('Working with components', 'Working with components'); + Demos.RegisterCategory('General demos', 'General demos'); + Demos.RegisterCategory('SQL Server specific', 'SQL Server specific'); + + Demos.RegisterDemo('ConnectDialog', 'Customizing login dialog', 'Demonstrates how to customize the SDAC connect dialog. Changes the standard SDAC connect dialog to two custom connect dialogs. The first customized sample dialog is inherited from the TForm class, ' + 'and the second one is inherited from the default SDAC connect dialog class.', 'Working with components', TConnectDialogFrame, 2); +{$IFDEF CRDBGRID} + Demos.RegisterDemo('CRDBGrid', 'Using TCRDBGrid component', 'Demonstrates how to work with the TCRDBGrid component. Shows off the main TCRDBGrid features, like filtering, searching, stretching, using compound headers, and more.', 'Working with components', TCRDBGridFrame, 3); +{$ENDIF} +{$IFNDEF STD} + Demos.RegisterDemo('Loader', 'Using TMSLoader component', 'Uses the TMSLoader component to quickly load data into a server table. This demo also compares the two TMSLoader data loading handlers: GetColumnData and PutData.', 'Working with components', TLoaderFrame, 4); +{$ENDIF} + Demos.RegisterDemo('Query', 'Using TMSQuery component', 'Demonstrates working with TMSQuery, which is one of the most useful SDAC components. Includes many TMSQuery usage scenarios. Demonstrates how to execute queries in both standard and NonBlocking mode' + ' and how to edit data and export it to XML files. Note: This is a very good introductory demo. We recommend starting here when first becoming familiar with SDAC.', 'Working with components', TQueryFrame, 5); + Demos.RegisterDemo('Sql', 'Using TMSSQL component', 'Uses the TMSSQL component to execute SQL statements. Demonstrates how to work in a separate thread, in standard mode, in NonBlocking mode, and how to break long-duration query execution.', 'Working with components', TSqlFrame, 6); + Demos.RegisterDemo('StoredProc', 'Using TMSStoredProc component', 'Uses the TMSStoredProc component to access an editable recordset from an MS SQL stored procedure in the client application.', 'Working with components', TStoredProcFrame, 7); + Demos.RegisterDemo('Table', 'Using TMSTable component', 'Demonstrates how to use TMSTable to work with data from a single table on the server without manually writing any SQL queries. Performs server-side data sorting and filtering and retrieves results for browsing and editing.', 'Working with components', TTableFrame, 8); + Demos.RegisterDemo('UpdateSQL', 'Using TMSUpdateSQL component', 'Demonstrates using the TMSUpdateSQL component to customize update commands. Lets you optionally use TMSSQL and TMSQuery objects for carrying out insert, delete, query, and update commands.', 'Working with components', TUpdateSQLFrame, 9); + Demos.RegisterDemo('VirtualTable', 'Using TVirtualTable component', 'Demonstrates working with the TVirtualTable component. This sample shows how to fill virtual dataset with data from other datasets, filter data by a given criteria, locate specified records, perform file operations, and change data and table structure.', 'Working with components', TVirtualTableFrame, 10, 'VTable'); +{$IFNDEF STD} + Demos.RegisterDemo('ServiceBroker', 'Using TMSServiceBroker component', 'Demonstrates working with the TMSServiceBroker component. This sample shows how to organize simple messaging.', 'Working with components', TServiceBrokerFrame, 11); +{$ENDIF} + + Demos.RegisterDemo('CachedUpdates', 'Cached updates, transaction control', 'Demonstrates how to perform the most important tasks of working with data in CachedUpdates mode, including highlighting uncommitted changes, managing transactions, and committing changes in a batch.', 'General demos', TCachedUpdatesFrame, 1); + Demos.RegisterDemo('FetchAll', 'Illustrates how to open TMSQuery with or without fetching all data to client', 'Demonstrates how to open a query that returns a large recordset using different values of the FetchAll option. This demo lets the user to fill in the table used in the query.', 'General demos', TFetchAllFrame, 1); + Demos.RegisterDemo('FilterAndIndex', 'Using Filter and IndexFieldNames', 'Demonstrates SDAC''s local storage functionality. This sample shows how to perform local filtering, sorting and locating by multiple fields, including by calculated and lookup fields.', 'General demos', TFilterAndIndexFrame, 1); Demos.RegisterDemo('MasterDetail', 'Master/detail relationship', 'Master/detail relationship', 'General demos', TMasterDetailFrame, 1); + Demos.RegisterDemo('Pictures', 'Working with BLOB field', 'Uses SDAC functionality to work with graphics. The sample demonstrates how to retrieve binary data from MS SQL database and display it on visual components. Sample also shows how to load and save pictures to files and to the database.', 'General demos', TPicturesFrame, 1); + Demos.RegisterDemo('StoredProcUpdates', 'Using StoredProcs to Insert, Update and Delete with TMSQuery component', 'Demonstrates updating a recordset using stored procedures. Update events are tied to stored procedure calls in design time, and every recordset change causes the corresponding stored procedure call to be performed. ' + 'The commands to call stored procedures are stored in the SQLInsert, SQLDelete, SQLUpdate properties of TMSQuery.', 'General demos', TStoredProcUpdatesFrame, 1); +{$IFNDEF CLR} + Demos.RegisterDemo('Threads', 'Using Sdac in multi-threaded environment', 'Demonstrates how SDAC can be used in multithreaded applications. This sample allows you to set up several threads and test SDAC''s performance with multithreading.', 'General demos', TThreadsFrame, 1); +{$ENDIF} + Demos.RegisterDemo('LongStrings', 'Working with string fields', 'Demonstrates SDAC functionality for working with long string fields (fields that have more than 256 characters). Shows the different ways they can be displayed as memo fields and string fields.', 'SQL Server specific', TLongStringsFrame, 1); + Demos.RegisterDemo('ServerCursors', 'Open and navigate using client and server cursor types', 'Compares performance of opening a large recordset with different cursor types: client cursor in FetchAll=True mode, client cursor in FetchAll=False mode, and server cursor.', 'SQL Server specific', TServerCursorsFrame, 1); + Demos.RegisterDemo('Text', 'Working with long string fields', 'Uses SDAC functionality to work with text. The sample demonstrates how to retrieve text data from MS SQL database and display it on visual components. Sample also shows how to load and save text to files and to the database.', 'SQL Server specific', TTextFrame, 1); + + Demos.RegisterCategory('Miscellaneous', '', -1, True); +{$IFDEF CLR} + Demos.RegisterDemo('AspNet', 'AspNet', 'Uses MSDataAdapter to create a simple ASP .NET application. This demo shows how to create an ASP.NET application that lets you connect to a database and execute queries. ' + 'Application displays query results in a DataGrid and sends user changes back to the database.', 'Miscellaneous', nil, 1, '', True); +{$ENDIF} +{$IFNDEF CLR} + Demos.RegisterDemo('Dll', 'Dll', 'Demonstrates creating and loading DLLs for SDAC-based projects. This demo project consists of two parts - an MS_Dll project that creates a DLL of a form that sends a query to the server and displays its results, ' + 'and an MS_Exe project that can be executed to display a form for loading and running this DLL. Allows you to build a dll for one SDAC-based project and load and test it from a separate application.', 'Miscellaneous', nil, 1, '', True); +{$ENDIF} + Demos.RegisterDemo('FailOver', 'FailOver', 'Demonstrates the recommended approach to working with unstable networks. This sample lets you perform transactions and updates in several different modes, ' + 'simulate a sudden session termination, and view what happens to your data state when connections to the server are unexpectedly lost. Shows off CachedUpdates, LocalMasterDetail, FetchAll, Pooling, and different Failover modes.', 'Miscellaneous', nil, 1, '', True); +{$IFNDEF CLR} + Demos.RegisterDemo('Midas', 'Midas', 'Demonstrates using MIDAS technology with SDAC. This project consists of two parts: a MIDAS server that processes requests to the database and a thin MIDAS client that displays an interactive grid. ' + 'This demo shows how to build thin clients that display interactive components and delegate all database interaction to a server application for processing.', 'Miscellaneous', nil, 1, '', True); + Demos.RegisterDemo('Performance', 'Performance', 'Measures SDAC performance on several types of queries. This project lets you compare SDAC performance to BDE, ADO, and dbExpress. Tests the following functionality: Fetch, Master/Detail, ' + 'Stored Procedure Call, Multi Executing, and Insert/Post.', 'Miscellaneous', nil, 1, '', True); +{$ENDIF} +{$IFDEF CLR} + Demos.RegisterDemo('WinForms', 'AspNet', 'Shows how to use SDAC to create a WinForm application. This demo project creates a simple WinForms application and fills a data grid from an MSDataAdapter data source.', 'Miscellaneous', nil, 1, '', True); +{$ENDIF} + +{$IFNDEF CLR} + Demos.RegisterCategory('', '', -1, True); +{$ENDIF} + Demos.RegisterCategory('TechnologySpecific', '', -1, True); + Demos.RegisterDemo('MSSQLCompact', 'MSSQLCompact', 'Demonstrates how to create applications that work with MS SQL Server Compact Edition. Demo connects to a database and opens a table. If the specified database does not exists, it will be created automatically.', 'TechnologySpecific', nil, 1, '', True); +{$IFNDEF CLR} + Demos.RegisterCategory('', '', -1, True); +{$ENDIF} + +{$IFNDEF CLR} + Demos.RegisterCategory('ThirdParty', '', -1, True); + Demos.RegisterDemo('FastReport', 'FastReport hint', 'Demonstrates how SDAC can be used with FastReport components. This project consists of two parts. The first part is several packages that integrate SDAC components into the FastReport editor. ' + 'The second part is a demo application that lets you design and preview reports with SDAC technology in the FastReport editor.', 'ThirdParty', nil, 1, '', True); + Demos.RegisterDemo('InfoPower', 'InfoPower hint', 'Uses InfoPower components to display recordsets retrieved with SDAC. This demo project displays an InfoPower grid component and fills it with the result of an SDAC query. Shows how to link SDAC data sources to InfoPower components.', 'ThirdParty', nil, 1, '', True); + Demos.RegisterDemo('IntraWeb', 'IntraWeb hint', 'A collection of sample projects that show how to use SDAC components as data sources for IntraWeb applications. Contains IntraWeb samples for setting up a connection, querying ' + 'a database and modifying data and working with CachedUpdates and MasterDetail relationships.', 'ThirdParty', nil, 1, '', True); + Demos.RegisterDemo('QuickReport', 'QuickReport hint', 'Lets you launch and view a QuickReport application based on SDAC. This demo project lets you modify the application in design-time.', 'ThirdParty', nil, 1, '', True); + Demos.RegisterDemo('ReportBuilder', 'ReportBuilder hint', 'Uses SDAC data sources to create a ReportBuilder report that takes data from an MS SQL database. This demo project shows how to set up a ReportBuilder document in design-time and how to integrate SDAC components into the ' + 'Report Builder editor to perform document design in run-time.', 'ThirdParty', nil, 1, '', True); +{$ENDIF} +{$IFNDEF CLR} + Demos.RegisterCategory('', '', -1, True); +{$ENDIF} + +end; + +procedure TSdacForm.lbAboutClick(Sender: TObject); +begin + inherited; + SdacAboutForm.ShowModal; +end; + +procedure TSdacForm.cbDebugClick(Sender: TObject); +begin + inherited; + scCreate.Debug := (Sender as TCheckBox).Checked; + scDrop.Debug := (Sender as TCheckBox).Checked; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/WindowsXP.res b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Base/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ + end + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 51 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 438 + Height = 49 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object Panel3: TPanel + Left = 1 + Top = 24 + Width = 436 + Height = 24 + BevelOuter = bvNone + TabOrder = 0 + object chkFiltered: TCheckBox + Left = 5 + Top = 4 + Width = 65 + Height = 17 + Caption = 'Filtered' + TabOrder = 0 + OnClick = chkFilteredClick + end + object chkFilterBar: TCheckBox + Left = 91 + Top = 4 + Width = 65 + Height = 17 + Action = actFilterBar + TabOrder = 1 + end + object chkSearchBar: TCheckBox + Left = 178 + Top = 4 + Width = 81 + Height = 17 + Action = actSearchBar + TabOrder = 2 + end + object chkRecCount: TCheckBox + Left = 265 + Top = 4 + Width = 89 + Height = 17 + Caption = 'Record Count' + TabOrder = 3 + OnClick = chkRecCountClick + end + object chkStretch: TCheckBox + Left = 368 + Top = 4 + Width = 57 + Height = 17 + Caption = 'Stretch' + TabOrder = 4 + OnClick = chkStretchClick + end + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 1 + Width = 270 + Height = 22 + Flat = True + TabOrder = 1 + end + end + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM crgrid_test') + Left = 8 + Top = 88 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 40 + Top = 88 + end + object ActionList1: TActionList + Left = 72 + Top = 96 + object actSearchBar: TAction + Caption = 'Search Bar' + OnExecute = actSearchBarExecute + OnUpdate = actSearchBarUpdate + end + object actFilterBar: TAction + Caption = 'Filter Bar' + OnExecute = actFilterBarExecute + OnUpdate = actFilterBarUpdate + end + end + object scCreate: TMSSQL + SQL.Strings = ( + 'CREATE TABLE CRGRID_TEST(' + ' Id int PRIMARY KEY,' + ' Name VARCHAR(10),' + ' Country VARCHAR(30),' + ' City VARCHAR(30),' + ' Street VARCHAR(30),' + ' BirthDate DATETIME,' + ' Job VARCHAR(9),' + ' Hiredate DATETIME,' + ' Sal NUMERIC(7, 2),' + ' Remarks TEXT' + ');' + '' + 'INSERT INTO CRGRID_TEST ' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5001, '#39'SMITH'#39', '#39'ENGLAND'#39', '#39'LONDON'#39', '#39'BOND st.'#39', '#39'12-OCT-63'#39', ' + + #39'CLERK'#39','#39'17-DEC-80'#39', 800);' + '' + 'INSERT INTO CRGRID_TEST' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5002, '#39'ALLEN'#39', '#39'ENGLAND'#39', '#39'LONDON'#39', '#39'BAKER st.'#39', '#39'04-MAR-61'#39',' + + ' '#39'SALESMAN'#39','#39'20-FEB-81'#39', 1600);' + '' + 'INSERT INTO CRGRID_TEST ' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5003, '#39'MARTIN'#39', '#39'FRANCE'#39', '#39'LION'#39', '#39'WEAVER st.'#39', '#39'23-JAN-57'#39', ' + + #39'MANAGER'#39','#39'02-APR-81'#39', 2900);') + CommandTimeout = 0 + Left = 448 + Top = 8 + end + object scDrop: TMSSQL + SQL.Strings = ( + 'DROP TABLE CRGRID_TEST') + CommandTimeout = 0 + Left = 488 + Top = 8 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CRDBGrid/CRDBGrid.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CRDBGrid/CRDBGrid.pas new file mode 100644 index 0000000..d0eb5bf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CRDBGrid/CRDBGrid.pas @@ -0,0 +1,129 @@ +unit CRDBGrid; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Db, MemDS, DBAccess, Grids, DBGrids, CRGrid, StdCtrls, + ActnList, ExtCtrls, DBCtrls, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm; + +type + TCRDBGridFrame = class(TDemoFrame) + MSQuery: TMSQuery; + DataSource: TDataSource; + ActionList1: TActionList; + actSearchBar: TAction; + actFilterBar: TAction; + scCreate: TMSSQL; + scDrop: TMSSQL; + CRDBGrid: TCRDBGrid; + Panel2: TPanel; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + Panel3: TPanel; + chkFiltered: TCheckBox; + chkFilterBar: TCheckBox; + chkSearchBar: TCheckBox; + chkRecCount: TCheckBox; + chkStretch: TCheckBox; + DBNavigator1: TDBNavigator; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure actSearchBarExecute(Sender: TObject); + procedure actSearchBarUpdate(Sender: TObject); + procedure actFilterBarExecute(Sender: TObject); + procedure actFilterBarUpdate(Sender: TObject); + procedure chkFilteredClick(Sender: TObject); + procedure chkRecCountClick(Sender: TObject); + procedure chkStretchClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TCRDBGridFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TCRDBGridFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TCRDBGridFrame.actSearchBarExecute(Sender: TObject); +begin + actSearchBar.Checked := not actSearchBar.Checked; + if actSearchBar.Checked then + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx + [dgeSearchBar] + else + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx - [dgeSearchBar]; +end; + +procedure TCRDBGridFrame.actSearchBarUpdate(Sender: TObject); +begin + actSearchBar.Checked := dgeSearchBar in CRDBGrid.OptionsEx; +end; + +procedure TCRDBGridFrame.actFilterBarExecute(Sender: TObject); +begin + actFilterBar.Checked := not actFilterBar.Checked; + if actFilterBar.Checked then + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx + [dgeFilterBar] + else + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx - [dgeFilterBar]; +end; + +procedure TCRDBGridFrame.actFilterBarUpdate(Sender: TObject); +begin + actFilterBar.Checked := dgeFilterBar in CRDBGrid.OptionsEx; +end; + +procedure TCRDBGridFrame.chkFilteredClick(Sender: TObject); +begin + CRDBGrid.Filtered := chkFiltered.Checked; +end; + +procedure TCRDBGridFrame.chkRecCountClick(Sender: TObject); +begin + if chkRecCount.Checked then + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx + [dgeRecordCount] + else + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx - [dgeRecordCount]; +end; + +procedure TCRDBGridFrame.chkStretchClick(Sender: TObject); +begin + if chkStretch.Checked then + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx + [dgeStretch] + else + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx - [dgeStretch]; +end; + +// Demo management +procedure TCRDBGridFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; +end; + +procedure TCRDBGridFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/CachedUpdates.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/CachedUpdates.dfm new file mode 100644 index 0000000..5eb14e3 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/CachedUpdates.dfm @@ -0,0 +1,372 @@ +inherited CachedUpdatesFrame: TCachedUpdatesFrame + Width = 443 + Height = 277 + Align = alClient + object DBGrid: TDBGrid + Left = 0 + Top = 102 + Width = 443 + Height = 175 + Align = alClient + DataSource = DataSource + Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgCancelOnExit] + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + OnDrawDataCell = DBGridDrawDataCell + end + object Panel8: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 102 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object ToolBar: TPanel + Left = 1 + Top = 1 + Width = 667 + Height = 100 + BevelOuter = bvNone + Color = clGreen + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object RefreshRecord: TSpeedButton + Left = 408 + Top = 1 + Width = 82 + Height = 22 + Caption = 'RefreshRecord' + Flat = True + Transparent = False + OnClick = RefreshRecordClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 240 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel1: TPanel + Left = 1 + Top = 47 + Width = 368 + Height = 52 + BevelOuter = bvNone + TabOrder = 1 + object Label2: TLabel + Left = 5 + Top = 5 + Width = 48 + Height = 13 + Caption = 'Updates' + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel3: TPanel + Left = 20 + Top = 23 + Width = 333 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btApply: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Apply' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btApplyClick + end + object btCommit: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Commit' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCommitClick + end + object btCancel: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Cancel' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCancelClick + end + object btRevertRecord: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Revert' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btRevertRecordClick + end + end + end + object Panel2: TPanel + Left = 1 + Top = 24 + Width = 317 + Height = 22 + BevelOuter = bvNone + TabOrder = 2 + object Label4: TLabel + Left = 220 + Top = 5 + Width = 51 + Height = 13 + Caption = 'Batch Size' + end + object cbCachedUpdates: TCheckBox + Left = 8 + Top = 4 + Width = 97 + Height = 12 + Caption = 'CachedUpdates' + TabOrder = 0 + OnClick = cbCachedUpdatesClick + end + object cbCustomUpdate: TCheckBox + Left = 113 + Top = 4 + Width = 97 + Height = 14 + Caption = 'Custom Update' + TabOrder = 1 + OnClick = cbCustomUpdateClick + end + object edUpdateBatchSize: TEdit + Left = 276 + Top = 1 + Width = 37 + Height = 21 + TabOrder = 2 + Text = '1' + end + end + object Panel4: TPanel + Left = 370 + Top = 47 + Width = 296 + Height = 52 + BevelOuter = bvNone + TabOrder = 3 + object Label3: TLabel + Left = 5 + Top = 5 + Width = 74 + Height = 13 + Caption = 'Transactions' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel5: TPanel + Left = 24 + Top = 23 + Width = 250 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btStartTrans: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Start' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btStartTransClick + end + object btCommitTrans: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Commit' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCommitTransClick + end + object btRollBackTrans: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Rollback' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btRollbackTransClick + end + end + end + object Panel6: TPanel + Left = 319 + Top = 24 + Width = 347 + Height = 22 + BevelOuter = bvNone + TabOrder = 4 + object Label1: TLabel + Left = 6 + Top = 4 + Width = 64 + Height = 13 + Caption = 'RecordTypes' + end + object cbDeleted: TCheckBox + Left = 284 + Top = 4 + Width = 59 + Height = 17 + Caption = 'Deleted' + TabOrder = 0 + OnClick = cbDeletedClick + end + object cbInserted: TCheckBox + Left = 221 + Top = 4 + Width = 61 + Height = 17 + Caption = 'Inserted' + TabOrder = 1 + OnClick = cbInsertedClick + end + object cbModified: TCheckBox + Left = 155 + Top = 4 + Width = 67 + Height = 17 + Caption = 'Modified' + TabOrder = 2 + OnClick = cbModifiedClick + end + object cbUnmodified: TCheckBox + Left = 77 + Top = 4 + Width = 76 + Height = 17 + Caption = 'Unmodified' + TabOrder = 3 + OnClick = cbUnmodifiedClick + end + end + object Panel7: TPanel + Left = 491 + Top = 1 + Width = 175 + Height = 22 + BevelOuter = bvNone + TabOrder = 5 + end + end + end + object DataSource: TDataSource + DataSet = MSQuery + OnStateChange = DataSourceStateChange + OnDataChange = DataSourceDataChange + Left = 233 + Top = 50 + end + object MSQuery: TMSQuery + SQL.Strings = ( + 'SELECT * FROM Emp') + CachedUpdates = True + OnUpdateError = MSQueryUpdateError + OnCalcFields = MSQueryCalcFields + Left = 205 + Top = 48 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/CachedUpdates.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/CachedUpdates.pas new file mode 100644 index 0000000..7d6313f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/CachedUpdates.pas @@ -0,0 +1,319 @@ +unit CachedUpdates; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, MemDS, StdCtrls, ToolWin, + ComCtrls, Buttons, DBAccess, MSAccess, SdacVcl, + DemoFrame, SdacDemoForm; + +type + TCachedUpdatesFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + MSQuery: TMSQuery; + Panel8: TPanel; + ToolBar: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + RefreshRecord: TSpeedButton; + DBNavigator: TDBNavigator; + Panel1: TPanel; + Label2: TLabel; + Panel3: TPanel; + btApply: TSpeedButton; + btCommit: TSpeedButton; + btCancel: TSpeedButton; + btRevertRecord: TSpeedButton; + Panel2: TPanel; + cbCachedUpdates: TCheckBox; + cbCustomUpdate: TCheckBox; + Panel4: TPanel; + Label3: TLabel; + Panel5: TPanel; + btStartTrans: TSpeedButton; + btCommitTrans: TSpeedButton; + btRollBackTrans: TSpeedButton; + Panel6: TPanel; + Label1: TLabel; + cbDeleted: TCheckBox; + cbInserted: TCheckBox; + cbModified: TCheckBox; + cbUnmodified: TCheckBox; + Panel7: TPanel; + Label4: TLabel; + edUpdateBatchSize: TEdit; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btApplyClick(Sender: TObject); + procedure btCancelClick(Sender: TObject); + procedure btStartTransClick(Sender: TObject); + procedure btCommitTransClick(Sender: TObject); + procedure btRollbackTransClick(Sender: TObject); + procedure cbCachedUpdatesClick(Sender: TObject); + procedure MSQueryUpdateError(DataSet: TDataSet; E: EDatabaseError; + UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); + procedure MSQueryUpdateRecord(DataSet: TDataSet; + UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); + procedure cbCustomUpdateClick(Sender: TObject); + procedure MSQueryCalcFields(DataSet: TDataSet); + procedure btCommitClick(Sender: TObject); + procedure cbUnmodifiedClick(Sender: TObject); + procedure cbModifiedClick(Sender: TObject); + procedure cbInsertedClick(Sender: TObject); + procedure cbDeletedClick(Sender: TObject); + procedure DataSourceDataChange(Sender: TObject; Field: TField); + procedure DataSourceStateChange(Sender: TObject); + procedure DBGridDrawDataCell(Sender: TObject; const Rect: TRect; + Field: TField; State: TGridDrawState); + procedure btRevertRecordClick(Sender: TObject); + procedure RefreshRecordClick(Sender: TObject); + private + { Private declarations } + procedure ShowTrans; + procedure ShowPending; + procedure ShowUpdateRecordTypes; + public + destructor Destroy; override; + + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +uses + UpdateAction; + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TCachedUpdatesFrame.ShowTrans; +begin + if MSQuery.Connection .InTransaction then + SdacForm.StatusBar.Panels[2].Text := 'In Transaction' + else + SdacForm.StatusBar.Panels[2].Text := ''; +end; + +procedure TCachedUpdatesFrame.ShowPending; +begin + if MSQuery.UpdatesPending then + SdacForm.StatusBar.Panels[1].Text := 'Updates Pending' + else + SdacForm.StatusBar.Panels[1].Text := ''; +end; + +procedure TCachedUpdatesFrame.ShowUpdateRecordTypes; +begin + if MSQuery.CachedUpdates then begin + cbUnmodified.Checked := rtUnmodified in MSQuery.UpdateRecordTypes; + cbModified.Checked := rtModified in MSQuery.UpdateRecordTypes; + cbInserted.Checked := rtInserted in MSQuery.UpdateRecordTypes; + cbDeleted.Checked := rtDeleted in MSQuery.UpdateRecordTypes; + end; +end; + +procedure TCachedUpdatesFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TCachedUpdatesFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TCachedUpdatesFrame.btApplyClick(Sender: TObject); +begin + MSQuery.Options.UpdateBatchSize := StrToInt(edUpdateBatchSize.Text); + MSQuery.ApplyUpdates; + ShowPending; +end; + +procedure TCachedUpdatesFrame.btCommitClick(Sender: TObject); +begin + MSQuery.CommitUpdates; + ShowPending; +end; + +procedure TCachedUpdatesFrame.btCancelClick(Sender: TObject); +begin + MSQuery.CancelUpdates; + ShowPending; +end; + +procedure TCachedUpdatesFrame.btStartTransClick(Sender: TObject); +begin + MSQuery.Connection.StartTransaction; + ShowTrans; +end; + +procedure TCachedUpdatesFrame.btCommitTransClick(Sender: TObject); +begin + MSQuery.Connection.Commit; + ShowTrans; +end; + +procedure TCachedUpdatesFrame.btRollbackTransClick(Sender: TObject); +begin + MSQuery.Connection.Rollback; + ShowTrans; +end; + +destructor TCachedUpdatesFrame.Destroy; +begin + FreeAndNil(UpdateActionForm); + inherited; +end; + +procedure TCachedUpdatesFrame.cbCachedUpdatesClick(Sender: TObject); +begin + try + MSQuery.CachedUpdates := cbCachedUpdates.Checked; + except + cbCachedUpdates.Checked := MSQuery.CachedUpdates; + raise; + end; + ShowUpdateRecordTypes; +end; + +procedure TCachedUpdatesFrame.MSQueryUpdateError(DataSet: TDataSet; E: EDatabaseError; + UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); +begin + UpdateActionForm.rgAction.ItemIndex := Ord(UpdateAction); + UpdateActionForm.rgKind.ItemIndex := Ord(UpdateKind); + UpdateActionForm.lbField.Caption := String(DataSet.Fields[0].Value); + UpdateActionForm.lbMessage.Caption := E.Message; + UpdateActionForm.ShowModal; + UpdateAction := TUpdateAction(UpdateActionForm.rgAction.ItemIndex); +end; + +procedure TCachedUpdatesFrame.MSQueryUpdateRecord(DataSet: TDataSet; + UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); +begin + UpdateActionForm.rgAction.ItemIndex := Ord(UpdateAction); + UpdateActionForm.rgKind.ItemIndex := Ord(UpdateKind); + UpdateActionForm.lbField.Caption := String(DataSet.Fields[0].NewValue); + UpdateActionForm.lbMessage.Caption := ''; + UpdateActionForm.ShowModal; + UpdateAction := TUpdateAction(UpdateActionForm.rgAction.ItemIndex); +end; + +procedure TCachedUpdatesFrame.cbCustomUpdateClick(Sender: TObject); +begin + if cbCustomUpdate.Checked then + MSQuery.OnUpdateRecord := MSQueryUpdateRecord + else + MSQuery.OnUpdateRecord := nil; +end; + +procedure TCachedUpdatesFrame.MSQueryCalcFields(DataSet: TDataSet); +var + St:string; +begin + case Ord(TCustomMSDataSet(DataSet).UpdateStatus) of + 0: St := 'Unmodified'; + 1: St := 'Modified'; + 2: St := 'Inserted'; + 3: St := 'Deleted'; + end; + DataSet.FieldByName('Status').AsString := St; + +{ case Ord(TMSDataSet(DataSet).UpdateResult) of + 0: St := 'Fail'; + 1: St := 'Abort'; + 2: St := 'Skip'; + 3: St := 'Applied'; + end; + DataSet.FieldByName('Result').AsString := St;} +end; + +procedure TCachedUpdatesFrame.cbUnmodifiedClick(Sender: TObject); +begin + if cbUnmodified.Checked then + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes + [rtUnmodified] + else + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes - [rtUnmodified]; +end; + +procedure TCachedUpdatesFrame.cbModifiedClick(Sender: TObject); +begin + if cbModified.Checked then + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes + [rtModified] + else + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes - [rtModified]; +end; + +procedure TCachedUpdatesFrame.cbInsertedClick(Sender: TObject); +begin + if cbInserted.Checked then + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes + [rtInserted] + else + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes - [rtInserted]; +end; + +procedure TCachedUpdatesFrame.cbDeletedClick(Sender: TObject); +begin + if cbDeleted.Checked then + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes + [rtDeleted] + else + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes - [rtDeleted]; +end; + +procedure TCachedUpdatesFrame.DataSourceStateChange(Sender: TObject); +begin + ShowPending; + SdacForm.StatusBar.Panels[3].Text := 'Record ' + IntToStr(MSQuery.RecNo) + ' of ' + IntToStr(MSQuery.RecordCount) ; +end; + +procedure TCachedUpdatesFrame.DataSourceDataChange(Sender: TObject; Field: TField); +begin + DataSourceStateChange(nil); +end; + +procedure TCachedUpdatesFrame.DBGridDrawDataCell(Sender: TObject; const Rect: TRect; + Field: TField; State: TGridDrawState); +begin + if MSQuery.UpdateResult in [uaFail,uaSkip] then + TDBGrid(Sender).Canvas.Brush.Color := clRed + else + if MSQuery.UpdateStatus <> usUnmodified then + TDBGrid(Sender).Canvas.Brush.Color := clYellow; + + TDBGrid(Sender).DefaultDrawDataCell(Rect, Field, State); +end; + +procedure TCachedUpdatesFrame.btRevertRecordClick(Sender: TObject); +begin + MSQuery.RevertRecord; + ShowPending; +end; + +procedure TCachedUpdatesFrame.RefreshRecordClick(Sender: TObject); +begin + MSQuery.RefreshRecord; +end; + +// Demo management +procedure TCachedUpdatesFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + UpdateActionForm := TUpdateActionForm.Create(nil); + cbCachedUpdates.Checked := MSQuery.CachedUpdates; + ShowUpdateRecordTypes; +end; + +procedure TCachedUpdatesFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/UpdateAction.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/UpdateAction.dfm new file mode 100644 index 0000000..22e0817 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/UpdateAction.dfm @@ -0,0 +1,139 @@ +object UpdateActionForm: TUpdateActionForm + Left = 586 + Top = 306 + Width = 235 + Height = 300 + HorzScrollBar.Range = 199 + VertScrollBar.Range = 131 + AutoScroll = False + Caption = 'UpdateAction' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 5 + Top = 4 + Width = 217 + Height = 262 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object Panel5: TPanel + Left = 1 + Top = 1 + Width = 215 + Height = 128 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 6 + Top = 15 + Width = 46 + Height = 13 + Caption = 'Message:' + end + object Label2: TLabel + Left = 6 + Top = 1 + Width = 35 + Height = 13 + Caption = 'Record' + end + object lbField: TLabel + Left = 64 + Top = 2 + Width = 141 + Height = 13 + AutoSize = False + Caption = 'lbFileld' + end + object lbMessage: TLabel + Left = 7 + Top = 29 + Width = 201 + Height = 95 + AutoSize = False + Caption = 'lbMessage' + WordWrap = True + end + end + object Panel7: TPanel + Left = 1 + Top = 130 + Width = 98 + Height = 131 + BevelOuter = bvNone + TabOrder = 1 + object rgAction: TRadioGroup + Left = 6 + Top = 1 + Width = 87 + Height = 126 + Caption = 'UpdateAction' + Items.Strings = ( + 'Fail' + 'Abort' + 'Skip' + 'Retry' + 'Applied' + 'Default') + TabOrder = 0 + end + end + object Panel4: TPanel + Left = 100 + Top = 130 + Width = 116 + Height = 89 + BevelOuter = bvNone + TabOrder = 2 + object rgKind: TRadioGroup + Left = 7 + Top = 2 + Width = 103 + Height = 83 + Caption = 'UpdateKind' + Enabled = False + Items.Strings = ( + 'Modify' + 'Insert' + 'Delete') + TabOrder = 0 + end + end + object Panel9: TPanel + Left = 100 + Top = 220 + Width = 116 + Height = 41 + BevelOuter = bvNone + TabOrder = 3 + object Panel2: TPanel + Left = 16 + Top = 9 + Width = 84 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOk: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Ok' + Flat = True + Transparent = False + OnClick = btOkClick + end + end + end + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/UpdateAction.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/UpdateAction.pas new file mode 100644 index 0000000..3322b25 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/CachedUpdates/UpdateAction.pas @@ -0,0 +1,48 @@ +unit UpdateAction; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, Buttons; + +type + TUpdateActionForm = class(TForm) + Panel1: TPanel; + Panel5: TPanel; + Label1: TLabel; + Label2: TLabel; + lbField: TLabel; + lbMessage: TLabel; + Panel7: TPanel; + rgAction: TRadioGroup; + Panel4: TPanel; + rgKind: TRadioGroup; + Panel9: TPanel; + Panel2: TPanel; + btOk: TSpeedButton; + procedure btOkClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + UpdateActionForm: TUpdateActionForm; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TUpdateActionForm.btOkClick(Sender: TObject); +begin + ModalResult := mrOk; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectDialog.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectDialog.dfm new file mode 100644 index 0000000..78c07d3 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectDialog.dfm @@ -0,0 +1,115 @@ +inherited ConnectDialogFrame: TConnectDialogFrame + Width = 441 + Height = 275 + Align = alClient + object DBGrid: TDBGrid + Left = 0 + Top = 54 + Width = 441 + Height = 221 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 54 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 398 + Height = 52 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel3: TPanel + Left = 1 + Top = 24 + Width = 396 + Height = 27 + BevelOuter = bvNone + TabOrder = 1 + object rbInherited: TRadioButton + Left = 216 + Top = 5 + Width = 113 + Height = 17 + Caption = 'Inherited connect' + TabOrder = 0 + OnClick = rbInheritedClick + end + object rbMy: TRadioButton + Left = 112 + Top = 5 + Width = 81 + Height = 17 + Caption = 'My connect' + TabOrder = 1 + OnClick = rbMyClick + end + object rbDefault: TRadioButton + Left = 8 + Top = 5 + Width = 65 + Height = 17 + Caption = 'Default' + Checked = True + TabOrder = 2 + TabStop = True + OnClick = rbDefaultClick + end + end + end + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 464 + Top = 32 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Emp') + Left = 432 + Top = 32 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectDialog.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectDialog.pas new file mode 100644 index 0000000..219c3f7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectDialog.pas @@ -0,0 +1,93 @@ +unit ConnectDialog; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Db, MemDS, Grids, DBGrids, DBCtrls, StdCtrls, ExtCtrls, DBAccess, + MSAccess, SdacVcl, Buttons, DemoFrame, + InheritedConnectForm, MyConnectForm; + +type + TConnectDialogFrame = class(TDemoFrame) + DataSource: TDataSource; + MSQuery: TMSQuery; + DBGrid: TDBGrid; + ToolBar: TPanel; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + Panel3: TPanel; + rbInherited: TRadioButton; + rbMy: TRadioButton; + rbDefault: TRadioButton; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure rbDefaultClick(Sender: TObject); + procedure rbMyClick(Sender: TObject); + procedure rbInheritedClick(Sender: TObject); + private + { Private declarations } + public + destructor Destroy; override; + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +destructor TConnectDialogFrame.Destroy; +begin + MSQuery.Connection.ConnectDialog.DialogClass := ''; + inherited; +end; + + +procedure TConnectDialogFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TConnectDialogFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TConnectDialogFrame.rbDefaultClick(Sender: TObject); +begin + MSQuery.Connection.ConnectDialog.DialogClass := ''; +end; + +procedure TConnectDialogFrame.rbMyClick(Sender: TObject); +begin + MSQuery.Connection.ConnectDialog.DialogClass := 'TfmMyConnect'; +end; + +procedure TConnectDialogFrame.rbInheritedClick(Sender: TObject); +begin + MSQuery.Connection.ConnectDialog.DialogClass := 'TfmInheritedConnect'; +end; + +// Demo management +procedure TConnectDialogFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; +end; + +procedure TConnectDialogFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug:= Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectForm.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectForm.dfm new file mode 100644 index 0000000..722acee --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectForm.dfm @@ -0,0 +1,112 @@ +object ConnectForm: TConnectForm + Left = 368 + Top = 255 + ActiveControl = edUsername + BorderIcons = [] + BorderStyle = bsDialog + Caption = 'Connect' + ClientHeight = 175 + ClientWidth = 291 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + Scaled = False + PixelsPerInch = 96 + TextHeight = 13 + object Panel: TPanel + Left = 8 + Top = 8 + Width = 273 + Height = 121 + BevelInner = bvRaised + BevelOuter = bvLowered + FullRepaint = False + TabOrder = 0 + object lbUsername: TLabel + Left = 16 + Top = 20 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Username' + Layout = tlCenter + end + object lbPassword: TLabel + Left = 16 + Top = 54 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Password' + Layout = tlCenter + end + object lbServer: TLabel + Left = 16 + Top = 88 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Server' + Layout = tlCenter + end + object edUsername: TEdit + Left = 104 + Top = 16 + Width = 153 + Height = 21 + AutoSelect = False + MaxLength = 32767 + TabOrder = 0 + end + object edPassword: TEdit + Left = 104 + Top = 50 + Width = 153 + Height = 21 + AutoSelect = False + MaxLength = 32767 + PasswordChar = '*' + TabOrder = 1 + end + object edServer: TComboBox + Left = 104 + Top = 84 + Width = 153 + Height = 21 + DropDownCount = 10 + ItemHeight = 13 + TabOrder = 2 + end + end + object btConnect: TButton + Left = 52 + Top = 141 + Width = 89 + Height = 25 + Caption = 'Connect' + Default = True + TabOrder = 1 + OnClick = btConnectClick + end + object btCancel: TButton + Left = 148 + Top = 141 + Width = 89 + Height = 25 + Cancel = True + Caption = 'Cancel' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ModalResult = 2 + ParentFont = False + TabOrder = 2 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectForm.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectForm.pas new file mode 100644 index 0000000..09cd94c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/ConnectForm.pas @@ -0,0 +1,123 @@ + +////////////////////////////////////////////////// +// MS SQL Server Data Access Components +// Copyright © 1998-2001 Core Lab. All right reserved. +// Connect Form +////////////////////////////////////////////////// + +unit ConnectForm; +interface +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, DBAccess, OLEDBAccess, OLEDBIntf, OLEDBC; + +type + TConnectForm = class(TForm) + Panel: TPanel; + lbUsername: TLabel; + lbPassword: TLabel; + lbServer: TLabel; + edUsername: TEdit; + btConnect: TButton; + btCancel: TButton; + edPassword: TEdit; + edServer: TComboBox; + procedure btConnectClick(Sender: TObject); + + private + FConnectDialog: TCustomConnectDialog; + FRetries: integer; + FOldCreateOrder: boolean; + FRetry: boolean; + + procedure SetConnectDialog(Value: TCustomConnectDialog); + + protected + procedure DoInit; virtual; + procedure DoConnect; virtual; + + public + + published + property ConnectDialog: TCustomConnectDialog read FConnectDialog write SetConnectDialog; + + property OldCreateOrder: boolean read FOldCreateOrder write FOldCreateOrder; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TConnectForm.DoInit; +begin + FRetry := False; + FRetries := FConnectDialog.Retries; + Caption := FConnectDialog.Caption; + + with FConnectDialog do begin + lbUsername.Caption := UsernameLabel; + lbPassword.Caption := PasswordLabel; + lbServer.Caption := ServerLabel; + btConnect.Caption := ConnectButton; + btCancel.Caption := CancelButton; + + FConnectDialog.GetServerList(edServer.Items); + edUsername.Text := Connection.Username; + edPassword.Text := Connection.Password; + edServer.Text := Connection.Server; + + if (edUsername.Text <> '') and (edPassword.Text = '') then + ActiveControl := edPassword; + end; +end; + +procedure TConnectForm.DoConnect; +begin + FConnectDialog.Connection.Password := edPassword.Text; + FConnectDialog.Connection.Server := edServer.Text; + FConnectDialog.Connection.UserName := edUsername.Text; + try + FConnectDialog.Connection.PerformConnect(FRetry); + ModalResult := mrOk; + except + on E: EMSError do begin + Dec(FRetries); + FRetry := True; + if FRetries = 0 then + ModalResult := mrCancel; + + if E.MSSQLErrorCode <= NE_MAX_NETERROR then + ActiveControl := edServer + else + if E.OLEDBErrorCode = DB_SEC_E_AUTH_FAILED then + if ActiveControl <> edUsername then + ActiveControl := edPassword; + raise; + end + else + raise; + end; +end; + +procedure TConnectForm.SetConnectDialog(Value: TCustomConnectDialog); +begin + FConnectDialog := Value; + DoInit; +end; + +procedure TConnectForm.btConnectClick(Sender: TObject); +begin + DoConnect; +end; + +initialization + if GetClass('TConnectForm') = nil then + Classes.RegisterClass(TConnectForm); +// Classes.GroupDescendentsWith(TConnectForm, TForm); +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/InheritedConnectForm.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/InheritedConnectForm.dfm new file mode 100644 index 0000000..3eba499 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/InheritedConnectForm.dfm @@ -0,0 +1,43 @@ +inherited fmInheritedConnect: TfmInheritedConnect + Left = 359 + Top = 212 + Caption = 'Inherited Connect' + PixelsPerInch = 96 + TextHeight = 13 + inherited Panel: TPanel + BevelOuter = bvNone + inherited lbUsername: TLabel + Width = 80 + Font.Color = clNavy + Font.Style = [fsBold] + ParentFont = False + end + inherited lbPassword: TLabel + Width = 55 + Font.Color = clNavy + Font.Style = [fsBold] + ParentFont = False + end + inherited lbServer: TLabel + Width = 38 + Font.Color = clNavy + Font.Style = [fsBold] + ParentFont = False + end + inherited lbDatabase: TLabel + Font.Color = clNavy + Font.Style = [fsBold] + ParentFont = False + end + end + inherited btConnect: TButton + Left = 98 + Width = 82 + Height = 22 + end + inherited btCancel: TButton + Left = 193 + Width = 82 + Height = 22 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/InheritedConnectForm.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/InheritedConnectForm.pas new file mode 100644 index 0000000..a937a48 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/InheritedConnectForm.pas @@ -0,0 +1,32 @@ +unit InheritedConnectForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Mask, ExtCtrls, MSConnectForm; + +type + TfmInheritedConnect = class(TMSConnectForm) + private + { Private declarations } + public + { Public declarations } + end; + +var + fmInheritedConnect: TfmInheritedConnect; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +initialization + if GetClass('TfmInheritedConnect') = nil then + Classes.RegisterClass(TfmInheritedConnect); +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/MyConnectForm.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/MyConnectForm.dfm new file mode 100644 index 0000000..d9a93b0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/MyConnectForm.dfm @@ -0,0 +1,151 @@ +object fmMyConnect: TfmMyConnect + Left = 305 + Top = 192 + BorderStyle = bsDialog + Caption = 'My Connect' + ClientHeight = 216 + ClientWidth = 288 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Panel: TPanel + Left = 8 + Top = 8 + Width = 273 + Height = 201 + BevelInner = bvRaised + BevelOuter = bvLowered + TabOrder = 0 + object lbUsername: TLabel + Left = 16 + Top = 20 + Width = 54 + Height = 13 + Caption = 'Username' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsItalic] + ParentFont = False + end + object lbPassword: TLabel + Left = 16 + Top = 54 + Width = 52 + Height = 13 + Caption = 'Password' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsItalic] + ParentFont = False + end + object lbServer: TLabel + Left = 16 + Top = 88 + Width = 37 + Height = 13 + Caption = 'Server' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsItalic] + ParentFont = False + end + object Bevel1: TBevel + Left = 1 + Top = 150 + Width = 270 + Height = 6 + Shape = bsBottomLine + end + object lbDatabase: TLabel + Left = 16 + Top = 122 + Width = 52 + Height = 13 + Caption = 'Database' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsItalic] + ParentFont = False + end + object edUsername: TEdit + Left = 104 + Top = 16 + Width = 153 + Height = 21 + TabOrder = 0 + end + object edPassword: TMaskEdit + Left = 104 + Top = 50 + Width = 153 + Height = 21 + PasswordChar = '*' + TabOrder = 1 + end + object edServer: TComboBox + Left = 104 + Top = 84 + Width = 153 + Height = 21 + ItemHeight = 13 + TabOrder = 2 + end + object edDatabase: TEdit + Left = 104 + Top = 118 + Width = 153 + Height = 21 + TabOrder = 3 + end + end + object btConnect: TBitBtn + Left = 81 + Top = 174 + Width = 82 + Height = 24 + Caption = 'OK' + Default = True + TabOrder = 1 + OnClick = btConnectClick + Glyph.Data = { + DE010000424DDE01000000000000760000002800000024000000120000000100 + 0400000000006801000000000000000000001000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 3333333333333333333333330000333333333333333333333333F33333333333 + 00003333344333333333333333388F3333333333000033334224333333333333 + 338338F3333333330000333422224333333333333833338F3333333300003342 + 222224333333333383333338F3333333000034222A22224333333338F338F333 + 8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224 + 33333338F83338F338F33333000033A33333A222433333338333338F338F3333 + 0000333333333A222433333333333338F338F33300003333333333A222433333 + 333333338F338F33000033333333333A222433333333333338F338F300003333 + 33333333A222433333333333338F338F00003333333333333A22433333333333 + 3338F38F000033333333333333A223333333333333338F830000333333333333 + 333A333333333333333338330000333333333333333333333333333333333333 + 0000} + NumGlyphs = 2 + end + object btCancel: TBitBtn + Left = 177 + Top = 174 + Width = 82 + Height = 24 + TabOrder = 2 + Kind = bkCancel + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/MyConnectForm.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/MyConnectForm.pas new file mode 100644 index 0000000..6ed1db5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ConnectDialog/MyConnectForm.pas @@ -0,0 +1,128 @@ +unit MyConnectForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OLEDBIntf, + OLEDBC, StdCtrls, Mask, ExtCtrls, Buttons, MSAccess, OLEDBAccess, DBAccess, SdacVcl; + +type + TfmMyConnect = class(TForm) + Panel: TPanel; + lbUsername: TLabel; + lbPassword: TLabel; + lbServer: TLabel; + edUsername: TEdit; + edPassword: TMaskEdit; + edServer: TComboBox; + btConnect: TBitBtn; + btCancel: TBitBtn; + Bevel1: TBevel; + edDatabase: TEdit; + lbDatabase: TLabel; + procedure btConnectClick(Sender: TObject); + private + FConnectDialog: TMSConnectDialog; + FRetries:integer; + FRetry: boolean; + + procedure SetConnectDialog(Value: TMSConnectDialog); + + protected + procedure DoInit; virtual; + procedure DoConnect; virtual; + + public + + published + property ConnectDialog: TMSConnectDialog read FConnectDialog write SetConnectDialog; + + end; + +var + fmMyConnect: TfmMyConnect; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TfmMyConnect.DoInit; +begin + FRetry := False; + FRetries := FConnectDialog.Retries; + Caption := FConnectDialog.Caption; + + lbUsername.Caption := FConnectDialog.UsernameLabel; + lbPassword.Caption := FConnectDialog.PasswordLabel; + lbServer.Caption := FConnectDialog.ServerLabel; + btConnect.Caption := FConnectDialog.ConnectButton; + btCancel.Caption := FConnectDialog.CancelButton; + + FConnectDialog.GetServerList(edServer.Items); + edUsername.Text := FConnectDialog.Connection.Username; + edPassword.Text := FConnectDialog.Connection.Password; + edServer.Text := FConnectDialog.Connection.Server; + edDatabase.Text := FConnectDialog.Connection.Database; + + if (edUsername.Text <> '') and (edPassword.Text = '') then + ActiveControl := edPassword; +end; + +procedure TfmMyConnect.DoConnect; +begin + FConnectDialog.Connection.Password := edPassword.Text; + FConnectDialog.Connection.Server := edServer.Text; + FConnectDialog.Connection.UserName := edUsername.Text; + FConnectDialog.Connection.Database := edDatabase.Text; + try + FConnectDialog.Connection.PerformConnect(FRetry); + ModalResult := mrOk; + except + on E: EMSError do begin + Dec(FRetries); + FRetry := True; + if FRetries = 0 then + ModalResult := mrCancel; + + if E.MSSQLErrorCode <= NE_MAX_NETERROR then + ActiveControl := edServer + else + if E.OLEDBErrorCode = DB_SEC_E_AUTH_FAILED then + if ActiveControl <> edUsername then + ActiveControl := edPassword; + raise; + end + else + raise; + end; +end; + +procedure TfmMyConnect.SetConnectDialog(Value: TMSConnectDialog); +begin + FConnectDialog:= Value; + DoInit; +end; + +procedure TfmMyConnect.btConnectClick(Sender: TObject); +begin + DoConnect; +end; + +initialization + if GetClass('TfmMyConnect') = nil then begin + {$IFDEF VER6P} + Classes.StartClassGroup(TfmMyConnect); + {$ENDIF} + Classes.RegisterClass(TfmMyConnect); + {$IFDEF VER6P} + ActivateClassGroup(TfmMyConnect); + {$ENDIF} + end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FetchAll/FetchAll.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FetchAll/FetchAll.dfm new file mode 100644 index 0000000..216a2cf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FetchAll/FetchAll.dfm @@ -0,0 +1,188 @@ +inherited FetchAllFrame: TFetchAllFrame + Width = 691 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 105 + Width = 691 + Height = 2 + Cursor = crVSplit + Align = alTop + Color = clGreen + ParentColor = False + end + object DBGrid: TDBGrid + Left = 0 + Top = 107 + Width = 691 + Height = 170 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 691 + Height = 25 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 0 + Width = 727 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btFillTables: TSpeedButton + Left = 480 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Fill tables' + Flat = True + Transparent = False + OnClick = btFillTablesClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel2: TPanel + Left = 398 + Top = 1 + Width = 81 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object FetchAllCB: TCheckBox + Left = 9 + Top = 4 + Width = 70 + Height = 17 + Caption = 'FetchAll' + TabOrder = 0 + OnClick = FetchAllCBClick + end + end + object Panel3: TPanel + Left = 563 + Top = 1 + Width = 163 + Height = 22 + BevelOuter = bvNone + TabOrder = 2 + object Label1: TLabel + Left = 6 + Top = 5 + Width = 52 + Height = 13 + Caption = 'Row count' + end + object edRowCount: TEdit + Left = 68 + Top = 2 + Width = 91 + Height = 21 + TabOrder = 0 + Text = '3000' + end + end + end + end + object Memo: TMemo + Left = 0 + Top = 25 + Width = 691 + Height = 80 + Align = alTop + ScrollBars = ssVertical + TabOrder = 2 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 528 + Top = 120 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'select TOP 100000 * from Loaded1, Loaded2') + ReadOnly = True + FetchAll = False + Left = 496 + Top = 120 + end + object MSSQLFillTables: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'declare' + ' @i INTEGER;' + 'begin' + ' SET @i = 0' + ' WHILE @i <= :Cnt' + ' BEGIN' + ' SET @i = @i + 1' + ' INSERT INTO Loaded1 (' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39',' + ' '#39'23456789012345678901'#39');' + ' INSERT INTO Loaded2 (' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39',' + ' '#39'23456789012345678901'#39');' + ' END;' + 'end;') + CommandTimeout = 0 + Left = 525 + Top = 60 + ParamData = < + item + DataType = ftInteger + Name = 'Cnt' + ParamType = ptInput + Value = 1000 + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FetchAll/FetchAll.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FetchAll/FetchAll.pas new file mode 100644 index 0000000..15d7b36 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FetchAll/FetchAll.pas @@ -0,0 +1,100 @@ +unit FetchAll; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, SdacVcl, + ComCtrls, Buttons, MemDS, DBAccess, MSAccess, OLEDBAccess, DemoFrame, + SdacDemoForm; + +type + TFetchAllFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + Memo: TMemo; + MSQuery: TMSQuery; + Panel1: TPanel; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + btOpen: TSpeedButton; + Splitter1: TSplitter; + Panel2: TPanel; + FetchAllCB: TCheckBox; + btFillTables: TSpeedButton; + Panel3: TPanel; + Label1: TLabel; + edRowCount: TEdit; + MSSQLFillTables: TMSSQL; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure FetchAllCBClick(Sender: TObject); + procedure btFillTablesClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TFetchAllFrame.btOpenClick(Sender: TObject); +var + dt: TDateTime; +begin + MSQuery.Connection.Open; + + MSQuery.SQL.Assign(Memo.Lines); + + if MSQuery.FetchAll then + SdacForm.StatusBar.Panels[1].Text := 'FetchAll is True' + else + SdacForm.StatusBar.Panels[1].Text := 'FetchAll is False'; + + dt := Now; + MSQuery.Open; + SdacForm.StatusBar.Panels[2].Text := 'Opened in ' + TimeToStr(Now - dt); + SdacForm.StatusBar.Update; +end; + +procedure TFetchAllFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TFetchAllFrame.FetchAllCBClick(Sender: TObject); +begin + MSQuery.FetchAll := FetchAllCB.Checked; +end; + +// Demo management +procedure TFetchAllFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + Memo.Lines.Text := MSQuery.SQL.Text; + FetchAllCB.Checked := MSQuery.FetchAll; +end; + +procedure TFetchAllFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +procedure TFetchAllFrame.btFillTablesClick(Sender: TObject); +begin + MSSQLFillTables.ParamByName('cnt').AsString := edRowCount.Text; + MSSQLFillTables.Execute; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FilterAndIndex/FilterAndIndex.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FilterAndIndex/FilterAndIndex.dfm new file mode 100644 index 0000000..6bff59c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FilterAndIndex/FilterAndIndex.dfm @@ -0,0 +1,311 @@ +inherited FilterAndIndexFrame: TFilterAndIndexFrame + Width = 443 + Height = 277 + Align = alClient + object DBGrid: TDBGrid + Left = 166 + Top = 47 + Width = 277 + Height = 230 + Align = alClient + DataSource = DataSource + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object Panel4: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 47 + Align = alTop + BevelOuter = bvNone + Locked = True + TabOrder = 1 + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 651 + Height = 47 + Align = alLeft + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object Panel5: TPanel + Left = 388 + Top = 1 + Width = 149 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbCalcFields: TCheckBox + Left = 8 + Top = 0 + Width = 142 + Height = 23 + Caption = 'Calculated/Lookup fields' + Color = clBtnFace + ParentColor = False + TabOrder = 0 + OnClick = cbCalcFieldsClick + end + end + object Panel2: TPanel + Left = 167 + Top = 24 + Width = 483 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object cbFilter: TCheckBox + Left = 380 + Top = 0 + Width = 54 + Height = 21 + Caption = 'Filter' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentColor = False + ParentFont = False + TabOrder = 0 + OnClick = cbFilterClick + end + object edFilter: TEdit + Left = 6 + Top = 2 + Width = 365 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Text = 'DEPTNO = 10' + OnExit = edFilterExit + end + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 1 + Width = 220 + Height = 23 + DataSource = DataSource + Flat = True + TabOrder = 2 + end + object Panel1: TPanel + Left = 538 + Top = 1 + Width = 112 + Height = 22 + BevelOuter = bvNone + TabOrder = 3 + object cbCacheCalcFields: TCheckBox + Left = 9 + Top = 0 + Width = 100 + Height = 23 + Caption = 'CacheCalcFields' + Color = clBtnFace + ParentColor = False + TabOrder = 0 + OnClick = cbCacheCalcFieldsClick + end + end + object Panel6: TPanel + Left = 0 + Top = 24 + Width = 166 + Height = 22 + BevelOuter = bvNone + TabOrder = 4 + object cbIndex: TCheckBox + Left = 9 + Top = 3 + Width = 64 + Height = 15 + Caption = 'Index' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentColor = False + ParentFont = False + TabOrder = 0 + OnClick = cbIndexClick + end + end + end + end + object Panel3: TPanel + Left = 0 + Top = 47 + Width = 166 + Height = 230 + Align = alLeft + BevelOuter = bvNone + ParentColor = True + TabOrder = 2 + object Panel8: TPanel + Left = 0 + Top = 146 + Width = 166 + Height = 84 + Align = alBottom + BevelOuter = bvNone + Caption = 'Panel8' + Color = clGreen + TabOrder = 0 + object Panel7: TPanel + Left = 1 + Top = 1 + Width = 164 + Height = 82 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 6 + Top = 3 + Width = 90 + Height = 13 + Caption = 'IndexFieldNames =' + end + object lbIndexFieldNames: TLabel + Left = 6 + Top = 22 + Width = 126 + Height = 54 + AutoSize = False + Transparent = False + WordWrap = True + end + end + end + object lbFields: TListBox + Left = 0 + Top = 0 + Width = 166 + Height = 146 + Align = alClient + ItemHeight = 13 + MultiSelect = True + TabOrder = 1 + OnClick = lbFieldsClick + end + end + object Query: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Emp') + Debug = True + RefreshOptions = [roAfterInsert, roAfterUpdate] + Left = 272 + Top = 55 + end + object DataSource: TDataSource + DataSet = Query + Left = 304 + Top = 55 + end + object Query2: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Emp') + Debug = True + OnCalcFields = Query2CalcFields + Left = 272 + Top = 88 + object Query2CALCULATED: TIntegerField + FieldKind = fkCalculated + FieldName = 'CALCULATED' + Calculated = True + end + object Query2LOOKUP: TStringField + FieldKind = fkLookup + FieldName = 'LOOKUP' + LookupDataSet = LookupQuery + LookupKeyFields = 'DEPTNO' + LookupResultField = 'DNAME' + KeyFields = 'DEPTNO' + Lookup = True + end + object Query2EMPNO: TIntegerField + FieldName = 'EMPNO' + Required = True + end + object Query2ENAME: TStringField + FieldName = 'ENAME' + Size = 10 + end + object Query2JOB: TStringField + FieldName = 'JOB' + Size = 9 + end + object Query2MGR: TIntegerField + FieldName = 'MGR' + end + object Query2HIREDATE: TDateTimeField + FieldName = 'HIREDATE' + end + object Query2SAL: TFloatField + FieldName = 'SAL' + end + object Query2COMM: TFloatField + FieldName = 'COMM' + end + object Query2DEPTNO: TIntegerField + FieldName = 'DEPTNO' + end + end + object LookupQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Dept') + Left = 304 + Top = 88 + object LookupQueryDEPTNO: TIntegerField + FieldName = 'DEPTNO' + Required = True + end + object LookupQueryDNAME: TStringField + FieldName = 'DNAME' + Size = 14 + end + object LookupQueryLOC: TStringField + FieldName = 'LOC' + Size = 13 + end + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FilterAndIndex/FilterAndIndex.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FilterAndIndex/FilterAndIndex.pas new file mode 100644 index 0000000..7891adf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/FilterAndIndex/FilterAndIndex.pas @@ -0,0 +1,206 @@ +unit FilterAndIndex; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, SdacVcl, + MemDS, DBAccess, MSAccess, DB, Buttons, DemoFrame, SdacDemoForm; + +type + TFilterAndIndexFrame = class(TDemoFrame) + Query: TMSQuery; + DBGrid: TDBGrid; + DataSource: TDataSource; + Panel4: TPanel; + ToolBar: TPanel; + btClose: TSpeedButton; + btOpen: TSpeedButton; + DBNavigator1: TDBNavigator; + Panel3: TPanel; + Query2: TMSQuery; + LookupQuery: TMSQuery; + Query2EMPNO: TIntegerField; + Query2ENAME: TStringField; + Query2JOB: TStringField; + Query2MGR: TIntegerField; + Query2HIREDATE: TDateTimeField; + Query2SAL: TFloatField; + Query2COMM: TFloatField; + Query2DEPTNO: TIntegerField; + LookupQueryDEPTNO: TIntegerField; + LookupQueryDNAME: TStringField; + LookupQueryLOC: TStringField; + Query2CALCULATED: TIntegerField; + Query2LOOKUP: TStringField; + Label1: TLabel; + lbIndexFieldNames: TLabel; + Panel5: TPanel; + Panel2: TPanel; + Panel7: TPanel; + Panel8: TPanel; + lbFields: TListBox; + cbFilter: TCheckBox; + cbCalcFields: TCheckBox; + Panel1: TPanel; + cbCacheCalcFields: TCheckBox; + edFilter: TEdit; + Panel6: TPanel; + cbIndex: TCheckBox; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure Query2CalcFields(DataSet: TDataSet); + procedure cbFilterClick(Sender: TObject); + procedure cbCalcFieldsClick(Sender: TObject); + procedure cbIndexClick(Sender: TObject); + procedure lbFieldsClick(Sender: TObject); + procedure cbCacheCalcFieldsClick(Sender: TObject); + procedure edFilterExit(Sender: TObject); + private + FOldActive: boolean; + FFilterFilterNames: TStringList; + procedure BeginChange; + procedure EndChange; + public + destructor Destroy; override; + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +var + FilterAndIndexFrame: TFilterAndIndexFrame; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TFilterAndIndexFrame.btOpenClick(Sender: TObject); +var + i: integer; +begin + if DataSource.DataSet.Active then + Exit; + lbFields.Items.Clear; + lbFieldsClick(nil); + cbFilterClick(nil); + DataSource.DataSet.Open; + for i := 0 to DataSource.DataSet.FieldCount - 1 do + lbFields.Items.Add(DataSource.DataSet.Fields[i].FieldName); +end; + +procedure TFilterAndIndexFrame.btCloseClick(Sender: TObject); +begin + DataSource.DataSet.Close; +end; + +procedure TFilterAndIndexFrame.Query2CalcFields(DataSet: TDataSet); +begin + Query2CALCULATED.AsInteger := Query2EMPNO.AsInteger * 2; +end; + +procedure TFilterAndIndexFrame.BeginChange; +begin + FOldActive := DataSource.DataSet.Active; + if FOldActive then + btCloseClick(nil); +end; + +procedure TFilterAndIndexFrame.EndChange; +begin + if FOldActive then + btOpenClick(nil); +end; + +procedure TFilterAndIndexFrame.cbFilterClick(Sender: TObject); +begin + DataSource.DataSet.Filtered := cbFilter.Checked; + DataSource.DataSet.Filter := edFilter.Text; +end; + +procedure TFilterAndIndexFrame.cbCalcFieldsClick(Sender: TObject); +begin + BeginChange; + if cbCalcFields.Checked then + DataSource.DataSet := Query2 + else + DataSource.DataSet := Query; + EndChange; +end; + +procedure TFilterAndIndexFrame.cbIndexClick(Sender: TObject); +begin + if cbIndex.Checked then + TMSQuery(DataSource.DataSet).IndexFieldNames := lbIndexFieldNames.Caption + else + TMSQuery(DataSource.DataSet).IndexFieldNames := '' +end; + +procedure TFilterAndIndexFrame.lbFieldsClick(Sender: TObject); +var + i, k: integer; + s: string; +begin + i := 0; + while i < FFilterFilterNames.Count do begin + k := lbFields.Items.IndexOf(FFilterFilterNames[i]); + if (k < 0) or not lbFields.Selected[k] then + FFilterFilterNames.Delete(i) + else + Inc(i); + end; + for i := 0 to lbFields.Items.Count - 1 do + if lbFields.Selected[i] and + (FFilterFilterNames.IndexOf(lbFields.Items[i]) < 0) then + FFilterFilterNames.Add(lbFields.Items[i]); + + s := ''; + for i := 0 to FFilterFilterNames.Count - 1 do begin + if s <> '' then + s := s + ', '; + s := s + FFilterFilterNames[i]; + end; + lbIndexFieldNames.Caption := s; + + cbIndexClick(nil); +end; + +procedure TFilterAndIndexFrame.cbCacheCalcFieldsClick(Sender: TObject); +begin + BeginChange; + TMSQuery(DataSource.DataSet).Options.CacheCalcFields := cbCacheCalcFields.Checked; + EndChange; +end; + +procedure TFilterAndIndexFrame.edFilterExit(Sender: TObject); +begin + cbFilterClick(nil); +end; + +destructor TFilterAndIndexFrame.Destroy; +begin + FFilterFilterNames.Free; + inherited; +end; + +// Demo management +procedure TFilterAndIndexFrame.Initialize; +begin + inherited; + Query.Connection := Connection as TMSConnection; + Query2.Connection := Connection as TMSConnection; + FFilterFilterNames := TStringList.Create; +end; + +procedure TFilterAndIndexFrame.SetDebug(Value: boolean); +begin + Query.Debug := Value; + Query2.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Fetch.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Fetch.dfm new file mode 100644 index 0000000..9030202 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Fetch.dfm @@ -0,0 +1,62 @@ +object FetchForm: TFetchForm + Left = 396 + Top = 205 + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'Loading' + ClientHeight = 134 + ClientWidth = 299 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsStayOnTop + KeyPreview = True + OldCreateOrder = False + Position = poMainFormCenter + OnKeyDown = FormKeyDown + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 61 + Width = 287 + Height = 13 + Caption = 'Press Cancel button to interrupt loading operation.' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel1: TPanel + Left = 102 + Top = 93 + Width = 84 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btCancel: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Cancel' + Flat = True + Transparent = False + OnClick = btCancelClick + end + end + object ProgressBar: TProgressBar + Left = 8 + Top = 25 + Width = 287 + Height = 16 + TabOrder = 1 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Fetch.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Fetch.pas new file mode 100644 index 0000000..6019ccf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Fetch.pas @@ -0,0 +1,72 @@ +unit Fetch; + +interface + +uses +{$IFDEF LINUX} + QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QDBCtrls, QComCtrls, QExtCtrls, QGrids, QButtons, +{$ELSE} + Windows, Messages,Graphics, Controls, Forms, Dialogs, Buttons, + DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, +{$ENDIF} +{$IFDEF CLR} + System.ComponentModel, +{$ENDIF} + SysUtils, Classes; + +type + TFetchForm = class(TForm) + Label1: TLabel; + Panel1: TPanel; + btCancel: TSpeedButton; + ProgressBar: TProgressBar; + procedure btCancelClick(Sender: TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure FormShow(Sender: TObject); + private + { Private declarations } + public + CancelLoad: boolean; + end; + +var + FetchForm: TFetchForm; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TFetchForm.btCancelClick(Sender: TObject); +begin + CancelLoad := True; + Hide; +end; + +procedure TFetchForm.FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + +{$IFDEF LINUX} +const + VK_ESCAPE = 27; +{$ENDIF} +begin + if Key = VK_ESCAPE then + Close; +end; + +procedure TFetchForm.FormShow(Sender: TObject); +begin + ProgressBar.Position := 0; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Loader.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Loader.dfm new file mode 100644 index 0000000..d159881 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Loader.dfm @@ -0,0 +1,185 @@ +inherited LoaderFrame: TLoaderFrame + Width = 443 + Height = 277 + Align = alClient + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 64 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object ToolBar: TPanel + Left = 1 + Top = 1 + Width = 586 + Height = 62 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 24 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 87 + Top = 1 + Width = 85 + Height = 24 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btLoad: TSpeedButton + Left = 173 + Top = 1 + Width = 85 + Height = 24 + Caption = 'Load' + Flat = True + Transparent = False + OnClick = btLoadClick + end + object btDeleteAll: TSpeedButton + Left = 259 + Top = 1 + Width = 85 + Height = 24 + Caption = 'Delete All' + Flat = True + Transparent = False + OnClick = btDeleteAllClick + end + object DBNavigator: TDBNavigator + Left = 345 + Top = 1 + Width = 240 + Height = 24 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel1: TPanel + Left = 1 + Top = 26 + Width = 171 + Height = 35 + BevelOuter = bvNone + TabOrder = 1 + object Label1: TLabel + Left = 6 + Top = 14 + Width = 49 + Height = 13 + Caption = 'Load rows' + end + object edRows: TEdit + Left = 66 + Top = 10 + Width = 87 + Height = 21 + TabOrder = 0 + Text = '1000' + end + end + object Panel3: TPanel + Left = 173 + Top = 26 + Width = 412 + Height = 35 + BevelOuter = bvNone + TabOrder = 2 + object rgEvent: TRadioGroup + Left = 9 + Top = -1 + Width = 225 + Height = 32 + Columns = 2 + Items.Strings = ( + 'GetColumnData' + 'PutData') + TabOrder = 0 + OnClick = rgEventClick + end + end + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 64 + Width = 443 + Height = 213 + Align = alClient + DataSource = DataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object DataSource: TDataSource + DataSet = Query + Left = 440 + Top = 64 + end + object Query: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Sdac_Loaded ORDER BY CODE') + AfterOpen = QueryAfterOpen + BeforeClose = QueryBeforeClose + AfterRefresh = QueryAfterOpen + Left = 408 + Top = 64 + end + object MSLoader: TMSLoader + Connection = SDACForm.MSConnection + TableName = 'Sdac_Loaded' + Columns = < + item + Name = 'Code' + FieldType = ftInteger + Size = 0 + end + item + Name = 'Num' + FieldType = ftInteger + Size = 0 + end + item + Name = 'Num1' + FieldType = ftFloat + Size = 0 + Precision = 15 + end + item + Name = 'Str' + Size = 50 + end + item + Name = 'Dat' + FieldType = ftDateTime + Size = 0 + end> + OnGetColumnData = MSLoaderGetColumnData + Left = 408 + Top = 96 + end + object TruncCommand: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'TRUNCATE TABLE SDAC_Loaded') + CommandTimeout = 0 + Left = 408 + Top = 128 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Loader.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Loader.pas new file mode 100644 index 0000000..945d828 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Loader/Loader.pas @@ -0,0 +1,245 @@ +unit Loader; + +interface + +uses +{$IFNDEF VER130} + Variants, +{$ENDIF} + SysUtils, +{$IFDEF LINUX} + Types, Classes, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QDBCtrls, QComCtrls, QExtCtrls, QGrids, QDBGrids, QButtons, SdacClx, +{$ELSE} + Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, Buttons, + Grids, DBGrids, StdCtrls, ExtCtrls, DBCtrls, SdacVcl, +{$ENDIF} +{$IFDEF CLR} + System.ComponentModel, +{$ENDIF} + Db, MemDS, DBAccess, Fetch, + DALoader, MSLoader, MSScript, MSAccess, DemoFrame, DAScript, SDacDemoForm + ; + +type + TLoaderFrame = class(TDemoFrame) + DataSource: TDataSource; + Query: TMSQuery; + MSLoader: TMSLoader; + TruncCommand: TMSSQL; + Panel2: TPanel; + ToolBar: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btLoad: TSpeedButton; + btDeleteAll: TSpeedButton; + DBNavigator: TDBNavigator; + Panel1: TPanel; + Label1: TLabel; + edRows: TEdit; + DBGrid: TDBGrid; + Panel3: TPanel; + rgEvent: TRadioGroup; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btDeleteAllClick(Sender: TObject); + procedure QueryAfterOpen(DataSet: TDataSet); + procedure QueryBeforeClose(DataSet: TDataSet); + procedure PutData(Sender: TMSLoader); + procedure rgEventClick(Sender: TObject); + procedure QueryBeforeFetch(DataSet: TCustomDADataSet; + var Cancel: Boolean); + procedure QueryAfterFetch(DataSet: TCustomDADataSet); + procedure MSLoaderGetColumnData(Sender: TObject; Column: TMSColumn; + Row: Integer; var Value: Variant; var IsEOF: Boolean); + private + { Private declarations } + public + PMInterval: integer; + Count: integer; + destructor Destroy; override; + + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +destructor TLoaderFrame.Destroy; +begin + FreeAndNil(FetchForm); + inherited; +end; + +procedure TLoaderFrame.btOpenClick(Sender: TObject); +begin + Query.Open; +end; + +procedure TLoaderFrame.btCloseClick(Sender: TObject); +begin + Query.Close; +end; + +procedure TLoaderFrame.btLoadClick(Sender: TObject); +var + Start, Finish, Freq: Integer; +begin + Start := GetTickCount; + ShortDateFormat := 'yyyy-mm-dd'; + MSLoader.Connection.Connect; + FetchForm.Show; + Count := StrToInt(edRows.Text); + FetchForm.ProgressBar.Max := Count; + FetchForm.CancelLoad := False; + try + MSLoader.Load; // loading rows + finally + FetchForm.Hide; + Finish := GetTickCount; + Freq := 1000; + SDacForm.StatusBar.Panels[2].Text := 'Time: ' + FloatToStr(Round((Finish - Start) / Freq * 100) / 100) + ' sec.'; + if Query.Active then + Query.Refresh; + end; +end; + +procedure TLoaderFrame.MSLoaderGetColumnData(Sender: TObject; + Column: TMSColumn; Row: Integer; var Value: Variant; var IsEOF: Boolean); +begin + IsEOF := Row > Count; + case Column.Index of + 0: Value := Row; + 1: Value := Random(100); + 2: Value := Random*100; + 3: Value := 'abc01234567890123456789'; + 4: Value := Date; + else + Value := Null; + end; + + FetchForm.ProgressBar.Position := Row; + + if PMInterval = 100 then begin // 100 fields per time + Application.ProcessMessages; + if FetchForm.CancelLoad then begin + MessageDlg('Loading was cancelled by user.' + #13#10 + + 'Sucessfully loaded '+ IntToStr(Row - 1) + ' rows.', mtInformation, [mbOK], 0); + IsEof := True; + end; + end + else + inc(PMInterval); +end; + +procedure TLoaderFrame.PutData(Sender: TMSLoader); +var + i: integer; +begin + PMInterval := 0; + + for i := 1 to Count do begin + Sender.PutColumnData(0, i, i); + Sender.PutColumnData('NUM', i, Random(100)); + Sender.PutColumnData(2, i, Random*100); + Sender.PutColumnData(3, i, 'abc01234567890123456789'); + Sender.PutColumnData(4, i, Date); + FetchForm.ProgressBar.Position := i; + if PMInterval = 100 then begin // 100 records per time + PMInterval := 0; + Application.ProcessMessages; + if FetchForm.CancelLoad then begin + MessageDlg('Loading was cancelled by user.' + #13#10 + + 'Sucessfully loaded '+ IntToStr(i) + ' rows.', mtInformation, [mbOK], 0); + Abort; + end; + end + else + inc(PMInterval); + end; +end; + +procedure TLoaderFrame.btDeleteAllClick(Sender: TObject); +begin + TruncCommand.Execute; + if Query.Active then + Query.Refresh; +end; + +procedure TLoaderFrame.QueryAfterOpen(DataSet: TDataSet); +begin + SDACForm.StatusBar.Panels[1].Text := 'Count: ' + IntToStr(DataSet.RecordCount); +end; + +procedure TLoaderFrame.QueryBeforeClose(DataSet: TDataSet); +begin + SDACForm.StatusBar.Panels[1].Text := ''; +end; + +procedure TLoaderFrame.rgEventClick(Sender: TObject); +begin + if rgEvent.ItemIndex = 0 then begin + MSLoader.OnGetColumnData := MSLoaderGetColumnData; + MSLoader.OnPutData := nil; + end + else begin + MSLoader.OnGetColumnData := nil; + MSLoader.OnPutData := PutData; + end +end; + +procedure TLoaderFrame.QueryBeforeFetch(DataSet: TCustomDADataSet; + var Cancel: Boolean); +begin + if DataSet.FetchingAll then begin + FetchForm.Show; + Application.ProcessMessages; + Cancel := not FetchForm.Visible; + + if Cancel then + SdacForm.StatusBar.Panels[1].Text := 'RecordCount: ' + IntToStr(DataSet.RecordCount); + end; +end; + +procedure TLoaderFrame.QueryAfterFetch(DataSet: TCustomDADataSet); +begin + if not DataSet.FetchingAll then begin + FetchForm.Close; + Application.ProcessMessages; + + SdacForm.StatusBar.Panels[1].Text := 'RecordCount: ' + IntToStr(DataSet.RecordCount); + end; +end; + +// Demo management +procedure TLoaderFrame.Initialize; +begin + inherited; + Query.Connection := Connection as TMSConnection; + MSLoader.Connection := Connection as TMSConnection; + TruncCommand.Connection := Connection as TMSConnection; + + if FetchForm = nil then + FetchForm := TFetchForm.Create(SDACForm); + rgEvent.ItemIndex := 1; +end; + +procedure TLoaderFrame.SetDebug(Value: boolean); +begin + Query.Debug := Value; + TruncCommand.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/LongStrings/LongStrings.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/LongStrings/LongStrings.dfm new file mode 100644 index 0000000..1966184 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/LongStrings/LongStrings.dfm @@ -0,0 +1,186 @@ +inherited LongStringsFrame: TLongStringsFrame + Width = 443 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 193 + Width = 443 + Height = 2 + Cursor = crVSplit + Align = alTop + end + object DBGrid: TDBGrid + Left = 0 + Top = 25 + Width = 443 + Height = 168 + Align = alTop + DataSource = DataSource + TabOrder = 2 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 25 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object ToolButton1: TToolButton + Left = 390 + Top = 2 + Width = 17 + Caption = 'ToolButton1' + Style = tbsSeparator + end + object Panel1: TPanel + Left = 1 + Top = 0 + Width = 498 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object Panel2: TPanel + Left = 398 + Top = 1 + Width = 99 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbLongStrings: TCheckBox + Left = 7 + Top = 4 + Width = 97 + Height = 17 + Caption = 'LongStrings' + TabOrder = 0 + OnClick = cbLongStringsClick + end + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 1 + end + end + end + object meComments: TDBMemo + Left = 0 + Top = 221 + Width = 443 + Height = 56 + Align = alClient + DataField = 'VALUE' + DataSource = DataSource + ScrollBars = ssVertical + TabOrder = 3 + end + object ToolBar1: TPanel + Left = 0 + Top = 195 + Width = 443 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object ToolButton2: TToolButton + Left = 150 + Top = 2 + Width = 25 + Caption = 'ToolButton2' + Style = tbsSeparator + end + object Panel3: TPanel + Left = 1 + Top = 1 + Width = 250 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClear: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Clear' + Flat = True + Transparent = False + OnClick = btClearClick + end + object btSave: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Save to file' + Flat = True + Transparent = False + OnClick = btSaveClick + end + object btLoad: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Load from file' + Flat = True + Transparent = False + OnClick = btLoadClick + end + end + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 440 + Top = 88 + end + object OpenDialog: TOpenDialog + Left = 264 + Top = 219 + end + object SaveDialog: TSaveDialog + Left = 296 + Top = 219 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM SDAC_Long_char') + Debug = True + FetchRows = 1 + Left = 408 + Top = 88 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/LongStrings/LongStrings.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/LongStrings/LongStrings.pas new file mode 100644 index 0000000..998881a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/LongStrings/LongStrings.pas @@ -0,0 +1,138 @@ +unit LongStrings; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, SdacVcl, + ComCtrls, MemDS, DBAccess, MSAccess, Buttons, DemoFrame, SdacDemoForm; + +type + TLongStringsFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + meComments: TDBMemo; + Splitter1: TSplitter; + ToolBar1: TPanel; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + ToolButton1: TToolButton; + ToolButton2: TToolButton; + Panel1: TPanel; + Panel2: TPanel; + DBNavigator: TDBNavigator; + btClose: TSpeedButton; + btOpen: TSpeedButton; + cbLongStrings: TCheckBox; + Panel3: TPanel; + btClear: TSpeedButton; + btSave: TSpeedButton; + btLoad: TSpeedButton; + MSQuery: TMSQuery; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btSaveClick(Sender: TObject); + procedure cbLongStringsClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TLongStringsFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TLongStringsFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TLongStringsFrame.btLoadClick(Sender: TObject); +var + List: TStringList; +begin + if MSQuery.Active and OpenDialog.Execute then begin + if MSQuery.State = dsBrowse then + MSQuery.Edit; + + if MSQuery.FieldByName('Value') is TBlobField then + TBlobField(MSQuery.FieldByName('Value')).LoadFromFile(OpenDialog.FileName) + else begin + List := TStringList.Create; + try + List.LoadFromFile(OpenDialog.FileName); + MSQuery.FieldByName('Value').AsString := List.Text; + finally + List.Free; + end; + end; + end; +end; + +procedure TLongStringsFrame.btSaveClick(Sender: TObject); +var + List: TStringList; +begin + if not MSQuery.EOF and SaveDialog.Execute then + if MSQuery.FieldByName('Value') is TBlobField then + TBlobField(MSQuery.FieldByName('Value')).SaveToFile(SaveDialog.FileName) + else begin + List := TStringList.Create; + try + List.Text := MSQuery.FieldByName('Value').AsString; + List.SaveToFile(SaveDialog.FileName); + finally + List.Free; + end; + end; +end; + +procedure TLongStringsFrame.cbLongStringsClick(Sender: TObject); +var + OldActive: boolean; +begin + OldActive := MSQuery.Active; + MSQuery.Active := False; + MSQuery.Options.LongStrings := cbLongStrings.Checked; + MSQuery.Active := OldActive; +end; + +procedure TLongStringsFrame.btClearClick(Sender: TObject); +begin + if MSQuery.Active then begin + if MSQuery.State = dsBrowse then + MSQuery.Edit; + MSQuery.FieldByName('Value').AsString := ''; + end; +end; + +// Demo management +procedure TLongStringsFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + cbLongStrings.Checked := MSQuery.Options.LongStrings; +end; + +procedure TLongStringsFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/MasterDetail/MasterDetail.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/MasterDetail/MasterDetail.dfm new file mode 100644 index 0000000..d826427 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/MasterDetail/MasterDetail.dfm @@ -0,0 +1,277 @@ +inherited MasterDetailFrame: TMasterDetailFrame + Width = 443 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 0 + Width = 443 + Height = 1 + Cursor = crVSplit + Align = alTop + end + object Splitter3: TSplitter + Left = 0 + Top = 143 + Width = 443 + Height = 1 + Cursor = crVSplit + Align = alTop + Color = clGreen + ParentColor = False + end + object DBGrid: TDBGrid + Left = 0 + Top = 27 + Width = 443 + Height = 116 + Align = alTop + DataSource = dsMaster + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 1 + Width = 443 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 554 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 240 + Height = 22 + DataSource = dsMaster + Flat = True + TabOrder = 0 + end + object Panel4: TPanel + Left = 408 + Top = 1 + Width = 145 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object cbLocalMasterDetail: TCheckBox + Left = 10 + Top = 3 + Width = 135 + Height = 17 + Caption = 'Use LocaMasterDetail' + TabOrder = 0 + OnClick = cbLocalMasterDetailClick + end + end + end + end + object ToolBar1: TPanel + Left = 0 + Top = 145 + Width = 443 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 650 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object DBNavigator1: TDBNavigator + Left = 1 + Top = 1 + Width = 240 + Height = 22 + DataSource = dsDetail + Flat = True + TabOrder = 0 + end + object Panel6: TPanel + Left = 532 + Top = 1 + Width = 117 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object cbCacheCalcFields: TCheckBox + Left = 5 + Top = 3 + Width = 108 + Height = 17 + Caption = 'CacheCalcFields' + Enabled = False + TabOrder = 0 + OnClick = cbCacheCalcFieldsClick + end + end + object Panel3: TPanel + Left = 242 + Top = 1 + Width = 289 + Height = 22 + BevelOuter = bvNone + TabOrder = 2 + object rbSQL: TRadioButton + Left = 5 + Top = 4 + Width = 63 + Height = 17 + Caption = 'SQL link' + Checked = True + TabOrder = 0 + TabStop = True + OnClick = rbClick + end + object rbSimpleFields: TRadioButton + Left = 75 + Top = 4 + Width = 97 + Height = 17 + Caption = 'Simple field link' + TabOrder = 1 + OnClick = rbClick + end + object rbCalcFields: TRadioButton + Left = 175 + Top = 4 + Width = 113 + Height = 17 + Caption = 'Calculated field link' + TabOrder = 2 + OnClick = rbClick + end + end + end + end + object DBGrid1: TDBGrid + Left = 0 + Top = 171 + Width = 443 + Height = 106 + Align = alClient + DataSource = dsDetail + TabOrder = 3 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object quMaster: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM dept') + OnCalcFields = quCalcFields + Left = 376 + Top = 32 + object quMasterDEPTNO: TIntegerField + FieldName = 'DEPTNO' + end + object quMasterDNAME: TStringField + FieldName = 'DNAME' + Size = 14 + end + object quMasterLOC: TStringField + FieldName = 'LOC' + Size = 13 + end + object quMasterDEPTNO_CALCULATED: TIntegerField + FieldKind = fkCalculated + FieldName = 'DEPTNO_CALCULATED' + Calculated = True + end + end + object quDetail: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM emp' + 'WHERE DeptNo = :DeptNo') + OnCalcFields = quCalcFields + MasterSource = dsMaster + Left = 376 + Top = 216 + ParamData = < + item + DataType = ftUnknown + Name = 'DeptNo' + end> + object quDetailEMPNO: TIntegerField + FieldName = 'EMPNO' + end + object quDetailENAME: TStringField + FieldName = 'ENAME' + Size = 10 + end + object quDetailJOB: TStringField + FieldName = 'JOB' + Size = 9 + end + object quDetailMGR: TIntegerField + FieldName = 'MGR' + end + object quDetailHIREDATE: TDateTimeField + FieldName = 'HIREDATE' + end + object quDetailSAL: TFloatField + FieldName = 'SAL' + end + object quDetailCOMM: TFloatField + FieldName = 'COMM' + end + object quDetailDEPTNO: TIntegerField + FieldName = 'DEPTNO' + end + object quDetailDEPTNO_CALCULATED: TIntegerField + FieldKind = fkCalculated + FieldName = 'DEPTNO_CALCULATED' + Calculated = True + end + end + object dsDetail: TDataSource + DataSet = quDetail + Left = 408 + Top = 216 + end + object dsMaster: TDataSource + DataSet = quMaster + Left = 408 + Top = 32 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/MasterDetail/MasterDetail.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/MasterDetail/MasterDetail.pas new file mode 100644 index 0000000..4e368da --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/MasterDetail/MasterDetail.pas @@ -0,0 +1,189 @@ +unit MasterDetail; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, +{$IFNDEF VER130} { Delphi 6 or higher } + Variants, +{$ENDIF} + ComCtrls, Buttons, MemDS, DBAccess, MSAccess, SdacVcl, DemoFrame, SdacDemoForm; + +type + TMasterDetailFrame = class(TDemoFrame) + quMaster: TMSQuery; + Splitter1: TSplitter; + quDetail: TMSQuery; + dsDetail: TDataSource; + dsMaster: TDataSource; + DBGrid: TDBGrid; + ToolBar: TPanel; + Panel2: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + ToolBar1: TPanel; + Panel1: TPanel; + DBNavigator1: TDBNavigator; + DBGrid1: TDBGrid; + Splitter3: TSplitter; + Panel4: TPanel; + cbLocalMasterDetail: TCheckBox; + Panel6: TPanel; + cbCacheCalcFields: TCheckBox; + Panel3: TPanel; + rbSQL: TRadioButton; + rbSimpleFields: TRadioButton; + rbCalcFields: TRadioButton; + quMasterDEPTNO: TIntegerField; + quMasterDNAME: TStringField; + quMasterLOC: TStringField; + quMasterDEPTNO_CALCULATED: TIntegerField; + quDetailEMPNO: TIntegerField; + quDetailENAME: TStringField; + quDetailJOB: TStringField; + quDetailMGR: TIntegerField; + quDetailHIREDATE: TDateTimeField; + quDetailSAL: TFloatField; + quDetailCOMM: TFloatField; + quDetailDEPTNO: TIntegerField; + quDetailDEPTNO_CALCULATED: TIntegerField; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure cbLocalMasterDetailClick(Sender: TObject); + procedure rbClick(Sender: TObject); + procedure cbCacheCalcFieldsClick(Sender: TObject); + procedure quCalcFields(DataSet: TDataSet); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TMasterDetailFrame.btOpenClick(Sender: TObject); +begin + quMaster.Open; + quDetail.Open; +end; + +procedure TMasterDetailFrame.btCloseClick(Sender: TObject); +begin + quDetail.Close; + quMaster.Close; +end; + +procedure TMasterDetailFrame.cbLocalMasterDetailClick(Sender: TObject); +var + OldActive: boolean; +begin + OldActive := quDetail.Active; + quDetail.Close; + try + quDetail.Options.LocalMasterDetail := cbLocalMasterDetail.Checked; + if OldActive then + quDetail.Open; + except + cbLocalMasterDetail.Checked := quDetail.Options.LocalMasterDetail; + raise; + end; +end; + +procedure TMasterDetailFrame.rbClick(Sender: TObject); +var + OldActive: boolean; +begin + OldActive := dsMaster.DataSet.Active; + if OldActive then + btCloseClick(nil); + cbCacheCalcFields.Enabled := Sender = rbCalcFields; + + if rbSQL.Checked then begin + quDetail.SQL.Text := 'SELECT * FROM Emp WHERE DeptNo = :DeptNo'; + quDetail.DetailFields := ''; + quDetail.MasterFields := ''; + quMaster.FieldByName('DEPTNO_CALCULATED').Visible := False; + quDetail.FieldByName('DEPTNO_CALCULATED').Visible := False; + cbLocalMasterDetail.Checked := False; + cbLocalMasterDetail.Enabled := False; + cbCacheCalcFields.Enabled := False; + end + else begin + if rbSimpleFields.Checked then begin + quDetail.SQL.Text := 'SELECT * FROM Emp'; + quDetail.DetailFields := 'DEPTNO'; + quDetail.MasterFields := 'DEPTNO'; + quMaster.FieldByName('DEPTNO_CALCULATED').Visible := False; + quDetail.FieldByName('DEPTNO_CALCULATED').Visible := False; + cbLocalMasterDetail.Enabled := True; + cbCacheCalcFields.Enabled := False; + end + else begin + quDetail.SQL.Text := 'SELECT * FROM Emp'; + quDetail.DetailFields := 'DEPTNO_CALCULATED'; + quDetail.MasterFields := 'DEPTNO_CALCULATED'; + quMaster.FieldByName('DEPTNO_CALCULATED').Visible := True; + quDetail.FieldByName('DEPTNO_CALCULATED').Visible := True; + cbLocalMasterDetail.Enabled := True; + cbLocalMasterDetail.Checked := True; + cbCacheCalcFields.Enabled := True; + end; + end; + cbCacheCalcFieldsClick(nil); + if OldActive then + btOpenClick(nil); +end; + +procedure TMasterDetailFrame.cbCacheCalcFieldsClick(Sender: TObject); +var + OldActive: boolean; +begin + OldActive := dsMaster.DataSet.Active; + if OldActive then + btCloseClick(nil); + quMaster.Options.CacheCalcFields := cbCacheCalcFields.Checked and cbCacheCalcFields.Enabled; + quDetail.Options.CacheCalcFields := quMaster.Options.CacheCalcFields; + if OldActive then + btOpenClick(nil); +end; + +procedure TMasterDetailFrame.quCalcFields(DataSet: TDataSet); +var + Dst, Src: TField; +begin + Src := DataSet.FieldByName('DEPTNO'); + Dst := DataSet.FieldByName('DEPTNO_CALCULATED'); + if Src.IsNull then + Dst.Value := Null + else + Dst.AsInteger := Src.AsInteger * 2; +end; + +// Demo management +procedure TMasterDetailFrame.Initialize; +begin + inherited; + quMaster.Connection := Connection as TMSConnection; + quDetail.Connection := Connection as TMSConnection; + rbClick(nil); +end; + +procedure TMasterDetailFrame.SetDebug(Value: boolean); +begin + quMaster.Debug := Value; + quDetail.Debug := Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Pictures.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Pictures.dfm new file mode 100644 index 0000000..7e9e9b5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Pictures.dfm @@ -0,0 +1,170 @@ +inherited PicturesFrame: TPicturesFrame + Width = 443 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 119 + Width = 443 + Height = 2 + Cursor = crVSplit + Align = alTop + Color = clBtnFace + ParentColor = False + end + object ScrollBox1: TScrollBox + Left = 0 + Top = 146 + Width = 443 + Height = 131 + Align = alClient + TabOrder = 0 + object DBImage: TDBImage + Left = 0 + Top = 0 + Width = 439 + Height = 127 + Align = alClient + Center = False + Constraints.MinHeight = 50 + DataField = 'PICTURE' + DataSource = dsPictures + TabOrder = 0 + end + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel2: TPanel + Left = 0 + Top = 1 + Width = 408 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 240 + Height = 22 + DataSource = dsPictures + Flat = True + TabOrder = 0 + end + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 26 + Width = 443 + Height = 93 + Align = alTop + Constraints.MinHeight = 50 + DataSource = dsPictures + Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgConfirmDelete] + TabOrder = 2 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar1: TPanel + Left = 0 + Top = 121 + Width = 443 + Height = 25 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + object Panel1: TPanel + Left = 2 + Top = 0 + Width = 259 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btLoad: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 22 + Caption = 'Load from file ...' + Flat = True + Transparent = False + OnClick = btLoadClick + end + object btSave: TSpeedButton + Left = 87 + Top = 1 + Width = 85 + Height = 22 + Caption = 'Save to file ...' + Flat = True + Transparent = False + OnClick = btSaveClick + end + object btClear: TSpeedButton + Left = 173 + Top = 1 + Width = 85 + Height = 22 + Caption = 'Clear' + Flat = True + Transparent = False + OnClick = btClearClick + end + end + end + object OpenPictureDialog: TOpenPictureDialog + Filter = 'Bitmaps (*.bmp)|*.bmp' + Left = 288 + Top = 115 + end + object SavePictureDialog: TSavePictureDialog + Filter = 'Bitmaps (*.bmp)|*.bmp' + Left = 320 + Top = 116 + end + object dsPictures: TDataSource + DataSet = quPictures + Left = 376 + Top = 16 + end + object quPictures: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM SDAC_Pictures') + Debug = True + FetchRows = 1 + Left = 344 + Top = 16 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Pictures.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Pictures.pas new file mode 100644 index 0000000..935e884 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Pictures.pas @@ -0,0 +1,107 @@ +unit Pictures; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, ExtDlgs, Buttons, MemDS, DBAccess, MSAccess, + DemoFrame, SdacDemoForm; + +type + TPicturesFrame = class(TDemoFrame) + OpenPictureDialog: TOpenPictureDialog; + ScrollBox1: TScrollBox; + SavePictureDialog: TSavePictureDialog; + ToolBar: TPanel; + Panel2: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + DBGrid: TDBGrid; + ToolBar1: TPanel; + Panel1: TPanel; + btLoad: TSpeedButton; + btSave: TSpeedButton; + btClear: TSpeedButton; + Splitter1: TSplitter; + dsPictures: TDataSource; + quPictures: TMSQuery; + DBImage: TDBImage; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btSaveClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TPicturesFrame.btOpenClick(Sender: TObject); +begin + quPictures.Open; +end; + +procedure TPicturesFrame.btCloseClick(Sender: TObject); +begin + quPictures.Close; +end; + +procedure TPicturesFrame.btLoadClick(Sender: TObject); +var + BlobField: TBlobField; + FileName: string; +begin + if OpenPictureDialog.Execute then begin + if quPictures.State in [dsBrowse] then + quPictures.Edit; + BlobField := quPictures.FieldByName('Picture') as TBlobField; + FileName := OpenPictureDialog.FileName; + BlobField.LoadFromFile(FileName); + end; +end; + +procedure TPicturesFrame.btSaveClick(Sender: TObject); +begin + if SavePictureDialog.Execute then begin + TBlobField(quPictures.FieldByName('Picture')). + SaveToFile(SavePictureDialog.FileName); + end; +end; + +procedure TPicturesFrame.btClearClick(Sender: TObject); +begin + if quPictures.State in [dsBrowse] then + quPictures.Edit; + TBlobField(quPictures.FieldByName('Picture')).Clear; +end; + +// Demo management +procedure TPicturesFrame.Initialize; +begin + inherited; + quPictures.Connection := Connection as TMSConnection; +end; + +procedure TPicturesFrame.SetDebug(Value: boolean); +begin + quPictures.Debug := Value; +end; + +end. + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Sandstone.bmp b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/Sandstone.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5a114e58a0350625b1968bc527f04e534fab5157 GIT binary patch literal 32854 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 UFF^mt&;Qrs`12pl&(Qh*1#Ez_e*gdg literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/World.bmp b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Pictures/World.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3171d5448c4b6167da8c8cb520806318b3138fe6 GIT binary patch literal 21718 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

q?7L#>cxGE&BTpbYC*VWC;% z*7e5Xbd6_J1;a((O~ZVI>wQ~|2CN0iET##+0H52lt&d>Sg~Yr$*J5$NaK{US^{O$b z<89=YaXhazgvAHGw>Vt|sU1mp!gG#18UWJU&?eA9FCBa)PGhy(#g+o+0BsiaDcbOG zoMjngERB1CoY4 z#dSvHA@JHT=C)+Q5yEqkBQ0!3IG}Niu67|Ki$Jm?_d6L3cZdEN)Ujz-d$)AFv3QXBNw?zCRlhvhe-pHg&9IFv{{aJVy#I zG+c+9l=+tUP;R&L?AtvX!G4NVYD%O1IK4MyaOk)tgXt9G6>qxg7LxHx~-yMV*coRC<{F? zDBQMzwuF4qB+Vj@o_b6O{M%XUE3mqGQM+LHSKu8FhG^k5y11~EZy9Q|M^P|1bQh>V z|Lj0;hjJ#D-$he$Z~0=km17^E%|ZO)3>kowUm8>c=X~ z9C3jS{9EVIW;(zU{k8D@d;Y5^9&StII_MW9yhKP17=FzZ& ztA8j!4L+e;E+$_%*Z3YYG#btU9lCdyzk2tbOSN}y+k_X&b!{0mG0cJa&f1S!+sl|g zMp0VNS!WdBAyjmTQQ2&zxc=aMzu}@!U=CpQ5fGDzZ@O1EQ19Xan{01p@~GYV3g?=A z)!yzqLergLS8W9Pcmq?pE_4bxFRK29Q;i=^wS;&_8&g*jozT7R#mcbT-Pq_mL>(_K z%jFp~V0reai|H07a=2gauaDvb)o-kq*%dOhANE`HnTo(pZWui)K;CZlZ+2>%S1aZv z^HSv|T04kFZ4&BOO2J|_XUzd=Z z%}3jSVcovGcTpCla98kk*ZnR!-nba7*E@`^KQgv>Ci#+N`F#mvBccq# z@+;W!cI#^M=EG*+{pf!;%{JjBw9s}4*x{Y7;;;H^x~g#lclvO_=g|GL?H2z5c0|90 zvO>TC?$Q5v^e+6@qrH`P-bZ(~lzOS_%MU%9nap-ZRo`>gEwL0!M6uC=bqiOCW|oq16PtdHG8JLgyyXLYJEl+eceh`?&n%^6oh5c^W3i@G!_$&K2=rB@Ule z>K1BG(yx`}*7odQmLI+Q-fyl9t3zr?mm{T>`mc<>Ksq)um{;>W$A^ywUi;O(&h>mB zke4?0VAQbSgL?ybZA7D5#To@+z#2PFAW%{E&Xv%;N)^xd z!D0CTG{62YAP*naY|enV`S8*5M)Oj;DKFJKUS&90JMcQaVBC=0b%to5A)n(v&3I1_ zU;rxspPCcAHBI;thk*3aBgl89m2N-!4`wy;P17_O)~KO7w!MckWAjH4&iCUkwH98i z58LfFJ#8H|AHtX)VxY5+5eHniTJ=7u?6`?L2HBy9UoC3{=MDHjIu{8y#h6mczkOe} zR>+_bgD@-Hepk+#D_^u`@{8@?sMXbI=#SQYt)ZKPz42AHPz&})v|jyDCsRVt3QYbG zP}>wI+T@s<&Ah3C?Z|d!U;O5sPt@9w*G%0RyDkQTuJ`IDKjnD{pGOkT^9O_#WI>3$ z)rzcb)7-9w)MLB#AJ-a&jmr;f$m5YV|7@~~jzSl7krkJ8i8Sz1Br==VX1}FFfeEwL zZ&dv5p1sy{IpO^&2!Hf%_90>vyVTD3VFB(;Gs70HT7CzjfW6&E_9||WQoFeC{uUN0 zEtDQ5@l(POX}ftXxD*7f>}%l1!k4Spef&BZ>Sg>!%Uhs|BJGsT1exd}9JgoJ!mC;m zv|B{A>_p?qmY{2SEEtHlLKdSPP@|d)y|YB-gb*!E*9>O=0*fvc4Z{W;Zf>Iogyp>@ zx=KiGEG)!h=rtZm==;InVDxt15cDZh zMEqwfF(ykfW_babEd@s4g-W6L$Bc~d4^5 '' then + St := St + ', '; + St := St + S; + end; + +begin + St := ''; + + if MSQuery.Prepared then begin + AddSt('Prepared'); + + if MSQuery.IsQuery then + AddSt('IsQuery'); + end; + + if MSQuery.Active then + AddSt('Active') + else + AddSt('Inactive'); + + if MSQuery.Executing then + AddSt('Executing'); + + if MSQuery.Fetching then + AddSt('Fetching'); + + edUpdatingTable.Text := MSQuery.UpdatingTable; + + SdacForm.StatusBar.Panels[2].Text := St; +end; + +procedure TQueryFrame.AssignProperties; +begin + try + MSQuery.FetchRows := StrToInt(edFetchRows.Text); + except + edFetchRows.SetFocus; + raise; + end; + try + MSQuery.UpdatingTable := edUpdatingTable.Text; + except + edUpdatingTable.SetFocus; + raise; + end; + + MSQuery.Filter := edFilter.Text; + if MSQuery.SQL.Text <> Memo.Lines.Text then + MSQuery.SQL.Assign(Memo.Lines); +end; + +procedure TQueryFrame.btOpenClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Open; + finally + ShowState; + end; +end; + +procedure TQueryFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; + ShowState; +end; + +procedure TQueryFrame.btRefreshRecordClick(Sender: TObject); +begin + MSQuery.RefreshRecord; +end; + +procedure TQueryFrame.DataSourceStateChange(Sender: TObject); +begin + SdacForm.StatusBar.Panels[1].Text := 'Record ' + IntToStr(MSQuery.RecNo) + ' of ' + IntToStr(MSQuery.RecordCount); +end; + +procedure TQueryFrame.DataSourceDataChange(Sender: TObject; Field: TField); +begin + DataSourceStateChange(nil); +end; + +procedure TQueryFrame.cbFilteredClick(Sender: TObject); +begin + try + MSQuery.Filtered := cbFiltered.Checked; + finally + cbFiltered.Checked := MSQuery.Filtered; + end; +end; + +procedure TQueryFrame.cbRefreshBeforeEditClick(Sender: TObject); +begin + if cbRefreshBeforeEdit.Checked then + MSQuery.RefreshOptions := MSQuery.RefreshOptions + [roBeforeEdit] + else + MSQuery.RefreshOptions := MSQuery.RefreshOptions - [roBeforeEdit]; +end; + +procedure TQueryFrame.cbRefreshAfterInsertClick(Sender: TObject); +begin + if cbRefreshAfterInsert.Checked then + MSQuery.RefreshOptions := MSQuery.RefreshOptions + [roAfterInsert] + else + MSQuery.RefreshOptions := MSQuery.RefreshOptions - [roAfterInsert]; +end; + +procedure TQueryFrame.cbRefreshAfterUpdateClick(Sender: TObject); +begin + if cbRefreshAfterUpdate.Checked then + MSQuery.RefreshOptions := MSQuery.RefreshOptions + [roAfterUpdate] + else + MSQuery.RefreshOptions := MSQuery.RefreshOptions - [roAfterUpdate]; +end; + +procedure TQueryFrame.MSQueryAfterOpen(DataSet: TDataSet); +begin + edUpdatingTable.Text := MSQuery.UpdatingTable; +end; + +procedure TQueryFrame.edFetchRowsExit(Sender: TObject); +begin + AssignProperties; +end; + +procedure TQueryFrame.btPrepareClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Prepare; + finally + ShowState; + end; +end; + +procedure TQueryFrame.btUnPrepareClick(Sender: TObject); +begin + MSQuery.UnPrepare; + ShowState; +end; + +procedure TQueryFrame.btExecuteClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Execute; + finally + ShowState; + end; +end; + +procedure TQueryFrame.cbNonBlockingClick(Sender: TObject); +begin + try + MSQuery.Options.NonBlocking := cbNonBlocking.Checked; + finally + cbNonBlocking.Checked := MSQuery.Options.NonBlocking; + end; +end; + +procedure TQueryFrame.btSaveToXMLClick(Sender: TObject); +begin + if SaveDialog.Execute then + MSQuery.SaveToXML(SaveDialog.FileName); +end; + +// Demo management +procedure TQueryFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + edFetchRows.Text := IntToStr(MSQuery.FetchRows); + + cbRefreshBeforeEdit.Checked := roBeforeEdit in MSQuery.RefreshOptions; + cbRefreshAfterInsert.Checked := roAfterInsert in MSQuery.RefreshOptions; + cbRefreshAfterUpdate.Checked := roAfterUpdate in MSQuery.RefreshOptions; + + edFilter.Text := MSQuery.Filter; + cbFiltered.Checked := MSQuery.Filtered; + + Memo.Lines.Text := MSQuery.SQL.Text; +end; + +procedure TQueryFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.bdsproj b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.bdsproj new file mode 100644 index 0000000..9d9f7b0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.bdsproj @@ -0,0 +1,164 @@ + + + + + + + + + + + + SDACDemo.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + ..\SdacDemo\ConnectDialog + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + 1.0.0.0 + 1.0.0.0 + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.cfg b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.cfg new file mode 100644 index 0000000..9a20476 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"." +-N"." +-LE"." +-LN"." +-U"..\ConnectDialog\" +-O"..\ConnectDialog\" +-I"..\ConnectDialog\" +-R"..\ConnectDialog\" \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.dof b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.dof new file mode 100644 index 0000000..fd37af0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.dof @@ -0,0 +1,2 @@ +[Directories] +SearchPath=..\SdacDemo\ConnectDialog \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.dpr b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.dpr new file mode 100644 index 0000000..32f6749 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.dpr @@ -0,0 +1,51 @@ +program SdacDemo; + +{$I Base\DacDemo.inc} + +uses + Forms, + CategoryFrame in 'Base\CategoryFrame.pas' {CategoryFrame}, + DemoBase in 'Base\DemoBase.pas', + DemoForm in 'Base\DemoForm.pas' {DemoForm}, + DemoFrame in 'Base\DemoFrame.pas' {DemoFrame}, + HtmlConsts in 'Base\HtmlConsts.pas', + VTable in 'VirtualTable\VTable.pas', + SdacAbout in 'Base\SdacAbout.pas' {SdacAboutForm}, + CachedUpdates in 'CachedUpdates\CachedUpdates.pas' {CachedUpdates}, + UpdateAction in 'CachedUpdates\UpdateAction.pas' {UpdateAction}, + ConnectDialog in 'ConnectDialog\ConnectDialog.pas' {ConnectDialog}, +{$IFDEF CRDBGRID} + CRDBGrid in 'CRDBGrid\CRDBGrid.pas' {CRDBGrid}, +{$ENDIF} + FetchAll in 'FetchAll\FetchAll.pas' {FetchAll}, + LongStrings in 'LongStrings\LongStrings.pas' {LongStringsFrame}, + MasterDetail in 'MasterDetail\MasterDetail.pas' {MasterDetail}, + Pictures in 'Pictures\Pictures.pas' {Pictures}, + ServerCursors in 'ServerCursors\ServerCursors.pas' {ServerCursors}, + Sql in 'Sql\Sql.pas' {SqlFrame}, + StoredProc in 'StoredProc\StoredProc.pas' {StoredProcFrame}, + StoredProcUpdates in 'StoredProcUpdates\StoredProcUpdates.pas' {StoredProcUpdatesFrame}, + Table in 'Table\Table.pas' {TableFrame}, + Text in 'Text\Text.pas' {TextFrame}, + Threads in 'Threads\Threads.pas' {ThreadsFrame}, + ThreadsData in 'Threads\ThreadsData.pas' {ThreadsData: TDataModule}, + UpdateSQL in 'UpdateSQL\UpdateSQL.pas' {UpdateSQLFrame}, + SdacDemoForm in 'Base\SdacDemoForm.pas' {SdacForm}, + Query in 'Query\Query.pas' {QueryFrame: TFrame}, + FilterAndIndex in 'FilterAndIndex\FilterAndIndex.pas', +{$IFNDEF STD} + Loader in 'Loader\Loader.pas', + Fetch in 'Loader\Fetch.pas' {FetchForm}, + ServiceBroker in 'ServiceBroker\ServiceBroker.pas' {ServiceBrokerFrame: TFrame}, +{$ENDIF} + InheritedConnectForm in 'ConnectDialog\InheritedConnectForm.pas' {fmInheritedConnect}, + MyConnectForm in 'ConnectDialog\MyConnectForm.pas' {fmMyConnect}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TSdacForm, SdacForm); + Application.CreateForm(TSdacAboutForm, SdacAboutForm); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.res b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/SdacDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..3adc0361f3a00f24e1a79ea56f342ee10caf9e11 GIT binary patch literal 876 zcmZuw!D`e{6g`;)j6~`bgm%{QM$1G2a#qggXHZrr3(XD^jD^2Biv0~ z`5QtvE@xN4((Ab|$vA?SIeGWIbMAeQ_vQh>j8N^t^q=@S8TF8!z-!a#!)P=;WilfU zi2%biYyKYEZ-dM zKwZ}&*MGS;WQdNBhq*@DYecWha+n~`@TMrv%R}#|n>L&5m1R-9_dKCKajtk*eq3?q z+&nGLeL-AH=6N|Z5XrYGk2*%a*ZaW*ww+5|n)-UgT;R&h_t*KCTgtnBJ=g+sHvAp+ z+!}7}yY$&&;5?G8)VW<5c-*wpNtz-V4CI-YMgtofPh>FEVh5Ut$OrG^q0>MPw068N zJm^aVuz;i`3FuBayES?}O0{e9=?hk?F~}AtM$GRDtStxv z!%JOmK$nm3c^Tv2mjT!@+^ylBIdNd%-^;M07nfIB>38k!LhU{U`s3weN)L#TxF9;> p8*!tmw@=Y;A8-r^Nba7rBEjN=&V@4{X~fY~haufkqYfIpyE(PjVu literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServerCursors/ServerCursors.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServerCursors/ServerCursors.dfm new file mode 100644 index 0000000..62dc117 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServerCursors/ServerCursors.dfm @@ -0,0 +1,230 @@ +inherited ServerCursorsFrame: TServerCursorsFrame + Width = 441 + Height = 275 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 170 + Width = 441 + Height = 2 + Cursor = crVSplit + Align = alTop + Color = clGreen + ParentColor = False + end + object DBGrid: TDBGrid + Left = 0 + Top = 172 + Width = 441 + Height = 103 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 90 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 570 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open and Last' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btFillTables: TSpeedButton + Left = 398 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Fill Tables' + Flat = True + Transparent = False + OnClick = btFillTablesClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel3: TPanel + Left = 481 + Top = 1 + Width = 88 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object edVal: TEdit + Left = 8 + Top = 2 + Width = 73 + Height = 21 + TabOrder = 0 + Text = '1000' + end + end + end + object Panel2: TPanel + Left = 1 + Top = 24 + Width = 570 + Height = 65 + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object Panel4: TPanel + Left = 1 + Top = 1 + Width = 568 + Height = 63 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 355 + Top = 5 + Width = 91 + Height = 13 + Caption = 'Open = 0; Last = 0;' + end + object Label2: TLabel + Left = 355 + Top = 23 + Width = 91 + Height = 13 + Caption = 'Open = 0; Last = 0;' + end + object Label3: TLabel + Left = 355 + Top = 41 + Width = 91 + Height = 13 + Caption = 'Open = 0; Last = 0;' + end + object rbCientCursor1: TRadioButton + Left = 10 + Top = 5 + Width = 330 + Height = 16 + Caption = 'Client cursor (CursorType = ctDefaultResultSet, FetchAll = True)' + TabOrder = 0 + OnClick = rbCientCursor2Click + end + object rbCientCursor2: TRadioButton + Left = 10 + Top = 23 + Width = 330 + Height = 17 + Caption = + 'Client cursor (CursorType = ctDefaultResultSet, FetchAll = False' + + ')' + TabOrder = 1 + OnClick = rbCientCursor2Click + end + object rbServerCursor: TRadioButton + Left = 10 + Top = 41 + Width = 330 + Height = 17 + Caption = 'Server cursor (CursorType = ctKeySet)' + TabOrder = 2 + OnClick = rbCientCursor2Click + end + end + end + end + object Memo: TMemo + Left = 0 + Top = 90 + Width = 441 + Height = 80 + Align = alTop + ScrollBars = ssVertical + TabOrder = 2 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 278 + Top = 60 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'select TOP 100000 * from loaded1, loaded2') + ReadOnly = True + Left = 246 + Top = 60 + end + object MSSQLFillTables: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'declare' + ' @i INTEGER;' + 'begin' + ' SET @i = 0' + ' WHILE @i <= :Cnt' + ' BEGIN' + ' SET @i = @i + 1' + ' INSERT INTO Loaded1 (' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39',' + ' '#39'23456789012345678901'#39');' + ' INSERT INTO Loaded2 (' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39',' + ' '#39'23456789012345678901'#39');' + ' END;' + 'end;') + CommandTimeout = 0 + Left = 453 + Top = 28 + ParamData = < + item + DataType = ftInteger + Name = 'Cnt' + ParamType = ptInput + Value = 1000 + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServerCursors/ServerCursors.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServerCursors/ServerCursors.pas new file mode 100644 index 0000000..befd86d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServerCursors/ServerCursors.pas @@ -0,0 +1,136 @@ +unit ServerCursors; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, Buttons, MemDS, DBAccess, MSAccess, + OLEDBAccess, SdacVcl, DemoFrame, SdacDemoForm; + +type + TServerCursorsFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + Memo: TMemo; + MSQuery: TMSQuery; + Splitter1: TSplitter; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + btFillTables: TSpeedButton; + Panel3: TPanel; + edVal: TEdit; + Panel2: TPanel; + Panel4: TPanel; + rbCientCursor1: TRadioButton; + rbCientCursor2: TRadioButton; + rbServerCursor: TRadioButton; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + MSSQLFillTables: TMSSQL; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btFillTablesClick(Sender: TObject); + procedure rbCientCursor2Click(Sender: TObject); + private + + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +{$IFDEF CLR} +uses + Variants; +{$ENDIF} + +procedure TServerCursorsFrame.btOpenClick(Sender: TObject); +var + dt: TDateTime; + s: string; +begin + MSQuery.Connection.Open; + MSQuery.SQL.Assign(Memo.Lines); + + dt := Now; + MSQuery.Open; + s := 'Open = ' + TimeToStr(Now - dt) + '; '; + + dt := Now; + MSQuery.Last; + s := s + 'Last = ' + TimeToStr(Now - dt) + ';'; + if rbCientCursor1.Checked then + Label1.Caption := s + else + if rbCientCursor2.Checked then + Label2.Caption := s + else + if rbServerCursor.Checked then + Label3.Caption := s; + SdacForm.StatusBar.Update; +end; + +procedure TServerCursorsFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TServerCursorsFrame.btFillTablesClick(Sender: TObject); +begin + MSSQLFillTables.ParamValues['cnt'] := edVal.Text; + MSSQLFillTables.Execute; +end; + +procedure TServerCursorsFrame.rbCientCursor2Click(Sender: TObject); +begin + inherited; + MSQuery.Close; + if rbCientCursor1.Checked then begin + MSQuery.CursorType := ctDefaultResultSet; + MSQuery.FetchAll := True; + end + else + if rbCientCursor2.Checked then begin + MSQuery.CursorType := ctDefaultResultSet; + MSQuery.FetchAll := False; + end + else + MSQuery.CursorType := ctKeySet; +end; + +// Demo management +procedure TServerCursorsFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + MSSQLFillTables.Connection := Connection as TMSConnection; + Memo.Lines.Text := MSQuery.SQL.Text; + + if MSQuery.CursorType = ctDefaultResultSet then + rbCientCursor1.Checked := True + else + rbServerCursor.Checked := True; +end; + +procedure TServerCursorsFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; + MSSQLFillTables.Debug := Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServiceBroker/ServiceBroker.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServiceBroker/ServiceBroker.dfm new file mode 100644 index 0000000..edd7e50 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServiceBroker/ServiceBroker.dfm @@ -0,0 +1,312 @@ +inherited ServiceBrokerFrame: TServiceBrokerFrame + Width = 889 + Height = 471 + Align = alClient + object Splitter1: TSplitter + Left = 380 + Top = 0 + Height = 471 + Color = clBtnFace + ParentColor = False + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 380 + Height = 471 + Align = alLeft + Anchors = [akTop] + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object Panel3: TPanel + Left = 0 + Top = 0 + Width = 380 + Height = 136 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 3 + Top = 6 + Width = 111 + Height = 13 + Caption = 'Initiator connection' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel5: TPanel + Left = 1 + Top = 23 + Width = 378 + Height = 112 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btInitiatorBeginDialog: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Begin dialog' + Flat = True + Transparent = False + OnClick = btInitiatorBeginDialogClick + end + object btInitiatorEndDialog: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'End dialog' + Flat = True + Transparent = False + OnClick = btInitiatorEndDialogClick + end + object btInitiatorSend: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Send' + Flat = True + Transparent = False + OnClick = btInitiatorSendClick + end + object btInitiatorReceive: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Receive' + Flat = True + Transparent = False + OnClick = btInitiatorReceiveClick + end + object Panel7: TPanel + Left = 1 + Top = 24 + Width = 376 + Height = 87 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 0 + object lbInitiatorMessage: TLabel + Left = 3 + Top = 37 + Width = 43 + Height = 13 + Caption = 'Message' + end + object lbInitiatorWaitTimeout: TLabel + Left = 3 + Top = 66 + Width = 60 + Height = 13 + Caption = 'WaitTimeout' + end + object cbInitiatorAsynchNotification: TCheckBox + Left = 3 + Top = 8 + Width = 166 + Height = 17 + Caption = 'AsynchNotification' + TabOrder = 0 + OnClick = cbInitiatorAsynchNotificationClick + end + object edInitiatorMessage: TEdit + Left = 66 + Top = 33 + Width = 308 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Text = 'Hello target connection!' + end + object edInitiatorWaitTimeout: TEdit + Left = 66 + Top = 63 + Width = 81 + Height = 21 + TabOrder = 2 + OnChange = edInitiatorWaitTimeoutChange + end + end + object Panel10: TPanel + Left = 333 + Top = 1 + Width = 44 + Height = 22 + Anchors = [akLeft, akTop, akRight] + BevelOuter = bvNone + TabOrder = 1 + end + end + end + object meInitiatorLog: TMemo + Left = 0 + Top = 136 + Width = 380 + Height = 335 + Align = alClient + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + end + end + object Panel2: TPanel + Left = 383 + Top = 0 + Width = 506 + Height = 471 + Align = alClient + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object Panel4: TPanel + Left = 0 + Top = 0 + Width = 506 + Height = 136 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Label2: TLabel + Left = 3 + Top = 6 + Width = 105 + Height = 13 + Caption = 'Target connection' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel6: TPanel + Left = 1 + Top = 23 + Width = 333 + Height = 112 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btTargetReceive: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Receive' + Flat = True + Transparent = False + OnClick = btTargetReceiveClick + end + object btTargetSend: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Send' + Flat = True + Transparent = False + OnClick = btTargetSendClick + end + object Panel8: TPanel + Left = 1 + Top = 24 + Width = 331 + Height = 87 + BevelOuter = bvNone + TabOrder = 0 + object lbTargetMessage: TLabel + Left = 3 + Top = 37 + Width = 43 + Height = 13 + Caption = 'Message' + end + object lbTargetWaitTimeout: TLabel + Left = 3 + Top = 66 + Width = 60 + Height = 13 + Caption = 'WaitTimeout' + end + object cbTargetAsynchNotification: TCheckBox + Left = 8 + Top = 7 + Width = 166 + Height = 17 + Caption = 'AsynchNotification' + TabOrder = 0 + OnClick = cbTargetAsynchNotificationClick + end + object edTargetMessage: TEdit + Left = 66 + Top = 33 + Width = 263 + Height = 21 + TabOrder = 1 + Text = 'Hello initiator connection!' + end + object edTargetWaitTimeout: TEdit + Left = 66 + Top = 63 + Width = 81 + Height = 21 + TabOrder = 2 + OnChange = edTargetWaitTimeoutChange + end + end + object Panel9: TPanel + Left = 167 + Top = 1 + Width = 165 + Height = 22 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 1 + end + end + end + object meTargetLog: TMemo + Left = 0 + Top = 136 + Width = 506 + Height = 335 + Align = alClient + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + end + end + object InitiatorServiceBroker: TMSServiceBroker + WaitTimeout = 5000 + OnMessage = InitiatorServiceBrokerMessage + OnBeginConversation = InitiatorServiceBrokerBeginConversation + OnEndConversation = InitiatorServiceBrokerEndConversation + Left = 240 + Top = 128 + end + object MSConnection2: TMSConnection + Database = 'master' + Left = 384 + Top = 232 + end + object TargetServiceBroker: TMSServiceBroker + Connection = MSConnection2 + WaitTimeout = 5000 + OnMessage = TargetServiceBrokerMessage + OnBeginConversation = TargetServiceBrokerBeginConversation + OnEndConversation = TargetServiceBrokerEndConversation + Left = 416 + Top = 232 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServiceBroker/ServiceBroker.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServiceBroker/ServiceBroker.pas new file mode 100644 index 0000000..d682c66 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/ServiceBroker/ServiceBroker.pas @@ -0,0 +1,279 @@ +unit ServiceBroker; + +interface + +uses +{$IFDEF VER6P} + Variants, +{$ENDIF} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, DemoFrame, ExtCtrls, StdCtrls, DB, DBAccess, MSAccess, + MSServiceBroker, Buttons; + +type + TServiceBrokerFrame = class(TDemoFrame) + Panel1: TPanel; + Splitter1: TSplitter; + Panel2: TPanel; + InitiatorServiceBroker: TMSServiceBroker; + MSConnection2: TMSConnection; + TargetServiceBroker: TMSServiceBroker; + Panel3: TPanel; + Panel4: TPanel; + meInitiatorLog: TMemo; + meTargetLog: TMemo; + Label1: TLabel; + Label2: TLabel; + Panel5: TPanel; + Panel6: TPanel; + btInitiatorBeginDialog: TSpeedButton; + btInitiatorEndDialog: TSpeedButton; + btInitiatorSend: TSpeedButton; + btInitiatorReceive: TSpeedButton; + Panel7: TPanel; + cbInitiatorAsynchNotification: TCheckBox; + lbInitiatorMessage: TLabel; + edInitiatorMessage: TEdit; + edInitiatorWaitTimeout: TEdit; + lbInitiatorWaitTimeout: TLabel; + btTargetReceive: TSpeedButton; + btTargetSend: TSpeedButton; + Panel8: TPanel; + cbTargetAsynchNotification: TCheckBox; + lbTargetMessage: TLabel; + edTargetMessage: TEdit; + lbTargetWaitTimeout: TLabel; + edTargetWaitTimeout: TEdit; + Panel9: TPanel; + Panel10: TPanel; + procedure btInitiatorBeginDialogClick(Sender: TObject); + procedure btInitiatorEndDialogClick(Sender: TObject); + procedure btInitiatorSendClick(Sender: TObject); + procedure btInitiatorReceiveClick(Sender: TObject); + procedure cbInitiatorAsynchNotificationClick(Sender: TObject); + procedure edInitiatorWaitTimeoutChange(Sender: TObject); + procedure btTargetSendClick(Sender: TObject); + procedure btTargetReceiveClick(Sender: TObject); + procedure cbTargetAsynchNotificationClick(Sender: TObject); + procedure edTargetWaitTimeoutChange(Sender: TObject); + procedure InitiatorServiceBrokerBeginConversation(Sender: TObject; + Conversation: TMSConversation); + procedure InitiatorServiceBrokerEndConversation(Sender: TObject; + Conversation: TMSConversation; ErrorMessage: String; + ErrorCode: Integer); + procedure InitiatorServiceBrokerMessage(Sender: TObject); + procedure TargetServiceBrokerBeginConversation(Sender: TObject; + Conversation: TMSConversation); + procedure TargetServiceBrokerEndConversation(Sender: TObject; + Conversation: TMSConversation; ErrorMessage: String; + ErrorCode: Integer); + procedure TargetServiceBrokerMessage(Sender: TObject); + private + FMSConversation: TMSConversation; + public + // Demo management + procedure AssignTargetConnection; + procedure Initialize; override; + end; + +var + ServiceBrokerFrame: TServiceBrokerFrame; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +const + InitiatorServiceName = 'InitiatorService'; + TargetServiceName = 'TargetService'; + +{ TServiceBrokerFrame } + +procedure TServiceBrokerFrame.AssignTargetConnection; +begin + if Connection.Connected and MSConnection2.Connected then + Exit; + + if not Connection.Connected then + Connection.Connect; + + MSConnection2.Disconnect; + MSConnection2.Assign(Connection); + MSConnection2.LoginPrompt := False; + MSConnection2.Connect; + + InitiatorServiceBroker.CreateServerObjects; + + TargetServiceBroker.CreateServerObjects; +end; + +procedure TServiceBrokerFrame.Initialize; +begin + inherited; + + InitiatorServiceBroker.Connection := Connection as TMSConnection; + + InitiatorServiceBroker.Service := InitiatorServiceName; + TargetServiceBroker.Service := TargetServiceName; + + cbInitiatorAsynchNotification.Checked := InitiatorServiceBroker.AsyncNotification; + cbTargetAsynchNotification.Checked := TargetServiceBroker.AsyncNotification; + + edInitiatorWaitTimeout.Text := IntToStr(InitiatorServiceBroker.WaitTimeout); + edTargetWaitTimeout.Text := IntToStr(TargetServiceBroker.WaitTimeout); + + btInitiatorEndDialog.Enabled := False; +end; + +procedure TServiceBrokerFrame.btInitiatorBeginDialogClick(Sender: TObject); +begin + AssignTargetConnection; + + FMSConversation := InitiatorServiceBroker.BeginDialog(TargetServiceName, '', False); + + // Demo managment + btInitiatorEndDialog.Enabled := True; + btInitiatorBeginDialog.Enabled := False; +end; + +procedure TServiceBrokerFrame.btInitiatorEndDialogClick(Sender: TObject); +begin + FMSConversation.EndConversation; + FMSConversation := nil; + + // Demo managment + btInitiatorEndDialog.Enabled := False; + btInitiatorBeginDialog.Enabled := True; +end; + +procedure TServiceBrokerFrame.btInitiatorSendClick(Sender: TObject); +var + TransmitionStatus: string; +begin + AssignTargetConnection; + if FMSConversation <> nil then begin + FMSConversation.Send(edInitiatorMessage.Text); + TransmitionStatus := FMSConversation.GetTransmissionStatus; + if TransmitionStatus <> '' then + meInitiatorLog.Lines.Add(TransmitionStatus) + else + meInitiatorLog.Lines.Add('Message was send successfully'); + end + else + raise Exception.Create('No active dialog'); +end; + +procedure TServiceBrokerFrame.btInitiatorReceiveClick(Sender: TObject); +begin + AssignTargetConnection; + if InitiatorServiceBroker.Receive then + meInitiatorLog.Lines.Add(InitiatorServiceBroker.CurrentMessage.AsString); +end; + +procedure TServiceBrokerFrame.cbInitiatorAsynchNotificationClick(Sender: TObject); +begin + AssignTargetConnection; + InitiatorServiceBroker.AsyncNotification := cbInitiatorAsynchNotification.Checked; +end; + +procedure TServiceBrokerFrame.edInitiatorWaitTimeoutChange(Sender: TObject); +var + WaitTimeout: integer; +begin + try + WaitTimeout := StrToInt(edInitiatorWaitTimeout.Text); + except + Exit; + end; + InitiatorServiceBroker.WaitTimeout := WaitTimeout; +end; + +procedure TServiceBrokerFrame.InitiatorServiceBrokerBeginConversation( + Sender: TObject; Conversation: TMSConversation); +begin + meInitiatorLog.Lines.Add('Conversation started'); +end; + +procedure TServiceBrokerFrame.InitiatorServiceBrokerEndConversation( + Sender: TObject; Conversation: TMSConversation; ErrorMessage: String; + ErrorCode: Integer); +begin + meInitiatorLog.Lines.Add('Conversation finished'); +end; + +procedure TServiceBrokerFrame.InitiatorServiceBrokerMessage(Sender: TObject); +begin + if InitiatorServiceBroker.Receive then + meInitiatorLog.Lines.Add(InitiatorServiceBroker.CurrentMessage.AsString); +end; + +procedure TServiceBrokerFrame.btTargetSendClick(Sender: TObject); +var + TransmitionStatus: string; + Conversation: TMSConversation; +begin + AssignTargetConnection; + if TargetServiceBroker.ConversationCount > 0 then begin + Conversation := TargetServiceBroker.Conversations[0]; + Conversation.Send(edTargetMessage.Text); + TransmitionStatus := Conversation.GetTransmissionStatus; + if TransmitionStatus <> '' then + meTargetLog.Lines.Add(TransmitionStatus) + else + meTargetLog.Lines.Add('Message was send successfully'); + end + else + raise Exception.Create('No active dialog'); +end; + +procedure TServiceBrokerFrame.btTargetReceiveClick(Sender: TObject); +begin + AssignTargetConnection; + if TargetServiceBroker.Receive then + meTargetLog.Lines.Add(TargetServiceBroker.CurrentMessage.AsString); +end; + +procedure TServiceBrokerFrame.cbTargetAsynchNotificationClick(Sender: TObject); +begin + AssignTargetConnection; + TargetServiceBroker.AsyncNotification := cbTargetAsynchNotification.Checked; +end; + +procedure TServiceBrokerFrame.edTargetWaitTimeoutChange(Sender: TObject); +var + WaitTimeout: integer; +begin + try + WaitTimeout := StrToInt(edTargetWaitTimeout.Text); + except + Exit; + end; + TargetServiceBroker.WaitTimeout := WaitTimeout; +end; + +procedure TServiceBrokerFrame.TargetServiceBrokerBeginConversation( + Sender: TObject; Conversation: TMSConversation); +begin + meTargetLog.Lines.Add('Conversation started'); +end; + +procedure TServiceBrokerFrame.TargetServiceBrokerEndConversation( + Sender: TObject; Conversation: TMSConversation; ErrorMessage: String; + ErrorCode: Integer); +begin + meTargetLog.Lines.Add('Conversation finished'); +end; + +procedure TServiceBrokerFrame.TargetServiceBrokerMessage(Sender: TObject); +begin + if TargetServiceBroker.Receive then + if TargetServiceBroker.CurrentMessage.MessageType <> SEndDialogType then + meTargetLog.Lines.Add(TargetServiceBroker.CurrentMessage.AsString); +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Sql/Sql.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Sql/Sql.dfm new file mode 100644 index 0000000..7a22794 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Sql/Sql.dfm @@ -0,0 +1,139 @@ +inherited SqlFrame: TSqlFrame + Width = 443 + Height = 277 + Align = alClient + object Label1: TLabel + Left = 456 + Top = 48 + Width = 32 + Height = 13 + Caption = 'Label1' + end + object Splitter1: TSplitter + Left = 0 + Top = 188 + Width = 488 + Height = 3 + Cursor = crVSplit + Align = alTop + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 488 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object TPanel + Left = 1 + Top = 1 + Width = 350 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btExecute: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Execute' + Flat = True + Transparent = False + OnClick = btExecuteClick + end + object btBreakExec: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Break' + Enabled = False + Flat = True + Transparent = False + OnClick = btBreakExecClick + end + object btExecInThread: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Hint = + 'Assing a long-drawn command to memo (e.g. `SELECT SLEEP(10);`) a' + + 'nd push this button.' + Caption = 'Exec in thread' + Flat = True + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = btExecInThreadClick + end + object Panel1: TPanel + Left = 250 + Top = 1 + Width = 99 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbNonBlocking: TCheckBox + Left = 7 + Top = 3 + Width = 86 + Height = 17 + Caption = 'NonBlocking' + TabOrder = 0 + OnClick = cbNonBlockingClick + end + end + end + end + object meSQL: TMemo + Left = 0 + Top = 26 + Width = 488 + Height = 162 + Align = alTop + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnExit = meSQLExit + end + object meResult: TMemo + Left = 0 + Top = 191 + Width = 488 + Height = 70 + TabStop = False + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Courier New' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 2 + end + object MSSQL: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SET :Cnt = (SELECT COUNT(*) FROM Emp)') + AfterExecute = MSSQLAfterExecute + CommandTimeout = 0 + Left = 224 + Top = 40 + ParamData = < + item + DataType = ftInteger + Name = 'Cnt' + ParamType = ptInputOutput + Value = 830 + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Sql/Sql.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Sql/Sql.pas new file mode 100644 index 0000000..0727b29 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Sql/Sql.pas @@ -0,0 +1,216 @@ +unit Sql; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MSAccess, DBAccess, SdacVcl, Buttons, + DemoFrame, SdacDemoForm, OLEDBAccess, ActiveX; + +type + TSqlFrame = class(TDemoFrame) + ToolBar: TPanel; + meSQL: TMemo; + MSSQL: TMSSQL; + Label1: TLabel; + Splitter1: TSplitter; + meResult: TMemo; + btExecute: TSpeedButton; + btBreakExec: TSpeedButton; + Panel1: TPanel; + cbNonBlocking: TCheckBox; + btExecInThread: TSpeedButton; + procedure btExecuteClick(Sender: TObject); + procedure meSQLExit(Sender: TObject); + procedure MSSQLAfterExecute(Sender: TObject; Result: Boolean); + procedure cbNonBlockingClick(Sender: TObject); + procedure btBreakExecClick(Sender: TObject); + procedure btExecInThreadClick(Sender: TObject); + private + { Private declarations } + OldProvider: TOLEDBProvider; + DoNotRemind: boolean; + FExecThread: TThread; + procedure AssignProperties; + procedure TerminateThread; + public + destructor Destroy; override; + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + + { TExecThread } + + TExecThread = class(TThread) + protected + procedure Execute; override; + procedure Terminate; + end; + +var + SqlFrame: TSqlFrame; + +implementation + +uses ComObj; + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure LogError(EMessage: string); +begin + SqlFrame.meResult.Lines.Add('An error with the following message has beein raised during query execution:' + #13#10 + EMessage); +end; + +{ TExecThread } + +procedure TExecThread.Execute; +begin + CoInitialize(nil); + if SqlFrame.MSSQL <> nil then + try + SqlFrame.btBreakExec.Enabled := True; + SqlFrame.MSSQL.Execute; + except + on e: Exception do begin + LogError(e.Message); + end; + end; + Terminate; +end; + +procedure TExecThread.Terminate; +begin + inherited; + SqlFrame.btBreakExec.Enabled := False; + CoUninitialize; +end; + +{ TSqlFrame } + +procedure TSqlFrame.AssignProperties; +begin + if Trim(MSSQL.SQL.Text) <> Trim(meSQL.Lines.Text) then + MSSQL.SQL.Assign(meSQL.Lines); + MSSQL.NonBlocking := cbNonBlocking.Checked; + if MSSQL.NonBlocking then + btBreakExec.Enabled := False; +end; + +procedure TSqlFrame.TerminateThread; +begin + if FExecThread <> nil then begin + FExecThread.Terminate; + MSSQL.BreakExec; + FExecThread.WaitFor; + FExecThread.Free; + FExecThread := nil; + end; +end; + +procedure TSqlFrame.btExecuteClick(Sender: TObject); +begin + AssignProperties; + meResult.Lines.Clear; + SdacForm.StatusBar.Panels[2].Text := 'Executing...'; + if MSSQL.NonBlocking then + btBreakExec.Enabled := True; + MSSQL.Execute; +end; + +procedure TSqlFrame.meSQLExit(Sender: TObject); +begin + AssignProperties; +end; + +procedure TSqlFrame.MSSQLAfterExecute(Sender: TObject; Result: Boolean); +var + s: string; + i: integer; +begin + btBreakExec.Enabled := False; + if btBreakExec.Enabled then + btBreakExec.Enabled := False; + if Result then + s := 'Success' + ' (' + IntToStr(MSSQL.RowsAffected) + ' rows processed)' + else + s := 'Execution failed'; + SdacForm.StatusBar.Panels[2].Text := s; + + for i := 0 to MSSQL.Params.Count-1 do + meResult.Lines.Add(MSSQL.Params[i].Name + ' = ' + MSSQL.Params[i].AsString); + + meResult.Lines.Add(s); +end; + +procedure TSqlFrame.cbNonBlockingClick(Sender: TObject); +var + oldConnect: boolean; +begin + oldConnect := MSSQL.Connection.Connected; + try + if cbNonBlocking.Checked then begin + if not DoNotRemind then begin + MessageDlg('Note, NonBlocking mode is available only with SQL Native Client installed', mtInformation, [mbOK], 0); + DoNotRemind := True; + end; + MSSQL.Connection.Disconnect; + OldProvider := MSSQL.Connection.Options.Provider; + MSSQL.Connection.Options.Provider := prNativeClient; + end + else + MSSQL.Connection.Options.Provider := OldProvider; + MSSQL.NonBlocking := cbNonBlocking.Checked; + finally + cbNonBlocking.Checked := MSSQL.NonBlocking; + end; + MSSQL.Connection.Connected := oldConnect; +end; + +procedure TSqlFrame.btBreakExecClick(Sender: TObject); +begin + MSSQL.BreakExec; +end; + +destructor TSqlFrame.Destroy; +begin + TerminateThread; + if (self <> nil) and MSSQL.Executing then + MSSQL.BreakExec; + + inherited; +end; + +procedure TSqlFrame.btExecInThreadClick(Sender: TObject); +begin + MSSQL.SQL := meSQL.Lines; + SDACForm.StatusBar.Panels[2].Text := 'Executing...'; + meResult.Lines.Clear; + TerminateThread; + FExecThread := TExecThread.Create(False) +end; + +// Demo management +procedure TSqlFrame.Initialize; +begin + inherited; + + FExecThread := nil; + SqlFrame := Self; + DoNotRemind := False; + MSSQL.Connection := Connection as TMSConnection; + meSQL.Lines := MSSQL.SQL; +end; + +procedure TSqlFrame.SetDebug(Value: boolean); +begin + MSSQL.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProc/StoredProc.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProc/StoredProc.dfm new file mode 100644 index 0000000..2b47bd1 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProc/StoredProc.dfm @@ -0,0 +1,157 @@ +inherited StoredProcFrame: TStoredProcFrame + Width = 441 + Height = 275 + Align = alClient + object DBGrid: TDBGrid + Left = 0 + Top = 49 + Width = 441 + Height = 226 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 49 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 499 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btPrepare: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Prepare' + Flat = True + Transparent = False + OnClick = btPrepareClick + end + object btUnPrepare: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'UnPrepare' + Flat = True + Transparent = False + OnClick = btUnPrepareClick + end + object btExecute: TSpeedButton + Left = 333 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Execute' + Flat = True + Transparent = False + OnClick = btExecuteClick + end + object btPrepareSQL: TSpeedButton + Left = 416 + Top = 1 + Width = 82 + Height = 22 + Caption = 'PrepareSQL' + Flat = True + Transparent = False + OnClick = btPrepareSQLClick + end + end + object Panel2: TPanel + Left = 1 + Top = 24 + Width = 499 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object DBNavigator: TDBNavigator + Left = 278 + Top = 1 + Width = 220 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel3: TPanel + Left = 1 + Top = 1 + Width = 276 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object Label1: TLabel + Left = 4 + Top = 6 + Width = 82 + Height = 13 + Caption = 'StoredProc name' + end + object edStoredProcName: TComboBox + Left = 95 + Top = 1 + Width = 173 + Height = 21 + ItemHeight = 13 + TabOrder = 0 + OnDropDown = edStoredProcNameDropDown + OnExit = edStoredProcNameExit + end + end + end + end + object DataSource: TDataSource + DataSet = MSStoredProc + Left = 432 + Top = 72 + end + object MSStoredProc: TMSStoredProc + StoredProcName = 'Ten Most High-Paid Employees;1' + SQLRefresh.Strings = ( + 'WHERE' + ' DEPTNO = :DEPTNO') + Connection = SDACForm.MSConnection + SQL.Strings = ( + '{CALL "Ten Most High-Paid Employees";1}') + Debug = True + Left = 400 + Top = 72 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProc/StoredProc.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProc/StoredProc.pas new file mode 100644 index 0000000..6c9b973 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProc/StoredProc.pas @@ -0,0 +1,170 @@ +unit StoredProc; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MemDS, DBAccess, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm, DAScript, MSScript; + +type + TStoredProcFrame = class(TDemoFrame) + DataSource: TDataSource; + MSStoredProc: TMSStoredProc; + DBGrid: TDBGrid; + ToolBar: TPanel; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btPrepare: TSpeedButton; + btUnPrepare: TSpeedButton; + btExecute: TSpeedButton; + btPrepareSQL: TSpeedButton; + Panel2: TPanel; + DBNavigator: TDBNavigator; + Panel3: TPanel; + Label1: TLabel; + edStoredProcName: TComboBox; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btPrepareClick(Sender: TObject); + procedure btUnPrepareClick(Sender: TObject); + procedure btExecuteClick(Sender: TObject); + procedure btPrepareSQLClick(Sender: TObject); + procedure edStoredProcNameExit(Sender: TObject); + procedure edStoredProcNameDropDown(Sender: TObject); + private + { Private declarations } + procedure ShowState; + procedure AssignProperties; + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TStoredProcFrame.AssignProperties; +begin + if Trim(MSStoredProc.StoredProcName) <> Trim(edStoredProcName.Text) then + MSStoredProc.StoredProcName := edStoredProcName.Text; + ShowState; +end; + +procedure TStoredProcFrame.ShowState; +var + St: string; + + procedure AddSt(S:string); + begin + if St <> '' then + St := St + ', '; + St := St + S; + end; + +begin + St := ''; + + if MSStoredProc.Prepared then begin + AddSt('Prepared'); + + if MSStoredProc.IsQuery then + AddSt('IsQuery'); + + end; + + if MSStoredProc.Active then + AddSt('Active') + else + AddSt('Inactive'); + + SdacForm.StatusBar.Panels[2].Text := St; +end; + +procedure TStoredProcFrame.btOpenClick(Sender: TObject); +begin + try + AssignProperties; + MSStoredProc.Open; + finally + ShowState; + end; +end; + +procedure TStoredProcFrame.btCloseClick(Sender: TObject); +begin + MSStoredProc.Close; + ShowState; +end; + +procedure TStoredProcFrame.btPrepareClick(Sender: TObject); +begin + try + AssignProperties; + MSStoredProc.Prepare; + finally + ShowState; + end; +end; + +procedure TStoredProcFrame.btUnPrepareClick(Sender: TObject); +begin + MSStoredProc.UnPrepare; + ShowState; +end; + +procedure TStoredProcFrame.btExecuteClick(Sender: TObject); +begin + try + AssignProperties; + MSStoredProc.Execute; + finally + ShowState; + end; +end; + +procedure TStoredProcFrame.btPrepareSQLClick(Sender: TObject); +begin + try + AssignProperties; + MSStoredProc.PrepareSQL; + finally + ShowState; + end; +end; + +procedure TStoredProcFrame.edStoredProcNameExit(Sender: TObject); +begin + AssignProperties; +end; + +procedure TStoredProcFrame.edStoredProcNameDropDown(Sender: TObject); +begin + MSStoredProc.Connection.GetStoredProcNames(edStoredProcName.Items); +end; + +// Demo management +procedure TStoredProcFrame.Initialize; +begin + inherited; + MSStoredProc.Connection := Connection as TMSConnection; + edStoredProcName.Text := MSStoredProc.StoredProcName; + ShowState; +end; + +procedure TStoredProcFrame.SetDebug(Value: boolean); +begin + MSStoredProc.Debug := Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProcUpdates/StoredProcUpdates.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProcUpdates/StoredProcUpdates.dfm new file mode 100644 index 0000000..050ebbd --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProcUpdates/StoredProcUpdates.dfm @@ -0,0 +1,101 @@ +inherited StoredProcUpdatesFrame: TStoredProcUpdatesFrame + Width = 441 + Height = 275 + Align = alClient + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 1 + Top = 1 + Width = 408 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btOpenClick + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 1 + Width = 240 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + end + end + object DBGrid1: TDBGrid + Left = 0 + Top = 26 + Width = 441 + Height = 249 + Align = alClient + DataSource = DataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object MSQuery: TMSQuery + SQLInsert.Strings = ( + '{:EmpNO = CALL SDAC_InsertEmp;1(:ENAME, :JOB)}') + SQLDelete.Strings = ( + '{CALL SDAC_DeleteEmp;1(:EmpNO, :Result)}') + SQLUpdate.Strings = ( + + '{:RETURN_VALUE = CALL SDAC_UpdateEmp;1(:EMPNO, :ENAME, :JOB, :EM' + + 'PINFO)}') + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT EMPNO, ENAME, JOB FROM EMP') + Debug = True + BeforeUpdateExecute = MSQueryBeforeUpdateExecute + AfterUpdateExecute = MSQueryAfterUpdateExecute + Left = 48 + Top = 208 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 80 + Top = 208 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProcUpdates/StoredProcUpdates.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProcUpdates/StoredProcUpdates.pas new file mode 100644 index 0000000..04781f7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/StoredProcUpdates/StoredProcUpdates.pas @@ -0,0 +1,133 @@ +{ +Insert - example of using SP with return Identity value as result of executing +Update - example of using SP with return arbitrary value as result of executing +Delete - example of using SP with return arbitrary value as parameter +} + +unit StoredProcUpdates; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Db, MemDS, DBAccess, Grids, DBGrids, StdCtrls, + ActnList, ExtCtrls, DBCtrls, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm; + +type + TStoredProcUpdatesFrame = class(TDemoFrame) + MSQuery: TMSQuery; + DataSource: TDataSource; + Panel1: TPanel; + DBGrid1: TDBGrid; + Panel2: TPanel; + DBNavigator1: TDBNavigator; + btClose: TSpeedButton; + btOpen: TSpeedButton; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure MSQueryBeforeUpdateExecute(Sender: TCustomMSDataSet; + StatementTypes: TStatementTypes; Params: TMSParams); + procedure MSQueryAfterUpdateExecute(Sender: TCustomMSDataSet; + StatementTypes: TStatementTypes; Params: TMSParams); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +{$IFDEF CLR} +uses + Variants; +{$ENDIF} + +procedure TStoredProcUpdatesFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TStoredProcUpdatesFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TStoredProcUpdatesFrame.MSQueryBeforeUpdateExecute(Sender: TCustomMSDataSet; + StatementTypes: TStatementTypes; Params: TMSParams); +begin + if stInsert in StatementTypes then begin + Params.ParamByName('EMPNO').ParamType := ptResult; + // Params.ParamByName('RETURN_VALUE').DataType was setted equal to Sender.FieldByName('EMPNO').FieldType + end; + + if stUpdate in StatementTypes then begin + Params.ParamByName('RETURN_VALUE').ParamType := ptResult; + Params.ParamByName('RETURN_VALUE').DataType := ftInteger; // Field 'RETURN_VALUE' does not present in Sender, so we need to set DataType manually + + Params.ParamByName('EMPINFO').ParamType := ptOutput; + Params.ParamByName('EMPINFO').DataType := ftWideString; // Field 'EMPINFO' does not present in Sender, so we need to set DataType manually + end; + + if stDelete in StatementTypes then begin + Params.ParamByName('Result').ParamType := ptOutput; + Params.ParamByName('Result').DataType := ftInteger; // Field 'Result' does not present in Sender, so we need to set DataType manually + end; +end; + +procedure TStoredProcUpdatesFrame.MSQueryAfterUpdateExecute(Sender: TCustomMSDataSet; + StatementTypes: TStatementTypes; Params: TMSParams); +var + EMPNO, ReturnedEMPNO: integer; +begin + if stInsert in StatementTypes then begin + EMPNO := Integer(Params.ParamByName('EMPNO').Value); + Sender.FieldByName('EMPNO').ReadOnly := False; + try + Sender.FieldByName('EMPNO').NewValue := EMPNO; + finally + Sender.FieldByName('EMPNO').ReadOnly := True; + end; + end; + + if stUpdate in StatementTypes then begin + EMPNO := Sender.FieldByName('EMPNO').AsInteger; + ReturnedEMPNO := Integer(Params.ParamByName('RETURN_VALUE').Value); + + if EMPNO <> ReturnedEMPNO then + raise Exception.Create('Error on Update occured!'); + + Caption := String(Params.ParamByName('EMPINFO').Value); + end; + + if stDelete in StatementTypes then begin + EMPNO := Params.ParamByName('EMPNO').AsInteger; + ReturnedEMPNO := Integer(Params.ParamByName('Result').Value); + + if EMPNO + 2 {see StoredProc SDAC_DeleteEmployees} <> ReturnedEMPNO then + raise Exception.Create('Error on Delete occured!'); + end; +end; + +// Demo management +procedure TStoredProcUpdatesFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; +end; + +procedure TStoredProcUpdatesFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Table/Table.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Table/Table.dfm new file mode 100644 index 0000000..3375e6f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Table/Table.dfm @@ -0,0 +1,180 @@ +inherited TableFrame: TTableFrame + Width = 441 + Height = 275 + Align = alClient + object DBGrid: TDBGrid + Left = 0 + Top = 76 + Width = 441 + Height = 199 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 76 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel3: TPanel + Left = 1 + Top = 0 + Width = 657 + Height = 75 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btPrepare: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Prepare' + Flat = True + Transparent = False + OnClick = btPrepareClick + end + object btUnPrepare: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'UnPrepare' + Flat = True + Transparent = False + OnClick = btUnPrepareClick + end + object btExecute: TSpeedButton + Left = 333 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Execute' + Flat = True + Transparent = False + OnClick = btExecuteClick + end + object DBNavigator: TDBNavigator + Left = 416 + Top = 1 + Width = 240 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel7: TPanel + Left = 416 + Top = 24 + Width = 240 + Height = 50 + BevelOuter = bvNone + TabOrder = 1 + object Label3: TLabel + Left = 6 + Top = 4 + Width = 53 + Height = 13 + Caption = 'OrderFields' + end + object edOrderFields: TEdit + Left = 6 + Top = 20 + Width = 219 + Height = 21 + TabOrder = 0 + OnExit = edTableNameExit + end + end + object Panel5: TPanel + Left = 1 + Top = 24 + Width = 165 + Height = 50 + BevelOuter = bvNone + TabOrder = 2 + object Label1: TLabel + Left = 6 + Top = 4 + Width = 56 + Height = 13 + Caption = 'Table name' + end + object edTableName: TComboBox + Left = 6 + Top = 20 + Width = 140 + Height = 21 + ItemHeight = 13 + TabOrder = 0 + OnDropDown = edTableNameDropDown + OnExit = edTableNameExit + end + end + object Panel8: TPanel + Left = 167 + Top = 24 + Width = 248 + Height = 50 + BevelOuter = bvNone + TabOrder = 3 + object Label4: TLabel + Left = 6 + Top = 4 + Width = 43 + Height = 13 + Caption = 'FilterSQL' + end + object edFilterSQL: TEdit + Left = 6 + Top = 20 + Width = 226 + Height = 21 + TabOrder = 0 + OnExit = edTableNameExit + end + end + end + end + object DataSource: TDataSource + DataSet = MSTable + Left = 128 + Top = 32 + end + object MSTable: TMSTable + TableName = 'Emp' + OrderFields = 'EName' + Connection = SDACForm.MSConnection + Debug = True + Left = 96 + Top = 32 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Table/Table.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Table/Table.pas new file mode 100644 index 0000000..0911d54 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Table/Table.pas @@ -0,0 +1,176 @@ +unit Table; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MemDS, DBAccess, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm; + +type + TTableFrame = class(TDemoFrame) + DataSource: TDataSource; + MSTable: TMSTable; + DBGrid: TDBGrid; + ToolBar: TPanel; + Panel3: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btPrepare: TSpeedButton; + btUnPrepare: TSpeedButton; + btExecute: TSpeedButton; + DBNavigator: TDBNavigator; + Panel7: TPanel; + Label3: TLabel; + edOrderFields: TEdit; + Panel5: TPanel; + Label1: TLabel; + edTableName: TComboBox; + Panel8: TPanel; + Label4: TLabel; + edFilterSQL: TEdit; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btPrepareClick(Sender: TObject); + procedure btUnPrepareClick(Sender: TObject); + procedure btExecuteClick(Sender: TObject); + procedure edTableNameExit(Sender: TObject); + procedure edTableNameDropDown(Sender: TObject); + private + { Private declarations } + procedure ShowState; + procedure AssignProperties; + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TTableFrame.AssignProperties; +begin + try + if Trim(MSTable.TableName) <> Trim(edTableName.Text) then + MSTable.TableName := edTableName.Text; + + MSTable.FilterSQL := edFilterSQL.Text; + + try + MSTable.OrderFields:= edOrderFields.Text; + except + edOrderFields.SetFocus; + raise; + end; + finally + ShowState; + end; + +end; + +procedure TTableFrame.ShowState; +var + St: string; + + procedure AddSt(S: string); + begin + if St <> '' then + St:= St + ', '; + St:= St + S; + end; + +begin + St:= ''; + + if MSTable.Prepared then begin + AddSt('Prepared'); + + if MSTable.IsQuery then + AddSt('IsQuery'); + end; + + if MSTable.Active then + AddSt('Active') + else + AddSt('Inactive'); + + SdacForm.StatusBar.Panels[2].Text:= St; +end; + +procedure TTableFrame.btOpenClick(Sender: TObject); +begin + try + AssignProperties; + MSTable.Open; + finally + ShowState; + end; +end; + +procedure TTableFrame.btCloseClick(Sender: TObject); +begin + MSTable.Close; + ShowState; +end; + +procedure TTableFrame.btPrepareClick(Sender: TObject); +begin + try + AssignProperties; + MSTable.Prepare; + finally + ShowState; + end; +end; + +procedure TTableFrame.btUnPrepareClick(Sender: TObject); +begin + MSTable.UnPrepare; + ShowState; +end; + +procedure TTableFrame.btExecuteClick(Sender: TObject); +begin + try + AssignProperties; + MSTable.Execute; + finally + ShowState; + end; +end; + +procedure TTableFrame.edTableNameExit(Sender: TObject); +begin + AssignProperties; +end; + +procedure TTableFrame.edTableNameDropDown(Sender: TObject); +begin + MSTable.Connection.GetTableNames(edTableName.Items); +end; + +// Demo management +procedure TTableFrame.Initialize; +begin + inherited; + MSTable.Connection := Connection as TMSConnection; + edTableName.Text:= MSTable.TableName; + edOrderFields.Text:= MSTable.OrderFields; + ShowState; +end; + +procedure TTableFrame.SetDebug(Value: boolean); +begin + MSTable.Debug:= Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Text/Text.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Text/Text.dfm new file mode 100644 index 0000000..4540520 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Text/Text.dfm @@ -0,0 +1,162 @@ +inherited TextFrame: TTextFrame + Width = 441 + Height = 275 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 208 + Width = 441 + Height = 2 + Cursor = crVSplit + Align = alTop + end + object DBGrid: TDBGrid + Left = 0 + Top = 26 + Width = 441 + Height = 182 + Align = alTop + DataSource = DataSource + Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete] + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object ToolButton1: TToolButton + Left = 362 + Top = 2 + Width = 16 + Caption = 'ToolButton1' + Style = tbsSeparator + end + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 398 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + end + end + object meText: TDBMemo + Left = 0 + Top = 236 + Width = 441 + Height = 39 + Align = alClient + DataField = 'TextField' + DataSource = DataSource + ScrollBars = ssBoth + TabOrder = 2 + end + object ToolBar1: TPanel + Left = 0 + Top = 210 + Width = 441 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + object Panel2: TPanel + Left = 1 + Top = 1 + Width = 250 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClear: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Clear' + Flat = True + Transparent = False + OnClick = btClearClick + end + object btSave: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Save to file' + Flat = True + Transparent = False + OnClick = btSaveClick + end + object btLoad: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Load from file' + Flat = True + Transparent = False + OnClick = btLoadClick + end + end + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 440 + Top = 32 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM SDAC_Text') + Debug = True + Left = 408 + Top = 32 + end + object OpenDialog: TOpenDialog + Left = 240 + Top = 259 + end + object SaveDialog: TSaveDialog + Left = 272 + Top = 259 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Text/Text.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Text/Text.pas new file mode 100644 index 0000000..294ccb0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Text/Text.pas @@ -0,0 +1,100 @@ +unit Text; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MemDS, DBAccess, MSAccess, SdacVcl, + Buttons, DemoFrame, DAScript, MSScript; + +type + TTextFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + meText: TDBMemo; + MSQuery: TMSQuery; + Splitter1: TSplitter; + ToolBar1: TPanel; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + ToolButton1: TToolButton; + Panel1: TPanel; + DBNavigator: TDBNavigator; + btClose: TSpeedButton; + btOpen: TSpeedButton; + Panel2: TPanel; + btClear: TSpeedButton; + btSave: TSpeedButton; + btLoad: TSpeedButton; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btSaveClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TTextFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TTextFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TTextFrame.btLoadClick(Sender: TObject); +begin + if MSQuery.Active and OpenDialog.Execute then begin + if MSQuery.State = dsBrowse then + MSQuery.Edit; + + TBlobField(MSQuery.FieldByName('TextField')).LoadFromFile(OpenDialog.FileName); + end; +end; + +procedure TTextFrame.btSaveClick(Sender: TObject); +begin + if not MSQuery.EOF and SaveDialog.Execute then + TBlobField(MSQuery.FieldByName('TextField')).SaveToFile(SaveDialog.FileName); +end; + +procedure TTextFrame.btClearClick(Sender: TObject); +begin + if MSQuery.Active then begin + if MSQuery.State = dsBrowse then + MSQuery.Edit; + MSQuery.FieldByName('TextField').Clear; + end; +end; + +// Demo management +procedure TTextFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; +end; + +procedure TTextFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/Threads.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/Threads.dfm new file mode 100644 index 0000000..547862f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/Threads.dfm @@ -0,0 +1,391 @@ +inherited ThreadsFrame: TThreadsFrame + Width = 441 + Height = 275 + Align = alClient + object Panel3: TPanel + Left = 0 + Top = 80 + Width = 441 + Height = 143 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Splitter2: TSplitter + Left = 261 + Top = 0 + Height = 143 + end + object Panel4: TPanel + Left = 0 + Top = 0 + Width = 261 + Height = 143 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object meSQL: TMemo + Left = 0 + Top = 0 + Width = 261 + Height = 73 + Align = alTop + Font.Charset = RUSSIAN_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + object meLog: TMemo + Left = 0 + Top = 73 + Width = 261 + Height = 70 + Align = alClient + Font.Charset = RUSSIAN_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ScrollBars = ssVertical + TabOrder = 1 + end + end + object DBGrid1: TDBGrid + Left = 264 + Top = 0 + Width = 177 + Height = 143 + Align = alClient + DataSource = MSDataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + end + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 80 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel5: TPanel + Left = 0 + Top = 23 + Width = 418 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btStart: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Start' + Flat = True + Transparent = False + OnClick = btStartClick + end + object btStop: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Stop' + Flat = True + Transparent = False + OnClick = btStopClick + end + object btRun: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Run' + Flat = True + Transparent = False + OnClick = btRunClick + end + object btRunMax: TSpeedButton + Left = 250 + Top = 1 + Width = 83 + Height = 22 + Caption = 'RunMax' + Flat = True + Transparent = False + OnClick = btRunMaxClick + end + object btClearLog: TSpeedButton + Left = 334 + Top = 1 + Width = 83 + Height = 22 + Caption = 'ClearLog' + Flat = True + Transparent = False + OnClick = btClearLogClick + end + end + object Panel6: TPanel + Left = 0 + Top = 0 + Width = 418 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btDeleteAll: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Delete All' + Flat = True + Transparent = False + OnClick = btDeleteAllClick + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 1 + Width = 250 + Height = 22 + Flat = True + TabOrder = 0 + end + end + object Panel11: TPanel + Left = 417 + Top = 0 + Width = 244 + Height = 47 + BevelOuter = bvNone + Color = clGreen + TabOrder = 2 + object Panel10: TPanel + Left = 1 + Top = 1 + Width = 120 + Height = 45 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 5 + Top = 23 + Width = 92 + Height = 16 + Caption = 'Thread count' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label2: TLabel + Left = 5 + Top = 2 + Width = 89 + Height = 16 + Caption = 'Except count' + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lbThreadCount: TLabel + Left = 104 + Top = 23 + Width = 9 + Height = 16 + Caption = '0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lbExceptCount: TLabel + Left = 104 + Top = 2 + Width = 9 + Height = 16 + Caption = '0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + end + object Panel12: TPanel + Left = 122 + Top = 1 + Width = 121 + Height = 45 + BevelOuter = bvNone + TabOrder = 1 + object lbInterval: TLabel + Left = 57 + Top = 23 + Width = 6 + Height = 13 + Caption = '0' + end + object lbTime: TLabel + Left = 57 + Top = 2 + Width = 6 + Height = 13 + Caption = '0' + end + object Label5: TLabel + Left = 6 + Top = 2 + Width = 23 + Height = 13 + Caption = 'Time' + end + object Label6: TLabel + Left = 6 + Top = 23 + Width = 35 + Height = 13 + Caption = 'Interval' + end + end + end + object Panel13: TPanel + Left = 0 + Top = 46 + Width = 342 + Height = 30 + BevelOuter = bvNone + Color = clGreen + TabOrder = 3 + object Panel14: TPanel + Left = 1 + Top = 1 + Width = 164 + Height = 28 + BevelOuter = bvNone + TabOrder = 0 + object Label3: TLabel + Left = 6 + Top = 6 + Width = 54 + Height = 13 + Caption = 'MaxThread' + end + object edCount: TEdit + Left = 68 + Top = 3 + Width = 89 + Height = 21 + TabOrder = 0 + Text = 'edCount' + OnChange = edCountChange + end + end + object Panel9: TPanel + Left = 166 + Top = 1 + Width = 175 + Height = 28 + BevelOuter = bvNone + TabOrder = 1 + object Label4: TLabel + Left = 7 + Top = 7 + Width = 27 + Height = 13 + Caption = 'Mode' + end + object rbInsert: TRadioButton + Left = 41 + Top = 6 + Width = 63 + Height = 17 + Caption = 'INSERT' + TabOrder = 0 + OnClick = rgModeClick + end + object rbSelect: TRadioButton + Left = 105 + Top = 6 + Width = 81 + Height = 17 + Caption = 'SELECT' + TabOrder = 1 + OnClick = rgModeClick + end + end + end + end + object meErrorLog: TMemo + Left = 0 + Top = 223 + Width = 441 + Height = 52 + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ScrollBars = ssVertical + TabOrder = 2 + end + object Timer: TTimer + Enabled = False + OnTimer = TimerTimer + Left = 48 + Top = 80 + end + object MSDataSource: TDataSource + DataSet = MSQuery + Left = 48 + Top = 112 + end + object scDeleteAll: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'DELETE FROM ThreadTable') + Debug = True + CommandTimeout = 0 + Left = 116 + Top = 113 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM ThreadTable') + Left = 16 + Top = 112 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/Threads.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/Threads.pas new file mode 100644 index 0000000..a2be42f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/Threads.pas @@ -0,0 +1,382 @@ +unit Threads; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, Db, MemDS, DBCtrls, ActiveX, + Grids, DBGrids, DBAccess, MSAccess, SdacVcl, + Buttons, ThreadsData, DemoFrame; + +const + WM_ENDTHREAD = $500; + WM_EXCEPTTHREAD = $501; + WM_ENDEXECUTE = $502; + +type + TThreadsFrame = class(TDemoFrame) + Timer: TTimer; + MSDataSource: TDataSource; + scDeleteAll: TMSSQL; + Panel3: TPanel; + Splitter2: TSplitter; + Panel4: TPanel; + meSQL: TMemo; + meLog: TMemo; + DBGrid1: TDBGrid; + Panel2: TPanel; + Panel5: TPanel; + btStart: TSpeedButton; + btStop: TSpeedButton; + btRun: TSpeedButton; + btRunMax: TSpeedButton; + btClearLog: TSpeedButton; + Panel6: TPanel; + btOpen: TSpeedButton; + btDeleteAll: TSpeedButton; + DBNavigator1: TDBNavigator; + Panel11: TPanel; + Panel10: TPanel; + Label1: TLabel; + Label2: TLabel; + lbThreadCount: TLabel; + lbExceptCount: TLabel; + Panel12: TPanel; + lbInterval: TLabel; + lbTime: TLabel; + Label5: TLabel; + Label6: TLabel; + Panel13: TPanel; + Panel14: TPanel; + Label3: TLabel; + edCount: TEdit; + Panel9: TPanel; + Label4: TLabel; + rbInsert: TRadioButton; + rbSelect: TRadioButton; + meErrorLog: TMemo; + MSQuery: TMSQuery; + procedure btRunClick(Sender: TObject); + procedure TimerTimer(Sender: TObject); + procedure btStartClick(Sender: TObject); + procedure btStopClick(Sender: TObject); + procedure edCountChange(Sender: TObject); + procedure btRunMaxClick(Sender: TObject); + procedure btClearLogClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure rgModeClick(Sender: TObject); + procedure btDeleteAllClick(Sender: TObject); + procedure Button1Click(Sender: TObject); + + private + procedure WMEndExecute(var Msg: TMessage); message WM_ENDTHREAD; + procedure WMException(var Msg: TMessage); message WM_EXCEPTTHREAD; + + function RunThread(ObjectPtr: pointer; Method:pointer; EndMethod: pointer): THandle; + + procedure Execute; + procedure EndExecute(Result: boolean); + + procedure Log(St: string); + procedure ErrorLog(St: string); + + procedure TestConnected; + + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +uses +{$IFNDEF VER130}Variants,{$ENDIF} + SdacDemoForm; + +{$WRITEABLECONST ON} + +{$R *.dfm} + +const + MaxThread: integer = 40; + Interval: integer = 2000; + ExceptCount: integer = 0; + +var + ThreadCount: integer; + ThreadNum: integer; + hCountSec: TRTLCriticalSection; + hLogSec: TRTLCriticalSection; + BegTime: TDateTime; + +type + TMethod = procedure (Self: pointer); + TEndMethod = procedure (Self: pointer; Result: boolean); + + PMethodDesc = ^TMethodDesc; + TMethodDesc = record + ObjectPtr :pointer; + Method :pointer; + EndMethod :pointer; + hWindow :HWND; + end; + +procedure ThreadProc(MethodDesc: PMethodDesc); stdcall; +begin + try + TMethod(MethodDesc^.Method)(MethodDesc.ObjectPtr); + PostMessage(MethodDesc.hWindow, WM_ENDTHREAD, DWORD(MethodDesc), 0); + except + on E:Exception do begin + PostMessage(MethodDesc.hWindow, WM_EXCEPTTHREAD, DWORD(MethodDesc), + DWORD(E)); + ExitThread(0); + end; + end; +end; + +procedure TThreadsFrame.WMEndExecute(var Msg: TMessage); +begin + if PMethodDesc(Msg.wParam).EndMethod <> nil then + TEndMethod(PMethodDesc(Msg.wParam).EndMethod)(PMethodDesc(Msg.wParam).ObjectPtr, True); + Dispose(PMethodDesc(Msg.wParam)); +end; + +procedure TThreadsFrame.WMException(var Msg: TMessage); +begin + if PMethodDesc(Msg.wParam).EndMethod <> nil then + TEndMethod(PMethodDesc(Msg.wParam).EndMethod)(PMethodDesc(Msg.wParam).ObjectPtr, False); + Dispose(PMethodDesc(Msg.wParam)); + raise Exception(Msg.lParam); +end; + +function TThreadsFrame.RunThread(ObjectPtr: pointer; Method: pointer; EndMethod: pointer): THandle; +var + ThreadId: DWORD; + MethodDesc: PMethodDesc; +begin + New(MethodDesc); + + MethodDesc.ObjectPtr := ObjectPtr; + MethodDesc.Method := Method; + MethodDesc.EndMethod := EndMethod; + MethodDesc.hWindow := Handle; + + InterlockedIncrement(ThreadCount); + Result:= CreateThread(nil, 1000, @ThreadProc, MethodDesc, 0, ThreadId); +end; + +procedure TThreadsFrame.Log(St: string); +begin + EnterCriticalSection(hLogSec); + if meLog.Lines.Count > 1000 then + meLog.Lines.Clear; + meLog.Lines.Add(St); + LeaveCriticalSection(hLogSec); +end; + +procedure TThreadsFrame.ErrorLog(St:string); +begin + EnterCriticalSection(hLogSec); + meErrorLog.Lines.Add(St); + LeaveCriticalSection(hLogSec); +end; + +const + Delay = 1000; + +procedure TThreadsFrame.Execute; +var + Data: TdmThreadsData; + ThreadNum: integer; + i: integer; +begin + i := CoInitializeEx(nil, COINIT_APARTMENTTHREADED); + if i <> S_OK then + raise Exception.Create('err - ' + IntToStr(i)); + + EnterCriticalSection(hCountSec); + Inc(Threads.ThreadNum); + ThreadNum := Threads.ThreadNum; + lbThreadCount.Caption := IntToStr(ThreadCount); + LeaveCriticalSection(hCountSec); + + Data := TdmThreadsData.Create(nil); + try + try + with Data do begin + Log(IntToStr(ThreadNum) + ' Connecting...'); + MSConnection.Assign(SdacForm.MSConnection); + MSConnection.LoginPrompt := False; + MSConnection.Connect; + Log(IntToStr(ThreadNum) + ' Connected'); + + if rbInsert.Checked then begin + // INSERT + MSSQL.ParamByName('ID').AsInteger := Random(10000); + MSSQL.Execute; +// MSConnection.Commit; + Log(IntToStr(ThreadNum) + ' Executed'); + end + else begin + // SELECT + MSQuery.Open; + i := 0; + while not MSQuery.Eof do begin + MSQuery.Next; + Inc(i); + end; + Log(IntToStr(ThreadNum) + ' Fetched ' + IntToStr(i) + ' rows'); + MSQuery.Close; + end; + + MSConnection.Disconnect; + Log(IntToStr(ThreadNum) + ' Disconnected'); + end; + except + on E:Exception do begin + MessageBeep(1000); + Log(IntToStr(ThreadNum) + ' ' + IntToStr(ThreadCount) + ' Exception ' + E.Message); + ErrorLog(IntToStr(ThreadNum) + ' ' + IntToStr(ThreadCount) + ' Exception ' + E.Message); + Inc(ExceptCount); + lbExceptCount.Caption := IntToStr(ExceptCount); + end; + end; + finally + Data.Free; + CoUninitialize; + end; +end; + +procedure TThreadsFrame.EndExecute(Result: boolean); +begin + InterlockedDecrement(ThreadCount); + EnterCriticalSection(hCountSec); + lbThreadCount.Caption := IntToStr(ThreadCount); + MessageBeep(1000); + LeaveCriticalSection(hCountSec); +end; + +procedure TThreadsFrame.btRunClick(Sender: TObject); +begin + TestConnected; + RunThread(Self, @TThreadsFrame.Execute, @TThreadsFrame.EndExecute); +end; + +procedure TThreadsFrame.btRunMaxClick(Sender: TObject); +var + i: integer; +begin + TestConnected; + for i := 1 to MaxThread do + RunThread(Self, @TThreadsFrame.Execute, @TThreadsFrame.EndExecute); +end; + +procedure TThreadsFrame.btStartClick(Sender: TObject); +begin + TestConnected; + edCount.Text := IntToStr(MaxThread); + BegTime := Time; + TimerTimer(nil); +end; + +procedure TThreadsFrame.btStopClick(Sender: TObject); +begin + Timer.Enabled := False; +end; + +procedure TThreadsFrame.TimerTimer(Sender: TObject); +begin + if ThreadCount < MaxThread then begin + btRunClick(nil); + if ThreadCount < (MaxThread div 10) * 9 then + Dec(Interval, Interval div 10); + end + else + Inc(Interval, Interval div 10); + + lbInterval.Caption := IntToStr(Interval); + lbExceptCount.Caption := IntToStr(ExceptCount); + Timer.Interval := Random(Interval - 1) + 1; + lbTime.Caption := TimeToStr(Time - BegTime); + + lbInterval.Caption := lbInterval.Caption + ' / ' + IntToStr(Timer.Interval); + + Timer.Enabled := True; +end; + +procedure TThreadsFrame.edCountChange(Sender: TObject); +begin + MaxThread := StrToInt(edCount.Text); +end; + +procedure TThreadsFrame.btClearLogClick(Sender: TObject); +begin + meLog.Lines.Clear; + meErrorLog.Lines.Clear; + ThreadNum := 0; + ExceptCount := 0; + lbExceptCount.Caption := IntToStr(ExceptCount); +end; + +procedure TThreadsFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Close; + MSQuery.Open; +end; + +procedure TThreadsFrame.rgModeClick(Sender: TObject); +begin + if rbInsert.Checked then + meSQL.Lines.Assign(dmThreadsData.MSSQL.SQL) + else + meSQL.Lines.Assign(dmThreadsData.MSQuery.SQL) +end; + +procedure TThreadsFrame.btDeleteAllClick(Sender: TObject); +begin + scDeleteAll.Execute; +// MSConnection.Commit; +end; + +procedure TThreadsFrame.Button1Click(Sender: TObject); +begin + Execute; +end; + +procedure TThreadsFrame.TestConnected; +begin + SdacForm.MSConnection.Connect; + if not SdacForm.MSConnection.Connected then + Abort; +end; + +// Demo management +procedure TThreadsFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + dmThreadsData := TdmThreadsData.Create(Self); + edCount.Text := IntToStr(MaxThread); + rbInsert.Checked := True; +end; + +procedure TThreadsFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +initialization + + // We are using Windows threading (vs Delphi TThread), so we need to enable IsMultiThread + IsMultiThread := True; + + InitializeCriticalSection(hCountSec); + InitializeCriticalSection(hLogSec); + Randomize; +finalization + DeleteCriticalSection(hCountSec); + DeleteCriticalSection(hLogSec); +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/ThreadsData.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/ThreadsData.dfm new file mode 100644 index 0000000..4ba49f4 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/ThreadsData.dfm @@ -0,0 +1,36 @@ +object dmThreadsData: TdmThreadsData + OldCreateOrder = False + Left = 202 + Top = 164 + Height = 477 + Width = 739 + object MSConnection: TMSConnection + Database = 'SDACDemos' + Username = 'Sa' + LoginPrompt = False + Left = 24 + Top = 8 + end + object MSQuery: TMSQuery + Connection = MSConnection + SQL.Strings = ( + 'SELECT * FROM ThreadTable') + FetchRows = 1 + Left = 88 + Top = 8 + end + object MSSQL: TMSSQL + Connection = MSConnection + SQL.Strings = ( + 'INSERT INTO ThreadTable(ID, NAME)' + 'VALUES (:ID, '#39'Some name'#39')') + CommandTimeout = 0 + Left = 144 + Top = 8 + ParamData = < + item + DataType = ftUnknown + Name = 'ID' + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/ThreadsData.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/ThreadsData.pas new file mode 100644 index 0000000..ced5b17 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/Threads/ThreadsData.pas @@ -0,0 +1,33 @@ +unit ThreadsData; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Db, MemDS, MSAccess, DBAccess; + +type + TdmThreadsData = class(TDataModule) + MSConnection: TMSConnection; + MSQuery: TMSQuery; + MSSQL: TMSSQL; + private + { Private declarations } + public + { Public declarations } + end; + +var + dmThreadsData: TdmThreadsData; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/UpdateSQL/UpdateSQL.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/UpdateSQL/UpdateSQL.dfm new file mode 100644 index 0000000..ab3c1a3 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/UpdateSQL/UpdateSQL.dfm @@ -0,0 +1,362 @@ +inherited UpdateSQLFrame: TUpdateSQLFrame + Width = 443 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 121 + Width = 443 + Height = 3 + Cursor = crVSplit + Align = alTop + Beveled = True + Color = clGreen + ParentColor = False + end + object Panel5: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 49 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 1 + Top = 1 + Width = 416 + Height = 47 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btPrepare: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Prepare' + Flat = True + Transparent = False + OnClick = btPrepareClick + end + object btUnPrepare: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'UnPrepare' + Flat = True + Transparent = False + OnClick = btUnPrepareClick + end + object btExecute: TSpeedButton + Left = 333 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Execute' + Flat = True + Transparent = False + OnClick = btExecuteClick + end + object Panel4: TPanel + Left = 1 + Top = 24 + Width = 414 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbDeleteObject: TCheckBox + Left = 13 + Top = 3 + Width = 91 + Height = 17 + Caption = 'DeleteObject' + Color = clBtnFace + ParentColor = False + TabOrder = 0 + OnClick = cbDeleteObjectClick + end + object cbInsertObject: TCheckBox + Left = 116 + Top = 3 + Width = 81 + Height = 17 + Caption = 'InsertObject' + Color = clBtnFace + ParentColor = False + TabOrder = 1 + OnClick = cbDeleteObjectClick + end + object cbModifyObject: TCheckBox + Left = 212 + Top = 3 + Width = 91 + Height = 17 + Caption = 'ModifyObject' + Color = clBtnFace + ParentColor = False + TabOrder = 2 + OnClick = cbDeleteObjectClick + end + object cbRefreshObject: TCheckBox + Left = 311 + Top = 3 + Width = 93 + Height = 17 + Caption = 'RefreshObject' + Color = clBtnFace + ParentColor = False + TabOrder = 3 + OnClick = cbDeleteObjectClick + end + end + end + end + object meSQL: TMemo + Left = 0 + Top = 49 + Width = 443 + Height = 72 + Align = alTop + Anchors = [] + Constraints.MinHeight = 50 + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + OnExit = meSQLExit + end + object Panel3: TPanel + Left = 0 + Top = 124 + Width = 443 + Height = 24 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Panel1: TPanel + Left = 1 + Top = 0 + Width = 315 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btRefreshRecord: TSpeedButton + Left = 232 + Top = 1 + Width = 82 + Height = 22 + Caption = 'RefreshRecord' + Flat = True + Transparent = False + OnClick = btRefreshRecordClick + end + object DBNavigator1: TDBNavigator + Left = 1 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 148 + Width = 443 + Height = 129 + Align = alClient + DataSource = DataSource + TabOrder = 3 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Emp') + Debug = True + UpdateObject = MSUpdateSQL + Left = 18 + Top = 42 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 82 + Top = 42 + end + object MSUpdateSQL: TMSUpdateSQL + InsertSQL.Strings = ( + 'INSERT INTO Emp' + ' (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)' + 'VALUES' + ' (:ENAME, :JOB, :MGR, :HIREDATE, :SAL, :COMM, :DEPTNO)' + 'SET :EMPNO = SCOPE_IDENTITY()') + DeleteSQL.Strings = ( + 'DELETE FROM Emp' + 'WHERE' + ' EMPNO = :Old_EMPNO') + ModifySQL.Strings = ( + 'UPDATE Emp' + 'SET' + + ' ENAME = :ENAME, JOB = :JOB, MGR = :MGR, HIREDATE = :HIREDATE, ' + + 'SAL = :SAL, COMM = :COMM, DEPTNO = :DEPTNO' + 'WHERE' + ' EMPNO = :Old_EMPNO') + RefreshSQL.Strings = ( + + 'SELECT Emp.ENAME, Emp.JOB, Emp.MGR, Emp.HIREDATE, Emp.SAL, Emp.C' + + 'OMM, Emp.DEPTNO FROM Emp' + 'WHERE Emp.EMPNO = :EMPNO ') + Left = 50 + Top = 42 + end + object DeleteSQL: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'DELETE FROM Emp' + 'WHERE' + ' EMPNO = :Old_EMPNO') + CommandTimeout = 0 + Left = 120 + Top = 15 + ParamData = < + item + DataType = ftUnknown + Name = 'Old_EMPNO' + end> + end + object InsertSQL: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'INSERT INTO Emp' + ' (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)' + 'VALUES' + ' (:ENAME, :JOB, :MGR, :HIREDATE, :SAL, :COMM, :DEPTNO)' + 'SET :EMPNO = SCOPE_IDENTITY()') + CommandTimeout = 0 + Left = 120 + Top = 45 + ParamData = < + item + DataType = ftUnknown + Name = 'ENAME' + end + item + DataType = ftUnknown + Name = 'JOB' + end + item + DataType = ftUnknown + Name = 'MGR' + end + item + DataType = ftUnknown + Name = 'HIREDATE' + end + item + DataType = ftUnknown + Name = 'SAL' + end + item + DataType = ftUnknown + Name = 'COMM' + end + item + DataType = ftUnknown + Name = 'DEPTNO' + end + item + DataType = ftUnknown + Name = 'EMPNO' + end> + end + object ModifyQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'UPDATE Emp' + 'SET' + + ' ENAME = :ENAME, JOB = :JOB, MGR = :MGR, HIREDATE = :HIREDATE, ' + + 'SAL = :SAL, COMM = :COMM, DEPTNO = :DEPTNO' + 'WHERE' + ' EMPNO = :Old_EMPNO') + Left = 120 + Top = 75 + ParamData = < + item + DataType = ftUnknown + Name = 'ENAME' + end + item + DataType = ftUnknown + Name = 'JOB' + end + item + DataType = ftUnknown + Name = 'MGR' + end + item + DataType = ftUnknown + Name = 'HIREDATE' + end + item + DataType = ftUnknown + Name = 'SAL' + end + item + DataType = ftUnknown + Name = 'COMM' + end + item + DataType = ftUnknown + Name = 'DEPTNO' + end + item + DataType = ftUnknown + Name = 'Old_EMPNO' + end> + end + object RefreshQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + + 'SELECT Emp.ENAME, Emp.JOB, Emp.MGR, Emp.HIREDATE, Emp.SAL, Emp.C' + + 'OMM, Emp.DEPTNO FROM Emp' + 'WHERE Emp.EMPNO = :EMPNO ') + Left = 120 + Top = 110 + ParamData = < + item + DataType = ftUnknown + Name = 'EMPNO' + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/UpdateSQL/UpdateSQL.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/UpdateSQL/UpdateSQL.pas new file mode 100644 index 0000000..6c90805 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/UpdateSQL/UpdateSQL.pas @@ -0,0 +1,191 @@ +unit UpdateSQL; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MemDS, DBAccess, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm; + +type + TUpdateSQLFrame = class(TDemoFrame) + MSQuery: TMSQuery; + DataSource: TDataSource; + MSUpdateSQL: TMSUpdateSQL; + Panel5: TPanel; + Panel2: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btPrepare: TSpeedButton; + btUnPrepare: TSpeedButton; + btExecute: TSpeedButton; + meSQL: TMemo; + Splitter1: TSplitter; + Panel3: TPanel; + Panel1: TPanel; + btRefreshRecord: TSpeedButton; + DBNavigator1: TDBNavigator; + DBGrid: TDBGrid; + DeleteSQL: TMSSQL; + InsertSQL: TMSSQL; + ModifyQuery: TMSQuery; + RefreshQuery: TMSQuery; + Panel4: TPanel; + cbDeleteObject: TCheckBox; + cbInsertObject: TCheckBox; + cbModifyObject: TCheckBox; + cbRefreshObject: TCheckBox; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btPrepareClick(Sender: TObject); + procedure btUnPrepareClick(Sender: TObject); + procedure btExecuteClick(Sender: TObject); + procedure meSQLExit(Sender: TObject); + procedure btRefreshRecordClick(Sender: TObject); + procedure cbDeleteObjectClick(Sender: TObject); + private + { Private declarations } + procedure ShowState; + procedure AssignProperties; + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TUpdateSQLFrame.ShowState; +var + St:string; + + procedure AddSt(S:string); + begin + if St <> '' then + St:= St + ', '; + St:= St + S; + end; + +begin + St:= ''; + + if MSQuery.Prepared then begin + AddSt('Prepared'); + + if MSQuery.IsQuery then + AddSt('IsQuery'); + end; + + if MSQuery.Active then + AddSt('Active') + else + AddSt('Inactive'); + + if MSQuery.Executing then + AddSt('Executing'); + + if MSQuery.Fetching then + AddSt('Fetching'); + + SdacForm.StatusBar.Panels[0].Text:= St; +end; + +procedure TUpdateSQLFrame.AssignProperties; +begin + if MSQuery.SQL.Text <> meSQL.Lines.Text then + MSQuery.SQL.Assign(meSQL.Lines); +end; + +procedure TUpdateSQLFrame.meSQLExit(Sender: TObject); +begin + if Trim(MSQuery.SQL.Text) <> Trim(meSQL.Lines.Text) then + MSQuery.SQL.Text:= meSQL.Lines.Text; + ShowState; +end; + +procedure TUpdateSQLFrame.btOpenClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Open; + finally + ShowState; + end; +end; + +procedure TUpdateSQLFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; + ShowState; +end; + +procedure TUpdateSQLFrame.btPrepareClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Prepare; + finally + ShowState; + end; +end; + +procedure TUpdateSQLFrame.btUnPrepareClick(Sender: TObject); +begin + MSQuery.UnPrepare; + ShowState; +end; + +procedure TUpdateSQLFrame.btExecuteClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Execute; + finally + ShowState; + end; +end; + +procedure TUpdateSQLFrame.btRefreshRecordClick(Sender: TObject); +begin + MSQuery.RefreshRecord; +end; + +// Demo management +procedure TUpdateSQLFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + meSQL.Lines.Assign(MSQuery.SQL); + ShowState; +end; + +procedure TUpdateSQLFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug:= Value; +end; + +procedure TUpdateSQLFrame.cbDeleteObjectClick(Sender: TObject); + function GetComponent(cbObject: TCheckBox; Component: TComponent): TComponent; + begin + if cbObject.Checked then + Result := Component + else + Result := nil; + end; +begin + MSUpdateSQL.DeleteObject := GetComponent(cbDeleteObject, DeleteSQL); + MSUpdateSQL.InsertObject := GetComponent(cbInsertObject, InsertSQL); + MSUpdateSQL.ModifyObject := GetComponent(cbModifyObject, ModifyQuery); + MSUpdateSQL.RefreshObject := GetComponent(cbRefreshObject, RefreshQuery); +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/Data1.xml b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/Data1.xml new file mode 100644 index 0000000..0da1a06 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/Data1.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.dfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.dfm new file mode 100644 index 0000000..2447d79 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.dfm @@ -0,0 +1,565 @@ +inherited VirtualTableFrame: TVirtualTableFrame + Width = 443 + Height = 267 + Align = alClient + object Splitter: TSplitter + Left = 0 + Top = 148 + Width = 443 + Height = 3 + Cursor = crVSplit + Align = alBottom + end + object DBGrid: TDBGrid + Left = 0 + Top = 117 + Width = 443 + Height = 31 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object DBMemo: TDBMemo + Left = 0 + Top = 151 + Width = 443 + Height = 116 + Align = alBottom + DataField = 'MEMO' + DataSource = DataSource + TabOrder = 1 + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 117 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Panel2: TPanel + Left = 1 + Top = 1 + Width = 405 + Height = 115 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 102 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btAutoFill: TSpeedButton + Left = 203 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Append 100' + Flat = True + Transparent = False + OnClick = btAutoFillClick + end + object btAddField: TSpeedButton + Left = 203 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Add field' + Flat = True + Transparent = False + OnClick = btAddFieldClick + end + object btDelField: TSpeedButton + Left = 304 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Delete field' + Flat = True + Transparent = False + OnClick = btDelFieldClick + end + object btClear: TSpeedButton + Left = 304 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Clear' + Flat = True + Transparent = False + OnClick = btClearClick + end + object btSave: TSpeedButton + Left = 102 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Save...' + Flat = True + Transparent = False + OnClick = btSaveClick + end + object btLoad: TSpeedButton + Left = 1 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Load...' + Flat = True + Transparent = False + OnClick = btLoadClick + end + object Panel4: TPanel + Left = 1 + Top = 47 + Width = 152 + Height = 33 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 5 + Top = 10 + Width = 22 + Height = 13 + Caption = 'Field' + end + object edField: TEdit + Left = 35 + Top = 5 + Width = 111 + Height = 21 + TabOrder = 0 + Text = 'Number' + end + end + object Panel5: TPanel + Left = 1 + Top = 81 + Width = 403 + Height = 33 + BevelOuter = bvNone + TabOrder = 2 + object Label5: TLabel + Left = 5 + Top = 10 + Width = 22 + Height = 13 + Caption = 'Filter' + end + object cbFiltered: TCheckBox + Left = 325 + Top = 7 + Width = 64 + Height = 17 + Caption = 'Filtered' + TabOrder = 1 + OnClick = cbFilteredClick + end + object edFilter: TEdit + Left = 35 + Top = 5 + Width = 267 + Height = 21 + TabOrder = 0 + OnExit = edFilterExit + end + end + object Panel6: TPanel + Left = 154 + Top = 47 + Width = 250 + Height = 33 + BevelOuter = bvNone + TabOrder = 1 + object Label2: TLabel + Left = 5 + Top = 10 + Width = 27 + Height = 13 + Caption = 'Value' + end + object edValue: TEdit + Left = 37 + Top = 5 + Width = 111 + Height = 21 + TabOrder = 0 + Text = '7' + end + object Panel7: TPanel + Left = 158 + Top = 4 + Width = 87 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 1 + object btLocate: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 22 + Caption = 'Locate' + Flat = True + Transparent = False + OnClick = btLocateClick + end + end + end + end + end + object OpenDialog: TOpenDialog + DefaultExt = 'xml' + FileName = 'Data1' + Filter = 'Virtual Table Data (*.xml;*.vtd)|*.xml;*.vtd|All Files (*.*)|*.*' + Left = 416 + Top = 34 + end + object SaveDialog: TSaveDialog + DefaultExt = 'xml' + FileName = 'Data1' + Filter = 'XML Virtual Table Data (*.xml)|*.xml|Binary Virtual Table Data (*.vtd)|*.vtd|All Files (*.*)|*.*' + Left = 448 + Top = 34 + end + object VirtualTable: TVirtualTable + Active = True + Filter = 'String LIKE '#39'%1%'#39 + FieldDefs = < + item + Name = 'NUMBER' + DataType = ftFloat + end + item + Name = 'STRING' + DataType = ftString + Size = 50 + end + item + Name = 'DATE' + DataType = ftDateTime + end + item + Name = 'MEMO' + DataType = ftMemo + end> + Left = 416 + Top = 2 + Data = { + 0300040006004E554D42455206000000000000000600535452494E4701003200 + 000000000400444154450B0000000000000004004D454D4F1000000000000000 + 00006400000008000000000000000000F03F2B00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202831 + 29080000000000C6BF58C8CC420E0000004D656D6F2076616C75652028312908 + 00000000000000000000402B00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283229080000000000 + C6BF58C8CC420E0000004D656D6F2076616C7565202832290800000000000000 + 000008402B00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E74732021212120283329080000000000C6BF58C8CC420E + 0000004D656D6F2076616C7565202833290800000000000000000010402B0000 + 0055736520436F7265204C616220446174612041636365737320436F6D706F6E + 656E74732021212120283429080000000000C6BF58C8CC420E0000004D656D6F + 2076616C7565202834290800000000000000000014402B00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 2120283529080000000000C6BF58C8CC420E0000004D656D6F2076616C756520 + 2835290800000000000000000018402B00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202836290800 + 00000000C6BF58C8CC420E0000004D656D6F2076616C75652028362908000000 + 0000000000001C402B00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E74732021212120283729080000000000C6BF58 + C8CC420E0000004D656D6F2076616C7565202837290800000000000000000020 + 402B00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E74732021212120283829080000000000C6BF58C8CC420E000000 + 4D656D6F2076616C7565202838290800000000000000000022402B0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 732021212120283929080000000000C6BF58C8CC420E0000004D656D6F207661 + 6C7565202839290800000000000000000024402C00000055736520436F726520 + 4C616220446174612041636365737320436F6D706F6E656E7473202121212028 + 313029080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202831 + 30290800000000000000000026402C00000055736520436F7265204C61622044 + 6174612041636365737320436F6D706F6E656E74732021212120283131290800 + 00000000C6BF58C8CC420F0000004D656D6F2076616C75652028313129080000 + 0000000000000028402C00000055736520436F7265204C616220446174612041 + 636365737320436F6D706F6E656E7473202121212028313229080000000000C6 + BF58C8CC420F0000004D656D6F2076616C756520283132290800000000000000 + 00002A402C00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E7473202121212028313329080000000000C6BF58C8CC42 + 0F0000004D656D6F2076616C75652028313329080000000000000000002C402C + 00000055736520436F7265204C616220446174612041636365737320436F6D70 + 6F6E656E7473202121212028313429080000000000C6BF58C8CC420F0000004D + 656D6F2076616C75652028313429080000000000000000002E402C0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 73202121212028313529080000000000C6BF58C8CC420F0000004D656D6F2076 + 616C756520283135290800000000000000000030402C00000055736520436F72 + 65204C616220446174612041636365737320436F6D706F6E656E747320212121 + 2028313629080000000000C6BF58C8CC420F0000004D656D6F2076616C756520 + 283136290800000000000000000031402C00000055736520436F7265204C6162 + 20446174612041636365737320436F6D706F6E656E7473202121212028313729 + 080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202831372908 + 00000000000000000032402C00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283138290800000000 + 00C6BF58C8CC420F0000004D656D6F2076616C75652028313829080000000000 + 0000000033402C00000055736520436F7265204C616220446174612041636365 + 737320436F6D706F6E656E7473202121212028313929080000000000C6BF58C8 + CC420F0000004D656D6F2076616C756520283139290800000000000000000034 + 402C00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E7473202121212028323029080000000000C6BF58C8CC420F0000 + 004D656D6F2076616C756520283230290800000000000000000035402C000000 + 55736520436F7265204C616220446174612041636365737320436F6D706F6E65 + 6E7473202121212028323129080000000000C6BF58C8CC420F0000004D656D6F + 2076616C756520283231290800000000000000000036402C0000005573652043 + 6F7265204C616220446174612041636365737320436F6D706F6E656E74732021 + 21212028323229080000000000C6BF58C8CC420F0000004D656D6F2076616C75 + 6520283232290800000000000000000037402C00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202832 + 3329080000000000C6BF58C8CC420F0000004D656D6F2076616C756520283233 + 290800000000000000000038402C00000055736520436F7265204C6162204461 + 74612041636365737320436F6D706F6E656E7473202121212028323429080000 + 000000C6BF58C8CC420F0000004D656D6F2076616C7565202832342908000000 + 00000000000039402C00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E7473202121212028323529080000000000C6BF + 58C8CC420F0000004D656D6F2076616C75652028323529080000000000000000 + 003A402C00000055736520436F7265204C616220446174612041636365737320 + 436F6D706F6E656E7473202121212028323629080000000000C6BF58C8CC420F + 0000004D656D6F2076616C75652028323629080000000000000000003B402C00 + 000055736520436F7265204C616220446174612041636365737320436F6D706F + 6E656E7473202121212028323729080000000000C6BF58C8CC420F0000004D65 + 6D6F2076616C75652028323729080000000000000000003C402C000000557365 + 20436F7265204C616220446174612041636365737320436F6D706F6E656E7473 + 202121212028323829080000000000C6BF58C8CC420F0000004D656D6F207661 + 6C75652028323829080000000000000000003D402C00000055736520436F7265 + 204C616220446174612041636365737320436F6D706F6E656E74732021212120 + 28323929080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028 + 323929080000000000000000003E402C00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202833302908 + 0000000000C6BF58C8CC420F0000004D656D6F2076616C756520283330290800 + 00000000000000003F402C00000055736520436F7265204C6162204461746120 + 41636365737320436F6D706F6E656E7473202121212028333129080000000000 + C6BF58C8CC420F0000004D656D6F2076616C7565202833312908000000000000 + 00000040402C00000055736520436F7265204C61622044617461204163636573 + 7320436F6D706F6E656E7473202121212028333229080000000000C6BF58C8CC + 420F0000004D656D6F2076616C75652028333229080000000000000000804040 + 2C00000055736520436F7265204C616220446174612041636365737320436F6D + 706F6E656E7473202121212028333329080000000000C6BF58C8CC420F000000 + 4D656D6F2076616C756520283333290800000000000000000041402C00000055 + 736520436F7265204C616220446174612041636365737320436F6D706F6E656E + 7473202121212028333429080000000000C6BF58C8CC420F0000004D656D6F20 + 76616C756520283334290800000000000000008041402C00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 212028333529080000000000C6BF58C8CC420F0000004D656D6F2076616C7565 + 20283335290800000000000000000042402C00000055736520436F7265204C61 + 6220446174612041636365737320436F6D706F6E656E74732021212120283336 + 29080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028333629 + 0800000000000000008042402C00000055736520436F7265204C616220446174 + 612041636365737320436F6D706F6E656E747320212121202833372908000000 + 0000C6BF58C8CC420F0000004D656D6F2076616C756520283337290800000000 + 000000000043402C00000055736520436F7265204C6162204461746120416363 + 65737320436F6D706F6E656E7473202121212028333829080000000000C6BF58 + C8CC420F0000004D656D6F2076616C7565202833382908000000000000000080 + 43402C00000055736520436F7265204C61622044617461204163636573732043 + 6F6D706F6E656E7473202121212028333929080000000000C6BF58C8CC420F00 + 00004D656D6F2076616C756520283339290800000000000000000044402C0000 + 0055736520436F7265204C616220446174612041636365737320436F6D706F6E + 656E7473202121212028343029080000000000C6BF58C8CC420F0000004D656D + 6F2076616C756520283430290800000000000000008044402C00000055736520 + 436F7265204C616220446174612041636365737320436F6D706F6E656E747320 + 2121212028343129080000000000C6BF58C8CC420F0000004D656D6F2076616C + 756520283431290800000000000000000045402C00000055736520436F726520 + 4C616220446174612041636365737320436F6D706F6E656E7473202121212028 + 343229080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202834 + 32290800000000000000008045402C00000055736520436F7265204C61622044 + 6174612041636365737320436F6D706F6E656E74732021212120283433290800 + 00000000C6BF58C8CC420F0000004D656D6F2076616C75652028343329080000 + 0000000000000046402C00000055736520436F7265204C616220446174612041 + 636365737320436F6D706F6E656E7473202121212028343429080000000000C6 + BF58C8CC420F0000004D656D6F2076616C756520283434290800000000000000 + 008046402C00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E7473202121212028343529080000000000C6BF58C8CC42 + 0F0000004D656D6F2076616C756520283435290800000000000000000047402C + 00000055736520436F7265204C616220446174612041636365737320436F6D70 + 6F6E656E7473202121212028343629080000000000C6BF58C8CC420F0000004D + 656D6F2076616C756520283436290800000000000000008047402C0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 73202121212028343729080000000000C6BF58C8CC420F0000004D656D6F2076 + 616C756520283437290800000000000000000048402C00000055736520436F72 + 65204C616220446174612041636365737320436F6D706F6E656E747320212121 + 2028343829080000000000C6BF58C8CC420F0000004D656D6F2076616C756520 + 283438290800000000000000008048402C00000055736520436F7265204C6162 + 20446174612041636365737320436F6D706F6E656E7473202121212028343929 + 080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202834392908 + 00000000000000000049402C00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283530290800000000 + 00C6BF58C8CC420F0000004D656D6F2076616C75652028353029080000000000 + 0000008049402C00000055736520436F7265204C616220446174612041636365 + 737320436F6D706F6E656E7473202121212028353129080000000000C6BF58C8 + CC420F0000004D656D6F2076616C75652028353129080000000000000000004A + 402C00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E7473202121212028353229080000000000C6BF58C8CC420F0000 + 004D656D6F2076616C75652028353229080000000000000000804A402C000000 + 55736520436F7265204C616220446174612041636365737320436F6D706F6E65 + 6E7473202121212028353329080000000000C6BF58C8CC420F0000004D656D6F + 2076616C75652028353329080000000000000000004B402C0000005573652043 + 6F7265204C616220446174612041636365737320436F6D706F6E656E74732021 + 21212028353429080000000000C6BF58C8CC420F0000004D656D6F2076616C75 + 652028353429080000000000000000804B402C00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202835 + 3529080000000000C6BF58C8CC420F0000004D656D6F2076616C756520283535 + 29080000000000000000004C402C00000055736520436F7265204C6162204461 + 74612041636365737320436F6D706F6E656E7473202121212028353629080000 + 000000C6BF58C8CC420F0000004D656D6F2076616C7565202835362908000000 + 0000000000804C402C00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E7473202121212028353729080000000000C6BF + 58C8CC420F0000004D656D6F2076616C75652028353729080000000000000000 + 004D402C00000055736520436F7265204C616220446174612041636365737320 + 436F6D706F6E656E7473202121212028353829080000000000C6BF58C8CC420F + 0000004D656D6F2076616C75652028353829080000000000000000804D402C00 + 000055736520436F7265204C616220446174612041636365737320436F6D706F + 6E656E7473202121212028353929080000000000C6BF58C8CC420F0000004D65 + 6D6F2076616C75652028353929080000000000000000004E402C000000557365 + 20436F7265204C616220446174612041636365737320436F6D706F6E656E7473 + 202121212028363029080000000000C6BF58C8CC420F0000004D656D6F207661 + 6C75652028363029080000000000000000804E402C00000055736520436F7265 + 204C616220446174612041636365737320436F6D706F6E656E74732021212120 + 28363129080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028 + 363129080000000000000000004F402C00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202836322908 + 0000000000C6BF58C8CC420F0000004D656D6F2076616C756520283632290800 + 00000000000000804F402C00000055736520436F7265204C6162204461746120 + 41636365737320436F6D706F6E656E7473202121212028363329080000000000 + C6BF58C8CC420F0000004D656D6F2076616C7565202836332908000000000000 + 00000050402C00000055736520436F7265204C61622044617461204163636573 + 7320436F6D706F6E656E7473202121212028363429080000000000C6BF58C8CC + 420F0000004D656D6F2076616C75652028363429080000000000000000405040 + 2C00000055736520436F7265204C616220446174612041636365737320436F6D + 706F6E656E7473202121212028363529080000000000C6BF58C8CC420F000000 + 4D656D6F2076616C756520283635290800000000000000008050402C00000055 + 736520436F7265204C616220446174612041636365737320436F6D706F6E656E + 7473202121212028363629080000000000C6BF58C8CC420F0000004D656D6F20 + 76616C75652028363629080000000000000000C050402C00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 212028363729080000000000C6BF58C8CC420F0000004D656D6F2076616C7565 + 20283637290800000000000000000051402C00000055736520436F7265204C61 + 6220446174612041636365737320436F6D706F6E656E74732021212120283638 + 29080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028363829 + 0800000000000000004051402C00000055736520436F7265204C616220446174 + 612041636365737320436F6D706F6E656E747320212121202836392908000000 + 0000C6BF58C8CC420F0000004D656D6F2076616C756520283639290800000000 + 000000008051402C00000055736520436F7265204C6162204461746120416363 + 65737320436F6D706F6E656E7473202121212028373029080000000000C6BF58 + C8CC420F0000004D656D6F2076616C75652028373029080000000000000000C0 + 51402C00000055736520436F7265204C61622044617461204163636573732043 + 6F6D706F6E656E7473202121212028373129080000000000C6BF58C8CC420F00 + 00004D656D6F2076616C756520283731290800000000000000000052402C0000 + 0055736520436F7265204C616220446174612041636365737320436F6D706F6E + 656E7473202121212028373229080000000000C6BF58C8CC420F0000004D656D + 6F2076616C756520283732290800000000000000004052402C00000055736520 + 436F7265204C616220446174612041636365737320436F6D706F6E656E747320 + 2121212028373329080000000000C6BF58C8CC420F0000004D656D6F2076616C + 756520283733290800000000000000008052402C00000055736520436F726520 + 4C616220446174612041636365737320436F6D706F6E656E7473202121212028 + 373429080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202837 + 3429080000000000000000C052402C00000055736520436F7265204C61622044 + 6174612041636365737320436F6D706F6E656E74732021212120283735290800 + 00000000C6BF58C8CC420F0000004D656D6F2076616C75652028373529080000 + 0000000000000053402C00000055736520436F7265204C616220446174612041 + 636365737320436F6D706F6E656E7473202121212028373629080000000000C6 + BF58C8CC420F0000004D656D6F2076616C756520283736290800000000000000 + 004053402C00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E7473202121212028373729080000000000C6BF58C8CC42 + 0F0000004D656D6F2076616C756520283737290800000000000000008053402C + 00000055736520436F7265204C616220446174612041636365737320436F6D70 + 6F6E656E7473202121212028373829080000000000C6BF58C8CC420F0000004D + 656D6F2076616C75652028373829080000000000000000C053402C0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 73202121212028373929080000000000C6BF58C8CC420F0000004D656D6F2076 + 616C756520283739290800000000000000000054402C00000055736520436F72 + 65204C616220446174612041636365737320436F6D706F6E656E747320212121 + 2028383029080000000000C6BF58C8CC420F0000004D656D6F2076616C756520 + 283830290800000000000000004054402C00000055736520436F7265204C6162 + 20446174612041636365737320436F6D706F6E656E7473202121212028383129 + 080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202838312908 + 00000000000000008054402C00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283832290800000000 + 00C6BF58C8CC420F0000004D656D6F2076616C75652028383229080000000000 + 000000C054402C00000055736520436F7265204C616220446174612041636365 + 737320436F6D706F6E656E7473202121212028383329080000000000C6BF58C8 + CC420F0000004D656D6F2076616C756520283833290800000000000000000055 + 402C00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E7473202121212028383429080000000000C6BF58C8CC420F0000 + 004D656D6F2076616C756520283834290800000000000000004055402C000000 + 55736520436F7265204C616220446174612041636365737320436F6D706F6E65 + 6E7473202121212028383529080000000000C6BF58C8CC420F0000004D656D6F + 2076616C756520283835290800000000000000008055402C0000005573652043 + 6F7265204C616220446174612041636365737320436F6D706F6E656E74732021 + 21212028383629080000000000C6BF58C8CC420F0000004D656D6F2076616C75 + 652028383629080000000000000000C055402C00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202838 + 3729080000000000C6BF58C8CC420F0000004D656D6F2076616C756520283837 + 290800000000000000000056402C00000055736520436F7265204C6162204461 + 74612041636365737320436F6D706F6E656E7473202121212028383829080000 + 000000C6BF58C8CC420F0000004D656D6F2076616C7565202838382908000000 + 00000000004056402C00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E7473202121212028383929080000000000C6BF + 58C8CC420F0000004D656D6F2076616C75652028383929080000000000000000 + 8056402C00000055736520436F7265204C616220446174612041636365737320 + 436F6D706F6E656E7473202121212028393029080000000000C6BF58C8CC420F + 0000004D656D6F2076616C75652028393029080000000000000000C056402C00 + 000055736520436F7265204C616220446174612041636365737320436F6D706F + 6E656E7473202121212028393129080000000000C6BF58C8CC420F0000004D65 + 6D6F2076616C756520283931290800000000000000000057402C000000557365 + 20436F7265204C616220446174612041636365737320436F6D706F6E656E7473 + 202121212028393229080000000000C6BF58C8CC420F0000004D656D6F207661 + 6C756520283932290800000000000000004057402C00000055736520436F7265 + 204C616220446174612041636365737320436F6D706F6E656E74732021212120 + 28393329080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028 + 3933290800000000000000008057402C00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202839342908 + 0000000000C6BF58C8CC420F0000004D656D6F2076616C756520283934290800 + 00000000000000C057402C00000055736520436F7265204C6162204461746120 + 41636365737320436F6D706F6E656E7473202121212028393529080000000000 + C6BF58C8CC420F0000004D656D6F2076616C7565202839352908000000000000 + 00000058402C00000055736520436F7265204C61622044617461204163636573 + 7320436F6D706F6E656E7473202121212028393629080000000000C6BF58C8CC + 420F0000004D656D6F2076616C75652028393629080000000000000000405840 + 2C00000055736520436F7265204C616220446174612041636365737320436F6D + 706F6E656E7473202121212028393729080000000000C6BF58C8CC420F000000 + 4D656D6F2076616C756520283937290800000000000000008058402C00000055 + 736520436F7265204C616220446174612041636365737320436F6D706F6E656E + 7473202121212028393829080000000000C6BF58C8CC420F0000004D656D6F20 + 76616C75652028393829080000000000000000C058402C00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 212028393929080000000000C6BF58C8CC420F0000004D656D6F2076616C7565 + 20283939290800000000000000000059402D00000055736520436F7265204C61 + 6220446174612041636365737320436F6D706F6E656E74732021212120283130 + 3029080000000000C6BF58C8CC42100000004D656D6F2076616C756520283130 + 3029} + end + object DataSource: TDataSource + DataSet = VirtualTable + OnStateChange = DataSourceStateChange + OnDataChange = DataSourceDataChange + Left = 448 + Top = 2 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.pas b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.pas new file mode 100644 index 0000000..3ebbefa --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.pas @@ -0,0 +1,201 @@ +unit VTable; + +interface + +uses + Classes, SysUtils, +{$IFNDEF LINUX} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, Buttons, + {$IFNDEF VER130}Variants,{$ENDIF} +{$ELSE} + QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QDBCtrls, QComCtrls, QExtCtrls, QGrids, QDBGrids, QButtons, +{$ENDIF} + DB, MemDS, VirtualTable, DemoFrame, DemoForm; + +type + TVirtualTableFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DBMemo: TDBMemo; + Panel1: TPanel; + Splitter: TSplitter; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + VirtualTable: TVirtualTable; + DataSource: TDataSource; + Panel2: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btAutoFill: TSpeedButton; + btAddField: TSpeedButton; + btDelField: TSpeedButton; + btClear: TSpeedButton; + btSave: TSpeedButton; + btLoad: TSpeedButton; + Panel4: TPanel; + edField: TEdit; + Label1: TLabel; + Panel5: TPanel; + cbFiltered: TCheckBox; + edFilter: TEdit; + Label5: TLabel; + Panel6: TPanel; + edValue: TEdit; + Label2: TLabel; + Panel7: TPanel; + btLocate: TSpeedButton; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btAutoFillClick(Sender: TObject); + procedure DataSourceDataChange(Sender: TObject; Field: TField); + procedure DataSourceStateChange(Sender: TObject); + procedure btAddFieldClick(Sender: TObject); + procedure btDelFieldClick(Sender: TObject); + procedure btLocateClick(Sender: TObject); + procedure edFilterExit(Sender: TObject); + procedure cbFilteredClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btSaveClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + private + { Private declarations } + FFieldNo: integer; + public + procedure Initialize; override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TVirtualTableFrame.btOpenClick(Sender: TObject); +begin + VirtualTable.Open; + if VirtualTable.Fields.Count > 0 then + edField.Text := VirtualTable.Fields[0].FieldName + else + edField.Text := ''; +end; + +procedure TVirtualTableFrame.btCloseClick(Sender: TObject); +begin + VirtualTable.Close; +end; + +procedure TVirtualTableFrame.btAutoFillClick(Sender: TObject); +var + i:integer; + Field:TField; +begin + Field:= VirtualTable.FindField('STRING1'); + for i:= 1 to 100 do + with VirtualTable do begin + Append; + FieldByName('NUMBER').AsInteger:= i; + FieldByName('STRING').AsString:= 'Use Core Lab Data Access Components !!! (' + IntToStr(i) + ')'; + FieldByName('DATE').AsDateTime:= Date; + FieldByName('MEMO').AsString:= 'Memo value (' + IntToStr(i) + ')'; + + if Field <> nil then + FieldByName('STRING1').AsString:= 'TVirtualTable'; + + Post; + end; +end; + +procedure TVirtualTableFrame.DataSourceStateChange(Sender: TObject); +begin + (Application.MainForm as TDemoForm).StatusBar.Panels[1].Text:= 'RecordCount:' + IntToStr(VirtualTable.RecordCount); + (Application.MainForm as TDemoForm).StatusBar.Panels[2].Text:= 'RecordNo:' + IntToStr(VirtualTable.RecNo); +end; + +procedure TVirtualTableFrame.DataSourceDataChange(Sender: TObject; Field: TField); +begin + DataSourceStateChange(nil); +end; + +procedure TVirtualTableFrame.btAddFieldClick(Sender: TObject); +begin + Inc(FFieldNo); + VirtualTable.AddField('STRING' + IntToStr(FFieldNo), ftString, 30); + btDelField.Enabled := True; +end; + +procedure TVirtualTableFrame.btDelFieldClick(Sender: TObject); +begin + if FFieldNo > 0 then begin + VirtualTable.DeleteField('STRING' + IntToStr(FFieldNo)); + Dec(FFieldNo); + end; + if FFieldNo = 0 then + btDelField.Enabled := False; +end; + +procedure TVirtualTableFrame.btLocateClick(Sender: TObject); +begin + VirtualTable.Locate(edField.Text, Variant(edValue.Text), []); +end; + +procedure TVirtualTableFrame.Initialize; +begin + inherited; + edFilter.Text:= VirtualTable.Filter; + cbFiltered.Checked:= VirtualTable.Filtered; + btDelField.Enabled := False; + FFieldNo := 0; + if (Application.MainForm as TDemoForm).GetIsXPMan then begin + Panel2.Color := clBtnFace; + Panel7.Color := clBtnFace; + end + else begin + Panel2.Color := (Application.MainForm as TDemoForm).ProductColor; + Panel7.Color := Panel2.Color; + end +end; + +procedure TVirtualTableFrame.edFilterExit(Sender: TObject); +begin + VirtualTable.Filter:= edFilter.Text; +end; + +procedure TVirtualTableFrame.cbFilteredClick(Sender: TObject); +begin + try + VirtualTable.Filtered := cbFiltered.Checked; + finally + cbFiltered.Checked := VirtualTable.Filtered; + end; +end; + +procedure TVirtualTableFrame.btLoadClick(Sender: TObject); +begin + OpenDialog.InitialDir := ExtractFilePath(Application.ExeName) + 'VirtualTable'; + if OpenDialog.Execute then + VirtualTable.LoadFromFile(OpenDialog.FileName); +end; + +procedure TVirtualTableFrame.btSaveClick(Sender: TObject); +begin + SaveDialog.InitialDir := ExtractFilePath(Application.ExeName) + 'VirtualTable'; + if SaveDialog.Execute then + if LowerCase(ExtractFileExt(SaveDialog.FileName)) = '.xml' then + VirtualTable.SaveToXML(SaveDialog.FileName) + else + VirtualTable.SaveToFile(SaveDialog.FileName) +end; + +procedure TVirtualTableFrame.btClearClick(Sender: TObject); +begin + VirtualTable.Clear; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.xfm b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.xfm new file mode 100644 index 0000000..bd8b18b --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/SdacDemo/VirtualTable/VTable.xfm @@ -0,0 +1,581 @@ +inherited VirtualTableFrame: TVirtualTableFrame + Width = 451 + Height = 304 + VertScrollBar.Range = 236 + Align = alClient + AutoScroll = False + object Splitter: TSplitter + Left = 0 + Top = 185 + Width = 451 + Height = 3 + Cursor = crVSplit + Align = alBottom + end + object DBGrid: TDBGrid + Left = 0 + Top = 117 + Width = 451 + Height = 68 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Color = clBlack + TitleFont.Height = 11 + TitleFont.Name = 'helvetica' + TitleFont.Pitch = fpVariable + TitleFont.Style = [] + end + object DBMemo: TDBMemo + Left = 0 + Top = 188 + Width = 451 + Height = 116 + Align = alBottom + DataField = 'MEMO' + DataSource = DataSource + TabOrder = 1 + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 451 + Height = 117 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Panel2: TPanel + Left = 1 + Top = 1 + Width = 405 + Height = 115 + BevelOuter = bvNone + Color = 9790720 + ParentColor = False + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 102 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btAutoFill: TSpeedButton + Left = 203 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Append 100' + Flat = True + Transparent = False + OnClick = btAutoFillClick + end + object btAddField: TSpeedButton + Left = 203 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Add field' + Flat = True + Transparent = False + OnClick = btAddFieldClick + end + object btDelField: TSpeedButton + Left = 304 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Delete field' + Flat = True + Transparent = False + OnClick = btDelFieldClick + end + object btClear: TSpeedButton + Left = 304 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Clear' + Flat = True + Transparent = False + OnClick = btClearClick + end + object btSave: TSpeedButton + Left = 102 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Save...' + Flat = True + Transparent = False + OnClick = btSaveClick + end + object btLoad: TSpeedButton + Left = 1 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Load...' + Flat = True + Transparent = False + OnClick = btLoadClick + end + object Panel4: TPanel + Left = 1 + Top = 47 + Width = 152 + Height = 33 + BevelOuter = bvNone + Color = clButton + ParentColor = False + TabOrder = 0 + object Label1: TLabel + Left = 5 + Top = 10 + Width = 21 + Height = 13 + Caption = 'Field' + end + object edField: TEdit + Left = 35 + Top = 5 + Width = 111 + Height = 21 + TabOrder = 0 + Text = 'Number' + end + end + object Panel5: TPanel + Left = 1 + Top = 81 + Width = 403 + Height = 33 + BevelOuter = bvNone + Color = clButton + ParentColor = False + TabOrder = 1 + object Label5: TLabel + Left = 5 + Top = 10 + Width = 23 + Height = 13 + Caption = 'Filter' + end + object cbFiltered: TCheckBox + Left = 325 + Top = 7 + Width = 64 + Height = 17 + Caption = 'Filtered' + TabOrder = 0 + OnClick = cbFilteredClick + end + object edFilter: TEdit + Left = 35 + Top = 5 + Width = 267 + Height = 21 + TabOrder = 1 + OnExit = edFilterExit + end + end + object Panel6: TPanel + Left = 154 + Top = 47 + Width = 250 + Height = 33 + BevelOuter = bvNone + Color = clButton + ParentColor = False + TabOrder = 2 + object Label2: TLabel + Left = 5 + Top = 10 + Width = 24 + Height = 13 + Caption = 'Value' + end + object edValue: TEdit + Left = 37 + Top = 5 + Width = 111 + Height = 21 + TabOrder = 0 + Text = '7' + end + object Panel7: TPanel + Left = 158 + Top = 4 + Width = 87 + Height = 24 + BevelOuter = bvNone + TabOrder = 1 + object btLocate: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 22 + Caption = 'Locate' + Flat = True + Transparent = False + OnClick = btLocateClick + end + end + end + end + end + object OpenDialog: TOpenDialog + Height = 0 + Width = 0 + DefaultExt = 'xml' + FileName = 'Data1' + Filter = 'Virtual Table Data (*.xml;*.vtd)|*.xml;*.vtd|All Files (*.*)|*.*' + FilterIndex = 0 + Title = 'Open' + Left = 416 + Top = 34 + end + object SaveDialog: TSaveDialog + Height = 0 + Width = 0 + DefaultExt = 'xml' + FileName = 'Data1' + Filter = 'XML Virtual Table Data (*.xml)|*.xml|Binary Virtual Table Data (*.vtd)|*.vtd|All Files (*.*)|*.*' + FilterIndex = 0 + Title = 'Save' + Left = 448 + Top = 34 + end + object VirtualTable: TVirtualTable + Active = True + Filter = 'String LIKE '#39'%1%'#39 + FieldDefs = < + item + Name = 'NUMBER' + DataType = ftFloat + end + item + Name = 'STRING' + DataType = ftString + Size = 50 + end + item + Name = 'DATE' + DataType = ftDateTime + end + item + Name = 'MEMO' + DataType = ftMemo + end> + Left = 416 + Top = 2 + Data = { + 0300040006004E554D42455206000000000000000600535452494E4701003200 + 000000000400444154450B0000000000000004004D454D4F1000000000000000 + 00006400000008000000000000000000F03F2B00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202831 + 29080000000000C6BF58C8CC420E0000004D656D6F2076616C75652028312908 + 00000000000000000000402B00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283229080000000000 + C6BF58C8CC420E0000004D656D6F2076616C7565202832290800000000000000 + 000008402B00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E74732021212120283329080000000000C6BF58C8CC420E + 0000004D656D6F2076616C7565202833290800000000000000000010402B0000 + 0055736520436F7265204C616220446174612041636365737320436F6D706F6E + 656E74732021212120283429080000000000C6BF58C8CC420E0000004D656D6F + 2076616C7565202834290800000000000000000014402B00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 2120283529080000000000C6BF58C8CC420E0000004D656D6F2076616C756520 + 2835290800000000000000000018402B00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202836290800 + 00000000C6BF58C8CC420E0000004D656D6F2076616C75652028362908000000 + 0000000000001C402B00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E74732021212120283729080000000000C6BF58 + C8CC420E0000004D656D6F2076616C7565202837290800000000000000000020 + 402B00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E74732021212120283829080000000000C6BF58C8CC420E000000 + 4D656D6F2076616C7565202838290800000000000000000022402B0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 732021212120283929080000000000C6BF58C8CC420E0000004D656D6F207661 + 6C7565202839290800000000000000000024402C00000055736520436F726520 + 4C616220446174612041636365737320436F6D706F6E656E7473202121212028 + 313029080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202831 + 30290800000000000000000026402C00000055736520436F7265204C61622044 + 6174612041636365737320436F6D706F6E656E74732021212120283131290800 + 00000000C6BF58C8CC420F0000004D656D6F2076616C75652028313129080000 + 0000000000000028402C00000055736520436F7265204C616220446174612041 + 636365737320436F6D706F6E656E7473202121212028313229080000000000C6 + BF58C8CC420F0000004D656D6F2076616C756520283132290800000000000000 + 00002A402C00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E7473202121212028313329080000000000C6BF58C8CC42 + 0F0000004D656D6F2076616C75652028313329080000000000000000002C402C + 00000055736520436F7265204C616220446174612041636365737320436F6D70 + 6F6E656E7473202121212028313429080000000000C6BF58C8CC420F0000004D + 656D6F2076616C75652028313429080000000000000000002E402C0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 73202121212028313529080000000000C6BF58C8CC420F0000004D656D6F2076 + 616C756520283135290800000000000000000030402C00000055736520436F72 + 65204C616220446174612041636365737320436F6D706F6E656E747320212121 + 2028313629080000000000C6BF58C8CC420F0000004D656D6F2076616C756520 + 283136290800000000000000000031402C00000055736520436F7265204C6162 + 20446174612041636365737320436F6D706F6E656E7473202121212028313729 + 080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202831372908 + 00000000000000000032402C00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283138290800000000 + 00C6BF58C8CC420F0000004D656D6F2076616C75652028313829080000000000 + 0000000033402C00000055736520436F7265204C616220446174612041636365 + 737320436F6D706F6E656E7473202121212028313929080000000000C6BF58C8 + CC420F0000004D656D6F2076616C756520283139290800000000000000000034 + 402C00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E7473202121212028323029080000000000C6BF58C8CC420F0000 + 004D656D6F2076616C756520283230290800000000000000000035402C000000 + 55736520436F7265204C616220446174612041636365737320436F6D706F6E65 + 6E7473202121212028323129080000000000C6BF58C8CC420F0000004D656D6F + 2076616C756520283231290800000000000000000036402C0000005573652043 + 6F7265204C616220446174612041636365737320436F6D706F6E656E74732021 + 21212028323229080000000000C6BF58C8CC420F0000004D656D6F2076616C75 + 6520283232290800000000000000000037402C00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202832 + 3329080000000000C6BF58C8CC420F0000004D656D6F2076616C756520283233 + 290800000000000000000038402C00000055736520436F7265204C6162204461 + 74612041636365737320436F6D706F6E656E7473202121212028323429080000 + 000000C6BF58C8CC420F0000004D656D6F2076616C7565202832342908000000 + 00000000000039402C00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E7473202121212028323529080000000000C6BF + 58C8CC420F0000004D656D6F2076616C75652028323529080000000000000000 + 003A402C00000055736520436F7265204C616220446174612041636365737320 + 436F6D706F6E656E7473202121212028323629080000000000C6BF58C8CC420F + 0000004D656D6F2076616C75652028323629080000000000000000003B402C00 + 000055736520436F7265204C616220446174612041636365737320436F6D706F + 6E656E7473202121212028323729080000000000C6BF58C8CC420F0000004D65 + 6D6F2076616C75652028323729080000000000000000003C402C000000557365 + 20436F7265204C616220446174612041636365737320436F6D706F6E656E7473 + 202121212028323829080000000000C6BF58C8CC420F0000004D656D6F207661 + 6C75652028323829080000000000000000003D402C00000055736520436F7265 + 204C616220446174612041636365737320436F6D706F6E656E74732021212120 + 28323929080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028 + 323929080000000000000000003E402C00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202833302908 + 0000000000C6BF58C8CC420F0000004D656D6F2076616C756520283330290800 + 00000000000000003F402C00000055736520436F7265204C6162204461746120 + 41636365737320436F6D706F6E656E7473202121212028333129080000000000 + C6BF58C8CC420F0000004D656D6F2076616C7565202833312908000000000000 + 00000040402C00000055736520436F7265204C61622044617461204163636573 + 7320436F6D706F6E656E7473202121212028333229080000000000C6BF58C8CC + 420F0000004D656D6F2076616C75652028333229080000000000000000804040 + 2C00000055736520436F7265204C616220446174612041636365737320436F6D + 706F6E656E7473202121212028333329080000000000C6BF58C8CC420F000000 + 4D656D6F2076616C756520283333290800000000000000000041402C00000055 + 736520436F7265204C616220446174612041636365737320436F6D706F6E656E + 7473202121212028333429080000000000C6BF58C8CC420F0000004D656D6F20 + 76616C756520283334290800000000000000008041402C00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 212028333529080000000000C6BF58C8CC420F0000004D656D6F2076616C7565 + 20283335290800000000000000000042402C00000055736520436F7265204C61 + 6220446174612041636365737320436F6D706F6E656E74732021212120283336 + 29080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028333629 + 0800000000000000008042402C00000055736520436F7265204C616220446174 + 612041636365737320436F6D706F6E656E747320212121202833372908000000 + 0000C6BF58C8CC420F0000004D656D6F2076616C756520283337290800000000 + 000000000043402C00000055736520436F7265204C6162204461746120416363 + 65737320436F6D706F6E656E7473202121212028333829080000000000C6BF58 + C8CC420F0000004D656D6F2076616C7565202833382908000000000000000080 + 43402C00000055736520436F7265204C61622044617461204163636573732043 + 6F6D706F6E656E7473202121212028333929080000000000C6BF58C8CC420F00 + 00004D656D6F2076616C756520283339290800000000000000000044402C0000 + 0055736520436F7265204C616220446174612041636365737320436F6D706F6E + 656E7473202121212028343029080000000000C6BF58C8CC420F0000004D656D + 6F2076616C756520283430290800000000000000008044402C00000055736520 + 436F7265204C616220446174612041636365737320436F6D706F6E656E747320 + 2121212028343129080000000000C6BF58C8CC420F0000004D656D6F2076616C + 756520283431290800000000000000000045402C00000055736520436F726520 + 4C616220446174612041636365737320436F6D706F6E656E7473202121212028 + 343229080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202834 + 32290800000000000000008045402C00000055736520436F7265204C61622044 + 6174612041636365737320436F6D706F6E656E74732021212120283433290800 + 00000000C6BF58C8CC420F0000004D656D6F2076616C75652028343329080000 + 0000000000000046402C00000055736520436F7265204C616220446174612041 + 636365737320436F6D706F6E656E7473202121212028343429080000000000C6 + BF58C8CC420F0000004D656D6F2076616C756520283434290800000000000000 + 008046402C00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E7473202121212028343529080000000000C6BF58C8CC42 + 0F0000004D656D6F2076616C756520283435290800000000000000000047402C + 00000055736520436F7265204C616220446174612041636365737320436F6D70 + 6F6E656E7473202121212028343629080000000000C6BF58C8CC420F0000004D + 656D6F2076616C756520283436290800000000000000008047402C0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 73202121212028343729080000000000C6BF58C8CC420F0000004D656D6F2076 + 616C756520283437290800000000000000000048402C00000055736520436F72 + 65204C616220446174612041636365737320436F6D706F6E656E747320212121 + 2028343829080000000000C6BF58C8CC420F0000004D656D6F2076616C756520 + 283438290800000000000000008048402C00000055736520436F7265204C6162 + 20446174612041636365737320436F6D706F6E656E7473202121212028343929 + 080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202834392908 + 00000000000000000049402C00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283530290800000000 + 00C6BF58C8CC420F0000004D656D6F2076616C75652028353029080000000000 + 0000008049402C00000055736520436F7265204C616220446174612041636365 + 737320436F6D706F6E656E7473202121212028353129080000000000C6BF58C8 + CC420F0000004D656D6F2076616C75652028353129080000000000000000004A + 402C00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E7473202121212028353229080000000000C6BF58C8CC420F0000 + 004D656D6F2076616C75652028353229080000000000000000804A402C000000 + 55736520436F7265204C616220446174612041636365737320436F6D706F6E65 + 6E7473202121212028353329080000000000C6BF58C8CC420F0000004D656D6F + 2076616C75652028353329080000000000000000004B402C0000005573652043 + 6F7265204C616220446174612041636365737320436F6D706F6E656E74732021 + 21212028353429080000000000C6BF58C8CC420F0000004D656D6F2076616C75 + 652028353429080000000000000000804B402C00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202835 + 3529080000000000C6BF58C8CC420F0000004D656D6F2076616C756520283535 + 29080000000000000000004C402C00000055736520436F7265204C6162204461 + 74612041636365737320436F6D706F6E656E7473202121212028353629080000 + 000000C6BF58C8CC420F0000004D656D6F2076616C7565202835362908000000 + 0000000000804C402C00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E7473202121212028353729080000000000C6BF + 58C8CC420F0000004D656D6F2076616C75652028353729080000000000000000 + 004D402C00000055736520436F7265204C616220446174612041636365737320 + 436F6D706F6E656E7473202121212028353829080000000000C6BF58C8CC420F + 0000004D656D6F2076616C75652028353829080000000000000000804D402C00 + 000055736520436F7265204C616220446174612041636365737320436F6D706F + 6E656E7473202121212028353929080000000000C6BF58C8CC420F0000004D65 + 6D6F2076616C75652028353929080000000000000000004E402C000000557365 + 20436F7265204C616220446174612041636365737320436F6D706F6E656E7473 + 202121212028363029080000000000C6BF58C8CC420F0000004D656D6F207661 + 6C75652028363029080000000000000000804E402C00000055736520436F7265 + 204C616220446174612041636365737320436F6D706F6E656E74732021212120 + 28363129080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028 + 363129080000000000000000004F402C00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202836322908 + 0000000000C6BF58C8CC420F0000004D656D6F2076616C756520283632290800 + 00000000000000804F402C00000055736520436F7265204C6162204461746120 + 41636365737320436F6D706F6E656E7473202121212028363329080000000000 + C6BF58C8CC420F0000004D656D6F2076616C7565202836332908000000000000 + 00000050402C00000055736520436F7265204C61622044617461204163636573 + 7320436F6D706F6E656E7473202121212028363429080000000000C6BF58C8CC + 420F0000004D656D6F2076616C75652028363429080000000000000000405040 + 2C00000055736520436F7265204C616220446174612041636365737320436F6D + 706F6E656E7473202121212028363529080000000000C6BF58C8CC420F000000 + 4D656D6F2076616C756520283635290800000000000000008050402C00000055 + 736520436F7265204C616220446174612041636365737320436F6D706F6E656E + 7473202121212028363629080000000000C6BF58C8CC420F0000004D656D6F20 + 76616C75652028363629080000000000000000C050402C00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 212028363729080000000000C6BF58C8CC420F0000004D656D6F2076616C7565 + 20283637290800000000000000000051402C00000055736520436F7265204C61 + 6220446174612041636365737320436F6D706F6E656E74732021212120283638 + 29080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028363829 + 0800000000000000004051402C00000055736520436F7265204C616220446174 + 612041636365737320436F6D706F6E656E747320212121202836392908000000 + 0000C6BF58C8CC420F0000004D656D6F2076616C756520283639290800000000 + 000000008051402C00000055736520436F7265204C6162204461746120416363 + 65737320436F6D706F6E656E7473202121212028373029080000000000C6BF58 + C8CC420F0000004D656D6F2076616C75652028373029080000000000000000C0 + 51402C00000055736520436F7265204C61622044617461204163636573732043 + 6F6D706F6E656E7473202121212028373129080000000000C6BF58C8CC420F00 + 00004D656D6F2076616C756520283731290800000000000000000052402C0000 + 0055736520436F7265204C616220446174612041636365737320436F6D706F6E + 656E7473202121212028373229080000000000C6BF58C8CC420F0000004D656D + 6F2076616C756520283732290800000000000000004052402C00000055736520 + 436F7265204C616220446174612041636365737320436F6D706F6E656E747320 + 2121212028373329080000000000C6BF58C8CC420F0000004D656D6F2076616C + 756520283733290800000000000000008052402C00000055736520436F726520 + 4C616220446174612041636365737320436F6D706F6E656E7473202121212028 + 373429080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202837 + 3429080000000000000000C052402C00000055736520436F7265204C61622044 + 6174612041636365737320436F6D706F6E656E74732021212120283735290800 + 00000000C6BF58C8CC420F0000004D656D6F2076616C75652028373529080000 + 0000000000000053402C00000055736520436F7265204C616220446174612041 + 636365737320436F6D706F6E656E7473202121212028373629080000000000C6 + BF58C8CC420F0000004D656D6F2076616C756520283736290800000000000000 + 004053402C00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E7473202121212028373729080000000000C6BF58C8CC42 + 0F0000004D656D6F2076616C756520283737290800000000000000008053402C + 00000055736520436F7265204C616220446174612041636365737320436F6D70 + 6F6E656E7473202121212028373829080000000000C6BF58C8CC420F0000004D + 656D6F2076616C75652028373829080000000000000000C053402C0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 73202121212028373929080000000000C6BF58C8CC420F0000004D656D6F2076 + 616C756520283739290800000000000000000054402C00000055736520436F72 + 65204C616220446174612041636365737320436F6D706F6E656E747320212121 + 2028383029080000000000C6BF58C8CC420F0000004D656D6F2076616C756520 + 283830290800000000000000004054402C00000055736520436F7265204C6162 + 20446174612041636365737320436F6D706F6E656E7473202121212028383129 + 080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202838312908 + 00000000000000008054402C00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283832290800000000 + 00C6BF58C8CC420F0000004D656D6F2076616C75652028383229080000000000 + 000000C054402C00000055736520436F7265204C616220446174612041636365 + 737320436F6D706F6E656E7473202121212028383329080000000000C6BF58C8 + CC420F0000004D656D6F2076616C756520283833290800000000000000000055 + 402C00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E7473202121212028383429080000000000C6BF58C8CC420F0000 + 004D656D6F2076616C756520283834290800000000000000004055402C000000 + 55736520436F7265204C616220446174612041636365737320436F6D706F6E65 + 6E7473202121212028383529080000000000C6BF58C8CC420F0000004D656D6F + 2076616C756520283835290800000000000000008055402C0000005573652043 + 6F7265204C616220446174612041636365737320436F6D706F6E656E74732021 + 21212028383629080000000000C6BF58C8CC420F0000004D656D6F2076616C75 + 652028383629080000000000000000C055402C00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202838 + 3729080000000000C6BF58C8CC420F0000004D656D6F2076616C756520283837 + 290800000000000000000056402C00000055736520436F7265204C6162204461 + 74612041636365737320436F6D706F6E656E7473202121212028383829080000 + 000000C6BF58C8CC420F0000004D656D6F2076616C7565202838382908000000 + 00000000004056402C00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E7473202121212028383929080000000000C6BF + 58C8CC420F0000004D656D6F2076616C75652028383929080000000000000000 + 8056402C00000055736520436F7265204C616220446174612041636365737320 + 436F6D706F6E656E7473202121212028393029080000000000C6BF58C8CC420F + 0000004D656D6F2076616C75652028393029080000000000000000C056402C00 + 000055736520436F7265204C616220446174612041636365737320436F6D706F + 6E656E7473202121212028393129080000000000C6BF58C8CC420F0000004D65 + 6D6F2076616C756520283931290800000000000000000057402C000000557365 + 20436F7265204C616220446174612041636365737320436F6D706F6E656E7473 + 202121212028393229080000000000C6BF58C8CC420F0000004D656D6F207661 + 6C756520283932290800000000000000004057402C00000055736520436F7265 + 204C616220446174612041636365737320436F6D706F6E656E74732021212120 + 28393329080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028 + 3933290800000000000000008057402C00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202839342908 + 0000000000C6BF58C8CC420F0000004D656D6F2076616C756520283934290800 + 00000000000000C057402C00000055736520436F7265204C6162204461746120 + 41636365737320436F6D706F6E656E7473202121212028393529080000000000 + C6BF58C8CC420F0000004D656D6F2076616C7565202839352908000000000000 + 00000058402C00000055736520436F7265204C61622044617461204163636573 + 7320436F6D706F6E656E7473202121212028393629080000000000C6BF58C8CC + 420F0000004D656D6F2076616C75652028393629080000000000000000405840 + 2C00000055736520436F7265204C616220446174612041636365737320436F6D + 706F6E656E7473202121212028393729080000000000C6BF58C8CC420F000000 + 4D656D6F2076616C756520283937290800000000000000008058402C00000055 + 736520436F7265204C616220446174612041636365737320436F6D706F6E656E + 7473202121212028393829080000000000C6BF58C8CC420F0000004D656D6F20 + 76616C75652028393829080000000000000000C058402C00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 212028393929080000000000C6BF58C8CC420F0000004D656D6F2076616C7565 + 20283939290800000000000000000059402D00000055736520436F7265204C61 + 6220446174612041636365737320436F6D706F6E656E74732021212120283130 + 3029080000000000C6BF58C8CC42100000004D656D6F2076616C756520283130 + 3029} + end + object DataSource: TDataSource + DataSet = VirtualTable + OnStateChange = DataSourceStateChange + OnDataChange = DataSourceDataChange + Left = 448 + Top = 2 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.bdsproj b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.bdsproj new file mode 100644 index 0000000..fd9682c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.bdsproj @@ -0,0 +1,173 @@ + + + + + + + + + + + + MSSQLCompact.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 2 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + . + . + . + . + $(DELPHI)\Lib\Debug + vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;vcldbx;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;CRControls70;dac70;dacvcl70;sdacvcl70;sdac70 + + . + False + + + + + + False + + + + + + False + + + + $00000000 + D:\Program Files\Borland\Delphi7\Bin\ + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.cfg b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.cfg new file mode 100644 index 0000000..7b4f4e1 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q+ +-$R+ +-$S- +-$T- +-$U- +-$V+ +-$W+ +-$X+ +-$Y+ +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"." +-N"." +-LE"." +-LN"." +-U"d:\program files\borland\delphi7\Lib\Debug" +-O"d:\program files\borland\delphi7\Lib\Debug" +-I"d:\program files\borland\delphi7\Lib\Debug" +-R"d:\program files\borland\delphi7\Lib\Debug" +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.dpr b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.dpr new file mode 100644 index 0000000..cb5ff0a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.dpr @@ -0,0 +1,13 @@ +program MSSQLCompact; + +uses + Forms, + Main in 'Main.pas' {fmMain}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TfmMain, fmMain); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.res b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact.res new file mode 100644 index 0000000000000000000000000000000000000000..3adc0361f3a00f24e1a79ea56f342ee10caf9e11 GIT binary patch literal 876 zcmZuw!D`e{6g`;)j6~`bgm%{QM$1G2a#qggXHZrr3(XD^jD^2Biv0~ z`5QtvE@xN4((Ab|$vA?SIeGWIbMAeQ_vQh>j8N^t^q=@S8TF8!z-!a#!)P=;WilfU zi2%biYyKYEZ-dM zKwZ}&*MGS;WQdNBhq*@DYecWha+n~`@TMrv%R}#|n>L&5m1R-9_dKCKajtk*eq3?q z+&nGLeL-AH=6N|Z5XrYGk2*%a*ZaW*ww+5|n)-UgT;R&h_t*KCTgtnBJ=g+sHvAp+ z+!}7}yY$&&;5?G8)VW<5c-*wpNtz-V4CI-YMgtofPh>FEVh5Ut$OrG^q0>MPw068N zJm^aVuz;i`3FuBayES?}O0{e9=?hk?F~}AtM$GRDtStxv z!%JOmK$nm3c^Tv2mjT!@+^ylBIdNd%-^;M07nfIB>38k!LhU{U`s3weN)L#TxF9;> p8*!tmw@=Y;A8-r^Nba7rBEjN=&V@4{X~fY~haufkqYfIpyE(PjVu literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.bdsproj b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.bdsproj new file mode 100644 index 0000000..91f1b01 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.bdsproj @@ -0,0 +1,183 @@ + + + + + + + + + + + + MSSQLCompact_VclNet.dpr + + + + + + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + + + + + + + + d:\windows\microsoft.net\framework\v1.1.4322 + d:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll + + + True + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.dpr b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.dpr new file mode 100644 index 0000000..a602fe9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.dpr @@ -0,0 +1,15 @@ +program MSSQLCompact_VclNet; + +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\system.drawing.dll'} + +uses + Forms, + Main in 'Main.pas' {fmMain}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TfmMain, fmMain); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.res b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.res new file mode 100644 index 0000000000000000000000000000000000000000..3adc0361f3a00f24e1a79ea56f342ee10caf9e11 GIT binary patch literal 876 zcmZuw!D`e{6g`;)j6~`bgm%{QM$1G2a#qggXHZrr3(XD^jD^2Biv0~ z`5QtvE@xN4((Ab|$vA?SIeGWIbMAeQ_vQh>j8N^t^q=@S8TF8!z-!a#!)P=;WilfU zi2%biYyKYEZ-dM zKwZ}&*MGS;WQdNBhq*@DYecWha+n~`@TMrv%R}#|n>L&5m1R-9_dKCKajtk*eq3?q z+&nGLeL-AH=6N|Z5XrYGk2*%a*ZaW*ww+5|n)-UgT;R&h_t*KCTgtnBJ=g+sHvAp+ z+!}7}yY$&&;5?G8)VW<5c-*wpNtz-V4CI-YMgtofPh>FEVh5Ut$OrG^q0>MPw068N zJm^aVuz;i`3FuBayES?}O0{e9=?hk?F~}AtM$GRDtStxv z!%JOmK$nm3c^Tv2mjT!@+^ylBIdNd%-^;M07nfIB>38k!LhU{U`s3weN)L#TxF9;> p8*!tmw@=Y;A8-r^Nba7rBEjN=&V@4{X~fY~haufkqYfIpyE(PjVu literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/Main.dfm b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/Main.dfm new file mode 100644 index 0000000..0dca79a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/Main.dfm @@ -0,0 +1,353 @@ +object fmMain: TfmMain + Left = 213 + Top = 374 + Width = 975 + Height = 417 + Caption = + 'MSSQL Data Access Demo - using Compact Edition of the MS SQL Ser' + + 'ver' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnClose = FormClose + OnCreate = FormCreate + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object DBGrid: TDBGrid + Left = 0 + Top = 49 + Width = 967 + Height = 315 + Align = alClient + DataSource = DataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 967 + Height = 49 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 700 + Height = 47 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 24 + Width = 82 + Height = 22 + Caption = 'Open' + Enabled = False + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 24 + Width = 82 + Height = 22 + Caption = 'Close' + Enabled = False + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btDisconnect: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Disconnect' + Enabled = False + Flat = True + Transparent = False + OnClick = btDisconnectClick + end + object btConnect: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Connect' + Flat = True + Transparent = False + OnClick = btConnectClick + end + object DBNavigator: TDBNavigator + Left = 469 + Top = 24 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel2: TPanel + Left = 167 + Top = 1 + Width = 532 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object Label1: TLabel + Left = 6 + Top = 4 + Width = 78 + Height = 13 + Caption = 'Database name:' + end + object SpeedButton2: TSpeedButton + Left = 511 + Top = 0 + Width = 22 + Height = 22 + Caption = '...' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = SpeedButton2Click + end + object edDBName: TEdit + Left = 88 + Top = 1 + Width = 423 + Height = 21 + TabOrder = 0 + Text = '.\test.sdf' + end + end + object pnTableName: TPanel + Left = 167 + Top = 24 + Width = 301 + Height = 22 + BevelOuter = bvNone + TabOrder = 2 + object lbTableName: TLabel + Left = 6 + Top = 4 + Width = 59 + Height = 13 + Caption = 'Table name:' + Enabled = False + end + object cbTableName: TComboBox + Left = 88 + Top = 1 + Width = 211 + Height = 21 + Enabled = False + ItemHeight = 13 + TabOrder = 0 + OnDropDown = cbTableNameDropDown + end + end + end + object Panel3: TPanel + Left = 705 + Top = 0 + Width = 257 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object btDrop: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Drop' + Flat = True + Transparent = False + OnClick = btDropClick + end + object btCreate: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Create' + Flat = True + Transparent = False + OnClick = btCreateClick + end + object Panel4: TPanel + Left = 167 + Top = 1 + Width = 89 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbDebug: TCheckBox + Left = 13 + Top = 3 + Width = 67 + Height = 17 + Caption = 'Debug' + Checked = True + State = cbChecked + TabOrder = 0 + OnClick = cbDebugClick + end + end + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 364 + Width = 967 + Height = 19 + Panels = < + item + Text = 'State' + Width = 50 + end> + SimplePanel = False + end + object DataSource: TDataSource + DataSet = MSTable + Left = 320 + Top = 144 + end + object MSTable: TMSTable + TableName = 'EMP' + Connection = MSConnection + Debug = True + Left = 288 + Top = 144 + end + object scCreate: TMSScript + SQL.Strings = ( + 'CREATE TABLE EMP (' + ' EMPNO INT PRIMARY KEY,' + ' ENAME NVARCHAR(10),' + ' JOB NVARCHAR(9),' + ' MGR INT,' + ' HIREDATE DATETIME,' + ' SAL FLOAT,' + ' COMM FLOAT' + ');' + '' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7492, '#39'SMITH'#39','#39'CLERK'#39',7902,'#39'1980-12-17'#39',800,600);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7499,'#39'ALLEN'#39','#39'SALESMAN'#39',7698,'#39'1981-2-20'#39',1600,300);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7521,'#39'WARD'#39','#39'SALESMAN'#39',7698,'#39'1981-2-22'#39',1250,500);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7566,'#39'JONES'#39','#39'MANAGER'#39',7839,'#39'1981-4-2'#39',2975,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7654,'#39'MARTIN'#39','#39'SALESMAN'#39',7698,'#39'1981-9-28'#39',1250,1400);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7698,'#39'BLAKE'#39','#39'MANAGER'#39',7839,'#39'1981-5-1'#39',2850,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7782,'#39'CLARK'#39','#39'MANAGER'#39',7839,'#39'1981-6-9'#39',2450,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7788,'#39'SCOTT'#39','#39'ANALYST'#39',7566,'#39'1987-7-13'#39',3000,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7839,'#39'KING'#39','#39'PRESIDENT'#39',NULL,'#39'1981-11-17'#39',5000,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7844,'#39'TURNER'#39','#39'SALESMAN'#39',7698,'#39'1981-9-8'#39',1500,0);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7876,'#39'ADAMS'#39','#39'CLERK'#39',7788,'#39'1987-7-13'#39',1100,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7900,'#39'JAMES'#39','#39'CLERK'#39',7698,'#39'1981-12-3'#39',950,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7902,'#39'FORD'#39','#39'ANALYST'#39',7566,'#39'1981-12-3'#39',3000,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7934,'#39'MILLER'#39','#39'CLERK'#39',7782,'#39'1982-1-23'#39',1300,NULL);') + Debug = True + OnError = scError + Connection = MSConnection + Left = 735 + Top = 59 + end + object OpenDialog: TOpenDialog + Filter = 'MS SQL Database Files (*.sdf)|*.sdf|All Files|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofEnableSizing] + Left = 130 + Top = 145 + end + object MSConnection: TMSConnection + Options.Provider = prCompact + AfterConnect = MSConnectionAfterConnect + AfterDisconnect = MSConnectionAfterDisconnect + Left = 210 + Top = 145 + end + object scDrop: TMSScript + SQL.Strings = ( + 'DROP TABLE EMP;') + Debug = True + OnError = scError + Connection = MSConnection + Left = 805 + Top = 59 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/Main.pas b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/Main.pas new file mode 100644 index 0000000..bb239af --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/Main.pas @@ -0,0 +1,268 @@ +unit Main; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, + DBAccess, DAScript, Buttons, MSAccess, MSScript, OLEDBAccess, DB, MemDS, SDACVcl; + +type + TfmMain = class(TForm) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + StatusBar: TStatusBar; + MSTable: TMSTable; + scCreate: TMSScript; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + OpenDialog: TOpenDialog; + MSConnection: TMSConnection; + btDisconnect: TSpeedButton; + btConnect: TSpeedButton; + Panel2: TPanel; + edDBName: TEdit; + Label1: TLabel; + pnTableName: TPanel; + lbTableName: TLabel; + cbTableName: TComboBox; + SpeedButton2: TSpeedButton; + Panel3: TPanel; + Panel4: TPanel; + btDrop: TSpeedButton; + btCreate: TSpeedButton; + cbDebug: TCheckBox; + scDrop: TMSScript; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure MSConnectionAfterConnect(Sender: TObject); + procedure MSConnectionAfterDisconnect(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure SpeedButton2Click(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + procedure btCreateClick(Sender: TObject); + procedure btDropClick(Sender: TObject); + procedure cbDebugClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure cbTableNameDropDown(Sender: TObject); + procedure scError(Sender: TObject; E: Exception; SQL: String; + var Action: TErrorAction); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + private + Closing: boolean; + procedure ShowState; + procedure CheckConnected; + public + { Public declarations } + end; + +var + fmMain: TfmMain; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFNDEF VER130} +{$IFNDEF VER140} +{$IFNDEF CLR} + {$DEFINE XPMAN} + {$R WindowsXP.res} +{$ENDIF} +{$ENDIF} +{$ENDIF} + +{$IFDEF XPMAN} +uses + UxTheme; +{$ENDIF} + +procedure TfmMain.ShowState; +var + St:string; + + procedure AddSt(S:string); + begin + if St <> '' then + St:= St + ', '; + St:= St + S; + end; + +begin + St:= ''; + + if MSTable.Active then + AddSt('Active') + else + AddSt('Inactive'); + + StatusBar.Panels[0].Text:= St; +end; + +procedure TfmMain.CheckConnected; +begin + try + MSConnection.Database := edDBName.Text; + + if not FileExists(MSConnection.Database) then + if MessageDlg('Database file ' + MSConnection.Database + ' does not exists.' + + #13#10+'Create database with this name?', mtConfirmation, [mbYes,mbNo,mbCancel], 0) <> mrYes then + Exit; + + MSConnection.Open; // database file will be created automatically if it does not exist + finally + ShowState; + end; +end; + +procedure TfmMain.btOpenClick(Sender: TObject); +begin + try + MSTable.TableName := cbTableName.Text; + MSTable.Open; + finally + ShowState; + end; +end; + +procedure TfmMain.btCloseClick(Sender: TObject); +begin + MSTable.Close; + ShowState; +end; + +procedure TfmMain.FormShow(Sender: TObject); +begin + ShowState; +end; + +procedure TfmMain.MSConnectionAfterConnect(Sender: TObject); +begin + btConnect.Enabled := False; + btDisconnect.Enabled := True; + cbTableName.Enabled := True; + lbTableName.Enabled := True; + btOpen.Enabled := True; + btClose.Enabled := True; + MSConnection.GetTableNames(cbTableName.Items); + + if cbTableName.Items.Count > 0 then + cbTableName.ItemIndex := 0; +end; + +procedure TfmMain.MSConnectionAfterDisconnect(Sender: TObject); +begin + if Closing then // to prevent AV on form close + Exit; + + btConnect.Enabled := True; + btDisconnect.Enabled := False; + cbTableName.Enabled := False; + lbTableName.Enabled := False; + btOpen.Enabled := False; + btClose.Enabled := False; +end; + +procedure TfmMain.btConnectClick(Sender: TObject); +begin + CheckConnected; +end; + +procedure TfmMain.SpeedButton2Click(Sender: TObject); +begin + if OpenDialog.Execute then + edDBName.Text := OpenDialog.FileName; +end; + +procedure TfmMain.btDisconnectClick(Sender: TObject); +begin + MSConnection.Close; +end; + +procedure TfmMain.btCreateClick(Sender: TObject); +begin + CheckConnected; + scCreate.Execute; +end; + +procedure TfmMain.btDropClick(Sender: TObject); +begin + CheckConnected; + scDrop.Execute; +end; + +procedure TfmMain.cbDebugClick(Sender: TObject); +begin + MSTable.Debug := cbDebug.Checked; + scCreate.Debug := cbDebug.Checked; + scDrop.Debug := cbDebug.Checked; +end; + +procedure TfmMain.FormCreate(Sender: TObject); +{$IFDEF XPMAN} + procedure UpdateStyle(Control: TWinControl); + var + Panel: TPanel; + i: integer; + begin + for i := 0 to Control.ControlCount - 1 do begin + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := False + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := False; + if Control.Controls[i] is TWinControl then begin + if (Control.Controls[i] is TPanel) then begin + Panel := TPanel(Control.Controls[i]); + Panel.ParentBackground := False; + Panel.Color := clBtnFace; + end; + UpdateStyle(TWinControl(Control.Controls[i])); + end; + end; + end; +{$ENDIF} +begin + cbDebugClick(self); + Closing := False; +{$IFDEF XPMAN} + if UseThemes then + UpdateStyle(Self); +{$ENDIF} +end; + +procedure TfmMain.cbTableNameDropDown(Sender: TObject); +begin + MSConnection.GetTableNames(cbTableName.Items); +end; + +procedure TfmMain.scError(Sender: TObject; E: Exception; SQL: String; + var Action: TErrorAction); +begin + if MessageDlg('An error with the following message ocurred:' + #13#10 + + E.Message , mtError, [mbAbort,mbIgnore], 0) = mrAbort then + Action := eaAbort + else + Action := eaContinue; + +end; + +procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction); +begin + Closing := True; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/ReadMe.txt new file mode 100644 index 0000000..d060c63 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/ReadMe.txt @@ -0,0 +1,7 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demonstrates how to create applications that work with MS SQL Server +Compact Edition. Demo connects to a database and opens a table. If the +specified database does not exists, it will be created automatically. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/test.sdf b/internal/4.10.0.10/1/Demos/Win32/TechnologySpecific/MSSQLCompact/test.sdf new file mode 100644 index 0000000000000000000000000000000000000000..bc4229a49e730167ed49e79274acf1a1b0318f1b GIT binary patch literal 36864 zcmeI5TWB0r7{||^nVr3ujJ=6fY}(=l1;uTlwxHD6X2&$yTe7=Sd`eoepcL6QZ9yn? z>{BnaBzU8~G}U53L{cmGBrI6*@?!f?e6W-hCG^3ELLSAg-*@($Wp=ZM*1EN&|8H_; zzBBWE=YP&`W&^XAGgC*u`Ad*VUXd;P!3m00ck)1V8`;KmY_l00ck)1QsSR z6B~}zoRl*aT@(%MYu1=`UV3smvMMq`i34X-d*ikzJl#l?J_L4aYg8>p>maj2h|7JA zqX))ylsM!muXex_K{P1m2P>QVbABnydsSMN(w6A7Z<}eyJq{4HT`Db|%lUqRpnOj4d-8wv93~Sc5hZ0jJ z@v%=@68m%MQno#D2PN`I*{>xW>7#J@3<-v?!Xl4edNYb3kBPO%@q1Q;GHSwvuTq^jbdFSLDrE-tin!Qa;dTIx+ zh)+6`&X-%Rp4z35;uWJfeY7QQD4qA)()c=UvN35bZ0z8rVky&xrgok3_=K=6+tb*J z;rBf4sR8B(>1r)CyV*Ph2LwO>1V8`;KmY_l00ck)1a32d-w#;wb1HjwS#l#4>q|@i zc+!#+la|~)^s9JLG&tD{@SS1p=zfm!!?ib_yt#5go2LU+{ z009sH0T2KI5C8!X009sH0T2Lz|C9j#o}2B1ua}Dm-Rtx3`q|93QNtPpKmY_l00ck) z1V8`;KmY_l00cnbZYDs}wJCd4zTRWmsd@ALIXoF$7tH8(tNku?xob@(b<1YkH6b(% z0w4eaAOHd&00JNY0w4eaAaKtUcxU#^e%l@s<{s42_x+|W#%TUO5%G7%GO>(1>7J&t z&rP`N+|_Q6M$b`R>sw3`xRf($<*|Lu+``zbM8!C{!9&3SRb&sVQi>b!!_QsOb zi4k{1g+w}sC>^)z?o&bXpMt8cq?T5zplIiyr`@&gVH)7W6nb2TTAf4JF&x#F-8o>y zecU~)0-VkPlO(cP1te5JynX2Zj^jOlp#uO2fB*=900@8p2!H?xfB*>GGX#Q1rXQSo zU}9;o_`DnRq>>_@qA&Z;Uio!Lls^C0v!Bs#0U8$X^5_5EYQO8JlWxilqg&PDXDswm zX+CS=RvSb<2!OyHOMqYNFc1I%5C8!X009sH0TB2<30!#S$RUU3|6i&*!Jq#pulcI> z1g~f6^*TQy-UM(>2!2e!4O-9}EEcWH=xF(^@#3~OUVC--xbXACswGwnR(kdNlfn+o zJZR0k-L~ks5LY|TR1nxflD^CkURZ!iq1Y;uqGrq}B4TAoQpJh5`c1@5$`oi)`uQ?u zvIR*p?cI)xC6sX0>iDKYU7!Eifo{f#MLgI!Jz?2SJlQKGvf^(7BOE7v4tn1Ev@id8Qg`dmgz{#VG`-3i15N9n+HpNCS7S`#!5Xp zJxV%;pJ{QiR-!2?=UdQuIP_=&727f#^UjMyBK(kquo;o%;hn}0>>xpNW`-9YPJc0< zS0PHJUZ1H45lI*SjaZCMPTNI5Dt+|M+}hB>D#O{)QQD4Qr&X1Y5s z&IuyN*Be{omE7rpjNB#{!VfOf?58EZ#UK0!Ak$ymk|OQe0;P0r zY^B1osB2iqI$Lxji@c z^z(f0dCq*b@n|qnpw6&!w&xVGJvIjmv#uZz@QH4iEbq*jcb2kJ#`(%r-xL z-Fo$uQ{Uno`eZjv--1|#-}?HbWBAj>kTVjn?V=$Nu?R=au?1hE01dHZLQwWj@T+U< z!9d{l%*e{#UUamAqhr%> z6pIALuZg$fBdV#XiBZAb-Q9F7=`T%ctunB;Wx#JrVXRO5X!RKxldV4-4zt;82A{{{ zZEU1x4gb3dZ)d_yea-)@rX#cYfk1%6;V}3jk%-P;@+Fni;Fxwy%UC8HWn}Y%!C-lL zc{U$|e~E!byTkM)K5+~YfsUhqT;0OE!kIg{KN-8hQ6QD z@-iNQb{K7aJ{rAGW@uY{Mp5DEN2g>F@8>q!E#P!x4fsaS?GFFrmZ + Variables = <> + Style = <> + object Page1: TfrxReportPage + PaperWidth = 210 + PaperHeight = 297 + PaperSize = 9 + LeftMargin = 5 + RightMargin = 5 + TopMargin = 5 + BottomMargin = 5 + Columns = 1 + ColumnWidth = 210 + ColumnPositions.Strings = ( + '0') + PrintOnPreviousPage = True + object Band1: TfrxPageFooter + Height = 22.67718 + Top = 298.58287 + Width = 755.906 + object Memo5: TfrxMemoView + Left = 3.77953 + Top = 3.77953000000002 + Width = 706.77211 + Height = 15.11812 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [] + Frame.Typ = [ftTop] + Frame.Width = 2 + HAlign = haRight + Memo.UTF8 = ( + '[Page#]') + ParentFont = False + end + end + object Band2: TfrxReportTitle + Height = 26.45671 + Top = 18.89765 + Width = 755.906 + object Memo6: TfrxMemoView + Left = 3.77953 + Top = 3.77953 + Width = 706.77211 + Height = 18.89765 + Color = clTeal + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + HAlign = haCenter + Memo.UTF8 = ( + 'Dept') + ParentFont = False + VAlign = vaBottom + end + end + object Band3: TfrxPageHeader + Height = 22.67718 + Top = 68.03154 + Width = 755.906 + object Memo22: TfrxMemoView + Left = 3.77953 + Top = 3.77952999999999 + Width = 706.77211 + Height = 15.11812 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [fsBold] + Frame.Typ = [ftTop] + Frame.Width = 2 + ParentFont = False + end + end + object Band4: TfrxMasterData + Height = 45.35436 + Top = 151.1812 + Width = 755.906 + Columns = 1 + ColumnWidth = 200 + ColumnGap = 20 + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + RowCount = 0 + object Memo23: TfrxMemoView + Left = 11.33859 + Width = 113.385826771654 + Height = 18.89765 + Color = clNavy + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [] + Frame.Typ = [ftTop] + Memo.UTF8 = ( + 'No') + ParentFont = False + VAlign = vaCenter + end + object Memo24: TfrxMemoView + Left = 11.33859 + Top = 18.89765 + Width = 113.385826771654 + Height = 26.45671 + Color = clNavy + DataField = 'DEPTNO' + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsItalic] + Memo.UTF8 = ( + 'Dept.DeptNo') + ParentFont = False + VAlign = vaCenter + end + object Memo25: TfrxMemoView + Left = 124.72440945 + Width = 302.36220472 + Height = 18.89765 + Color = clNavy + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [] + Frame.Typ = [ftTop] + Memo.UTF8 = ( + 'Name') + ParentFont = False + VAlign = vaCenter + end + object Memo26: TfrxMemoView + Left = 427.086614173228 + Width = 162.51979 + Height = 18.89765 + Color = clNavy + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [] + Frame.Typ = [ftTop] + Memo.UTF8 = ( + 'Location') + ParentFont = False + VAlign = vaCenter + end + object Memo27: TfrxMemoView + Left = 124.72440945 + Top = 18.89765 + Width = 302.362204724409 + Height = 26.45671 + Color = clNavy + DataField = 'DNAME' + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsItalic] + Memo.UTF8 = ( + 'Dept.DName') + ParentFont = False + VAlign = vaCenter + end + object Memo28: TfrxMemoView + Left = 427.08661417 + Top = 18.89765 + Width = 162.51979 + Height = 26.45671 + Color = clNavy + DataField = 'LOC' + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsItalic] + Memo.UTF8 = ( + 'Dept.Loc') + ParentFont = False + VAlign = vaCenter + end + object Memo29: TfrxMemoView + Left = 589.606299212598 + Width = 120.944881889764 + Height = 45.35436 + Color = clNavy + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsBold, fsItalic] + Frame.Typ = [ftRight, ftTop] + ParentFont = False + VAlign = vaCenter + end + object Memo7: TfrxMemoView + Left = 3.77953 + Width = 7.55906 + Height = 45.35436 + Color = clNavy + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsBold, fsItalic] + Frame.Typ = [ftLeft, ftTop] + ParentFont = False + VAlign = vaCenter + end + end + object Band5: TfrxDetailData + Height = 18.89765 + Top = 219.21274 + Width = 755.906 + Columns = 1 + ColumnWidth = 200 + ColumnGap = 20 + DataSet = ReportData.EmpDS + DataSetName = 'Emp' + RowCount = 0 + object Memo4: TfrxMemoView + Left = 3.77953 + Width = 3.77953 + Height = 18.89765 + Color = clSilver + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [fsBold] + Frame.Typ = [ftLeft] + ParentFont = False + end + object Memo8: TfrxMemoView + Left = 7.55906 + Width = 117.16543 + Height = 18.89765 + Color = clSilver + DataField = 'ENAME' + DataSet = ReportData.EmpDS + DataSetName = 'Emp' + Memo.UTF8 = ( + 'ENAME') + end + object Memo9: TfrxMemoView + Left = 124.72449 + Width = 362.83488 + Height = 18.89765 + Color = clSilver + DataField = 'JOB' + DataSet = ReportData.EmpDS + DataSetName = 'Emp' + Frame.Typ = [ftRight] + Memo.UTF8 = ( + 'JOB') + end + object Memo1: TfrxMemoView + Left = 487.55937 + Width = 222.99214795 + Height = 18.89765 + Color = clSilver + DataField = 'SAL' + DataSet = ReportData.EmpDS + DataSetName = 'Emp' + Frame.Typ = [ftRight] + Memo.UTF8 = ( + 'SAL') + end + end + end + end + object frxDesigner1: TfrxDesigner + DefaultScriptLanguage = 'PascalScript' + DefaultFont.Charset = DEFAULT_CHARSET + DefaultFont.Color = clWindowText + DefaultFont.Height = -13 + DefaultFont.Name = 'Arial' + DefaultFont.Style = [] + DefaultLeftMargin = 10 + DefaultRightMargin = 10 + DefaultTopMargin = 10 + DefaultBottomMargin = 10 + DefaultPaperSize = 9 + DefaultOrientation = poPortrait + Restrictions = [] + RTLLanguage = False + Left = 260 + Top = 144 + end + object frxBarCodeObject1: TfrxBarCodeObject + Left = 228 + Top = 208 + end + object frxRichObject1: TfrxRichObject + Left = 228 + Top = 176 + end + object frxChartObject1: TfrxChartObject + Left = 260 + Top = 176 + end + object frxDialogControls1: TfrxDialogControls + Left = 292 + Top = 176 + end + object ImageList1: TImageList + Left = 324 + Top = 144 + Bitmap = { + 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000008400000084000000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000008400000000000000000000008400000084000000840000008400000084 + 0000008400000084000000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000840000FFFFFF0000000000000000000000000084848400C6C6C600C6C6 + C600FFFFFF00FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000084 + 000000840000FFFFFF0000000000C6C6C600FFFFFF0084848400000000000000 + 000000000000FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008400000084 + 0000FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000840000008400000084000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000084000000840000008400000084000000840000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000084000000FF0000008400000084000000840000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000084000000FF000000FF00000084000000840000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000840000008400000084000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00C6C6C6008484840084848400FFFFFF00FFFFFF00FFFFFF00FFFF + FF00848484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF008484840000000000000000008484840084848400FFFFFF00FFFF + FF00848484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00C6C6C6008484840000000000000000000000000000000000848484008484 + 8400848484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000084848400C6C6 + C600848484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008484 + 8400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00F1FFFFFF00000000E000FFFF00000000 + E000FFFF00000000E000FFFF00000000C000FFFF000000008000FC7F00000000 + 8000F83F000000008000F83F000000008000F83F000000008000FC7F00000000 + 8000FFFF000000008001FFFF000000008307FFFF0000000083C7FFFF00000000 + C7FFFFFF00000000EFFFFFFF0000000000000000000000000000000000000000 + 000000000000} + end + object frxOLEObject1: TfrxOLEObject + Left = 324 + Top = 176 + end + object frxCrossObject1: TfrxCrossObject + Left = 292 + Top = 208 + end + object frxDotMatrixExport1: TfrxDotMatrixExport + UseFileCache = True + ShowProgress = True + EscModel = 0 + GraphicFrames = False + SaveToFile = False + UseIniSettings = True + Left = 324 + Top = 208 + end + object frxBMPExport1: TfrxBMPExport + UseFileCache = True + ShowProgress = True + Left = 112 + Top = 248 + end + object frxJPEGExport1: TfrxJPEGExport + UseFileCache = True + ShowProgress = True + Left = 144 + Top = 248 + end + object frxTIFFExport1: TfrxTIFFExport + UseFileCache = True + ShowProgress = True + Left = 176 + Top = 248 + end + object frxTXTExport1: TfrxTXTExport + UseFileCache = True + ShowProgress = True + ScaleWidth = 1 + ScaleHeight = 1 + Borders = True + Pseudogrpahic = False + PageBreaks = True + OEMCodepage = False + EmptyLines = True + LeadSpaces = True + PrintAfter = False + PrinterDialog = True + UseSavedProps = True + Left = 240 + Top = 248 + end + object frxHTMLExport1: TfrxHTMLExport + UseFileCache = True + ShowProgress = True + FixedWidth = True + Background = False + Left = 272 + Top = 248 + end + object frxXLSExport1: TfrxXLSExport + UseFileCache = True + ShowProgress = True + AsText = False + Background = True + FastExport = True + PageBreaks = True + EmptyLines = True + Left = 304 + Top = 248 + end + object frxXMLExport1: TfrxXMLExport + UseFileCache = True + ShowProgress = True + Background = True + Creator = 'FastReport' + EmptyLines = True + Left = 336 + Top = 248 + end + object frxRTFExport1: TfrxRTFExport + UseFileCache = True + ShowProgress = True + Wysiwyg = True + Creator = 'FastReport http://www.fast-report.com' + Left = 208 + Top = 248 + end + object frxGZipCompressor1: TfrxGZipCompressor + Left = 260 + Top = 80 + end + object frxSDACComponents1: TfrxSDACComponents + Left = 256 + Top = 208 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit1.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit1.pas new file mode 100644 index 0000000..8c14407 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit1.pas @@ -0,0 +1,74 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Db, DBTables, frxDesgn, frxClass, frxDCtrl, frxBDEComponents, + frxChart, frxRich, frxBarcode, ImgList, ComCtrls, ExtCtrls, frxOLE, + frxCross, frxDMPExport, frxExportImage, frxExportRTF, frxExportTXT, + frxExportXML, frxExportXLS, frxExportHTML, frxGZip, frxExportPDF, + frxSDACComponents, frxDACComponents; + +type + TForm1 = class(TForm) + DesignB: TButton; + frxDesigner1: TfrxDesigner; + frxBarCodeObject1: TfrxBarCodeObject; + frxRichObject1: TfrxRichObject; + frxChartObject1: TfrxChartObject; + frxDialogControls1: TfrxDialogControls; + ImageList1: TImageList; + PreviewB: TButton; + Image1: TImage; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + frxOLEObject1: TfrxOLEObject; + frxCrossObject1: TfrxCrossObject; + frxDotMatrixExport1: TfrxDotMatrixExport; + frxBMPExport1: TfrxBMPExport; + frxJPEGExport1: TfrxJPEGExport; + frxTIFFExport1: TfrxTIFFExport; + frxTXTExport1: TfrxTXTExport; + frxHTMLExport1: TfrxHTMLExport; + frxXLSExport1: TfrxXLSExport; + frxXMLExport1: TfrxXMLExport; + frxRTFExport1: TfrxRTFExport; + frxGZipCompressor1: TfrxGZipCompressor; + frxSDACComponents1: TfrxSDACComponents; + frxReport1: TfrxReport; + procedure DesignBClick(Sender: TObject); + procedure PreviewBClick(Sender: TObject); + procedure FormShow(Sender: TObject); + private + { Private declarations } + WPath: String; + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +procedure TForm1.FormShow(Sender: TObject); +begin + WPath := ExtractFilePath(Application.ExeName); + TfrxPDFExport.Create(nil); +end; + +procedure TForm1.DesignBClick(Sender: TObject); +begin + frxReport1.DesignReport; +end; + +procedure TForm1.PreviewBClick(Sender: TObject); +begin + frxReport1.ShowReport; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit2.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit2.dfm new file mode 100644 index 0000000..7dd8aec --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit2.dfm @@ -0,0 +1,60 @@ +object ReportData: TReportData + OldCreateOrder = False + Left = 422 + Top = 104 + Height = 220 + Width = 254 + object MSConnection: TMSConnection + Database = 'test' + Username = 'root' + Server = 'Server' + Left = 24 + Top = 16 + end + object Dept: TMSTable + TableName = 'dept' + Connection = MSConnection + FetchAll = True + Left = 96 + Top = 16 + end + object Emp: TMSTable + TableName = 'emp' + MasterFields = 'DEPTNO' + DetailFields = 'DEPTNO' + MasterSource = DeptSource + Connection = MSConnection + FetchAll = True + Left = 168 + Top = 16 + ParamData = < + item + DataType = ftInteger + Name = 'DEPTNO' + ParamType = ptInput + Value = 60 + end> + end + object DeptSource: TDataSource + DataSet = Dept + Left = 96 + Top = 64 + end + object EmpSource: TDataSource + DataSet = Emp + Left = 168 + Top = 64 + end + object DeptDS: TfrxDBDataset + UserName = 'Dept' + DataSource = DeptSource + Left = 96 + Top = 112 + end + object EmpDS: TfrxDBDataset + UserName = 'Emp' + DataSource = EmpSource + Left = 168 + Top = 112 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit2.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit2.pas new file mode 100644 index 0000000..2f34471 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/Demo/Unit2.pas @@ -0,0 +1,31 @@ +unit Unit2; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + frxDBSet, DBTables, Db, frxClass, MemDS, DBAccess, MSAccess; + +type + TReportData = class(TDataModule) + MSConnection: TMSConnection; + Dept: TMSTable; + Emp: TMSTable; + DeptSource: TDataSource; + EmpSource: TDataSource; + DeptDS: TfrxDBDataset; + EmpDS: TfrxDBDataset; + private + { Private declarations } + public + { Public declarations } + end; + +var + ReportData: TReportData; + +implementation + +{$R *.DFM} + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/ReadMe.txt new file mode 100644 index 0000000..d895288 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/ReadMe.txt @@ -0,0 +1,10 @@ +MSSQL Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demo for FastReport included in SDAC was built and tested using +Fast Report 3.20 + +IMPORTANT NOTE: + Demo provided as is and there are no warranty that it is fully + compatible with other versions of Fast Report. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.cfg b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.cfg new file mode 100644 index 0000000..3530192 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.cfg @@ -0,0 +1,42 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"d:\program files\borland\delphi5\Projects" +-N"." +-LE"." +-LN"." +-U"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-O"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-I"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-R"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-Z diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.dpk new file mode 100644 index 0000000..12019a6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.dpk @@ -0,0 +1,39 @@ +// Package file for Delphi 5 + +package dclfrxSDAC5; + +{$R *.RES} +{$R 'frxSDACReg.dcr'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'FastReport 3.20 SDAC Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL50, + frxSDAC5; + +contains + frxSDACReg in 'frxSDACReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC5.res new file mode 100644 index 0000000000000000000000000000000000000000..4aa33a29f5409f6507d2199b5dd35f0dda13b311 GIT binary patch literal 1536 zcmaJ=O>0v@6g{sAd9G}NF02b1L_}OjLIWaQRIvsMYQ;*oP0&s(Nt2MoM(M(=vMKme z+!WftL&(Y>;4dh+ac7rZl#b`#d6O@zm)w~-_n!MTF9QHss+QV=-q(hpJ&AN@N>r0GIGMThL>i&P6*cdb? z>0=zKd5rgSKo^2tKzN8mu1LHGXCUFo2sSP>JWNG>#if|A7Y!80gl-f?4wtl6IKoD8 zsu~?Qzr)7F`HUuL8dG)kjFAMyMsc;TI5omYQ+U5RnBwn8QGYU?cpw;Y{Ksez=|sc< z`{^DW9XzBvOqo(}ZRt33qi+s{&w@0x^QnGmnU|#vm4Xb-Xdk-(GK7V2S*}DoW>y{( zO3;$p98HuEMS8V(e5W*a)%Dk6hoK$m>7upN73wX7_6q|0o&TB>;PWZ466+$d==|^> zDn74_38{%QpnMLTT_8BOy~Kq*nYSX>0pzIGUd0PM!5UstpJJW6m&tb_uOUD-o77h! zuP8ug^p?_>zNOAwfvGmJfi14j@S3MJt+1u_iad*aOa8u)d``vU-sOrMDM_lcDAeVL z8aB{D3p=Qzf+F`CwwbvOg9ce&m6JmOc|78@1@^E+`)y_mIBNsDd<sLc`s^sT&f2w^4(@9G=k!<9 zE8RBPr%YSHdqz5OeU5o=$SC6-<94~XP-Q1x9Ctm=A-5)Vecyt{H{kB*6}b&&`@q>d zGaZ8WDRWPAW~ZN>{ie?4?p~_N9rzAcwb4!O+jlkon!p|XC%6ggjH;12`7IWbKa+m| DdqEtY literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC6.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC6.dpk new file mode 100644 index 0000000..2c20d33 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC6.dpk @@ -0,0 +1,39 @@ +// Package file for Delphi 6 + +package dclfrxSDAC6; + +{$R 'frxSDACReg.dcr'} +{$DESCRIPTION 'FastReport 3.20 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + frxSDAC6; + +contains + frxSDACReg in 'frxSDACReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC7.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC7.dpk new file mode 100644 index 0000000..3e82515 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/dclfrxSDAC7.dpk @@ -0,0 +1,39 @@ +// Package file for Delphi 7 + +package dclfrxSDAC7; + +{$R 'frxSDACReg.dcr'} +{$DESCRIPTION 'FastReport 3.20 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + frxSDAC7; + +contains + frxSDACReg in 'frxSDACReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/file_id.diz b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/file_id.diz new file mode 100644 index 0000000..b86b77d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/file_id.diz @@ -0,0 +1,5 @@ +SDAC components for FastReport 3.20 + + +Created by: CoreLab +E-mail: sdac@crlab.com diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxDACComponents.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxDACComponents.pas new file mode 100644 index 0000000..d8d30d6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxDACComponents.pas @@ -0,0 +1,527 @@ + +{******************************************} +{ } +{ FastReport v3.20 } +{ DAC enduser components } +{ } + +// Created by: CoreLab +// E-mail: support@crlab.com + + +{ } +{******************************************} + +unit frxDACComponents; + +interface + +{$I frx.inc} + +uses + Windows, SysUtils, Classes, frxClass, frxCustomDB, DB, DBAccess, Graphics +{$IFDEF Delphi6} +, Variants +{$ENDIF} + {$IFDEF QBUILDER} +, fqbClass + {$ENDIF} +; + + +type + + TfrxDACComponentsClass = class of TfrxDACComponents; + TfrxDACDatabaseClass = class of TfrxDACDatabase; + TfrxDACTableClass = class of TfrxDACTable; + TfrxDACQueryClass = class of TfrxDACQuery; + + TfrxDACComponents = class(TfrxDBComponents) + private + FDefaultDatabase: TCustomDAConnection; + FOldComponents: TfrxDACComponents; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetDescription: string; override; + + class function GetComponentsName: string; virtual; + class function ResourceName: string; virtual; abstract; + class function GetDatabaseClass: TfrxDACDatabaseClass; virtual; abstract; + class function GetTableClass: TfrxDACTableClass; virtual; abstract; + class function GetQueryClass: TfrxDACQueryClass; virtual; abstract; + published + property DefaultDatabase: TCustomDAConnection read FDefaultDatabase write FDefaultDatabase; + end; + + TfrxDACDatabase = class(TfrxCustomDatabase) + protected + FDatabase: TCustomDAConnection; + FParams: Tstrings; + function GetLoginPrompt: Boolean; override; + procedure SetLoginPrompt(Value: Boolean); override; + function GetUsername: string; + procedure SetUsername(const Value: string); + function GetPassword: string; + procedure SetPassword(const Value: string); + function GetServer: string; + procedure SetServer(const Value: string); + function GetConnected: Boolean; override; + procedure SetConnected(Value: Boolean); override; + function GetParams: Tstrings; override; + procedure SetParams(Value: Tstrings); override; + protected + + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + class function GetDescription: string; override; + procedure SetLogin(const Login, Password: string); override; + property Database: TCustomDAConnection read FDatabase write FDatabase; + property Username: string read GetUsername write SetUsername; + property Password: string read GetPassword write SetPassword; + property Server: string read GetServer write SetServer; + Property Params: Tstrings read GetParams write SetParams; + end; + + TfrxDACTable = class(TfrxCustomTable) + private + FDatabase: TfrxDACDatabase; + protected + procedure SetDatabase(const Value: TfrxDACDatabase); virtual; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + + public + constructor Create(AOwner: TComponent); override; + constructor DesignCreate(AOwner: TComponent; Flags: Word); override; + class function GetDescription: string; override; + property Database: TfrxDACDatabase read FDatabase write SetDatabase; + end; + + TfrxDACQuery = class(TfrxCustomQuery) + private + FDatabase: TfrxDACDatabase; + protected + FQuery: TCustomDADataSet; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetMaster(const Value: TDataSource); override; + procedure SetSQL(Value: Tstrings); override; + function GetSQL: Tstrings; override; + procedure SetDatabase(const Value: TfrxDACDatabase); + procedure SetIndexName(const Value: string); + function GetIndexName: string; + procedure SetMasterFields(const Value: string); override; + public + constructor Create(AOwner: TComponent); override; + constructor DesignCreate(AOwner: TComponent; Flags: Word); override; + class function GetDescription: string; override; + procedure UpdateParams; override; + property Query: TCustomDADataSet read FQuery; + property Database: TfrxDACDatabase read FDatabase write SetDatabase; + property IndexName: string read GetIndexName write SetIndexName; + end; + + {$IFDEF QBUILDER} + TfrxEngineDAC = class(TfqbEngine) + protected + FQuery: TCustomDADataSet; + public + procedure ReadTableList(ATableList: Tstrings); override; + function ResultDataSet: TDataSet; override; + procedure SetSQL(const Value: string); override; + end; + {$ENDIF} + + procedure SetDelimitedText(strings: Tstrings; Delimiter:Char; const Value: string); + procedure GetMasterDetailNames(const Value: string; var MasterNames: string; var DetailNames: string); + procedure RegisterDacComponents(Components: TfrxDACComponentsClass); + procedure UnRegisterDacComponents(Components: TfrxDACComponentsClass); + +var + CatBmp: TBitmap; + DACComponents: TfrxDACComponents; + +implementation + +uses +{$IFNDEF NO_EDITORS} + frxDACEditor, +{$ENDIF} + frxDsgnIntf, frxRes; + +procedure RegisterDacComponents(Components: TfrxDACComponentsClass); +begin + CatBmp := TBitmap.Create; + CatBmp.LoadFromResourceName(hInstance, Components.ResourceName); + + frxObjects.RegisterCategory(Components.GetComponentsName, CatBmp, Components.GetComponentsName + ' Components'); + frxObjects.RegisterObject1(Components.GetDatabaseClass, nil, '', Components.GetComponentsName, 0, 37); + frxObjects.RegisterObject1(Components.GetTableClass, nil, '', Components.GetComponentsName, 0, 38); + frxObjects.RegisterObject1(Components.GetQueryClass, nil, '', Components.GetComponentsName, 0, 39); +end; + +procedure UnRegisterDacComponents(Components: TfrxDACComponentsClass); +begin + CatBmp.Free; + + frxObjects.UnRegister(Components.GetDatabaseClass); + frxObjects.UnRegister(Components.GetTableClass); + frxObjects.UnRegister(Components.GetQueryClass); +end; + +{$IFNDEF VER6P} +procedure SetDelimitedText(strings: Tstrings; Delimiter:Char; const Value: string); +var + P, P1: PChar; + S: string; +begin + with strings do begin + BeginUpdate; + try + Clear; + P := PChar(Value); + while P^ in [#1..' '] do + {$IFDEF MSWINDOWS} + P := CharNext(P); + {$ELSE} + Inc(P); + {$ENDIF} + while P^ <> #0 do begin + if P^ = '"' then + S := AnsiExtractQuotedStr(P, '"') + else begin + P1 := P; + while (P^ > ' ') and (P^ <> Delimiter) do + {$IFDEF MSWINDOWS} + P := CharNext(P); + {$ELSE} + Inc(P); + {$ENDIF} + Setstring(S, P1, P - P1); + end; + Add(S); + while P^ in [#1..' '] do + {$IFDEF MSWINDOWS} + P := CharNext(P); + {$ELSE} + Inc(P); + {$ENDIF} + if P^ = Delimiter then begin + P1 := P; + {$IFDEF MSWINDOWS} + if CharNext(P1)^ = #0 then + {$ELSE} + Inc(P1); + if P1^ = #0 then + {$ENDIF} + Add(''); + repeat + {$IFDEF MSWINDOWS} + P := CharNext(P); + {$ELSE} + Inc(P); + {$ENDIF} + until not (P^ in [#1..' ']); + end; + end; + finally + EndUpdate; + end; + end; +end; +{$ENDIF} + +procedure GetMasterDetailNames(const Value: string; var MasterNames: string; var DetailNames: string); +var + List: TstringList; + i: integer; +begin + List := TstringList.Create; + try +{$IFNDEF VER6P} + SetDelimitedText(List, ';', Value); +{$ELSE} + List.Delimiter := ';'; + List.DelimitedText := Value; +{$ENDIF} + MasterNames := ''; + DetailNames := ''; + for i := 0 to List.Count - 1 do begin + if MasterNames <> '' then + MasterNames := MasterNames + ';'; + if DetailNames <> '' then + DetailNames := DetailNames + ';'; + MasterNames := MasterNames + List.Values[List.Names[i]]; + DetailNames := DetailNames + List.Names[i]; + end; + finally + List.Free; + end; +end; + +{ TfrxDACComponents } + +class function TfrxDACComponents.GetComponentsName: string; +begin + result := 'DAC'; +end; + +constructor TfrxDACComponents.Create(AOwner: TComponent); +begin + inherited; + FOldComponents := DACComponents; + DACComponents := Self; +end; + +destructor TfrxDACComponents.Destroy; +begin + if DACComponents = Self then + DACComponents := FOldComponents; + inherited; +end; + +function TfrxDACComponents.GetDescription: string; +begin + Result := 'DAC'; +end; + +{ TfrxDACDatabase } + +function TfrxDACDatabase.GetParams: Tstrings; +begin + Result := FParams; +end; + +procedure TfrxDACDatabase.SetParams(Value: Tstrings); +begin + FParams := Value; +end; + +constructor TfrxDACDatabase.Create(AOwner: TComponent); +begin + inherited; + FParams := TstringList.Create; +end; + +destructor TfrxDACDatabase.Destroy; +begin + inherited; +end; + +class function TfrxDACDatabase.GetDescription: string; +begin + Result := 'DAC Database'; +end; + +function TfrxDACDatabase.GetConnected: Boolean; +begin + Result := FDatabase.Connected; +end; + +function TfrxDACDatabase.GetUsername: string; +begin + Result := FDatabase.Username; +end; + +function TfrxDACDatabase.GetPassword: string; +begin + Result := FDatabase.Password +end; + +function TfrxDACDatabase.GetServer: string; +begin + Result := FDatabase.Server; +end; + +function TfrxDACDatabase.GetLoginPrompt: Boolean; +begin + Result := FDatabase.LoginPrompt; +end; + +procedure TfrxDACDatabase.SetConnected(Value: Boolean); +begin + FDatabase.Connected := Value; +end; + +procedure TfrxDACDatabase.SetUsername(const Value: string); +begin + FDatabase.Username := Value; +end; + +procedure TfrxDACDatabase.SetPassword(const Value: string); +begin + FDatabase.Password := Value; +end; + +procedure TfrxDACDatabase.SetServer(const Value: string); +begin + FDatabase.Server := Value; +end; + +procedure TfrxDACDatabase.SetLoginPrompt(Value: Boolean); +begin + FDatabase.LoginPrompt := Value; +end; + +procedure TfrxDACDatabase.SetLogin(const Login, Password: string); +begin + Self.UserName := Login; + Self.Password := Password; +end; + +{ TfrxDACTable } + +constructor TfrxDACTable.Create(AOwner: TComponent); +begin + SetDatabase(nil); + inherited; +end; + +constructor TfrxDACTable.DesignCreate(AOwner: TComponent; Flags: Word); +var + i: Integer; + l: TList; +begin + inherited; + l := Report.AllObjects; + for i := 0 to l.Count - 1 do + if TObject(l[i]) is TfrxDACDatabase then + begin + Database := TfrxDACDatabase(l[i]); + break; + end; +end; + +class function TfrxDACTable.GetDescription: string; +begin + Result := 'DAC Table'; +end; + +procedure TfrxDACTable.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FDatabase) then + SetDatabase(nil); +end; + +procedure TfrxDACTable.SetDatabase(const Value: TfrxDACDatabase); +begin + FDatabase := Value; +end; + +{ TfrxDACQuery } + +constructor TfrxDACQuery.Create(AOwner: TComponent); +begin + Dataset := FQuery; + Database := nil; + inherited Create(AOwner); +end; + +constructor TfrxDACQuery.DesignCreate(AOwner: TComponent; Flags: Word); +var + i: Integer; + l: TList; +begin + inherited; + l := Report.AllObjects; + for i := 0 to l.Count - 1 do + if TObject(l[i]) is TfrxDACDatabase then + begin + SetDatabase(TfrxDACDatabase(l[i])); + break; + end; +end; + +class function TfrxDACQuery.GetDescription: string; +begin + Result := 'DAC Query'; +end; + +procedure TfrxDACQuery.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FDatabase) then + SetDatabase(nil); +end; + +procedure TfrxDACQuery.SetDatabase(const Value: TfrxDACDatabase); +begin + FDatabase := Value; + if Value <> nil then + FQuery.Connection := Value.Database + else if DACComponents <> nil then + FQuery.Connection := DACComponents.DefaultDatabase + else + FQuery.Connection := nil; +end; + +procedure TfrxDACQuery.SetIndexName(const Value: string); +begin + FQuery.IndexFieldNames := Value; +end; + +function TfrxDACQuery.GetIndexName: string; +begin + Result := FQuery.IndexFieldNames; +end; + +function TfrxDACQuery.GetSQL: Tstrings; +begin + Result := FQuery.SQL; +end; + +procedure TfrxDACQuery.SetSQL(Value: Tstrings); +begin + FQuery.SQL := Value; +end; + +procedure TfrxDACQuery.SetMaster(const Value: TDataSource); +begin + FQuery.MasterSource := Value; +end; + +procedure TfrxDACQuery.UpdateParams; +var + i: integer; +begin // Bug with ftCursor datatype + for i := 0 to Params.Count - 1 do // Problem with calling static method + if FQuery.Params.FindParam(Params[i].Name) <> nil then // TParam.SetDataType instead TOraParam.SetDataType + FQuery.ParamByName(Params[i].Name).DataType := Params[i].DataType; + + frxParamsToTParams(Self, FQuery.Params); +end; + +procedure TfrxDACQuery.SetMasterFields(const Value: string); +var + MasterNames: string; + DetailNames: string; +begin + GetMasterDetailNames(MasterFields, MasterNames, DetailNames); + FQuery.MasterFields := MasterNames; + FQuery.DetailFields := DetailNames; +end; + + {$IFDEF QBUILDER} + +{ TfrxEngineDAC } + +procedure TfrxEngineDAC.ReadTableList(ATableList: Tstrings); +begin + ATableList.Clear; + FQuery.Connection.GetTableNames(ATableList); +end; + +function TfrxEngineDAC.ResultDataSet: TDataSet; +begin + Result := FQuery; +end; + +procedure TfrxEngineDAC.SetSQL(const Value: string); +begin + FQuery.SQL.Text := Value; +end; + {$ENDIF} + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxDACEditor.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxDACEditor.pas new file mode 100644 index 0000000..e593593 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxDACEditor.pas @@ -0,0 +1,73 @@ + +{******************************************} +{ } +{ FastReport v3.20 } +{ DAC components design editors } +{ } + +// Created by: CoreLab +// E-mail: support@crlab.com + +{ } +{******************************************} + +unit frxDACEditor; + +interface + +{$I frx.inc} + +uses + Windows, Classes, SysUtils, Forms, Dialogs, frxDACComponents, frxCustomDB, + frxDsgnIntf, frxRes +{$IFDEF Delphi6} +, Variants +{$ENDIF}; + + +type + TfrxDatabaseProperty = class(TfrxComponentProperty) + public + function GetValue: String; override; + end; + + TfrxTableNameProperty = class(TfrxStringProperty) + public + function GetAttributes: TfrxPropertyAttributes; override; + procedure SetValue(const Value: String); override; + end; + +implementation + +{ TfrxDatabaseProperty } + +function TfrxDatabaseProperty.GetValue: String; +var + db: TfrxDACDatabase; +begin + db := TfrxDACDatabase(GetOrdValue); + if db = nil then + begin + if (DACComponents <> nil) and (DACComponents.DefaultDatabase <> nil) then + Result := DACComponents.DefaultDatabase.Name + else + Result := frxResources.Get('prNotAssigned'); + end + else + Result := inherited GetValue; +end; + +{ TfrxTableNameProperty } + +function TfrxTableNameProperty.GetAttributes: TfrxPropertyAttributes; +begin + Result := [paMultiSelect, paValueList, paSortList]; +end; + +procedure TfrxTableNameProperty.SetValue(const Value: String); +begin + inherited; + Designer.UpdateDataTree; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.bpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.bpk new file mode 100644 index 0000000..c9531aa --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.bpk @@ -0,0 +1,44 @@ +package frxSDAC5; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + sdac50, + dac50, + fs5, + frxDB5, + frx5, + VCLDB50, + VCL50; + +contains + frxSDACRTTI, + frxSDACComponents, + frxSDACEditor, + frxDACEditor in 'frxDACEditor.pas', + frxDACComponents in 'frxDACComponents.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.cfg b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.cfg new file mode 100644 index 0000000..36c9b46 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"." +-LN"." +-U"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-O"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-I"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-R"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-Z diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.cpp b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.cpp new file mode 100644 index 0000000..9fb3a19 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.cpp @@ -0,0 +1,26 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("frxBDE5.res"); +USEPACKAGE("vcl50.bpi"); +USEUNIT("frxSDACReg.pas"); +USERES("frxSDACReg.dcr"); +USEPACKAGE("vcldb50.bpi"); +USEPACKAGE("sdac50.bpi"); +USEPACKAGE("frx5.bpi"); +USEPACKAGE("frxDB5.bpi"); +USEPACKAGE("fs5.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.dpk new file mode 100644 index 0000000..b4fea8b --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.dpk @@ -0,0 +1,46 @@ +// Package file for Delphi 5 + +package frxSDAC5; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL50, + VCLDB50, + dac50, + sdac50, + frx5, + frxDB5, + fs5; + +contains + frxSDACComponents in 'frxSDACComponents.pas', + frxSDACEditor in 'frxSDACEditor.pas', + frxSDACRTTI in 'frxSDACRTTI.pas', + frxDACEditor in 'frxDACEditor.pas', + frxDACComponents in 'frxDACComponents.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC5.res new file mode 100644 index 0000000000000000000000000000000000000000..4aa33a29f5409f6507d2199b5dd35f0dda13b311 GIT binary patch literal 1536 zcmaJ=O>0v@6g{sAd9G}NF02b1L_}OjLIWaQRIvsMYQ;*oP0&s(Nt2MoM(M(=vMKme z+!WftL&(Y>;4dh+ac7rZl#b`#d6O@zm)w~-_n!MTF9QHss+QV=-q(hpJ&AN@N>r0GIGMThL>i&P6*cdb? z>0=zKd5rgSKo^2tKzN8mu1LHGXCUFo2sSP>JWNG>#if|A7Y!80gl-f?4wtl6IKoD8 zsu~?Qzr)7F`HUuL8dG)kjFAMyMsc;TI5omYQ+U5RnBwn8QGYU?cpw;Y{Ksez=|sc< z`{^DW9XzBvOqo(}ZRt33qi+s{&w@0x^QnGmnU|#vm4Xb-Xdk-(GK7V2S*}DoW>y{( zO3;$p98HuEMS8V(e5W*a)%Dk6hoK$m>7upN73wX7_6q|0o&TB>;PWZ466+$d==|^> zDn74_38{%QpnMLTT_8BOy~Kq*nYSX>0pzIGUd0PM!5UstpJJW6m&tb_uOUD-o77h! zuP8ug^p?_>zNOAwfvGmJfi14j@S3MJt+1u_iad*aOa8u)d``vU-sOrMDM_lcDAeVL z8aB{D3p=Qzf+F`CwwbvOg9ce&m6JmOc|78@1@^E+`)y_mIBNsDd<sLc`s^sT&f2w^4(@9G=k!<9 zE8RBPr%YSHdqz5OeU5o=$SC6-<94~XP-Q1x9Ctm=A-5)Vecyt{H{kB*6}b&&`@q>d zGaZ8WDRWPAW~ZN>{ie?4?p~_N9rzAcwb4!O+jlkon!p|XC%6ggjH;12`7IWbKa+m| DdqEtY literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.bpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.bpk new file mode 100644 index 0000000..9834a40 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.bpk @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=$(BCB)\Projects;$(BCB)\include;$(BCB)\include\vcl;..\ +Item1=$(BCB)\Projects;..\..\FR\SOURCE\ADO;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=2 +Item0=$(BCB)\Projects;$(BCB)\lib\obj;$(BCB)\lib;..\ +Item1=$(BCB)\Projects;..\..\FR\SOURCE\ADO;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.cfg b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.cfg new file mode 100644 index 0000000..075366f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.cfg @@ -0,0 +1,42 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"d:\program files\borland\delphi5\Projects" +-N"." +-LE"." +-LN"." +-U"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib;d:\program files\borland\delphi5\Projects" +-O"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib;d:\program files\borland\delphi5\Projects" +-I"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib;d:\program files\borland\delphi5\Projects" +-R"d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Sdac\Demos\FastReport;d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Projects;d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib;d:\program files\borland\delphi5\Projects" +-Z diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.cpp b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.cpp new file mode 100644 index 0000000..0b7615d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.dpk new file mode 100644 index 0000000..fd5dc54 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.dpk @@ -0,0 +1,47 @@ +// Package file for Delphi 6 + +package frxSDAC6; + +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac60, + Sdac60, + dacvcl60, + sdacvcl60, + frx6, + frxDB6, + fs6; + +contains + frxSDACComponents in 'frxSDACComponents.pas', + frxSDACEditor in 'frxSDACEditor.pas', + frxSDACRTTI in 'frxSDACRTTI.pas', + frxDACEditor in 'frxDACEditor.pas', + frxDACComponents in 'frxDACComponents.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDAC6.res new file mode 100644 index 0000000000000000000000000000000000000000..2bbdbc1e14bbba1f8bedfd2eed6040c0942ef0ca GIT binary patch literal 1536 zcmb_bJ&O}j6g{&}VI?VS*2W+rVj)?QMi4f#_ia3OYXb(ym#)`%RB(6Q?tw}-3#)4!<}Cu$J4V~ zZPRz8+jQ#GHq}GE%@`*&=ct_m{9!t^hAUkx77JQAkS4@r)^N3b$>#r&#LN@ZE^-M@ zOZaRJ$1A=uv*gTBa(+Ub=2%R+hT|k{nx^oVa}x_UotwD{f;Lx+V-uU;xNT-RmPCTN zPj0O7f^Dqq&CSla#qW78@tqGgUSfpk;w47vyLiFnc)=4hF`cAR->mBY5cx(dT-N&x z1k293-T?88*u=}&;)$LM)nYnwPFaAGS}d-L=62vOHd_;1=eJQP=u?@-seG*ep!dBD zW!+|aYA#oqtU=APD|n0t*uxX*4)$rCl;4Gv_E4|;`YPlVd5BhTsrJXW6m7Jas*3|0 za(#$r^!BvEq1M}_FY?L%`KuUBcI>;{7MJ2v?T$iSzUamQB8+i@5Pj^@4sgWGA&xO5 z>!WfSXkiQYIBknPG`W9+**wlV#3@GTk^hcU_lS;G1@0)vbkxK6*pk-=qb5FW_!!oqe_S1eahSyIo0W_vtQG>?A=Q> ixdYc>ppAC5Z`W1vZvr>nK$oyKPLkKCBhg7ZZFBNvDBU=Cu42J z;)Iuy?s8Ki7KjXzWBObzEr36?T5jQ&TcU+tuSbIvA&YSfzpgHWLNF~-q}576N0gwP z>UkAM(@`|gK_mI88Bj`T-5Kgan2q37D#=-_I~{n7VVE4mx*OoB?^nYG%TRGQ$W_D8 z_cyFwpgq@Y(%wk)P7t-*pQ?VlOn$2cN7pp_-Xil}OsePb_jt?f7Qz}$`!p}3o zv1)HsBj+!=I#XfQ<%c8)8St;m4+%KCrJ}vAt%ohg(QK$xL)YCwKJJ!tQG`N5pdMID zN?<_h(Sc3~O3OeCS|^+ZUPq+65d&!Y>kg++N73m}kGa=cxyV|7 ziFqHC*k;oD#HqX^DX3t-vPu?a-iM6&`S3bTIU-9O5AeK zw%3Fo4Nj5+E~#;jsAHY{_w0I|+U6j^J?zXx zQfI?*Ys|efQo$XY{~7JRwMw;h)+yck*rKNsSLcxTnv8X9&~KOPKHjpDR2+9Xi6K*y zylLH{4JY7c^pe~?MtjHJ8zU8h^OU|Xb4I%#?fs_h%gtW0$qdp8E4I*8TX$O3@HT '') and (Assigned(Connection)) then + inherited; +end; + +{ TSDACQuery } + +procedure TSDACQuery.InitFieldDefs; +begin + if (SQL.Text <> '') and Assigned(Connection) then + inherited; +end; + +{ TfrxSDACComponents } + +class function TfrxSDACComponents.GetComponentsName: string; +begin + Result := 'SDAC'; +end; + +class function TfrxSDACComponents.GetDatabaseClass: TfrxDACDatabaseClass; +begin + Result := TfrxSDACDatabase; +end; + +class function TfrxSDACComponents.GetTableClass: TfrxDACTableClass; +begin + Result := TfrxSDACTable; +end; + +class function TfrxSDACComponents.GetQueryClass: TfrxDACQueryClass; +begin + Result := TfrxSDACQuery; +end; + +class function TfrxSDACComponents.ResourceName: string; +begin + Result := 'FRXSDACOBJECTS'; +end; + +function TfrxSDACComponents.GetDescription: string; +begin + Result := 'SDAC'; +end; + +{ TfrxSDACDatabase } + +constructor TfrxSDACDatabase.Create(AOwner: TComponent); +begin + inherited; + FDatabase := TMSConnection.Create(nil); + Component := FDatabase; +end; + +class function TfrxSDACDatabase.GetDescription: string; +begin + Result := 'SDAC Database'; +end; + +function TfrxSDACDatabase.GetDatabaseName: string; +begin + Result := TMSConnection(FDatabase).Database; +end; + +procedure TfrxSDACDatabase.SetDatabaseName(const Value: string); +begin + TMSConnection(FDatabase).Database := Value; +end; + +{ TfrxSDACTable } + +constructor TfrxSDACTable.Create(AOwner: TComponent); +begin + FTable := TSDACTable.Create(nil); + DataSet := FTable; + SetDatabase(nil); + inherited; +end; + +class function TfrxSDACTable.GetDescription: string; +begin + Result := 'SDAC Table'; +end; + +procedure TfrxSDACTable.SetDatabase(const Value: TfrxDACDatabase); +begin + inherited; + if Value <> nil then + FTable.Connection := TMSConnection(Value.Database) + else + if DACComponents <> nil then + FTable.Connection := TMSConnection(DACComponents.DefaultDatabase) + else + FTable.Connection := nil; +end; + +function TfrxSDACTable.GetIndexFieldNames: string; +begin + Result := FTable.IndexFieldNames; +end; + +function TfrxSDACTable.GetTableName: string; +begin + Result := FTable.TableName; +end; + +procedure TfrxSDACTable.SetIndexFieldNames(const Value: string); +begin + FTable.IndexFieldNames := Value; +end; + +procedure TfrxSDACTable.SetTableName(const Value: string); +begin + FTable.TableName := Value; + if Assigned(FTable.Connection) then + FTable.InitFieldDefs; +end; + +procedure TfrxSDACTable.SetMaster(const Value: TDataSource); +begin + FTable.MasterSource := Value; +end; + +procedure TfrxSDACTable.SetMasterFields(const Value: string); +var + MasterNames: string; + DetailNames: string; +begin + GetMasterDetailNames(MasterFields, MasterNames, DetailNames); + FTable.MasterFields := MasterNames; + FTable.DetailFields := DetailNames; +end; + +{ TfrxSDACQuery } + +constructor TfrxSDACQuery.Create(AOwner: TComponent); +begin + FQuery := TSDACQuery.Create(nil); + inherited Create(AOwner); +end; + +class function TfrxSDACQuery.GetDescription: string; +begin + Result := 'SDAC Query'; +end; + + {$IFDEF QBUILDER} +function TfrxSDACQuery.QBEngine: TfqbEngine; +begin + Result := TfrxEngineSDAC.Create(nil); + TfrxEngineSDAC(Result).FQuery.Connection := TCustomMSConnection(FQuery.Connection); +end; + {$ENDIF} + + {$IFDEF QBUILDER} + +{ TfrxEngineSDAC } + +constructor TfrxEngineSDAC.Create(AOwner: TComponent); +begin + inherited; + FQuery := TSDACQuery.Create(Self); +end; + +destructor TfrxEngineSDAC.Destroy; +begin + FQuery.Free; + inherited; +end; + +procedure TfrxEngineSDAC.ReadFieldList(const ATableName: string; + var AFieldList: TfqbFieldList); +var + TempTable: TSDACTable; + Fields: TFieldDefs; + i: Integer; + tmpField: TfqbField; +begin + AFieldList.Clear; + TempTable := TSDACTable.Create(Self); + try + TempTable.Connection := TCustomMSConnection(FQuery.Connection); + TempTable.TableName := ATableName; + Fields := TempTable.FieldDefs; + try + TempTable.Active := True; + tmpField:= TfqbField(AFieldList.Add); + tmpField.FieldName := '*'; + for i := 0 to Fields.Count - 1 do begin + tmpField := TfqbField(AFieldList.Add); + tmpField.FieldName := Fields.Items[i].Name; + tmpField.FieldType := Ord(Fields.Items[i].DataType) + end; + except + end; + finally + TempTable.Free; + end; +end; + + {$ENDIF} + +initialization + RegisterDacComponents(TfrxSDACComponents); + +finalization + UnRegisterDacComponents(TfrxSDACComponents); + +end. + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACEditor.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACEditor.pas new file mode 100644 index 0000000..6ef4c1f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACEditor.pas @@ -0,0 +1,54 @@ + +{******************************************} +{ } +{ FastReport v3.20 } +{ SDAC components design editors } +{ } + +// Created by: CoreLab +// E-mail: sdac@crlab.com + +{ } +{******************************************} + +unit frxSDACEditor; + +interface + +{$I frx.inc} + +implementation + +uses + Windows, SysUtils, Classes, frxClass, frxDsgnIntf, frxCustomDB, DB, + MSAccess, OLEDBAccess, OLEDBC, SdacVcl, frxSDACComponents, frxDACEditor +{$IFDEF Delphi6} +, Variants +{$ENDIF}; + + +type + TfrxMSTableNameProperty = class(TfrxTableNameProperty) + public + procedure GetValues; override; + end; + +{ TfrxMSTableNameProperty } + +procedure TfrxMSTableNameProperty.GetValues; +begin + inherited; + with TfrxSDACTable(Component).Table do + if Connection <> nil then + Connection.GetTableNames(Values); +end; + +initialization + frxPropertyEditors.Register(TypeInfo(TfrxSDACDatabase), TfrxSDACTable, 'Database', + TfrxDatabaseProperty); + frxPropertyEditors.Register(TypeInfo(TfrxSDACDatabase), TfrxSDACQuery, 'Database', + TfrxDatabaseProperty); + frxPropertyEditors.Register(TypeInfo(String), TfrxSDACTable, 'TableName', + TfrxMSTableNameProperty); + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACRTTI.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACRTTI.pas new file mode 100644 index 0000000..b70df30 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACRTTI.pas @@ -0,0 +1,65 @@ +{******************************************} +{ } +{ FastReport v3.20 } +{ SDAC components RTTI } +{ } + +// Created by: CoreLab +// E-mail: sdac@crlab.com + +{ } +{******************************************} + +unit frxSDACRTTI; + +interface + +{$I frx.inc} + +implementation + +uses + Windows, Classes, fs_iinterpreter, frxSDACComponents +{$IFDEF Delphi6} +, Variants +{$ENDIF}; + + +type + TFunctions = class(TfsRTTIModule) + private + function CallMethod(Instance: TObject; ClassType: TClass; + const MethodName: String; Caller: TfsMethodHelper): Variant; + public + constructor Create(AScript: TfsScript); override; + end; + +{ TFunctions } + +constructor TFunctions.Create(AScript: TfsScript); +begin + inherited Create(AScript); + with AScript do + begin + AddClass(TfrxSDACDatabase, 'TfrxCustomDatabase'); + AddClass(TfrxSDACTable, 'TfrxCustomTable'); + with AddClass(TfrxSDACQuery, 'TfrxCustomQuery') do + AddMethod('procedure ExecSQL', CallMethod); + end; +end; + +function TFunctions.CallMethod(Instance: TObject; ClassType: TClass; + const MethodName: String; Caller: TfsMethodHelper): Variant; +begin + Result := 0; + if ClassType = TfrxSDACQuery then + begin + if MethodName = 'EXECSQL' then + TfrxSDACQuery(Instance).Query.Execute; + end +end; + +initialization + fsRTTIModules.Add(TFunctions); + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACReg.dcr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR3/frxSDACReg.dcr new file mode 100644 index 0000000000000000000000000000000000000000..a4924ac26df5d818737a40e4856281c5c9db9a96 GIT binary patch literal 492 zcmZ{eF%H5o3`IW(2}VZP7`X-_ut5=Y;23OSKq6Z+RN_kA(xHdxfK)c~Lz*H4{MPo% zk8K42W(<)K#1GjXpy-J7kz$QKjyTX+V977R20P|0R*aN4QRDG+5P43Rw9!MbXWaW+ z2H+24LSZH{42q)Qg@33o5(;y8yTE>lgPk`LJ8BQvO&%t)72EL-pDQrTwDvthHCK^S zWS;Amh5ng*S4t&~*2Gu;tAR{QYu`+9EDVzW`FE8_Q)ijq>DyiHDo6G{*7Cy@y5s literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/frxSDAC5.bpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/frxSDAC5.bpk new file mode 100644 index 0000000..f2eb76f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/frxSDAC5.bpk @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/frxSDAC5.cpp b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/frxSDAC5.cpp new file mode 100644 index 0000000..f45107e --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/frxSDAC5.cpp @@ -0,0 +1,27 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("frxBDE5.res"); +USEPACKAGE("vcl50.bpi"); +USEUNIT("..\frxSDACReg.pas"); +USERES("..\frxSDACReg.dcr"); +USEPACKAGE("vcldb50.bpi"); +USEPACKAGE("sdac50.bpi"); +USEPACKAGE("frx5.bpi"); +USEPACKAGE("frxDB5.bpi"); +USEPACKAGE("fs5.bpi"); +USEPACKAGE("fqb50.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsDAC5.bpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsDAC5.bpk new file mode 100644 index 0000000..c11dfa4 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsDAC5.bpk @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=1 +Item0=$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=1 +Item0=$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsDAC5.cpp b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsDAC5.cpp new file mode 100644 index 0000000..6b3f215 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsDAC5.cpp @@ -0,0 +1,24 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("FS5.res"); +USEPACKAGE("vcl50.bpi"); +USEPACKAGE("vcldb50.bpi"); +USEPACKAGE("dac50.bpi"); +USEPACKAGE("fs5.bpi"); +USEPACKAGE("fsDB5.bpi"); +USEUNIT("..\fs_idacrtti.pas"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsSDAC5.bpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsSDAC5.bpk new file mode 100644 index 0000000..90389af --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsSDAC5.bpk @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=1 +Item0=$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=1 +Item0=$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsSDAC5.cpp b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsSDAC5.cpp new file mode 100644 index 0000000..c520e2b --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder5/fsSDAC5.cpp @@ -0,0 +1,26 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("FS5.res"); +USEPACKAGE("vcl50.bpi"); +USEPACKAGE("vcldb50.bpi"); +USEPACKAGE("dac50.bpi"); +USEPACKAGE("sdac50.bpi"); +USEPACKAGE("fs5.bpi"); +USEPACKAGE("fsDB5.bpi"); +USEUNIT("..\fs_isdacreg.pas"); +USERES("..\fs_isdacreg.dcr"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/frxSDAC6.bpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/frxSDAC6.bpk new file mode 100644 index 0000000..8a2a126 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/frxSDAC6.bpk @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=$(BCB)\Projects;$(BCB)\include;$(BCB)\include\vcl;..\ +Item1=$(BCB)\Projects;..\..\FR\SOURCE\ADO;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=2 +Item0=$(BCB)\Projects;$(BCB)\lib\obj;$(BCB)\lib;..\ +Item1=$(BCB)\Projects;..\..\FR\SOURCE\ADO;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/frxSDAC6.cpp b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/frxSDAC6.cpp new file mode 100644 index 0000000..58e173f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/frxSDAC6.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsDAC6.bpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsDAC6.bpk new file mode 100644 index 0000000..ac84b22 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsDAC6.bpk @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Excluded Packages] + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsDAC6.cpp b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsDAC6.cpp new file mode 100644 index 0000000..12bf8b0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsDAC6.cpp @@ -0,0 +1,18 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsSDAC6.bpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsSDAC6.bpk new file mode 100644 index 0000000..27522e8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsSDAC6.bpk @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Excluded Packages] + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsSDAC6.cpp b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsSDAC6.cpp new file mode 100644 index 0000000..12bf8b0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/CBuilder6/fsSDAC6.cpp @@ -0,0 +1,18 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfrxSDAC10.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfrxSDAC10.bdsproj new file mode 100644 index 0000000..b164a51 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfrxSDAC10.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + dclfrxSDAC10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + FastReport 4.0 SDAC Components + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfrxSDAC10.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfrxSDAC10.dpk new file mode 100644 index 0000000..719ed11 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfrxSDAC10.dpk @@ -0,0 +1,40 @@ +// Package file for Delphi 2006 + +package dclfrxSDAC10; + +{$R '..\frxSDACReg.dcr'} +{$DESCRIPTION 'FastReport 4.0 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + frxDAC10, + frxSDAC10; + +contains + frxSDACReg in '..\frxSDACReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfsSDAC10.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfsSDAC10.bdsproj new file mode 100644 index 0000000..e624c97 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfsSDAC10.bdsproj @@ -0,0 +1,19 @@ + + + + + + + + + + + + dclfsSDAC10.dpk + + + 7.0 + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfsSDAC10.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfsSDAC10.dpk new file mode 100644 index 0000000..05d7a83 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/dclfsSDAC10.dpk @@ -0,0 +1,42 @@ +// Package file for Delphi 2006 + +package dclfsSDAC10; + +{$R '..\fs_isdacreg.dcr'} + +{$DESCRIPTION 'FastScript 1.9 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + fs10, + fsDAC10, + fsSDAC10; + +contains + fs_isdacreg in '..\fs_isdacreg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxDAC10.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxDAC10.bdsproj new file mode 100644 index 0000000..3952dbf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxDAC10.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + frxDAC10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxDAC10.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxDAC10.dpk new file mode 100644 index 0000000..4772eaf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxDAC10.dpk @@ -0,0 +1,46 @@ +// Package file for Delphi 2006 + +package frxDAC10; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl, + vcldb, + dac100, + frx10, + frxDB10, +{$IFDEF QBUILDER} + fqb10, +{$ENDIF} + fs10; + +contains + frxDACEditor in '..\frxDACEditor.pas', + frxDACComponents in '..\frxDACComponents.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxSDAC10.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxSDAC10.bdsproj new file mode 100644 index 0000000..92be2e7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxSDAC10.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + frxSDAC10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxSDAC10.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxSDAC10.dpk new file mode 100644 index 0000000..81b3688 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/frxSDAC10.dpk @@ -0,0 +1,51 @@ +// Package file for Delphi 2006 + +package frxSDAC10; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac100, + sdac100, + dacvcl100, + sdacvcl100, + frxDAC10, + frx10, + frxDB10, +{$IFDEF QBUILDER} + fqb100, +{$ENDIF} + fs10; + +contains + frxSDACComponents in '..\frxSDACComponents.pas', + frxSDACEditor in '..\frxSDACEditor.pas', + frxSDACRTTI in '..\frxSDACRTTI.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsDAC10.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsDAC10.bdsproj new file mode 100644 index 0000000..24d8513 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsDAC10.bdsproj @@ -0,0 +1,19 @@ + + + + + + + + + + + + fsDAC10.dpk + + + 7.0 + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsDAC10.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsDAC10.dpk new file mode 100644 index 0000000..787b2e6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsDAC10.dpk @@ -0,0 +1,41 @@ +// Package file for Delphi 2006 + +package fsDAC10; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac100, + fs10, + fsDB10; + +contains + fs_idacrtti in '..\fs_idacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsSDAC10.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsSDAC10.bdsproj new file mode 100644 index 0000000..860cdb6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsSDAC10.bdsproj @@ -0,0 +1,19 @@ + + + + + + + + + + + + fsSDAC10.dpk + + + 7.0 + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsSDAC10.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsSDAC10.dpk new file mode 100644 index 0000000..17ddddd --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi10/fsSDAC10.dpk @@ -0,0 +1,43 @@ +// Package file for Delphi 2006 + +package fsSDAC10; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + sdac100, + sdacvcl100, + fsDAC10, + fs10, + fsDB10; + +contains + fs_isdacrtti in '..\fs_isdacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfrxSDAC11.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfrxSDAC11.dpk new file mode 100644 index 0000000..ad83d52 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfrxSDAC11.dpk @@ -0,0 +1,40 @@ +// Package file for Delphi 2007 + +package dclfrxSDAC11; + +{$R '..\frxSDACReg.dcr'} +{$DESCRIPTION 'FastReport 4.0 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + frxDAC11, + frxSDAC11; + +contains + frxSDACReg in '..\frxSDACReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfrxSDAC11.dproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfrxSDAC11.dproj new file mode 100644 index 0000000..15787e1 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfrxSDAC11.dproj @@ -0,0 +1,82 @@ + + + {0e0b2531-ae7a-4787-9790-56bdf8f59fc3} + dclfrxSDAC11.dpk + Debug + AnyCPU + DCC32 + + + 7.0 + False + True + False + 0 + RELEASE + + + 7.0 + True + DEBUG + + + Delphi.Personality + Package + + + False + True + False + + + FastReport 4.0 SDAC Components + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + dclfrxSDAC11.dpk + + + + + + + MainSource + + + + + + + + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfsSDAC11.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfsSDAC11.dpk new file mode 100644 index 0000000..955db9f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfsSDAC11.dpk @@ -0,0 +1,42 @@ +// Package file for Delphi 2007 + +package dclfsSDAC11; + +{$R '..\fs_isdacreg.dcr'} + +{$DESCRIPTION 'FastScript 1.9 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + fs11, + fsDAC11, + fsSDAC11; + +contains + fs_isdacreg in '..\fs_isdacreg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfsSDAC11.dproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfsSDAC11.dproj new file mode 100644 index 0000000..31814f9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/dclfsSDAC11.dproj @@ -0,0 +1,83 @@ + + + {f9393bbf-e02f-4301-bc54-c6b9271fc9c6} + dclfsSDAC11.dpk + Debug + AnyCPU + DCC32 + + + 7.0 + False + True + False + 0 + RELEASE + + + 7.0 + True + DEBUG + + + Delphi.Personality + Package + + + False + True + False + + + FastScript 1.9 SDAC Components + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + dclfsSDAC11.dpk + + + + + + + MainSource + + + + + + + + + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxDAC11.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxDAC11.dpk new file mode 100644 index 0000000..2f55637 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxDAC11.dpk @@ -0,0 +1,46 @@ +// Package file for Delphi 2007 + +package frxDAC11; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl, + vcldb, + dac105, + frx11, + frxDB11, +{$IFDEF QBUILDER} + fqb110, +{$ENDIF} + fs11; + +contains + frxDACEditor in '..\frxDACEditor.pas', + frxDACComponents in '..\frxDACComponents.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxDAC11.dproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxDAC11.dproj new file mode 100644 index 0000000..1b85cf7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxDAC11.dproj @@ -0,0 +1,83 @@ + + + {79ea9b0f-23fb-4f90-b6f5-06dd24439029} + frxDAC11.dpk + Debug + AnyCPU + DCC32 + + + 7.0 + False + True + False + 0 + RELEASE + + + 7.0 + True + DEBUG + + + Delphi.Personality + Package + + + False + True + False + + + False + False + True + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + frxDAC11.dpk + + + + + + + MainSource + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxSDAC11.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxSDAC11.dpk new file mode 100644 index 0000000..163fbc5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxSDAC11.dpk @@ -0,0 +1,51 @@ +// Package file for Delphi 2007 + +package frxSDAC11; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac105, + sdac105, + dacvcl105, + sdacvcl105, + frxDAC11, + frx11, + frxDB11, +{$IFDEF QBUILDER} + fqb110, +{$ENDIF} + fs11; + +contains + frxSDACComponents in '..\frxSDACComponents.pas', + frxSDACEditor in '..\frxSDACEditor.pas', + frxSDACRTTI in '..\frxSDACRTTI.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxSDAC11.dproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxSDAC11.dproj new file mode 100644 index 0000000..3eaddaf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/frxSDAC11.dproj @@ -0,0 +1,88 @@ + + + {9088d9fa-279b-4c30-a6b7-839a07845547} + frxSDAC11.dpk + Debug + AnyCPU + DCC32 + + + 7.0 + False + True + False + 0 + RELEASE + + + 7.0 + True + DEBUG + + + Delphi.Personality + Package + + + False + True + False + + + False + False + True + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + frxSDAC11.dpk + + + + + + + MainSource + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsDAC11.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsDAC11.dpk new file mode 100644 index 0000000..0a944af --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsDAC11.dpk @@ -0,0 +1,41 @@ +// Package file for Delphi 2007 + +package fsDAC11; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac105, + fs11, + fsDB11; + +contains + fs_idacrtti in '..\fs_idacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsDAC11.dproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsDAC11.dproj new file mode 100644 index 0000000..6942a06 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsDAC11.dproj @@ -0,0 +1,81 @@ + + + {ab40f425-8a8e-4190-8aef-70f3f93a0017} + fsDAC11.dpk + Debug + AnyCPU + DCC32 + + + 7.0 + False + True + False + 0 + RELEASE + + + 7.0 + True + DEBUG + + + Delphi.Personality + Package + + + False + True + False + + + False + False + True + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + fsDAC11.dpk + + + + + + + MainSource + + + + + + + + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsSDAC11.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsSDAC11.dpk new file mode 100644 index 0000000..a7feff7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsSDAC11.dpk @@ -0,0 +1,43 @@ +// Package file for Delphi 2007 + +package fsSDAC11; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + sdac105, + sdacvcl105, + fsDAC11, + fs11, + fsDB11; + +contains + fs_isdacrtti in '..\fs_isdacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsSDAC11.dproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsSDAC11.dproj new file mode 100644 index 0000000..9f6e120 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi11/fsSDAC11.dproj @@ -0,0 +1,83 @@ + + + {7f25acf6-46de-4475-bff0-8bb0e6c634d0} + fsSDAC11.dpk + Debug + AnyCPU + DCC32 + + + 7.0 + False + True + False + 0 + RELEASE + + + 7.0 + True + DEBUG + + + Delphi.Personality + Package + + + False + True + False + + + False + False + True + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + fsSDAC11.dpk + + + + + + + MainSource + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/dclfrxSDAC5.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/dclfrxSDAC5.dpk new file mode 100644 index 0000000..7ac9562 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/dclfrxSDAC5.dpk @@ -0,0 +1,39 @@ +// Package file for Delphi 5 + +package dclfrxSDAC5; + +{$R '..\frxSDACReg.dcr'} +{$DESCRIPTION 'FastReport 4.0 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL50, + frxDAC5, + frxSDAC5; + +contains + frxSDACReg in '..\frxSDACReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/dclfsSDAC5.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/dclfsSDAC5.dpk new file mode 100644 index 0000000..a16df9c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/dclfsSDAC5.dpk @@ -0,0 +1,41 @@ +// Package file for Delphi 5 + +package dclfsSDAC5; + +{$R '..\fs_isdacreg.dcr'} + +{$DESCRIPTION 'FastScript 1.9 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL50, + fs5, + fsDAC5, + fsSDAC5; + +contains + fs_isdacreg in '..\fs_isdacreg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/frxDAC5.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/frxDAC5.dpk new file mode 100644 index 0000000..bf8b147 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/frxDAC5.dpk @@ -0,0 +1,46 @@ +// Package file for Delphi 5 + +package frxDAC5; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl50, + vcldb50, + dac50, + frx5, + frxDB5, +{$IFDEF QBUILDER} + fqb50, +{$ENDIF} + fs5; + +contains + frxDACEditor in '..\frxDACEditor.pas', + frxDACComponents in '..\frxDACComponents.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/frxSDAC5.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/frxSDAC5.dpk new file mode 100644 index 0000000..7140587 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/frxSDAC5.dpk @@ -0,0 +1,49 @@ +// Package file for Delphi 5 + +package frxSDAC5; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL50, + VCLDB50, + dac50, + sdac50, + frxDAC5, + frx5, + frxDB5, +{$IFDEF QBUILDER} + fqb50, +{$ENDIF} + fs5; + +contains + frxSDACComponents in '..\frxSDACComponents.pas', + frxSDACEditor in '..\frxSDACEditor.pas', + frxSDACRTTI in '..\frxSDACRTTI.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/fsDAC5.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/fsDAC5.dpk new file mode 100644 index 0000000..66f6275 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/fsDAC5.dpk @@ -0,0 +1,41 @@ +// Package file for Delphi 5 + +package fsDAC5; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL50, + VCLDB50, + dac50, + fs5, + fsDB5; + +contains + fs_idacrtti in '..\fs_idacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/fsSDAC5.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/fsSDAC5.dpk new file mode 100644 index 0000000..822eeaa --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi5/fsSDAC5.dpk @@ -0,0 +1,43 @@ +// Package file for Delphi 5 + +package fsSDAC5; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL50, + VCLDB50, + sdac50, + sdacvcl50, + fsDAC5, + fs5, + fsDB5; + +contains + fs_isdacrtti in '..\fs_isdacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/dclfrxSDAC6.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/dclfrxSDAC6.dpk new file mode 100644 index 0000000..b527f29 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/dclfrxSDAC6.dpk @@ -0,0 +1,40 @@ +// Package file for Delphi 6 + +package dclfrxSDAC6; + +{$R '..\frxSDACReg.dcr'} +{$DESCRIPTION 'FastReport 4.0 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + frxDAC6, + frxSDAC6; + +contains + frxSDACReg in '..\frxSDACReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/dclfsSDAC6.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/dclfsSDAC6.dpk new file mode 100644 index 0000000..22a07f4 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/dclfsSDAC6.dpk @@ -0,0 +1,42 @@ +// Package file for Delphi 6 + +package dclfsSDAC6; + +{$R '..\fs_isdacreg.dcr'} + +{$DESCRIPTION 'FastScript 1.9 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + fs6, + fsDAC6, + fsSDAC6; + +contains + fs_isdacreg in '..\fs_isdacreg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/frxDAC6.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/frxDAC6.dpk new file mode 100644 index 0000000..97b9440 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/frxDAC6.dpk @@ -0,0 +1,46 @@ +// Package file for Delphi 6 + +package frxDAC6; + +{$I frx.inc} + +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl, + vcldb, + dac60, + frx6, + frxDB6, +{$IFDEF QBUILDER} + fqb60, +{$ENDIF} + fs6; + +contains + frxDACEditor in '..\frxDACEditor.pas', + frxDACComponents in '..\frxDACComponents.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/frxSDAC6.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/frxSDAC6.dpk new file mode 100644 index 0000000..49e71ea --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/frxSDAC6.dpk @@ -0,0 +1,51 @@ +// Package file for Delphi 6 + +package frxSDAC6; + +{$I frx.inc} + +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac60, + Sdac60, + dacvcl60, + sdacvcl60, + frxDAC6, + frx6, + frxDB6, +{$IFDEF QBUILDER} + fqb60, +{$ENDIF} + fs6; + +contains + frxSDACComponents in '..\frxSDACComponents.pas', + frxSDACEditor in '..\frxSDACEditor.pas', + frxSDACRTTI in '..\frxSDACRTTI.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/fsDAC6.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/fsDAC6.dpk new file mode 100644 index 0000000..787669f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/fsDAC6.dpk @@ -0,0 +1,41 @@ +// Package file for Delphi 6 + +package fsDAC6; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac60, + fs6, + fsDB6; + +contains + fs_idacrtti in '..\fs_idacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/fsSDAC6.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/fsSDAC6.dpk new file mode 100644 index 0000000..5a7534b --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi6/fsSDAC6.dpk @@ -0,0 +1,43 @@ +// Package file for Delphi 6 + +package fsSDAC6; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + sdac60, + sdacvcl60, + fsDAC6, + fs6, + fsDB6; + +contains + fs_isdacrtti in '..\fs_isdacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/dclfrxSDAC7.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/dclfrxSDAC7.dpk new file mode 100644 index 0000000..cc81dc9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/dclfrxSDAC7.dpk @@ -0,0 +1,40 @@ +// Package file for Delphi 7 + +package dclfrxSDAC7; + +{$R '..\frxSDACReg.dcr'} +{$DESCRIPTION 'FastReport 4.0 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + frxDAC7, + frxSDAC7; + +contains + frxSDACReg in '..\frxSDACReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/dclfsSDAC7.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/dclfsSDAC7.dpk new file mode 100644 index 0000000..64c91da --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/dclfsSDAC7.dpk @@ -0,0 +1,42 @@ +// Package file for Delphi 7 + +package dclfsSDAC7; + +{$R '..\fs_isdacreg.dcr'} + +{$DESCRIPTION 'FastScript 1.9 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + fs7, + fsDAC7, + fsSDAC7; + +contains + fs_isdacreg in '..\fs_isdacreg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/frxDAC7.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/frxDAC7.dpk new file mode 100644 index 0000000..8769375 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/frxDAC7.dpk @@ -0,0 +1,46 @@ +// Package file for Delphi 7 + +package frxDAC7; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl, + vcldb, + dac70, + frx7, + frxDB7, +{$IFDEF QBUILDER} + fqb70, +{$ENDIF} + fs7; + +contains + frxDACEditor in '..\frxDACEditor.pas', + frxDACComponents in '..\frxDACComponents.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/frxSDAC7.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/frxSDAC7.dpk new file mode 100644 index 0000000..4356694 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/frxSDAC7.dpk @@ -0,0 +1,49 @@ +// Package file for Delphi 7 + +package frxSDAC7; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + sdac70, + sdacvcl70, + frxDAC7, + frx7, + frxDB7, +{$IFDEF QBUILDER} + fqb70, +{$ENDIF} + fs7; + +contains + frxSDACComponents in '..\frxSDACComponents.pas', + frxSDACEditor in '..\frxSDACEditor.pas', + frxSDACRTTI in '..\frxSDACRTTI.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/fsDAC7.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/fsDAC7.dpk new file mode 100644 index 0000000..0014ab7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/fsDAC7.dpk @@ -0,0 +1,41 @@ +// Package file for Delphi 7 + +package fsDAC7; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac70, + fs7, + fsDB7; + +contains + fs_idacrtti in '..\fs_idacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/fsSDAC7.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/fsSDAC7.dpk new file mode 100644 index 0000000..44198f2 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi7/fsSDAC7.dpk @@ -0,0 +1,43 @@ +// Package file for Delphi 7 + +package fsSDAC7; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + sdac70, + sdacvcl70, + fsDAC7, + fs7, + fsDB7; + +contains + fs_isdacrtti in '..\fs_isdacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfrxSDAC9.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfrxSDAC9.bdsproj new file mode 100644 index 0000000..f59bec2 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfrxSDAC9.bdsproj @@ -0,0 +1,173 @@ + + + + + + + + + + + + dclfrxSDAC9.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + FastReport 4.0 SDAC Components + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfrxSDAC9.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfrxSDAC9.dpk new file mode 100644 index 0000000..ea29739 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfrxSDAC9.dpk @@ -0,0 +1,40 @@ +// Package file for Delphi 2005 + +package dclfrxSDAC9; + +{$R '..\frxSDACReg.dcr'} +{$DESCRIPTION 'FastReport 4.0 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + frxDAC9, + frxSDAC9; + +contains + frxSDACReg in '..\frxSDACReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfsSDAC9.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfsSDAC9.bdsproj new file mode 100644 index 0000000..0bed81e --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfsSDAC9.bdsproj @@ -0,0 +1,19 @@ + + + + + + + + + + + + dclfsSDAC9.dpk + + + 7.0 + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfsSDAC9.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfsSDAC9.dpk new file mode 100644 index 0000000..d1f6401 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/dclfsSDAC9.dpk @@ -0,0 +1,42 @@ +// Package file for Delphi 2005 + +package dclfsSDAC9; + +{$R '..\fs_isdacreg.dcr'} + +{$DESCRIPTION 'FastScript 1.9 SDAC Components'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + DESIGNIDE, + fs9, + fsDAC9, + fsSDAC9; + +contains + fs_isdacreg in '..\fs_isdacreg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxDAC9.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxDAC9.bdsproj new file mode 100644 index 0000000..7694d45 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxDAC9.bdsproj @@ -0,0 +1,173 @@ + + + + + + + + + + + + frxDAC9.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxDAC9.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxDAC9.dpk new file mode 100644 index 0000000..560858c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxDAC9.dpk @@ -0,0 +1,46 @@ +// Package file for Delphi 2005 + +package frxDAC9; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl, + vcldb, + dac90, + frx9, + frxDB9, +{$IFDEF QBUILDER} + fqb90, +{$ENDIF} + fs9; + +contains + frxDACEditor in '..\frxDACEditor.pas', + frxDACComponents in '..\frxDACComponents.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxSDAC9.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxSDAC9.bdsproj new file mode 100644 index 0000000..cd44f81 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxSDAC9.bdsproj @@ -0,0 +1,173 @@ + + + + + + + + + + + + frxSDAC9.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxSDAC9.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxSDAC9.dpk new file mode 100644 index 0000000..20fdfd4 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/frxSDAC9.dpk @@ -0,0 +1,51 @@ +// Package file for Delphi 2005 + +package frxSDAC9; + +{$I frx.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac90, + sdac90, + dacvcl90, + sdacvcl90, + frxDAC9, + frx9, + frxDB9, +{$IFDEF QBUILDER} + fqb90, +{$ENDIF} + fs9; + +contains + frxSDACComponents in '..\frxSDACComponents.pas', + frxSDACEditor in '..\frxSDACEditor.pas', + frxSDACRTTI in '..\frxSDACRTTI.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsDAC9.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsDAC9.bdsproj new file mode 100644 index 0000000..a447a42 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsDAC9.bdsproj @@ -0,0 +1,168 @@ + + + + + + + + + + + + fsDAC9.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + + + + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsDAC9.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsDAC9.dpk new file mode 100644 index 0000000..6ef7946 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsDAC9.dpk @@ -0,0 +1,41 @@ +// Package file for Delphi 2005 + +package fsDAC9; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + dac90, + fs9, + fsDB9; + +contains + fs_idacrtti in '..\fs_idacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsSDAC9.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsSDAC9.bdsproj new file mode 100644 index 0000000..4e63c40 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsSDAC9.bdsproj @@ -0,0 +1,168 @@ + + + + + + + + + + + + fsSDAC9.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + + + + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsSDAC9.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsSDAC9.dpk new file mode 100644 index 0000000..75008d1 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Delphi9/fsSDAC9.dpk @@ -0,0 +1,43 @@ +// Package file for Delphi 2005 + +package fsSDAC9; + +{$I fs.inc} + +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} + +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $00400000} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + VCL, + VCLDB, + sdac90, + sdacvcl90, + fsDAC9, + fs9, + fsDB9; + +contains + fs_isdacrtti in '..\fs_isdacrtti.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/FRDemo.dpr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/FRDemo.dpr new file mode 100644 index 0000000..86680b9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/FRDemo.dpr @@ -0,0 +1,15 @@ +program FRDemo; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}, + Unit2 in 'Unit2.pas' {ReportData: TDataModule}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.CreateForm(TReportData, ReportData); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/FRDemo.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/FRDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..06b79d788939ce5da8b28e583024f76af57fa580 GIT binary patch literal 3372 zcmcJS{ZCtE6vt1;V1d}u7)YjZ(zG?{AY&{>!VfOf?58EZ#UK0!Ak$ymk|OQe0;P0r zY^B1osB2iqI$Lxji@c z^z(f0dCq*b@n|qnpw6&!w&xVGJvIjmv#uZz@QH4iEbq*jcb2kJ#`(%r-xL z-Fo$uQ{Uno`eZjv--1|#-}?HbWBAj>kTVjn?V=$Nu?R=au?1hE01dHZLQwWj@T+U< z!9d{l%*e{#UUamAqhr%> z6pIALuZg$fBdV#XiBZAb-Q9F7=`T%ctunB;Wx#JrVXRO5X!RKxldV4-4zt;82A{{{ zZEU1x4gb3dZ)d_yea-)@rX#cYfk1%6;V}3jk%-P;@+Fni;Fxwy%UC8HWn}Y%!C-lL zc{U$|e~E!byTkM)K5+~YfsUhqT;0OE!kIg{KN-8hQ6QD z@-iNQb{K7aJ{rAGW@uY{Mp5DEN2g>F@8>q!E#P!x4fsaS?GFFrmZ + Variables = <> + Style = <> + object Page1: TfrxReportPage + PaperWidth = 210.000000000000000000 + PaperHeight = 297.000000000000000000 + PaperSize = 9 + LeftMargin = 5.000000000000000000 + RightMargin = 5.000000000000000000 + TopMargin = 5.000000000000000000 + BottomMargin = 5.000000000000000000 + Columns = 1 + ColumnWidth = 210.000000000000000000 + ColumnPositions.Strings = ( + '0') + PrintOnPreviousPage = True + object Band1: TfrxPageFooter + Height = 22.677180000000000000 + Top = 298.582870000000000000 + Width = 755.906000000000000000 + object Memo5: TfrxMemoView + Left = 3.779530000000000000 + Top = 3.779530000000020000 + Width = 706.772110000000000000 + Height = 15.118120000000000000 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [] + Frame.Typ = [ftTop] + Frame.Width = 2.000000000000000000 + HAlign = haRight + Memo.Strings = ( + '[Page#]') + ParentFont = False + end + end + object Band2: TfrxReportTitle + Height = 26.456710000000000000 + Top = 18.897650000000000000 + Width = 755.906000000000000000 + object Memo6: TfrxMemoView + Left = 3.779530000000000000 + Top = 3.779530000000000000 + Width = 706.772110000000000000 + Height = 18.897650000000000000 + Color = clTeal + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold] + HAlign = haCenter + Memo.Strings = ( + 'Dept') + ParentFont = False + VAlign = vaBottom + end + end + object Band3: TfrxPageHeader + Height = 22.677180000000000000 + Top = 68.031540000000000000 + Width = 755.906000000000000000 + object Memo22: TfrxMemoView + Left = 3.779530000000000000 + Top = 3.779529999999990000 + Width = 706.772110000000000000 + Height = 15.118120000000000000 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [fsBold] + Frame.Typ = [ftTop] + Frame.Width = 2.000000000000000000 + ParentFont = False + end + end + object Band4: TfrxMasterData + Height = 45.354360000000000000 + Top = 151.181200000000000000 + Width = 755.906000000000000000 + Columns = 1 + ColumnWidth = 200.000000000000000000 + ColumnGap = 20.000000000000000000 + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + RowCount = 0 + object Memo23: TfrxMemoView + Left = 11.338590000000000000 + Width = 113.385826771654000000 + Height = 18.897650000000000000 + Color = clNavy + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [] + Frame.Typ = [ftTop] + Memo.Strings = ( + 'No') + ParentFont = False + VAlign = vaCenter + end + object Memo24: TfrxMemoView + Left = 11.338590000000000000 + Top = 18.897650000000000000 + Width = 113.385826771654000000 + Height = 26.456710000000000000 + Color = clNavy + DataField = 'DEPTNO' + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsItalic] + Memo.Strings = ( + 'Dept.DeptNo') + ParentFont = False + VAlign = vaCenter + end + object Memo25: TfrxMemoView + Left = 124.724409450000000000 + Width = 302.362204720000000000 + Height = 18.897650000000000000 + Color = clNavy + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [] + Frame.Typ = [ftTop] + Memo.Strings = ( + 'Name') + ParentFont = False + VAlign = vaCenter + end + object Memo26: TfrxMemoView + Left = 427.086614173228000000 + Width = 162.519790000000000000 + Height = 18.897650000000000000 + Color = clNavy + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [] + Frame.Typ = [ftTop] + Memo.Strings = ( + 'Location') + ParentFont = False + VAlign = vaCenter + end + object Memo27: TfrxMemoView + Left = 124.724409450000000000 + Top = 18.897650000000000000 + Width = 302.362204724409000000 + Height = 26.456710000000000000 + Color = clNavy + DataField = 'DNAME' + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsItalic] + Memo.Strings = ( + 'Dept.DName') + ParentFont = False + VAlign = vaCenter + end + object Memo28: TfrxMemoView + Left = 427.086614170000000000 + Top = 18.897650000000000000 + Width = 162.519790000000000000 + Height = 26.456710000000000000 + Color = clNavy + DataField = 'LOC' + DataSet = ReportData.DeptDS + DataSetName = 'Dept' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsItalic] + Memo.UTF8 = ( + 'Dept.Loc') + ParentFont = False + VAlign = vaCenter + end + object Memo29: TfrxMemoView + Left = 589.606299212598000000 + Width = 120.944881889764000000 + Height = 45.354360000000000000 + Color = clNavy + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsBold, fsItalic] + Frame.Typ = [ftRight, ftTop] + ParentFont = False + VAlign = vaCenter + end + object Memo7: TfrxMemoView + Left = 3.779530000000000000 + Width = 7.559060000000000000 + Height = 45.354360000000000000 + Color = clNavy + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsBold, fsItalic] + Frame.Typ = [ftLeft, ftTop] + ParentFont = False + VAlign = vaCenter + end + end + object Band5: TfrxDetailData + Height = 18.897650000000000000 + Top = 219.212740000000000000 + Width = 755.906000000000000000 + Columns = 1 + ColumnWidth = 200.000000000000000000 + ColumnGap = 20.000000000000000000 + DataSet = ReportData.EmpDS + DataSetName = 'Emp' + RowCount = 0 + object Memo4: TfrxMemoView + Left = 3.779530000000000000 + Width = 3.779530000000000000 + Height = 18.897650000000000000 + Color = clSilver + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -13 + Font.Name = 'Arial' + Font.Style = [fsBold] + Frame.Typ = [ftLeft] + ParentFont = False + end + object Memo8: TfrxMemoView + Left = 7.559060000000000000 + Width = 117.165430000000000000 + Height = 18.897650000000000000 + Color = clSilver + DataField = 'ENAME' + DataSet = ReportData.EmpDS + DataSetName = 'Emp' + Memo.Strings = ( + 'ENAME') + end + object Memo9: TfrxMemoView + Left = 124.724490000000000000 + Width = 362.834880000000000000 + Height = 18.897650000000000000 + Color = clSilver + DataField = 'JOB' + DataSet = ReportData.EmpDS + DataSetName = 'Emp' + Frame.Typ = [ftRight] + Memo.Strings = ( + 'JOB') + end + object Memo1: TfrxMemoView + Left = 487.559370000000000000 + Width = 222.992147950000000000 + Height = 18.897650000000000000 + Color = clSilver + DataField = 'SAL' + DataSet = ReportData.EmpDS + DataSetName = 'Emp' + Frame.Typ = [ftRight] + Memo.Strings = ( + 'SAL') + end + end + end + end + object frxDesigner1: TfrxDesigner + Restrictions = [] + Left = 260 + Top = 144 + end + object frxBarCodeObject1: TfrxBarCodeObject + Left = 228 + Top = 208 + end + object frxRichObject1: TfrxRichObject + Left = 228 + Top = 176 + end + object frxChartObject1: TfrxChartObject + Left = 260 + Top = 176 + end + object frxDialogControls1: TfrxDialogControls + Left = 292 + Top = 176 + end + object ImageList1: TImageList + Left = 324 + Top = 144 + Bitmap = { + 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000008400000084000000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000008400000000000000000000008400000084000000840000008400000084 + 0000008400000084000000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000840000FFFFFF0000000000000000000000000084848400C6C6C600C6C6 + C600FFFFFF00FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000084 + 000000840000FFFFFF0000000000C6C6C600FFFFFF0084848400000000000000 + 000000000000FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008400000084 + 0000FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000840000008400000084000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000084000000840000008400000084000000840000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000084000000FF0000008400000084000000840000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000084000000FF000000FF00000084000000840000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000840000008400000084000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00FFFFFF0000000000C6C6C600FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084848400FFFFFF0000840000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF00C6C6C6008484840084848400FFFFFF00FFFFFF00FFFFFF00FFFF + FF00848484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00FFFFFF008484840000000000000000008484840084848400FFFFFF00FFFF + FF00848484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000840000FFFF + FF00C6C6C6008484840000000000000000000000000000000000848484008484 + 8400848484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000084848400C6C6 + C600848484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008484 + 8400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00F1FFFFFF00000000E000FFFF00000000 + E000FFFF00000000E000FFFF00000000C000FFFF000000008000FC7F00000000 + 8000F83F000000008000F83F000000008000F83F000000008000FC7F00000000 + 8000FFFF000000008001FFFF000000008307FFFF0000000083C7FFFF00000000 + C7FFFFFF00000000EFFFFFFF0000000000000000000000000000000000000000 + 000000000000} + end + object frxOLEObject1: TfrxOLEObject + Left = 324 + Top = 176 + end + object frxCrossObject1: TfrxCrossObject + Left = 292 + Top = 208 + end + object frxDotMatrixExport1: TfrxDotMatrixExport + EscModel = 0 + GraphicFrames = False + SaveToFile = False + UseIniSettings = True + Left = 324 + Top = 208 + end + object frxBMPExport1: TfrxBMPExport + Left = 112 + Top = 248 + end + object frxJPEGExport1: TfrxJPEGExport + Left = 144 + Top = 248 + end + object frxTIFFExport1: TfrxTIFFExport + Left = 176 + Top = 248 + end + object frxTXTExport1: TfrxTXTExport + ScaleWidth = 1.000000000000000000 + ScaleHeight = 1.000000000000000000 + Borders = True + Pseudogrpahic = False + PageBreaks = True + OEMCodepage = False + EmptyLines = True + LeadSpaces = True + PrintAfter = False + PrinterDialog = True + UseSavedProps = True + ShowProgress = True + Left = 240 + Top = 248 + end + object frxHTMLExport1: TfrxHTMLExport + FixedWidth = True + Left = 272 + Top = 248 + end + object frxXLSExport1: TfrxXLSExport + ShowProgress = True + Left = 304 + Top = 248 + end + object frxXMLExport1: TfrxXMLExport + ShowProgress = True + Left = 336 + Top = 248 + end + object frxRTFExport1: TfrxRTFExport + ShowProgress = True + Left = 208 + Top = 248 + end + object frxGZipCompressor1: TfrxGZipCompressor + Left = 260 + Top = 80 + end + object frxSDACComponents1: TfrxSDACComponents + Left = 256 + Top = 208 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit1.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit1.pas new file mode 100644 index 0000000..8c14407 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit1.pas @@ -0,0 +1,74 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Db, DBTables, frxDesgn, frxClass, frxDCtrl, frxBDEComponents, + frxChart, frxRich, frxBarcode, ImgList, ComCtrls, ExtCtrls, frxOLE, + frxCross, frxDMPExport, frxExportImage, frxExportRTF, frxExportTXT, + frxExportXML, frxExportXLS, frxExportHTML, frxGZip, frxExportPDF, + frxSDACComponents, frxDACComponents; + +type + TForm1 = class(TForm) + DesignB: TButton; + frxDesigner1: TfrxDesigner; + frxBarCodeObject1: TfrxBarCodeObject; + frxRichObject1: TfrxRichObject; + frxChartObject1: TfrxChartObject; + frxDialogControls1: TfrxDialogControls; + ImageList1: TImageList; + PreviewB: TButton; + Image1: TImage; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + frxOLEObject1: TfrxOLEObject; + frxCrossObject1: TfrxCrossObject; + frxDotMatrixExport1: TfrxDotMatrixExport; + frxBMPExport1: TfrxBMPExport; + frxJPEGExport1: TfrxJPEGExport; + frxTIFFExport1: TfrxTIFFExport; + frxTXTExport1: TfrxTXTExport; + frxHTMLExport1: TfrxHTMLExport; + frxXLSExport1: TfrxXLSExport; + frxXMLExport1: TfrxXMLExport; + frxRTFExport1: TfrxRTFExport; + frxGZipCompressor1: TfrxGZipCompressor; + frxSDACComponents1: TfrxSDACComponents; + frxReport1: TfrxReport; + procedure DesignBClick(Sender: TObject); + procedure PreviewBClick(Sender: TObject); + procedure FormShow(Sender: TObject); + private + { Private declarations } + WPath: String; + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +procedure TForm1.FormShow(Sender: TObject); +begin + WPath := ExtractFilePath(Application.ExeName); + TfrxPDFExport.Create(nil); +end; + +procedure TForm1.DesignBClick(Sender: TObject); +begin + frxReport1.DesignReport; +end; + +procedure TForm1.PreviewBClick(Sender: TObject); +begin + frxReport1.ShowReport; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit2.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit2.dfm new file mode 100644 index 0000000..7dd8aec --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit2.dfm @@ -0,0 +1,60 @@ +object ReportData: TReportData + OldCreateOrder = False + Left = 422 + Top = 104 + Height = 220 + Width = 254 + object MSConnection: TMSConnection + Database = 'test' + Username = 'root' + Server = 'Server' + Left = 24 + Top = 16 + end + object Dept: TMSTable + TableName = 'dept' + Connection = MSConnection + FetchAll = True + Left = 96 + Top = 16 + end + object Emp: TMSTable + TableName = 'emp' + MasterFields = 'DEPTNO' + DetailFields = 'DEPTNO' + MasterSource = DeptSource + Connection = MSConnection + FetchAll = True + Left = 168 + Top = 16 + ParamData = < + item + DataType = ftInteger + Name = 'DEPTNO' + ParamType = ptInput + Value = 60 + end> + end + object DeptSource: TDataSource + DataSet = Dept + Left = 96 + Top = 64 + end + object EmpSource: TDataSource + DataSet = Emp + Left = 168 + Top = 64 + end + object DeptDS: TfrxDBDataset + UserName = 'Dept' + DataSource = DeptSource + Left = 96 + Top = 112 + end + object EmpDS: TfrxDBDataset + UserName = 'Emp' + DataSource = EmpSource + Left = 168 + Top = 112 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit2.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit2.pas new file mode 100644 index 0000000..2f34471 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/Demo/Unit2.pas @@ -0,0 +1,31 @@ +unit Unit2; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + frxDBSet, DBTables, Db, frxClass, MemDS, DBAccess, MSAccess; + +type + TReportData = class(TDataModule) + MSConnection: TMSConnection; + Dept: TMSTable; + Emp: TMSTable; + DeptSource: TDataSource; + EmpSource: TDataSource; + DeptDS: TfrxDBDataset; + EmpDS: TfrxDBDataset; + private + { Private declarations } + public + { Public declarations } + end; + +var + ReportData: TReportData; + +implementation + +{$R *.DFM} + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/ReadMe.txt new file mode 100644 index 0000000..1480865 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/ReadMe.txt @@ -0,0 +1,37 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demo for FastReport included in SDAC was built and tested using +Fast Report 4.0. + +IMPORTANT NOTE: + Demo is provided as is, and there is no warranty that it is fully + compatible with other versions of Fast Report. + +Before using Demo you should install FastReport 4 SDAC Components. +The following instruction will help you to compile and install +FastReport 4 SDAC Components manually using IDE. + +Delphi and C++Builder for Win32 +-------------------------------- + +Run your IDE and walk through the following steps: + 1) Compile DAC run-time package (frxDACXX.dpk) + 2) Compile SDAC run-time package (frxSDACXX.dpk) + 3) Compile and install SDAC design-time package (dclfrxSDACXX.dpk) + +You can find these packages in + Demos\Win32\ThirdParty\FastReport\FR4\Delphi5\*.dpk - for Delphi 5 + Demos\Win32\ThirdParty\FastReport\FR4\Delphi6\*.dpk - for Delphi 6 + Demos\Win32\ThirdParty\FastReport\FR4\Delphi7\*.dpk - for Delphi 7 + Demos\Win32\ThirdParty\FastReport\FR4\Delphi9\*.dpk - for Delphi 2005 + Demos\Win32\ThirdParty\FastReport\FR4\Delphi10\*.dpk - for Delphi 2006 + Demos\Win32\ThirdParty\FastReport\FR4\Delphi11\*.dpk - for Delphi 2007 + Demos\Win32\ThirdParty\FastReport\FR4\CBuilder5\*.bpk - for C++Builder 5 + Demos\Win32\ThirdParty\FastReport\FR4\CBuilder6\*.bpk - for C++Builder 6 + +To compile applications based on FastReport 4 SDAC Components, add the following +path to the "Library Path": +%SDAC%\Demos\Win32\ThirdParty\FastReport\FR4\ +where %SDAC% is the SDAC installation path on your computer. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/file_id.diz b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/file_id.diz new file mode 100644 index 0000000..17e48ec --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/file_id.diz @@ -0,0 +1,5 @@ +SDAC components for FastReport 4.0 + + +Created by: CoreLab +E-mail: sdac@crlab.com diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxDACComponents.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxDACComponents.pas new file mode 100644 index 0000000..2640228 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxDACComponents.pas @@ -0,0 +1,513 @@ + +{******************************************} +{ } +{ FastReport v4.0 } +{ DAC enduser components } +{ } + +// Created by: CoreLab +// E-mail: support@crlab.com + +{ } +{******************************************} + +unit frxDACComponents; + +interface + +{$I frx.inc} + +uses + Windows, SysUtils, Classes, frxClass, frxCustomDB, DB, DBAccess, Graphics +{$IFDEF Delphi6} +, Variants +{$ENDIF} + {$IFDEF QBUILDER} +, fqbClass + {$ENDIF} +; + +type + + TfrxDACComponentsClass = class of TfrxDACComponents; + TfrxDACDatabaseClass = class of TfrxDACDatabase; + TfrxDACTableClass = class of TfrxDACTable; + TfrxDACQueryClass = class of TfrxDACQuery; + + TfrxDACComponents = class(TfrxDBComponents) + protected + FDefaultDatabase: TCustomDAConnection; + public + function GetDescription: string; override; + + class function GetComponentsBitmap: TBitmap; virtual; + class function GetComponentsName: string; virtual; + class function ResourceName: string; virtual; abstract; + class function GetDatabaseClass: TfrxDACDatabaseClass; virtual; abstract; + class function GetTableClass: TfrxDACTableClass; virtual; abstract; + class function GetQueryClass: TfrxDACQueryClass; virtual; abstract; + + property DefaultDatabase: TCustomDAConnection read FDefaultDatabase write FDefaultDatabase; + end; + + TfrxDACDatabase = class(TfrxCustomDatabase) + protected + FDatabase: TCustomDAConnection; + FParams: Tstrings; + function GetLoginPrompt: Boolean; override; + procedure SetLoginPrompt(Value: Boolean); override; + function GetUsername: string; + procedure SetUsername(const Value: string); + function GetPassword: string; + procedure SetPassword(const Value: string); + function GetServer: string; + procedure SetServer(const Value: string); + function GetConnected: Boolean; override; + procedure SetConnected(Value: Boolean); override; + function GetParams: Tstrings; override; + procedure SetParams(Value: Tstrings); override; + protected + + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + class function GetDescription: string; override; + procedure SetLogin(const Login, Password: string); override; + property Database: TCustomDAConnection read FDatabase write FDatabase; + property Username: string read GetUsername write SetUsername; + property Password: string read GetPassword write SetPassword; + property Server: string read GetServer write SetServer; + Property Params: Tstrings read GetParams write SetParams; + end; + + TfrxDACTable = class(TfrxCustomTable) + private + FDatabase: TfrxDACDatabase; + protected + procedure SetDatabase(const Value: TfrxDACDatabase); virtual; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + + public + constructor Create(AOwner: TComponent); override; + constructor DesignCreate(AOwner: TComponent; Flags: Word); override; + class function GetDescription: string; override; + procedure BeforeStartReport; override; + property Database: TfrxDACDatabase read FDatabase write SetDatabase; + end; + + TfrxDACQuery = class(TfrxCustomQuery) + private + FDatabase: TfrxDACDatabase; + protected + FQuery: TCustomDADataSet; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetMaster(const Value: TDataSource); override; + procedure SetSQL(Value: Tstrings); override; + function GetSQL: Tstrings; override; + procedure SetDatabase(const Value: TfrxDACDatabase); virtual; + procedure SetIndexName(const Value: string); + function GetIndexName: string; + procedure SetMasterFields(const Value: string); override; + public + constructor Create(AOwner: TComponent); override; + constructor DesignCreate(AOwner: TComponent; Flags: Word); override; + class function GetDescription: string; override; + procedure BeforeStartReport; override; + procedure UpdateParams; override; + property Query: TCustomDADataSet read FQuery; + property Database: TfrxDACDatabase read FDatabase write SetDatabase; + property IndexName: string read GetIndexName write SetIndexName; + end; + + {$IFDEF QBUILDER} + TfrxEngineDAC = class(TfqbEngine) + protected + FQuery: TCustomDADataSet; + public + procedure ReadTableList(ATableList: Tstrings); override; + function ResultDataSet: TDataSet; override; + procedure SetSQL(const Value: string); override; + end; + {$ENDIF} + + procedure SetDelimitedText(strings: Tstrings; Delimiter:Char; const Value: string); + procedure GetMasterDetailNames(const Value: string; var MasterNames: string; var DetailNames: string); + procedure RegisterDacComponents(Components: TfrxDACComponentsClass); + procedure UnRegisterDacComponents(Components: TfrxDACComponentsClass); + +implementation + +uses +{$IFNDEF NO_EDITORS} + frxDACEditor, +{$ENDIF} + frxDsgnIntf, frxRes; + +procedure RegisterDacComponents(Components: TfrxDACComponentsClass); +begin + frxObjects.RegisterCategory(Components.GetComponentsName, Components.GetComponentsBitmap, Components.GetComponentsName + ' Components'); + frxObjects.RegisterObject1(Components.GetDatabaseClass, nil, '', Components.GetComponentsName, 0, 37); + frxObjects.RegisterObject1(Components.GetTableClass, nil, '', Components.GetComponentsName, 0, 38); + frxObjects.RegisterObject1(Components.GetQueryClass, nil, '', Components.GetComponentsName, 0, 39); +end; + +procedure UnRegisterDacComponents(Components: TfrxDACComponentsClass); +begin + frxObjects.UnRegister(Components.GetDatabaseClass); + frxObjects.UnRegister(Components.GetTableClass); + frxObjects.UnRegister(Components.GetQueryClass); +end; + +{$IFNDEF VER6P} +procedure SetDelimitedText(strings: Tstrings; Delimiter:Char; const Value: string); +var + P, P1: PChar; + S: string; +begin + with strings do begin + BeginUpdate; + try + Clear; + P := PChar(Value); + while P^ in [#1..' '] do + {$IFDEF MSWINDOWS} + P := CharNext(P); + {$ELSE} + Inc(P); + {$ENDIF} + while P^ <> #0 do begin + if P^ = '"' then + S := AnsiExtractQuotedStr(P, '"') + else begin + P1 := P; + while (P^ > ' ') and (P^ <> Delimiter) do + {$IFDEF MSWINDOWS} + P := CharNext(P); + {$ELSE} + Inc(P); + {$ENDIF} + Setstring(S, P1, P - P1); + end; + Add(S); + while P^ in [#1..' '] do + {$IFDEF MSWINDOWS} + P := CharNext(P); + {$ELSE} + Inc(P); + {$ENDIF} + if P^ = Delimiter then begin + P1 := P; + {$IFDEF MSWINDOWS} + if CharNext(P1)^ = #0 then + {$ELSE} + Inc(P1); + if P1^ = #0 then + {$ENDIF} + Add(''); + repeat + {$IFDEF MSWINDOWS} + P := CharNext(P); + {$ELSE} + Inc(P); + {$ENDIF} + until not (P^ in [#1..' ']); + end; + end; + finally + EndUpdate; + end; + end; +end; +{$ENDIF} + +procedure GetMasterDetailNames(const Value: string; var MasterNames: string; var DetailNames: string); +var + List: TstringList; + i: integer; +begin + List := TstringList.Create; + try +{$IFNDEF VER6P} + SetDelimitedText(List, ';', Value); +{$ELSE} + List.Delimiter := ';'; + List.DelimitedText := Value; +{$ENDIF} + MasterNames := ''; + DetailNames := ''; + for i := 0 to List.Count - 1 do begin + if MasterNames <> '' then + MasterNames := MasterNames + ';'; + if DetailNames <> '' then + DetailNames := DetailNames + ';'; + MasterNames := MasterNames + List.Values[List.Names[i]]; + DetailNames := DetailNames + List.Names[i]; + end; + finally + List.Free; + end; +end; + +{ TfrxDACComponents } + +class function TfrxDACComponents.GetComponentsBitmap: TBitmap; +begin + Result := nil; +end; + +class function TfrxDACComponents.GetComponentsName: string; +begin + result := 'DAC'; +end; + +function TfrxDACComponents.GetDescription: string; +begin + Result := 'DAC'; +end; + +{ TfrxDACDatabase } + +function TfrxDACDatabase.GetParams: Tstrings; +begin + Result := FParams; +end; + +procedure TfrxDACDatabase.SetParams(Value: Tstrings); +begin + FParams := Value; +end; + +constructor TfrxDACDatabase.Create(AOwner: TComponent); +begin + inherited; + FParams := TstringList.Create; +end; + +destructor TfrxDACDatabase.Destroy; +begin + inherited; +end; + +class function TfrxDACDatabase.GetDescription: string; +begin + Result := 'DAC Database'; +end; + +function TfrxDACDatabase.GetConnected: Boolean; +begin + Result := FDatabase.Connected; +end; + +function TfrxDACDatabase.GetUsername: string; +begin + Result := FDatabase.Username; +end; + +function TfrxDACDatabase.GetPassword: string; +begin + Result := FDatabase.Password +end; + +function TfrxDACDatabase.GetServer: string; +begin + Result := FDatabase.Server; +end; + +function TfrxDACDatabase.GetLoginPrompt: Boolean; +begin + Result := FDatabase.LoginPrompt; +end; + +procedure TfrxDACDatabase.SetConnected(Value: Boolean); +begin + FDatabase.Connected := Value; +end; + +procedure TfrxDACDatabase.SetUsername(const Value: string); +begin + FDatabase.Username := Value; +end; + +procedure TfrxDACDatabase.SetPassword(const Value: string); +begin + FDatabase.Password := Value; +end; + +procedure TfrxDACDatabase.SetServer(const Value: string); +begin + FDatabase.Server := Value; +end; + +procedure TfrxDACDatabase.SetLoginPrompt(Value: Boolean); +begin + FDatabase.LoginPrompt := Value; +end; + +procedure TfrxDACDatabase.SetLogin(const Login, Password: string); +begin + Self.UserName := Login; + Self.Password := Password; +end; + +{ TfrxDACTable } + +constructor TfrxDACTable.Create(AOwner: TComponent); +begin + SetDatabase(nil); + inherited; +end; + +constructor TfrxDACTable.DesignCreate(AOwner: TComponent; Flags: Word); +var + i: Integer; + l: TList; +begin + inherited; + l := Report.AllObjects; + for i := 0 to l.Count - 1 do + if TObject(l[i]) is TfrxDACDatabase then + begin + Database := TfrxDACDatabase(l[i]); + break; + end; +end; + +class function TfrxDACTable.GetDescription: string; +begin + Result := 'DAC Table'; +end; + +procedure TfrxDACTable.BeforeStartReport; +begin + SetDatabase(FDatabase); +end; + +procedure TfrxDACTable.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FDatabase) then + SetDatabase(nil); +end; + +procedure TfrxDACTable.SetDatabase(const Value: TfrxDACDatabase); +begin + FDatabase := Value; +end; + +{ TfrxDACQuery } + +constructor TfrxDACQuery.Create(AOwner: TComponent); +begin + Dataset := FQuery; + Database := nil; + inherited Create(AOwner); +end; + +constructor TfrxDACQuery.DesignCreate(AOwner: TComponent; Flags: Word); +var + i: Integer; + l: TList; +begin + inherited; + l := Report.AllObjects; + for i := 0 to l.Count - 1 do + if TObject(l[i]) is TfrxDACDatabase then + begin + SetDatabase(TfrxDACDatabase(l[i])); + break; + end; +end; + +class function TfrxDACQuery.GetDescription: string; +begin + Result := 'DAC Query'; +end; + +procedure TfrxDACQuery.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FDatabase) then + SetDatabase(nil); +end; + +procedure TfrxDACQuery.SetDatabase(const Value: TfrxDACDatabase); +begin + FDatabase := Value; +end; + +procedure TfrxDACQuery.SetIndexName(const Value: string); +begin + FQuery.IndexFieldNames := Value; +end; + +function TfrxDACQuery.GetIndexName: string; +begin + Result := FQuery.IndexFieldNames; +end; + +function TfrxDACQuery.GetSQL: Tstrings; +begin + Result := FQuery.SQL; +end; + +procedure TfrxDACQuery.SetSQL(Value: Tstrings); +begin + FQuery.SQL := Value; +end; + +procedure TfrxDACQuery.SetMaster(const Value: TDataSource); +begin + FQuery.MasterSource := Value; +end; + +procedure TfrxDACQuery.BeforeStartReport; +begin + SetDatabase(FDatabase); + { needed to update parameters } + SQL.Text := SQL.Text; +end; + +procedure TfrxDACQuery.UpdateParams; +var + i: integer; +begin // Bug with ftCursor datatype + for i := 0 to Params.Count - 1 do // Problem with calling static method + if FQuery.Params.FindParam(Params[i].Name) <> nil then // TParam.SetDataType instead TOraParam.SetDataType + FQuery.ParamByName(Params[i].Name).DataType := Params[i].DataType; + + frxParamsToTParams(Self, FQuery.Params); +end; + +procedure TfrxDACQuery.SetMasterFields(const Value: string); +var + MasterNames: string; + DetailNames: string; +begin + GetMasterDetailNames(MasterFields, MasterNames, DetailNames); + FQuery.MasterFields := MasterNames; + FQuery.DetailFields := DetailNames; +end; + + {$IFDEF QBUILDER} + +{ TfrxEngineDAC } + +procedure TfrxEngineDAC.ReadTableList(ATableList: Tstrings); +begin + ATableList.Clear; + FQuery.Connection.GetTableNames(ATableList); +end; + +function TfrxEngineDAC.ResultDataSet: TDataSet; +begin + Result := FQuery; +end; + +procedure TfrxEngineDAC.SetSQL(const Value: string); +begin + FQuery.SQL.Text := Value; +end; + {$ENDIF} + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxDACEditor.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxDACEditor.pas new file mode 100644 index 0000000..6442791 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxDACEditor.pas @@ -0,0 +1,50 @@ + +{******************************************} +{ } +{ FastReport v4.0 } +{ DAC components design editors } +{ } + +// Created by: CoreLab +// E-mail: support@crlab.com + +{ } +{******************************************} + +unit frxDACEditor; + +interface + +{$I frx.inc} + +uses + Windows, Classes, SysUtils, Forms, Dialogs, frxDACComponents, frxCustomDB, + frxDsgnIntf, frxRes +{$IFDEF Delphi6} +, Variants +{$ENDIF}; + + +type + TfrxTableNameProperty = class(TfrxStringProperty) + public + function GetAttributes: TfrxPropertyAttributes; override; + procedure SetValue(const Value: String); override; + end; + +implementation + +{ TfrxTableNameProperty } + +function TfrxTableNameProperty.GetAttributes: TfrxPropertyAttributes; +begin + Result := [paMultiSelect, paValueList, paSortList]; +end; + +procedure TfrxTableNameProperty.SetValue(const Value: String); +begin + inherited; + Designer.UpdateDataTree; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACComponents.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACComponents.pas new file mode 100644 index 0000000..8731b84 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACComponents.pas @@ -0,0 +1,404 @@ +{******************************************} +{ } +{ FastReport v4.0 } +{ SDAC enduser components } +{ } + +// Created by: CoreLab +// E-mail: sdac@crlab.com + +{ } +{******************************************} + +unit frxSDACComponents; + +interface + +{$I frx.inc} + +uses + Windows, SysUtils, Classes, frxClass, frxCustomDB, DB, MSAccess, OLEDBAccess, + Graphics, OLEDBC, SdacVcl, frxDACComponents + {$IFDEF Delphi6} +, Variants + {$ENDIF} + {$IFDEF QBUILDER} +, fqbClass + {$ENDIF} +; + +type + TSDACTable = class(TMSTable) + protected + procedure InitFieldDefs; override; + end; + + TSDACQuery = class(TMSQuery) + protected + procedure InitFieldDefs; override; + end; + + TfrxSDACComponents = class(TfrxDACComponents) + protected + FOldComponents: TfrxDACComponents; + function GetDefaultDatabase: TMSConnection; + procedure SetDefaultDatabase(Value: TMSConnection); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + function GetDescription: string; override; + + class function GetComponentsBitmap: TBitmap; override; + class function GetComponentsName: string; override; + class function ResourceName: string; override; + class function GetDatabaseClass: TfrxDACDatabaseClass; override; + class function GetTableClass: TfrxDACTableClass; override; + class function GetQueryClass: TfrxDACQueryClass; override; + published + property DefaultDatabase: TMSConnection read GetDefaultDatabase write SetDefaultDatabase; + end; + + TfrxSDACDatabase = class(TfrxDACDatabase) + private + protected + function GetDatabaseName: string; override; + procedure SetDatabaseName(const Value: string); override; + + public + constructor Create(AOwner: TComponent); override; + class function GetDescription: string; override; + + published + property LoginPrompt; + property DatabaseName; + property Username; + property Password; + property Server; + property Connected; + Property Params; + end; + + TfrxSDACTable = class(TfrxDACTable) + private + FTable: TSDACTable; + protected + procedure SetDatabase(const Value: TfrxDACDatabase); override; + procedure SetMaster(const Value: TDataSource); override; + procedure SetMasterFields(const Value: string); override; + procedure SetIndexFieldNames(const Value: string); override; + function GetIndexFieldNames: string; override; + function GetTableName: string; override; + procedure SetTableName(const Value: string); override; + public + constructor Create(AOwner: TComponent); override; + class function GetDescription: string; override; + + property Table: TSDACTable read FTable; + published + property Database; + Property TableName: string read GetTableName write setTableName; + end; + + TfrxSDACQuery = class(TfrxDACQuery) + protected + procedure SetDatabase(const Value: TfrxDACDatabase); override; + public + constructor Create(AOwner: TComponent); override; + class function GetDescription: string; override; +{$IFDEF QBUILDER} + function QBEngine: TfqbEngine; override; +{$ENDIF} + published + property Database; + property IndexName; + property MasterFields; + end; + + {$IFDEF QBUILDER} + TfrxEngineSDAC = class(TfrxEngineDAC) + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure ReadFieldList(const ATableName: string; var AFieldList: TfqbFieldList); override; + end; + {$ENDIF} + +var + CatBmp: TBitmap; + SDACComponents: TfrxDACComponents; + +implementation + +{$R *.res} + +uses + frxSDACRTTI, +{$IFNDEF NO_EDITORS} + frxSDACEditor, +{$ENDIF} + frxDsgnIntf, frxRes; + +{ TSDACTable } + +procedure TSDACTable.InitFieldDefs; +begin + if (TableName <> '') and (Assigned(Connection)) then + inherited; +end; + +{ TSDACQuery } + +procedure TSDACQuery.InitFieldDefs; +begin + if (SQL.Text <> '') and Assigned(Connection) then + inherited; +end; + +{ TfrxSDACComponents } + +constructor TfrxSDACComponents.Create(AOwner: TComponent); +begin + inherited; + + FOldComponents := SDACComponents; + SDACComponents := Self; +end; + +destructor TfrxSDACComponents.Destroy; +begin + if SDACComponents = Self then + SDACComponents := FOldComponents; + + inherited; +end; + +function TfrxSDACComponents.GetDefaultDatabase: TMSConnection; +begin + Result := TMSConnection(FDefaultDatabase); +end; + +procedure TfrxSDACComponents.SetDefaultDatabase(Value: TMSConnection); +begin + FDefaultDatabase := Value; +end; + +class function TfrxSDACComponents.GetComponentsBitmap: TBitmap; +begin + Result := CatBmp; +end; + +class function TfrxSDACComponents.GetComponentsName: string; +begin + Result := 'SDAC'; +end; + +class function TfrxSDACComponents.GetDatabaseClass: TfrxDACDatabaseClass; +begin + Result := TfrxSDACDatabase; +end; + +class function TfrxSDACComponents.GetTableClass: TfrxDACTableClass; +begin + Result := TfrxSDACTable; +end; + +class function TfrxSDACComponents.GetQueryClass: TfrxDACQueryClass; +begin + Result := TfrxSDACQuery; +end; + +class function TfrxSDACComponents.ResourceName: string; +begin + Result := 'FRXSDACOBJECTS'; +end; + +function TfrxSDACComponents.GetDescription: string; +begin + Result := 'SDAC'; +end; + +{ TfrxSDACDatabase } + +constructor TfrxSDACDatabase.Create(AOwner: TComponent); +begin + inherited; + FDatabase := TMSConnection.Create(nil); + Component := FDatabase; +end; + +class function TfrxSDACDatabase.GetDescription: string; +begin + Result := 'SDAC Database'; +end; + +function TfrxSDACDatabase.GetDatabaseName: string; +begin + Result := TMSConnection(FDatabase).Database; +end; + +procedure TfrxSDACDatabase.SetDatabaseName(const Value: string); +begin + TMSConnection(FDatabase).Database := Value; +end; + +{ TfrxSDACTable } + +constructor TfrxSDACTable.Create(AOwner: TComponent); +begin + FTable := TSDACTable.Create(nil); + DataSet := FTable; + SetDatabase(nil); + inherited; +end; + +class function TfrxSDACTable.GetDescription: string; +begin + Result := 'SDAC Table'; +end; + +procedure TfrxSDACTable.SetDatabase(const Value: TfrxDACDatabase); +begin + inherited; + + if Value <> nil then + FTable.Connection := TMSConnection(Value.Database) + else + if SDACComponents <> nil then + FTable.Connection := TMSConnection(SDACComponents.DefaultDatabase) + else + FTable.Connection := nil; +end; + +function TfrxSDACTable.GetIndexFieldNames: string; +begin + Result := FTable.IndexFieldNames; +end; + +function TfrxSDACTable.GetTableName: string; +begin + Result := FTable.TableName; +end; + +procedure TfrxSDACTable.SetIndexFieldNames(const Value: string); +begin + FTable.IndexFieldNames := Value; +end; + +procedure TfrxSDACTable.SetTableName(const Value: string); +begin + FTable.TableName := Value; + if Assigned(FTable.Connection) then + FTable.InitFieldDefs; +end; + +procedure TfrxSDACTable.SetMaster(const Value: TDataSource); +begin + FTable.MasterSource := Value; +end; + +procedure TfrxSDACTable.SetMasterFields(const Value: string); +var + MasterNames: string; + DetailNames: string; +begin + GetMasterDetailNames(MasterFields, MasterNames, DetailNames); + FTable.MasterFields := MasterNames; + FTable.DetailFields := DetailNames; +end; + +{ TfrxSDACQuery } + +constructor TfrxSDACQuery.Create(AOwner: TComponent); +begin + FQuery := TSDACQuery.Create(nil); + + inherited Create(AOwner); +end; + +class function TfrxSDACQuery.GetDescription: string; +begin + Result := 'SDAC Query'; +end; + +procedure TfrxSDACQuery.SetDatabase(const Value: TfrxDACDatabase); +begin + inherited; + + if Value <> nil then + FQuery.Connection := Value.Database + else + if SDACComponents <> nil then + FQuery.Connection := TMSConnection(SDACComponents.DefaultDatabase) + else + FQuery.Connection := nil; +end; + +{$IFDEF QBUILDER} +function TfrxSDACQuery.QBEngine: TfqbEngine; +begin + Result := TfrxEngineSDAC.Create(nil); + TfrxEngineSDAC(Result).FQuery.Connection := TCustomMSConnection(FQuery.Connection); +end; +{$ENDIF} + +{$IFDEF QBUILDER} + +{ TfrxEngineSDAC } + +constructor TfrxEngineSDAC.Create(AOwner: TComponent); +begin + inherited; + FQuery := TSDACQuery.Create(Self); +end; + +destructor TfrxEngineSDAC.Destroy; +begin + FQuery.Free; + inherited; +end; + +procedure TfrxEngineSDAC.ReadFieldList(const ATableName: string; + var AFieldList: TfqbFieldList); +var + TempTable: TSDACTable; + Fields: TFieldDefs; + i: Integer; + tmpField: TfqbField; +begin + AFieldList.Clear; + TempTable := TSDACTable.Create(Self); + try + TempTable.Connection := TCustomMSConnection(FQuery.Connection); + TempTable.TableName := ATableName; + Fields := TempTable.FieldDefs; + try + TempTable.Active := True; + tmpField:= TfqbField(AFieldList.Add); + tmpField.FieldName := '*'; + for i := 0 to Fields.Count - 1 do begin + tmpField := TfqbField(AFieldList.Add); + tmpField.FieldName := Fields.Items[i].Name; + tmpField.FieldType := Ord(Fields.Items[i].DataType) + end; + except + end; + finally + TempTable.Free; + end; +end; + + {$ENDIF} + +initialization + CatBmp := TBitmap.Create; + CatBmp.LoadFromResourceName(hInstance, TfrxSDACComponents.ResourceName); + RegisterDacComponents(TfrxSDACComponents); + +finalization + UnRegisterDacComponents(TfrxSDACComponents); + CatBmp.Free; +end. + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACComponents.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACComponents.res new file mode 100644 index 0000000000000000000000000000000000000000..ec9bef974c33f7a271bd3e3c259caab75c9509f7 GIT binary patch literal 900 zcmZQzU|>)H;{X347|28c8q5p~Hb9a8|Ct!v7=jog7=jsG7#ta#8T=WX7`zxjZYDAV*&H|Wb`0Sjkoi#cFPOpV{Y(3h%`cq48K^$%%Eum>E`&MAZ1Z4Az7H-YC z`eoLO?^{3rI`reu;U9kwe*e4v!|(n_-?J}#u;1}Cqa+VT41%3F`89JyGtV#k#2$B@kj>OJ}R)v~iUdUl?u dTCppC_J-^kYm4S@Zd$W<&i=E9Za#!71^~qASSSDh literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACEditor.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACEditor.pas new file mode 100644 index 0000000..1e52fb5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACEditor.pas @@ -0,0 +1,77 @@ + +{******************************************} +{ } +{ FastReport v4.0 } +{ SDAC components design editors } +{ } + +// Created by: CoreLab +// E-mail: sdac@crlab.com + +{ } +{******************************************} + +unit frxSDACEditor; + +interface + +{$I frx.inc} + +implementation + +uses + Windows, SysUtils, Classes, frxClass, frxDsgnIntf, frxCustomDB, DB, + MSAccess, OLEDBAccess, OLEDBC, SdacVcl, frxRes, frxSDACComponents, frxDACEditor +{$IFDEF Delphi6} +, Variants +{$ENDIF}; + + +type + TfrxMSDatabaseProperty = class(TfrxComponentProperty) + public + function GetValue: String; override; + end; + + TfrxMSTableNameProperty = class(TfrxTableNameProperty) + public + procedure GetValues; override; + end; + +{ TfrxMSDatabaseProperty } + +function TfrxMSDatabaseProperty.GetValue: String; +var + db: TfrxSDACDatabase; +begin + db := TfrxSDACDatabase(GetOrdValue); + if db = nil then + begin + if (SDACComponents <> nil) and (SDACComponents.DefaultDatabase <> nil) then + Result := SDACComponents.DefaultDatabase.Name + else + Result := frxResources.Get('prNotAssigned'); + end + else + Result := inherited GetValue; +end; + +{ TfrxMSTableNameProperty } + +procedure TfrxMSTableNameProperty.GetValues; +begin + inherited; + with TfrxSDACTable(Component).Table do + if Connection <> nil then + Connection.GetTableNames(Values); +end; + +initialization + frxPropertyEditors.Register(TypeInfo(TfrxSDACDatabase), TfrxSDACTable, 'Database', + TfrxMSDatabaseProperty); + frxPropertyEditors.Register(TypeInfo(TfrxSDACDatabase), TfrxSDACQuery, 'Database', + TfrxMSDatabaseProperty); + frxPropertyEditors.Register(TypeInfo(String), TfrxSDACTable, 'TableName', + TfrxMSTableNameProperty); + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACRTTI.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACRTTI.pas new file mode 100644 index 0000000..1b7b1da --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACRTTI.pas @@ -0,0 +1,69 @@ +{******************************************} +{ } +{ FastReport v4.0 } +{ SDAC components RTTI } +{ } + +// Created by: CoreLab +// E-mail: sdac@crlab.com + +{ } +{******************************************} + +unit frxSDACRTTI; + +interface + +{$I frx.inc} + +implementation + +uses + Windows, Classes, fs_iinterpreter, frxSDACComponents +{$IFDEF Delphi6} +, Variants +{$ENDIF}; + + +type + TFunctions = class(TfsRTTIModule) + private + function CallMethod(Instance: TObject; ClassType: TClass; + const MethodName: String; Caller: TfsMethodHelper): Variant; + public + constructor Create(AScript: TfsScript); override; + end; + +{ TFunctions } + +constructor TFunctions.Create(AScript: TfsScript); +begin + inherited Create(AScript); + with AScript do + begin + AddClass(TfrxSDACDatabase, 'TfrxCustomDatabase'); + AddClass(TfrxSDACTable, 'TfrxCustomTable'); + with AddClass(TfrxSDACQuery, 'TfrxCustomQuery') do + AddMethod('procedure ExecSQL', CallMethod); + end; +end; + +function TFunctions.CallMethod(Instance: TObject; ClassType: TClass; + const MethodName: String; Caller: TfsMethodHelper): Variant; +begin + Result := 0; + if ClassType = TfrxSDACQuery then + begin + if MethodName = 'EXECSQL' then + TfrxSDACQuery(Instance).Query.Execute; + end +end; + +initialization + fsRTTIModules.Add(TFunctions); + +finalization + if fsRTTIModules <> nil then + fsRTTIModules.Remove(TFunctions); + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACReg.dcr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACReg.dcr new file mode 100644 index 0000000000000000000000000000000000000000..14ec6abe69e2c5dbeb9dfb274e3c9426362dcfa9 GIT binary patch literal 1868 zcmd6l%TE(Q9LL8;OuTW_oAKly;0-Uv#|<@#3E~O3_>9JcXfP&t@M1KIF#-h%5R6*E zpn@U&2;9o-`{r^A%yn9R8=}b z{x$-;5IPDws=6H&qT}c^Dne&q=P)_~zmuo{or3iQItH^4{>hHKyuCZK`T&SMnYm3@ z2=xPZ_4qzA@=vOJ%<=fcz@3(lm+CvOH1?SLfBc1wny%psy>n08(MJI(e<-!P*}cDN zptZ-cRn+Cit|AAnVT6ZXE`K1l!yH77p4+u=4Nm3e#>M9Db9U~TpL^hC4*};jgBslB z)oqj`#g}l*Ek>MTWKIar2%%{qI3+NXJY(kr6TIKb`Nw(R7(D7~OK-8AtM+plKd%D7 zxn*jn9Fp`&NiU8qiqQoenb&EvLg**Z_@G0l*#HQfYcKoG+j2RYpNjhT8BQu-GnLtD zwVKFT0o7iFXz`2Zzi)}3RlkIEaX8pSihYJ!mASIV^!i(ceBJ>z_;iyv#&qAAG zP%{Q?0_R5C;8`pC)W_ZTa0mOM=!GBExhfhuvYaqAvuYJ1^LA6&WL@c8QwgAebGKvU z-U{hRkuH`rFjDy}UoaT0YWqStvJfMDgs_a1@=M7TDY2|4uf+u@BQD^yew*wGga=u1 zEUj8qbvP`1TJ(RmjAuCsBcEJLki6YgI`zEN*;E2O0%v;O-Rp3+j!u~^6K{sBouhV( zeP+(-%5ZQ>788Vz%3Mfy1zGvP6;61JxZtY*4n6;;Rgt)L{Xp`D9~^US%pp9WWSo@6 zcqS|D4KgGrE_jI>a?&z3z7r}4AJ%&e>dE^s^ceSS%u%GYEGiPXVii%#3S6N|1S>77 zfdhipx)G@gS>*>%`rWw9g$Wx3O;WyGKd`eFrKXj%BBy1;6{p~o#t|Vgt*G7vC#|E1 vj=~BNAa=M*X;c#~L=C_`)LJut+A+=>0#0s;U_94&MDBHp&D}AM{a4}_%99n& literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACReg.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACReg.pas new file mode 100644 index 0000000..4a18df2 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/frxSDACReg.pas @@ -0,0 +1,38 @@ + +{******************************************} +{ } +{ FastReport v4.0 } +{ SDAC components registration } +{ } + +// Created by: CoreLab +// E-mail: sdac@crlab.com + +{ } +{******************************************} + +unit frxSDACReg; + +interface + +{$I frx.inc} + +procedure Register; + +implementation + +uses + Windows, Messages, SysUtils, Classes +{$IFNDEF Delphi6} +, DsgnIntf +{$ELSE} +, DesignIntf, DesignEditors +{$ENDIF} +, frxSDACComponents; + +procedure Register; +begin + RegisterComponents('FastReport 4.0', [TfrxSDACComponents]); +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_idacrtti.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_idacrtti.pas new file mode 100644 index 0000000..3a86b5f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_idacrtti.pas @@ -0,0 +1,620 @@ +{******************************************} +{ } +{ FastScript v1.9 } +{ DAC classes and functions } +{ } +{ Created by: CoreLab } +{ E-mail: info@crlab.com } +{ } +{******************************************} + +unit fs_idacrtti; + +interface + +{$i fs.inc} + +uses + SysUtils, Classes, fs_iinterpreter, fs_itools, fs_idbrtti, DB, + MemData, MemDS, DBAccess; + +type + TfsNotifyEvent = class(TfsCustomEvent) + public + procedure DoEvent(Sender: TObject); + function GetMethod: Pointer; override; + end; + + TfsLoginEvent = class(TfsCustomEvent) + public + procedure DoEvent(Sender: TObject; Username, Password: string); + function GetMethod: Pointer; override; + end; + + TfsUpdateErrorEvent = class(TfsCustomEvent) + public + procedure DoEvent(DataSet: TDataSet; E: EDatabaseError; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); + function GetMethod: Pointer; override; + end; + + TfsUpdateRecordEvent = class(TfsCustomEvent) + public + procedure DoEvent(DataSet: TDataSet; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); + function GetMethod: Pointer; override; + end; + + TfsAfterExecuteEvent = class(TfsCustomEvent) + public + procedure DoEvent(Sender: TObject; Result: boolean); + function GetMethod: Pointer; override; + end; + + TfsUpdateExecuteEvent = class(TfsCustomEvent) + public + procedure DoEvent(Sender: TDataSet; StatementTypes: TStatementTypes; Params: TDAParams); + function GetMethod: Pointer; override; + end; + +implementation + +type + TfsDAConnectionErrorEvent = class(TfsCustomEvent) + public + procedure DoEvent(Sender: TObject; E: EDAError; var Fail: boolean); + function GetMethod: Pointer; override; + end; + + TfsConnectionLostEvent = class(TfsCustomEvent) + public + procedure DoEvent(Sender: TObject; Component: TComponent; ConnLostCause: TConnLostCause; var RetryMode: TRetryMode); + function GetMethod: Pointer; override; + end; + + TFunctions = class(TfsRTTIModule) + private + function CallMethod(Instance: TObject; ClassType: TClass; + const MethodName: String; Caller: TfsMethodHelper): Variant; + function GetProp(Instance: TObject; ClassType: TClass; + const PropName: String): Variant; + procedure SetProp(Instance: TObject; ClassType: TClass; + const PropName: String; Value: Variant); + public + constructor Create(AScript: TfsScript); override; + end; + +{ TfsDAConnectionErrorEvent } + +procedure TfsDAConnectionErrorEvent.DoEvent(Sender: TObject; E: EDAError; var Fail: boolean); +begin + CallHandler([Sender, E, Fail]); + Fail := Handler.Params[2].Value; +end; + +function TfsDAConnectionErrorEvent.GetMethod: Pointer; +begin + Result := @TfsFieldGetTextEvent.DoEvent; +end; + +{ TfsNotifyEvent } + +procedure TfsNotifyEvent.DoEvent(Sender: TObject); +begin + CallHandler([Sender]); +end; + +function TfsNotifyEvent.GetMethod: Pointer; +begin + Result := @TfsFieldGetTextEvent.DoEvent; +end; + +{ TfsLoginEvent } + +procedure TfsLoginEvent.DoEvent(Sender: TObject; Username, Password: string); +begin + CallHandler([Sender, Username, Password]); +end; + +function TfsLoginEvent.GetMethod: Pointer; +begin + Result := @TfsFieldGetTextEvent.DoEvent; +end; + +{ TfsConnectionLostEvent } + +procedure TfsConnectionLostEvent.DoEvent(Sender: TObject; Component: TComponent; ConnLostCause: TConnLostCause; var RetryMode: TRetryMode); +begin + CallHandler([Sender, Component, Integer(ConnLostCause), Integer(RetryMode)]); + RetryMode := Handler.Params[3].Value; +end; + +function TfsConnectionLostEvent.GetMethod: Pointer; +begin + Result := @TfsFieldGetTextEvent.DoEvent; +end; + +{ TfsUpdateErrorEvent } + +procedure TfsUpdateErrorEvent.DoEvent(DataSet: TDataSet; E: EDatabaseError; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); +begin + CallHandler([DataSet, E, Integer(UpdateKind), Integer(UpdateAction)]); + UpdateAction := Handler.Params[3].Value; +end; + +function TfsUpdateErrorEvent.GetMethod: Pointer; +begin + Result := @TfsFieldGetTextEvent.DoEvent; +end; + +{ TfsUpdateRecordEvent } + +procedure TfsUpdateRecordEvent.DoEvent(DataSet: TDataSet; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); +begin + CallHandler([DataSet, Integer(UpdateKind), Integer(UpdateAction)]); + UpdateAction := Handler.Params[3].Value; +end; + +function TfsUpdateRecordEvent.GetMethod: Pointer; +begin + Result := @TfsFieldGetTextEvent.DoEvent; +end; + +{ TfsAfterExecuteEvent } + +procedure TfsAfterExecuteEvent.DoEvent(Sender: TObject; Result: boolean); +begin + CallHandler([Sender, Result]); +end; + +function TfsAfterExecuteEvent.GetMethod: Pointer; +begin + Result := @TfsFieldGetTextEvent.DoEvent; +end; + +{ TfsUpdateExecuteEvent } + +procedure TfsUpdateExecuteEvent.DoEvent(Sender: TDataSet; StatementTypes: TStatementTypes; Params: TDAParams); +begin + CallHandler([Sender, 0{StatementTypes}, Params]); +end; + +function TfsUpdateExecuteEvent.GetMethod: Pointer; +begin + Result := @TfsFieldGetTextEvent.DoEvent; +end; + +{ TFunctions } + +constructor TFunctions.Create(AScript: TfsScript); +begin + inherited Create(AScript); + + with AScript do + begin + with AddClass(TCustomDAConnection, 'TComponent') do begin + AddMethod('procedure Open', CallMethod); + AddMethod('procedure Close', CallMethod); + + AddMethod('procedure Connect', CallMethod); + AddMethod('procedure Disconnect', CallMethod); + + AddMethod('function ExecSQL(Text: string; const Params: array of variant): variant', CallMethod); + + AddMethod('procedure GetTableNames(List: TStrings)', CallMethod); + AddMethod('procedure GetDatabaseNames(List: TStrings)', CallMethod); + AddMethod('procedure GetStoredProcNames(List: TStrings)', CallMethod); + + AddMethod('procedure StartTransaction', CallMethod); + AddMethod('procedure Commit', CallMethod); + AddMethod('procedure Rollback', CallMethod); + + AddMethod('procedure ApplyUpdates', CallMethod); + //AddMethod('procedure ApplyUpdates(DataSets: array of TCustomDADataSet)', CallMethod); + + AddMethod('function CreateDataSet: TCustomDADataSet', CallMethod); + + AddMethod('procedure RemoveFromPool', CallMethod); + AddMethod('procedure MonitorMessage(const Msg: string)', CallMethod); + + AddProperty('InTransaction', 'boolean', GetProp); + + AddIndexProperty('DataSets', 'Integer', 'TDataSet', CallMethod, True); + AddProperty('DataSetCount', 'Integer', GetProp); + + AddEvent('OnError', TfsDAConnectionErrorEvent); + AddEvent('OnConnectionLost', TfsConnectionLostEvent); + AddEvent('AfterConnect', TfsNotifyEvent); + AddEvent('BeforeConnect', TfsNotifyEvent); + AddEvent('AfterDisconnect', TfsNotifyEvent); + AddEvent('BeforeDisconnect', TfsNotifyEvent); + AddEvent('OnLogin', TfsLoginEvent); + end; + AddClass(TDAConnectionOptions, 'TPersistent'); + AddClass(TPoolingOptions, 'TPersistent'); + + AddEnum('TDANumericType', 'ntFloat, ntBCD'{$IFNDEF VER130} + ', ntFmtBCD'{$ENDIF}); + AddEnum('TConnLostCause', 'clUnknown, clExecute, clOpen, clRefresh, clApply, clServiceQuery, clTransStart, clConnectionApply, clConnect'); + AddEnum('TRetryMode', 'rmRaise, rmReconnect, rmReconnectExecute'); + + AddEnum('TLabelSet', 'lsCustom, lsEnglish, lsFrench, lsGerman, lsItalian, lsPolish, lsPortuguese, lsRussian, lsSpanish'); + + with AddClass(TCustomConnectDialog, 'TComponent') do begin + AddMethod('function Execute: boolean', CallMethod); + AddMethod('procedure GetServerList(List: TStrings)', CallMethod); + + AddProperty('Connection', 'TCustomDAConnection', GetProp); + AddProperty('Retries', 'word', GetProp, SetProp); + AddProperty('SavePassword', 'boolean', GetProp, SetProp); + AddProperty('StoreLogInfo', 'boolean', GetProp, SetProp); + AddProperty('DialogClass', 'string', GetProp, SetProp); + AddProperty('Caption', 'string', GetProp, SetProp); + AddProperty('UsernameLabel', 'string', GetProp, SetProp); + AddProperty('PasswordLabel', 'string', GetProp, SetProp); + AddProperty('ServerLabel', 'string', GetProp, SetProp); + AddProperty('ConnectButton', 'string', GetProp, SetProp); + AddProperty('CancelButton', 'string', GetProp, SetProp); + AddProperty('LabelSet', 'TLabelSet', GetProp, SetProp); + end; + + with AddClass(TMemDataSet, 'TDataSet') do begin + AddMethod('procedure Prepare', CallMethod); + AddMethod('procedure UnPrepare', CallMethod); + AddMethod('procedure CheckPrepared', CallMethod); + + AddMethod('function UpdateStatus: TUpdateStatus', CallMethod); + AddMethod('function UpdateResult: TUpdateAction', CallMethod); + AddMethod('procedure ApplyUpdates', CallMethod); + AddMethod('procedure CommitUpdates', CallMethod); + AddMethod('procedure CancelUpdates', CallMethod); + AddMethod('procedure RestoreUpdates', CallMethod); + AddMethod('procedure RevertRecord', CallMethod); + + AddMethod('procedure SaveToXML(const FileName: string)', CallMethod); + + AddProperty('Prepared', 'boolean', GetProp, SetProp); + AddProperty('RecordCount', 'Integer', GetProp); + + AddEvent('OnUpdateError', TfsUpdateErrorEvent); + AddEvent('OnUpdateRecord', TfsUpdateRecordEvent); + end; + AddEnum('TUpdateStatus', 'usUnmodified, usModified, usInserted, usDeleted'); + AddEnum('TUpdateAction', 'uaFail, uaAbort, uaSkip, uaRetry, uaApplied'); + + with AddClass(TCustomDADataSet, 'TMemDataSet') do begin + AddMethod('procedure Execute', CallMethod); + AddMethod('function Executing', CallMethod); + AddMethod('function Fetching', CallMethod); + + AddMethod('procedure RefreshRecord', CallMethod); + + AddMethod('function FindMacro(const Value: string): TMacro', CallMethod); + AddMethod('function MacroByName(const Value: string): TMacro', CallMethod); + + AddMethod('procedure SaveSQL', CallMethod); + AddMethod('procedure RestoreSQL', CallMethod); + AddMethod('function SQLSaved: boolean', CallMethod); + + AddMethod('procedure AddWhere(Condition: string)', CallMethod); + AddMethod('procedure DeleteWhere', CallMethod); + AddMethod('procedure SetOrderBy(Fields: string)', CallMethod); + AddMethod('function GetOrderBy: string', CallMethod); + + AddEvent('AfterExecute', TfsAfterExecuteEvent); + AddEvent('BeforeUpdateExecute', TfsUpdateExecuteEvent); + AddEvent('AfterUpdateExecute', TfsUpdateExecuteEvent); + end; + + AddClass(TDAParams, 'TParams'); + AddEnum('TStatementType', 'stQuery, stInsert, stUpdate, stDelete, stLock, stRefresh, stCheck, stCustom, stRefreshQuick, stRefreshCheckDeleted, stBatchUpdate'); + AddEnumSet('TStatementTypes', 'stQuery, stInsert, stUpdate, stDelete, stLock, stRefresh, stCheck, stCustom, stRefreshQuick, stRefreshCheckDeleted, stBatchUpdate'); + + AddClass(TDADataSetOptions, 'TPersistent'); + AddEnum('TCompressBlobMode', 'cbNone, cbClient, cbServer, cbClientServer'); + + with AddClass(TMacro, 'TCollectionItem') do begin + AddProperty('AsDateTime', 'TDateTime', GetProp, SetProp); + AddProperty('AsFloat', 'double', GetProp, SetProp); + AddProperty('AsInteger', 'integer', GetProp, SetProp); + AddProperty('AsString', 'string', GetProp, SetProp); + end; + end; +end; + +function TFunctions.CallMethod(Instance: TObject; ClassType: TClass; + const MethodName: String; Caller: TfsMethodHelper): Variant; +var + DAConnection: TCustomDAConnection; + CustomConnectDialog: TCustomConnectDialog; + MemDataSet: TMemDataSet; + CustomDADataSet: TCustomDADataSet; +begin + Result := 0; + + if ClassType = TCustomDAConnection then begin + DAConnection := TCustomDAConnection(Instance); + if MethodName = 'OPEN' then + DAConnection.Open + else + if MethodName = 'CLOSE' then + DAConnection.Close + else + if MethodName = 'CONNECT' then + DAConnection.Connect + else + if MethodName = 'DISCONNECT' then + DAConnection.Disconnect + else + if MethodName = 'EXECSQL' then + Result := DAConnection.ExecSQL(Caller.Params[0], [Caller.Params[1]]) + else + if MethodName = 'GETTABLENAMES' then + DAConnection.GetTableNames(TStrings(Integer(Caller.Params[0]))) + else + if MethodName = 'GETDATABASENAMES' then + DAConnection.GetDatabaseNames(TStrings(Integer(Caller.Params[0]))) + else + if MethodName = 'GETSTOREDPROCNAMES' then + DAConnection.GetStoredProcNames(TStrings(Integer(Caller.Params[0]))) + else + if MethodName = 'STARTTRANSACTION' then + DAConnection.StartTransaction + else + if MethodName = 'COMMIT' then + DAConnection.Commit + else + if MethodName = 'ROLLBACK' then + DAConnection.Rollback + else + if MethodName = 'APPLYUPDATES' then + DAConnection.ApplyUpdates + else + if MethodName = 'CREATEDATASET' then + Result := Integer(DAConnection.CreateDataSet) + else + if MethodName = 'REMOVEFROMPOOL' then + DAConnection.RemoveFromPool + else + if MethodName = 'MONITORMESSAGE' then + DAConnection.MonitorMessage(Caller.Params[0]) + else + if MethodName = 'DATASETS.GET' then + Result := Integer(DAConnection.DataSets[Caller.Params[0]]) + end + else + if ClassType = TCustomConnectDialog then begin + CustomConnectDialog := TCustomConnectDialog(Instance); + if MethodName = 'EXECUTE' then + Result := Integer(CustomConnectDialog.Execute) + else + if MethodName = 'GETSERVERLIST' then + CustomConnectDialog.GetServerList(TStrings(Integer(Caller.Params[0]))) + end + else + if ClassType = TMemDataSet then begin + MemDataSet := TMemDataSet(Instance); + if MethodName = 'PREPARE' then + MemDataSet.Prepare + else + if MethodName = 'UNPREPARE' then + MemDataSet.UnPrepare + else + if MethodName = 'CHECKPREPARED' then + MemDataSet.CheckPrepared + else + if MethodName = 'UPDATESTATUS' then + Result := Integer(MemDataSet.UpdateStatus) + else + if MethodName = 'UPDATERESULT' then + Result := Integer(MemDataSet.UpdateResult) + else + if MethodName = 'APPLYUPDATES' then + MemDataSet.ApplyUpdates + else + if MethodName = 'COMMITUPDATES' then + MemDataSet.CommitUpdates + else + if MethodName = 'CANCELUPDATES' then + MemDataSet.CancelUpdates + else + if MethodName = 'RESTOREUPDATES' then + MemDataSet.RestoreUpdates + else + if MethodName = 'REVERTRECORD' then + MemDataSet.RevertRecord + else + if MethodName = 'SAVETOXML' then + MemDataSet.SaveToXML(String(Caller.Params[0])) + end + else + if ClassType = TCustomDADataSet then begin + CustomDADataSet := TCustomDADataSet(Instance); + if MethodName = 'EXECUTE' then + CustomDADataSet.Execute + else + if MethodName = 'EXECUTING' then + Result := CustomDADataSet.Executing + else + if MethodName = 'FETCHING' then + Result := CustomDADataSet.Fetching + else + if MethodName = 'REFRESHRECORD' then + CustomDADataSet.RefreshRecord + else + if MethodName = 'FINDMACRO' then + Result := Integer(CustomDADataSet.FindMacro(String(Caller.Params[0]))) + else + if MethodName = 'MACROBYNAME' then + Result := Integer(CustomDADataSet.MacroByName(String(Caller.Params[0]))) + else + if MethodName = 'SAVESQL' then + CustomDADataSet.SaveSQL + else + if MethodName = 'RESTORESQL' then + CustomDADataSet.RestoreSQL + else + if MethodName = 'SQLSAVED' then + Result := CustomDADataSet.SQLSaved + else + if MethodName = 'ADDWHERE' then + CustomDADataSet.AddWhere(String(Caller.Params[0])) + else + if MethodName = 'DELETEWHERE' then + CustomDADataSet.DeleteWhere + else + if MethodName = 'SETORDERBY' then + CustomDADataSet.SetOrderBy(String(Caller.Params[0])) + else + if MethodName = 'GETORDERBY' then + Result := CustomDADataSet.GetOrderBy; + end; +end; + + +function TFunctions.GetProp(Instance: TObject; ClassType: TClass; + const PropName: String): Variant; +var + CustomDAConnection: TCustomDAConnection; + CustomConnectDialog: TCustomConnectDialog; +begin + Result := 0; + + if ClassType = TCustomDAConnection then begin + CustomDAConnection := TCustomDAConnection(Instance); + if PropName = 'INTRANSACTION' then + Result := CustomDAConnection.InTransaction + else + if PropName = 'DATASETCOUNT' then + Result := CustomDAConnection.DataSetCount; + end + else + if ClassType = TCustomConnectDialog then begin + CustomConnectDialog := TCustomConnectDialog(Instance); + if PropName = 'CONNECTION' then + Result := Integer(CustomConnectDialog.Connection) + else + if PropName = 'RETRIES' then + Result := CustomConnectDialog.Retries + else + if PropName = 'SAVEPASSWORD' then + Result := CustomConnectDialog.SavePassword + else + if PropName = 'STORELOGINFO' then + Result := CustomConnectDialog.StoreLogInfo + else + if PropName = 'DIALOGCLASS' then + Result := CustomConnectDialog.DialogClass + else + if PropName = 'CAPTION' then + Result := CustomConnectDialog.Caption + else + if PropName = 'USERNAMELABEL' then + Result := CustomConnectDialog.UsernameLabel + else + if PropName = 'PASSWORDLABEL' then + Result := CustomConnectDialog.PasswordLabel + else + if PropName = 'SERVERLABEL' then + Result := CustomConnectDialog.ServerLabel + else + if PropName = 'CONNECTBUTTON' then + Result := CustomConnectDialog.ConnectButton + else + if PropName = 'CANCELBUTTON' then + Result := CustomConnectDialog.CancelButton + else + if PropName = 'LABELSET' then + Result := Integer(CustomConnectDialog.LabelSet) + end + else + if ClassType = TMemDataSet then begin + if PropName = 'PREPARED' then + Result := TMemDataSet(Instance).Prepared + else + if PropName = 'RECORDCOUNT' then + Result := TMemDataSet(Instance).RecordCount; + end + else + if ClassType = TMacro then begin + if PropName = 'ASDATETIME' then + Result := TMacro(Instance).AsDateTime + else + if PropName = 'ASFLOAT' then + Result := TMacro(Instance).AsFloat + else + if PropName = 'ASINTEGER' then + Result := TMacro(Instance).AsInteger + else + if PropName = 'ASSTRING' then + Result := TMacro(Instance).AsString; + end; +end; + +procedure TFunctions.SetProp(Instance: TObject; ClassType: TClass; + const PropName: String; Value: Variant); +var + CustomConnectDialog: TCustomConnectDialog; +begin + if ClassType = TCustomConnectDialog then begin + CustomConnectDialog := TCustomConnectDialog(Instance); + if PropName = 'RETRIES' then + CustomConnectDialog.Retries := Value + else + if PropName = 'SAVEPASSWORD' then + CustomConnectDialog.SavePassword := Value + else + if PropName = 'STORELOGINFO' then + CustomConnectDialog.StoreLogInfo := Value + else + if PropName = 'DIALOGCLASS' then + CustomConnectDialog.DialogClass := Value + else + if PropName = 'CAPTION' then + CustomConnectDialog.Caption := Value + else + if PropName = 'USERNAMELABEL' then + CustomConnectDialog.UsernameLabel := Value + else + if PropName = 'PASSWORDLABEL' then + CustomConnectDialog.PasswordLabel := Value + else + if PropName = 'SERVERLABEL' then + CustomConnectDialog.ServerLabel := Value + else + if PropName = 'CONNECTBUTTON' then + CustomConnectDialog.ConnectButton := Value + else + if PropName = 'CANCELBUTTON' then + CustomConnectDialog.CancelButton := Value + else + if PropName = 'LABELSET' then + CustomConnectDialog.LabelSet := TLabelSet(Value); + end + else + if ClassType = TMemDataSet then begin + if PropName = 'PREPARED' then + TMemDataSet(Instance).Prepared := Value; + end + else + if ClassType = TMacro then begin + if PropName = 'ASDATETIME' then + TMacro(Instance).AsDateTime := Value + else + if PropName = 'ASFLOAT' then + TMacro(Instance).AsFloat := Value + else + if PropName = 'ASINTEGER' then + TMacro(Instance).AsInteger := Value + else + if PropName = 'ASSTRING' then + TMacro(Instance).AsString := Value; + end; +end; + +initialization + fsRTTIModules.Add(TFunctions); + +finalization + if fsRTTIModules <> nil then + fsRTTIModules.Remove(TFunctions); + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacreg.dcr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacreg.dcr new file mode 100644 index 0000000000000000000000000000000000000000..36dd0ad0f68c1b1d32e635488b4c4ed919c6cb20 GIT binary patch literal 1852 zcmcJOdrVVT9LJB#Mj|eme=WMO%(2WE4Fl!?$r!SLAhRI?PByS%XagaGC<}v;An3r1 z2@I8oh`i*Xh*F>o5h=8#@>qeDQYe&CN?#Oc3oWITN6T-A)!nhJ%ic;)5mi$arn6kS2fO3sq>xmL`;S~b?97@=Ze&B^ZD<6Zd#=Nfx8qEPRZpgt5n z>p+se6*wiRt_G80O*>)b=oS40XLht%$#0Yn-WT_l;ip1Y5y44)Y9?ixjzsF;^w-#X zs&>1}#Pts`XJcv7%E8^~WPMnxMI8iZhEszpcqTZ>G&phD;&|4y$7^|)vj#b-EcoCn*y{`E=r+p8WP(X)6ovvwbpKEPZ(r8j@gSft4c)xb6s%oU70z+_G4@F)VL>It` z1UMW9`~0_2uXzCa5I1N-F8bY`Y6p_SEp|FIcf#f&B8vHRh`Rx#cyK)h2fV3YNEMQ&7l;%vMOMhl{lkTM3j>Am4%T zVj!17Y(3-+0!zI`SZs>!;jx}ssA9t{8eFS`^m~v}4vBZ+ViCmMhJ;c`Z-9Ccv=8uY u+KD2ox9^uZXqy5mA8I&I-UB6UC}KhZ1M*o=+z(}3ph=+Xc^_f<|HN<5d6j?w literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacreg.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacreg.pas new file mode 100644 index 0000000..4e1aca8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacreg.pas @@ -0,0 +1,39 @@ + +{******************************************} +{ } +{ FastScript v1.9 } +{ SDAC Registration unit } +{ } +{ Created by: CoreLab } +{ E-mail: sdac@crlab.com } +{ } +{******************************************} + +unit fs_isdacreg; + +{$i fs.inc} + +interface + + +procedure Register; + +implementation + +uses + Classes +{$IFNDEF Delphi6} +, DsgnIntf +{$ELSE} +, DesignIntf +{$ENDIF} +, fs_isdacrtti; + +{-----------------------------------------------------------------------} + +procedure Register; +begin + RegisterComponents('FastScript', [TfsSDACRTTI]); +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacrtti.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacrtti.pas new file mode 100644 index 0000000..bc18298 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/FR4/fs_isdacrtti.pas @@ -0,0 +1,214 @@ + +{******************************************} +{ } +{ FastScript v1.9 } +{ SDAC classes and functions } +{ } +{ Created by: CoreLab } +{ E-mail: sdac@crlab.com } +{ } +{******************************************} + +unit fs_isdacrtti; + +interface + +{$i fs.inc} + +uses + SysUtils, Classes, fs_iinterpreter, fs_itools, fs_idbrtti, fs_idacrtti, DB, + OLEDBAccess, MSAccess; + +type + TfsSDACRTTI = class(TComponent); // fake component + +implementation + +type + TfsMSConnectionInfoMessageEvent = class(TfsCustomEvent) + public + procedure DoEvent(Sender: TObject; E: EMSError); + function GetMethod: Pointer; override; + end; + + TFunctions = class(TfsRTTIModule) + private + function CallMethod(Instance: TObject; ClassType: TClass; + const MethodName: String; Caller: TfsMethodHelper): Variant; + function GetProp(Instance: TObject; ClassType: TClass; + const PropName: String): Variant; + procedure SetProp(Instance: TObject; ClassType: TClass; + const PropName: String; Value: Variant); + public + constructor Create(AScript: TfsScript); override; + end; + +{ TfsMSConnectionInfoMessageEvent } + +procedure TfsMSConnectionInfoMessageEvent.DoEvent(Sender: TObject; E: EMSError); +begin + CallHandler([Sender, E]); +end; + +function TfsMSConnectionInfoMessageEvent.GetMethod: Pointer; +begin + Result := @TfsFieldGetTextEvent.DoEvent; +end; + +{ TFunctions } + +constructor TFunctions.Create(AScript: TfsScript); +begin + inherited Create(AScript); + + with AScript do begin + with AddClass(TMSConnection, 'TCustomDAConnection') do begin + AddMethod('procedure ChangePassword(NewPassword: string)', CallMethod); + AddProperty('ClientVersion', 'string', GetProp); + AddProperty('ServerVersion', 'string', GetProp); + AddEvent('OnInfoMessage', TfsMSConnectionInfoMessageEvent); + end; + AddEnum('TIsolationLevel', 'ilReadCommitted, ilReadUnCommitted, ilRepeatableRead, ilIsolated, ilSnapshot'); + AddEnum('TMSAuthentication', 'auWindows, auServer'); + + AddClass(TMSConnectionOptions, 'TDAConnectionOptions'); + AddEnum('TOLEDBProvider', 'prAuto, prSQL, prNativeClient, prCompact'); + + with AddClass(TCustomMSDataSet, 'TCustomDADataSet') do begin + AddMethod('function OpenNext: boolean', CallMethod); + AddMethod('procedure BreakExec', CallMethod); + AddMethod('procedure RefreshQuick(const CheckDeleted: boolean)', CallMethod); + + AddProperty('CursorType', 'TMSCursorType', GetProp, SetProp); + AddProperty('CommandTimeout', 'integer', GetProp, SetProp); + end; + AddEnum('TMSCursorType', 'ctDefaultResultSet, ctStatic, ctKeyset, ctDynamic'); + AddClass(TMSDataSetOptions, 'TDADataSetOptions'); + AddClass(TMSParams, 'TDAParams'); + AddClass(TMSQuery, 'TCustomMSDataSet'); + + with AddClass(TMSTable, 'TCustomMSDataSet') do begin + AddMethod('procedure PrepareSQL', CallMethod); + AddProperty('TableName', 'string', GetProp, SetProp); + AddProperty('OrderFields', 'string', GetProp, SetProp); + end; + + with AddClass(TMSStoredProc, 'TCustomMSDataSet') do begin + AddMethod('procedure ExecProc', CallMethod); + AddMethod('procedure PrepareSQL', CallMethod); + AddProperty('UpdatingTable', 'string', GetProp, SetProp); + AddProperty('StoredProcName', 'string', GetProp, SetProp); + end; + end; +end; + +function TFunctions.CallMethod(Instance: TObject; ClassType: TClass; + const MethodName: String; Caller: TfsMethodHelper): Variant; +begin + Result := 0; + + if ClassType = TMSConnection then begin + if MethodName = 'CHANGEPASSWORD' then + TMSConnection(Instance).ChangePassword(Caller.Params[0]); + end + else + if ClassType = TCustomMSDataSet then begin + if MethodName = 'OPENNEXT' then + Result := TCustomMSDataSet(Instance).OpenNext + else + if MethodName = 'BREAKEXEC' then + TCustomMSDataSet(Instance).BreakExec + else + if MethodName = 'REFRESHQUICK' then + TCustomMSDataSet(Instance).RefreshQuick(Caller.Params[0]); + end + else + if ClassType = TMSTable then begin + if MethodName = 'PREPARESQL' then + TMSTable(Instance).PrepareSQL; + end + else + if ClassType = TMSStoredProc then begin + if MethodName = 'EXECPROC' then + TMSStoredProc(Instance).ExecProc + else + if MethodName = 'PREPARESQL' then + TMSStoredProc(Instance).PrepareSQL; + end; +end; + +function TFunctions.GetProp(Instance: TObject; ClassType: TClass; + const PropName: String): Variant; +begin + Result := 0; + + if ClassType = TMSConnection then begin + if PropName = 'CLIENTVERSION' then + Result := TMSConnection(Instance).ClientVersion + else + if PropName = 'SERVERVERSION' then + Result := TMSConnection(Instance).ServerVersion + end + else + if ClassType = TCustomMSDataSet then begin + if PropName = 'CURSORTYPE' then + Result := Integer(TCustomMSDataSet(Instance).CursorType) + else + if PropName = 'COMMANDTIMEOUT' then + Result := TCustomMSDataSet(Instance).CommandTimeout; + end + else + if ClassType = TMSTable then begin + if PropName = 'TABLENAME' then + Result := TMSTable(Instance).TableName + else + if PropName = 'ORDERFIELDS' then + Result := TMSTable(Instance).OrderFields; + end + else + if ClassType = TMSStoredProc then begin + if PropName = 'UPDATINGTABLE' then + Result := TMSStoredProc(Instance).UpdatingTable + else + if PropName = 'STOREDPROCNAME' then + Result := TMSStoredProc(Instance).StoredProcName; + end; +end; + +procedure TFunctions.SetProp(Instance: TObject; ClassType: TClass; + const PropName: String; Value: Variant); +begin + if ClassType = TCustomMSDataSet then begin + if PropName = 'CURSORTYPE' then + TCustomMSDataSet(Instance).CursorType := TMSCursorType(Integer(Value)) + else + if PropName = 'COMMANDTIMEOUT' then + TCustomMSDataSet(Instance).CommandTimeout := Value; + end + else + if ClassType = TMSTable then begin + if PropName = 'TABLENAME' then + TMSTable(Instance).TableName := Value + else + if PropName = 'ORDERFIELDS' then + TMSTable(Instance).OrderFields := Value; + end + else + if ClassType = TMSStoredProc then begin + if PropName = 'UPDATINGTABLE' then + TMSStoredProc(Instance).UpdatingTable := Value + else + if PropName = 'STOREDPROCNAME' then + TMSStoredProc(Instance).StoredProcName := Value; + end; +end; + +initialization + fsRTTIModules.Add(TFunctions); + +finalization + if fsRTTIModules <> nil then + fsRTTIModules.Remove(TFunctions); + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/ReadMe.txt new file mode 100644 index 0000000..d0a477f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/FastReport/ReadMe.txt @@ -0,0 +1,10 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demo for FastReport included in SDAC was built and tested using +Fast Report 3.20 + +IMPORTANT NOTE: + Demo provided as is and there are no warranty that it is fully + compatible with other versions of Fast Report. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.cfg b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.cfg new file mode 100644 index 0000000..aa6fefc --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"." +-N"." +-LE"." +-LN"." +-U"..\" +-O"..\" +-I"..\" +-R"..\" diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.dpr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.dpr new file mode 100644 index 0000000..b6ddeeb --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.dpr @@ -0,0 +1,13 @@ +program IPDemo; + +uses + Forms, + Main in 'Main.pas' {fmMain}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfmMain, fmMain); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/Demo/IPDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..690fbc55eb38e0cfef34721f45f8cd74943fe0ae GIT binary patch literal 1540 zcmah|L2DC16#mi#w}_Y?ywppBh=>PiYY;rOVy!7eD^_|fMQbg#X=p3i(nD4VthZjf zTQU&3Ku1xYCORhR}cZ6&nTLV&faey0+( z5S#?JQic)~C&71s;X<*fc>A#9mR)$YTHE49x8nH2yPpdY-uC@!*>401{;ble?wvLc z65Mq=twwObe9X`amHoZb(?)R2x%92Moo1_5*Lg;8cemAS2EiBN6xgnHg62t`1tdZ6 zLcm#FaY#b#B&d_Gcti+-hQ&3b)+HmtWnp?gyI&9XSuU}z?VrrEaeB0JqVf_LS;_ux zjQMn&HC~uD9={NJH3X)90%H`Ljojf}JpC^x*AefMM^BwGo-^_*OPi4KxR5sH%rWLX z%Q(h3bpyaS-I(imj>nk83;GkxGsf0`FXT3)kjrKCR>&<%!ATta!)yN%^4!wc%!|_?77C= zQo_ySD%ml2k=!k^dz=Z}XLsw9c!z#rPiH3*(svDOr#6)U}#qO}&=G_;j$=^-lw)?2S# za_~QR3qi7ApqHLK3tqh0TT)s&e(%lhCJjYj^7hTl_r3SNncV?^Jlz=U9A2>BBQc&P zC#6^}HcR0w?r|Bs~%gnjlJb-_Ao(+6*NcRwiApsE~!Pvm3)g_BVR&}{>M6>Ho z&G&Q~EjWJ9y?RvApD>&r2|}lZvQQI3$(qdnOE?^;APJ>`3e!NQqlAuH2(Wg|?^dH0 zf|KA@D^P;sB=`<6S}c_m?;LjBiVLq^?^wL#RvmwI_j57AJHB75_{|`}pH;iHz0>AF zg1c_F-3$(xj~QCAy1#dN+6<04m%eqk+iJHPI?o91?zUU4AoxO@0z36?&^l?bfFuZB z3^;2j4oRq=1P$^Pj|f4~w76!}dt^koEKJX5_Zz`J%O%#c{gZh%PLEbjR9*rjE7{+T zF`tgJ#tYNN;}=4&g}~HLV4PyJkvp7=r~l>TI^sR@=&3Wtb4Gq;X%jLY7t_X^ImVo4 z8OIr?t^=5$8*>fM@fdS>L4SgI#@Gh$h1`Y|^7)+J3b{ooxXE40U3!|5rK$mJ*nN3W!fQ;PCUDiTei@I!eE*ufUoP{t}|8P~DG%4NL6 zCV5|#Gl2po@rb)EP{RYR-(;T@_qvG zgj>KBvSaQdxm#rSIg_}@?$+<);eZCwx}*Fu`>zkFxUCvW#8(v+#T9Cm9k1d&Gp$*z zeco#_mhqN(8;o1{KsB*h?tD~3PEPv9+GW;11$#~}$=zhNkKF&xkV5cGN2&56XZQpL u_b=bv4c(VLf9WP?5G$Nfp^K_JR@Hx_z%Bh6><-J!S|@YxeT-#(W&Q$u24%4T literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/ReadMe.txt new file mode 100644 index 0000000..0bf54b0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/InfoPower/ReadMe.txt @@ -0,0 +1,6 @@ + +To install TwwMSQuery,TwwMSTable,TwwMSStoredProc +components compile and install MSIPPack package. +MSIPPack package requires InfoPower ip*.dcp. To create it you need +compile InfoPower package ip*.dpk. + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.dof b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.dof new file mode 100644 index 0000000..1e2db98 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\ +UnitOutputDir=..\ diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.dpr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.dpr new file mode 100644 index 0000000..d37a934 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.dpr @@ -0,0 +1,35 @@ +program IntraWeb; +{PUBDIST} + +uses + IWInitStandAlone, + ServerController in 'ServerController.pas' {IWServerController: TIWServerControllerBase}, + uBase in 'uBase.pas' {fmBase: TIWAppForm}, + uMain in 'uMain.pas' {fmMain: TIWAppForm}, + uMasterDetail in 'uMasterDetail.pas' {fmMasterDetail: TIWAppForm}, + uCachedUpdates in 'uCachedUpdates.pas' {fmCachedUpdates: TIWAppForm}, + uData in 'uData.pas' {DM: TDataModule}, + uQuery in 'uQuery.pas' {fmQuery: TIWAppForm}; + +{$R *.res} + +begin + IWRun(TfmMain, TIWServerController); +end. +{PUBDIST} + +uses + IWInitStandAlone, + ServerController in 'ServerController.pas' {IWServerController: TIWServerControllerBase}, + uBase in 'uBase.pas' {fmBase: TIWAppForm}, + uMain in 'uMain.pas' {fmMain: TIWAppForm}, + uMasterDetail in 'uMasterDetail.pas' {fmMasterDetail: TIWAppForm}, + uCachedUpdates in 'uCachedUpdates.pas' {fmCachedUpdates: TIWAppForm}, + uData in 'uData.pas' {DM: TDataModule}, + uQuery in 'uQuery.pas' {fmQuery: TIWAppForm}; + +{$R *.res} + +begin + IWRun(TfmMain, TIWServerController); +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/IntraWeb.res new file mode 100644 index 0000000000000000000000000000000000000000..12285339869941018a4fabc8ac660d953d8887af GIT binary patch literal 876 zcmZuw!D`e{6g`;)45ZX42(7CQp|tKaWGUE6i{ireABr?v86*8G_oYa(EsH5tABp6QY{lccv56Ijv3zT^ z19e@C-2COG;9(9a-zxRU+>^PUYH1+j}xxlrXAFT7wca-=1dawoNZ1^kc zxi#EAaOu; + DoSubmitValidation = False + OnClick = lnkMainClick + end + object lnkQuery: TIWLink + Left = 69 + Top = 56 + Width = 65 + Height = 17 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Color = clNone + Caption = 'Query' + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + OnClick = lnkQueryClick + end + object lnkCachedUpdates: TIWLink + Left = 138 + Top = 56 + Width = 121 + Height = 17 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Color = clNone + Caption = 'CachedUpdates' + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + OnClick = lnkCachedUpdatesClick + end + object lnkMasterDetail: TIWLink + Left = 264 + Top = 56 + Width = 105 + Height = 17 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Color = clNone + Caption = 'MasterDetail' + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + OnClick = lnkMasterDetailClick + end + object rgConnection: TIWRegion + Left = 16 + Top = 78 + Width = 594 + Height = 42 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clBlack + DesignSize = ( + 594 + 42) + object IWRectangle4: TIWRectangle + Left = 1 + Top = 1 + Width = 592 + Height = 40 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btConnect: TIWButton + Left = 8 + Top = 8 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Connect' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 0 + OnClick = btConnectClick + end + object btDisconnect: TIWButton + Left = 112 + Top = 8 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Disconnect' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 1 + OnClick = btDisconnectClick + end + object lbStateConnection: TIWLabel + Left = 216 + Top = 11 + Width = 147 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbStateConnection' + RawText = False + end + end +end + Left = 0 + Top = 0 + Width = 620 + Height = 430 + Background.Fixed = False + HandleTabs = False + Title = 'SQL Server Data Access Demo - IntraWeb' + SupportedBrowsers = [brIE, brNetscape6] + ShowHint = True + OnRender = IWAppFormRender + DesignSize = ( + 620 + 430) + DesignLeft = 214 + DesignTop = 95 + object IWRectangle: TIWRectangle + Left = 12 + Top = 16 + Width = 599 + Height = 28 + Anchors = [akLeft, akTop, akRight] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clHighlight + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + Color = clSkyBlue + Alignment = taLeftJustify + VAlign = vaMiddle + end + object lbDemoCaption: TIWLabel + Left = 20 + Top = 21 + Width = 373 + Height = 18 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = 6956042 + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + AutoSize = False + Caption = 'SQL Server Data Access Demo - IntraWeb' + RawText = False + end + object lbPageName: TIWLabel + Left = 515 + Top = 22 + Width = 88 + Height = 16 + Anchors = [akTop, akRight] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = 6956042 + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsItalic] + Caption = 'lbPageName' + RawText = False + end + object lnkMain: TIWLink + Left = 16 + Top = 56 + Width = 41 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Color = clNone + Caption = 'Main' + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + OnClick = lnkMainClick + end + object lnkQuery: TIWLink + Left = 69 + Top = 56 + Width = 65 + Height = 17 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Color = clNone + Caption = 'Query' + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + OnClick = lnkQueryClick + end + object lnkCachedUpdates: TIWLink + Left = 138 + Top = 56 + Width = 121 + Height = 17 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Color = clNone + Caption = 'CachedUpdates' + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + OnClick = lnkCachedUpdatesClick + end + object lnkMasterDetail: TIWLink + Left = 264 + Top = 56 + Width = 105 + Height = 17 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Color = clNone + Caption = 'MasterDetail' + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + OnClick = lnkMasterDetailClick + end + object rgConnection: TIWRegion + Left = 16 + Top = 78 + Width = 594 + Height = 42 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clBlack + DesignSize = ( + 594 + 42) + object IWRectangle4: TIWRectangle + Left = 1 + Top = 1 + Width = 592 + Height = 40 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btConnect: TIWButton + Left = 8 + Top = 8 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Connect' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 0 + OnClick = btConnectClick + end + object btDisconnect: TIWButton + Left = 112 + Top = 8 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Disconnect' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 1 + OnClick = btDisconnectClick + end + object lbStateConnection: TIWLabel + Left = 216 + Top = 11 + Width = 147 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbStateConnection' + RawText = False + end + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uBase.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uBase.pas new file mode 100644 index 0000000..a073dac --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uBase.pas @@ -0,0 +1,243 @@ +unit uBase; +{PUBDIST} + +interface + +uses + IWAppForm, IWApplication, IWTypes, Classes, Controls, IWControl, + IWCompRectangle, IWCompButton, IWGrids, IWDBGrids, IWDBStdCtrls, + IWCompMemo, IWCompEdit, IWCompText, IWCompLabel, IWHTMLControls, + IWContainer, IWRegion, ActiveX, + Forms, Graphics, DB, MemDS, DBAccess, MSAccess; +type + TfmBase = class(TIWAppForm) + IWRectangle: TIWRectangle; + lbDemoCaption: TIWLabel; + lbPageName: TIWLabel; + lnkMain: TIWLink; + lnkQuery: TIWLink; + lnkCachedUpdates: TIWLink; + lnkMasterDetail: TIWLink; + rgConnection: TIWRegion; + IWRectangle4: TIWRectangle; + btConnect: TIWButton; + btDisconnect: TIWButton; + lbStateConnection: TIWLabel; + procedure lnkMainClick(Sender: TObject); + procedure lnkQueryClick(Sender: TObject); + procedure lnkCachedUpdatesClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure lnkMasterDetailClick(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + protected + procedure ReadFromControls; virtual; + end; + +const + ResultColors: array[boolean] of TColor = (clRed, $006A240A); + +implementation +{$R *.dfm} + +uses + IWInit, ServerController, SysUtils, IWForm; + + +procedure TfmBase.IWAppFormRender(Sender: TObject); + + procedure SetLinkState(Link: TIWLink; Form: TfmBase); + begin + Link.Enabled := Sender <> Form; + if Link.Enabled then + Link.Font.Style := [] + else + Link.Font.Style := [fsBold]; + end; + +begin + SetLinkState(lnkMain, UserSession.fmMain); + SetLinkState(lnkQuery, UserSession.fmQuery); + SetLinkState(lnkCachedUpdates, UserSession.fmCachedUpdates); + SetLinkState(lnkMasterDetail, UserSession.fmMasterDetail); + + lbStateConnection.Font.Color := ResultColors[UserSession.IsGoodConnection]; + lbStateConnection.Caption := UserSession.ConnectionResult; + btDisconnect.Enabled := DM.Connection.Connected; + btConnect.Enabled := not DM.Connection.Connected; +end; + +procedure TfmBase.lnkMainClick(Sender: TObject); +begin + ReadFromControls; + RWebApplication.SetActiveForm(UserSession.fmMain); +end; + +procedure TfmBase.lnkQueryClick(Sender: TObject); +begin + ReadFromControls; + RWebApplication.SetActiveForm(UserSession.fmQuery); +end; + +procedure TfmBase.lnkCachedUpdatesClick(Sender: TObject); +begin + ReadFromControls; + RWebApplication.SetActiveForm(UserSession.fmCachedUpdates); +end; + +procedure TfmBase.lnkMasterDetailClick(Sender: TObject); +begin + ReadFromControls; + RWebApplication.SetActiveForm(UserSession.fmMasterDetail); +end; + +procedure TfmBase.btConnectClick(Sender: TObject); +begin + ReadFromControls; + try + DM.Connection.Connect; + UserSession.IsGoodConnection := True; + except + UserSession.IsGoodConnection := False; + UserSession.ConnectionResult := 'Failed'; + end; +end; + +procedure TfmBase.btDisconnectClick(Sender: TObject); +begin + ReadFromControls; + try + DM.Connection.Disconnect; + UserSession.ConnectionResult := '' + except + UserSession.IsGoodConnection := False; + UserSession.ConnectionResult := 'Failed'; + end; +end; + +procedure TfmBase.ReadFromControls; +begin +end; + +end. +{PUBDIST} + +interface + +uses + IWAppForm, IWApplication, IWTypes, Classes, Controls, IWControl, + IWCompRectangle, IWCompButton, IWGrids, IWDBGrids, IWDBStdCtrls, + IWCompMemo, IWCompEdit, IWCompText, IWCompLabel, IWHTMLControls, + IWContainer, IWRegion, ActiveX, + Forms, Graphics, DB, MemDS, DBAccess, MSAccess; +type + TfmBase = class(TIWAppForm) + IWRectangle: TIWRectangle; + lbDemoCaption: TIWLabel; + lbPageName: TIWLabel; + lnkMain: TIWLink; + lnkQuery: TIWLink; + lnkCachedUpdates: TIWLink; + lnkMasterDetail: TIWLink; + rgConnection: TIWRegion; + IWRectangle4: TIWRectangle; + btConnect: TIWButton; + btDisconnect: TIWButton; + lbStateConnection: TIWLabel; + procedure lnkMainClick(Sender: TObject); + procedure lnkQueryClick(Sender: TObject); + procedure lnkCachedUpdatesClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure lnkMasterDetailClick(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + protected + procedure ReadFromControls; virtual; + end; + +const + ResultColors: array[boolean] of TColor = (clRed, $006A240A); + +implementation +{$R *.dfm} + +uses + IWInit, ServerController, SysUtils, IWForm; + + +procedure TfmBase.IWAppFormRender(Sender: TObject); + + procedure SetLinkState(Link: TIWLink; Form: TfmBase); + begin + Link.Enabled := Sender <> Form; + if Link.Enabled then + Link.Font.Style := [] + else + Link.Font.Style := [fsBold]; + end; + +begin + SetLinkState(lnkMain, UserSession.fmMain); + SetLinkState(lnkQuery, UserSession.fmQuery); + SetLinkState(lnkCachedUpdates, UserSession.fmCachedUpdates); + SetLinkState(lnkMasterDetail, UserSession.fmMasterDetail); + + lbStateConnection.Font.Color := ResultColors[UserSession.IsGoodConnection]; + lbStateConnection.Caption := UserSession.ConnectionResult; + btDisconnect.Enabled := DM.Connection.Connected; + btConnect.Enabled := not DM.Connection.Connected; +end; + +procedure TfmBase.lnkMainClick(Sender: TObject); +begin + ReadFromControls; + RWebApplication.SetActiveForm(UserSession.fmMain); +end; + +procedure TfmBase.lnkQueryClick(Sender: TObject); +begin + ReadFromControls; + RWebApplication.SetActiveForm(UserSession.fmQuery); +end; + +procedure TfmBase.lnkCachedUpdatesClick(Sender: TObject); +begin + ReadFromControls; + RWebApplication.SetActiveForm(UserSession.fmCachedUpdates); +end; + +procedure TfmBase.lnkMasterDetailClick(Sender: TObject); +begin + ReadFromControls; + RWebApplication.SetActiveForm(UserSession.fmMasterDetail); +end; + +procedure TfmBase.btConnectClick(Sender: TObject); +begin + ReadFromControls; + try + DM.Connection.Connect; + UserSession.IsGoodConnection := True; + except + UserSession.IsGoodConnection := False; + UserSession.ConnectionResult := 'Failed'; + end; +end; + +procedure TfmBase.btDisconnectClick(Sender: TObject); +begin + ReadFromControls; + try + DM.Connection.Disconnect; + UserSession.ConnectionResult := '' + except + UserSession.IsGoodConnection := False; + UserSession.ConnectionResult := 'Failed'; + end; +end; + +procedure TfmBase.ReadFromControls; +begin +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uCachedUpdates.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uCachedUpdates.dfm new file mode 100644 index 0000000..12247ab --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uCachedUpdates.dfm @@ -0,0 +1,1163 @@ +inherited fmCachedUpdates: TfmCachedUpdates + Width = 662 + Height = 570 + OnCreate = IWAppFormCreate + DesignLeft = 255 + DesignTop = 81 + inherited IWRectangle: TIWRectangle + Width = 625 + end + inherited lbPageName: TIWLabel + Left = 522 + Width = 113 + Caption = 'CachedUpdates' + end + object IWDBNavigator1: TIWDBNavigator [7] + Left = 16 + Top = 312 + Width = 230 + Height = 30 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = DataSource + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh] + Orientation = orHorizontal + end + object IWDBGrid1: TIWDBGrid [8] + Left = 16 + Top = 344 + Width = 621 + Height = 135 + Anchors = [akLeft, akTop, akRight] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseWidth = True + Columns = <> + DataSource = DataSource + FooterRowCount = 0 + FromStart = True + HighlightColor = clNone + HighlightRows = False + Options = [dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + end + inherited rgConnection: TIWRegion + Width = 620 + inherited IWRectangle4: TIWRectangle + Width = 618 + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 128 + Width = 620 + Height = 177 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Color = clBlack + DesignSize = ( + 620 + 177) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 618 + Height = 175 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object cbCachedUpdates: TIWCheckBox + Left = 8 + Top = 8 + Width = 137 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'CachedUpdates' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 2 + Checked = False + end + object IWLabel1: TIWLabel + Left = 8 + Top = 111 + Width = 30 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'SQL' + RawText = False + end + object btOpen: TIWButton + Left = 8 + Top = 30 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Open' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 7 + OnClick = btOpenClick + end + object btClose: TIWButton + Left = 112 + Top = 31 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Close' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 8 + OnClick = btCloseClick + end + object cbUnmodified: TIWCheckBox + Left = 265 + Top = 9 + Width = 98 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Unmodified' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + OnClick = cbModifiedClick + Style = stNormal + TabOrder = 3 + Checked = False + end + object cbModified: TIWCheckBox + Left = 361 + Top = 9 + Width = 82 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Modified' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + OnClick = cbModifiedClick + Style = stNormal + TabOrder = 4 + Checked = False + end + object cbInserted: TIWCheckBox + Left = 441 + Top = 9 + Width = 82 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Inserted' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + OnClick = cbModifiedClick + Style = stNormal + TabOrder = 5 + Checked = False + end + object cbDeleted: TIWCheckBox + Left = 521 + Top = 9 + Width = 74 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Deleted' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + OnClick = cbModifiedClick + Style = stNormal + TabOrder = 6 + Checked = False + end + object IWLabel2: TIWLabel + Left = 162 + Top = 10 + Width = 107 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'RecordTypes:' + RawText = False + end + object lbResult: TIWLabel + Left = 226 + Top = 34 + Width = 63 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbResult' + RawText = False + end + object lbUpdates: TIWLabel + Left = 177 + Top = 60 + Width = 80 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = 6956042 + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbUpdates' + RawText = False + end + object btApply: TIWButton + Left = 8 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Apply' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 9 + OnClick = btApplyClick + end + object btCommit: TIWButton + Left = 88 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Commit' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 10 + OnClick = btCommitClick + end + object btCancel: TIWButton + Left = 168 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Cancel' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 11 + OnClick = btCancelClick + end + object btRevert: TIWButton + Left = 248 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Revert' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 12 + OnClick = btRevertClick + end + object btTransStart: TIWButton + Left = 352 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Start' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 13 + OnClick = btTransStartClick + end + object btTransCommit: TIWButton + Left = 432 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Commit' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 14 + OnClick = btTransCommitClick + end + object btTransRollback: TIWButton + Left = 512 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Rollback' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 15 + OnClick = btTransRollbackClick + end + object IWLabel4: TIWLabel + Left = 16 + Top = 60 + Width = 66 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Updates' + RawText = False + end + object IWLabel6: TIWLabel + Left = 368 + Top = 60 + Width = 93 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Transaction' + RawText = False + end + object lbTransaction: TIWLabel + Left = 472 + Top = 60 + Width = 107 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = 6956042 + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbTransaction' + RawText = False + end + object IWRegion1: TIWRegion + Left = 48 + Top = 112 + Width = 562 + Height = 49 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clNone + object meSQL: TIWMemo + Left = 0 + Top = 0 + Width = 562 + Height = 49 + Align = alClient + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + RawText = False + ReadOnly = False + Required = False + TabOrder = 16 + WantReturns = False + FriendlyName = 'meSQL' + end + end + end + object rgEdits: TIWRegion + Left = 16 + Top = 485 + Width = 621 + Height = 62 + Visible = False + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Color = clBlack + DesignSize = ( + 621 + 62) + object rcEdits: TIWRectangle + Left = 1 + Top = 1 + Width = 619 + Height = 60 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + end + object Query: TMSQuery + Left = 432 + Top = 264 + end + object DataSource: TDataSource + DataSet = Query + Left = 456 + Top = 264 + end +end + Width = 662 + Height = 570 + OnCreate = IWAppFormCreate + DesignLeft = 255 + DesignTop = 81 + inherited IWRectangle: TIWRectangle + Width = 625 + end + inherited lbPageName: TIWLabel + Left = 522 + Width = 113 + Caption = 'CachedUpdates' + end + object IWDBNavigator1: TIWDBNavigator [7] + Left = 16 + Top = 312 + Width = 230 + Height = 30 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = DataSource + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh] + Orientation = orHorizontal + end + object IWDBGrid1: TIWDBGrid [8] + Left = 16 + Top = 344 + Width = 621 + Height = 135 + Anchors = [akLeft, akTop, akRight] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseWidth = True + Columns = <> + DataSource = DataSource + FooterRowCount = 0 + FromStart = True + HighlightColor = clNone + HighlightRows = False + Options = [dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + end + inherited rgConnection: TIWRegion + Width = 620 + inherited IWRectangle4: TIWRectangle + Width = 618 + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 128 + Width = 620 + Height = 177 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Color = clBlack + DesignSize = ( + 620 + 177) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 618 + Height = 175 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object cbCachedUpdates: TIWCheckBox + Left = 8 + Top = 8 + Width = 137 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'CachedUpdates' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 2 + Checked = False + end + object IWLabel1: TIWLabel + Left = 8 + Top = 111 + Width = 30 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'SQL' + RawText = False + end + object btOpen: TIWButton + Left = 8 + Top = 30 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Open' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 7 + OnClick = btOpenClick + end + object btClose: TIWButton + Left = 112 + Top = 31 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Close' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 8 + OnClick = btCloseClick + end + object cbUnmodified: TIWCheckBox + Left = 265 + Top = 9 + Width = 98 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Unmodified' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + OnClick = cbModifiedClick + Style = stNormal + TabOrder = 3 + Checked = False + end + object cbModified: TIWCheckBox + Left = 361 + Top = 9 + Width = 82 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Modified' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + OnClick = cbModifiedClick + Style = stNormal + TabOrder = 4 + Checked = False + end + object cbInserted: TIWCheckBox + Left = 441 + Top = 9 + Width = 82 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Inserted' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + OnClick = cbModifiedClick + Style = stNormal + TabOrder = 5 + Checked = False + end + object cbDeleted: TIWCheckBox + Left = 521 + Top = 9 + Width = 74 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Deleted' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + OnClick = cbModifiedClick + Style = stNormal + TabOrder = 6 + Checked = False + end + object IWLabel2: TIWLabel + Left = 162 + Top = 10 + Width = 107 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'RecordTypes:' + RawText = False + end + object lbResult: TIWLabel + Left = 226 + Top = 34 + Width = 63 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbResult' + RawText = False + end + object lbUpdates: TIWLabel + Left = 177 + Top = 60 + Width = 80 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = 6956042 + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbUpdates' + RawText = False + end + object btApply: TIWButton + Left = 8 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Apply' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 9 + OnClick = btApplyClick + end + object btCommit: TIWButton + Left = 88 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Commit' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 10 + OnClick = btCommitClick + end + object btCancel: TIWButton + Left = 168 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Cancel' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 11 + OnClick = btCancelClick + end + object btRevert: TIWButton + Left = 248 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Revert' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 12 + OnClick = btRevertClick + end + object btTransStart: TIWButton + Left = 352 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Start' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 13 + OnClick = btTransStartClick + end + object btTransCommit: TIWButton + Left = 432 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Commit' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 14 + OnClick = btTransCommitClick + end + object btTransRollback: TIWButton + Left = 512 + Top = 80 + Width = 75 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Rollback' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + TabOrder = 15 + OnClick = btTransRollbackClick + end + object IWLabel4: TIWLabel + Left = 16 + Top = 60 + Width = 66 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Updates' + RawText = False + end + object IWLabel6: TIWLabel + Left = 368 + Top = 60 + Width = 93 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Transaction' + RawText = False + end + object lbTransaction: TIWLabel + Left = 472 + Top = 60 + Width = 107 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = 6956042 + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbTransaction' + RawText = False + end + object IWRegion1: TIWRegion + Left = 48 + Top = 112 + Width = 562 + Height = 49 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clNone + object meSQL: TIWMemo + Left = 0 + Top = 0 + Width = 562 + Height = 49 + Align = alClient + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + RawText = False + ReadOnly = False + Required = False + TabOrder = 16 + WantReturns = False + FriendlyName = 'meSQL' + end + end + end + object rgEdits: TIWRegion + Left = 16 + Top = 485 + Width = 621 + Height = 62 + Visible = False + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Color = clBlack + DesignSize = ( + 621 + 62) + object rcEdits: TIWRectangle + Left = 1 + Top = 1 + Width = 619 + Height = 60 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + end + object Query: TMSQuery + Left = 432 + Top = 264 + end + object DataSource: TDataSource + DataSet = Query + Left = 456 + Top = 264 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uCachedUpdates.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uCachedUpdates.pas new file mode 100644 index 0000000..63b765e --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uCachedUpdates.pas @@ -0,0 +1,479 @@ +unit uCachedUpdates; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWCompLabel, IWControl, IWCompRectangle, IWHTMLControls, + IWCompButton, IWContainer, IWRegion, IWCompMemo, IWCompCheckbox, DB, + MemDS, DBAccess, MSAccess, IWGrids, IWDBGrids, IWDBStdCtrls, + IWCSStdCtrls, IWClientSideDatasetBase, IWClientSideDatasetDBLink, + IWDynGrid; + +type + TfmCachedUpdates = class(TfmBase) + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + cbCachedUpdates: TIWCheckBox; + IWRegion1: TIWRegion; + meSQL: TIWMemo; + IWLabel1: TIWLabel; + btOpen: TIWButton; + btClose: TIWButton; + Query: TMSQuery; + cbUnmodified: TIWCheckBox; + cbModified: TIWCheckBox; + cbInserted: TIWCheckBox; + cbDeleted: TIWCheckBox; + IWLabel2: TIWLabel; + lbResult: TIWLabel; + lbUpdates: TIWLabel; + btApply: TIWButton; + btCommit: TIWButton; + btCancel: TIWButton; + btRevert: TIWButton; + btTransStart: TIWButton; + btTransCommit: TIWButton; + btTransRollback: TIWButton; + DataSource: TDataSource; + IWLabel4: TIWLabel; + IWLabel6: TIWLabel; + IWDBNavigator1: TIWDBNavigator; + lbTransaction: TIWLabel; + IWDBGrid1: TIWDBGrid; + rgEdits: TIWRegion; + rcEdits: TIWRectangle; + procedure IWAppFormCreate(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure cbModifiedClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btApplyClick(Sender: TObject); + procedure btCommitClick(Sender: TObject); + procedure btCancelClick(Sender: TObject); + procedure btRevertClick(Sender: TObject); + procedure btTransStartClick(Sender: TObject); + procedure btTransCommitClick(Sender: TObject); + procedure btTransRollbackClick(Sender: TObject); + protected + procedure ReadFromControls; override; + procedure DeleteCreatedControls; + end; + +implementation + +{$R *.dfm} + +uses + ServerController, UData, IWForm; + +procedure TfmCachedUpdates.IWAppFormCreate(Sender: TObject); +begin + inherited; + Query.Connection := DM.Connection; +end; + +procedure TfmCachedUpdates.ReadFromControls; +begin + inherited; + UserSession.UseCachedUpdates := cbCachedUpdates.Checked; + UserSession.CachedSQL := meSQL.Lines.Text; + + UserSession.CachedRecordTypes := []; + if cbUnmodified.Checked then + Include(UserSession.CachedRecordTypes, rtUnmodified); + if cbModified.Checked then + Include(UserSession.CachedRecordTypes, rtModified); + if cbInserted.Checked then + Include(UserSession.CachedRecordTypes, rtInserted); + if cbDeleted.Checked then + Include(UserSession.CachedRecordTypes, rtDeleted); +end; + +procedure TfmCachedUpdates.IWAppFormRender(Sender: TObject); +begin + inherited; + cbCachedUpdates.Checked := UserSession.UseCachedUpdates; + cbUnmodified.Checked := rtUnmodified in UserSession.CachedRecordTypes; + cbModified.Checked := rtModified in UserSession.CachedRecordTypes; + cbInserted.Checked := rtInserted in UserSession.CachedRecordTypes; + cbDeleted.Checked := rtDeleted in UserSession.CachedRecordTypes; + meSQL.Lines.Text := UserSession.CachedSQL; + + if Query.CachedUpdates then + Query.UpdateRecordTypes := UserSession.CachedRecordTypes; + if Query.UpdatesPending then + lbUpdates.Text := 'Updates Pending' + else + lbUpdates.Text := ''; + if Query.Connection.InTransaction then + lbTransaction.Text := 'In Transaction' + else + lbTransaction.Text := ''; + + lbResult.Font.Color := ResultColors[UserSession.IsGoodCached]; + lbResult.Caption := UserSession.CachedResult; + + IWDBGrid1.Visible := Query.Active; + +end; + +procedure TfmCachedUpdates.cbModifiedClick(Sender: TObject); +begin + ReadFromControls; +end; + +procedure TfmCachedUpdates.btOpenClick(Sender: TObject); +var + i, ATop: integer; +begin + ReadFromControls; + UserSession.isGoodCached := False; + DeleteCreatedControls; + try + IWDBGrid1.Columns.Clear; + Query.SQL.Text := UserSession.CachedSQL; + Query.CachedUpdates := UserSession.UseCachedUpdates; + Query.Execute; + UserSession.isGoodCached := True; + UserSession.CachedResult := 'Query is openned'; + ATop := 8; + if Query.FieldCount > 0 then begin + for i := 0 to Query.FieldCount - 1 do begin + with TIWLabel.Create(Self) do begin + Parent := rgEdits; + Caption := Query.Fields[i].FieldName; + Left := 24; + Top := ATop; + end; + with TIWDBEdit.Create(Self) do begin + Parent := rgEdits; + DataSource := Self.DataSource; + DataField := Query.Fields[i].FieldName; + Left := 240; + Top := ATop; + Width := 240; + end; + ATop := ATop + 24; + end; + rgEdits.Height := ATop + 4; + rcEdits.Height := rgEdits.Height - 2; + rgEdits.Visible := True; + end; + except + on E:Exception do + UserSession.CachedResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmCachedUpdates.btCloseClick(Sender: TObject); +begin + ReadFromControls; + UserSession.isGoodCached := False; + DeleteCreatedControls; + try + IWDBGrid1.Columns.Clear; + Query.Close; + UserSession.isGoodCached := True; + UserSession.CachedResult := '' + except + on E:Exception do + UserSession.CachedResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmCachedUpdates.btApplyClick(Sender: TObject); +begin + ReadFromControls; + Query.ApplyUpdates; +end; + +procedure TfmCachedUpdates.btCommitClick(Sender: TObject); +begin + ReadFromControls; + Query.CommitUpdates; +end; + +procedure TfmCachedUpdates.btCancelClick(Sender: TObject); +begin + ReadFromControls; + Query.CancelUpdates; +end; + +procedure TfmCachedUpdates.btRevertClick(Sender: TObject); +begin + ReadFromControls; + Query.RevertRecord; +end; + +procedure TfmCachedUpdates.btTransStartClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.StartTransaction; +end; + +procedure TfmCachedUpdates.btTransCommitClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.Commit; +end; + +procedure TfmCachedUpdates.btTransRollbackClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.Rollback; +end; + +procedure TfmCachedUpdates.DeleteCreatedControls; +var + i: integer; +begin + i := 0; + while i < rgEdits.ControlCount do + if not (rgEdits.Controls[i] is TIWRectangle) then + rgEdits.Controls[i].Free + else + Inc(i); + rgEdits.Visible := False; +end; + +end. + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWCompLabel, IWControl, IWCompRectangle, IWHTMLControls, + IWCompButton, IWContainer, IWRegion, IWCompMemo, IWCompCheckbox, DB, + MemDS, DBAccess, MSAccess, IWGrids, IWDBGrids, IWDBStdCtrls, + IWCSStdCtrls, IWClientSideDatasetBase, IWClientSideDatasetDBLink, + IWDynGrid; + +type + TfmCachedUpdates = class(TfmBase) + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + cbCachedUpdates: TIWCheckBox; + IWRegion1: TIWRegion; + meSQL: TIWMemo; + IWLabel1: TIWLabel; + btOpen: TIWButton; + btClose: TIWButton; + Query: TMSQuery; + cbUnmodified: TIWCheckBox; + cbModified: TIWCheckBox; + cbInserted: TIWCheckBox; + cbDeleted: TIWCheckBox; + IWLabel2: TIWLabel; + lbResult: TIWLabel; + lbUpdates: TIWLabel; + btApply: TIWButton; + btCommit: TIWButton; + btCancel: TIWButton; + btRevert: TIWButton; + btTransStart: TIWButton; + btTransCommit: TIWButton; + btTransRollback: TIWButton; + DataSource: TDataSource; + IWLabel4: TIWLabel; + IWLabel6: TIWLabel; + IWDBNavigator1: TIWDBNavigator; + lbTransaction: TIWLabel; + IWDBGrid1: TIWDBGrid; + rgEdits: TIWRegion; + rcEdits: TIWRectangle; + procedure IWAppFormCreate(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure cbModifiedClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btApplyClick(Sender: TObject); + procedure btCommitClick(Sender: TObject); + procedure btCancelClick(Sender: TObject); + procedure btRevertClick(Sender: TObject); + procedure btTransStartClick(Sender: TObject); + procedure btTransCommitClick(Sender: TObject); + procedure btTransRollbackClick(Sender: TObject); + protected + procedure ReadFromControls; override; + procedure DeleteCreatedControls; + end; + +implementation + +{$R *.dfm} + +uses + ServerController, UData, IWForm; + +procedure TfmCachedUpdates.IWAppFormCreate(Sender: TObject); +begin + inherited; + Query.Connection := DM.Connection; +end; + +procedure TfmCachedUpdates.ReadFromControls; +begin + inherited; + UserSession.UseCachedUpdates := cbCachedUpdates.Checked; + UserSession.CachedSQL := meSQL.Lines.Text; + + UserSession.CachedRecordTypes := []; + if cbUnmodified.Checked then + Include(UserSession.CachedRecordTypes, rtUnmodified); + if cbModified.Checked then + Include(UserSession.CachedRecordTypes, rtModified); + if cbInserted.Checked then + Include(UserSession.CachedRecordTypes, rtInserted); + if cbDeleted.Checked then + Include(UserSession.CachedRecordTypes, rtDeleted); +end; + +procedure TfmCachedUpdates.IWAppFormRender(Sender: TObject); +begin + inherited; + cbCachedUpdates.Checked := UserSession.UseCachedUpdates; + cbUnmodified.Checked := rtUnmodified in UserSession.CachedRecordTypes; + cbModified.Checked := rtModified in UserSession.CachedRecordTypes; + cbInserted.Checked := rtInserted in UserSession.CachedRecordTypes; + cbDeleted.Checked := rtDeleted in UserSession.CachedRecordTypes; + meSQL.Lines.Text := UserSession.CachedSQL; + + if Query.CachedUpdates then + Query.UpdateRecordTypes := UserSession.CachedRecordTypes; + if Query.UpdatesPending then + lbUpdates.Text := 'Updates Pending' + else + lbUpdates.Text := ''; + if Query.Connection.InTransaction then + lbTransaction.Text := 'In Transaction' + else + lbTransaction.Text := ''; + + lbResult.Font.Color := ResultColors[UserSession.IsGoodCached]; + lbResult.Caption := UserSession.CachedResult; + + IWDBGrid1.Visible := Query.Active; + +end; + +procedure TfmCachedUpdates.cbModifiedClick(Sender: TObject); +begin + ReadFromControls; +end; + +procedure TfmCachedUpdates.btOpenClick(Sender: TObject); +var + i, ATop: integer; +begin + ReadFromControls; + UserSession.isGoodCached := False; + DeleteCreatedControls; + try + IWDBGrid1.Columns.Clear; + Query.SQL.Text := UserSession.CachedSQL; + Query.CachedUpdates := UserSession.UseCachedUpdates; + Query.Execute; + UserSession.isGoodCached := True; + UserSession.CachedResult := 'Query is openned'; + ATop := 8; + if Query.FieldCount > 0 then begin + for i := 0 to Query.FieldCount - 1 do begin + with TIWLabel.Create(Self) do begin + Parent := rgEdits; + Caption := Query.Fields[i].FieldName; + Left := 24; + Top := ATop; + end; + with TIWDBEdit.Create(Self) do begin + Parent := rgEdits; + DataSource := Self.DataSource; + DataField := Query.Fields[i].FieldName; + Left := 240; + Top := ATop; + Width := 240; + end; + ATop := ATop + 24; + end; + rgEdits.Height := ATop + 4; + rcEdits.Height := rgEdits.Height - 2; + rgEdits.Visible := True; + end; + except + on E:Exception do + UserSession.CachedResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmCachedUpdates.btCloseClick(Sender: TObject); +begin + ReadFromControls; + UserSession.isGoodCached := False; + DeleteCreatedControls; + try + IWDBGrid1.Columns.Clear; + Query.Close; + UserSession.isGoodCached := True; + UserSession.CachedResult := '' + except + on E:Exception do + UserSession.CachedResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmCachedUpdates.btApplyClick(Sender: TObject); +begin + ReadFromControls; + Query.ApplyUpdates; +end; + +procedure TfmCachedUpdates.btCommitClick(Sender: TObject); +begin + ReadFromControls; + Query.CommitUpdates; +end; + +procedure TfmCachedUpdates.btCancelClick(Sender: TObject); +begin + ReadFromControls; + Query.CancelUpdates; +end; + +procedure TfmCachedUpdates.btRevertClick(Sender: TObject); +begin + ReadFromControls; + Query.RevertRecord; +end; + +procedure TfmCachedUpdates.btTransStartClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.StartTransaction; +end; + +procedure TfmCachedUpdates.btTransCommitClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.Commit; +end; + +procedure TfmCachedUpdates.btTransRollbackClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.Rollback; +end; + +procedure TfmCachedUpdates.DeleteCreatedControls; +var + i: integer; +begin + i := 0; + while i < rgEdits.ControlCount do + if not (rgEdits.Controls[i] is TIWRectangle) then + rgEdits.Controls[i].Free + else + Inc(i); + rgEdits.Visible := False; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uData.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uData.dfm new file mode 100644 index 0000000..81f56c1 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uData.dfm @@ -0,0 +1,33 @@ +object DM: TDM + OldCreateOrder = False + Left = 184 + Top = 103 + Height = 250 + Width = 225 + object Connection: TMSConnection + Database = 'master' + Authentication = auServer + AfterConnect = ConnectionAfterConnect + BeforeConnect = ConnectionBeforeConnect + AfterDisconnect = ConnectionAfterDisconnect + OnConnectionLost = ConnectionConnectionLost + Left = 40 + Top = 24 + end +end + OldCreateOrder = False + Left = 184 + Top = 103 + Height = 250 + Width = 225 + object Connection: TMSConnection + Database = 'master' + Authentication = auServer + AfterConnect = ConnectionAfterConnect + BeforeConnect = ConnectionBeforeConnect + AfterDisconnect = ConnectionAfterDisconnect + OnConnectionLost = ConnectionConnectionLost + Left = 40 + Top = 24 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uData.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uData.pas new file mode 100644 index 0000000..c9414f6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uData.pas @@ -0,0 +1,153 @@ +unit uData; + +interface + +uses + SysUtils, Classes, DB, DBAccess, MSAccess, ActiveX, MemData; + +type + TDM = class(TDataModule) + Connection: TMSConnection; + procedure ConnectionBeforeConnect(Sender: TObject); + procedure ConnectionAfterConnect(Sender: TObject); + procedure ConnectionAfterDisconnect(Sender: TObject); + procedure ConnectionConnectionLost(Sender: TObject; + Component: TComponent; ConnLostCause: TConnLostCause; + var RetryMode: TRetryMode); + end; + +implementation + +{$R *.dfm} + +uses IWInit, ServerController; + +{ TDM } + +procedure TDM.ConnectionBeforeConnect(Sender: TObject); +begin + Connection.Username := UserSession.Username; + Connection.Password := UserSession.Password; + Connection.Server := UserSession.Server; + Connection.Database := UserSession.Database; + Connection.Options.DisconnectedMode := UserSession.DisconnectedMode; + Connection.Pooling := UserSession.Pooling; + Connection.PoolingOptions := UserSession.PoolingOptions; + if UserSession.FailOver then + Connection.OnConnectionLost := ConnectionConnectionLost + else + Connection.OnConnectionLost := nil; +end; + +procedure TDM.ConnectionAfterConnect(Sender: TObject); +begin + UserSession.IsGoodConnection := True; + UserSession.ConnectionResult := 'Connected'; +end; + +procedure TDM.ConnectionAfterDisconnect(Sender: TObject); +begin + if not (csDestroying in Connection.ComponentState) then + UserSession.ConnectionResult := ''; +end; + +procedure TDM.ConnectionConnectionLost(Sender: TObject; + Component: TComponent; ConnLostCause: TConnLostCause; + var RetryMode: TRetryMode); +var + Msg: string; +begin + UserSession.IsGoodConnection := False; + case ConnLostCause of + clUnknown: + Msg := 'Unknown'; + clConnect: + Msg := 'Connect'; + clExecute: + Msg := 'Execute'; + clOpen: + Msg := 'Open'; + clApply: + Msg := 'Apply'; + end; + UserSession.ConnectionResult := 'Connection lost: ' + + Component.Name + ' - ' + Msg; +end; + +end. + +interface + +uses + SysUtils, Classes, DB, DBAccess, MSAccess, ActiveX; + +type + TDM = class(TDataModule) + Connection: TMSConnection; + procedure ConnectionBeforeConnect(Sender: TObject); + procedure ConnectionAfterConnect(Sender: TObject); + procedure ConnectionAfterDisconnect(Sender: TObject); + procedure ConnectionConnectionLost(Sender: TObject; + Component: TComponent; ConnLostCause: TConnLostCause; + var RetryMode: TRetryMode); + end; + +implementation + +{$R *.dfm} + +uses IWInit, ServerController; + +{ TDM } + +procedure TDM.ConnectionBeforeConnect(Sender: TObject); +begin + Connection.Username := UserSession.Username; + Connection.Password := UserSession.Password; + Connection.Server := UserSession.Server; + Connection.Database := UserSession.Database; + Connection.Options.DisconnectedMode := UserSession.DisconnectedMode; + Connection.Pooling := UserSession.Pooling; + Connection.PoolingOptions := UserSession.PoolingOptions; + if UserSession.FailOver then + Connection.OnConnectionLost := ConnectionConnectionLost + else + Connection.OnConnectionLost := nil; +end; + +procedure TDM.ConnectionAfterConnect(Sender: TObject); +begin + UserSession.IsGoodConnection := True; + UserSession.ConnectionResult := 'Connected'; +end; + +procedure TDM.ConnectionAfterDisconnect(Sender: TObject); +begin + if not (csDestroying in Connection.ComponentState) then + UserSession.ConnectionResult := ''; +end; + +procedure TDM.ConnectionConnectionLost(Sender: TObject; + Component: TComponent; ConnLostCause: TConnLostCause; + var RetryMode: TRetryMode); +var + Msg: string; +begin + UserSession.IsGoodConnection := False; + case ConnLostCause of + clUnknown: + Msg := 'Unknown'; + clConnect: + Msg := 'Connect'; + clExecute: + Msg := 'Execute'; + clOpen: + Msg := 'Open'; + clApply: + Msg := 'Apply'; + end; + UserSession.ConnectionResult := 'Connection lost: ' + + Component.Name + ' - ' + Msg; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMain.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMain.dfm new file mode 100644 index 0000000..5a4caa0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMain.dfm @@ -0,0 +1,839 @@ +inherited fmMain: TfmMain + Width = 630 + Height = 491 + OnCreate = IWAppFormCreate + DesignLeft = 232 + DesignTop = 119 + inherited IWRectangle: TIWRectangle + Width = 609 + end + inherited lbPageName: TIWLabel + Left = 581 + Width = 33 + Caption = 'Main' + end + inherited rgConnection: TIWRegion + Width = 604 + inherited IWRectangle4: TIWRectangle + Width = 602 + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 127 + Width = 306 + Height = 173 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Color = clBlack + DesignSize = ( + 306 + 173) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 304 + Height = 171 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object edUsername: TIWEdit + Left = 112 + Top = 23 + Width = 163 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edUsername' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 2 + PasswordPrompt = False + end + object IWLabel1: TIWLabel + Left = 20 + Top = 25 + Width = 81 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Username' + RawText = False + end + object IWLabel2: TIWLabel + Left = 20 + Top = 60 + Width = 77 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Password' + RawText = False + end + object edPassword: TIWEdit + Left = 112 + Top = 58 + Width = 163 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edPassword' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 3 + PasswordPrompt = True + end + object IWLabel3: TIWLabel + Left = 20 + Top = 95 + Width = 52 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Server' + RawText = False + end + object edServer: TIWEdit + Left = 112 + Top = 93 + Width = 163 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edServer' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 4 + PasswordPrompt = False + end + object IWLabel5: TIWLabel + Left = 21 + Top = 130 + Width = 75 + Height = 16 + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Database' + end + object edDatabase: TIWEdit + Left = 112 + Top = 128 + Width = 163 + Height = 21 + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edDatabase' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 5 + PasswordPrompt = False + end + end + object IWRegion1: TIWRegion + Left = 329 + Top = 127 + Width = 291 + Height = 174 + Anchors = [akTop, akRight] + TabOrder = 2 + Color = clBlack + DesignSize = ( + 291 + 174) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 289 + Height = 172 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object cbDisconnectedMode: TIWCheckBox + Left = 8 + Top = 8 + Width = 164 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'DisconnectedMode' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 6 + Checked = False + end + object cbFailover: TIWCheckBox + Left = 8 + Top = 35 + Width = 121 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Failover' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 7 + Checked = False + end + object cbPooling: TIWCheckBox + Left = 8 + Top = 62 + Width = 121 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Pooling' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 8 + Checked = False + end + object edConnectionLifeTime: TIWEdit + Left = 157 + Top = 88 + Width = 101 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edConnectionLifeTime' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 9 + PasswordPrompt = False + Text = 'edConnectionLifeTime' + end + object IWLabel4: TIWLabel + Left = 26 + Top = 90 + Width = 140 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + Caption = 'ConnectionLifeTime' + RawText = False + end + object edMaxPoolSize: TIWEdit + Left = 157 + Top = 115 + Width = 101 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMaxPoolSize' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 10 + PasswordPrompt = False + Text = 'edMaxPoolSize' + end + object edMinPoolSize: TIWEdit + Left = 157 + Top = 142 + Width = 101 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMinPoolSize' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 11 + PasswordPrompt = False + Text = 'edMinPoolSize' + end + object IWLabel6: TIWLabel + Left = 26 + Top = 117 + Width = 88 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + Caption = 'MaxPoolSize' + RawText = False + end + object IWLabel7: TIWLabel + Left = 26 + Top = 144 + Width = 83 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + Caption = 'MinPoolSize' + RawText = False + end + end +end + Width = 630 + Height = 491 + OnCreate = IWAppFormCreate + DesignLeft = 232 + DesignTop = 119 + inherited IWRectangle: TIWRectangle + Width = 609 + end + inherited lbPageName: TIWLabel + Left = 581 + Width = 33 + Caption = 'Main' + end + inherited rgConnection: TIWRegion + Width = 604 + inherited IWRectangle4: TIWRectangle + Width = 602 + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 127 + Width = 306 + Height = 173 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Color = clBlack + DesignSize = ( + 306 + 173) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 304 + Height = 171 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object edUsername: TIWEdit + Left = 112 + Top = 23 + Width = 163 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edUsername' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 2 + PasswordPrompt = False + end + object IWLabel1: TIWLabel + Left = 20 + Top = 25 + Width = 81 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Username' + RawText = False + end + object IWLabel2: TIWLabel + Left = 20 + Top = 60 + Width = 77 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Password' + RawText = False + end + object edPassword: TIWEdit + Left = 112 + Top = 58 + Width = 163 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edPassword' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 3 + PasswordPrompt = True + end + object IWLabel3: TIWLabel + Left = 20 + Top = 95 + Width = 52 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Server' + RawText = False + end + object edServer: TIWEdit + Left = 112 + Top = 93 + Width = 163 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edServer' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 4 + PasswordPrompt = False + end + object IWLabel5: TIWLabel + Left = 21 + Top = 130 + Width = 75 + Height = 16 + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'Database' + end + object edDatabase: TIWEdit + Left = 112 + Top = 128 + Width = 163 + Height = 21 + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edDatabase' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 5 + PasswordPrompt = False + end + end + object IWRegion1: TIWRegion + Left = 329 + Top = 127 + Width = 291 + Height = 174 + Anchors = [akTop, akRight] + TabOrder = 2 + Color = clBlack + DesignSize = ( + 291 + 174) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 289 + Height = 172 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object cbDisconnectedMode: TIWCheckBox + Left = 8 + Top = 8 + Width = 164 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'DisconnectedMode' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 6 + Checked = False + end + object cbFailover: TIWCheckBox + Left = 8 + Top = 35 + Width = 121 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Failover' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 7 + Checked = False + end + object cbPooling: TIWCheckBox + Left = 8 + Top = 62 + Width = 121 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'Pooling' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 8 + Checked = False + end + object edConnectionLifeTime: TIWEdit + Left = 157 + Top = 88 + Width = 101 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edConnectionLifeTime' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 9 + PasswordPrompt = False + Text = 'edConnectionLifeTime' + end + object IWLabel4: TIWLabel + Left = 26 + Top = 90 + Width = 140 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + Caption = 'ConnectionLifeTime' + RawText = False + end + object edMaxPoolSize: TIWEdit + Left = 157 + Top = 115 + Width = 101 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMaxPoolSize' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 10 + PasswordPrompt = False + Text = 'edMaxPoolSize' + end + object edMinPoolSize: TIWEdit + Left = 157 + Top = 142 + Width = 101 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMinPoolSize' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 11 + PasswordPrompt = False + Text = 'edMinPoolSize' + end + object IWLabel6: TIWLabel + Left = 26 + Top = 117 + Width = 88 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + Caption = 'MaxPoolSize' + RawText = False + end + object IWLabel7: TIWLabel + Left = 26 + Top = 144 + Width = 83 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + Caption = 'MinPoolSize' + RawText = False + end + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMain.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMain.pas new file mode 100644 index 0000000..4de027e --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMain.pas @@ -0,0 +1,177 @@ +unit uMain; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + uData, uBase, uQuery, uCachedUpdates, uMasterDetail, + IWCompLabel, IWControl, IWCompRectangle, + DB, MemDS, DBAccess, MSAccess, MSConnectionPool, IWHTMLControls, IWCompButton, + IWGrids, IWDBGrids, IWDBStdCtrls, IWCompMemo, IWCompEdit, IWContainer, + IWRegion, IWCompCheckbox, IWCompListbox; + +type + TfmMain = class(TfmBase) + edUsername: TIWEdit; + edPassword: TIWEdit; + edServer: TIWEdit; + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + IWLabel3: TIWLabel; + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + cbFailover: TIWCheckBox; + cbDisconnectedMode: TIWCheckBox; + cbPooling: TIWCheckBox; + IWRegion1: TIWRegion; + IWRectangle1: TIWRectangle; + edConnectionLifeTime: TIWEdit; + IWLabel4: TIWLabel; + edMaxPoolSize: TIWEdit; + edMinPoolSize: TIWEdit; + IWLabel6: TIWLabel; + IWLabel7: TIWLabel; + IWLabel5: TIWLabel; + edDatabase: TIWEdit; + procedure IWAppFormCreate(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +implementation +{$R *.dfm} + +uses + ServerController, IWForm; + +{ TfmMain } + +procedure TfmMain.IWAppFormCreate(Sender: TObject); +begin + inherited; + UserSession.fmMain := Self; +end; + +procedure TfmMain.IWAppFormRender(Sender: TObject); +begin + inherited; + edUsername.Text := UserSession.Username; + edPassword.Text := UserSession.Password; + edServer.Text := UserSession.Server; + edDatabase.Text := UserSession.Database; + cbPooling.Checked := UserSession.Pooling; + cbDisconnectedMode.Checked := UserSession.DisconnectedMode; + cbFailover.Checked := UserSession.FailOver; + + edConnectionLifeTime.Text := IntToStr(UserSession.PoolingOptions.ConnectionLifetime); + edMaxPoolSize.Text := IntToStr(UserSession.PoolingOptions.MaxPoolSize); + edMinpoolSize.Text := IntToStr(UserSession.PoolingOptions.MinPoolSize); +end; + +procedure TfmMain.ReadFromControls; +begin + inherited; + UserSession.Username := edUsername.Text; + UserSession.Password := edPassword.Text; + UserSession.Server := edServer.Text; + UserSession.Database := edDatabase.Text; + UserSession.Pooling := cbPooling.Checked; + UserSession.DisconnectedMode := cbDisconnectedMode.Checked; + UserSession.FailOver := cbFailover.Checked; + + try UserSession.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifeTime.Text); except {Silent} end; + try UserSession.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifeTime.Text); except {Silent} end; + try UserSession.PoolingOptions.MaxPoolSize := StrToInt(edMaxPoolSize.Text); except {Silent} end; + try UserSession.PoolingOptions.MinPoolSize := StrToInt(edMinPoolSize.Text); except {Silent} end; +end; + +end. + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + uData, uBase, uQuery, uCachedUpdates, uMasterDetail, + IWCompLabel, IWControl, IWCompRectangle, + DB, MemDS, DBAccess, MSAccess, MSConnectionPool, IWHTMLControls, IWCompButton, + IWGrids, IWDBGrids, IWDBStdCtrls, IWCompMemo, IWCompEdit, IWContainer, + IWRegion, IWCompCheckbox, IWCompListbox; + +type + TfmMain = class(TfmBase) + edUsername: TIWEdit; + edPassword: TIWEdit; + edServer: TIWEdit; + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + IWLabel3: TIWLabel; + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + cbFailover: TIWCheckBox; + cbDisconnectedMode: TIWCheckBox; + cbPooling: TIWCheckBox; + IWRegion1: TIWRegion; + IWRectangle1: TIWRectangle; + edConnectionLifeTime: TIWEdit; + IWLabel4: TIWLabel; + edMaxPoolSize: TIWEdit; + edMinPoolSize: TIWEdit; + IWLabel6: TIWLabel; + IWLabel7: TIWLabel; + IWLabel5: TIWLabel; + edDatabase: TIWEdit; + procedure IWAppFormCreate(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +implementation +{$R *.dfm} + +uses + ServerController, IWForm; + +{ TfmMain } + +procedure TfmMain.IWAppFormCreate(Sender: TObject); +begin + inherited; + UserSession.fmMain := Self; +end; + +procedure TfmMain.IWAppFormRender(Sender: TObject); +begin + inherited; + edUsername.Text := UserSession.Username; + edPassword.Text := UserSession.Password; + edServer.Text := UserSession.Server; + edDatabase.Text := UserSession.Database; + cbPooling.Checked := UserSession.Pooling; + cbDisconnectedMode.Checked := UserSession.DisconnectedMode; + cbFailover.Checked := UserSession.FailOver; + + edConnectionLifeTime.Text := IntToStr(UserSession.PoolingOptions.ConnectionLifetime); + edMaxPoolSize.Text := IntToStr(UserSession.PoolingOptions.MaxPoolSize); + edMinpoolSize.Text := IntToStr(UserSession.PoolingOptions.MinPoolSize); +end; + +procedure TfmMain.ReadFromControls; +begin + inherited; + UserSession.Username := edUsername.Text; + UserSession.Password := edPassword.Text; + UserSession.Server := edServer.Text; + UserSession.Database := edDatabase.Text; + UserSession.Pooling := cbPooling.Checked; + UserSession.DisconnectedMode := cbDisconnectedMode.Checked; + UserSession.FailOver := cbFailover.Checked; + + try UserSession.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifeTime.Text); except {Silent} end; + try UserSession.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifeTime.Text); except {Silent} end; + try UserSession.PoolingOptions.MaxPoolSize := StrToInt(edMaxPoolSize.Text); except {Silent} end; + try UserSession.PoolingOptions.MinPoolSize := StrToInt(edMinPoolSize.Text); except {Silent} end; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMasterDetail.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMasterDetail.dfm new file mode 100644 index 0000000..be0266a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMasterDetail.dfm @@ -0,0 +1,1013 @@ +inherited fmMasterDetail: TfmMasterDetail + Width = 605 + Height = 567 + OnCreate = IWAppFormCreate + DesignLeft = 261 + DesignTop = 79 + inherited IWRectangle: TIWRectangle + Width = 582 + end + inherited lbPageName: TIWLabel + Left = 495 + Width = 97 + Caption = 'Master/Detail' + end + inherited rgConnection: TIWRegion + Width = 577 + inherited IWRectangle4: TIWRectangle + Width = 575 + end + end + object IWRegion1: TIWRegion + Left = 16 + Top = 127 + Width = 577 + Height = 65 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Color = clBlack + DesignSize = ( + 577 + 65) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 63 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btOpen: TIWButton + Left = 8 + Top = 32 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Open' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 4 + OnClick = btOpenClick + end + object cbLocalMasterDetail: TIWCheckBox + Left = 7 + Top = 10 + Width = 153 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'LocalMasterDetail' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 2 + Checked = False + end + object btClose: TIWButton + Left = 114 + Top = 32 + Width = 95 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Close' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 5 + OnClick = btCloseClick + end + object cbCachedCalcFields: TIWCheckBox + Left = 167 + Top = 10 + Width = 151 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'CachedCalcFields' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 3 + Checked = False + end + object lbResult: TIWLabel + Left = 333 + Top = 12 + Width = 63 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbResult' + RawText = False + end + end + object IWRegion3: TIWRegion + Left = 16 + Top = 382 + Width = 577 + Height = 174 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 3 + Color = clBlack + DesignSize = ( + 577 + 174) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 172 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWLabel4: TIWLabel + Left = 8 + Top = 7 + Width = 55 + Height = 18 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + Caption = 'Detail' + RawText = False + end + object IWLabel3: TIWLabel + Left = 8 + Top = 33 + Width = 93 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'DetailFields' + RawText = False + end + object edDetailFields: TIWEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edDetailFields' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 8 + PasswordPrompt = False + Text = 'edDetailFields' + end + object IWDBGrid2: TIWDBGrid + Left = 144 + Top = 81 + Width = 422 + Height = 85 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseWidth = True + Columns = <> + DataSource = dsDetail + FooterRowCount = 0 + FromStart = True + HighlightColor = clNone + HighlightRows = True + Options = [dgIndicator, dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + end + object IWRegion5: TIWRegion + Left = 144 + Top = 8 + Width = 422 + Height = 65 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clNone + object meDetail: TIWMemo + Left = 0 + Top = 0 + Width = 422 + Height = 65 + Align = alClient + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + RawText = False + ReadOnly = False + Required = False + TabOrder = 9 + WantReturns = False + FriendlyName = 'meDetail' + end + end + end + object IWRegion2: TIWRegion + Left = 16 + Top = 199 + Width = 577 + Height = 178 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Color = clBlack + DesignSize = ( + 577 + 178) + object IWRectangle2: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 176 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWDBNavigator1: TIWDBNavigator + Left = 8 + Top = 104 + Width = 115 + Height = 30 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = dsMaster + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbRefresh] + Orientation = orHorizontal + OnFirst = IWDBNavigator1Refresh + OnPrior = IWDBNavigator1Refresh + OnNext = IWDBNavigator1Refresh + OnLast = IWDBNavigator1Refresh + OnRefresh = IWDBNavigator1Refresh + end + object IWLabel1: TIWLabel + Left = 8 + Top = 6 + Width = 67 + Height = 18 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + Caption = 'Master' + RawText = False + end + object IWLabel2: TIWLabel + Left = 8 + Top = 33 + Width = 102 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'MasterFields' + RawText = False + end + object edMasterFields: TIWEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMasterFields' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 6 + PasswordPrompt = False + Text = 'edMasterFields' + end + object IWDBGrid1: TIWDBGrid + Left = 144 + Top = 80 + Width = 422 + Height = 89 + Anchors = [akLeft, akTop, akRight] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseWidth = True + Columns = <> + DataSource = dsMaster + FooterRowCount = 0 + FromStart = True + HighlightColor = clNone + HighlightRows = True + Options = [dgIndicator, dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + end + object IWRegion4: TIWRegion + Left = 144 + Top = 8 + Width = 422 + Height = 65 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clNone + object meMaster: TIWMemo + Left = 0 + Top = 0 + Width = 422 + Height = 65 + Align = alClient + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + RawText = False + ReadOnly = False + Required = False + TabOrder = 7 + WantReturns = False + FriendlyName = 'meMaster' + end + end + end + object quMaster: TMSQuery + Left = 192 + Top = 239 + end + object quDetail: TMSQuery + MasterSource = dsMaster + Left = 128 + Top = 407 + end + object dsMaster: TDataSource + DataSet = quMaster + Left = 224 + Top = 239 + end + object dsDetail: TDataSource + DataSet = quDetail + Left = 160 + Top = 407 + end +end + Width = 605 + Height = 567 + OnCreate = IWAppFormCreate + DesignLeft = 261 + DesignTop = 79 + inherited IWRectangle: TIWRectangle + Width = 582 + end + inherited lbPageName: TIWLabel + Left = 495 + Width = 97 + Caption = 'Master/Detail' + end + inherited rgConnection: TIWRegion + Width = 577 + inherited IWRectangle4: TIWRectangle + Width = 575 + end + end + object IWRegion1: TIWRegion + Left = 16 + Top = 127 + Width = 577 + Height = 65 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Color = clBlack + DesignSize = ( + 577 + 65) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 63 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btOpen: TIWButton + Left = 8 + Top = 32 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Open' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 4 + OnClick = btOpenClick + end + object cbLocalMasterDetail: TIWCheckBox + Left = 7 + Top = 10 + Width = 153 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'LocalMasterDetail' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 2 + Checked = False + end + object btClose: TIWButton + Left = 114 + Top = 32 + Width = 95 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Close' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 5 + OnClick = btCloseClick + end + object cbCachedCalcFields: TIWCheckBox + Left = 167 + Top = 10 + Width = 151 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Caption = 'CachedCalcFields' + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 3 + Checked = False + end + object lbResult: TIWLabel + Left = 333 + Top = 12 + Width = 63 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbResult' + RawText = False + end + end + object IWRegion3: TIWRegion + Left = 16 + Top = 382 + Width = 577 + Height = 174 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 3 + Color = clBlack + DesignSize = ( + 577 + 174) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 172 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWLabel4: TIWLabel + Left = 8 + Top = 7 + Width = 55 + Height = 18 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + Caption = 'Detail' + RawText = False + end + object IWLabel3: TIWLabel + Left = 8 + Top = 33 + Width = 93 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'DetailFields' + RawText = False + end + object edDetailFields: TIWEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edDetailFields' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 8 + PasswordPrompt = False + Text = 'edDetailFields' + end + object IWDBGrid2: TIWDBGrid + Left = 144 + Top = 81 + Width = 422 + Height = 85 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseWidth = True + Columns = <> + DataSource = dsDetail + FooterRowCount = 0 + FromStart = True + HighlightColor = clNone + HighlightRows = True + Options = [dgIndicator, dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + end + object IWRegion5: TIWRegion + Left = 144 + Top = 8 + Width = 422 + Height = 65 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clNone + object meDetail: TIWMemo + Left = 0 + Top = 0 + Width = 422 + Height = 65 + Align = alClient + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + RawText = False + ReadOnly = False + Required = False + TabOrder = 9 + WantReturns = False + FriendlyName = 'meDetail' + end + end + end + object IWRegion2: TIWRegion + Left = 16 + Top = 199 + Width = 577 + Height = 178 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Color = clBlack + DesignSize = ( + 577 + 178) + object IWRectangle2: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 176 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWDBNavigator1: TIWDBNavigator + Left = 8 + Top = 104 + Width = 115 + Height = 30 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = dsMaster + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbRefresh] + Orientation = orHorizontal + OnFirst = IWDBNavigator1Refresh + OnPrior = IWDBNavigator1Refresh + OnNext = IWDBNavigator1Refresh + OnLast = IWDBNavigator1Refresh + OnRefresh = IWDBNavigator1Refresh + end + object IWLabel1: TIWLabel + Left = 8 + Top = 6 + Width = 67 + Height = 18 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + Caption = 'Master' + RawText = False + end + object IWLabel2: TIWLabel + Left = 8 + Top = 33 + Width = 102 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'MasterFields' + RawText = False + end + object edMasterFields: TIWEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BGColor = clNone + DoSubmitValidation = True + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMasterFields' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 6 + PasswordPrompt = False + Text = 'edMasterFields' + end + object IWDBGrid1: TIWDBGrid + Left = 144 + Top = 80 + Width = 422 + Height = 89 + Anchors = [akLeft, akTop, akRight] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseWidth = True + Columns = <> + DataSource = dsMaster + FooterRowCount = 0 + FromStart = True + HighlightColor = clNone + HighlightRows = True + Options = [dgIndicator, dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + end + object IWRegion4: TIWRegion + Left = 144 + Top = 8 + Width = 422 + Height = 65 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clNone + object meMaster: TIWMemo + Left = 0 + Top = 0 + Width = 422 + Height = 65 + Align = alClient + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + RawText = False + ReadOnly = False + Required = False + TabOrder = 7 + WantReturns = False + FriendlyName = 'meMaster' + end + end + end + object quMaster: TMSQuery + Left = 192 + Top = 239 + end + object quDetail: TMSQuery + MasterSource = dsMaster + Left = 128 + Top = 407 + end + object dsMaster: TDataSource + DataSet = quMaster + Left = 224 + Top = 239 + end + object dsDetail: TDataSource + DataSet = quDetail + Left = 160 + Top = 407 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMasterDetail.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMasterDetail.pas new file mode 100644 index 0000000..47b3323 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uMasterDetail.pas @@ -0,0 +1,251 @@ +unit uMasterDetail; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWHTMLControls, IWCompLabel, IWControl, IWCompRectangle, + IWCompCheckbox, IWCompEdit, IWCompMemo, IWGrids, IWDBGrids, DB, MemDS, + DBAccess, MSAccess, IWDBStdCtrls, IWCompButton, IWContainer, IWRegion; + +type + TfmMasterDetail = class(TfmBase) + cbLocalMasterDetail: TIWCheckBox; + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + edMasterFields: TIWEdit; + IWDBGrid1: TIWDBGrid; + IWDBGrid2: TIWDBGrid; + IWLabel3: TIWLabel; + IWLabel4: TIWLabel; + edDetailFields: TIWEdit; + IWDBNavigator1: TIWDBNavigator; + quMaster: TMSQuery; + quDetail: TMSQuery; + dsMaster: TDataSource; + dsDetail: TDataSource; + cbCachedCalcFields: TIWCheckBox; + btOpen: TIWButton; + btClose: TIWButton; + IWRegion1: TIWRegion; + IWRegion2: TIWRegion; + IWRegion3: TIWRegion; + IWRectangle1: TIWRectangle; + IWRectangle2: TIWRectangle; + IWRectangle3: TIWRectangle; + lbResult: TIWLabel; + IWRegion4: TIWRegion; + meMaster: TIWMemo; + IWRegion5: TIWRegion; + meDetail: TIWMemo; + procedure IWAppFormCreate(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure IWDBNavigator1Refresh(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +implementation + +{$R *.dfm} + +uses + ServerController, StdConvs; + +procedure TfmMasterDetail.IWAppFormCreate(Sender: TObject); +begin + inherited; + quMaster.Connection := DM.Connection; + quDetail.Connection := DM.Connection; +end; + +procedure TfmMasterDetail.btOpenClick(Sender: TObject); +begin + ReadFromControls; + UserSession.IsGoodMasterDetail := False; + try + quMaster.SQL.Text := UserSession.MasterSQL; + quDetail.SQL.Text := UserSession.DetailSQL; + quDetail.MasterFields := UserSession.MasterFields; + quDetail.DetailFields := UserSession.DetailFields; + quMaster.Options.LocalMasterDetail := UserSession.LocalMasterDetail; + quDetail.Options.LocalMasterDetail := UserSession.LocalMasterDetail; + quMaster.Options.CacheCalcFields := UserSession.CacheCalcFields; + quDetail.Options.CacheCalcFields := UserSession.CacheCalcFields; + quMaster.Open; + quDetail.Open; + UserSession.IsGoodMasterDetail := True; + UserSession.MasterDetailResult := 'Tables are opened'; + except + on E:Exception do + UserSession.MasterDetailResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmMasterDetail.btCloseClick(Sender: TObject); +begin + ReadFromControls; + quMaster.Close; + quDetail.Close; +end; + +procedure TfmMasterDetail.IWAppFormRender(Sender: TObject); +begin + inherited; + cbLocalMasterDetail.Checked := UserSession.LocalMasterDetail; + cbCachedCalcFields.Checked := UserSession.CacheCalcFields; + edMasterFields.Text := UserSession.MasterFields; + edDetailFields.Text := UserSession.DetailFields; + meMaster.Lines.Text := UserSession.MasterSQL; + meDetail.Lines.Text := UserSession.DetailSQL; + IWDBGrid1.Visible := quMaster.Active; + IWDBNavigator1.Enabled := quMaster.Active; + IWDBGrid2.Visible := quDetail.Active; + lbResult.Font.Color := ResultColors[UserSession.IsGoodMasterDetail]; + lbResult.Caption := UserSession.MasterDetailResult; +end; + +procedure TfmMasterDetail.ReadFromControls; +begin + inherited; + UserSession.LocalMasterDetail := cbLocalMasterDetail.Checked; + UserSession.CacheCalcFields := cbCachedCalcFields.Checked; + UserSession.MasterFields := edMasterFields.Text; + UserSession.DetailFields := edDetailFields.Text; + UserSession.MasterSQL := meMaster.Lines.Text; + UserSession.DetailSQL := meDetail.Lines.Text; +end; + +procedure TfmMasterDetail.IWDBNavigator1Refresh(Sender: TObject); +begin + ReadFromControls; +end; + +end. + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWHTMLControls, IWCompLabel, IWControl, IWCompRectangle, + IWCompCheckbox, IWCompEdit, IWCompMemo, IWGrids, IWDBGrids, DB, MemDS, + DBAccess, MSAccess, IWDBStdCtrls, IWCompButton, IWContainer, IWRegion; + +type + TfmMasterDetail = class(TfmBase) + cbLocalMasterDetail: TIWCheckBox; + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + edMasterFields: TIWEdit; + IWDBGrid1: TIWDBGrid; + IWDBGrid2: TIWDBGrid; + IWLabel3: TIWLabel; + IWLabel4: TIWLabel; + edDetailFields: TIWEdit; + IWDBNavigator1: TIWDBNavigator; + quMaster: TMSQuery; + quDetail: TMSQuery; + dsMaster: TDataSource; + dsDetail: TDataSource; + cbCachedCalcFields: TIWCheckBox; + btOpen: TIWButton; + btClose: TIWButton; + IWRegion1: TIWRegion; + IWRegion2: TIWRegion; + IWRegion3: TIWRegion; + IWRectangle1: TIWRectangle; + IWRectangle2: TIWRectangle; + IWRectangle3: TIWRectangle; + lbResult: TIWLabel; + IWRegion4: TIWRegion; + meMaster: TIWMemo; + IWRegion5: TIWRegion; + meDetail: TIWMemo; + procedure IWAppFormCreate(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure IWDBNavigator1Refresh(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +implementation + +{$R *.dfm} + +uses + ServerController, StdConvs; + +procedure TfmMasterDetail.IWAppFormCreate(Sender: TObject); +begin + inherited; + quMaster.Connection := DM.Connection; + quDetail.Connection := DM.Connection; +end; + +procedure TfmMasterDetail.btOpenClick(Sender: TObject); +begin + ReadFromControls; + UserSession.IsGoodMasterDetail := False; + try + quMaster.SQL.Text := UserSession.MasterSQL; + quDetail.SQL.Text := UserSession.DetailSQL; + quDetail.MasterFields := UserSession.MasterFields; + quDetail.DetailFields := UserSession.DetailFields; + quMaster.Options.LocalMasterDetail := UserSession.LocalMasterDetail; + quDetail.Options.LocalMasterDetail := UserSession.LocalMasterDetail; + quMaster.Options.CacheCalcFields := UserSession.CacheCalcFields; + quDetail.Options.CacheCalcFields := UserSession.CacheCalcFields; + quMaster.Open; + quDetail.Open; + UserSession.IsGoodMasterDetail := True; + UserSession.MasterDetailResult := 'Tables are opened'; + except + on E:Exception do + UserSession.MasterDetailResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmMasterDetail.btCloseClick(Sender: TObject); +begin + ReadFromControls; + quMaster.Close; + quDetail.Close; +end; + +procedure TfmMasterDetail.IWAppFormRender(Sender: TObject); +begin + inherited; + cbLocalMasterDetail.Checked := UserSession.LocalMasterDetail; + cbCachedCalcFields.Checked := UserSession.CacheCalcFields; + edMasterFields.Text := UserSession.MasterFields; + edDetailFields.Text := UserSession.DetailFields; + meMaster.Lines.Text := UserSession.MasterSQL; + meDetail.Lines.Text := UserSession.DetailSQL; + IWDBGrid1.Visible := quMaster.Active; + IWDBNavigator1.Enabled := quMaster.Active; + IWDBGrid2.Visible := quDetail.Active; + lbResult.Font.Color := ResultColors[UserSession.IsGoodMasterDetail]; + lbResult.Caption := UserSession.MasterDetailResult; +end; + +procedure TfmMasterDetail.ReadFromControls; +begin + inherited; + UserSession.LocalMasterDetail := cbLocalMasterDetail.Checked; + UserSession.CacheCalcFields := cbCachedCalcFields.Checked; + UserSession.MasterFields := edMasterFields.Text; + UserSession.DetailFields := edDetailFields.Text; + UserSession.MasterSQL := meMaster.Lines.Text; + UserSession.DetailSQL := meDetail.Lines.Text; +end; + +procedure TfmMasterDetail.IWDBNavigator1Refresh(Sender: TObject); +begin + ReadFromControls; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uQuery.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uQuery.dfm new file mode 100644 index 0000000..7f07fb6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uQuery.dfm @@ -0,0 +1,615 @@ +inherited fmQuery: TfmQuery + Width = 677 + Height = 416 + OnCreate = IWAppFormCreate + DesignSize = ( + 677 + 416) + DesignLeft = 265 + DesignTop = 95 + inherited IWRectangle: TIWRectangle + Width = 656 + end + inherited lbPageName: TIWLabel + Left = 619 + Width = 44 + Caption = 'Query' + end + inherited rgConnection: TIWRegion + Width = 653 + DesignSize = ( + 653 + 42) + inherited IWRectangle4: TIWRectangle + Width = 651 + end + end + object IWRegion1: TIWRegion + Left = 16 + Top = 184 + Width = 654 + Height = 65 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Color = clBlack + DesignSize = ( + 654 + 65) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 652 + Height = 63 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWLabel1: TIWLabel + Left = 7 + Top = 7 + Width = 38 + Height = 18 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + Caption = 'SQL' + RawText = False + end + object IWRegion3: TIWRegion + Left = 56 + Top = 8 + Width = 589 + Height = 49 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clNone + object meSQL: TIWMemo + Left = 0 + Top = 0 + Width = 589 + Height = 49 + Align = alClient + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + RawText = False + ReadOnly = False + Required = False + TabOrder = 4 + WantReturns = False + FriendlyName = 'meSQL' + end + end + end + object IWRegion2: TIWRegion + Left = 16 + Top = 256 + Width = 654 + Height = 141 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 3 + Color = clBlack + DesignSize = ( + 654 + 141) + object IWRectangle2: TIWRectangle + Left = 1 + Top = 1 + Width = 652 + Height = 139 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWDBNavigator: TIWDBNavigator + Left = 6 + Top = 29 + Width = 115 + Height = 30 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = DataSource + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbRefresh] + Orientation = orHorizontal + OnFirst = IWDBNavigatorRefresh + OnPrior = IWDBNavigatorRefresh + OnNext = IWDBNavigatorRefresh + OnLast = IWDBNavigatorRefresh + OnRefresh = IWDBNavigatorRefresh + end + object IWLabel2: TIWLabel + Left = 7 + Top = 7 + Width = 46 + Height = 18 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + Caption = 'Data' + RawText = False + end + object IWDBGrid: TIWDBGrid + Left = 144 + Top = 28 + Width = 502 + Height = 105 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseWidth = True + Columns = <> + DataSource = DataSource + FooterRowCount = 0 + FromStart = True + HighlightColor = clNone + HighlightRows = False + Options = [dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + end + object lbResult: TIWLabel + Left = 144 + Top = 7 + Width = 63 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbResult' + RawText = False + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 128 + Width = 653 + Height = 46 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Color = clBlack + DesignSize = ( + 653 + 46) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 651 + Height = 44 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btOpen: TIWButton + Left = 11 + Top = 11 + Width = 94 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Open' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 2 + OnClick = btOpenClick + end + object btClose: TIWButton + Left = 112 + Top = 11 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Close' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 3 + OnClick = btCloseClick + end + end + object Query: TMSQuery + Left = 272 + Top = 48 + end + object DataSource: TDataSource + DataSet = Query + Left = 304 + Top = 48 + end +end + Width = 677 + Height = 416 + OnCreate = IWAppFormCreate + DesignSize = ( + 677 + 416) + DesignLeft = 265 + DesignTop = 95 + inherited IWRectangle: TIWRectangle + Width = 656 + end + inherited lbPageName: TIWLabel + Left = 619 + Width = 44 + Caption = 'Query' + end + inherited rgConnection: TIWRegion + Width = 653 + DesignSize = ( + 653 + 42) + inherited IWRectangle4: TIWRectangle + Width = 651 + end + end + object IWRegion1: TIWRegion + Left = 16 + Top = 184 + Width = 654 + Height = 65 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Color = clBlack + DesignSize = ( + 654 + 65) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 652 + Height = 63 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWLabel1: TIWLabel + Left = 7 + Top = 7 + Width = 38 + Height = 18 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + Caption = 'SQL' + RawText = False + end + object IWRegion3: TIWRegion + Left = 56 + Top = 8 + Width = 589 + Height = 49 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Color = clNone + object meSQL: TIWMemo + Left = 0 + Top = 0 + Width = 589 + Height = 49 + Align = alClient + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Editable = True + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + RawText = False + ReadOnly = False + Required = False + TabOrder = 4 + WantReturns = False + FriendlyName = 'meSQL' + end + end + end + object IWRegion2: TIWRegion + Left = 16 + Top = 256 + Width = 654 + Height = 141 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 3 + Color = clBlack + DesignSize = ( + 654 + 141) + object IWRectangle2: TIWRectangle + Left = 1 + Top = 1 + Width = 652 + Height = 139 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWDBNavigator: TIWDBNavigator + Left = 6 + Top = 29 + Width = 115 + Height = 30 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = DataSource + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbRefresh] + Orientation = orHorizontal + OnFirst = IWDBNavigatorRefresh + OnPrior = IWDBNavigatorRefresh + OnNext = IWDBNavigatorRefresh + OnLast = IWDBNavigatorRefresh + OnRefresh = IWDBNavigatorRefresh + end + object IWLabel2: TIWLabel + Left = 7 + Top = 7 + Width = 46 + Height = 18 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + Caption = 'Data' + RawText = False + end + object IWDBGrid: TIWDBGrid + Left = 144 + Top = 28 + Width = 502 + Height = 105 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = 0 + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseWidth = True + Columns = <> + DataSource = DataSource + FooterRowCount = 0 + FromStart = True + HighlightColor = clNone + HighlightRows = False + Options = [dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + end + object lbResult: TIWLabel + Left = 144 + Top = 7 + Width = 63 + Height = 16 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + Caption = 'lbResult' + RawText = False + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 128 + Width = 653 + Height = 46 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Color = clBlack + DesignSize = ( + 653 + 46) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 651 + Height = 44 + Anchors = [akLeft, akTop, akRight, akBottom] + ShowHint = True + ParentShowHint = False + ZIndex = -1 + Font.Color = clNone + Font.Enabled = True + Font.Size = 10 + Font.Style = [] + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btOpen: TIWButton + Left = 11 + Top = 11 + Width = 94 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Open' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 2 + OnClick = btOpenClick + end + object btClose: TIWButton + Left = 112 + Top = 11 + Width = 97 + Height = 25 + ShowHint = True + ParentShowHint = False + ZIndex = 0 + ButtonType = btButton + Caption = 'Close' + Color = clBtnFace + DoSubmitValidation = True + Font.Color = clNone + Font.Enabled = True + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + TabOrder = 3 + OnClick = btCloseClick + end + end + object Query: TMSQuery + Left = 272 + Top = 48 + end + object DataSource: TDataSource + DataSet = Query + Left = 304 + Top = 48 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uQuery.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uQuery.pas new file mode 100644 index 0000000..992e767 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW5/uQuery.pas @@ -0,0 +1,229 @@ +unit uQuery; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWCompLabel, IWControl, IWCompRectangle, IWHTMLControls, + IWGrids, IWDBGrids, IWCompMemo, IWDBStdCtrls, IWCompButton, DB, MSAccess, + MemDS, DBAccess, IWTemplateProcessorHTML, + IWContainer, IWRegion, IWLayoutMgrHTML, IWCompCheckbox, ExtCtrls, + IWExtCtrls, IWHTMLTag; + +type + TfmQuery = class(TfmBase) + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + IWDBNavigator: TIWDBNavigator; + lbResult: TIWLabel; + btOpen: TIWButton; + Query: TMSQuery; + DataSource: TDataSource; + IWRegion1: TIWRegion; + IWRegion2: TIWRegion; + IWDBGrid: TIWDBGrid; + IWRectangle1: TIWRectangle; + IWRectangle2: TIWRectangle; + IWRegion3: TIWRegion; + meSQL: TIWMemo; + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + btClose: TIWButton; + procedure IWAppFormCreate(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure IWDBNavigatorRefresh(Sender: TObject); + procedure btCloseClick(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +var + fmQuery: TfmQuery; + +implementation + +{$R *.dfm} + +uses + ServerController, IWForm, ComObj; + +procedure TfmQuery.IWAppFormCreate(Sender: TObject); +begin + inherited; + Query.Connection := DM.Connection; +end; + +procedure TfmQuery.btOpenClick(Sender: TObject); +begin + ReadFromControls; + Query.SQL.Text := UserSession.QuerySQL; + IWDBGrid.Columns.Clear; + UserSession.isGoodQuery := False; + try + Query.Execute; + UserSession.isGoodQuery := True; + if Query.Active then + UserSession.QueryResult := 'Result' + else + if Query.RowsAffected >= 0 then + UserSession.QueryResult := IntToStr(Query.RowsAffected) + ' rows affected' + else + UserSession.QueryResult := 'Executed'; + except + on E:Exception do + UserSession.QueryResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmQuery.btCloseClick(Sender: TObject); +begin + ReadFromControls; + UserSession.isGoodQuery := False; + try + IWDBGrid.Columns.Clear; + Query.Close; + UserSession.isGoodQuery := True; + UserSession.QueryResult := '' + except + on E:Exception do + UserSession.QueryResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmQuery.IWAppFormRender(Sender: TObject); +begin + inherited; + meSQL.Lines.Text := UserSession.QuerySQL; + IWDBGrid.Visible := UserSession.isGoodQuery and Query.Active; + IWDBNavigator.Enabled := IWDBGrid.Visible; + lbResult.Font.Color := ResultColors[UserSession.IsGoodQuery]; + lbResult.Caption := UserSession.QueryResult; +end; + +procedure TfmQuery.ReadFromControls; +begin + inherited; + UserSession.QuerySQL := meSQL.Lines.Text; +end; + +procedure TfmQuery.IWDBNavigatorRefresh(Sender: TObject); +begin + ReadFromControls; +end; + +end. + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWCompLabel, IWControl, IWCompRectangle, IWHTMLControls, + IWGrids, IWDBGrids, IWCompMemo, IWDBStdCtrls, IWCompButton, DB, MSAccess, + MemDS, DBAccess, IWTemplateProcessorHTML, + IWContainer, IWRegion, IWLayoutMgrHTML, IWCompCheckbox, ExtCtrls, + IWExtCtrls, IWHTMLTag; + +type + TfmQuery = class(TfmBase) + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + IWDBNavigator: TIWDBNavigator; + lbResult: TIWLabel; + btOpen: TIWButton; + Query: TMSQuery; + DataSource: TDataSource; + IWRegion1: TIWRegion; + IWRegion2: TIWRegion; + IWDBGrid: TIWDBGrid; + IWRectangle1: TIWRectangle; + IWRectangle2: TIWRectangle; + IWRegion3: TIWRegion; + meSQL: TIWMemo; + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + btClose: TIWButton; + procedure IWAppFormCreate(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure IWDBNavigatorRefresh(Sender: TObject); + procedure btCloseClick(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +var + fmQuery: TfmQuery; + +implementation + +{$R *.dfm} + +uses + ServerController, IWForm, ComObj; + +procedure TfmQuery.IWAppFormCreate(Sender: TObject); +begin + inherited; + Query.Connection := DM.Connection; +end; + +procedure TfmQuery.btOpenClick(Sender: TObject); +begin + ReadFromControls; + Query.SQL.Text := UserSession.QuerySQL; + IWDBGrid.Columns.Clear; + UserSession.isGoodQuery := False; + try + Query.Execute; + UserSession.isGoodQuery := True; + if Query.Active then + UserSession.QueryResult := 'Result' + else + if Query.RowsAffected >= 0 then + UserSession.QueryResult := IntToStr(Query.RowsAffected) + ' rows affected' + else + UserSession.QueryResult := 'Executed'; + except + on E:Exception do + UserSession.QueryResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmQuery.btCloseClick(Sender: TObject); +begin + ReadFromControls; + UserSession.isGoodQuery := False; + try + IWDBGrid.Columns.Clear; + Query.Close; + UserSession.isGoodQuery := True; + UserSession.QueryResult := '' + except + on E:Exception do + UserSession.QueryResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmQuery.IWAppFormRender(Sender: TObject); +begin + inherited; + meSQL.Lines.Text := UserSession.QuerySQL; + IWDBGrid.Visible := UserSession.isGoodQuery and Query.Active; + IWDBNavigator.Enabled := IWDBGrid.Visible; + lbResult.Font.Color := ResultColors[UserSession.IsGoodQuery]; + lbResult.Caption := UserSession.QueryResult; +end; + +procedure TfmQuery.ReadFromControls; +begin + inherited; + UserSession.QuerySQL := meSQL.Lines.Text; +end; + +procedure TfmQuery.IWDBNavigatorRefresh(Sender: TObject); +begin + ReadFromControls; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.bdsproj new file mode 100644 index 0000000..f7c5589 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.bdsproj @@ -0,0 +1,332 @@ + + + + + + + + + + + + IntraWeb.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\ + ..\ + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + 1.0.0.0 + 1.0.0.0 + + + + + + + + + + + + + + + + IntraWeb.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\ + ..\ + + + + vcl;rtl;dbrtl;vcldb;vclx;adortl;dbxcds;dbexpress;vclib;ibxpress;IntrawebDB_72_90;Intraweb_72_90;xmlrtl;vclie;inet;inetdbbde;inetdbxpress;IndySystem;IndyCore;dclOfficeXP;VclSmp;dsnap;soaprtl;IndyProtocols;inetdb;vcldbx;webdsnap;websnap;vclactnband;vclshlctrls;dsnapcon;teeui;teedb;tee;Rave60VCL;ibdacvcl90;ibdac90;dac90;dacvcl90 + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + 1.0.0.0 + 1.0.0.0 + + OraProvider package + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.dpr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.dpr new file mode 100644 index 0000000..1d7a571 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.dpr @@ -0,0 +1,41 @@ +program IntraWeb; +{PUBDIST} + +uses + Forms, + IWMain, + ServerController in 'ServerController.pas' {IWServerController: TIWServerControllerBase}, + uBase in 'uBase.pas' {fmBase: TIWAppForm}, + uMain in 'uMain.pas' {fmMain: TIWAppForm}, + uMasterDetail in 'uMasterDetail.pas' {fmMasterDetail: TIWAppForm}, + uCachedUpdates in 'uCachedUpdates.pas' {fmCachedUpdates: TIWAppForm}, + uData in 'uData.pas' {DM: TDataModule}, + uQuery in 'uQuery.pas' {fmQuery: TIWAppForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TformIWMain, formIWMain); + Application.Run; +end. +{PUBDIST} + +uses + Forms, + IWMain, + ServerController in 'ServerController.pas' {IWServerController: TIWServerControllerBase}, + uBase in 'uBase.pas' {fmBase: TIWAppForm}, + uMain in 'uMain.pas' {fmMain: TIWAppForm}, + uMasterDetail in 'uMasterDetail.pas' {fmMasterDetail: TIWAppForm}, + uCachedUpdates in 'uCachedUpdates.pas' {fmCachedUpdates: TIWAppForm}, + uData in 'uData.pas' {DM: TDataModule}, + uQuery in 'uQuery.pas' {fmQuery: TIWAppForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TformIWMain, formIWMain); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWeb.res new file mode 100644 index 0000000000000000000000000000000000000000..b3ff0b3d99a4fc63769957b182e4830725f5cd0a GIT binary patch literal 876 zcmb7Dv5FKy5Uq6&Hq#r<;V`-l4IPf91p^f$13e}<=RV__X14m+U`J%B0)vf?^GC#B zllhbj4bAL8XkX3jf`W;~yy<@Rs;g?cr-_K>K+YpD{mZ^TIOtQvOa|@v_{q^B=qV<1 z;1w{Ty&G%(Z5bh~j8&ja8zV9Je6E@^=z#VZK`Jcu*S) zU~X2s4bcpQS(KN&`s{|q#%0M@arc#G5i4W-iFkeiouj1^xonr0t#2qQ6kp1!{PLW+ zovA9fB68>JX5_+Nk>qv}9WtqktCE*+b7y)?`YCvDzP&+(Wz5^)Ds2=57S~Bbs8bbn ztC}>fb1u&p+PDx~B$aheRb8Zl7x5!F^i(^qK7{Bk0pgu2QhDxU>%I+KqDM@j2VKN# zU7czjS`^GV3-T3FPMjqGNBgzhy|&{po-;mA?R2o=qXW9h2pAk`FAokhk;dpT0+p;5EcfHD@eA_=`~dEO zevb~L;eV~eZ)@m@riOboirkM-;|#T44%ece=Ep?z49NK*y`$Ikmfizz=mO)x{=64< Q8zwZL9}Ty{ZqbB(1MN;8t^fc4 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.bdsproj b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.bdsproj new file mode 100644 index 0000000..58466ef --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.bdsproj @@ -0,0 +1,328 @@ + + + + + + + + + + + + IntraWebISAPI.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\ + ..\ + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + 1.0.0.0 + 1.0.0.0 + + + + + + + + + + + + + + IntraWebISAPI.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\ + ..\ + + + + vcl;rtl;dbrtl;vcldb;vclx;adortl;dbxcds;dbexpress;vclib;ibxpress;IntrawebDB_72_90;Intraweb_72_90;xmlrtl;vclie;inet;inetdbbde;inetdbxpress;IndySystem;IndyCore;dclOfficeXP;VclSmp;dsnap;soaprtl;IndyProtocols;inetdb;vcldbx;webdsnap;websnap;vclactnband;vclshlctrls;dsnapcon;teeui;teedb;tee;Rave60VCL;ibdacvcl90;ibdac90;dac90;dacvcl90 + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + 1.0.0.0 + 1.0.0.0 + + + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.dpr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.dpr new file mode 100644 index 0000000..21ba2b3 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.dpr @@ -0,0 +1,55 @@ +library IntraWebISAPI; +{PUBDIST} + +{ + Assuming the virtual directory that contains this DLL is /IntraWeb/ the URL to start this application is + http://localhost/IntraWeb/IntraWebISAPI +} + +uses + ISAPIApp, + IWInitISAPI, + ServerController in 'ServerController.pas' {IWServerController: TIWServerControllerBase}, + uBase in 'uBase.pas' {fmBase: TIWAppForm}, + uMain in 'uMain.pas' {fmMain: TIWAppForm}, + uMasterDetail in 'uMasterDetail.pas' {fmMasterDetail: TIWAppForm}, + uCachedUpdates in 'uCachedUpdates.pas' {fmCachedUpdates: TIWAppForm}, + uData in 'uData.pas' {DM: TDataModule}, + uQuery in 'uQuery.pas' {fmQuery: TIWAppForm}; + +{$R *.res} + +exports + GetExtensionVersion, + HttpExtensionProc, + TerminateExtension; +begin + IWRun; +end. +{PUBDIST} + +{ + Assuming the virtual directory that contains this DLL is /IntraWeb/ the URL to start this application is + http://localhost/IntraWeb/IntraWebISAPI +} + +uses + ISAPIApp, + IWInitISAPI, + ServerController in 'ServerController.pas' {IWServerController: TIWServerControllerBase}, + uBase in 'uBase.pas' {fmBase: TIWAppForm}, + uMain in 'uMain.pas' {fmMain: TIWAppForm}, + uMasterDetail in 'uMasterDetail.pas' {fmMasterDetail: TIWAppForm}, + uCachedUpdates in 'uCachedUpdates.pas' {fmCachedUpdates: TIWAppForm}, + uData in 'uData.pas' {DM: TDataModule}, + uQuery in 'uQuery.pas' {fmQuery: TIWAppForm}; + +{$R *.res} + +exports + GetExtensionVersion, + HttpExtensionProc, + TerminateExtension; +begin + IWRun; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/IntraWebISAPI.res new file mode 100644 index 0000000000000000000000000000000000000000..b3ff0b3d99a4fc63769957b182e4830725f5cd0a GIT binary patch literal 876 zcmb7Dv5FKy5Uq6&Hq#r<;V`-l4IPf91p^f$13e}<=RV__X14m+U`J%B0)vf?^GC#B zllhbj4bAL8XkX3jf`W;~yy<@Rs;g?cr-_K>K+YpD{mZ^TIOtQvOa|@v_{q^B=qV<1 z;1w{Ty&G%(Z5bh~j8&ja8zV9Je6E@^=z#VZK`Jcu*S) zU~X2s4bcpQS(KN&`s{|q#%0M@arc#G5i4W-iFkeiouj1^xonr0t#2qQ6kp1!{PLW+ zovA9fB68>JX5_+Nk>qv}9WtqktCE*+b7y)?`YCvDzP&+(Wz5^)Ds2=57S~Bbs8bbn ztC}>fb1u&p+PDx~B$aheRb8Zl7x5!F^i(^qK7{Bk0pgu2QhDxU>%I+KqDM@j2VKN# zU7czjS`^GV3-T3FPMjqGNBgzhy|&{po-;mA?R2o=qXW9h2pAk`FAokhk;dpT0+p;5EcfHD@eA_=`~dEO zevb~L;eV~eZ)@m@riOboirkM-;|#T44%ece=Ep?z49NK*y`$Ikmfizz=mO)x{=64< Q8zwZL9}Ty{ZqbB(1MN;8t^fc4 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ReadMe.txt new file mode 100644 index 0000000..b7891e6 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ReadMe.txt @@ -0,0 +1,10 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demo for IntraWeb included in SDAC was built and tested using +IntraWeb 7.2.14 for Delphi 2005. + +IMPORTANT NOTE: + Demo provided as is and there are no warranty that it is fully + compatible with other versions of IntraWeb. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ServerController.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ServerController.dfm new file mode 100644 index 0000000..e2544b8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ServerController.dfm @@ -0,0 +1,79 @@ +object IWServerController: TIWServerController + OldCreateOrder = True + AuthBeforeNewSession = False + AllowSubFolders = False + AppName = 'MyIWApp' + CacheExpiry = 2 + ComInitialization = ciNormal + Compression.Enabled = False + Compression.Level = 6 + Description = 'SQL Server Data Access Demo - IntraWeb' + DebugHTML = False + Log = loNone + EnableImageToolbar = False + ExceptionDisplayMode = smAlert + ExecCmd = 'EXEC' + HistoryEnabled = False + InternalFilesURL = '/' + Browser32Behaviour.Netscape4As32 = True + Browser32Behaviour.Netscape6As32 = True + Browser32Behaviour.IExplorer4As32 = True + PageTransitions = False + Port = 0 + ReEntryOptions.AutoCreateSession = False + RestrictIPs = False + RestrictSubnet = False + RedirectMsgDelay = 0 + ServerResizeTimeout = 0 + SessionTrackingMethod = tmURL + ShowResyncWarning = True + SessionTimeout = 10 + SupportedBrowsers = [brIE, brOpera, brNetscape6] + SSLOptions.NonSSLRequest = nsAccept + SSLOptions.Port = 0 + ThreadPoolSize = 32 + UnknownBrowserAction = ubReject + Version = '7.2.14' + OnNewSession = IWServerControllerBaseNewSession + Height = 310 + Width = 342 +end + OldCreateOrder = True + AuthBeforeNewSession = False + AllowSubFolders = False + AppName = 'MyIWApp' + CacheExpiry = 2 + ComInitialization = ciNormal + Compression.Enabled = False + Compression.Level = 6 + Description = 'SQL Server Data Access Demo - IntraWeb' + DebugHTML = False + Log = loNone + EnableImageToolbar = False + ExceptionDisplayMode = smAlert + ExecCmd = 'EXEC' + HistoryEnabled = False + InternalFilesURL = '/' + Browser32Behaviour.Netscape4As32 = True + Browser32Behaviour.Netscape6As32 = True + Browser32Behaviour.IExplorer4As32 = True + PageTransitions = False + Port = 0 + ReEntryOptions.AutoCreateSession = False + RestrictIPs = False + RestrictSubnet = False + RedirectMsgDelay = 0 + ServerResizeTimeout = 0 + SessionTrackingMethod = tmURL + ShowResyncWarning = True + SessionTimeout = 10 + SupportedBrowsers = [brIE, brOpera, brNetscape6] + SSLOptions.NonSSLRequest = nsAccept + SSLOptions.Port = 0 + ThreadPoolSize = 32 + UnknownBrowserAction = ubReject + Version = '7.2.14' + OnNewSession = IWServerControllerBaseNewSession + Height = 310 + Width = 342 +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ServerController.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ServerController.pas new file mode 100644 index 0000000..3eb159e --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/ServerController.pas @@ -0,0 +1,279 @@ +unit ServerController; +{PUBDIST} + +interface + +uses + SysUtils, Classes, IWServerControllerBase, + // For OnNewSession Event + IWApplication, IWBaseForm, + IWInit, IWInitISAPI, + uData, uMain, uQuery, uCachedUpdates, uMasterDetail, + MemDS, DBAccess; + +type + TIWServerController = class(TIWServerControllerBase) + procedure IWServerControllerBaseNewSession(ASession: TIWApplication; + var VMainForm: TIWBaseForm); + private + public + end; + + // This is a class which you can add variables to that are specific to the user. Add variables + // to this class instead of creating global variables. This object can references by using: + // UserSession + // So if a variable named UserName of type string is added, it can be referenced by using: + // UserSession.UserName + // Such variables are similar to globals in a normal application, however these variables are + // specific to each user. + // + // See the IntraWeb Manual for more details. + TUserSession = class + public + { Common } + DM: TDM; + fmMain: TfmMain; + fmQuery: TfmQuery; + fmCachedUpdates: TfmCachedUpdates; + fmMasterDetail: TfmMasterDetail; + + { Main } + Username, + Password, + Server, + Database: string; + Pooling, + DisconnectedMode, + FailOver: boolean; + PoolingOptions: TPoolingOptions; + ConnectionResult: string; + IsGoodConnection: boolean; + + { Query } + QueryDependency: boolean; + QuerySQL, + QueryResult: string; + isGoodQuery: boolean; + + { MasterDetail } + MasterSQL, + DetailSQL, + MasterFields, + DetailFields: string; + LocalMasterDetail, + CacheCalcFields: boolean; + MasterDetailResult: string; + isGoodMasterDetail: boolean; + + { CachedUpdates } + CachedSQL: string; + UseCachedUpdates: boolean; + CachedRecordTypes: TUpdateRecordTypes; + CachedResult: string; + isGoodCached: boolean; + + constructor Create; overload; + destructor Destroy; override; + end; + +// Procs + function UserSession: TUserSession; + function DM: TDM; + +implementation + +{$R *.dfm} + +function UserSession: TUserSession; +begin + Result := TUserSession(WebApplication.Data); +end; + +function DM: TDM; +begin + Result := TUserSession(WebApplication.Data).DM; +end; + +{ TUserSession } + +constructor TUserSession.Create; +begin + QuerySQL := 'select * from emp'; + MasterSQL := 'select * from dept'; + DetailSQL := QuerySQL; + CachedSQL := QuerySQL; + MasterFields := 'deptno'; + DetailFields := 'deptno'; + LocalMasterDetail := True; + CacheCalcFields := True; + UseCachedUpdates := True; + Pooling := True; + DisconnectedMode := True; + CachedRecordTypes := [rtUnmodified, rtModified, rtInserted]; + + PoolingOptions := TPoolingOptions.Create(nil); +end; + +destructor TUserSession.Destroy; +begin + PoolingOptions.Free; + inherited; +end; + +{ TIWServerController } + +procedure TIWServerController.IWServerControllerBaseNewSession( + ASession: TIWApplication; var VMainForm: TIWBaseForm); +begin + ASession.Data := TUserSession.Create; + with TUserSession(ASession.Data) do begin + DM := TDM.Create(ASession); + fmQuery := TfmQuery.Create(ASession); + fmCachedUpdates := TfmCachedUpdates.Create(ASession); + fmMasterDetail := TfmMasterDetail.Create(ASession); + end; +end; + + +initialization + TIWServerController.SetServerControllerClass; +end. +{PUBDIST} + +interface + +uses + SysUtils, Classes, IWServerControllerBase, + // For OnNewSession Event + IWApplication, IWBaseForm, + IWInit, IWInitISAPI, + uData, uMain, uQuery, uCachedUpdates, uMasterDetail, + MemDS, DBAccess; + +type + TIWServerController = class(TIWServerControllerBase) + procedure IWServerControllerBaseNewSession(ASession: TIWApplication; + var VMainForm: TIWBaseForm); + private + public + end; + + // This is a class which you can add variables to that are specific to the user. Add variables + // to this class instead of creating global variables. This object can references by using: + // UserSession + // So if a variable named UserName of type string is added, it can be referenced by using: + // UserSession.UserName + // Such variables are similar to globals in a normal application, however these variables are + // specific to each user. + // + // See the IntraWeb Manual for more details. + TUserSession = class + public + { Common } + DM: TDM; + fmMain: TfmMain; + fmQuery: TfmQuery; + fmCachedUpdates: TfmCachedUpdates; + fmMasterDetail: TfmMasterDetail; + + { Main } + Username, + Password, + Server, + Database: string; + Pooling, + DisconnectedMode, + FailOver: boolean; + PoolingOptions: TPoolingOptions; + ConnectionResult: string; + IsGoodConnection: boolean; + + { Query } + QueryDependency: boolean; + QuerySQL, + QueryResult: string; + isGoodQuery: boolean; + + { MasterDetail } + MasterSQL, + DetailSQL, + MasterFields, + DetailFields: string; + LocalMasterDetail, + CacheCalcFields: boolean; + MasterDetailResult: string; + isGoodMasterDetail: boolean; + + { CachedUpdates } + CachedSQL: string; + UseCachedUpdates: boolean; + CachedRecordTypes: TUpdateRecordTypes; + CachedResult: string; + isGoodCached: boolean; + + constructor Create; overload; + destructor Destroy; override; + end; + +// Procs + function UserSession: TUserSession; + function DM: TDM; + +implementation + +{$R *.dfm} + +function UserSession: TUserSession; +begin + Result := TUserSession(WebApplication.Data); +end; + +function DM: TDM; +begin + Result := TUserSession(WebApplication.Data).DM; +end; + +{ TUserSession } + +constructor TUserSession.Create; +begin + QuerySQL := 'select * from emp'; + MasterSQL := 'select * from dept'; + DetailSQL := QuerySQL; + CachedSQL := QuerySQL; + MasterFields := 'deptno'; + DetailFields := 'deptno'; + LocalMasterDetail := True; + CacheCalcFields := True; + UseCachedUpdates := True; + Pooling := True; + DisconnectedMode := True; + CachedRecordTypes := [rtUnmodified, rtModified, rtInserted]; + + PoolingOptions := TPoolingOptions.Create(nil); +end; + +destructor TUserSession.Destroy; +begin + PoolingOptions.Free; + inherited; +end; + +{ TIWServerController } + +procedure TIWServerController.IWServerControllerBaseNewSession( + ASession: TIWApplication; var VMainForm: TIWBaseForm); +begin + ASession.Data := TUserSession.Create; + with TUserSession(ASession.Data) do begin + DM := TDM.Create(ASession); + fmQuery := TfmQuery.Create(ASession); + fmCachedUpdates := TfmCachedUpdates.Create(ASession); + fmMasterDetail := TfmMasterDetail.Create(ASession); + end; +end; + + +initialization + TIWServerController.SetServerControllerClass; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uBase.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uBase.dfm new file mode 100644 index 0000000..cc167dd --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uBase.dfm @@ -0,0 +1,603 @@ +object fmBase: TfmBase + Left = 0 + Top = 0 + Width = 620 + Height = 430 + OnRender = IWAppFormRender + ConnectionMode = cmAny + Title = 'SQL Server Data Access Demo - IntraWeb' + SupportedBrowsers = [brIE, brNetscape6] + BrowserSecurityCheck = True + Background.Fixed = False + HandleTabs = False + LeftToRight = True + LockUntilLoaded = True + LockOnSubmit = True + ShowHint = True + XPTheme = True + DesignSize = ( + 620 + 430) + DesignLeft = 8 + DesignTop = 8 + object IWRectangle: TIWRectangle + Left = 12 + Top = 16 + Width = 599 + Height = 28 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Font.Color = clHighlight + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle' + Color = clSkyBlue + Alignment = taLeftJustify + VAlign = vaMiddle + end + object lbDemoCaption: TIWLabel + Left = 20 + Top = 21 + Width = 381 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + Font.Color = 6956042 + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + AutoSize = False + FriendlyName = 'lbDemoCaption' + Caption = 'SQL Server Data Access Demo - IntraWeb' + RawText = False + end + object lbPageName: TIWLabel + Left = 515 + Top = 22 + Width = 88 + Height = 16 + Cursor = crAuto + Anchors = [akTop, akRight] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = 6956042 + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsItalic] + NoWrap = False + FriendlyName = 'lbPageName' + Caption = 'lbPageName' + RawText = False + end + object lnkMain: TIWLink + Left = 16 + Top = 56 + Width = 41 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + Color = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + FriendlyName = 'lnkMain' + OnClick = lnkMainClick + TabOrder = 0 + RawText = False + Caption = 'Main' + end + object lnkQuery: TIWLink + Left = 69 + Top = 56 + Width = 65 + Height = 17 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + Color = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + FriendlyName = 'lnkQuery' + OnClick = lnkQueryClick + TabOrder = 1 + RawText = False + Caption = 'Query' + end + object lnkCachedUpdates: TIWLink + Left = 138 + Top = 56 + Width = 121 + Height = 17 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + Color = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + FriendlyName = 'lnkCachedUpdates' + OnClick = lnkCachedUpdatesClick + TabOrder = 2 + RawText = False + Caption = 'CachedUpdates' + end + object lnkMasterDetail: TIWLink + Left = 264 + Top = 56 + Width = 105 + Height = 17 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + Color = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + FriendlyName = 'lnkMasterDetail' + OnClick = lnkMasterDetailClick + TabOrder = 3 + RawText = False + Caption = 'MasterDetail' + end + object rgConnection: TIWRegion + Left = 16 + Top = 78 + Width = 594 + Height = 42 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 594 + 42) + object IWRectangle4: TIWRectangle + Left = 1 + Top = 1 + Width = 592 + Height = 40 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle4' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btConnect: TIWButton + Left = 8 + Top = 8 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Connect' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btConnect' + ScriptEvents = <> + TabOrder = 4 + OnClick = btConnectClick + end + object btDisconnect: TIWButton + Left = 112 + Top = 8 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Disconnect' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btDisconnect' + ScriptEvents = <> + TabOrder = 5 + OnClick = btDisconnectClick + end + object lbStateConnection: TIWLabel + Left = 216 + Top = 11 + Width = 147 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbStateConnection' + Caption = 'lbStateConnection' + RawText = False + end + end +end + Left = 0 + Top = 0 + Width = 620 + Height = 430 + OnRender = IWAppFormRender + ConnectionMode = cmAny + Title = 'SQL Server Data Access Demo - IntraWeb' + SupportedBrowsers = [brIE, brNetscape6] + BrowserSecurityCheck = True + Background.Fixed = False + HandleTabs = False + LeftToRight = True + LockUntilLoaded = True + LockOnSubmit = True + ShowHint = True + XPTheme = True + DesignSize = ( + 620 + 430) + DesignLeft = 8 + DesignTop = 8 + object IWRectangle: TIWRectangle + Left = 12 + Top = 16 + Width = 599 + Height = 28 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Font.Color = clHighlight + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle' + Color = clSkyBlue + Alignment = taLeftJustify + VAlign = vaMiddle + end + object lbDemoCaption: TIWLabel + Left = 20 + Top = 21 + Width = 381 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + Font.Color = 6956042 + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + AutoSize = False + FriendlyName = 'lbDemoCaption' + Caption = 'SQL Server Data Access Demo - IntraWeb' + RawText = False + end + object lbPageName: TIWLabel + Left = 515 + Top = 22 + Width = 88 + Height = 16 + Cursor = crAuto + Anchors = [akTop, akRight] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = 6956042 + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsItalic] + NoWrap = False + FriendlyName = 'lbPageName' + Caption = 'lbPageName' + RawText = False + end + object lnkMain: TIWLink + Left = 16 + Top = 56 + Width = 41 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + Color = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + FriendlyName = 'lnkMain' + OnClick = lnkMainClick + TabOrder = 0 + RawText = False + Caption = 'Main' + end + object lnkQuery: TIWLink + Left = 69 + Top = 56 + Width = 65 + Height = 17 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + Color = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + FriendlyName = 'lnkQuery' + OnClick = lnkQueryClick + TabOrder = 1 + RawText = False + Caption = 'Query' + end + object lnkCachedUpdates: TIWLink + Left = 138 + Top = 56 + Width = 121 + Height = 17 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + Color = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + FriendlyName = 'lnkCachedUpdates' + OnClick = lnkCachedUpdatesClick + TabOrder = 2 + RawText = False + Caption = 'CachedUpdates' + end + object lnkMasterDetail: TIWLink + Left = 264 + Top = 56 + Width = 105 + Height = 17 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + Color = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = False + FriendlyName = 'lnkMasterDetail' + OnClick = lnkMasterDetailClick + TabOrder = 3 + RawText = False + Caption = 'MasterDetail' + end + object rgConnection: TIWRegion + Left = 16 + Top = 78 + Width = 594 + Height = 42 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 594 + 42) + object IWRectangle4: TIWRectangle + Left = 1 + Top = 1 + Width = 592 + Height = 40 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle4' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btConnect: TIWButton + Left = 8 + Top = 8 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Connect' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btConnect' + ScriptEvents = <> + TabOrder = 4 + OnClick = btConnectClick + end + object btDisconnect: TIWButton + Left = 112 + Top = 8 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Disconnect' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btDisconnect' + ScriptEvents = <> + TabOrder = 5 + OnClick = btDisconnectClick + end + object lbStateConnection: TIWLabel + Left = 216 + Top = 11 + Width = 147 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbStateConnection' + Caption = 'lbStateConnection' + RawText = False + end + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uBase.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uBase.pas new file mode 100644 index 0000000..7e20614 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uBase.pas @@ -0,0 +1,245 @@ +unit uBase; +{PUBDIST} + +interface + +uses + IWAppForm, IWApplication, IWTypes, Classes, Controls, IWControl, + IWCompRectangle, IWCompButton, IWGrids, IWDBGrids, IWDBStdCtrls, + IWCompMemo, IWCompEdit, IWCompText, IWCompLabel, IWHTMLControls, + IWContainer, IWRegion, + Forms, Graphics, DB, MemDS, DBAccess, MSAccess, IWVCLBaseContainer, + IWHTMLContainer, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl; +type + TfmBase = class(TIWAppForm) + IWRectangle: TIWRectangle; + lbDemoCaption: TIWLabel; + lbPageName: TIWLabel; + lnkMain: TIWLink; + lnkQuery: TIWLink; + lnkCachedUpdates: TIWLink; + lnkMasterDetail: TIWLink; + rgConnection: TIWRegion; + IWRectangle4: TIWRectangle; + btConnect: TIWButton; + btDisconnect: TIWButton; + lbStateConnection: TIWLabel; + procedure lnkMainClick(Sender: TObject); + procedure lnkQueryClick(Sender: TObject); + procedure lnkCachedUpdatesClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure lnkMasterDetailClick(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + protected + procedure ReadFromControls; virtual; + end; + +const + ResultColors: array[boolean] of TColor = (clRed, $006A240A); + +implementation +{$R *.dfm} + +uses + IWInit, ServerController, SysUtils, IWForm; + + +procedure TfmBase.IWAppFormRender(Sender: TObject); + + procedure SetLinkState(Link: TIWLink; Form: TfmBase); + begin + Link.Enabled := Sender <> Form; + if Link.Enabled then + Link.Font.Style := [] + else + Link.Font.Style := [fsBold]; + end; + +begin + SetLinkState(lnkMain, UserSession.fmMain); + SetLinkState(lnkQuery, UserSession.fmQuery); + SetLinkState(lnkCachedUpdates, UserSession.fmCachedUpdates); + SetLinkState(lnkMasterDetail, UserSession.fmMasterDetail); + + lbStateConnection.Font.Color := ResultColors[UserSession.IsGoodConnection]; + lbStateConnection.Caption := UserSession.ConnectionResult; + btDisconnect.Enabled := DM.Connection.Connected; + btConnect.Enabled := not DM.Connection.Connected; +end; + +procedure TfmBase.lnkMainClick(Sender: TObject); +begin + ReadFromControls; + WebApplication.SetActiveForm(UserSession.fmMain); +end; + +procedure TfmBase.lnkQueryClick(Sender: TObject); +begin + ReadFromControls; + WebApplication.SetActiveForm(UserSession.fmQuery); +end; + +procedure TfmBase.lnkCachedUpdatesClick(Sender: TObject); +begin + ReadFromControls; + WebApplication.SetActiveForm(UserSession.fmCachedUpdates); +end; + +procedure TfmBase.lnkMasterDetailClick(Sender: TObject); +begin + ReadFromControls; + WebApplication.SetActiveForm(UserSession.fmMasterDetail); +end; + +procedure TfmBase.btConnectClick(Sender: TObject); +begin + ReadFromControls; + try + DM.Connection.Connect; + UserSession.IsGoodConnection := True; + except + UserSession.IsGoodConnection := False; + UserSession.ConnectionResult := 'Failed'; + end; +end; + +procedure TfmBase.btDisconnectClick(Sender: TObject); +begin + ReadFromControls; + try + DM.Connection.Disconnect; + UserSession.ConnectionResult := '' + except + UserSession.IsGoodConnection := False; + UserSession.ConnectionResult := 'Failed'; + end; +end; + +procedure TfmBase.ReadFromControls; +begin +end; + +end. +{PUBDIST} + +interface + +uses + IWAppForm, IWApplication, IWTypes, Classes, Controls, IWControl, + IWCompRectangle, IWCompButton, IWGrids, IWDBGrids, IWDBStdCtrls, + IWCompMemo, IWCompEdit, IWCompText, IWCompLabel, IWHTMLControls, + IWContainer, IWRegion, + Forms, Graphics, DB, MemDS, DBAccess, MSAccess, IWVCLBaseContainer, + IWHTMLContainer, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl; +type + TfmBase = class(TIWAppForm) + IWRectangle: TIWRectangle; + lbDemoCaption: TIWLabel; + lbPageName: TIWLabel; + lnkMain: TIWLink; + lnkQuery: TIWLink; + lnkCachedUpdates: TIWLink; + lnkMasterDetail: TIWLink; + rgConnection: TIWRegion; + IWRectangle4: TIWRectangle; + btConnect: TIWButton; + btDisconnect: TIWButton; + lbStateConnection: TIWLabel; + procedure lnkMainClick(Sender: TObject); + procedure lnkQueryClick(Sender: TObject); + procedure lnkCachedUpdatesClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure lnkMasterDetailClick(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + protected + procedure ReadFromControls; virtual; + end; + +const + ResultColors: array[boolean] of TColor = (clRed, $006A240A); + +implementation +{$R *.dfm} + +uses + IWInit, ServerController, SysUtils, IWForm; + + +procedure TfmBase.IWAppFormRender(Sender: TObject); + + procedure SetLinkState(Link: TIWLink; Form: TfmBase); + begin + Link.Enabled := Sender <> Form; + if Link.Enabled then + Link.Font.Style := [] + else + Link.Font.Style := [fsBold]; + end; + +begin + SetLinkState(lnkMain, UserSession.fmMain); + SetLinkState(lnkQuery, UserSession.fmQuery); + SetLinkState(lnkCachedUpdates, UserSession.fmCachedUpdates); + SetLinkState(lnkMasterDetail, UserSession.fmMasterDetail); + + lbStateConnection.Font.Color := ResultColors[UserSession.IsGoodConnection]; + lbStateConnection.Caption := UserSession.ConnectionResult; + btDisconnect.Enabled := DM.Connection.Connected; + btConnect.Enabled := not DM.Connection.Connected; +end; + +procedure TfmBase.lnkMainClick(Sender: TObject); +begin + ReadFromControls; + WebApplication.SetActiveForm(UserSession.fmMain); +end; + +procedure TfmBase.lnkQueryClick(Sender: TObject); +begin + ReadFromControls; + WebApplication.SetActiveForm(UserSession.fmQuery); +end; + +procedure TfmBase.lnkCachedUpdatesClick(Sender: TObject); +begin + ReadFromControls; + WebApplication.SetActiveForm(UserSession.fmCachedUpdates); +end; + +procedure TfmBase.lnkMasterDetailClick(Sender: TObject); +begin + ReadFromControls; + WebApplication.SetActiveForm(UserSession.fmMasterDetail); +end; + +procedure TfmBase.btConnectClick(Sender: TObject); +begin + ReadFromControls; + try + DM.Connection.Connect; + UserSession.IsGoodConnection := True; + except + UserSession.IsGoodConnection := False; + UserSession.ConnectionResult := 'Failed'; + end; +end; + +procedure TfmBase.btDisconnectClick(Sender: TObject); +begin + ReadFromControls; + try + DM.Connection.Disconnect; + UserSession.ConnectionResult := '' + except + UserSession.IsGoodConnection := False; + UserSession.ConnectionResult := 'Failed'; + end; +end; + +procedure TfmBase.ReadFromControls; +begin +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uCachedUpdates.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uCachedUpdates.dfm new file mode 100644 index 0000000..c4d014d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uCachedUpdates.dfm @@ -0,0 +1,1405 @@ +inherited fmCachedUpdates: TfmCachedUpdates + Width = 662 + Height = 570 + OnCreate = IWAppFormCreate + DesignLeft = 8 + DesignTop = 8 + inherited IWRectangle: TIWRectangle + Width = 625 + end + inherited lbPageName: TIWLabel + Left = 522 + Width = 113 + Caption = 'CachedUpdates' + end + object IWDBNavigator1: TIWDBNavigator [7] + Left = 16 + Top = 312 + Width = 270 + Height = 30 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = DataSource + FriendlyName = 'IWDBNavigator1' + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh] + Orientation = orHorizontal + end + object IWDBGrid1: TIWDBGrid [8] + Left = 16 + Top = 344 + Width = 621 + Height = 135 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseSize = True + ScrollToCurrentRow = False + Columns = <> + DataSource = DataSource + FooterRowCount = 0 + FriendlyName = 'IWDBGrid1' + FromStart = True + HighlightColor = clNone + HighlightRows = False + Options = [dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + TabOrder = 33 + end + inherited rgConnection: TIWRegion + Width = 620 + inherited IWRectangle4: TIWRectangle + Width = 618 + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 128 + Width = 620 + Height = 177 + Cursor = crAuto + TabOrder = 1 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 620 + 177) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 618 + Height = 175 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle3' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object cbCachedUpdates: TIWCheckBox + Left = 8 + Top = 8 + Width = 137 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'CachedUpdates' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 6 + Checked = False + FriendlyName = 'cbCachedUpdates' + end + object IWLabel1: TIWLabel + Left = 8 + Top = 111 + Width = 30 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel1' + Caption = 'SQL' + RawText = False + end + object btOpen: TIWButton + Left = 8 + Top = 30 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Open' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btOpen' + ScriptEvents = <> + TabOrder = 11 + OnClick = btOpenClick + end + object btClose: TIWButton + Left = 112 + Top = 31 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Close' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btClose' + ScriptEvents = <> + TabOrder = 12 + OnClick = btCloseClick + end + object cbUnmodified: TIWCheckBox + Left = 265 + Top = 9 + Width = 98 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Unmodified' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 7 + OnClick = cbModifiedClick + Checked = False + FriendlyName = 'cbUnmodified' + end + object cbModified: TIWCheckBox + Left = 361 + Top = 9 + Width = 82 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Modified' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 8 + OnClick = cbModifiedClick + Checked = False + FriendlyName = 'cbModified' + end + object cbInserted: TIWCheckBox + Left = 441 + Top = 9 + Width = 82 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Inserted' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 9 + OnClick = cbModifiedClick + Checked = False + FriendlyName = 'cbInserted' + end + object cbDeleted: TIWCheckBox + Left = 521 + Top = 9 + Width = 74 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Deleted' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 10 + OnClick = cbModifiedClick + Checked = False + FriendlyName = 'cbDeleted' + end + object IWLabel2: TIWLabel + Left = 162 + Top = 10 + Width = 107 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel2' + Caption = 'RecordTypes:' + RawText = False + end + object lbResult: TIWLabel + Left = 226 + Top = 34 + Width = 63 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbResult' + Caption = 'lbResult' + RawText = False + end + object lbUpdates: TIWLabel + Left = 177 + Top = 60 + Width = 80 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = 6956042 + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbUpdates' + Caption = 'lbUpdates' + RawText = False + end + object btApply: TIWButton + Left = 8 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Apply' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btApply' + ScriptEvents = <> + TabOrder = 13 + OnClick = btApplyClick + end + object btCommit: TIWButton + Left = 88 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Commit' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btCommit' + ScriptEvents = <> + TabOrder = 14 + OnClick = btCommitClick + end + object btCancel: TIWButton + Left = 168 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Cancel' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btCancel' + ScriptEvents = <> + TabOrder = 15 + OnClick = btCancelClick + end + object btRevert: TIWButton + Left = 248 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Revert' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btRevert' + ScriptEvents = <> + TabOrder = 16 + OnClick = btRevertClick + end + object btTransStart: TIWButton + Left = 352 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Start' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btTransStart' + ScriptEvents = <> + TabOrder = 17 + OnClick = btTransStartClick + end + object btTransCommit: TIWButton + Left = 432 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Commit' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btTransCommit' + ScriptEvents = <> + TabOrder = 18 + OnClick = btTransCommitClick + end + object btTransRollback: TIWButton + Left = 512 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Rollback' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btTransRollback' + ScriptEvents = <> + TabOrder = 19 + OnClick = btTransRollbackClick + end + object IWLabel4: TIWLabel + Left = 16 + Top = 60 + Width = 66 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel4' + Caption = 'Updates' + RawText = False + end + object IWLabel6: TIWLabel + Left = 368 + Top = 60 + Width = 93 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel6' + Caption = 'Transaction' + RawText = False + end + object lbTransaction: TIWLabel + Left = 472 + Top = 60 + Width = 107 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = 6956042 + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbTransaction' + Caption = 'lbTransaction' + RawText = False + end + object IWRegion1: TIWRegion + Left = 48 + Top = 112 + Width = 562 + Height = 49 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clNone + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + object meSQL: TIWMemo + Left = 1 + Top = 1 + Width = 560 + Height = 47 + Cursor = crAuto + Align = alClient + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + BGColor = clNone + Editable = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + InvisibleBorder = False + HorizScrollBar = False + VertScrollBar = True + Required = False + TabOrder = 20 + FriendlyName = 'meSQL' + end + end + end + object rgEdits: TIWRegion + Left = 16 + Top = 485 + Width = 621 + Height = 62 + Cursor = crAuto + Visible = False + TabOrder = 2 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 621 + 62) + object rcEdits: TIWRectangle + Left = 1 + Top = 1 + Width = 619 + Height = 60 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'rcEdits' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + end + object Query: TMSQuery + Left = 432 + Top = 264 + end + object DataSource: TDataSource + DataSet = Query + Left = 456 + Top = 264 + end +end + Width = 662 + Height = 570 + OnCreate = IWAppFormCreate + DesignLeft = 8 + DesignTop = 8 + inherited IWRectangle: TIWRectangle + Width = 625 + end + inherited lbPageName: TIWLabel + Left = 522 + Width = 113 + Caption = 'CachedUpdates' + end + object IWDBNavigator1: TIWDBNavigator [7] + Left = 16 + Top = 312 + Width = 270 + Height = 30 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = DataSource + FriendlyName = 'IWDBNavigator1' + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh] + Orientation = orHorizontal + end + object IWDBGrid1: TIWDBGrid [8] + Left = 16 + Top = 344 + Width = 621 + Height = 135 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseSize = True + ScrollToCurrentRow = False + Columns = <> + DataSource = DataSource + FooterRowCount = 0 + FriendlyName = 'IWDBGrid1' + FromStart = True + HighlightColor = clNone + HighlightRows = False + Options = [dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + TabOrder = 33 + end + inherited rgConnection: TIWRegion + Width = 620 + inherited IWRectangle4: TIWRectangle + Width = 618 + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 128 + Width = 620 + Height = 177 + Cursor = crAuto + TabOrder = 1 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 620 + 177) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 618 + Height = 175 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle3' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object cbCachedUpdates: TIWCheckBox + Left = 8 + Top = 8 + Width = 137 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'CachedUpdates' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 6 + Checked = False + FriendlyName = 'cbCachedUpdates' + end + object IWLabel1: TIWLabel + Left = 8 + Top = 111 + Width = 30 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel1' + Caption = 'SQL' + RawText = False + end + object btOpen: TIWButton + Left = 8 + Top = 30 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Open' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btOpen' + ScriptEvents = <> + TabOrder = 11 + OnClick = btOpenClick + end + object btClose: TIWButton + Left = 112 + Top = 31 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Close' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btClose' + ScriptEvents = <> + TabOrder = 12 + OnClick = btCloseClick + end + object cbUnmodified: TIWCheckBox + Left = 265 + Top = 9 + Width = 98 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Unmodified' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 7 + OnClick = cbModifiedClick + Checked = False + FriendlyName = 'cbUnmodified' + end + object cbModified: TIWCheckBox + Left = 361 + Top = 9 + Width = 82 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Modified' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 8 + OnClick = cbModifiedClick + Checked = False + FriendlyName = 'cbModified' + end + object cbInserted: TIWCheckBox + Left = 441 + Top = 9 + Width = 82 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Inserted' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 9 + OnClick = cbModifiedClick + Checked = False + FriendlyName = 'cbInserted' + end + object cbDeleted: TIWCheckBox + Left = 521 + Top = 9 + Width = 74 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Deleted' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 10 + OnClick = cbModifiedClick + Checked = False + FriendlyName = 'cbDeleted' + end + object IWLabel2: TIWLabel + Left = 162 + Top = 10 + Width = 107 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel2' + Caption = 'RecordTypes:' + RawText = False + end + object lbResult: TIWLabel + Left = 226 + Top = 34 + Width = 63 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbResult' + Caption = 'lbResult' + RawText = False + end + object lbUpdates: TIWLabel + Left = 177 + Top = 60 + Width = 80 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = 6956042 + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbUpdates' + Caption = 'lbUpdates' + RawText = False + end + object btApply: TIWButton + Left = 8 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Apply' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btApply' + ScriptEvents = <> + TabOrder = 13 + OnClick = btApplyClick + end + object btCommit: TIWButton + Left = 88 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Commit' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btCommit' + ScriptEvents = <> + TabOrder = 14 + OnClick = btCommitClick + end + object btCancel: TIWButton + Left = 168 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Cancel' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btCancel' + ScriptEvents = <> + TabOrder = 15 + OnClick = btCancelClick + end + object btRevert: TIWButton + Left = 248 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Revert' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btRevert' + ScriptEvents = <> + TabOrder = 16 + OnClick = btRevertClick + end + object btTransStart: TIWButton + Left = 352 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Start' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btTransStart' + ScriptEvents = <> + TabOrder = 17 + OnClick = btTransStartClick + end + object btTransCommit: TIWButton + Left = 432 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Commit' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btTransCommit' + ScriptEvents = <> + TabOrder = 18 + OnClick = btTransCommitClick + end + object btTransRollback: TIWButton + Left = 512 + Top = 80 + Width = 75 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Rollback' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'btTransRollback' + ScriptEvents = <> + TabOrder = 19 + OnClick = btTransRollbackClick + end + object IWLabel4: TIWLabel + Left = 16 + Top = 60 + Width = 66 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel4' + Caption = 'Updates' + RawText = False + end + object IWLabel6: TIWLabel + Left = 368 + Top = 60 + Width = 93 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel6' + Caption = 'Transaction' + RawText = False + end + object lbTransaction: TIWLabel + Left = 472 + Top = 60 + Width = 107 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = 6956042 + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbTransaction' + Caption = 'lbTransaction' + RawText = False + end + object IWRegion1: TIWRegion + Left = 48 + Top = 112 + Width = 562 + Height = 49 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clNone + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + object meSQL: TIWMemo + Left = 1 + Top = 1 + Width = 560 + Height = 47 + Cursor = crAuto + Align = alClient + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + BGColor = clNone + Editable = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + InvisibleBorder = False + HorizScrollBar = False + VertScrollBar = True + Required = False + TabOrder = 20 + FriendlyName = 'meSQL' + end + end + end + object rgEdits: TIWRegion + Left = 16 + Top = 485 + Width = 621 + Height = 62 + Cursor = crAuto + Visible = False + TabOrder = 2 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 621 + 62) + object rcEdits: TIWRectangle + Left = 1 + Top = 1 + Width = 619 + Height = 60 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'rcEdits' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + end + object Query: TMSQuery + Left = 432 + Top = 264 + end + object DataSource: TDataSource + DataSet = Query + Left = 456 + Top = 264 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uCachedUpdates.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uCachedUpdates.pas new file mode 100644 index 0000000..4fb2219 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uCachedUpdates.pas @@ -0,0 +1,481 @@ +unit uCachedUpdates; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWCompLabel, IWControl, IWCompRectangle, IWHTMLControls, + IWCompButton, IWContainer, IWRegion, IWCompMemo, IWCompCheckbox, DB, + MemDS, DBAccess, MSAccess, IWGrids, IWDBGrids, IWDBStdCtrls, + IWCSStdCtrls, IWClientSideDatasetBase, IWClientSideDatasetDBLink, + IWDynGrid, IWVCLBaseContainer, IWHTMLContainer, IWVCLBaseControl, + IWBaseControl, IWBaseHTMLControl; + +type + TfmCachedUpdates = class(TfmBase) + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + cbCachedUpdates: TIWCheckBox; + IWRegion1: TIWRegion; + meSQL: TIWMemo; + IWLabel1: TIWLabel; + btOpen: TIWButton; + btClose: TIWButton; + Query: TMSQuery; + cbUnmodified: TIWCheckBox; + cbModified: TIWCheckBox; + cbInserted: TIWCheckBox; + cbDeleted: TIWCheckBox; + IWLabel2: TIWLabel; + lbResult: TIWLabel; + lbUpdates: TIWLabel; + btApply: TIWButton; + btCommit: TIWButton; + btCancel: TIWButton; + btRevert: TIWButton; + btTransStart: TIWButton; + btTransCommit: TIWButton; + btTransRollback: TIWButton; + DataSource: TDataSource; + IWLabel4: TIWLabel; + IWLabel6: TIWLabel; + IWDBNavigator1: TIWDBNavigator; + lbTransaction: TIWLabel; + IWDBGrid1: TIWDBGrid; + rgEdits: TIWRegion; + rcEdits: TIWRectangle; + procedure IWAppFormCreate(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure cbModifiedClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btApplyClick(Sender: TObject); + procedure btCommitClick(Sender: TObject); + procedure btCancelClick(Sender: TObject); + procedure btRevertClick(Sender: TObject); + procedure btTransStartClick(Sender: TObject); + procedure btTransCommitClick(Sender: TObject); + procedure btTransRollbackClick(Sender: TObject); + protected + procedure ReadFromControls; override; + procedure DeleteCreatedControls; + end; + +implementation + +{$R *.dfm} + +uses + ServerController, UData, IWForm; + +procedure TfmCachedUpdates.IWAppFormCreate(Sender: TObject); +begin + inherited; + Query.Connection := DM.Connection; +end; + +procedure TfmCachedUpdates.ReadFromControls; +begin + inherited; + UserSession.UseCachedUpdates := cbCachedUpdates.Checked; + UserSession.CachedSQL := meSQL.Lines.Text; + + UserSession.CachedRecordTypes := []; + if cbUnmodified.Checked then + Include(UserSession.CachedRecordTypes, rtUnmodified); + if cbModified.Checked then + Include(UserSession.CachedRecordTypes, rtModified); + if cbInserted.Checked then + Include(UserSession.CachedRecordTypes, rtInserted); + if cbDeleted.Checked then + Include(UserSession.CachedRecordTypes, rtDeleted); +end; + +procedure TfmCachedUpdates.IWAppFormRender(Sender: TObject); +begin + inherited; + cbCachedUpdates.Checked := UserSession.UseCachedUpdates; + cbUnmodified.Checked := rtUnmodified in UserSession.CachedRecordTypes; + cbModified.Checked := rtModified in UserSession.CachedRecordTypes; + cbInserted.Checked := rtInserted in UserSession.CachedRecordTypes; + cbDeleted.Checked := rtDeleted in UserSession.CachedRecordTypes; + meSQL.Lines.Text := UserSession.CachedSQL; + + if Query.CachedUpdates then + Query.UpdateRecordTypes := UserSession.CachedRecordTypes; + if Query.UpdatesPending then + lbUpdates.Text := 'Updates Pending' + else + lbUpdates.Text := ''; + if Query.Connection.InTransaction then + lbTransaction.Text := 'In Transaction' + else + lbTransaction.Text := ''; + + lbResult.Font.Color := ResultColors[UserSession.IsGoodCached]; + lbResult.Caption := UserSession.CachedResult; + + IWDBGrid1.Visible := Query.Active; + +end; + +procedure TfmCachedUpdates.cbModifiedClick(Sender: TObject); +begin + ReadFromControls; +end; + +procedure TfmCachedUpdates.btOpenClick(Sender: TObject); +var + i, ATop: integer; +begin + ReadFromControls; + UserSession.isGoodCached := False; + DeleteCreatedControls; + try + IWDBGrid1.Columns.Clear; + Query.SQL.Text := UserSession.CachedSQL; + Query.CachedUpdates := UserSession.UseCachedUpdates; + Query.Execute; + UserSession.isGoodCached := True; + UserSession.CachedResult := 'Query is openned'; + ATop := 8; + if Query.FieldCount > 0 then begin + for i := 0 to Query.FieldCount - 1 do begin + with TIWLabel.Create(Self) do begin + Parent := rgEdits; + Caption := Query.Fields[i].FieldName; + Left := 24; + Top := ATop; + end; + with TIWDBEdit.Create(Self) do begin + Parent := rgEdits; + DataSource := Self.DataSource; + DataField := Query.Fields[i].FieldName; + Left := 240; + Top := ATop; + Width := 240; + end; + ATop := ATop + 24; + end; + rgEdits.Height := ATop + 4; + rcEdits.Height := rgEdits.Height - 2; + rgEdits.Visible := True; + end; + except + on E:Exception do + UserSession.CachedResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmCachedUpdates.btCloseClick(Sender: TObject); +begin + ReadFromControls; + UserSession.isGoodCached := False; + DeleteCreatedControls; + try + IWDBGrid1.Columns.Clear; + Query.Close; + UserSession.isGoodCached := True; + UserSession.CachedResult := '' + except + on E:Exception do + UserSession.CachedResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmCachedUpdates.btApplyClick(Sender: TObject); +begin + ReadFromControls; + Query.ApplyUpdates; +end; + +procedure TfmCachedUpdates.btCommitClick(Sender: TObject); +begin + ReadFromControls; + Query.CommitUpdates; +end; + +procedure TfmCachedUpdates.btCancelClick(Sender: TObject); +begin + ReadFromControls; + Query.CancelUpdates; +end; + +procedure TfmCachedUpdates.btRevertClick(Sender: TObject); +begin + ReadFromControls; + Query.RevertRecord; +end; + +procedure TfmCachedUpdates.btTransStartClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.StartTransaction; +end; + +procedure TfmCachedUpdates.btTransCommitClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.Commit; +end; + +procedure TfmCachedUpdates.btTransRollbackClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.Rollback; +end; + +procedure TfmCachedUpdates.DeleteCreatedControls; +var + i: integer; +begin + i := 0; + while i < rgEdits.ControlCount do + if not (rgEdits.Controls[i] is TIWRectangle) then + rgEdits.Controls[i].Free + else + Inc(i); + rgEdits.Visible := False; +end; + +end. + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWCompLabel, IWControl, IWCompRectangle, IWHTMLControls, + IWCompButton, IWContainer, IWRegion, IWCompMemo, IWCompCheckbox, DB, + MemDS, DBAccess, MSAccess, IWGrids, IWDBGrids, IWDBStdCtrls, + IWCSStdCtrls, IWClientSideDatasetBase, IWClientSideDatasetDBLink, + IWDynGrid, IWVCLBaseContainer, IWHTMLContainer, IWVCLBaseControl, + IWBaseControl, IWBaseHTMLControl; + +type + TfmCachedUpdates = class(TfmBase) + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + cbCachedUpdates: TIWCheckBox; + IWRegion1: TIWRegion; + meSQL: TIWMemo; + IWLabel1: TIWLabel; + btOpen: TIWButton; + btClose: TIWButton; + Query: TMSQuery; + cbUnmodified: TIWCheckBox; + cbModified: TIWCheckBox; + cbInserted: TIWCheckBox; + cbDeleted: TIWCheckBox; + IWLabel2: TIWLabel; + lbResult: TIWLabel; + lbUpdates: TIWLabel; + btApply: TIWButton; + btCommit: TIWButton; + btCancel: TIWButton; + btRevert: TIWButton; + btTransStart: TIWButton; + btTransCommit: TIWButton; + btTransRollback: TIWButton; + DataSource: TDataSource; + IWLabel4: TIWLabel; + IWLabel6: TIWLabel; + IWDBNavigator1: TIWDBNavigator; + lbTransaction: TIWLabel; + IWDBGrid1: TIWDBGrid; + rgEdits: TIWRegion; + rcEdits: TIWRectangle; + procedure IWAppFormCreate(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure cbModifiedClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btApplyClick(Sender: TObject); + procedure btCommitClick(Sender: TObject); + procedure btCancelClick(Sender: TObject); + procedure btRevertClick(Sender: TObject); + procedure btTransStartClick(Sender: TObject); + procedure btTransCommitClick(Sender: TObject); + procedure btTransRollbackClick(Sender: TObject); + protected + procedure ReadFromControls; override; + procedure DeleteCreatedControls; + end; + +implementation + +{$R *.dfm} + +uses + ServerController, UData, IWForm; + +procedure TfmCachedUpdates.IWAppFormCreate(Sender: TObject); +begin + inherited; + Query.Connection := DM.Connection; +end; + +procedure TfmCachedUpdates.ReadFromControls; +begin + inherited; + UserSession.UseCachedUpdates := cbCachedUpdates.Checked; + UserSession.CachedSQL := meSQL.Lines.Text; + + UserSession.CachedRecordTypes := []; + if cbUnmodified.Checked then + Include(UserSession.CachedRecordTypes, rtUnmodified); + if cbModified.Checked then + Include(UserSession.CachedRecordTypes, rtModified); + if cbInserted.Checked then + Include(UserSession.CachedRecordTypes, rtInserted); + if cbDeleted.Checked then + Include(UserSession.CachedRecordTypes, rtDeleted); +end; + +procedure TfmCachedUpdates.IWAppFormRender(Sender: TObject); +begin + inherited; + cbCachedUpdates.Checked := UserSession.UseCachedUpdates; + cbUnmodified.Checked := rtUnmodified in UserSession.CachedRecordTypes; + cbModified.Checked := rtModified in UserSession.CachedRecordTypes; + cbInserted.Checked := rtInserted in UserSession.CachedRecordTypes; + cbDeleted.Checked := rtDeleted in UserSession.CachedRecordTypes; + meSQL.Lines.Text := UserSession.CachedSQL; + + if Query.CachedUpdates then + Query.UpdateRecordTypes := UserSession.CachedRecordTypes; + if Query.UpdatesPending then + lbUpdates.Text := 'Updates Pending' + else + lbUpdates.Text := ''; + if Query.Connection.InTransaction then + lbTransaction.Text := 'In Transaction' + else + lbTransaction.Text := ''; + + lbResult.Font.Color := ResultColors[UserSession.IsGoodCached]; + lbResult.Caption := UserSession.CachedResult; + + IWDBGrid1.Visible := Query.Active; + +end; + +procedure TfmCachedUpdates.cbModifiedClick(Sender: TObject); +begin + ReadFromControls; +end; + +procedure TfmCachedUpdates.btOpenClick(Sender: TObject); +var + i, ATop: integer; +begin + ReadFromControls; + UserSession.isGoodCached := False; + DeleteCreatedControls; + try + IWDBGrid1.Columns.Clear; + Query.SQL.Text := UserSession.CachedSQL; + Query.CachedUpdates := UserSession.UseCachedUpdates; + Query.Execute; + UserSession.isGoodCached := True; + UserSession.CachedResult := 'Query is openned'; + ATop := 8; + if Query.FieldCount > 0 then begin + for i := 0 to Query.FieldCount - 1 do begin + with TIWLabel.Create(Self) do begin + Parent := rgEdits; + Caption := Query.Fields[i].FieldName; + Left := 24; + Top := ATop; + end; + with TIWDBEdit.Create(Self) do begin + Parent := rgEdits; + DataSource := Self.DataSource; + DataField := Query.Fields[i].FieldName; + Left := 240; + Top := ATop; + Width := 240; + end; + ATop := ATop + 24; + end; + rgEdits.Height := ATop + 4; + rcEdits.Height := rgEdits.Height - 2; + rgEdits.Visible := True; + end; + except + on E:Exception do + UserSession.CachedResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmCachedUpdates.btCloseClick(Sender: TObject); +begin + ReadFromControls; + UserSession.isGoodCached := False; + DeleteCreatedControls; + try + IWDBGrid1.Columns.Clear; + Query.Close; + UserSession.isGoodCached := True; + UserSession.CachedResult := '' + except + on E:Exception do + UserSession.CachedResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmCachedUpdates.btApplyClick(Sender: TObject); +begin + ReadFromControls; + Query.ApplyUpdates; +end; + +procedure TfmCachedUpdates.btCommitClick(Sender: TObject); +begin + ReadFromControls; + Query.CommitUpdates; +end; + +procedure TfmCachedUpdates.btCancelClick(Sender: TObject); +begin + ReadFromControls; + Query.CancelUpdates; +end; + +procedure TfmCachedUpdates.btRevertClick(Sender: TObject); +begin + ReadFromControls; + Query.RevertRecord; +end; + +procedure TfmCachedUpdates.btTransStartClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.StartTransaction; +end; + +procedure TfmCachedUpdates.btTransCommitClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.Commit; +end; + +procedure TfmCachedUpdates.btTransRollbackClick(Sender: TObject); +begin + ReadFromControls; + Query.Connection.Rollback; +end; + +procedure TfmCachedUpdates.DeleteCreatedControls; +var + i: integer; +begin + i := 0; + while i < rgEdits.ControlCount do + if not (rgEdits.Controls[i] is TIWRectangle) then + rgEdits.Controls[i].Free + else + Inc(i); + rgEdits.Visible := False; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uData.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uData.dfm new file mode 100644 index 0000000..30ecdfb --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uData.dfm @@ -0,0 +1,29 @@ +object DM: TDM + OldCreateOrder = False + Height = 250 + Width = 225 + object Connection: TMSConnection + Database = 'master' + Authentication = auServer + AfterConnect = ConnectionAfterConnect + BeforeConnect = ConnectionBeforeConnect + AfterDisconnect = ConnectionAfterDisconnect + OnConnectionLost = ConnectionConnectionLost + Left = 40 + Top = 24 + end +end + OldCreateOrder = False + Height = 250 + Width = 225 + object Connection: TMSConnection + Database = 'master' + Authentication = auServer + AfterConnect = ConnectionAfterConnect + BeforeConnect = ConnectionBeforeConnect + AfterDisconnect = ConnectionAfterDisconnect + OnConnectionLost = ConnectionConnectionLost + Left = 40 + Top = 24 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uData.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uData.pas new file mode 100644 index 0000000..ecfe754 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uData.pas @@ -0,0 +1,149 @@ +unit uData; + +interface + +uses + SysUtils, Classes, DB, DBAccess, MSAccess, MemData; + +type + TDM = class(TDataModule) + Connection: TMSConnection; + procedure ConnectionConnectionLost(Sender: TObject; Component: TComponent; + ConnLostCause: TConnLostCause; var RetryMode: TRetryMode); + procedure ConnectionBeforeConnect(Sender: TObject); + procedure ConnectionAfterConnect(Sender: TObject); + procedure ConnectionAfterDisconnect(Sender: TObject); + end; + +implementation + +{$R *.dfm} + +uses IWInit, ServerController; + +{ TDM } + +procedure TDM.ConnectionBeforeConnect(Sender: TObject); +begin + Connection.Username := UserSession.Username; + Connection.Password := UserSession.Password; + Connection.Server := UserSession.Server; + Connection.Database := UserSession.Database; + Connection.Options.DisconnectedMode := UserSession.DisconnectedMode; + Connection.Pooling := UserSession.Pooling; + Connection.PoolingOptions := UserSession.PoolingOptions; + if UserSession.FailOver then + Connection.OnConnectionLost := ConnectionConnectionLost + else + Connection.OnConnectionLost := nil; +end; + +procedure TDM.ConnectionAfterConnect(Sender: TObject); +begin + UserSession.IsGoodConnection := True; + UserSession.ConnectionResult := 'Connected'; +end; + +procedure TDM.ConnectionAfterDisconnect(Sender: TObject); +begin + if not (csDestroying in Connection.ComponentState) then + UserSession.ConnectionResult := ''; +end; + +procedure TDM.ConnectionConnectionLost(Sender: TObject; Component: TComponent; + ConnLostCause: TConnLostCause; var RetryMode: TRetryMode); +var + Msg: string; +begin + UserSession.IsGoodConnection := False; + case ConnLostCause of + clUnknown: + Msg := 'Unknown'; + clConnect: + Msg := 'Connect'; + clExecute: + Msg := 'Execute'; + clOpen: + Msg := 'Open'; + clApply: + Msg := 'Apply'; + end; + UserSession.ConnectionResult := 'Connection lost: ' + + Component.Name + ' - ' + Msg; +end; + +end. + +interface + +uses + SysUtils, Classes, DB, DBAccess, MSAccess; + +type + TDM = class(TDataModule) + Connection: TMSConnection; + procedure ConnectionConnectionLost(Sender: TObject; Component: TComponent; + ConnLostCause: TConnLostCause; var RetryMode: TRetryMode); + procedure ConnectionBeforeConnect(Sender: TObject); + procedure ConnectionAfterConnect(Sender: TObject); + procedure ConnectionAfterDisconnect(Sender: TObject); + end; + +implementation + +{$R *.dfm} + +uses IWInit, ServerController; + +{ TDM } + +procedure TDM.ConnectionBeforeConnect(Sender: TObject); +begin + Connection.Username := UserSession.Username; + Connection.Password := UserSession.Password; + Connection.Server := UserSession.Server; + Connection.Database := UserSession.Database; + Connection.Options.DisconnectedMode := UserSession.DisconnectedMode; + Connection.Pooling := UserSession.Pooling; + Connection.PoolingOptions := UserSession.PoolingOptions; + if UserSession.FailOver then + Connection.OnConnectionLost := ConnectionConnectionLost + else + Connection.OnConnectionLost := nil; +end; + +procedure TDM.ConnectionAfterConnect(Sender: TObject); +begin + UserSession.IsGoodConnection := True; + UserSession.ConnectionResult := 'Connected'; +end; + +procedure TDM.ConnectionAfterDisconnect(Sender: TObject); +begin + if not (csDestroying in Connection.ComponentState) then + UserSession.ConnectionResult := ''; +end; + +procedure TDM.ConnectionConnectionLost(Sender: TObject; Component: TComponent; + ConnLostCause: TConnLostCause; var RetryMode: TRetryMode); +var + Msg: string; +begin + UserSession.IsGoodConnection := False; + case ConnLostCause of + clUnknown: + Msg := 'Unknown'; + clConnect: + Msg := 'Connect'; + clExecute: + Msg := 'Execute'; + clOpen: + Msg := 'Open'; + clApply: + Msg := 'Apply'; + end; + UserSession.ConnectionResult := 'Connection lost: ' + + Component.Name + ' - ' + Msg; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMain.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMain.dfm new file mode 100644 index 0000000..7245312 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMain.dfm @@ -0,0 +1,1089 @@ +inherited fmMain: TfmMain + Width = 630 + Height = 491 + OnCreate = IWAppFormCreate + DesignLeft = 8 + DesignTop = 8 + inherited IWRectangle: TIWRectangle + Width = 609 + end + inherited lbPageName: TIWLabel + Left = 581 + Width = 33 + Caption = 'Main' + end + inherited rgConnection: TIWRegion + Width = 604 + inherited IWRectangle4: TIWRectangle + Width = 602 + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 127 + Width = 306 + Height = 173 + Cursor = crAuto + TabOrder = 1 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 306 + 173) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 304 + Height = 171 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle3' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object edUsername: TIWEdit + Left = 112 + Top = 23 + Width = 163 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edUsername' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 6 + PasswordPrompt = False + end + object IWLabel1: TIWLabel + Left = 20 + Top = 25 + Width = 81 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel1' + Caption = 'Username' + RawText = False + end + object IWLabel2: TIWLabel + Left = 20 + Top = 60 + Width = 77 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel2' + Caption = 'Password' + RawText = False + end + object edPassword: TIWEdit + Left = 112 + Top = 58 + Width = 163 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edPassword' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 7 + PasswordPrompt = True + end + object IWLabel3: TIWLabel + Left = 20 + Top = 95 + Width = 52 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel3' + Caption = 'Server' + RawText = False + end + object edServer: TIWEdit + Tag = 8 + Left = 112 + Top = 93 + Width = 163 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edServer' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 8 + PasswordPrompt = False + end + object IWLabel5: TIWLabel + Left = 21 + Top = 130 + Width = 75 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel5' + Caption = 'Database' + RawText = False + end + object edDatabase: TIWEdit + Tag = 9 + Left = 112 + Top = 128 + Width = 163 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edDatabase' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 9 + PasswordPrompt = False + end + end + object IWRegion1: TIWRegion + Left = 329 + Top = 127 + Width = 291 + Height = 174 + Cursor = crAuto + TabOrder = 2 + Anchors = [akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 291 + 174) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 289 + Height = 172 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle1' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object cbDisconnectedMode: TIWCheckBox + Tag = 10 + Left = 8 + Top = 8 + Width = 164 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'DisconnectedMode' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 10 + Checked = False + FriendlyName = 'cbDisconnectedMode' + end + object cbFailover: TIWCheckBox + Tag = 11 + Left = 8 + Top = 35 + Width = 121 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Failover' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 11 + Checked = False + FriendlyName = 'cbFailover' + end + object cbPooling: TIWCheckBox + Tag = 12 + Left = 8 + Top = 62 + Width = 121 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Pooling' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 12 + Checked = False + FriendlyName = 'cbPooling' + end + object edConnectionLifeTime: TIWEdit + Tag = 13 + Left = 157 + Top = 88 + Width = 101 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edConnectionLifeTime' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 13 + PasswordPrompt = False + Text = 'edConnectionLifeTime' + end + object IWLabel4: TIWLabel + Left = 26 + Top = 90 + Width = 140 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + NoWrap = False + FriendlyName = 'IWLabel4' + Caption = 'ConnectionLifeTime' + RawText = False + end + object edMaxPoolSize: TIWEdit + Tag = 14 + Left = 157 + Top = 115 + Width = 101 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMaxPoolSize' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 14 + PasswordPrompt = False + Text = 'edMaxPoolSize' + end + object edMinPoolSize: TIWEdit + Tag = 15 + Left = 157 + Top = 142 + Width = 101 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMinPoolSize' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 15 + PasswordPrompt = False + Text = 'edMinPoolSize' + end + object IWLabel6: TIWLabel + Left = 26 + Top = 117 + Width = 88 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + NoWrap = False + FriendlyName = 'IWLabel6' + Caption = 'MaxPoolSize' + RawText = False + end + object IWLabel7: TIWLabel + Left = 26 + Top = 144 + Width = 83 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + NoWrap = False + FriendlyName = 'IWLabel7' + Caption = 'MinPoolSize' + RawText = False + end + end +end + Width = 630 + Height = 491 + OnCreate = IWAppFormCreate + DesignLeft = 8 + DesignTop = 8 + inherited IWRectangle: TIWRectangle + Width = 609 + end + inherited lbPageName: TIWLabel + Left = 581 + Width = 33 + Caption = 'Main' + end + inherited rgConnection: TIWRegion + Width = 604 + inherited IWRectangle4: TIWRectangle + Width = 602 + end + end + object IWRegion4: TIWRegion + Left = 16 + Top = 127 + Width = 306 + Height = 173 + Cursor = crAuto + TabOrder = 1 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 306 + 173) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 304 + Height = 171 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle3' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object edUsername: TIWEdit + Left = 112 + Top = 23 + Width = 163 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edUsername' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 6 + PasswordPrompt = False + end + object IWLabel1: TIWLabel + Left = 20 + Top = 25 + Width = 81 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel1' + Caption = 'Username' + RawText = False + end + object IWLabel2: TIWLabel + Left = 20 + Top = 60 + Width = 77 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel2' + Caption = 'Password' + RawText = False + end + object edPassword: TIWEdit + Left = 112 + Top = 58 + Width = 163 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edPassword' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 7 + PasswordPrompt = True + end + object IWLabel3: TIWLabel + Left = 20 + Top = 95 + Width = 52 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel3' + Caption = 'Server' + RawText = False + end + object edServer: TIWEdit + Tag = 8 + Left = 112 + Top = 93 + Width = 163 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edServer' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 8 + PasswordPrompt = False + end + object IWLabel5: TIWLabel + Left = 21 + Top = 130 + Width = 75 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel5' + Caption = 'Database' + RawText = False + end + object edDatabase: TIWEdit + Tag = 9 + Left = 112 + Top = 128 + Width = 163 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edDatabase' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 9 + PasswordPrompt = False + end + end + object IWRegion1: TIWRegion + Left = 329 + Top = 127 + Width = 291 + Height = 174 + Cursor = crAuto + TabOrder = 2 + Anchors = [akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 291 + 174) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 289 + Height = 172 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle1' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object cbDisconnectedMode: TIWCheckBox + Tag = 10 + Left = 8 + Top = 8 + Width = 164 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'DisconnectedMode' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 10 + Checked = False + FriendlyName = 'cbDisconnectedMode' + end + object cbFailover: TIWCheckBox + Tag = 11 + Left = 8 + Top = 35 + Width = 121 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Failover' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 11 + Checked = False + FriendlyName = 'cbFailover' + end + object cbPooling: TIWCheckBox + Tag = 12 + Left = 8 + Top = 62 + Width = 121 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'Pooling' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 12 + Checked = False + FriendlyName = 'cbPooling' + end + object edConnectionLifeTime: TIWEdit + Tag = 13 + Left = 157 + Top = 88 + Width = 101 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edConnectionLifeTime' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 13 + PasswordPrompt = False + Text = 'edConnectionLifeTime' + end + object IWLabel4: TIWLabel + Left = 26 + Top = 90 + Width = 140 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + NoWrap = False + FriendlyName = 'IWLabel4' + Caption = 'ConnectionLifeTime' + RawText = False + end + object edMaxPoolSize: TIWEdit + Tag = 14 + Left = 157 + Top = 115 + Width = 101 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMaxPoolSize' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 14 + PasswordPrompt = False + Text = 'edMaxPoolSize' + end + object edMinPoolSize: TIWEdit + Tag = 15 + Left = 157 + Top = 142 + Width = 101 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMinPoolSize' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 15 + PasswordPrompt = False + Text = 'edMinPoolSize' + end + object IWLabel6: TIWLabel + Left = 26 + Top = 117 + Width = 88 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + NoWrap = False + FriendlyName = 'IWLabel6' + Caption = 'MaxPoolSize' + RawText = False + end + object IWLabel7: TIWLabel + Left = 26 + Top = 144 + Width = 83 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + NoWrap = False + FriendlyName = 'IWLabel7' + Caption = 'MinPoolSize' + RawText = False + end + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMain.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMain.pas new file mode 100644 index 0000000..67513b1 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMain.pas @@ -0,0 +1,183 @@ +unit uMain; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + uData, uBase, uQuery, uCachedUpdates, uMasterDetail, + IWCompLabel, IWControl, IWCompRectangle, + DB, MemDS, DBAccess, MSAccess, MsConnectionPool, IWHTMLControls, IWCompButton, + IWGrids, IWDBGrids, IWDBStdCtrls, IWCompMemo, IWCompEdit, IWContainer, + IWRegion, IWCompCheckbox, IWCompListbox, IWVCLBaseContainer, IWHTMLContainer, + IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl; + +type + TfmMain = class(TfmBase) + edUsername: TIWEdit; + edPassword: TIWEdit; + edServer: TIWEdit; + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + IWLabel3: TIWLabel; + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + cbFailover: TIWCheckBox; + cbDisconnectedMode: TIWCheckBox; + cbPooling: TIWCheckBox; + IWRegion1: TIWRegion; + IWRectangle1: TIWRectangle; + edConnectionLifeTime: TIWEdit; + IWLabel4: TIWLabel; + edMaxPoolSize: TIWEdit; + edMinPoolSize: TIWEdit; + IWLabel6: TIWLabel; + IWLabel7: TIWLabel; + IWLabel5: TIWLabel; + edDatabase: TIWEdit; + procedure IWAppFormCreate(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +implementation +{$R *.dfm} + +uses + ServerController, IWForm; + +{ TfmMain } + +procedure TfmMain.IWAppFormCreate(Sender: TObject); +begin + inherited; + UserSession.fmMain := Self; +end; + +procedure TfmMain.IWAppFormRender(Sender: TObject); +begin + inherited; + edUsername.Text := UserSession.Username; + edPassword.Text := UserSession.Password; + edServer.Text := UserSession.Server; + edDatabase.Text := UserSession.Database; + cbPooling.Checked := UserSession.Pooling; + cbDisconnectedMode.Checked := UserSession.DisconnectedMode; + cbFailover.Checked := UserSession.FailOver; + + edConnectionLifeTime.Text := IntToStr(UserSession.PoolingOptions.ConnectionLifetime); + edMaxPoolSize.Text := IntToStr(UserSession.PoolingOptions.MaxPoolSize); + edMinpoolSize.Text := IntToStr(UserSession.PoolingOptions.MinPoolSize); +end; + +procedure TfmMain.ReadFromControls; +begin + inherited; + UserSession.Username := edUsername.Text; + UserSession.Password := edPassword.Text; + UserSession.Server := edServer.Text; + UserSession.Database := edDatabase.Text; + UserSession.Pooling := cbPooling.Checked; + UserSession.DisconnectedMode := cbDisconnectedMode.Checked; + UserSession.FailOver := cbFailover.Checked; + + try UserSession.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifeTime.Text); except {Silent} end; + try UserSession.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifeTime.Text); except {Silent} end; + try UserSession.PoolingOptions.MaxPoolSize := StrToInt(edMaxPoolSize.Text); except {Silent} end; + try UserSession.PoolingOptions.MinPoolSize := StrToInt(edMinPoolSize.Text); except {Silent} end; +end; + +initialization + TfmMain.SetAsMainForm; +end. + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + uData, uBase, uQuery, uCachedUpdates, uMasterDetail, + IWCompLabel, IWControl, IWCompRectangle, + DB, MemDS, DBAccess, MSAccess, MsConnectionPool, IWHTMLControls, IWCompButton, + IWGrids, IWDBGrids, IWDBStdCtrls, IWCompMemo, IWCompEdit, IWContainer, + IWRegion, IWCompCheckbox, IWCompListbox, IWVCLBaseContainer, IWHTMLContainer, + IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl; + +type + TfmMain = class(TfmBase) + edUsername: TIWEdit; + edPassword: TIWEdit; + edServer: TIWEdit; + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + IWLabel3: TIWLabel; + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + cbFailover: TIWCheckBox; + cbDisconnectedMode: TIWCheckBox; + cbPooling: TIWCheckBox; + IWRegion1: TIWRegion; + IWRectangle1: TIWRectangle; + edConnectionLifeTime: TIWEdit; + IWLabel4: TIWLabel; + edMaxPoolSize: TIWEdit; + edMinPoolSize: TIWEdit; + IWLabel6: TIWLabel; + IWLabel7: TIWLabel; + IWLabel5: TIWLabel; + edDatabase: TIWEdit; + procedure IWAppFormCreate(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +implementation +{$R *.dfm} + +uses + ServerController, IWForm; + +{ TfmMain } + +procedure TfmMain.IWAppFormCreate(Sender: TObject); +begin + inherited; + UserSession.fmMain := Self; +end; + +procedure TfmMain.IWAppFormRender(Sender: TObject); +begin + inherited; + edUsername.Text := UserSession.Username; + edPassword.Text := UserSession.Password; + edServer.Text := UserSession.Server; + edDatabase.Text := UserSession.Database; + cbPooling.Checked := UserSession.Pooling; + cbDisconnectedMode.Checked := UserSession.DisconnectedMode; + cbFailover.Checked := UserSession.FailOver; + + edConnectionLifeTime.Text := IntToStr(UserSession.PoolingOptions.ConnectionLifetime); + edMaxPoolSize.Text := IntToStr(UserSession.PoolingOptions.MaxPoolSize); + edMinpoolSize.Text := IntToStr(UserSession.PoolingOptions.MinPoolSize); +end; + +procedure TfmMain.ReadFromControls; +begin + inherited; + UserSession.Username := edUsername.Text; + UserSession.Password := edPassword.Text; + UserSession.Server := edServer.Text; + UserSession.Database := edDatabase.Text; + UserSession.Pooling := cbPooling.Checked; + UserSession.DisconnectedMode := cbDisconnectedMode.Checked; + UserSession.FailOver := cbFailover.Checked; + + try UserSession.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifeTime.Text); except {Silent} end; + try UserSession.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifeTime.Text); except {Silent} end; + try UserSession.PoolingOptions.MaxPoolSize := StrToInt(edMaxPoolSize.Text); except {Silent} end; + try UserSession.PoolingOptions.MinPoolSize := StrToInt(edMinPoolSize.Text); except {Silent} end; +end; + +initialization + TfmMain.SetAsMainForm; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMasterDetail.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMasterDetail.dfm new file mode 100644 index 0000000..dc5ffc8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMasterDetail.dfm @@ -0,0 +1,1263 @@ +inherited fmMasterDetail: TfmMasterDetail + Width = 605 + Height = 567 + OnCreate = IWAppFormCreate + DesignLeft = 8 + DesignTop = 8 + inherited IWRectangle: TIWRectangle + Width = 582 + end + inherited lbPageName: TIWLabel + Left = 495 + Width = 97 + Caption = 'Master/Detail' + end + object IWRegion1: TIWRegion [7] + Left = 16 + Top = 127 + Width = 577 + Height = 65 + Cursor = crAuto + TabOrder = 3 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 577 + 65) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 63 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle1' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btOpen: TIWButton + Left = 8 + Top = 33 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Open' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btOpen' + ScriptEvents = <> + TabOrder = 8 + OnClick = btOpenClick + end + object cbLocalMasterDetail: TIWCheckBox + Left = 7 + Top = 10 + Width = 153 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'LocalMasterDetail' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 6 + Checked = False + FriendlyName = 'cbLocalMasterDetail' + end + object btClose: TIWButton + Left = 113 + Top = 33 + Width = 95 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Close' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btClose' + ScriptEvents = <> + TabOrder = 9 + OnClick = btCloseClick + end + object cbCachedCalcFields: TIWCheckBox + Left = 167 + Top = 10 + Width = 151 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'CachedCalcFields' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 7 + Checked = False + FriendlyName = 'cbCachedCalcFields' + end + object lbResult: TIWLabel + Left = 348 + Top = 10 + Width = 63 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbResult' + Caption = 'lbResult' + RawText = False + end + end + object IWRegion2: TIWRegion [8] + Left = 16 + Top = 199 + Width = 577 + Height = 178 + Cursor = crAuto + TabOrder = 1 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 577 + 178) + object IWRectangle2: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 176 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle2' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWDBNavigator1: TIWDBNavigator + Left = 8 + Top = 104 + Width = 135 + Height = 30 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = dsMaster + FriendlyName = 'IWDBNavigator1' + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbRefresh] + Orientation = orHorizontal + OnFirst = IWDBNavigator1Refresh + OnPrior = IWDBNavigator1Refresh + OnNext = IWDBNavigator1Refresh + OnLast = IWDBNavigator1Refresh + OnRefresh = IWDBNavigator1Refresh + end + object IWLabel1: TIWLabel + Left = 8 + Top = 6 + Width = 67 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel1' + Caption = 'Master' + RawText = False + end + object IWLabel2: TIWLabel + Left = 8 + Top = 33 + Width = 102 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel2' + Caption = 'MasterFields' + RawText = False + end + object edMasterFields: TIWEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMasterFields' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 10 + PasswordPrompt = False + Text = 'edMasterFields' + end + object IWDBGrid1: TIWDBGrid + Left = 144 + Top = 80 + Width = 422 + Height = 89 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseSize = True + ScrollToCurrentRow = False + Columns = <> + DataSource = dsMaster + FooterRowCount = 0 + FriendlyName = 'IWDBGrid1' + FromStart = True + HighlightColor = clNone + HighlightRows = True + Options = [dgIndicator, dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + TabOrder = 28 + end + object IWRegion4: TIWRegion + Left = 144 + Top = 8 + Width = 422 + Height = 65 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clNone + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + object meMaster: TIWMemo + Left = 1 + Top = 1 + Width = 420 + Height = 63 + Cursor = crAuto + Align = alClient + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + BGColor = clNone + Editable = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + InvisibleBorder = False + HorizScrollBar = False + VertScrollBar = True + Required = False + TabOrder = 11 + FriendlyName = 'meMaster' + end + end + end + object IWRegion3: TIWRegion [9] + Left = 16 + Top = 382 + Width = 577 + Height = 174 + Cursor = crAuto + TabOrder = 2 + Anchors = [akLeft, akTop, akRight, akBottom] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 577 + 174) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 172 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle3' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWLabel4: TIWLabel + Left = 8 + Top = 7 + Width = 55 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel4' + Caption = 'Detail' + RawText = False + end + object IWLabel3: TIWLabel + Left = 8 + Top = 33 + Width = 93 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel3' + Caption = 'DetailFields' + RawText = False + end + object edDetailFields: TIWEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edDetailFields' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 12 + PasswordPrompt = False + Text = 'edDetailFields' + end + object IWDBGrid2: TIWDBGrid + Left = 144 + Top = 81 + Width = 422 + Height = 85 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseSize = True + ScrollToCurrentRow = False + Columns = <> + DataSource = dsDetail + FooterRowCount = 0 + FriendlyName = 'IWDBGrid2' + FromStart = True + HighlightColor = clNone + HighlightRows = True + Options = [dgIndicator, dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + TabOrder = 29 + end + object IWRegion5: TIWRegion + Left = 144 + Top = 8 + Width = 422 + Height = 65 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clNone + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + object meDetail: TIWMemo + Left = 1 + Top = 1 + Width = 420 + Height = 63 + Cursor = crAuto + Align = alClient + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + BGColor = clNone + Editable = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + InvisibleBorder = False + HorizScrollBar = False + VertScrollBar = True + Required = False + TabOrder = 13 + FriendlyName = 'meDetail' + end + end + end + inherited rgConnection: TIWRegion + Width = 577 + inherited IWRectangle4: TIWRectangle + Width = 575 + end + end + object quMaster: TMSQuery + Left = 192 + Top = 239 + end + object quDetail: TMSQuery + MasterSource = dsMaster + Left = 128 + Top = 407 + end + object dsMaster: TDataSource + DataSet = quMaster + Left = 224 + Top = 239 + end + object dsDetail: TDataSource + DataSet = quDetail + Left = 160 + Top = 407 + end +end + Width = 605 + Height = 567 + OnCreate = IWAppFormCreate + DesignLeft = 8 + DesignTop = 8 + inherited IWRectangle: TIWRectangle + Width = 582 + end + inherited lbPageName: TIWLabel + Left = 495 + Width = 97 + Caption = 'Master/Detail' + end + object IWRegion1: TIWRegion [7] + Left = 16 + Top = 127 + Width = 577 + Height = 65 + Cursor = crAuto + TabOrder = 3 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 577 + 65) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 63 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle1' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btOpen: TIWButton + Left = 8 + Top = 33 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Open' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btOpen' + ScriptEvents = <> + TabOrder = 8 + OnClick = btOpenClick + end + object cbLocalMasterDetail: TIWCheckBox + Left = 7 + Top = 10 + Width = 153 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'LocalMasterDetail' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 6 + Checked = False + FriendlyName = 'cbLocalMasterDetail' + end + object btClose: TIWButton + Left = 113 + Top = 33 + Width = 95 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Close' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btClose' + ScriptEvents = <> + TabOrder = 9 + OnClick = btCloseClick + end + object cbCachedCalcFields: TIWCheckBox + Left = 167 + Top = 10 + Width = 151 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Caption = 'CachedCalcFields' + Editable = True + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + ScriptEvents = <> + DoSubmitValidation = True + Style = stNormal + TabOrder = 7 + Checked = False + FriendlyName = 'cbCachedCalcFields' + end + object lbResult: TIWLabel + Left = 348 + Top = 10 + Width = 63 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbResult' + Caption = 'lbResult' + RawText = False + end + end + object IWRegion2: TIWRegion [8] + Left = 16 + Top = 199 + Width = 577 + Height = 178 + Cursor = crAuto + TabOrder = 1 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 577 + 178) + object IWRectangle2: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 176 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle2' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWDBNavigator1: TIWDBNavigator + Left = 8 + Top = 104 + Width = 135 + Height = 30 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = dsMaster + FriendlyName = 'IWDBNavigator1' + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbRefresh] + Orientation = orHorizontal + OnFirst = IWDBNavigator1Refresh + OnPrior = IWDBNavigator1Refresh + OnNext = IWDBNavigator1Refresh + OnLast = IWDBNavigator1Refresh + OnRefresh = IWDBNavigator1Refresh + end + object IWLabel1: TIWLabel + Left = 8 + Top = 6 + Width = 67 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel1' + Caption = 'Master' + RawText = False + end + object IWLabel2: TIWLabel + Left = 8 + Top = 33 + Width = 102 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel2' + Caption = 'MasterFields' + RawText = False + end + object edMasterFields: TIWEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edMasterFields' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 10 + PasswordPrompt = False + Text = 'edMasterFields' + end + object IWDBGrid1: TIWDBGrid + Left = 144 + Top = 80 + Width = 422 + Height = 89 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseSize = True + ScrollToCurrentRow = False + Columns = <> + DataSource = dsMaster + FooterRowCount = 0 + FriendlyName = 'IWDBGrid1' + FromStart = True + HighlightColor = clNone + HighlightRows = True + Options = [dgIndicator, dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + TabOrder = 28 + end + object IWRegion4: TIWRegion + Left = 144 + Top = 8 + Width = 422 + Height = 65 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clNone + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + object meMaster: TIWMemo + Left = 1 + Top = 1 + Width = 420 + Height = 63 + Cursor = crAuto + Align = alClient + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + BGColor = clNone + Editable = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + InvisibleBorder = False + HorizScrollBar = False + VertScrollBar = True + Required = False + TabOrder = 11 + FriendlyName = 'meMaster' + end + end + end + object IWRegion3: TIWRegion [9] + Left = 16 + Top = 382 + Width = 577 + Height = 174 + Cursor = crAuto + TabOrder = 2 + Anchors = [akLeft, akTop, akRight, akBottom] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 577 + 174) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 575 + Height = 172 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle3' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWLabel4: TIWLabel + Left = 8 + Top = 7 + Width = 55 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel4' + Caption = 'Detail' + RawText = False + end + object IWLabel3: TIWLabel + Left = 8 + Top = 33 + Width = 93 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel3' + Caption = 'DetailFields' + RawText = False + end + object edDetailFields: TIWEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Alignment = taLeftJustify + BGColor = clNone + FocusColor = clNone + DoSubmitValidation = True + Editable = True + NonEditableAsLabel = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + FriendlyName = 'edDetailFields' + MaxLength = 0 + ReadOnly = False + Required = False + ScriptEvents = <> + TabOrder = 12 + PasswordPrompt = False + Text = 'edDetailFields' + end + object IWDBGrid2: TIWDBGrid + Left = 144 + Top = 81 + Width = 422 + Height = 85 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseSize = True + ScrollToCurrentRow = False + Columns = <> + DataSource = dsDetail + FooterRowCount = 0 + FriendlyName = 'IWDBGrid2' + FromStart = True + HighlightColor = clNone + HighlightRows = True + Options = [dgIndicator, dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + TabOrder = 29 + end + object IWRegion5: TIWRegion + Left = 144 + Top = 8 + Width = 422 + Height = 65 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clNone + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + object meDetail: TIWMemo + Left = 1 + Top = 1 + Width = 420 + Height = 63 + Cursor = crAuto + Align = alClient + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + BGColor = clNone + Editable = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + InvisibleBorder = False + HorizScrollBar = False + VertScrollBar = True + Required = False + TabOrder = 13 + FriendlyName = 'meDetail' + end + end + end + inherited rgConnection: TIWRegion + Width = 577 + inherited IWRectangle4: TIWRectangle + Width = 575 + end + end + object quMaster: TMSQuery + Left = 192 + Top = 239 + end + object quDetail: TMSQuery + MasterSource = dsMaster + Left = 128 + Top = 407 + end + object dsMaster: TDataSource + DataSet = quMaster + Left = 224 + Top = 239 + end + object dsDetail: TDataSource + DataSet = quDetail + Left = 160 + Top = 407 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMasterDetail.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMasterDetail.pas new file mode 100644 index 0000000..f8eaecf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uMasterDetail.pas @@ -0,0 +1,255 @@ +unit uMasterDetail; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWHTMLControls, IWCompLabel, IWControl, IWCompRectangle, + IWCompCheckbox, IWCompEdit, IWCompMemo, IWGrids, IWDBGrids, DB, MemDS, + DBAccess, MSAccess, IWDBStdCtrls, IWCompButton, IWContainer, IWRegion, + IWVCLBaseContainer, IWHTMLContainer, IWVCLBaseControl, IWBaseControl, + IWBaseHTMLControl; + +type + TfmMasterDetail = class(TfmBase) + cbLocalMasterDetail: TIWCheckBox; + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + edMasterFields: TIWEdit; + IWDBGrid1: TIWDBGrid; + IWDBGrid2: TIWDBGrid; + IWLabel3: TIWLabel; + IWLabel4: TIWLabel; + edDetailFields: TIWEdit; + IWDBNavigator1: TIWDBNavigator; + quMaster: TMSQuery; + quDetail: TMSQuery; + dsMaster: TDataSource; + dsDetail: TDataSource; + cbCachedCalcFields: TIWCheckBox; + btOpen: TIWButton; + btClose: TIWButton; + IWRegion1: TIWRegion; + IWRegion2: TIWRegion; + IWRegion3: TIWRegion; + IWRectangle1: TIWRectangle; + IWRectangle2: TIWRectangle; + IWRectangle3: TIWRectangle; + lbResult: TIWLabel; + IWRegion4: TIWRegion; + meMaster: TIWMemo; + IWRegion5: TIWRegion; + meDetail: TIWMemo; + procedure IWAppFormCreate(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure IWDBNavigator1Refresh(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +implementation + +{$R *.dfm} + +uses + ServerController, StdConvs; + +procedure TfmMasterDetail.IWAppFormCreate(Sender: TObject); +begin + inherited; + quMaster.Connection := DM.Connection; + quDetail.Connection := DM.Connection; +end; + +procedure TfmMasterDetail.btOpenClick(Sender: TObject); +begin + ReadFromControls; + UserSession.IsGoodMasterDetail := False; + try + quMaster.SQL.Text := UserSession.MasterSQL; + quDetail.SQL.Text := UserSession.DetailSQL; + quDetail.MasterFields := UserSession.MasterFields; + quDetail.DetailFields := UserSession.DetailFields; + quMaster.Options.LocalMasterDetail := UserSession.LocalMasterDetail; + quDetail.Options.LocalMasterDetail := UserSession.LocalMasterDetail; + quMaster.Options.CacheCalcFields := UserSession.CacheCalcFields; + quDetail.Options.CacheCalcFields := UserSession.CacheCalcFields; + quMaster.Open; + quDetail.Open; + UserSession.IsGoodMasterDetail := True; + UserSession.MasterDetailResult := 'Tables are opened'; + except + on E:Exception do + UserSession.MasterDetailResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmMasterDetail.btCloseClick(Sender: TObject); +begin + ReadFromControls; + quMaster.Close; + quDetail.Close; +end; + +procedure TfmMasterDetail.IWAppFormRender(Sender: TObject); +begin + inherited; + cbLocalMasterDetail.Checked := UserSession.LocalMasterDetail; + cbCachedCalcFields.Checked := UserSession.CacheCalcFields; + edMasterFields.Text := UserSession.MasterFields; + edDetailFields.Text := UserSession.DetailFields; + meMaster.Lines.Text := UserSession.MasterSQL; + meDetail.Lines.Text := UserSession.DetailSQL; + IWDBGrid1.Visible := quMaster.Active; + IWDBNavigator1.Enabled := quMaster.Active; + IWDBGrid2.Visible := quDetail.Active; + lbResult.Font.Color := ResultColors[UserSession.IsGoodMasterDetail]; + lbResult.Caption := UserSession.MasterDetailResult; +end; + +procedure TfmMasterDetail.ReadFromControls; +begin + inherited; + UserSession.LocalMasterDetail := cbLocalMasterDetail.Checked; + UserSession.CacheCalcFields := cbCachedCalcFields.Checked; + UserSession.MasterFields := edMasterFields.Text; + UserSession.DetailFields := edDetailFields.Text; + UserSession.MasterSQL := meMaster.Lines.Text; + UserSession.DetailSQL := meDetail.Lines.Text; +end; + +procedure TfmMasterDetail.IWDBNavigator1Refresh(Sender: TObject); +begin + ReadFromControls; +end; + +end. + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWHTMLControls, IWCompLabel, IWControl, IWCompRectangle, + IWCompCheckbox, IWCompEdit, IWCompMemo, IWGrids, IWDBGrids, DB, MemDS, + DBAccess, MSAccess, IWDBStdCtrls, IWCompButton, IWContainer, IWRegion, + IWVCLBaseContainer, IWHTMLContainer, IWVCLBaseControl, IWBaseControl, + IWBaseHTMLControl; + +type + TfmMasterDetail = class(TfmBase) + cbLocalMasterDetail: TIWCheckBox; + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + edMasterFields: TIWEdit; + IWDBGrid1: TIWDBGrid; + IWDBGrid2: TIWDBGrid; + IWLabel3: TIWLabel; + IWLabel4: TIWLabel; + edDetailFields: TIWEdit; + IWDBNavigator1: TIWDBNavigator; + quMaster: TMSQuery; + quDetail: TMSQuery; + dsMaster: TDataSource; + dsDetail: TDataSource; + cbCachedCalcFields: TIWCheckBox; + btOpen: TIWButton; + btClose: TIWButton; + IWRegion1: TIWRegion; + IWRegion2: TIWRegion; + IWRegion3: TIWRegion; + IWRectangle1: TIWRectangle; + IWRectangle2: TIWRectangle; + IWRectangle3: TIWRectangle; + lbResult: TIWLabel; + IWRegion4: TIWRegion; + meMaster: TIWMemo; + IWRegion5: TIWRegion; + meDetail: TIWMemo; + procedure IWAppFormCreate(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure IWDBNavigator1Refresh(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +implementation + +{$R *.dfm} + +uses + ServerController, StdConvs; + +procedure TfmMasterDetail.IWAppFormCreate(Sender: TObject); +begin + inherited; + quMaster.Connection := DM.Connection; + quDetail.Connection := DM.Connection; +end; + +procedure TfmMasterDetail.btOpenClick(Sender: TObject); +begin + ReadFromControls; + UserSession.IsGoodMasterDetail := False; + try + quMaster.SQL.Text := UserSession.MasterSQL; + quDetail.SQL.Text := UserSession.DetailSQL; + quDetail.MasterFields := UserSession.MasterFields; + quDetail.DetailFields := UserSession.DetailFields; + quMaster.Options.LocalMasterDetail := UserSession.LocalMasterDetail; + quDetail.Options.LocalMasterDetail := UserSession.LocalMasterDetail; + quMaster.Options.CacheCalcFields := UserSession.CacheCalcFields; + quDetail.Options.CacheCalcFields := UserSession.CacheCalcFields; + quMaster.Open; + quDetail.Open; + UserSession.IsGoodMasterDetail := True; + UserSession.MasterDetailResult := 'Tables are opened'; + except + on E:Exception do + UserSession.MasterDetailResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmMasterDetail.btCloseClick(Sender: TObject); +begin + ReadFromControls; + quMaster.Close; + quDetail.Close; +end; + +procedure TfmMasterDetail.IWAppFormRender(Sender: TObject); +begin + inherited; + cbLocalMasterDetail.Checked := UserSession.LocalMasterDetail; + cbCachedCalcFields.Checked := UserSession.CacheCalcFields; + edMasterFields.Text := UserSession.MasterFields; + edDetailFields.Text := UserSession.DetailFields; + meMaster.Lines.Text := UserSession.MasterSQL; + meDetail.Lines.Text := UserSession.DetailSQL; + IWDBGrid1.Visible := quMaster.Active; + IWDBNavigator1.Enabled := quMaster.Active; + IWDBGrid2.Visible := quDetail.Active; + lbResult.Font.Color := ResultColors[UserSession.IsGoodMasterDetail]; + lbResult.Caption := UserSession.MasterDetailResult; +end; + +procedure TfmMasterDetail.ReadFromControls; +begin + inherited; + UserSession.LocalMasterDetail := cbLocalMasterDetail.Checked; + UserSession.CacheCalcFields := cbCachedCalcFields.Checked; + UserSession.MasterFields := edMasterFields.Text; + UserSession.DetailFields := edDetailFields.Text; + UserSession.MasterSQL := meMaster.Lines.Text; + UserSession.DetailSQL := meDetail.Lines.Text; +end; + +procedure TfmMasterDetail.IWDBNavigator1Refresh(Sender: TObject); +begin + ReadFromControls; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uQuery.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uQuery.dfm new file mode 100644 index 0000000..8a52d4c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uQuery.dfm @@ -0,0 +1,809 @@ +inherited fmQuery: TfmQuery + Width = 677 + Height = 416 + OnCreate = IWAppFormCreate + DesignSize = ( + 677 + 416) + DesignLeft = 8 + DesignTop = 8 + inherited IWRectangle: TIWRectangle + Width = 656 + end + inherited lbPageName: TIWLabel + Left = 619 + Width = 44 + Caption = 'Query' + end + inherited lnkQuery: TIWLink + TabOrder = 3 + end + inherited lnkCachedUpdates: TIWLink + TabOrder = 5 + end + inherited lnkMasterDetail: TIWLink + TabOrder = 7 + end + object IWRegion1: TIWRegion [7] + Left = 16 + Top = 184 + Width = 654 + Height = 65 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 654 + 65) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 652 + Height = 63 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle1' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWLabel1: TIWLabel + Left = 7 + Top = 7 + Width = 38 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel1' + Caption = 'SQL' + RawText = False + end + object IWRegion3: TIWRegion + Left = 56 + Top = 8 + Width = 589 + Height = 49 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clNone + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + object meSQL: TIWMemo + Left = 1 + Top = 1 + Width = 587 + Height = 47 + Cursor = crAuto + Align = alClient + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + BGColor = clNone + Editable = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + InvisibleBorder = False + HorizScrollBar = False + VertScrollBar = True + Required = False + TabOrder = 11 + FriendlyName = 'meSQL' + end + end + end + object IWRegion2: TIWRegion [8] + Left = 16 + Top = 256 + Width = 654 + Height = 141 + Cursor = crAuto + TabOrder = 1 + Anchors = [akLeft, akTop, akRight, akBottom] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 654 + 141) + object IWRectangle2: TIWRectangle + Left = 1 + Top = 1 + Width = 652 + Height = 139 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle2' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWDBNavigator: TIWDBNavigator + Left = 6 + Top = 29 + Width = 135 + Height = 30 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = DataSource + FriendlyName = 'IWDBNavigator' + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbRefresh] + Orientation = orHorizontal + OnFirst = IWDBNavigatorRefresh + OnPrior = IWDBNavigatorRefresh + OnNext = IWDBNavigatorRefresh + OnLast = IWDBNavigatorRefresh + OnRefresh = IWDBNavigatorRefresh + end + object IWLabel2: TIWLabel + Left = 7 + Top = 7 + Width = 46 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel2' + Caption = 'Data' + RawText = False + end + object IWDBGrid: TIWDBGrid + Left = 144 + Top = 28 + Width = 502 + Height = 105 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseSize = True + ScrollToCurrentRow = False + Columns = <> + DataSource = DataSource + FooterRowCount = 0 + FriendlyName = 'IWDBGrid' + FromStart = True + HighlightColor = clNone + HighlightRows = False + Options = [dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + TabOrder = 21 + end + object lbResult: TIWLabel + Left = 144 + Top = 7 + Width = 63 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbResult' + Caption = 'lbResult' + RawText = False + end + end + object IWRegion4: TIWRegion [9] + Left = 16 + Top = 128 + Width = 653 + Height = 46 + Cursor = crAuto + TabOrder = 2 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 653 + 46) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 651 + Height = 44 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle3' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btOpen: TIWButton + Left = 11 + Top = 11 + Width = 94 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Open' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btOpen' + ScriptEvents = <> + TabOrder = 6 + OnClick = btOpenClick + end + object btClose: TIWButton + Left = 112 + Top = 11 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Close' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btClose' + ScriptEvents = <> + TabOrder = 8 + OnClick = btCloseClick + end + end + inherited rgConnection: TIWRegion + Width = 653 + TabOrder = 3 + DesignSize = ( + 653 + 42) + inherited IWRectangle4: TIWRectangle + Width = 651 + end + inherited btConnect: TIWButton + TabOrder = 10 + end + inherited btDisconnect: TIWButton + TabOrder = 12 + end + end + object Query: TMSQuery + Left = 328 + Top = 48 + end + object DataSource: TDataSource + DataSet = Query + Left = 424 + Top = 48 + end +end + Width = 677 + Height = 416 + OnCreate = IWAppFormCreate + DesignSize = ( + 677 + 416) + DesignLeft = 8 + DesignTop = 8 + inherited IWRectangle: TIWRectangle + Width = 656 + end + inherited lbPageName: TIWLabel + Left = 619 + Width = 44 + Caption = 'Query' + end + inherited lnkQuery: TIWLink + TabOrder = 3 + end + inherited lnkCachedUpdates: TIWLink + TabOrder = 5 + end + inherited lnkMasterDetail: TIWLink + TabOrder = 7 + end + object IWRegion1: TIWRegion [7] + Left = 16 + Top = 184 + Width = 654 + Height = 65 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 654 + 65) + object IWRectangle1: TIWRectangle + Left = 1 + Top = 1 + Width = 652 + Height = 63 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle1' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWLabel1: TIWLabel + Left = 7 + Top = 7 + Width = 38 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel1' + Caption = 'SQL' + RawText = False + end + object IWRegion3: TIWRegion + Left = 56 + Top = 8 + Width = 589 + Height = 49 + Cursor = crAuto + TabOrder = 0 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clNone + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + object meSQL: TIWMemo + Left = 1 + Top = 1 + Width = 587 + Height = 47 + Cursor = crAuto + Align = alClient + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + BGColor = clNone + Editable = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + ScriptEvents = <> + InvisibleBorder = False + HorizScrollBar = False + VertScrollBar = True + Required = False + TabOrder = 11 + FriendlyName = 'meSQL' + end + end + end + object IWRegion2: TIWRegion [8] + Left = 16 + Top = 256 + Width = 654 + Height = 141 + Cursor = crAuto + TabOrder = 1 + Anchors = [akLeft, akTop, akRight, akBottom] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 654 + 141) + object IWRectangle2: TIWRectangle + Left = 1 + Top = 1 + Width = 652 + Height = 139 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle2' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object IWDBNavigator: TIWDBNavigator + Left = 6 + Top = 29 + Width = 135 + Height = 30 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Confirmations.Delete = 'Are you sure you want to delete this record?' + Confirmations.Post = 'Are you sure you want to update this record?' + Confirmations.Cancel = 'Are you sure you want to cancel your changes to this record?' + DataSource = DataSource + FriendlyName = 'IWDBNavigator' + ImageHeight = 21 + ImageWidth = 21 + VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast, nbRefresh] + Orientation = orHorizontal + OnFirst = IWDBNavigatorRefresh + OnPrior = IWDBNavigatorRefresh + OnNext = IWDBNavigatorRefresh + OnLast = IWDBNavigatorRefresh + OnRefresh = IWDBNavigatorRefresh + end + object IWLabel2: TIWLabel + Left = 7 + Top = 7 + Width = 46 + Height = 18 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 12 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'IWLabel2' + Caption = 'Data' + RawText = False + end + object IWDBGrid: TIWDBGrid + Left = 144 + Top = 28 + Width = 502 + Height = 105 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + BorderColors.Color = clNone + BorderColors.Light = clNone + BorderColors.Dark = clNone + BGColor = clSkyBlue + BorderSize = 1 + BorderStyle = tfDefault + CellPadding = 0 + CellSpacing = 0 + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [] + FrameBuffer = 40 + Lines = tlAll + UseFrame = True + UseSize = True + ScrollToCurrentRow = False + Columns = <> + DataSource = DataSource + FooterRowCount = 0 + FriendlyName = 'IWDBGrid' + FromStart = True + HighlightColor = clNone + HighlightRows = False + Options = [dgShowTitles] + RefreshMode = rmAutomatic + RowLimit = 0 + RollOver = False + RowClick = False + RollOverColor = clNone + RowHeaderColor = 12876667 + RowAlternateColor = clNone + RowCurrentColor = clMoneyGreen + TabOrder = 21 + end + object lbResult: TIWLabel + Left = 144 + Top = 7 + Width = 63 + Height = 16 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = False + Alignment = taLeftJustify + BGColor = clNone + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + NoWrap = False + FriendlyName = 'lbResult' + Caption = 'lbResult' + RawText = False + end + end + object IWRegion4: TIWRegion [9] + Left = 16 + Top = 128 + Width = 653 + Height = 46 + Cursor = crAuto + TabOrder = 2 + Anchors = [akLeft, akTop, akRight] + BorderOptions.NumericWidth = 1 + BorderOptions.BorderWidth = cbwNumeric + BorderOptions.Style = cbsSolid + BorderOptions.Color = clNone + Color = clWebBLACK + ParentShowHint = False + ShowHint = True + ZIndex = 1000 + DesignSize = ( + 653 + 46) + object IWRectangle3: TIWRectangle + Left = 1 + Top = 1 + Width = 651 + Height = 44 + Cursor = crAuto + Anchors = [akLeft, akTop, akRight, akBottom] + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = -1 + RenderSize = True + Font.Color = clNone + Font.Size = 10 + Font.Style = [] + BorderOptions.Color = clNone + BorderOptions.Width = 0 + FriendlyName = 'IWRectangle3' + Color = 14811135 + Alignment = taLeftJustify + VAlign = vaMiddle + end + object btOpen: TIWButton + Left = 11 + Top = 11 + Width = 94 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Open' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btOpen' + ScriptEvents = <> + TabOrder = 6 + OnClick = btOpenClick + end + object btClose: TIWButton + Left = 112 + Top = 11 + Width = 97 + Height = 25 + Cursor = crAuto + IW50Hint = False + ParentShowHint = False + ShowHint = True + ZIndex = 0 + RenderSize = True + Caption = 'Close' + DoSubmitValidation = True + Color = clBtnFace + Font.Color = clNone + Font.FontName = 'Verdana' + Font.Size = 10 + Font.Style = [fsBold] + FriendlyName = 'btClose' + ScriptEvents = <> + TabOrder = 8 + OnClick = btCloseClick + end + end + inherited rgConnection: TIWRegion + Width = 653 + TabOrder = 3 + DesignSize = ( + 653 + 42) + inherited IWRectangle4: TIWRectangle + Width = 651 + end + inherited btConnect: TIWButton + TabOrder = 10 + end + inherited btDisconnect: TIWButton + TabOrder = 12 + end + end + object Query: TMSQuery + Left = 328 + Top = 48 + end + object DataSource: TDataSource + DataSet = Query + Left = 424 + Top = 48 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uQuery.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uQuery.pas new file mode 100644 index 0000000..715ed45 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/IntraWeb/IW7/uQuery.pas @@ -0,0 +1,231 @@ +unit uQuery; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWCompLabel, IWControl, IWCompRectangle, IWHTMLControls, + IWGrids, IWDBGrids, IWCompMemo, IWDBStdCtrls, IWCompButton, DB, MyAccess, + MemDS, DBAccess, IWTemplateProcessorHTML, + IWContainer, IWRegion, IWLayoutMgrHTML, IWCompCheckbox, ExtCtrls, + IWExtCtrls, IWHTMLTag, IWVCLBaseContainer, IWHTMLContainer, IWVCLBaseControl, + IWBaseControl, IWBaseHTMLControl, MSAccess; + +type + TfmQuery = class(TfmBase) + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + IWDBNavigator: TIWDBNavigator; + lbResult: TIWLabel; + btOpen: TIWButton; + Query: TMSQuery; + DataSource: TDataSource; + IWRegion1: TIWRegion; + IWRegion2: TIWRegion; + IWDBGrid: TIWDBGrid; + IWRectangle1: TIWRectangle; + IWRectangle2: TIWRectangle; + IWRegion3: TIWRegion; + meSQL: TIWMemo; + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + btClose: TIWButton; + procedure IWAppFormCreate(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure IWDBNavigatorRefresh(Sender: TObject); + procedure btCloseClick(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +var + fmQuery: TfmQuery; + +implementation + +{$R *.dfm} + +uses + ServerController, IWForm; + +procedure TfmQuery.IWAppFormCreate(Sender: TObject); +begin + inherited; + Query.Connection := DM.Connection; +end; + +procedure TfmQuery.btOpenClick(Sender: TObject); +begin + ReadFromControls; + Query.SQL.Text := UserSession.QuerySQL; + IWDBGrid.Columns.Clear; + UserSession.isGoodQuery := False; + try + Query.Execute; + UserSession.isGoodQuery := True; + if Query.Active then + UserSession.QueryResult := 'Result' + else + if Query.RowsAffected >= 0 then + UserSession.QueryResult := IntToStr(Query.RowsAffected) + ' rows affected' + else + UserSession.QueryResult := 'Executed'; + except + on E:Exception do + UserSession.QueryResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmQuery.btCloseClick(Sender: TObject); +begin + ReadFromControls; + UserSession.isGoodQuery := False; + try + IWDBGrid.Columns.Clear; + Query.Close; + UserSession.isGoodQuery := True; + UserSession.QueryResult := '' + except + on E:Exception do + UserSession.QueryResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmQuery.IWAppFormRender(Sender: TObject); +begin + inherited; + meSQL.Lines.Text := UserSession.QuerySQL; + IWDBGrid.Visible := UserSession.isGoodQuery and Query.Active; + IWDBNavigator.Enabled := IWDBGrid.Visible; + lbResult.Font.Color := ResultColors[UserSession.IsGoodQuery]; + lbResult.Caption := UserSession.QueryResult; +end; + +procedure TfmQuery.ReadFromControls; +begin + inherited; + UserSession.QuerySQL := meSQL.Lines.Text; +end; + +procedure TfmQuery.IWDBNavigatorRefresh(Sender: TObject); +begin + ReadFromControls; +end; + +end. + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uBase, IWCompLabel, IWControl, IWCompRectangle, IWHTMLControls, + IWGrids, IWDBGrids, IWCompMemo, IWDBStdCtrls, IWCompButton, DB, MyAccess, + MemDS, DBAccess, IWTemplateProcessorHTML, + IWContainer, IWRegion, IWLayoutMgrHTML, IWCompCheckbox, ExtCtrls, + IWExtCtrls, IWHTMLTag, IWVCLBaseContainer, IWHTMLContainer, IWVCLBaseControl, + IWBaseControl, IWBaseHTMLControl, MSAccess; + +type + TfmQuery = class(TfmBase) + IWLabel1: TIWLabel; + IWLabel2: TIWLabel; + IWDBNavigator: TIWDBNavigator; + lbResult: TIWLabel; + btOpen: TIWButton; + Query: TMSQuery; + DataSource: TDataSource; + IWRegion1: TIWRegion; + IWRegion2: TIWRegion; + IWDBGrid: TIWDBGrid; + IWRectangle1: TIWRectangle; + IWRectangle2: TIWRectangle; + IWRegion3: TIWRegion; + meSQL: TIWMemo; + IWRegion4: TIWRegion; + IWRectangle3: TIWRectangle; + btClose: TIWButton; + procedure IWAppFormCreate(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure IWAppFormRender(Sender: TObject); + procedure IWDBNavigatorRefresh(Sender: TObject); + procedure btCloseClick(Sender: TObject); + protected + procedure ReadFromControls; override; + end; + +var + fmQuery: TfmQuery; + +implementation + +{$R *.dfm} + +uses + ServerController, IWForm; + +procedure TfmQuery.IWAppFormCreate(Sender: TObject); +begin + inherited; + Query.Connection := DM.Connection; +end; + +procedure TfmQuery.btOpenClick(Sender: TObject); +begin + ReadFromControls; + Query.SQL.Text := UserSession.QuerySQL; + IWDBGrid.Columns.Clear; + UserSession.isGoodQuery := False; + try + Query.Execute; + UserSession.isGoodQuery := True; + if Query.Active then + UserSession.QueryResult := 'Result' + else + if Query.RowsAffected >= 0 then + UserSession.QueryResult := IntToStr(Query.RowsAffected) + ' rows affected' + else + UserSession.QueryResult := 'Executed'; + except + on E:Exception do + UserSession.QueryResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmQuery.btCloseClick(Sender: TObject); +begin + ReadFromControls; + UserSession.isGoodQuery := False; + try + IWDBGrid.Columns.Clear; + Query.Close; + UserSession.isGoodQuery := True; + UserSession.QueryResult := '' + except + on E:Exception do + UserSession.QueryResult := 'Error: '+ E.Message; + end; +end; + +procedure TfmQuery.IWAppFormRender(Sender: TObject); +begin + inherited; + meSQL.Lines.Text := UserSession.QuerySQL; + IWDBGrid.Visible := UserSession.isGoodQuery and Query.Active; + IWDBNavigator.Enabled := IWDBGrid.Visible; + lbResult.Font.Color := ResultColors[UserSession.IsGoodQuery]; + lbResult.Caption := UserSession.QueryResult; +end; + +procedure TfmQuery.ReadFromControls; +begin + inherited; + UserSession.QuerySQL := meSQL.Lines.Text; +end; + +procedure TfmQuery.IWDBNavigatorRefresh(Sender: TObject); +begin + ReadFromControls; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Main.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Main.dfm new file mode 100644 index 0000000..a66a75b --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Main.dfm @@ -0,0 +1,51 @@ +object fmMain: TfmMain + Left = 299 + Top = 138 + BorderStyle = bsSingle + Caption = 'MS SQL Data Access Components demo - using SDAC with Quick Report' + ClientHeight = 57 + ClientWidth = 465 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Scaled = False + PixelsPerInch = 96 + TextHeight = 13 + object btPreview: TButton + Left = 192 + Top = 16 + Width = 75 + Height = 25 + Caption = 'Preview' + TabOrder = 2 + OnClick = btPreviewClick + end + object Connect: TButton + Left = 8 + Top = 16 + Width = 75 + Height = 25 + Caption = 'Connect' + TabOrder = 0 + OnClick = ConnectClick + end + object Disconnect: TButton + Left = 88 + Top = 16 + Width = 75 + Height = 25 + Caption = 'Disconnect' + TabOrder = 1 + OnClick = DisconnectClick + end + object MSConnection: TMSConnection + Database = 'SDACDemos' + Username = 'Sa' + Left = 8 + Top = 16 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Main.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Main.pas new file mode 100644 index 0000000..96c2f72 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Main.pas @@ -0,0 +1,49 @@ +unit Main; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, SdacVcl, + ExtCtrls, QuickRpt, Db, MemDS, StdCtrls, QRPrntr, DBAccess, MSAccess; + +type + TfmMain = class(TForm) + MSConnection: TMSConnection; + btPreview: TButton; + Connect: TButton; + Disconnect: TButton; + procedure btPreviewClick(Sender: TObject); + procedure ConnectClick(Sender: TObject); + procedure DisconnectClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + fmMain: TfmMain; + +implementation + +uses Report1; + +{$R *.DFM} + +procedure TfmMain.btPreviewClick(Sender: TObject); +begin + qrReport1.Preview; +end; + +procedure TfmMain.ConnectClick(Sender: TObject); +begin + MSConnection.Connect; +end; + +procedure TfmMain.DisconnectClick(Sender: TObject); +begin + MSConnection.Disconnect; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.cfg b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.cfg new file mode 100644 index 0000000..fc13625 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q+ +-$R+ +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"." +-N"." +-LE"." +-LN"." +-U"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-O"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-I"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" +-R"d:\program files\borland\delphi5\Lib\Debug;d:\program files\borland\delphi5\Vcl;d:\program files\borland\delphi5\lib" diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.dpr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.dpr new file mode 100644 index 0000000..a532a10 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.dpr @@ -0,0 +1,15 @@ +program QReport; + +uses + Forms, + Main in 'Main.pas' {fmMain}, + Report1 in 'Report1.pas' {qrReport1: TQuickRep}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfmMain, fmMain); + Application.CreateForm(TqrReport1, qrReport1); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/QReport.res new file mode 100644 index 0000000000000000000000000000000000000000..4308bae9349125597278f6470dafd4ee76be4b72 GIT binary patch literal 1540 zcmaJ=O>0v@6g{trdE&w**oAdrgNTR=No-K0izwDWL9JNnwh7vaC21O(*hIQ8t85DX z7z1tKA!OxGa9wcY&Mvzs9nZbPTErdjKZ+lldOCi2I~@zj@0 z&c`FtU2f8}Co~V?F=H+s9e_V{I&R_2Ev;n8AVwnQ*9^3&5heoh*p?)tBbQKpv!d}o<91>bV5I9`aTK*6l z#feIA;QS676Xr9Tpl(dX)iXvC5F5pnuHwWHA5P%?N`HdC9|Ya;c;dcbgz@d5ALxyU zJ?d#493DKP+fSIHcWv<~b-inP!e>DqG_r|qaf!`RK}9dcV>FIj02#u9za%YD#mvfW zObJ?2#qo&4M}b}~9`=-nEp`1h*@16|cCuhCEl;}%-+qB-zw@g(20otv`Op@K#byWp zF!4pk7@rn91xjbY={dYJ+ligq<5??X4nT%x?Nz+QQ>@?>?HN|NMq~V4$ZPPBPRI3C z$Sd;D9=@gIg>R`nlVhrNtYL%mbG+ehMJsG*y#n_#zQuo^OFpqn`Xt?&S1%A(PYA;0 zhw|3Y#4ff_Lm36GRctbI4F)^peN|2dIb`vex6M(*BF}HJj>o(1V4IJjME)na4lN*xHbr!xge4?mD@ + end + object quDept: TMSQuery + Connection = fmMain.MSConnection + SQL.Strings = ( + 'SELECT * FROM Dept' + '') + Left = 8 + Top = 16 + end + object DataSource1: TDataSource + DataSet = quDept + Left = 40 + Top = 16 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Report1.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Report1.pas new file mode 100644 index 0000000..1b5f11a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/QuickReport/Report1.pas @@ -0,0 +1,78 @@ +unit Report1; + +interface + +uses Windows, SysUtils, Messages, Classes, Graphics, Controls, + StdCtrls, ExtCtrls, Forms, Quickrpt, QRCtrls, Db, MemDS, DBAccess, + MSAccess; + +type + TqrReport1 = class(TQuickRep) + QRBand1: TQRBand; + QRBand2: TQRBand; + QRDBText1: TQRDBText; + QRDBText2: TQRDBText; + QRDBText3: TQRDBText; + quEmp: TMSQuery; + QRSubDetail1: TQRSubDetail; + QRDBText4: TQRDBText; + quDept: TMSQuery; + DataSource1: TDataSource; + QRLabel1: TQRLabel; + QRDBText5: TQRDBText; + QRDBText7: TQRDBText; + QRDBText8: TQRDBText; + QRDBText9: TQRDBText; + QRDBText10: TQRDBText; + QRShape1: TQRShape; + QRSysData1: TQRSysData; + QRBand3: TQRBand; + QRLabel2: TQRLabel; + GroupFooterBand1: TQRBand; + GroupHeaderBand1: TQRBand; + QRLabel3: TQRLabel; + QRLabel4: TQRLabel; + QRLabel5: TQRLabel; + QRLabel6: TQRLabel; + QRLabel7: TQRLabel; + QRLabel8: TQRLabel; + QRLabel9: TQRLabel; + QRDBText6: TQRDBText; + QRExpr1: TQRExpr; + QRExpr2: TQRExpr; + QRShape2: TQRShape; + QRLabel10: TQRLabel; + QRLabel11: TQRLabel; + QRLabel12: TQRLabel; + procedure QuickRepBeforePrint(Sender: TCustomQuickRep; + var PrintReport: Boolean); + procedure QuickRepAfterPreview(Sender: TObject); + private + + public + + end; + +var + qrReport1: TqrReport1; + +implementation +uses + Main; + +{$R *.DFM} + +procedure TqrReport1.QuickRepBeforePrint(Sender: TCustomQuickRep; + var PrintReport: Boolean); +begin + quDept.Open; + quEmp.Open; +end; + +procedure TqrReport1.QuickRepAfterPreview(Sender: TObject); +begin + quEmp.Close; + quDept.Close; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/EndUser.dpr b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/EndUser.dpr new file mode 100644 index 0000000..6de1461 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/EndUser.dpr @@ -0,0 +1,13 @@ +program EndUser; + +uses + Forms, + myEURpt in 'myEURpt.pas' {myEndUserSolution}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TmyEndUserSolution, myEndUserSolution); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/EndUser.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/EndUser.res new file mode 100644 index 0000000000000000000000000000000000000000..6d7afb501cdc9cb13b07f11df20456025a48aca4 GIT binary patch literal 876 zcmaJ=u}T9$5Pj=~%T*>pL2S&GmJu5vMHC@mp%(tY*=&>kniL)cVj$qp1ag6GuJSul zTBb}9vc8?YiwUB`y`6pYW@hJ(TL6d&YdyFy;MlwsCX z)~q(-Gk_1W%sZ~!q9_V_C%7S;v)*y_bGe|mR_n0i|2%lfv#QehA0A2ghfh1eMD$FQ zXojHEr#_ZZ0Vd3~p7@SCu7!sKGxWOWT9^H_G|03b z`17=O4al|dK`K1l@%aIt4)TNisWIt(J$ddp%KCSc8+jvg#d#*f`S6Bv6zW8sTrXN@ zsh+uf9>~DxDom3uKb8!Xs20N*EqnnpTo$5kRwl5id%HjqpjV6>nZC09d*N<_LLArRR=8WF@D1Os$4meK literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/ReadMe.txt b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/ReadMe.txt new file mode 100644 index 0000000..3d6f6dc --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/ReadMe.txt @@ -0,0 +1,10 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Demo for ReportBuilder included in SDAC was built and tested using +Report Builder Pro 9.0 for Delphi 7. + +IMPORTANT NOTE: + Demos are provided as is and there are no warranty that they are fully + compatible with other versions of Report Builder Pro. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/Reports/Orders.rtm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/Reports/Orders.rtm new file mode 100644 index 0000000..41d5014 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/Reports/Orders.rtm @@ -0,0 +1,592 @@ +object ppReport: TppReport + AutoStop = False + PassSetting = psTwoPass + PrinterSetup.BinName = 'Default' + PrinterSetup.DocumentName = 'Report' + PrinterSetup.PaperName = 'Letter 8 1/2 x 11 in' + PrinterSetup.PrinterName = 'Default' + PrinterSetup.mmMarginBottom = 6350 + PrinterSetup.mmMarginLeft = 6350 + PrinterSetup.mmMarginRight = 6350 + PrinterSetup.mmMarginTop = 6350 + PrinterSetup.mmPaperHeight = 279401 + PrinterSetup.mmPaperWidth = 215900 + PrinterSetup.PaperSize = 1 + SaveAsTemplate = True + Template.DatabaseSettings.DataPipeline = plItem + Template.DatabaseSettings.Name = 'New Report' + Template.DatabaseSettings.NameField = 'ITEM_NAME' + Template.DatabaseSettings.TemplateField = 'TEMPLATE' + Template.FileName = 'D:\Projects\Delphi\Sdac\Demos\ReportBuilder\Reports\Orders.rtm' + Template.Format = ftASCII + Units = utScreenPixels + DeviceType = 'Screen' + Left = 289 + Top = 326 + Version = '6.01' + mmColumnWidth = 0 + DataPipelineName = 'Orders' + object ppTitleBand1: TppTitleBand + mmBottomOffset = 0 + mmHeight = 9525 + mmPrintPosition = 0 + object ppLine1: TppLine + UserName = 'Line1' + Pen.Color = clNavy + Pen.Width = 2 + Weight = 1.5 + mmHeight = 3969 + mmLeft = 1323 + mmTop = 1323 + mmWidth = 200555 + BandType = 1 + end + object ppLabel1: TppLabel + UserName = 'Label1' + Caption = 'Orders summary' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Name = 'TIMES NEW ROMAN' + Font.Size = 20 + Font.Style = [fsBold, fsItalic] + Transparent = True + mmHeight = 8202 + mmLeft = 1323 + mmTop = 1323 + mmWidth = 48948 + BandType = 1 + end + end + object ppHeaderBand1: TppHeaderBand + mmBottomOffset = 0 + mmHeight = 7408 + mmPrintPosition = 0 + object ppLabel2: TppLabel + UserName = 'Label2' + AutoSize = False + Caption = 'Product name' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Name = 'TIMES NEW ROMAN' + Font.Size = 11 + Font.Style = [fsBold, fsItalic] + Transparent = True + mmHeight = 4763 + mmLeft = 1323 + mmTop = 1323 + mmWidth = 23283 + BandType = 0 + end + object ppLabel3: TppLabel + UserName = 'Label3' + AutoSize = False + Caption = 'Unit price' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Name = 'TIMES NEW ROMAN' + Font.Size = 11 + Font.Style = [fsBold, fsItalic] + Transparent = True + mmHeight = 4763 + mmLeft = 55563 + mmTop = 1323 + mmWidth = 16669 + BandType = 0 + end + object ppLabel4: TppLabel + UserName = 'Label4' + Caption = 'Quantity' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Name = 'TIMES NEW ROMAN' + Font.Size = 11 + Font.Style = [fsBold, fsItalic] + Transparent = True + mmHeight = 4498 + mmLeft = 73290 + mmTop = 1323 + mmWidth = 14023 + BandType = 0 + end + object ppLine3: TppLine + UserName = 'Line3' + Pen.Color = clNavy + Pen.Width = 2 + ParentWidth = True + Weight = 1.5 + mmHeight = 2646 + mmLeft = 0 + mmTop = 6615 + mmWidth = 203200 + BandType = 0 + end + object ppLabel5: TppLabel + UserName = 'Label5' + Caption = 'Cost' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Name = 'TIMES NEW ROMAN' + Font.Size = 11 + Font.Style = [fsBold, fsItalic] + Transparent = True + mmHeight = 4498 + mmLeft = 93134 + mmTop = 1323 + mmWidth = 7144 + BandType = 0 + end + end + object ppDetailBand1: TppDetailBand + mmBottomOffset = 0 + mmHeight = 6085 + mmPrintPosition = 0 + object ppDBText2: TppDBText + UserName = 'DBText2' + AutoSize = True + DataField = 'ProductName' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'ARIAL' + Font.Size = 8 + Font.Style = [] + Transparent = True + DataPipelineName = 'Orders' + mmHeight = 3175 + mmLeft = 1323 + mmTop = 529 + mmWidth = 47361 + BandType = 4 + end + object ppDBText3: TppDBText + UserName = 'DBText3' + DataField = 'UnitPrice' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'ARIAL' + Font.Size = 8 + Font.Style = [] + Transparent = True + DataPipelineName = 'Orders' + mmHeight = 3175 + mmLeft = 55563 + mmTop = 529 + mmWidth = 16933 + BandType = 4 + end + object ppDBText4: TppDBText + UserName = 'DBText4' + DataField = 'Quantity' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'ARIAL' + Font.Size = 8 + Font.Style = [] + Transparent = True + DataPipelineName = 'Orders' + mmHeight = 3175 + mmLeft = 73290 + mmTop = 529 + mmWidth = 16933 + BandType = 4 + end + object ppDBText5: TppDBText + UserName = 'DBText5' + DataField = 'Order_Details_UnitPrice_O' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Name = 'Arial' + Font.Size = 8 + Font.Style = [] + Transparent = True + DataPipelineName = 'Orders' + mmHeight = 3175 + mmLeft = 93134 + mmTop = 529 + mmWidth = 91546 + BandType = 4 + end + end + object ppFooterBand1: TppFooterBand + mmBottomOffset = 0 + mmHeight = 7144 + mmPrintPosition = 0 + object ppLine4: TppLine + UserName = 'Line4' + Pen.Color = clGray + Pen.Width = 2 + Weight = 1.5 + mmHeight = 3969 + mmLeft = 1323 + mmTop = 5821 + mmWidth = 200555 + BandType = 8 + end + object ppSystemVariable1: TppSystemVariable + UserName = 'SystemVariable1' + VarType = vtPrintDateTime + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Name = 'TIMES NEW ROMAN' + Font.Size = 9 + Font.Style = [] + Transparent = True + mmHeight = 4498 + mmLeft = 1323 + mmTop = 1323 + mmWidth = 17198 + BandType = 8 + end + object ppSystemVariable2: TppSystemVariable + UserName = 'SystemVariable2' + VarType = vtPageNoDesc + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Name = 'TIMES NEW ROMAN' + Font.Size = 9 + Font.Style = [] + TextAlignment = taRightJustified + Transparent = True + mmHeight = 4498 + mmLeft = 184680 + mmTop = 1323 + mmWidth = 17198 + BandType = 8 + end + end + object ppGroup1: TppGroup + BreakName = 'OrderDate' + DataPipeline = daSDACQueryDataView1.Orders + UserName = 'Group1' + mmNewColumnThreshold = 0 + mmNewPageThreshold = 0 + DataPipelineName = 'Orders' + object ppGroupHeaderBand1: TppGroupHeaderBand + mmBottomOffset = 0 + mmHeight = 6350 + mmPrintPosition = 0 + object ppDBText1: TppDBText + UserName = 'DBText1' + DataField = 'OrderDate' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Name = 'TIMES NEW ROMAN' + Font.Size = 9 + Font.Style = [] + Transparent = True + DataPipelineName = 'Orders' + mmHeight = 3704 + mmLeft = 1323 + mmTop = 529 + mmWidth = 16933 + BandType = 3 + GroupNo = 0 + end + end + object ppGroupFooterBand1: TppGroupFooterBand + mmBottomOffset = 0 + mmHeight = 6085 + mmPrintPosition = 0 + object ppDBCalc1: TppDBCalc + UserName = 'DBCalc1' + AutoSize = True + DataField = 'Order_Details_UnitPrice_O' + DisplayFormat = '$#,0.00;-$#,0.00' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'ARIAL' + Font.Size = 8 + Font.Style = [fsBold] + ResetGroup = ppGroup1 + Transparent = True + DataPipelineName = 'Orders' + mmHeight = 3440 + mmLeft = 93134 + mmTop = 529 + mmWidth = 71702 + BandType = 5 + GroupNo = 0 + end + end + end + object daDataModule1: TdaDataModule + object daSDACQueryDataView1: TdaSDACQueryDataView + Report = ppReport + UserName = 'Query_Orders' + Height = 227 + Left = 10 + NameColumnWidth = 105 + SizeColumnWidth = 35 + SortMode = 0 + Top = 10 + TypeColumnWidth = 52 + Width = 382 + AutoSearchTabOrder = 0 + object Orders: TppChildDBPipeline + AutoCreateFields = False + UserName = 'Orders' + object ppField1: TppField + FieldAlias = 'Orderid' + FieldName = 'OrderID' + FieldLength = 10 + DataType = dtInteger + DisplayWidth = 10 + Position = 0 + TableName = 'Orders' + end + object ppField2: TppField + FieldAlias = 'Orderdate' + FieldName = 'OrderDate' + FieldLength = 10 + DataType = dtDateTime + DisplayWidth = 10 + Position = 1 + TableName = 'Orders' + end + object ppField3: TppField + FieldAlias = 'Productname' + FieldName = 'ProductName' + FieldLength = 10 + IsDetail = True + DisplayWidth = 10 + Position = 2 + TableName = 'Products' + end + object ppField4: TppField + FieldAlias = 'Unitprice' + FieldName = 'UnitPrice' + FieldLength = 10 + IsDetail = True + DataType = dtCurrency + DisplayWidth = 10 + Position = 3 + TableName = 'Order_Details' + end + object ppField5: TppField + FieldAlias = 'Quantity' + FieldName = 'Quantity' + FieldLength = 10 + IsDetail = True + DataType = dtInteger + DisplayWidth = 10 + Position = 4 + TableName = 'Order_Details' + end + object ppField6: TppField + FieldAlias = 'Order_Details.UnitPrice*Order_Details.Quantity' + FieldName = 'Order_Details_UnitPrice_O' + FieldLength = 10 + Linkable = False + DataType = dtCurrency + DisplayWidth = 10 + Position = 5 + TableName = 'Order_Details' + end + end + object daSQL1: TdaSQL + DatabaseName = 'seDatabase' + DatabaseType = dtMSSQLServer + DataPipelineName = 'Orders' + LinkColor = clMaroon + MaxSQLFieldAliasLength = 25 + SQLText.Strings = ( + 'SELECT Orders.OrderID, Orders.OrderDate, ' + ' Products.ProductName, ' + ' Order_Details.UnitPrice, ' + ' Order_Details.Quantity, ' + + ' Order_Details.UnitPrice*Order_Details.Quantity Order_Deta' + + 'ils_UnitPrice_O' + 'FROM Orders Orders, "Order Details" Order_Details' + ' , Products Products' + 'WHERE (Order_Details.OrderID = Orders.OrderID)' + ' AND ' + ' (Products.ProductID = Order_Details.ProductID)' + 'ORDER BY Orders.OrderDate, Products.ProductName') + SQLType = sqSQL1 + object daCalculation1: TdaCalculation + ChildType = 8 + Alias = 'Order_Details.UnitPrice*Order_Details.Quantity' + DataType = dtCurrency + DisplayWidth = 10 + FieldAlias = 'Unitprice' + FieldLength = 10 + FieldName = 'UnitPrice' + Linkable = False + SQLFieldName = 'Order_Details_UnitPrice_O' + TableAlias = 'Order Details' + TableName = 'Order Details' + TableSQLAlias = 'Order_Details' + CalcType = dacaExpression + Expression = 'Order_Details.UnitPrice*Order_Details.Quantity' + end + object daField1: TdaField + Alias = 'Orderid' + DataType = dtInteger + DisplayWidth = 10 + FieldAlias = 'Orderid' + FieldLength = 10 + FieldName = 'OrderID' + SQLFieldName = 'OrderID' + TableAlias = 'Orders' + TableName = 'Orders' + TableSQLAlias = 'Orders' + end + object daField2: TdaField + Alias = 'Orderdate' + DataType = dtDateTime + DisplayWidth = 10 + FieldAlias = 'Orderdate' + FieldLength = 10 + FieldName = 'OrderDate' + SQLFieldName = 'OrderDate' + TableAlias = 'Orders' + TableName = 'Orders' + TableSQLAlias = 'Orders' + end + object daField3: TdaField + Alias = 'Productname' + DisplayWidth = 10 + FieldAlias = 'Productname' + FieldLength = 10 + FieldName = 'ProductName' + IsDetail = True + SQLFieldName = 'ProductName' + TableAlias = 'Products' + TableName = 'Products' + TableSQLAlias = 'Products' + end + object daField4: TdaField + Alias = 'Unitprice' + DataType = dtCurrency + DisplayWidth = 10 + FieldAlias = 'Unitprice' + FieldLength = 10 + FieldName = 'UnitPrice' + IsDetail = True + SQLFieldName = 'UnitPrice' + TableAlias = 'Order Details' + TableName = 'Order Details' + TableSQLAlias = 'Order_Details' + end + object daField5: TdaField + Alias = 'Quantity' + DataType = dtInteger + DisplayWidth = 10 + FieldAlias = 'Quantity' + FieldLength = 10 + FieldName = 'Quantity' + IsDetail = True + SQLFieldName = 'Quantity' + TableAlias = 'Order Details' + TableName = 'Order Details' + TableSQLAlias = 'Order_Details' + end + object daField6: TdaField + ChildType = 2 + Alias = 'Orderdate' + DataType = dtDateTime + DisplayWidth = 10 + FieldAlias = 'Orderdate' + FieldLength = 10 + FieldName = 'OrderDate' + SQLFieldName = 'OrderDate' + TableAlias = 'Orders' + TableName = 'Orders' + TableSQLAlias = 'Orders' + end + object daField7: TdaField + ChildType = 2 + Alias = 'Productname' + DisplayWidth = 10 + FieldAlias = 'Productname' + FieldLength = 10 + FieldName = 'ProductName' + SQLFieldName = 'ProductName' + TableAlias = 'Products' + TableName = 'Products' + TableSQLAlias = 'Products' + end + object daTable1: TdaTable + ChildType = 5 + Alias = 'Orders' + JoinType = dajtNone + SQLAlias = 'Orders' + TableAlias = 'Orders' + TableName = 'Orders' + end + object daTable2: TdaTable + ChildType = 5 + Alias = 'Order Details' + SQLAlias = 'Order_Details' + TableAlias = 'Order Details' + TableName = 'Order Details' + object daTableJoin1: TdaTableJoin + ChildType = 6 + object daField9: TdaField + ChildType = 3 + Alias = 'Orderid' + DataType = dtInteger + DisplayWidth = 10 + FieldAlias = 'Orderid' + FieldLength = 10 + FieldName = 'OrderID' + SQLFieldName = 'OrderID' + TableAlias = 'Order Details' + TableName = 'Order Details' + TableSQLAlias = 'Order_Details' + end + object daField8: TdaField + ChildType = 4 + Alias = 'Orderid' + DataType = dtInteger + DisplayWidth = 10 + FieldAlias = 'Orderid' + FieldLength = 10 + FieldName = 'OrderID' + SQLFieldName = 'OrderID' + TableAlias = 'Orders' + TableName = 'Orders' + TableSQLAlias = 'Orders' + end + end + end + object daTable3: TdaTable + ChildType = 5 + Alias = 'Products' + SQLAlias = 'Products' + TableAlias = 'Products' + TableName = 'Products' + object daTableJoin2: TdaTableJoin + ChildType = 6 + object daField11: TdaField + ChildType = 3 + Alias = 'Productid' + DataType = dtInteger + DisplayWidth = 10 + FieldAlias = 'Productid' + FieldLength = 10 + FieldName = 'ProductID' + SQLFieldName = 'ProductID' + TableAlias = 'Products' + TableName = 'Products' + TableSQLAlias = 'Products' + end + object daField10: TdaField + ChildType = 4 + Alias = 'Productid' + DataType = dtInteger + DisplayWidth = 10 + FieldAlias = 'Productid' + FieldLength = 10 + FieldName = 'ProductID' + SQLFieldName = 'ProductID' + TableAlias = 'Order Details' + TableName = 'Order Details' + TableSQLAlias = 'Order_Details' + end + end + end + end + end + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/daSDAC.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/daSDAC.pas new file mode 100644 index 0000000..3364f92 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/daSDAC.pas @@ -0,0 +1,763 @@ + +////////////////////////////////////////////////// +// MS SQL Server Data Access Components +// Copyright © 1998,2000 Core Lab. All right reserved. +// ReportBuilder support +// Based on Digital Metaphors Corporation's demos +////////////////////////////////////////////////// + +unit daSDAC; + +interface +uses + Classes, SysUtils, Forms, ExtCtrls, DB, + ppClass, ppComm, ppDBPipe, ppDB, ppClasUt, ppTypes, + daDB, daDataView, daQueryDataView, daPreviewDataDlg, + MSAccess; + +type + {MS SQL Server Data Access Components (SDAC) DataView Classes: + 1. SDAC TDataSet descendants + - TDataSets that can be children of a DataView. + - Override the HasParent method of TComponent to return True + - Must be registerd with the Delphi IDE using the RegisterNoIcon procedure + + a. TdaChildSDACQuery - TMSQuery descendant that can be a child of a DataView + b. TdaChildSDACTable - TMSTable descendant that can be a child of a DataView + b. TdaChildSDACStoredProc - TMSStoredProc descendant that can be a child of a DataView + + 3. TdaSDACSession + - descendant of TppSession + - implements GetDatabaseNames, GetTableNames, etc. + + 4. TdaSDACDataSet + - descendant of TppDataSet + - implements GetFieldNames for SQL + + 5. TdaSDACQueryDataView + - descendant of TppQueryDataView + - uses the above classes to create the required + Query -> DataSource -> Pipeline -> Report connection + - uses the TdaSQL object built by the QueryWizard to assign + SQL to the TSDACQuery etc. + } + + { TdaChildSDACQuery } + TdaChildSDACQuery = class(TMSQuery) + public + function HasParent: Boolean; override; + end; {class, TdaChildSDACQuery} + + { TdaChildSDACTable } + TdaChildSDACTable = class(TMSTable) + public + function HasParent: Boolean; override; + end; {class, TdaChildSDACTable} + + { TdaChildSDACStoredProc } + TdaChildSDACStoredProc = class(TMSStoredProc) + public + function HasParent: Boolean; override; + end; {class, TdaChildSDACStoredProc} + + { TdaSDACSession } + TdaSDACSession = class(TdaSession) + private + + procedure AddDatabase(aDatabase: TComponent); + + protected + procedure SetDataOwner(aDataOwner: TComponent); override; + + public + class function ClassDescription: String; override; + class function DataSetClass: TdaDataSetClass; override; + class function DatabaseClass: TComponentClass; override; + + procedure GetDatabaseNames(aList: TStrings); override; + function GetDatabaseType(const aDatabaseName: String): TppDatabaseType; override; + procedure GetTableNames(const aDatabaseName: String; aList: TStrings); override; + function ValidDatabaseTypes: TppDatabaseTypes; override; + end; {class, TdaSDACSession} + + { TdaSDACDataSet } + TdaSDACDataSet = class(TdaDataSet) + private + FQuery: TMSQuery; + FConnection: TMSConnection; + + function GetQuery: TMSQuery; + + protected + procedure BuildFieldList; override; + function GetActive: Boolean; override; + procedure SetActive(Value: Boolean); override; + procedure SetDatabase(aDatabase: TComponent); override; + procedure SetDataName(const aDataName: String); override; + + property Query: TMSQuery read GetQuery; + + public + constructor Create(aOwner: TComponent); override; + destructor Destroy; override; + + class function ClassDescription: String; override; + + procedure GetFieldNamesForSQL(aList: TStrings; aSQL: TStrings); override; + procedure GetFieldsForSQL(aList: TList; aSQL: TStrings); override; + end; {class, TdaSDACDataSet} + + { TdaSDACQueryDataView } + TdaSDACQueryDataView = class(TdaQueryDataView) + private + FDataSource: TppChildDataSource; + FQuery: TdaChildSDACQuery; + + protected + procedure SQLChanged; override; + + public + constructor Create(aOwner: TComponent); override; + destructor Destroy; override; + + class function PreviewFormClass: TFormClass; override; + class function SessionClass: TClass; override; + + procedure Init; override; + procedure ConnectPipelinesToData; override; + + published + property DataSource: TppChildDataSource read FDataSource; + + end; {class, TdaSDACQueryDataView} + + + {global functions to access default SDAC connection} + function daGetDefaultSDACConnection: TMSConnection; + + {utility routines} + procedure daGetSDACConnectionNames(aList: TStrings); + function daGetSDACConnectionForName(aDatabaseName: String): TMSConnection; + function daSDACConnectToDatabase(aDatabaseName: String): Boolean; + + function daGetSDACConnectionList: TppComponentList; + + {Delphi design time registration} + procedure Register; + +implementation + +const + cDefaultConnection = 'DefaultSDACConnection'; + +var + FSDACConnection: TMSConnection; + FSDACConnectionList: TppComponentList; + + +{****************************************************************************** + * + ** R E G I S T E R + * +{******************************************************************************} + +procedure Register; +begin + {SDAC DataAccess Components} + RegisterNoIcon([TdaChildSDACQuery, TdaChildSDACTable, TdaChildSDACStoredProc]); + + {SDAC DataViews} + RegisterNoIcon([TdaSDACQueryDataView]); +end; + + +{****************************************************************************** + * + ** C H I L D S D A C D A T A A C C E S S C O M P O N E N T S + * +{******************************************************************************} + +{------------------------------------------------------------------------------} +{ TdaChildSDACQuery.HasParent } + +function TdaChildSDACQuery.HasParent: Boolean; +begin + Result := True; +end; {function, HasParent} + +{------------------------------------------------------------------------------} +{ TdaChildSDACTable.HasParent } + +function TdaChildSDACTable.HasParent: Boolean; +begin + Result := True; +end; {function, HasParent} + +{------------------------------------------------------------------------------} +{ TdaChildSDACStoredProc.HasParent } + +function TdaChildSDACStoredProc.HasParent: Boolean; +begin + Result := True; +end; {function, HasParent} + +{****************************************************************************** + * + ** S D A C S E S S I O N + * +{******************************************************************************} + +{------------------------------------------------------------------------------} +{ TdaSDACSession.ClassDescription } + +class function TdaSDACSession.ClassDescription: String; +begin + Result := 'SDACSession'; +end; {class function, ClassDescription} + +{------------------------------------------------------------------------------} +{ TdaSDACSession.DataSetClass } + +class function TdaSDACSession.DataSetClass: TdaDataSetClass; +begin + Result := TdaSDACDataSet; +end; {class function, DataSetClass} + +{------------------------------------------------------------------------------} +{ TdaSDACSession.DatabaseClass } + +class function TdaSDACSession.DatabaseClass: TComponentClass; +begin + Result := TMSConnection; +end; + +{------------------------------------------------------------------------------} +{ TdaSDACSession.GetDatabaseType } + +function TdaSDACSession.GetDatabaseType(const aDatabaseName: String): TppDatabaseType; +begin + Result := dtMSSQLServer; +end; {procedure, GetDatabaseType} + +{------------------------------------------------------------------------------} +{ TdaSDACSession.GetTableNames } + +procedure TdaSDACSession.GetTableNames(const aDatabaseName: String; aList: TStrings); + procedure GetTablesList(const Connection: TMSconnection; List: TStrings); + var + MDDS: TMSMetadata; + + procedure AddNamesToList; + var + NameFld: TStringField; + begin + MDDS.Open; + + NameFld := MDDS.FieldByName('TABLE_NAME') as TStringField; + while not MDDS.Eof do begin + List.Add(NameFld.Value); + MDDS.Next + end; + end; + + begin + if Connection = nil then + Exit; + + MDDS := nil; + try + MDDS := TMSMetadata.Create(nil); + MDDS.Connection := Connection; + MDDS.DatabaseName := MDDS.Connection.Database; + + MDDS.ObjectType := otTables; + AddNamesToList; + + MDDS.ObjectType := otViews; + AddNamesToList; + + if List is TStringList then + TStringList(List).Sort; + finally + MDDS.Free; + end; + end; + +begin + aList.Clear; + + {get list of table names from a table object} + if not daSDACConnectToDatabase(aDatabaseName) then Exit; + + GetTablesList(daGetSDACConnectionForName(aDatabaseName), aList); +end; {procedure, GetTableNames} + +{------------------------------------------------------------------------------} +{ TdaSDACSession.AddDatabase } + +procedure TdaSDACSession.AddDatabase(aDatabase: TComponent); +begin + if daGetSDACConnectionList.IndexOf(aDatabase) < 0 then + FSDACConnectionList.Add(aDatabase); +end; {procedure, AddDatabase} + +{------------------------------------------------------------------------------} +{ TdaSDACSession.GetDatabaseNames } + +procedure TdaSDACSession.GetDatabaseNames(aList: TStrings); +var + liIndex: Integer; +begin +// GetDatabasesList(FSDACConnection, aList); + + {call utility routine to get list of database names} + //daGetSDACConnectionNames(aList); + + daGetDatabaseObjectsFromOwner(TdaSessionClass(Self.ClassType), aList, DataOwner); + + for liIndex := 0 to aList.Count-1 do + if aList.Objects[liIndex] <> nil then + AddDatabase(TComponent(aList.Objects[liIndex]));//*) +end; {procedure, GetDatabaseNames} + +{------------------------------------------------------------------------------} +{ TdaSDACSession.SetDataOwner } + +procedure TdaSDACSession.SetDataOwner(aDataOwner: TComponent); +var + lList: TStringList; +begin + inherited SetDataOwner(aDataOwner); + + lList := TStringList.Create; + + GetDatabaseNames(lList); + + lList.Free; +end; {procedure, SetDataOwner} + +{------------------------------------------------------------------------------} +{ TdaSDACSession.ValidDatabaseTypes } + +function TdaSDACSession.ValidDatabaseTypes: TppDatabaseTypes; +begin + Result := [dtMSSQLServer]; +end; {function, ValidDatabaseTypes} + +{****************************************************************************** + * + ** S D A C D A T A S E T + * +{******************************************************************************} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.Create } + +constructor TdaSDACDataSet.Create(aOwner: TComponent); +begin + inherited Create(aOwner); + + FQuery := nil; +end; {constructor, Create} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.Destroy } + +destructor TdaSDACDataSet.Destroy; +begin + FQuery.Free; + + inherited Destroy; +end; {destructor, Destroy} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.ClassDescription } + +class function TdaSDACDataSet.ClassDescription: String; +begin + Result := 'SDACDataSet'; +end; {class function, ClassDescription} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.GetActive } + +function TdaSDACDataSet.GetActive: Boolean; +begin + Result := GetQuery.Active +end; {function, GetActive} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.SetActive } + +procedure TdaSDACDataSet.SetActive(Value: Boolean); +begin + GetQuery.Active := Value; +end; {procedure, SetActive} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.GetQuery } + +function TdaSDACDataSet.GetQuery: TMSQuery; +begin + {create SDACDataSet, if needed} + if (FQuery = nil) then + FQuery := TMSQuery.Create(Self); + + Result := FQuery; +end; {procedure, GetQuery} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.SetDatabase } + +procedure TdaSDACDataSet.SetDatabase(aDatabase: TComponent); +begin + inherited SetDatabase(aDatabase); + + {table cannot be active to set database property} + if GetQuery.Active then + FQuery.Active := False; + + FConnection := (aDatabase as TMSConnection); + {get SDAC Connection for name} + FQuery.Connection := FConnection; +end; {procedure, SetDatabaseName} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.SetDataName } + +procedure TdaSDACDataSet.SetDataName(const aDataName: String); +begin + inherited SetDataName(aDataName); + + {dataset cannot be active to set data name} + if GetQuery.Active then + FQuery.Active := False; + + {construct an SQL statment that returns an empty result set, + this is used to get the field information } + FQuery.SQL.Text := 'SELECT * FROM ' + aDataName + + ' WHERE ''c'' <> ''c'' '; +end; {procedure, SetDataName} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.BuildFieldList } + +procedure TdaSDACDataSet.BuildFieldList; +var + liIndex: Integer; + lQueryField: TField; + lField: TppField; +begin + inherited BuildFieldList; + + + {set table to active} + if not(GetQuery.Active) then + FQuery.Active := True; + + {create TppField objects for each field in the table} + for liIndex := 0 to FQuery.FieldCount - 1 do begin + lQueryField := FQuery.Fields[liIndex]; + + lField := TppField.Create(nil); + + lField.TableName := DataName; + lField.FieldName := lQueryField.FieldName; + lField.DataType := ppConvertFieldType(lQueryField.DataType); + + AddField(lField); + end; +end; {function, BuildFieldList} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.GetFieldNamesForSQL } + +procedure TdaSDACDataSet.GetFieldNamesForSQL(aList: TStrings; aSQL: TStrings); +var + lQuery: TMSQuery; +begin + aList.Clear; + + {create a temporary query} + lQuery := TMSQuery.Create(Self); + + {set the database and SQL properties} + lQuery.Connection := FConnection; + lQuery.SQL := aSQL; + + {get the field names} + lQuery.GetFieldNames(aList); + + lQuery.Free; +end; {procedure, GetFieldNamesForSQL} + +{------------------------------------------------------------------------------} +{ TdaSDACDataSet.GetFieldsForSQL } + +procedure TdaSDACDataSet.GetFieldsForSQL(aList: TList; aSQL: TStrings); +var + lQuery: TMSQuery; + lQueryField: TField; + lField: TppField; + liIndex: Integer; +begin + aList.Clear; + + {create a temporary query} + lQuery := TMSQuery.Create(Self); + + {assign databae and SQL properties} + lQuery.Connection := FConnection; + lQuery.SQL := aSQL; + + {set query to active} + lQuery.Active := True; + + {create a TppField object for each field in the query} + for liIndex := 0 to lQuery.FieldCount - 1 do begin + lQueryField := lQuery.Fields[liIndex]; + + lField := TppField.Create(nil); + + lField.FieldName := lQueryField.FieldName; + lField.DataType := ppConvertFieldType(lQueryField.DataType); + + aList.Add(lField); + end; + + lQuery.Free; +end; {procedure, GetFieldsForSQL} + + + +{****************************************************************************** + * + ** S D A C Q U E R Y D A T A V I E W + * +{******************************************************************************} + +{------------------------------------------------------------------------------} +{ TdaSDACQueryDataView.Create } + +constructor TdaSDACQueryDataView.Create(aOwner: TComponent); +begin + + inherited Create(aOwner); + + {notes: 1. must use ChildQuery, ChildDataSource, ChildPipeline etc. + 2. use Self as owner for Query, DataSource etc. + 3. do NOT assign a Name } + + FQuery := TdaChildSDACQuery.Create(Self); + + FDataSource := TppChildDataSource.Create(Self); + FDataSource.DataSet := FQuery; + +end; {constructor, Create} + +{------------------------------------------------------------------------------} +{ TdaSDACQueryDataView.Destroy } + +destructor TdaSDACQueryDataView.Destroy; +begin + FDataSource.Free; + FQuery.Free; + + inherited Destroy; + +end; {destructor, Destroy} + +{------------------------------------------------------------------------------} +{ TdaSDACQueryDataView.PreviewFormClass } + +class function TdaSDACQueryDataView.PreviewFormClass: TFormClass; +begin + Result := TFormClass(GetClass('TdaPreviewDataDialog')); +end; {class function, PreviewFormClass} + +{------------------------------------------------------------------------------} +{ TdaSDACQueryDataView.SessionClass } + +class function TdaSDACQueryDataView.SessionClass: TClass; +begin + Result := TdaSDACSession; +end; {class function, SessionClass} + +{------------------------------------------------------------------------------} +{ TdaSDACQueryDataView.ConnectPipelinesToData } + +procedure TdaSDACQueryDataView.ConnectPipelinesToData; +begin + + if DataPipelineCount = 0 then Exit; + + {need to reconnect here} + TppDBPipeline(DataPipelines[0]).DataSource := FDataSource; + +end; {procedure, ConnectPipelinesToData} + +{------------------------------------------------------------------------------} +{ TdaSDACQueryDataView.Init } + +procedure TdaSDACQueryDataView.Init; +var + lDataPipeline: TppChildDBPipeline; + +begin + + inherited Init; + + if DataPipelineCount > 0 then Exit; + + {note: DataView's owner must own the DataPipeline } + lDataPipeline := TppChildDBPipeline(ppComponentCreate(Self, TppChildDBPipeline)); + lDataPipeline.DataSource := FDataSource; + + lDataPipeline.AutoCreateFields := False; + + {add DataPipeline to the dataview } + lDataPipeline.DataView := Self; + +end; {procedure, Init} + +{------------------------------------------------------------------------------} +{ TdaSDACQueryDataView.SQLChanged } + +procedure TdaSDACQueryDataView.SQLChanged; +begin + + if FQuery.Active then + FQuery.Close; + + FQuery.Connection := daGetSDACConnectionForName(SQL.DatabaseName); + FQuery.SQL := SQL.MagicSQLText; + +end; {procedure, SQLChanged} + + +{****************************************************************************** + * + ** P R O C E D U R E S A N D F U N C T I O N S + * +{******************************************************************************} + +{------------------------------------------------------------------------------} +{ daGetDefaultSDACConnection } + +function daGetDefaultSDACConnection: TMSConnection; +begin + {create the default Connection, if needed} + if (FSDACConnection = nil) then begin + {create default SDAC Connection} + FSDACConnection := TMSConnection.Create(nil); + FSDACConnection.Name := cDefaultConnection; + end; + + Result := FSDACConnection; +end; {function, daGetDefaultSDACConnection} + +{------------------------------------------------------------------------------} +{ daGetSDACConnectionNames } + +procedure daGetSDACConnectionNames(aList: TStrings); +begin +end; {procedure, daGetSDACConnectionNames} + +{------------------------------------------------------------------------------} +{ daGetSDACConnectionForName } + +function daGetSDACConnectionForName(aDatabaseName: String): TMSConnection; +var + liIndex: Integer; +begin + Result := nil; + + liIndex := 0; + + {check for a database object with this name} + while (Result = nil) and (liIndex < daGetSDACConnectionList.Count) do + begin + if (AnsiCompareStr(FSDACConnectionList[liIndex].Name, aDatabaseName) = 0) or + (AnsiCompareStr(TMSConnection(FSDACConnectionList[liIndex]).Server, aDatabaseName) = 0) + then + Result := TMSConnection(FSDACConnectionList[liIndex]); + Inc(liIndex); + end; + + if (Result <> nil) then + Exit; + + {use the default database object} + Result := daGetDefaultSDACConnection; + + {set DatabaseName property, if needed} + if (Result.Server <> aDatabaseName) then begin + if Result.Connected then + Result.Connected := False; + Result.Server := aDatabaseName; + end; +end; {function, daGetSDACConnectionForName} + +{------------------------------------------------------------------------------} +{ daSDACConnectToDatabase } + +function daSDACConnectToDatabase(aDatabaseName: String): Boolean; +var + lConnection: TMSConnection; +begin + Result := False; + + lConnection := daGetSDACConnectionForName(aDatabaseName); + + if (lConnection = nil) then + Exit; + + if not lConnection.Connected then begin + if (lConnection = daGetDefaultSDACConnection) then + lConnection.Connected := True + else + lConnection.Connected := True; + end; + + Result := lConnection.Connected; +end; {function, daSDACConnectToDatabase} + + +{------------------------------------------------------------------------------} +{ daGetSDACConnectionList } + +function daGetSDACConnectionList: TppComponentList; +begin + if (FSDACConnectionList = nil) then + FSDACConnectionList := TppComponentList.Create(nil); + + Result := FSDACConnectionList; +end; {function, daGetSDACConnectionList} + + +initialization + {register the SDAC descendant classes} + RegisterClasses([TdaChildSDACQuery, TdaChildSDACTable, TdaChildSDACStoredProc]); + + {register DADE descendant session, dataset, dataview} + daRegisterSession(TdaSDACSession); + daRegisterDataSet(TdaSDACDataSet); + daRegisterDataView(TdaSDACQueryDataView); + + {initialize internal reference variables} + FSDACConnection := nil; + FSDACConnectionList := nil; + +finalization + {free the default connection object} + FSDACConnection.Free; + FSDACConnectionList.Free; + + {unregister the SDAC descendant classes} + UnRegisterClasses([TdaChildSDACQuery, TdaChildSDACTable, TdaChildSDACStoredProc]); + + {unregister DADE descendant the session, dataset, dataview} + daUnRegisterSession(TdaSDACSession); + daUnRegisterDataSet(TdaSDACDataSet); + daUnRegisterDataView(TdaSDACQueryDataView); +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/myEURpt.dfm b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/myEURpt.dfm new file mode 100644 index 0000000..b6ccbcd --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/myEURpt.dfm @@ -0,0 +1,1159 @@ +object myEndUserSolution: TmyEndUserSolution + Left = 244 + Top = 44 + AutoScroll = False + Caption = 'EndUser: MSSQLServer via SDAC' + ClientHeight = 579 + ClientWidth = 427 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Icon.Data = { + 0000010001002020100000000000E80200001600000028000000200000004000 + 0000010004000000000080020000000000000000000000000000000000000000 + 0000000080000080000000808000800000008000800080800000C0C0C0008080 + 80000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000884000000000000 + 000083BBBBB34003BBBBB800000000000004BBBBBBBB308BBBBBBB0000000000 + 00003BBBBBB3403BBBBBB3000000000000000BBBBBB404BBBBBB300000000000 + 000003BBBBB008BBBBBB800000000000000003BBBBB003BBBBBB000000000000 + 000003BBBBB48BBBBBB3000000000000000003BBBBBBBBBBBB30000000000000 + 000003BBBBBBBBBBB800000000000000000003BBBBB33BBBBB80000000000000 + 000003BBBBB003BBBBB4000000000000000003BBBBB003BBBBB8000000000000 + 000003BBBBB003BBBBB300000000000000000BBBBBB84BBBBBB8000000000000 + 00043BBBBBBBBBBBBBB00000000000000004BBBBBBBBBBBBB340000000000000 + 0000433888883338400000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFF00 + 603FFE00403FFF00403FFF80807FFF81807FFF8180FFFF8000FFFF8001FFFF80 + 03FFFF8001FFFF8180FFFF8180FFFF8180FFFF8000FFFE0001FFFE0001FFFF00 + 07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + OldCreateOrder = True + Position = poScreenCenter + ShowHint = True + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Shape8: TShape + Left = 181 + Top = 454 + Width = 2 + Height = 28 + Brush.Style = bsClear + Pen.Width = 2 + Shape = stRoundRect + Visible = False + end + object Shape20: TShape + Left = 181 + Top = 362 + Width = 2 + Height = 25 + Brush.Style = bsClear + Pen.Width = 2 + Shape = stRoundRect + Visible = False + end + object Shape7: TShape + Left = 222 + Top = 327 + Width = 38 + Height = 2 + Brush.Style = bsClear + Pen.Width = 2 + Shape = stRoundRect + Visible = False + end + object Shape26: TShape + Left = 181 + Top = 258 + Width = 2 + Height = 81 + Brush.Style = bsClear + Pen.Width = 2 + Shape = stRoundRect + Visible = False + end + object Shape25: TShape + Left = 93 + Top = 220 + Width = 56 + Height = 2 + Brush.Style = bsClear + Pen.Width = 2 + Shape = stRoundRect + Visible = False + end + object Shape24: TShape + Left = 94 + Top = 263 + Width = 56 + Height = 2 + Brush.Style = bsClear + Pen.Width = 2 + Shape = stRoundRect + Visible = False + end + object Shape1: TShape + Left = 254 + Top = 295 + Width = 103 + Height = 72 + Brush.Color = clRed + Shape = stRoundRect + Visible = False + end + object Shape4: TShape + Left = 7 + Top = 246 + Width = 103 + Height = 72 + Brush.Color = clYellow + Shape = stRoundRect + Visible = False + end + object Shape11: TShape + Left = 253 + Top = 205 + Width = 103 + Height = 72 + Brush.Color = clNavy + Shape = stRoundRect + Visible = False + end + object Label6: TLabel + Left = 277 + Top = 210 + Width = 55 + Height = 13 + Caption = 'Database' + Color = clBlack + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + Transparent = True + Visible = False + end + object Shape12: TShape + Left = 254 + Top = 226 + Width = 102 + Height = 1 + Brush.Color = clBlack + Visible = False + end + object Shape9: TShape + Left = 130 + Top = 386 + Width = 103 + Height = 72 + Brush.Color = clTeal + Shape = stRoundRect + Visible = False + end + object Label5: TLabel + Left = 137 + Top = 391 + Width = 89 + Height = 13 + Caption = 'Data Dictionary' + Color = clWhite + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + Transparent = True + Visible = False + end + object Shape10: TShape + Left = 131 + Top = 407 + Width = 102 + Height = 1 + Visible = False + end + object Shape6: TShape + Left = 130 + Top = 294 + Width = 103 + Height = 72 + Brush.Color = clBlue + Shape = stRoundRect + Visible = False + end + object Label7: TLabel + Left = 156 + Top = 299 + Width = 51 + Height = 13 + Caption = 'Designer' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + Visible = False + end + object Shape5: TShape + Left = 131 + Top = 315 + Width = 101 + Height = 1 + Visible = False + end + object Label8: TLabel + Left = 43 + Top = 251 + Width = 31 + Height = 13 + Caption = 'Items' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + Visible = False + end + object Shape3: TShape + Left = 8 + Top = 267 + Width = 101 + Height = 1 + Visible = False + end + object Label1: TLabel + Left = 286 + Top = 300 + Width = 39 + Height = 13 + Caption = 'Report' + Color = clBlack + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + Transparent = True + Visible = False + end + object Shape2: TShape + Left = 255 + Top = 316 + Width = 101 + Height = 1 + Brush.Color = clBlack + Visible = False + end + object Shape15: TShape + Left = 8 + Top = 165 + Width = 103 + Height = 72 + Brush.Color = clLime + Shape = stRoundRect + Visible = False + end + object Label2: TLabel + Left = 38 + Top = 170 + Width = 42 + Height = 13 + Caption = 'Folders' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + Visible = False + end + object Shape16: TShape + Left = 8 + Top = 185 + Width = 102 + Height = 1 + Visible = False + end + object Shape22: TShape + Left = 130 + Top = 205 + Width = 103 + Height = 72 + Brush.Color = clFuchsia + Shape = stRoundRect + Visible = False + end + object Label10: TLabel + Left = 158 + Top = 210 + Width = 47 + Height = 13 + Caption = 'Explorer' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + Visible = False + end + object Shape23: TShape + Left = 131 + Top = 226 + Width = 101 + Height = 1 + Visible = False + end + object Shape29: TShape + Left = 66 + Top = 467 + Width = 2 + Height = 16 + Brush.Style = bsClear + Pen.Width = 2 + Shape = stRoundRect + Visible = False + end + object Shape18: TShape + Left = 16 + Top = 477 + Width = 103 + Height = 72 + Brush.Color = clAqua + Shape = stRoundRect + Visible = False + end + object Shape17: TShape + Left = 291 + Top = 467 + Width = 2 + Height = 17 + Brush.Style = bsClear + Pen.Width = 2 + Shape = stRoundRect + Visible = False + end + object Shape13: TShape + Left = 132 + Top = 478 + Width = 103 + Height = 72 + Brush.Color = clAqua + Shape = stRoundRect + Visible = False + end + object Label3: TLabel + Left = 166 + Top = 483 + Width = 34 + Height = 13 + Caption = 'Fields' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + Visible = False + end + object Shape14: TShape + Left = 133 + Top = 499 + Width = 102 + Height = 1 + Visible = False + end + object Label9: TLabel + Left = 48 + Top = 482 + Width = 39 + Height = 13 + Caption = 'Tables' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + Visible = False + end + object Shape19: TShape + Left = 17 + Top = 498 + Width = 102 + Height = 1 + Visible = False + end + object Shape21: TShape + Left = 245 + Top = 477 + Width = 103 + Height = 72 + Brush.Color = clAqua + Shape = stRoundRect + Visible = False + end + object Shape27: TShape + Left = 246 + Top = 498 + Width = 102 + Height = 1 + Visible = False + end + object Label4: TLabel + Left = 280 + Top = 482 + Width = 30 + Height = 13 + Caption = 'Joins' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + Visible = False + end + object Shape28: TShape + Left = 67 + Top = 467 + Width = 226 + Height = 2 + Brush.Style = bsClear + Pen.Width = 2 + Shape = stRoundRect + Visible = False + end + object btnLaunch: TButton + Left = 342 + Top = 165 + Width = 75 + Height = 25 + Caption = 'Launch' + TabOrder = 0 + OnClick = btnLaunchClick + end + object Memo1: TMemo + Left = 7 + Top = 5 + Width = 411 + Height = 150 + Lines.Strings = ( + 'End-User Reporting using MSSQLServer with the SDAC' + + '----------------------------------------------------------------' + + '---------------------------') + ReadOnly = True + TabOrder = 1 + end + object pnlStatusBar: TPanel + Left = 0 + Top = 561 + Width = 427 + Height = 18 + Align = alBottom + Alignment = taLeftJustify + TabOrder = 2 + end + object btCreate: TButton + Left = 120 + Top = 165 + Width = 75 + Height = 25 + Caption = 'Create' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + OnClick = btCreateClick + end + object btDrop: TButton + Left = 200 + Top = 165 + Width = 75 + Height = 25 + Caption = 'Drop' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 4 + OnClick = btDropClick + end + object seDatabase: TMSConnection + Database = 'SDACDemos' + Authentication = auServer + Username = 'Sa' + Server = 'server' + Left = 289 + Top = 233 + end + object tblTable: TMSTable + TableName = 'RB_TABLE' + Connection = seDatabase + Left = 21 + Top = 508 + end + object dsTable: TDataSource + DataSet = tblTable + Left = 52 + Top = 508 + end + object plTable: TppDBPipeline + DataSource = dsTable + UserName = 'Table' + Visible = False + Left = 85 + Top = 508 + end + object tblField: TMSTable + TableName = 'RB_FIELD' + Connection = seDatabase + Left = 137 + Top = 509 + end + object dsField: TDataSource + DataSet = tblField + Left = 169 + Top = 509 + end + object plField: TppDBPipeline + DataSource = dsField + UserName = 'Field' + Visible = False + Left = 201 + Top = 508 + end + object ppDataDictionary: TppDataDictionary + AutoJoin = True + BuilderSettings.DatabaseName = 'seDatabase' + BuilderSettings.SessionType = 'SDACSession' + FieldFieldNames.AutoSearch = 'AUTOSEARCH' + FieldFieldNames.DataType = 'DATATYPE' + FieldFieldNames.FieldName = 'FIELD_NAME' + FieldFieldNames.FieldAlias = 'FIELD_ALIAS' + FieldFieldNames.Mandatory = 'MANDATORY' + FieldFieldNames.Searchable = 'SEARCHABLE' + FieldFieldNames.Selectable = 'SORTABLE' + FieldFieldNames.Sortable = 'SORTABLE' + FieldFieldNames.TableName = 'table_name' + FieldPipeline = plField + JoinFieldNames.TableName1 = 'TABLE_NAME1' + JoinFieldNames.TableName2 = 'TABLE_NAME2' + JoinFieldNames.JoinType = 'JOIN_TYPE' + JoinFieldNames.FieldNames1 = 'FIELD_NAMES1' + JoinFieldNames.FieldNames2 = 'FIELD_NAMES2' + JoinFieldNames.Operators = 'OPERATORS' + JoinPipeline = plJoin + TableFieldNames.TableName = 'TABLE_NAME' + TableFieldNames.TableAlias = 'TABLE_ALIAS' + TablePipeline = plTable + UserName = 'DataDictionary' + UseTableOwnerName = True + ValidateFieldNames = False + ValidateTableNames = False + Left = 169 + Top = 416 + end + object ppDesigner: TppDesigner + AllowDataSettingsChange = True + Caption = 'ReportBuilder Pro' + DataSettings.DatabaseName = 'seDatabase' + DataSettings.SessionType = 'SDACSession' + DataSettings.AllowEditSQL = True + DataSettings.DatabaseType = dtMSSQLServer + DataSettings.DataDictionary = ppDataDictionary + DataSettings.GuidCollationType = gcString + DataSettings.IsCaseSensitive = True + DataSettings.SQLType = sqSQL1 + DataSettings.UseDataDictionary = True + Position = poScreenCenter + Report = ppReport + IniStorageType = 'IniFile' + IniStorageName = '($WINSYS)\RBuilder.ini' + WindowHeight = 400 + WindowLeft = 100 + WindowTop = 50 + WindowWidth = 600 + Left = 170 + Top = 323 + end + object tblItem: TMSTable + TableName = 'RB_ITEM' + Connection = seDatabase + Left = 14 + Top = 277 + end + object dsItem: TDataSource + DataSet = tblItem + Left = 46 + Top = 278 + end + object plItem: TppDBPipeline + DataSource = dsItem + RefreshAfterPost = True + UserName = 'plItem' + Visible = False + Left = 77 + Top = 278 + end + object ppReport: TppReport + AutoStop = False + DataPipeline = SDACQueryDataView1.plDept + PrinterSetup.BinName = 'Default' + PrinterSetup.DocumentName = 'Report' + PrinterSetup.PaperName = 'Letter 8 1/2 x 11 in' + PrinterSetup.PrinterName = 'Default' + PrinterSetup.mmMarginBottom = 6350 + PrinterSetup.mmMarginLeft = 6350 + PrinterSetup.mmMarginRight = 6350 + PrinterSetup.mmMarginTop = 6350 + PrinterSetup.mmPaperHeight = 279401 + PrinterSetup.mmPaperWidth = 215900 + PrinterSetup.PaperSize = 1 + Template.DatabaseSettings.DataPipeline = plItem + Template.DatabaseSettings.Name = 'Dept' + Template.DatabaseSettings.NameField = 'Name' + Template.DatabaseSettings.TemplateField = 'Template' + Template.FileName = 'D:\NDF\Delphi\odac3\Demos\ReportBuilder\Reports\Dept.rtm' + Template.SaveTo = stDatabase + Units = utScreenPixels + DeviceType = 'Screen' + OutlineSettings.CreateNode = True + OutlineSettings.CreatePageNodes = True + OutlineSettings.Enabled = False + OutlineSettings.Visible = False + TextSearchSettings.DefaultString = '' + TextSearchSettings.Enabled = False + Left = 289 + Top = 326 + Version = '9.01' + mmColumnWidth = 0 + DataPipelineName = 'plDept' + object ppTitleBand1: TppTitleBand + mmBottomOffset = 0 + mmHeight = 13229 + mmPrintPosition = 0 + object ppLabel1: TppLabel + UserName = 'Label1' + Border.BorderPositions = [] + Border.Color = clBlack + Border.Style = psSolid + Border.Visible = False + Border.Weight = 1.000000000000000000 + Caption = 'Departaments' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Name = 'Arial' + Font.Size = 20 + Font.Style = [fsBold, fsItalic] + Transparent = True + mmHeight = 8467 + mmLeft = 77788 + mmTop = 1852 + mmWidth = 47625 + BandType = 1 + end + object ppSystemVariable1: TppSystemVariable + UserName = 'SystemVariable1' + Border.BorderPositions = [] + Border.Color = clBlack + Border.Style = psSolid + Border.Visible = False + Border.Weight = 1.000000000000000000 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'Arial' + Font.Size = 8 + Font.Style = [] + Transparent = True + mmHeight = 3704 + mmLeft = 188384 + mmTop = 529 + mmWidth = 14288 + BandType = 1 + end + end + object ppHeaderBand1: TppHeaderBand + mmBottomOffset = 0 + mmHeight = 7673 + mmPrintPosition = 0 + object ppLabel2: TppLabel + UserName = 'Label2' + Border.BorderPositions = [] + Border.Color = clBlack + Border.Style = psSolid + Border.Visible = False + Border.Weight = 1.000000000000000000 + Caption = 'Number' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'Arial' + Font.Size = 10 + Font.Style = [fsBold] + Transparent = True + mmHeight = 4233 + mmLeft = 7673 + mmTop = 529 + mmWidth = 13229 + BandType = 0 + end + object ppLabel3: TppLabel + UserName = 'Label3' + Border.BorderPositions = [] + Border.Color = clBlack + Border.Style = psSolid + Border.Visible = False + Border.Weight = 1.000000000000000000 + Caption = 'Name' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'Arial' + Font.Size = 10 + Font.Style = [fsBold] + Transparent = True + mmHeight = 4233 + mmLeft = 26988 + mmTop = 529 + mmWidth = 9790 + BandType = 0 + end + object ppLabel4: TppLabel + UserName = 'Label4' + Border.BorderPositions = [] + Border.Color = clBlack + Border.Style = psSolid + Border.Visible = False + Border.Weight = 1.000000000000000000 + Caption = 'Location' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'Arial' + Font.Size = 10 + Font.Style = [fsBold] + Transparent = True + mmHeight = 4233 + mmLeft = 81492 + mmTop = 794 + mmWidth = 14552 + BandType = 0 + end + object ppShape1: TppShape + UserName = 'Shape1' + mmHeight = 265 + mmLeft = 4498 + mmTop = 6085 + mmWidth = 191294 + BandType = 0 + end + end + object ppDetailBand1: TppDetailBand + mmBottomOffset = 0 + mmHeight = 6615 + mmPrintPosition = 0 + object ppDBText1: TppDBText + UserName = 'DBText1' + Border.BorderPositions = [] + Border.Color = clBlack + Border.Style = psSolid + Border.Visible = False + Border.Weight = 1.000000000000000000 + DataField = 'DEPTNO' + DataPipeline = SDACQueryDataView1.plDept + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'Arial' + Font.Size = 10 + Font.Style = [] + Transparent = True + DataPipelineName = 'plDept' + mmHeight = 4233 + mmLeft = 7673 + mmTop = 1323 + mmWidth = 17198 + BandType = 4 + end + object ppDBText2: TppDBText + UserName = 'DBText2' + Border.BorderPositions = [] + Border.Color = clBlack + Border.Style = psSolid + Border.Visible = False + Border.Weight = 1.000000000000000000 + DataField = 'DNAME' + DataPipeline = SDACQueryDataView1.plDept + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'Arial' + Font.Size = 10 + Font.Style = [] + Transparent = True + DataPipelineName = 'plDept' + mmHeight = 4233 + mmLeft = 27252 + mmTop = 1323 + mmWidth = 52123 + BandType = 4 + end + object ppDBText3: TppDBText + UserName = 'DBText3' + Border.BorderPositions = [] + Border.Color = clBlack + Border.Style = psSolid + Border.Visible = False + Border.Weight = 1.000000000000000000 + DataField = 'LOC' + DataPipeline = SDACQueryDataView1.plDept + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Name = 'Arial' + Font.Size = 10 + Font.Style = [] + Transparent = True + DataPipelineName = 'plDept' + mmHeight = 4233 + mmLeft = 81756 + mmTop = 1323 + mmWidth = 31750 + BandType = 4 + end + end + object daDataModule1: TdaDataModule + object SDACQueryDataView1: TdaSDACQueryDataView + UserName = 'Query_Dept' + Height = 305 + Left = 10 + NameColumnWidth = 105 + SizeColumnWidth = 35 + SortMode = 0 + Top = 10 + TypeColumnWidth = 52 + Width = 242 + AutoSearchTabOrder = 0 + object plDept: TppChildDBPipeline + AutoCreateFields = False + UserName = 'plDept' + Left = 200 + Top = 272 + object ppField1: TppField + FieldAlias = 'Deptno' + FieldName = 'DEPTNO' + FieldLength = 0 + DataType = dtInteger + DisplayWidth = 0 + Position = 0 + TableName = 'DEPT' + end + object ppField2: TppField + FieldAlias = 'Dname' + FieldName = 'DNAME' + FieldLength = 0 + DisplayWidth = 0 + Position = 1 + TableName = 'DEPT' + end + object ppField3: TppField + FieldAlias = 'Loc' + FieldName = 'LOC' + FieldLength = 0 + DisplayWidth = 0 + Position = 2 + TableName = 'DEPT' + end + end + object daSQL1: TdaSQL + DatabaseName = 'seDatabase' + DatabaseType = dtMSSQLServer + DataPipelineName = 'plDept' + LinkColor = clBlack + MaxSQLFieldAliasLength = 25 + SQLText.Strings = ( + 'SELECT DEPT.DEPTNO, DEPT.DNAME, DEPT.LOC' + 'FROM SCOTT.DEPT DEPT' + 'ORDER BY DEPT.DEPTNO') + SQLType = sqSQL1 + object TdaField + Alias = 'Deptno' + DataType = dtInteger + DisplayWidth = 0 + FieldAlias = 'Deptno' + FieldLength = 0 + FieldName = 'DEPTNO' + SQLFieldName = 'DEPTNO' + TableAlias = 'Dept' + TableName = 'DEPT' + TableSQLAlias = 'DEPT' + end + object TdaField + Alias = 'Dname' + DisplayWidth = 0 + FieldAlias = 'Dname' + FieldLength = 0 + FieldName = 'DNAME' + SQLFieldName = 'DNAME' + TableAlias = 'Dept' + TableName = 'DEPT' + TableSQLAlias = 'DEPT' + end + object TdaField + Alias = 'Loc' + DisplayWidth = 0 + FieldAlias = 'Loc' + FieldLength = 0 + FieldName = 'LOC' + SQLFieldName = 'LOC' + TableAlias = 'Dept' + TableName = 'DEPT' + TableSQLAlias = 'DEPT' + end + object TdaField + ChildType = 2 + Alias = 'Deptno' + DataType = dtInteger + DisplayWidth = 0 + FieldAlias = 'Deptno' + FieldLength = 0 + FieldName = 'DEPTNO' + SQLFieldName = 'DEPTNO' + TableAlias = 'Dept' + TableName = 'DEPT' + TableSQLAlias = 'DEPT' + end + object TdaTable + ChildType = 5 + Alias = 'Dept' + JoinType = dajtNone + OwnerName = 'SCOTT' + SQLAlias = 'DEPT' + TableAlias = 'Dept' + TableName = 'DEPT' + end + end + end + end + end + object tblFolder: TMSTable + TableName = 'RB_FOLDER' + Connection = seDatabase + Left = 12 + Top = 195 + end + object dsFolder: TDataSource + DataSet = tblFolder + Left = 43 + Top = 195 + end + object plFolder: TppDBPipeline + DataSource = dsFolder + RefreshAfterPost = True + UserName = 'plFolder' + Visible = False + Left = 75 + Top = 196 + end + object ppReportExplorer: TppReportExplorer + Designer = ppDesigner + FolderFieldNames.FolderId = 'FOLDER_ID' + FolderFieldNames.Name = 'FOLDER_NAME' + FolderFieldNames.ParentId = 'PARENT_ID' + FolderPipeline = plFolder + ItemFieldNames.Deleted = 'DELETED' + ItemFieldNames.FolderId = 'FOLDER_ID' + ItemFieldNames.ItemId = 'ITEM_ID' + ItemFieldNames.Modified = 'MODIFIED' + ItemFieldNames.Name = 'ITEM_NAME' + ItemFieldNames.Size = 'ITEM_SIZE' + ItemFieldNames.Template = 'TEMPLATE' + ItemFieldNames.ItemType = 'ITEM_TYPE' + ItemPipeline = plItem + FormCaption = 'Report Explorer' + FormIcon.Data = { + 0000010001002020100000000000E80200001600000028000000200000004000 + 0000010004000000000080020000000000000000000000000000000000000000 + 0000000080000080000000808000800000008000800080800000C0C0C0008080 + 80000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000884000000000000 + 000083BBBBB34003BBBBB800000000000004BBBBBBBB308BBBBBBB0000000000 + 00003BBBBBB3403BBBBBB3000000000000000BBBBBB404BBBBBB300000000000 + 000003BBBBB008BBBBBB800000000000000003BBBBB003BBBBBB000000000000 + 000003BBBBB48BBBBBB3000000000000000003BBBBBBBBBBBB30000000000000 + 000003BBBBBBBBBBB800000000000000000003BBBBB33BBBBB80000000000000 + 000003BBBBB003BBBBB4000000000000000003BBBBB003BBBBB8000000000000 + 000003BBBBB003BBBBB300000000000000000BBBBBB84BBBBBB8000000000000 + 00043BBBBBBBBBBBBBB00000000000000004BBBBBBBBBBBBB340000000000000 + 0000433888883338400000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFF00 + 603FFE00403FFF00403FFF80807FFF81807FFF8180FFFF8000FFFF8001FFFF80 + 03FFFF8001FFFF8180FFFF8180FFFF8180FFFF8000FFFE0001FFFE0001FFFF00 + 07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + FormPosition = poScreenCenter + FormHeight = 400 + FormLeft = 100 + FormTop = 50 + FormWidth = 600 + Left = 168 + Top = 235 + end + object tblJoin: TMSTable + TableName = 'RB_JOIN' + Connection = seDatabase + Left = 251 + Top = 510 + end + object dsJoin: TDataSource + DataSet = tblJoin + Left = 282 + Top = 511 + end + object plJoin: TppDBPipeline + DataSource = dsJoin + RefreshAfterPost = True + UserName = 'plJoin' + Visible = False + Left = 314 + Top = 510 + end + object sqCreate: TMSQuery + Connection = seDatabase + SQL.Strings = ( + 'CREATE TABLE [dbo].[RB_FIELD] (' + #9'[TABLE_NAME] [varchar] (60) NOT NULL ,' + #9'[FIELD_NAME] [varchar] (60) NOT NULL ,' + #9'[FIELD_ALIAS] [varchar] (60) NULL ,' + #9'[DATATYPE] [varchar] (60) NULL ,' + #9'[SELECTABLE] [varchar] (1) NULL ,' + #9'[SEARCHABLE] [varchar] (1) NULL ,' + #9'[SORTABLE] [varchar] (1) NULL ,' + #9'[AUTOSEARCH] [varchar] (1) NULL ,' + #9'[MANDATORY] [varchar] (1) NULL ' + ') ON [PRIMARY]' + '' + 'CREATE TABLE [dbo].[RB_FOLDER] (' + #9'[FOLDER_ID] [int] IDENTITY (1, 1) NOT NULL ,' + #9'[FOLDER_NAME] [char] (60) NULL ,' + #9'[PARENT_ID] [int] NULL ' + ') ON [PRIMARY]' + '' + 'CREATE TABLE [dbo].[RB_ITEM] (' + #9'[ITEM_ID] [int] IDENTITY (1, 1) NOT NULL ,' + #9'[FOLDER_ID] [int] NULL ,' + #9'[ITEM_NAME] [char] (60) NULL ,' + #9'[ITEM_SIZE] [int] NULL ,' + #9'[ITEM_TYPE] [int] NULL ,' + #9'[MODIFIED] [int] NULL ,' + #9'[DELETED] [int] NULL ,' + #9'[TEMPLATE] [text] NULL ' + ') ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]' + '' + 'CREATE TABLE [dbo].[RB_JOIN] (' + #9'[TABLE_NAME1] [varchar] (60) NOT NULL ,' + #9'[TABLE_NAME2] [varchar] (60) NOT NULL ,' + #9'[JOIN_TYPE] [varchar] (60) NULL ,' + #9'[FIELD_NAMES1] [varchar] (255) NULL ,' + #9'[OPERATORS] [varchar] (60) NULL ,' + #9'[FIELD_NAMES2] [varchar] (60) NULL ' + ') ON [PRIMARY]' + '' + 'CREATE TABLE [dbo].[RB_TABLE] (' + #9'[TABLE_NAME] [varchar] (60) NOT NULL ,' + #9'[TABLE_ALIAS] [varchar] (60) NULL ' + ') ON [PRIMARY]' + '' + '/*ALTER TABLE [dbo].[RB_FOLDER] WITH NOCHECK ADD ' + #9'CONSTRAINT [PK_RB_FOLDER] PRIMARY KEY CLUSTERED ' + #9'(' + #9#9'[FOLDER_ID]' + #9') ON [PRIMARY] ' + '' + 'ALTER TABLE [dbo].[RB_ITEM] WITH NOCHECK ADD ' + #9'CONSTRAINT [PK_RB_ITEM] PRIMARY KEY CLUSTERED ' + #9'(' + #9#9'[ITEM_ID]' + #9') ON [PRIMARY] ' + '' + 'ALTER TABLE [dbo].[RB_TABLE] WITH NOCHECK ADD ' + #9'CONSTRAINT [PK_RB_TABLE] PRIMARY KEY CLUSTERED ' + #9'(' + #9#9'[TABLE_NAME]' + #9') ON [PRIMARY] ' + '' + '*/') + Debug = True + Left = 8 + Top = 336 + end + object sqDrop: TMSQuery + Connection = seDatabase + SQL.Strings = ( + + 'if exists (select * from dbo.sysobjects where id = object_id(N'#39'[' + + 'dbo].[RB_FIELD]'#39') and OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + 'drop table [dbo].[RB_FIELD]' + '' + + 'if exists (select * from dbo.sysobjects where id = object_id(N'#39'[' + + 'dbo].[RB_FOLDER]'#39') and OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + 'drop table [dbo].[RB_FOLDER]' + '' + + 'if exists (select * from dbo.sysobjects where id = object_id(N'#39'[' + + 'dbo].[RB_ITEM]'#39') and OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + 'drop table [dbo].[RB_ITEM]' + '' + + 'if exists (select * from dbo.sysobjects where id = object_id(N'#39'[' + + 'dbo].[RB_JOIN]'#39') and OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + 'drop table [dbo].[RB_JOIN]' + '' + + 'if exists (select * from dbo.sysobjects where id = object_id(N'#39'[' + + 'dbo].[RB_TABLE]'#39') and OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + 'drop table [dbo].[RB_TABLE]') + Debug = True + Left = 40 + Top = 336 + end + object MyTable1: TMSTable + TableName = 'rb_folder' + Connection = seDatabase + Left = 12 + Top = 195 + end +end diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/myEURpt.pas b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/myEURpt.pas new file mode 100644 index 0000000..f454a3a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/myEURpt.pas @@ -0,0 +1,260 @@ + +////////////////////////////////////////////////// +// MS SQL Server Data Access Components +// Copyright © 1998,2000 Core Lab. All right reserved. +// ReportBuilder Report Demo +// Based on Digital Metaphors Corporation's demos +////////////////////////////////////////////////// + +unit myEURpt; + +interface + +{ By removing the 'x' which begins each of these compiler directives, + you can enable different functionality within the end-user reporting + solution. + + DADE - the data tab where queries can be created by the end-user + + BDE - BDE support for the Query Tools + + ADO - ADO support for the Query Tools + + IBExpress - Interbase Express support for the Query Tools + + + RAP - the calc tab, where calculations can be coded at run-time + (You must download and install a copy of the RAP beta in order + to enable this feature) + + CrossTab - adds the CrossTab component to the component palette in the + report designer. + + CheckBox - adds a checkbox component to the component palette in the + report designer. + + TeeChart - adds a teechart component to the report designer component + palette. This component works with the TeeChart delivered + with Delphi 3 and 4. It does NOT work with TeeChart 4.01, + which must be purchased from TeeMach. + + TeeChart401 - adds a teechart component for use with TeeChart 4.01 from + TeeMach. + + UseDesignPath - determines whether the path used by the Database + object on this form is replaced in the OnCreate event handler of + this form with the current path.} + +{$DEFINE DADE} {remove the 'x' to enable DADE} +{x$DEFINE BDE} {remove the 'x' to enable Borland Database Engine (BDE) } +{x$DEFINE ADO} {remove the 'x' to enable ADO} +{x$DEFINE IBExpress} {remove the 'x' to enable Interbase Express} +{$DEFINE SDAC} {remove the 'x' to enable MS SQL Server Data Access Components} +{$DEFINE CrossTab} {remove the 'x' to enable CrossTab} +{x$DEFINE RAP} {remove the 'x' to enable RAP} +{x$DEFINE CheckBox} {remove the 'x' to enable CheckBox} +{x$DEFINE TeeChart} {remove the 'x' to enable standard TeeChart} +{x$DEFINE TeeChart401} {remove the 'x' to enable TeeChart 4.01} +{x$DEFINE UseDesignPath} {remove the 'x' to use the design-time settings of Database object on this form} + +uses + +{$IFDEF DADE} + daDatMan, +{$ENDIF} + +{$IFDEF BDE} + daDBBDE, +{$ENDIF} + +{$IFDEF ADO} + daADO, +{$ENDIF} + +{$IFDEF IBExpress} + daIBExpress, +{$ENDIF} + +{$IFDEF SDAC} + daSDAC, +{$ENDIF} + +{$IFDEF CrossTab} + ppCTDsgn, +{$ENDIF} + +{$IFDEF RAP} + raIDE, +{$ENDIF} + +{$IFDEF CheckBox} + myChkBox, +{$ENDIF} + +{$IFDEF TeeChart} + ppChrt, ppChrtDB, +{$ENDIF} + +{$IFDEF TeeChart401} + ppChrt, ppChrtDP, +{$ENDIF} + + Windows, Classes, Controls, SysUtils, Forms, StdCtrls, ExtCtrls, Dialogs, Graphics, DB, ppComm, + ppCache, ppClass, ppProd, ppReport, ppRptExp, ppBands, ppEndUsr, ppDBPipe, ppDB, ppPrnabl, + ppStrtch, ppDsgnDB, ppTypes, MSAccess, OLEDBAccess, ppFormWrapper, daDataView, daQueryDataView, ppModule, + daDataModule, ppCtrls, ppVar, ppRelatv, MemDS, DBAccess, ppViewr, daDatMod, + daDataVw, daQuery, daQClass, ppDBBDE, SdacVcl; + +type + TmyEndUserSolution = class(TForm) + Shape11: TShape; + Label6: TLabel; + Shape12: TShape; + seDatabase: TMSConnection; + Shape9: TShape; + Label5: TLabel; + Shape10: TShape; + tblTable: TMSTable; + dsTable: TDataSource; + plTable: TppDBPipeline; + tblField: TMSTable; + dsField: TDataSource; + plField: TppDBPipeline; + ppDataDictionary: TppDataDictionary; + Shape6: TShape; + Label7: TLabel; + Shape5: TShape; + ppDesigner: TppDesigner; + Shape4: TShape; + Label8: TLabel; + Shape3: TShape; + tblItem: TMSTable; + dsItem: TDataSource; + plItem: TppDBPipeline; + ppReport: TppReport; + Label1: TLabel; + Shape1: TShape; + Shape2: TShape; + Shape15: TShape; + Label2: TLabel; + Shape16: TShape; + tblFolder: TMSTable; + dsFolder: TDataSource; + plFolder: TppDBPipeline; + btnLaunch: TButton; + ppReportExplorer: TppReportExplorer; + Shape22: TShape; + Label10: TLabel; + Shape23: TShape; + Shape24: TShape; + Shape25: TShape; + Shape26: TShape; + Memo1: TMemo; + pnlStatusBar: TPanel; + Shape7: TShape; + Shape20: TShape; + Shape29: TShape; + Shape18: TShape; + Shape17: TShape; + Shape8: TShape; + Shape13: TShape; + Label3: TLabel; + Shape14: TShape; + Label9: TLabel; + Shape19: TShape; + Shape21: TShape; + Shape27: TShape; + Label4: TLabel; + Shape28: TShape; + tblJoin: TMSTable; + dsJoin: TDataSource; + plJoin: TppDBPipeline; + ppHeaderBand1: TppHeaderBand; + ppDetailBand1: TppDetailBand; + btCreate: TButton; + btDrop: TButton; + sqCreate: TMSQuery; + sqDrop: TMSQuery; + ppLabel1: TppLabel; + ppDBText1: TppDBText; + ppDBText2: TppDBText; + ppDBText3: TppDBText; + ppSystemVariable1: TppSystemVariable; + ppTitleBand1: TppTitleBand; + ppLabel2: TppLabel; + ppLabel3: TppLabel; + ppLabel4: TppLabel; + ppShape1: TppShape; + SDACQueryDataView1: TdaSDACQueryDataView; + MyTable1: TMSTable; + procedure FormCreate(Sender: TObject); + procedure btnLaunchClick(Sender: TObject); + procedure btCreateClick(Sender: TObject); + procedure btDropClick(Sender: TObject); + private + procedure LoadEndEvent(Sender: TObject); + procedure PreviewFormCreateEvent(Sender: TObject); + public + end; + +var + myEndUserSolution: TmyEndUserSolution; + +implementation + +{$R *.DFM} + +{------------------------------------------------------------------------------} +{ TmyReportObjects.FormCreate } + +procedure TmyEndUserSolution.FormCreate(Sender: TObject); +begin + //Session.SQLHourGlass := False; + + ClientHeight := btnLaunch.Top + btnLaunch.Height + pnlStatusBar.Height + 8; + + ppReport.Template.OnLoadEnd := LoadEndEvent; +end; {procedure, FormCreate} + +{------------------------------------------------------------------------------} +{ TmyReportObjects.btnLaunchClick } + +procedure TmyEndUserSolution.btnLaunchClick(Sender: TObject); +begin + if not(ppReportExplorer.Execute) then begin + pnlStatusBar.Caption := 'Error: ' + ppReportExplorer.ErrorMessage; + MessageBeep(0); + end + else + pnlStatusBar.Caption := 'Explorer Launch Successful.' +end; {procedure, btnLaunchClick} + +{------------------------------------------------------------------------------} +{ TmyReportObjects.LoadEndEvent } + +procedure TmyEndUserSolution.LoadEndEvent(Sender: TObject); +begin + ppReport.OnPreviewFormCreate := PreviewFormCreateEvent; +end; {procedure, LoadEndEvent} + +{------------------------------------------------------------------------------} +{ TmyReportObjects.PreviewFormCreateEvent } + +procedure TmyEndUserSolution.PreviewFormCreateEvent(Sender: TObject); +begin + ppReport.PreviewForm.WindowState := wsMaximized; + + TppViewer(ppReport.PreviewForm.Viewer).ZoomSetting := zs100Percent; +end; {procedure, PreviewFormCreateEvent} + +procedure TmyEndUserSolution.btCreateClick(Sender: TObject); +begin + sqCreate.Execute; +end; + +procedure TmyEndUserSolution.btDropClick(Sender: TObject); +begin + sqDrop.Execute; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.cfg b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.cfg new file mode 100644 index 0000000..0d811bd --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"d:\program files\borland\delphi5\Projects" +-LE"d:\program files\borland\delphi5\Projects" +-LN"d:\program files\borland\delphi5\Projects" +-U"d:\program files\borland\delphi5\Projects" +-O"d:\program files\borland\delphi5\Projects" +-I"d:\program files\borland\delphi5\Projects" +-R"d:\program files\borland\delphi5\Projects" +-Z diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.dpk b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.dpk new file mode 100644 index 0000000..aa87404 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.dpk @@ -0,0 +1,42 @@ +package rbSDAC; + +{$R *.res} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'ReportBuilder Pro Data Access for SDAC'} +{$IMPLICITBUILD OFF} + +requires + dac70, + vclx, + rbRCL97, + rbIDE97, + rbDB97, + rbDAD97, + dacvcl70, + sdacvcl70, + sdac70; + +contains + daSDAC in 'daSDAC.pas'; + +end. diff --git a/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.res b/internal/4.10.0.10/1/Demos/Win32/ThirdParty/ReportBuilder/rbSDAC.res new file mode 100644 index 0000000000000000000000000000000000000000..4aa33a29f5409f6507d2199b5dd35f0dda13b311 GIT binary patch literal 1536 zcmaJ=O>0v@6g{sAd9G}NF02b1L_}OjLIWaQRIvsMYQ;*oP0&s(Nt2MoM(M(=vMKme z+!WftL&(Y>;4dh+ac7rZl#b`#d6O@zm)w~-_n!MTF9QHss+QV=-q(hpJ&AN@N>r0GIGMThL>i&P6*cdb? z>0=zKd5rgSKo^2tKzN8mu1LHGXCUFo2sSP>JWNG>#if|A7Y!80gl-f?4wtl6IKoD8 zsu~?Qzr)7F`HUuL8dG)kjFAMyMsc;TI5omYQ+U5RnBwn8QGYU?cpw;Y{Ksez=|sc< z`{^DW9XzBvOqo(}ZRt33qi+s{&w@0x^QnGmnU|#vm4Xb-Xdk-(GK7V2S*}DoW>y{( zO3;$p98HuEMS8V(e5W*a)%Dk6hoK$m>7upN73wX7_6q|0o&TB>;PWZ466+$d==|^> zDn74_38{%QpnMLTT_8BOy~Kq*nYSX>0pzIGUd0PM!5UstpJJW6m&tb_uOUD-o77h! zuP8ug^p?_>zNOAwfvGmJfi14j@S3MJt+1u_iad*aOa8u)d``vU-sOrMDM_lcDAeVL z8aB{D3p=Qzf+F`CwwbvOg9ce&m6JmOc|78@1@^E+`)y_mIBNsDd<sLc`s^sT&f2w^4(@9G=k!<9 zE8RBPr%YSHdqz5OeU5o=$SC6-<94~XP-Q1x9Ctm=A-5)Vecyt{H{kB*6}b&&`@q>d zGaZ8WDRWPAW~ZN>{ie?4?p~_N9rzAcwb4!O+jlkon!p|XC%6ggjH;12`7IWbKa+m| DdqEtY literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Global.asax b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Global.asax new file mode 100644 index 0000000..6aaca6a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Global.asax @@ -0,0 +1,2 @@ +<%@ Application Codebehind="Global.pas" Inherits="Global.TGlobal" %> + diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Global.pas b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Global.pas new file mode 100644 index 0000000..722c22a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Global.pas @@ -0,0 +1,99 @@ +unit Global; + +interface + +uses + System.Collections, System.ComponentModel, + System.Web, System.Web.SessionState, System.Data; + +type + TGlobal = class(System.Web.HttpApplication) + {$REGION 'Designer Managed Code'} + strict private + procedure InitializeComponent; + {$ENDREGION} + strict protected + procedure Application_Start(sender: System.Object; e: EventArgs); + procedure Session_Start(sender: System.Object; e: EventArgs); + procedure Application_BeginRequest(sender: System.Object; e: EventArgs); + procedure Application_EndRequest(sender: System.Object; e: EventArgs); + procedure Application_AuthenticateRequest(sender: System.Object; e: EventArgs); + procedure Application_Error(sender: System.Object; e: EventArgs); + procedure Session_End(sender: System.Object; e: EventArgs); + procedure Application_End(sender: System.Object; e: EventArgs); + private + { Private Declarations } + public + constructor Create; + end; + +implementation + +{$REGION 'Designer Managed Code'} +///

+/// Required method for Designer support -- do not modify +/// the contents of this method with the code editor. +/// +procedure TGlobal.InitializeComponent; +begin + +end; +{$ENDREGION} + +constructor TGlobal.Create; +begin + inherited; + // + // Required for Designer support + // + InitializeComponent; + // + // TODO: Add any constructor code after InitializeComponent call + // +end; + +procedure TGlobal.Application_Start(sender: System.Object; e: EventArgs); +begin + +end; + +procedure TGlobal.Session_Start(sender: System.Object; e: EventArgs); +var + dataSet : System.Data.DataSet; +begin + dataSet := System.Data.DataSet.Create(); + HttpContext.Current.Session.Add('dataset', dataSet); +end; + +procedure TGlobal.Application_BeginRequest(sender: System.Object; e: EventArgs); +begin + +end; + +procedure TGlobal.Application_EndRequest(sender: System.Object; e: EventArgs); +begin + +end; + +procedure TGlobal.Application_AuthenticateRequest(sender: System.Object; e: EventArgs); +begin + +end; + +procedure TGlobal.Application_Error(sender: System.Object; e: EventArgs); +begin + +end; + +procedure TGlobal.Session_End(sender: System.Object; e: EventArgs); +begin +// HttpContext.Current.Session.Clear(); +end; + +procedure TGlobal.Application_End(sender: System.Object; e: EventArgs); +begin + +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/ReadMe.txt b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/ReadMe.txt new file mode 100644 index 0000000..e553296 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/ReadMe.txt @@ -0,0 +1,8 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Uses MSDataAdapter to create a simple ASP .NET application. This +application creates an ASP.NET application that lets you connect to +a database and execute queries. Shows how to display query results +in a DataGrid and send user changes back to the database. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.bdsproj b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.bdsproj new file mode 100644 index 0000000..9bcdf8a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.bdsproj @@ -0,0 +1,186 @@ + + + + + + + + + + + + Web.dpr + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + + + + .\bin + + + + + System.XML.dll;System.Web.dll;System.Drawing.dll;System.Data.dll;System.dll + + + True + + + + http://localhost/SdacWebDelphi/WebForm.aspx + "iexplore.exe" + True + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + + + + + True + True + WebForm.aspx + IIS + \ + SdacWebDelphi + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.config b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.config new file mode 100644 index 0000000..ac436da --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.config @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.dpr b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.dpr new file mode 100644 index 0000000..cf5b2ab --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/Web.dpr @@ -0,0 +1,82 @@ +library Web; + +{%AspWebConfigContainer 'Web.config'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Data.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Drawing.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Web.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.XML.dll'} +{%DelphiDotNetAssemblyCompiler '..\..\bin\CoreLab.Sdac.AdoNet.dll'} +{%AspMarkupContainer 'Global.asax'} +{%AspMarkupContainer 'WebForm.aspx'} + +uses + System.Reflection, + System.Runtime.CompilerServices, + Global in 'Global.pas' {Global.TGlobal: System.Web.HttpApplication}, + WebForm in 'WebForm.pas' {WebForm.TWebForm: System.Web.UI.Page}; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\bin\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('..\\..\\mykey.snk')] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +begin +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.aspx b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.aspx new file mode 100644 index 0000000..af75463 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.aspx @@ -0,0 +1,136 @@ +<%@ Page language="c#" Codebehind="WebForm.aspx.cs" AutoEventWireup="false" Inherits="WebForm.TWebForm" %> + + + + WebForm + + + + + + +
+ + + + + + +
+ Using SDAC .NET with ASP .NET +
+ + + + + + SQL + + + + + Result + + + + + + + + + + + + + + + + + + + + + + + + +
+ Username + + + +
+ Password + + + +
+ Database + + + +
+ Server + + + +
+ + + + +
+
+
+ + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.pas b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.pas new file mode 100644 index 0000000..42f6a10 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.pas @@ -0,0 +1,265 @@ + +unit WebForm; + +interface + +uses + System.Collections, System.ComponentModel, + System.Data, System.Drawing, System.Web, System.Web.SessionState, + System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls, + System.Globalization, DB, MSAccess, CoreLab.Sdac.DataAdapter; + +type + TWebForm = class(System.Web.UI.Page) + {$REGION 'Designer Managed Code'} + strict private + procedure InitializeComponent; + procedure btTest_Click(sender: System.Object; e: System.EventArgs); + procedure btFill_Click(sender: System.Object; e: System.EventArgs); + procedure btUpdate_Click(sender: System.Object; e: System.EventArgs); + procedure btInsertRecord_Click(sender: System.Object; e: System.EventArgs); + procedure dataGrid_EditCommand(source: System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); + procedure dataGrid_DeleteCommand(source: System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); + procedure dataGrid_CancelCommand(source: System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); + procedure dataGrid_UpdateCommand(source: System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); + {$ENDREGION} + strict private + procedure Page_Load(sender: System.Object; e: System.EventArgs); + strict protected + lbTitle: System.Web.UI.WebControls.Label; + lbInfo: System.Web.UI.WebControls.Label; + btInsertRecord: System.Web.UI.WebControls.Button; + btUpdate: System.Web.UI.WebControls.Button; + Label2: System.Web.UI.WebControls.Label; + btFill: System.Web.UI.WebControls.Button; + tbSQL: System.Web.UI.WebControls.TextBox; + lbResult: System.Web.UI.WebControls.Label; + lbError: System.Web.UI.WebControls.Label; + tbUsername: System.Web.UI.WebControls.TextBox; + tbDatabase: System.Web.UI.WebControls.TextBox; + tbPassword: System.Web.UI.WebControls.TextBox; + tbServer: System.Web.UI.WebControls.TextBox; + lbState: System.Web.UI.WebControls.Label; + btTest: System.Web.UI.WebControls.Button; + dataGrid: System.Web.UI.WebControls.DataGrid; + MSDataAdapter: CoreLab.Sdac.DataAdapter.MSDataAdapter; + DataSet: System.Data.DataSet; + protected + MSConnection: TMSConnection; + MSQuery: TMSQuery; + procedure OnInit(e: EventArgs); override; + procedure BindGrid(); + public + { Public Declarations } + end; + +implementation + +{$REGION 'Designer Managed Code'} +/// +/// Required method for Designer support -- do not modify +/// the contents of this method with the code editor. +/// +procedure TWebForm.InitializeComponent; +begin + Self.MSDataAdapter := CoreLab.Sdac.DataAdapter.MSDataAdapter.Create; + Include(Self.btInsertRecord.Click, Self.btInsertRecord_Click); + Include(Self.btUpdate.Click, Self.btUpdate_Click); + Include(Self.btFill.Click, Self.btFill_Click); + Include(Self.btTest.Click, Self.btTest_Click); + Include(Self.dataGrid.CancelCommand, Self.dataGrid_CancelCommand); + Include(Self.dataGrid.EditCommand, Self.dataGrid_EditCommand); + Include(Self.dataGrid.UpdateCommand, Self.dataGrid_UpdateCommand); + Include(Self.dataGrid.DeleteCommand, Self.dataGrid_DeleteCommand); + // + // MSDataAdapter + // + Self.MSDataAdapter.DataSet := nil; + Self.MSDataAdapter.Name := ''; + Self.MSDataAdapter.Tag := nil; + // + Include(Self.Load, Self.Page_Load); +end; +{$ENDREGION} + +procedure TWebForm.Page_Load(sender: System.Object; e: System.EventArgs); +begin + dataSet := System.Data.DataSet(HttpContext.Current.Session['dataset']); +end; + +procedure TWebForm.OnInit(e: EventArgs); +begin + // + // Required for Designer support + // + InitializeComponent; + + MSConnection := TMSConnection.Create(nil); + with MSConnection do begin + LoginPrompt := False; + Username := 'sa'; + Database := 'Northwind'; + Password := ''; + end; + MSQuery := TMSQuery.Create(nil); + with MSQuery do begin + Connection := MSConnection; + SQL.Text := 'select * from Orders'; + end; + MSDataAdapter.DataSet := MSQuery; + + tbUsername.Text := MSConnection.Username; + tbDatabase.Text := MSConnection.Database; + tbPassword.Text := MSConnection.Password; + tbServer.Text := MSConnection.Server; + tbSQL.Text := MSQuery.SQL.Text; + + inherited OnInit(e); +end; + +procedure TWebForm.BindGrid(); +begin + if dataSet.Tables['Table'] <> Nil then begin + dataGrid.DataSource := dataSet.Tables['Table'].DefaultView; + lbResult.Visible := true; + btInsertRecord.Visible := true; + if dataSet.Tables['Table'].GetChanges() <> Nil then + lbInfo.Text := 'Changed' + end + else begin + dataGrid.DataSource := Nil; + lbResult.Visible := false; + btInsertRecord.Visible := false; + end; + + dataGrid.DataBind(); +end; + +procedure TWebForm.dataGrid_UpdateCommand(source: System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); +var + i : integer; + colValue: string; +begin + for i := 2 to e.Item.Cells.Count - 1 do + if e.Item.Cells[i].Controls.Count > 0 then begin + colValue := System.Web.UI.WebControls.TextBox(e.Item.Cells[i].Controls[0]).Text; + if colValue = '' then + dataSet.Tables['Table'].Rows[e.Item.ItemIndex][i - 2] := Convert.DBNull + else + dataSet.Tables['Table'].Rows[e.Item.ItemIndex][i - 2] := colValue; + end; + + dataGrid.EditItemIndex := -1; + BindGrid(); +end; + +procedure TWebForm.dataGrid_CancelCommand(source: System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); +begin + dataGrid.EditItemIndex := -1; + BindGrid(); +end; + +procedure TWebForm.dataGrid_DeleteCommand(source: System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); +begin + dataSet.Tables['Table'].Rows[e.Item.ItemIndex].Delete(); + BindGrid(); +end; + +procedure TWebForm.dataGrid_EditCommand(source: System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); +begin + dataGrid.EditItemIndex := System.Int32(e.Item.ItemIndex); + BindGrid(); +end; + +procedure TWebForm.btInsertRecord_Click(sender: System.Object; e: System.EventArgs); +var + row : DataRow; +begin + row := dataSet.Tables['Table'].NewRow(); + dataSet.Tables['Table'].Rows.Add(row); + dataGrid.EditItemIndex := dataSet.Tables['Table'].Rows.Count - 1; + BindGrid(); +end; + +procedure TWebForm.btUpdate_Click(sender: System.Object; e: System.EventArgs); +begin + if dataSet.Tables['Table'] <> Nil then begin + try try + MSConnection.Username := tbUsername.Text; + MSConnection.Database := tbDatabase.Text; + MSConnection.Password := tbPassword.Text; + MSConnection.Server := tbServer.Text; + + MSQuery.SQL.Text := tbSQL.Text; + + MSDataAdapter.Update(dataSet, 'Table'); + + lbInfo.Text := 'Updated'; + except + on exception : Exception do begin + lbError.Text := exception.Message; + end; + end; + finally + BindGrid(); + end; + end; +end; + +procedure TWebForm.btFill_Click(sender: System.Object; e: System.EventArgs); +var + i : integer; + table : DataTable; +begin + try try + dataSet.Clear(); + for i := 0 to dataSet.Tables.Count - 1 do begin + table := dataSet.Tables[i]; + table.Constraints.Clear(); + table.Columns.Clear(); + end; + dataSet.Tables.Clear(); + + MSConnection.Username := tbUsername.Text; + MSConnection.Database := tbDatabase.Text; + MSConnection.Password := tbPassword.Text; + MSConnection.Server := tbServer.Text; + + MSQuery.SQL.Text := tbSQL.Text; + + MSDataAdapter.Fill(dataSet, 'Table'); + + lbInfo.Text := 'Filled'; + except + on exception : Exception do + lbError.Text := exception.Message; + end; + finally + BindGrid(); + end; +end; + +procedure TWebForm.btTest_Click(sender: System.Object; e: System.EventArgs); +begin + try + MSConnection.Username := tbUsername.Text; + MSConnection.Database := tbDatabase.Text; + MSConnection.Password := tbPassword.Text; + MSConnection.Server := tbServer.Text; + + MSConnection.Open; + lbState.Text := 'Success'; + lbState.ForeColor := Color.Blue; + MSConnection.Close; + except on exception: Exception do + begin + lbState.Text := 'Failed'; + lbState.ForeColor := Color.Red; + lbError.Text := exception.Message; + end; + end; + +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.resx b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.resx new file mode 100644 index 0000000..1afaad5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/ASPNet/WebForm.resx @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 157, 17 + + + False + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/About.nfm b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/About.nfm new file mode 100644 index 0000000..0d8a146 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/About.nfm @@ -0,0 +1,108 @@ +object AboutForm: TAboutForm + Left = 352 + Top = 192 + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'About FailOver Demo' + ClientHeight = 343 + ClientWidth = 416 + Color = clBtnFace + ParentFont = True + OldCreateOrder = True + Position = poScreenCenter + OnMouseMove = FormMouseMove + PixelsPerInch = 96 + TextHeight = 13 + object Label3: TLabel + Left = 16 + Top = 36 + Width = 156 + Height = 13 + Caption = 'Copyright '#169' 1997-2007 Core Lab' + end + object lbWeb: TLabel + Left = 16 + Top = 306 + Width = 73 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbWebClick + OnMouseMove = lbWebMouseMove + end + object lbDemo: TLabel + Left = 16 + Top = 8 + Width = 119 + Height = 20 + Caption = 'FailOver Demo' + Font.Charset = DEFAULT_CHARSET + Font.Color = clGreen + Font.Height = -16 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object OKBtn: TButton + Left = 319 + Top = 308 + Width = 75 + Height = 24 + Cancel = True + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end + object meAbout: TMemo + Left = 16 + Top = 56 + Width = 385 + Height = 241 + Color = clBtnFace + Lines.Strings = ( + 'This demo program shows how to use DisconnectedMode, Pooling, ' + + 'CachedUpdates and LocalMasterDetail options. Usage of these opti' + + 'ons and ' + + 'usage of the OnConectionLost event are recommended working in un' + + 'stable ' + 'and/or slow network.' + '' + + 'The '#39'Open'#39' button opens two data sets. They are linked by Master' + + '/Detail ' + + 'relationship. You can preconnect to database before opening the ' + + 'datasets, but ' + 'usage of disconnected mode has no advantages in this case.' + '' + + 'The grid above displays the master data set, the grid below disp' + + 'lays the detail ' + + 'data set. The '#39'Kill session'#39' button terminates session on the se' + + 'rver, which ' + + 'causes connection break. This does not work for with all SQL ser' + + 'vers and with ' + + 'all users. The memo at the bottom of the main form keeps track o' + + 'f connection ' + 'messages.' + '' + + 'See the "Working in unstable and slow networks" topic in help fo' + + 'r more ' + 'detailed information.') + TabOrder = 1 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/About.pas b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/About.pas new file mode 100644 index 0000000..79a6909 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/About.pas @@ -0,0 +1,67 @@ +unit About; + +interface +uses + Classes, SysUtils, +{$IFNDEF LINUX} + Windows, Menus, ImgList, StdCtrls, ComCtrls, Buttons, ExtCtrls, Graphics, + Controls, Forms, Dialogs, ShellApi; +{$ELSE} + QMenus, QImgList, QStdCtrls, QComCtrls, QButtons, QExtCtrls, QGraphics, + QControls, QForms, QDialogs; +{$ENDIF} + +type + TAboutForm = class(TForm) + OKBtn: TButton; + Label3: TLabel; + lbWeb: TLabel; + lbDemo: TLabel; + meAbout: TMemo; + procedure lbWebClick(Sender: TObject); + procedure lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + private + { Private declarations } + public + { Public declarations } + end; + +var + AboutForm: TAboutForm; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TAboutForm.lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $4080FF; +end; + +procedure TAboutForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $FF0000; +end; + +procedure TAboutForm.lbWebClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'open', 'www.crlab.com', '', '', SW_SHOW); + lbWeb.Font.Color := $FF0000; +{$ENDIF} +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Data.nfm b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Data.nfm new file mode 100644 index 0000000..9983c11 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Data.nfm @@ -0,0 +1,112 @@ +object DM: TDM + OldCreateOrder = False + Left = 185 + Top = 105 + Height = 227 + Width = 284 + object Connection: TMSConnection + Database = 'master' + Options.DisconnectedMode = True + Options.LocalFailover = True + Pooling = True + Left = 32 + Top = 32 + end + object quDetail: TMSQuery + Connection = Connection + SQL.Strings = ( + 'select * from emp') + Debug = True + CachedUpdates = True + Options.LocalMasterDetail = True + MasterSource = dsMaster + MasterFields = 'DEPTNO' + DetailFields = 'DEPTNO' + Left = 104 + Top = 88 + end + object quMaster: TMSQuery + Connection = Connection + SQL.Strings = ( + 'select * from dept' + '') + Debug = True + CachedUpdates = True + Left = 104 + Top = 32 + end + object dsDetail: TDataSource + DataSet = quDetail + Left = 136 + Top = 80 + end + object dsMaster: TDataSource + DataSet = quMaster + Left = 136 + Top = 24 + end + object scCreate: TMSScript + SQL.Strings = ( + 'CREATE TABLE DEPT (' + ' DEPTNO INT PRIMARY KEY ,' + ' DNAME VARCHAR(14) ,' + ' LOC VARCHAR(13)' + ');' + '' + 'CREATE TABLE EMP (' + ' EMPNO INT IDENTITY PRIMARY KEY,' + ' ENAME VARCHAR(10),' + ' JOB VARCHAR(9),' + ' MGR INT,' + ' HIREDATE DATETIME,' + ' SAL FLOAT,' + ' COMM FLOAT,' + ' DEPTNO INT CONSTRAINT FK_DEPTNO REFERENCES DEPT' + ');' + '' + 'INSERT INTO DEPT VALUES (10,'#39'ACCOUNTING'#39','#39'NEW YORK'#39');' + 'INSERT INTO DEPT VALUES (20,'#39'RESEARCH'#39','#39'DALLAS'#39');' + 'INSERT INTO DEPT VALUES (30,'#39'SALES'#39','#39'CHICAGO'#39');' + 'INSERT INTO DEPT VALUES (40,'#39'OPERATIONS'#39','#39'BOSTON'#39');' + '' + 'INSERT INTO EMP VALUES' + '('#39'SMITH'#39','#39'CLERK'#39',7902,CAST('#39'12/17/80'#39' AS DATETIME),800,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'ALLEN'#39','#39'SALESMAN'#39',7698,'#39'02/20/81'#39',1600,300,30);' + 'INSERT INTO EMP VALUES' + '('#39'WARD'#39','#39'SALESMAN'#39',7698,'#39'02/22/81'#39',1250,500,30);' + 'INSERT INTO EMP VALUES' + '('#39'JONES'#39','#39'MANAGER'#39',7839,'#39'04/02/81'#39',2975,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'MARTIN'#39','#39'SALESMAN'#39',7698,'#39'09/28/81'#39',1250,1400,30);' + 'INSERT INTO EMP VALUES' + '('#39'BLAKE'#39','#39'MANAGER'#39',7839,'#39'05/01/81'#39',2850,NULL,30);' + 'INSERT INTO EMP VALUES' + '('#39'CLARK'#39','#39'MANAGER'#39',7839,'#39'06/09/81'#39',2450,NULL,10);' + 'INSERT INTO EMP VALUES' + '('#39'SCOTT'#39','#39'ANALYST'#39',7566,'#39'07/13/87'#39',3000,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'KING'#39','#39'PRESIDENT'#39',NULL,'#39'11/17/81'#39',5000,NULL,10);' + 'INSERT INTO EMP VALUES' + '('#39'TURNER'#39','#39'SALESMAN'#39',7698,'#39'09/08/81'#39',1500,0,30);' + 'INSERT INTO EMP VALUES' + '('#39'ADAMS'#39','#39'CLERK'#39',7788,'#39'07/13/87'#39',1100,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'JAMES'#39','#39'CLERK'#39',7698,'#39'12/03/81'#39',950,NULL,30);' + 'INSERT INTO EMP VALUES' + '('#39'FORD'#39','#39'ANALYST'#39',7566,'#39'12/03/81'#39',3000,NULL,20);' + 'INSERT INTO EMP VALUES' + '('#39'MILLER'#39','#39'CLERK'#39',7782,'#39'01/23/82'#39',1300,NULL,10);') + Connection = Connection + Left = 200 + Top = 24 + end + object scDrop: TMSScript + SQL.Strings = ( + 'DROP TABLE EMP;' + 'DROP TABLE DEPT;') + Connection = Connection + Left = 200 + Top = 80 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Data.pas b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Data.pas new file mode 100644 index 0000000..0bbfda2 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Data.pas @@ -0,0 +1,96 @@ +unit Data; + +interface + +uses + Classes, SysUtils, Windows, Menus, ImgList, StdCtrls, ComCtrls, Buttons, + ExtCtrls, Graphics, Controls, Forms, DB, + MemData, DBAccess, MSAccess, MemDS, SdacVcl, DAScript, MSScript; + +type + TDM = class(TDataModule) + Connection: TMSConnection; + quDetail: TMSQuery; + quMaster: TMSQuery; + dsMaster: TDataSource; + dsDetail: TDataSource; + scCreate: TMSScript; + scDrop: TMSScript; + private + public + procedure KillSession; + function InTransaction: boolean; + procedure StartTransaction; + procedure RollbackTransaction; + procedure CommitTransaction; + end; + +const + ProductColor: TColor = $5D5DCC; + +var + DM: TDM; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +uses + Main; + +{ TDM } + +procedure TDM.KillSession; +var + KillConnection: TMSConnection; + Query: TMSQuery; + SPID: string; +begin + Query := TMSQuery.Create(nil); + try + Query.Connection := Connection; + Query.SQL.Text := 'SELECT @@SPID AS ''SPID'''; + Query.Open; + SPID := Query.FieldByName('SPID').AsString; + finally + Query.Free; + end; + KillConnection := TMSConnection.Create(nil); + try + KillConnection.Server := Connection.Server; + KillConnection.Username := Connection.Username; + KillConnection.Password := Connection.Password; + KillConnection.Database := Connection.Database; + KillConnection.LoginPrompt := False; + KillConnection.ExecSQL(Format('KILL %s', [SPID]), []); + finally + KillConnection.Free; + end; +end; + +function TDM.InTransaction: boolean; +begin + Result := Connection.InTransaction; +end; + +procedure TDM.StartTransaction; +begin + Connection.StartTransaction; +end; + +procedure TDM.CommitTransaction; +begin + Connection.Commit; +end; + +procedure TDM.RollbackTransaction; +begin + Connection.Rollback; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.bdsproj b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.bdsproj new file mode 100644 index 0000000..3a6e56e --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.bdsproj @@ -0,0 +1,184 @@ + + + + + + + + + + + + FailOver_VclNet.dpr + + + + + + + + + + + + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + + + + + + + + d:\windows\microsoft.net\framework\v1.1.4322 + d:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll + + + True + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.dpr b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.dpr new file mode 100644 index 0000000..d4fc643 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.dpr @@ -0,0 +1,17 @@ +program FailOver_VclNet; + +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\system.drawing.dll'} + +uses + Forms, + Main in 'Main.pas' {MainForm}, + Data in 'Data.pas' {DM: TDataModule}, + About in 'About.pas' {AboutForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.res b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/FailOver_VclNet.res new file mode 100644 index 0000000000000000000000000000000000000000..c2869c8ddda418d0c5f6f1a8c422f730659835db GIT binary patch literal 876 zcmb7Dv5FKy5Uq6&78AYU94@>K4IPeU1OpW#13e}<`#$5EX140sU`J%>0)vf?^GC#B zllhbj4bAL8XkX3jf`W;~yy<@Rs;g?cr-_K>K+YpD{mZ^TIOtQvOa|@v_~FqZ=qV<1 z;1w{Ty&G%(Z5bh~j8&ja8zV9Je6E@^=zdOpBkTSP0uN9iU4{&Ljgpaofs!euo<}R7`78Ug{CMO zUk+{ya>gzhy|&{po-;mA?R2o=qXW9h2pAk`FAokhk;dpT0+p;5EcfHD@eA_=`~dEO zevb~L;eV~eZ)@m@riOboirkM;;|#T44%ece<|jn-49NKry`$Ikmfizz=mO)x{=64< Q8zwZL9}Ty{ZqbB(1Go+zjsO4v literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Main.nfm b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Main.nfm new file mode 100644 index 0000000..a30c0c5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Main.nfm @@ -0,0 +1,758 @@ +object MainForm: TMainForm + Left = 200 + Top = 130 + Width = 820 + Height = 480 + Caption = 'FailOver Demo' + Color = clBtnFace + Constraints.MinHeight = 480 + Constraints.MinWidth = 820 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnActivate = FormActivate + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object pnRight: TPanel + Left = 256 + Top = 49 + Width = 556 + Height = 385 + Align = alClient + BevelOuter = bvNone + ParentColor = True + TabOrder = 0 + object Splitter1: TSplitter + Left = 0 + Top = 331 + Width = 556 + Height = 2 + Cursor = crVSplit + Align = alTop + Beveled = True + Color = clBtnFace + ParentColor = False + ResizeStyle = rsUpdate + end + object pnMiddle: TPanel + Left = 0 + Top = 0 + Width = 556 + Height = 331 + Align = alTop + BevelOuter = bvNone + Constraints.MinHeight = 160 + ParentColor = True + TabOrder = 0 + object Splitter: TSplitter + Left = 0 + Top = 153 + Width = 556 + Height = 2 + Cursor = crVSplit + Align = alTop + Beveled = True + Color = clBtnFace + MinSize = 100 + ParentColor = False + ResizeStyle = rsUpdate + end + object pnDetail: TPanel + Left = 0 + Top = 155 + Width = 556 + Height = 176 + Align = alClient + BevelOuter = bvNone + ParentColor = True + TabOrder = 0 + object DBGrid2: TDBGrid + Left = 0 + Top = 27 + Width = 556 + Height = 149 + Align = alClient + DataSource = DM.dsDetail + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object Panel9: TPanel + Left = 0 + Top = 0 + Width = 556 + Height = 27 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel7: TPanel + Left = 0 + Top = 2 + Width = 242 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object DBNavigator2: TDBNavigator + Left = 1 + Top = 1 + Width = 240 + Height = 22 + DataSource = DM.dsDetail + Flat = True + TabOrder = 0 + end + end + end + end + object pnMaster: TPanel + Left = 0 + Top = 0 + Width = 556 + Height = 153 + Align = alTop + BevelOuter = bvNone + Constraints.MinHeight = 100 + ParentColor = True + TabOrder = 1 + object DBGrid1: TDBGrid + Left = 0 + Top = 1 + Width = 556 + Height = 152 + Align = alBottom + Anchors = [akLeft, akTop, akRight, akBottom] + DataSource = DM.dsMaster + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + end + end + object pnBottom: TPanel + Left = 0 + Top = 333 + Width = 556 + Height = 52 + Align = alClient + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object meLog: TMemo + Left = 0 + Top = 0 + Width = 556 + Height = 52 + Align = alClient + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + end + end + object pnLeft: TPanel + Left = 0 + Top = 49 + Width = 256 + Height = 385 + Align = alLeft + BevelOuter = bvNone + ParentColor = True + TabOrder = 1 + object Panel8: TPanel + Left = 1 + Top = 128 + Width = 243 + Height = 254 + BevelOuter = bvNone + TabOrder = 0 + object cbPooling: TCheckBox + Left = 8 + Top = 138 + Width = 150 + Height = 17 + Caption = 'Pooling' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 6 + OnClick = cbPoolingClick + end + object pnPooling: TPanel + Left = 26 + Top = 157 + Width = 215 + Height = 95 + BevelOuter = bvNone + Color = clGreen + TabOrder = 7 + object Panel10: TPanel + Left = 1 + Top = 1 + Width = 213 + Height = 93 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 0 + object Label2: TLabel + Left = 6 + Top = 54 + Width = 90 + Height = 13 + Caption = 'ConnectionLifetime' + end + object Label3: TLabel + Left = 6 + Top = 8 + Width = 61 + Height = 13 + Caption = 'MaxPoolSize' + end + object Label4: TLabel + Left = 6 + Top = 31 + Width = 58 + Height = 13 + Caption = 'MinPoolSize' + end + object cbValidate: TCheckBox + Left = 6 + Top = 77 + Width = 111 + Height = 14 + Alignment = taLeftJustify + Caption = 'Validate' + TabOrder = 3 + OnClick = cbValidateClick + end + object edMaxPoolSize: TEdit + Left = 104 + Top = 4 + Width = 103 + Height = 21 + TabOrder = 0 + OnExit = edMaxPoolSizeExit + end + object edMinPoolSize: TEdit + Left = 104 + Top = 27 + Width = 103 + Height = 21 + TabOrder = 1 + OnExit = edMinPoolSizeExit + end + object edConnectionLifetime: TEdit + Left = 104 + Top = 50 + Width = 103 + Height = 21 + TabOrder = 2 + OnExit = edConnectionLifetimeExit + end + end + end + object cbCachedUpdates: TCheckBox + Left = 8 + Top = 7 + Width = 150 + Height = 17 + Caption = 'CachedUpdates' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnClick = cbCachedUpdatesClick + end + object cbFailover: TCheckBox + Left = 8 + Top = 88 + Width = 73 + Height = 17 + Caption = 'Failover' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 4 + OnClick = cbFailoverClick + end + object cbLocalMasterDetail: TCheckBox + Left = 8 + Top = 27 + Width = 150 + Height = 17 + Caption = 'LocalMasterDetail' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnClick = cbLocalMasterDetailClick + end + object cbDisconnectedMode: TCheckBox + Left = 8 + Top = 68 + Width = 150 + Height = 17 + Caption = 'DisconnectedMode' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 3 + OnClick = cbDisconnectedModeClick + end + object cbFetchAll: TCheckBox + Left = 8 + Top = 48 + Width = 97 + Height = 17 + Caption = 'FetchAll' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 2 + OnClick = cbFetchAllClick + end + object pnFailover: TPanel + Left = 26 + Top = 106 + Width = 215 + Height = 28 + BevelOuter = bvNone + Color = clGreen + TabOrder = 5 + object Panel16: TPanel + Left = 1 + Top = 1 + Width = 213 + Height = 26 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 0 + object Label7: TLabel + Left = 5 + Top = 7 + Width = 52 + Height = 13 + Caption = 'RetryMode' + end + object coRetryMode: TComboBox + Left = 69 + Top = 3 + Width = 141 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + Items.Strings = ( + 'Default' + 'Raise' + 'Reconnect' + 'ReconnectExecute') + end + end + end + end + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 256 + Height = 122 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 2 + Top = 1 + Width = 253 + Height = 122 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object Panel15: TPanel + Left = 1 + Top = 1 + Width = 251 + Height = 60 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 11 + Top = 6 + Width = 48 + Height = 13 + Alignment = taRightJustify + Caption = 'Updates' + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel12: TPanel + Left = 12 + Top = 26 + Width = 229 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btApply: TSpeedButton + Left = 1 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Apply' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btApplyClick + end + object btCancel: TSpeedButton + Left = 153 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Cancel' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCancelClick + end + object btCommit: TSpeedButton + Left = 77 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Commit' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCommitClick + end + end + end + object Panel17: TPanel + Left = 1 + Top = 62 + Width = 251 + Height = 58 + BevelOuter = bvNone + TabOrder = 1 + object Label6: TLabel + Left = 11 + Top = 6 + Width = 74 + Height = 13 + Alignment = taRightJustify + Caption = 'Transactions' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel5: TPanel + Left = 12 + Top = 26 + Width = 229 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btStartTrans: TSpeedButton + Left = 1 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Start' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btStartTransClick + end + object btCommitTrans: TSpeedButton + Left = 77 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Commit' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCommitTransClick + end + object btRollbackTrans: TSpeedButton + Left = 153 + Top = 1 + Width = 75 + Height = 22 + Caption = 'Rollback' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btRollbackTransClick + end + end + end + end + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 434 + Width = 812 + Height = 19 + Panels = < + item + Width = 208 + end + item + Width = 208 + end + item + Width = 208 + end + item + Width = 50 + end> + end + object pnTop: TPanel + Left = 0 + Top = 0 + Width = 812 + Height = 49 + Align = alTop + BevelOuter = bvNone + ParentColor = True + TabOrder = 3 + OnMouseMove = pnTopMouseMove + object lbAbout: TLabel + Left = 762 + Top = 6 + Width = 34 + Height = 13 + Cursor = crHandPoint + Anchors = [akTop, akRight] + Caption = 'About' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold, fsUnderline] + ParentFont = False + OnClick = lbAboutClick + OnMouseMove = lbAboutMouseMove + end + object Panel18: TPanel + Left = 2 + Top = 1 + Width = 418 + Height = 47 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btConnect: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Connect' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btConnectClick + end + object btDisconnect: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Disconnect' + Enabled = False + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btDisconnectClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btOpenClick + end + object btKillSession: TSpeedButton + Left = 333 + Top = 1 + Width = 84 + Height = 22 + Caption = 'Kill session' + Enabled = False + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btKillSessionClick + end + object btCreate: TSpeedButton + Left = 1 + Top = 24 + Width = 82 + Height = 22 + Caption = 'Create' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btCreateDropClick + end + object btDrop: TSpeedButton + Left = 84 + Top = 24 + Width = 82 + Height = 22 + Caption = 'Drop' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btCreateDropClick + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 24 + Width = 250 + Height = 22 + DataSource = DM.dsMaster + Flat = True + TabOrder = 0 + end + end + object cbDebug: TCheckBox + Left = 685 + Top = 5 + Width = 64 + Height = 17 + Anchors = [akTop, akRight] + Caption = 'Debug' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + OnClick = cbDebugClick + end + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Main.pas b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Main.pas new file mode 100644 index 0000000..aee12c7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/Failover/Main.pas @@ -0,0 +1,533 @@ +unit Main; + +interface + +uses + Classes, SysUtils, + Windows, Menus, ImgList, StdCtrls, ComCtrls, Buttons, ExtCtrls, Graphics, + Controls, Forms, Dialogs, Grids, DBCtrls, DBGrids, + DB, MemData, DBAccess, Data, About; + +type + TMainForm = class(TForm) + DBGrid1: TDBGrid; + pnTop: TPanel; + btConnect: TSpeedButton; + btDisconnect: TSpeedButton; + btOpen: TSpeedButton; + btClose: TSpeedButton; + pnMaster: TPanel; + pnRight: TPanel; + pnLeft: TPanel; + pnMiddle: TPanel; + DBGrid2: TDBGrid; + Panel7: TPanel; + DBNavigator2: TDBNavigator; + Panel8: TPanel; + cbFailover: TCheckBox; + cbLocalMasterDetail: TCheckBox; + cbCachedUpdates: TCheckBox; + cbPooling: TCheckBox; + pnPooling: TPanel; + Panel10: TPanel; + cbValidate: TCheckBox; + edMaxPoolSize: TEdit; + edMinPoolSize: TEdit; + edConnectionLifetime: TEdit; + Label2: TLabel; + Label3: TLabel; + Label4: TLabel; + pnBottom: TPanel; + meLog: TMemo; + cbDisconnectedMode: TCheckBox; + cbFetchAll: TCheckBox; + Panel12: TPanel; + btApply: TSpeedButton; + btCancel: TSpeedButton; + btCommit: TSpeedButton; + Label1: TLabel; + Panel5: TPanel; + btStartTrans: TSpeedButton; + btCommitTrans: TSpeedButton; + btRollbackTrans: TSpeedButton; + Label6: TLabel; + StatusBar: TStatusBar; + btKillSession: TSpeedButton; + coRetryMode: TComboBox; + Label7: TLabel; + pnDetail: TPanel; + Splitter: TSplitter; + DBNavigator1: TDBNavigator; + Panel9: TPanel; + lbAbout: TLabel; + pnFailover: TPanel; + Panel16: TPanel; + Panel18: TPanel; + Splitter1: TSplitter; + Panel15: TPanel; + Panel17: TPanel; + Panel1: TPanel; + cbDebug: TCheckBox; + Panel2: TPanel; + btDrop: TSpeedButton; + btCreate: TSpeedButton; + procedure FormCreate(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure cbFailoverClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure cbPoolingClick(Sender: TObject); + procedure edMaxPoolSizeExit(Sender: TObject); + procedure edMinPoolSizeExit(Sender: TObject); + procedure edConnectionLifetimeExit(Sender: TObject); + procedure cbValidateClick(Sender: TObject); + procedure cbCachedUpdatesClick(Sender: TObject); + procedure cbDisconnectedModeClick(Sender: TObject); + procedure FormActivate(Sender: TObject); + procedure cbLocalMasterDetailClick(Sender: TObject); + procedure cbFetchAllClick(Sender: TObject); + procedure btApplyClick(Sender: TObject); + procedure btCommitClick(Sender: TObject); + procedure btCancelClick(Sender: TObject); + procedure btStartTransClick(Sender: TObject); + procedure btCommitTransClick(Sender: TObject); + procedure btRollbackTransClick(Sender: TObject); + procedure btKillSessionClick(Sender: TObject); + procedure lbAboutClick(Sender: TObject); + procedure cbDebugClick(Sender: TObject); + procedure lbAboutMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure pnTopMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure btCreateDropClick(Sender: TObject); + private + FActivated, + FShouldNotUpdateControls: boolean; + procedure OptionsToEditors; + procedure EditorsToOptions; + function GetShouldNotUpdateControls: boolean; + + procedure ConnectionAfterConnect(Sender: TObject); + procedure ConnectionAfterDisconnect(Sender: TObject); + procedure ConnectionConnectionLost(Sender: TObject; + Component: TComponent; ConnLostCause: TConnLostCause; + var RetryMode: TRetryMode); + procedure dsUpdateData(Sender: TObject); + procedure dsDataChange(Sender: TObject; Field: TField); + + procedure ShowPending; + procedure ShowTrans; + public + property ShouldNotUpdateControls: boolean read GetShouldNotUpdateControls; + end; + +var + MainForm: TMainForm; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +{$IFNDEF VER130} +{$IFNDEF VER140} +{$IFNDEF CLR} + {$DEFINE XPMAN} + {$R WindowsXP.res} +{$ENDIF} +{$ENDIF} +{$ENDIF} + +{$IFDEF XPMAN} +uses + UxTheme; +{$ENDIF} + +function TMainForm.GetShouldNotUpdateControls: boolean; +begin + Result := not FActivated or FShouldNotUpdateControls; +end; + +procedure TMainForm.OptionsToEditors; +begin + FShouldNotUpdateControls := True; + cbFailover.Checked := DM.Connection.Options.LocalFailover; + cbPooling.Checked := DM.Connection.Pooling; + with DM.Connection.PoolingOptions do begin + edMaxPoolSize.Text := IntToStr(MaxPoolSize); + edMinPoolSize.Text := IntToStr(MinPoolSize); + edConnectionLifetime.Text := IntToStr(ConnectionLifetime); + cbValidate.Checked := Validate; + end; + cbCachedUpdates.Checked := DM.quDetail.CachedUpdates; + cbLocalMasterDetail.Checked := DM.quDetail.Options.LocalMasterDetail; + cbFetchAll.Checked := DM.quDetail.FetchAll; + cbDisconnectedMode.Checked := DM.Connection.Options.DisconnectedMode; + cbDebug.Checked := DM.quMaster.Debug; + FShouldNotUpdateControls := False; +end; + +procedure TMainForm.EditorsToOptions; +var + OnExit: TNotifyEvent; +begin + if ActiveControl is TEdit then + OnExit := TEdit(ActiveControl).OnExit + else + if ActiveControl is TMemo then + OnExit := TMemo(ActiveControl).OnExit + else + Exit; + if Assigned(OnExit) then + OnExit(nil); +end; + +procedure TMainForm.FormCreate(Sender: TObject); +{$IFDEF XPMAN} + procedure UpdateStyle(Control: TWinControl); + var + Panel: TPanel; + i: integer; + begin + for i := 0 to Control.ControlCount - 1 do begin + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := False + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := False; + if Control.Controls[i] is TWinControl then begin + if (Control.Controls[i] is TPanel) then begin + Panel := TPanel(Control.Controls[i]); + Panel.ParentBackground := False; + Panel.Color := clBtnFace; + end; + UpdateStyle(TWinControl(Control.Controls[i])); + end; + end; + end; +{$ENDIF} + +begin + DM := TDM.Create(nil); + AboutForm := TAboutForm.Create(nil); +{$IFDEF XPMAN} + if UseThemes then + UpdateStyle(Self); +{$ENDIF} + DM.Connection.AfterConnect := ConnectionAfterConnect; + DM.Connection.AfterDisconnect := ConnectionAfterDisconnect;; + DM.Connection.OnConnectionLost := ConnectionConnectionLost; + DM.dsDetail.OnStateChange := dsUpdateData; + DM.dsDetail.OnDataChange := dsDataChange; + DM.dsMaster.OnStateChange := dsUpdateData; + DM.dsMaster.OnDataChange := dsDataChange; + OptionsToEditors; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + DM.Free; + AboutForm.Free; +end; + +procedure TMainForm.FormActivate(Sender: TObject); +begin + FActivated := True; +end; + +procedure TMainForm.btConnectClick(Sender: TObject); +begin + EditorsToOptions; + DM.Connection.Connect; +end; + +procedure TMainForm.btDisconnectClick(Sender: TObject); +begin + EditorsToOptions; + DM.Connection.Disconnect; +end; + +procedure TMainForm.btOpenClick(Sender: TObject); +begin + EditorsToOptions; + DM.quMaster.Open; + DM.quDetail.Open; +end; + +procedure TMainForm.btCloseClick(Sender: TObject); +begin + EditorsToOptions; + DM.quMaster.Close; + DM.quDetail.Close; +end; + +procedure TMainForm.cbDisconnectedModeClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + try + DM.Connection.Options.DisconnectedMode := cbDisconnectedMode.Checked; + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.cbFailoverClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + DM.Connection.Options.LocalFailover := cbFailover.Checked; +end; + +procedure TMainForm.cbPoolingClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + DM.Connection.Pooling := cbPooling.Checked; +end; + +procedure TMainForm.edMaxPoolSizeExit(Sender: TObject); +begin + try + DM.Connection.PoolingOptions.MaxPoolSize := StrToInt(edMaxPoolSize.Text); + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.edMinPoolSizeExit(Sender: TObject); +begin + try + DM.Connection.PoolingOptions.MinPoolSize := StrToInt(edMinPoolSize.Text); + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.edConnectionLifetimeExit(Sender: TObject); +begin + try + DM.Connection.PoolingOptions.ConnectionLifetime := StrToInt(edConnectionLifetime.Text); + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.cbValidateClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + DM.Connection.PoolingOptions.Validate := cbValidate.Checked; +end; + +procedure TMainForm.cbCachedUpdatesClick(Sender: TObject); +begin + if ShouldNotUpdateControls then + Exit; + try + DM.quDetail.CachedUpdates := cbCachedUpdates.Checked; + DM.quMaster.CachedUpdates := cbCachedUpdates.Checked; + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.ConnectionConnectionLost(Sender: TObject; + Component: TComponent; ConnLostCause: TConnLostCause; + var RetryMode: TRetryMode); +var + Msg: string; +begin + case ConnLostCause of + clUnknown: + Msg := 'for reasons not known'; + clExecute: + Msg := 'during SQL execution'; + clOpen: + Msg := 'during query opening'; + clApply: + Msg := 'during DataSet.ApplyUpdates'; + clServiceQuery: + Msg := 'during service information request'; + clTransStart: + Msg := 'during transaction start'; + clConnectionApply: + Msg := 'during Connection.ApplyUpdates'; + clConnect: + Msg := 'during connection establishing'; + end; + meLog.Lines.Add(TimeToStr(Now) + ' ' + Component.Name + ' - Connection lost ' + Msg); + if coRetryMode.ItemIndex <> 0 then + RetryMode := TRetryMode(coRetryMode.ItemIndex - 1) +end; + +procedure TMainForm.ConnectionAfterConnect(Sender: TObject); +begin + btConnect.Enabled := False; + btDisconnect.Enabled := True; + btKillSession.Enabled := True; +end; + +procedure TMainForm.ConnectionAfterDisconnect(Sender: TObject); +begin + btDisconnect.Enabled := False; + btKillSession.Enabled := False; + btConnect.Enabled := True; +end; + +procedure TMainForm.dsUpdateData(Sender: TObject); +begin + ShowPending; +end; + +procedure TMainForm.dsDataChange(Sender: TObject; Field: TField); +begin + ShowPending; +end; + +procedure TMainForm.cbLocalMasterDetailClick(Sender: TObject); +begin + try + DM.quDetail.Options.LocalMasterDetail := cbLocalMasterDetail.Checked; + except + OptionsToEditors; + raise; + end; +end; + +procedure TMainForm.cbFetchAllClick(Sender: TObject); +begin + DM.quDetail.FetchAll := cbFetchAll.Checked; + DM.quMaster.FetchAll := cbFetchAll.Checked; +end; + +procedure TMainForm.ShowPending; +begin + if DM.quMaster.UpdatesPending then + StatusBar.Panels[0].Text := 'Master Updates Pending' + else + StatusBar.Panels[0].Text := ''; + if DM.quDetail.UpdatesPending then + StatusBar.Panels[1].Text := 'Detail Updates Pending' + else + StatusBar.Panels[1].Text := ''; +end; + +procedure TMainForm.ShowTrans; +begin + if DM.InTransaction then + StatusBar.Panels[2].Text := 'UpdateTransaction is Active' + else + StatusBar.Panels[2].Text := ''; +end; + +procedure TMainForm.btApplyClick(Sender: TObject); +begin + if DM.quMaster.UpdatesPending then + DM.quMaster.ApplyUpdates; + if DM.quDetail.UpdatesPending then + DM.quDetail.ApplyUpdates; + ShowPending; +end; + +procedure TMainForm.btCommitClick(Sender: TObject); +begin + DM.quMaster.CommitUpdates; + DM.quDetail.CommitUpdates; + ShowPending; +end; + +procedure TMainForm.btCancelClick(Sender: TObject); +begin + if DM.quMaster.UpdatesPending then + DM.quMaster.CancelUpdates; + if DM.quDetail.UpdatesPending then + DM.quDetail.CancelUpdates; + ShowPending; +end; + +procedure TMainForm.btStartTransClick(Sender: TObject); +begin + DM.StartTransaction; + ShowTrans; +end; + +procedure TMainForm.btCommitTransClick(Sender: TObject); +begin + DM.CommitTransaction; + ShowTrans; +end; + +procedure TMainForm.btRollbackTransClick(Sender: TObject); +begin + DM.RollbackTransaction; + ShowTrans; +end; + +procedure TMainForm.btKillSessionClick(Sender: TObject); +begin + try + DM.KillSession; + btKillSession.Enabled := False; + meLog.Lines.Add(TimeToStr(Now) + ' Session was killed'); + except + on e: Exception do + meLog.Lines.Add(TimeToStr(Now) + ' ' + Trim(e.Message)); + end; +end; + +procedure TMainForm.lbAboutMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +begin + lbAbout.Font.Color := $4080FF; +end; + +procedure TMainForm.pnTopMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbAbout.Font.Color := $FF0000; +end; + +procedure TMainForm.lbAboutClick(Sender: TObject); +begin + AboutForm.ShowModal; + lbAbout.Font.Color := $FF0000; +end; + +procedure TMainForm.cbDebugClick(Sender: TObject); +begin + DM.quMaster.Debug := cbDebug.Checked; + DM.quDetail.Debug := cbDebug.Checked; + DM.scCreate.Debug := cbDebug.Checked; + DM.scDrop.Debug := cbDebug.Checked; +end; + +procedure TMainForm.btCreateDropClick(Sender: TObject); +var + s: string; +begin + if Sender = btDrop then + s := 'removed from database' + else + s := 'created in database'; + if MessageDlg(Format('Objects required for the demo will be %s. Continue?', [s]), + mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin + if Sender = btCreate then + DM.scCreate.Execute + else + DM.scDrop.Execute; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/DataSet.bdsproj b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/DataSet.bdsproj new file mode 100644 index 0000000..3f96cde --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/DataSet.bdsproj @@ -0,0 +1,177 @@ + + + + + + + + + + + + DataSet.dpr + + + + + + + + + + + + + + + + + + + + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + + + + + + + + D:\WINDOWS\microsoft.net\framework\v1.1.4322;D:\Program Files\CoreLab\Sdac for Delphi2005\Demos\dotNet\WinForms + D:\Program Files\CoreLab\Sdac for Delphi2005\Demos\dotNet\WinForms\Borland.VclDbRtl.dll;D:\Program Files\CoreLab\Sdac for Delphi2005\Demos\dotNet\WinForms\Borland.VclRtl.dll;D:\Program Files\CoreLab\Sdac for Delphi2005\Demos\dotNet\WinForms\Borland.Delphi.dll;D:\Program Files\CoreLab\Sdac for Delphi2005\Demos\dotNet\WinForms\CoreLab.Sdac.AdoNet.dll;D:\Program Files\CoreLab\Sdac for Delphi2005\Demos\dotNet\WinForms\CoreLab.Dac.dll;D:\Program Files\CoreLab\Sdac for Delphi2005\Demos\dotNet\WinForms\CoreLab.Sdac.dll;D:\WINDOWS\microsoft.net\framework\v1.1.4322\System.Design.dll;D:\WINDOWS\microsoft.net\framework\v1.1.4322\System.XML.dll;D:\WINDOWS\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll;D:\WINDOWS\microsoft.net\framework\v1.1.4322\System.Drawing.dll;D:\WINDOWS\microsoft.net\framework\v1.1.4322\System.Data.dll;D:\WINDOWS\microsoft.net\framework\v1.1.4322\System.dll + + + True + + + + + + False + + + + + + False + + + + $00000000 + + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/DataSet.dpr b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/DataSet.dpr new file mode 100644 index 0000000..a36dabb --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/DataSet.dpr @@ -0,0 +1,81 @@ +program DataSet; + +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Data.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Drawing.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.XML.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Design.dll'} +{%DelphiDotNetAssemblyCompiler 'CoreLab.Sdac.dll'} +{%DelphiDotNetAssemblyCompiler 'CoreLab.Dac.dll'} +{%DelphiDotNetAssemblyCompiler 'CoreLab.Sdac.AdoNet.dll'} +{%DelphiDotNetAssemblyCompiler 'Borland.Delphi.dll'} +{%DelphiDotNetAssemblyCompiler 'Borland.VclRtl.dll'} +{%DelphiDotNetAssemblyCompiler 'Borland.VclDbRtl.dll'} + +uses + System.Reflection, + System.Runtime.CompilerServices, + System.Windows.Forms, + MainForm in 'MainForm.pas' {MainForm.TMainForm: System.Windows.Forms.Form}; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle('')] +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\bin\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('..\\..\\mykey.snk')] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +[STAThread] +begin + Application.Run(TMainForm.Create); +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/MainForm.pas b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/MainForm.pas new file mode 100644 index 0000000..406c92c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/MainForm.pas @@ -0,0 +1,312 @@ +unit MainForm; + +interface + +uses + System.Drawing, System.Collections, System.ComponentModel, + System.Windows.Forms, System.Data, System.Globalization, + DB, MSAccess, DBAccess, SdacVcl, CoreLab.Sdac.DataAdapter; + +type + TMainForm = class(System.Windows.Forms.Form) + {$REGION 'Designer Managed Code'} + strict private + /// + /// Required designer variable. + /// + Components: System.ComponentModel.Container; + topPanel: System.Windows.Forms.Panel; + btConnect: System.Windows.Forms.Button; + btDisconnect: System.Windows.Forms.Button; + btFill: System.Windows.Forms.Button; + btClear: System.Windows.Forms.Button; + tbSql: System.Windows.Forms.TextBox; + dataGrid: System.Windows.Forms.DataGrid; + splitter: System.Windows.Forms.Splitter; + statusBar: System.Windows.Forms.StatusBar; + StatusBarPanel1: System.Windows.Forms.StatusBarPanel; + dataSet: System.Data.DataSet; + MSDataAdapter1: CoreLab.Sdac.DataAdapter.MSDataAdapter; + btUpdate: System.Windows.Forms.Button; + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + procedure InitializeComponent; + procedure btConnect_Click(sender: System.Object; e: System.EventArgs); + procedure btDisconnect_Click(sender: System.Object; e: System.EventArgs); + procedure btFill_Click(sender: System.Object; e: System.EventArgs); + procedure btClear_Click(sender: System.Object; e: System.EventArgs); + procedure TMainForm_Load(sender: System.Object; e: System.EventArgs); + procedure tbSql_Leave(sender: System.Object; e: System.EventArgs); + procedure btUpdate_Click(sender: System.Object; e: System.EventArgs); + {$ENDREGION} + strict protected + /// + /// Clean up any resources being used. + /// + procedure Dispose(Disposing: Boolean); override; + protected + ConnectDialog: TMSConnectDialog; + MSConnection: TMSConnection; + MSQuery: TMSQuery; + public + constructor Create; + end; + +implementation + +uses + MSConnectForm; + +{$REGION 'Windows Form Designer generated code'} +/// +/// Required method for Designer support - do not modify +/// the contents of this method with the code editor. +/// +procedure TMainForm.InitializeComponent; +type + TArrayOfSystem_Windows_Forms_StatusBarPanel = array of System.Windows.Forms.StatusBarPanel; +begin + Self.topPanel := System.Windows.Forms.Panel.Create; + Self.btClear := System.Windows.Forms.Button.Create; + Self.btFill := System.Windows.Forms.Button.Create; + Self.btDisconnect := System.Windows.Forms.Button.Create; + Self.btConnect := System.Windows.Forms.Button.Create; + Self.tbSql := System.Windows.Forms.TextBox.Create; + Self.dataGrid := System.Windows.Forms.DataGrid.Create; + Self.dataSet := System.Data.DataSet.Create; + Self.splitter := System.Windows.Forms.Splitter.Create; + Self.statusBar := System.Windows.Forms.StatusBar.Create; + Self.StatusBarPanel1 := System.Windows.Forms.StatusBarPanel.Create; + Self.MSDataAdapter1 := CoreLab.Sdac.DataAdapter.MSDataAdapter.Create; + Self.btUpdate := System.Windows.Forms.Button.Create; + Self.topPanel.SuspendLayout; + (System.ComponentModel.ISupportInitialize(Self.dataGrid)).BeginInit; + (System.ComponentModel.ISupportInitialize(Self.dataSet)).BeginInit; + (System.ComponentModel.ISupportInitialize(Self.StatusBarPanel1)).BeginInit; + Self.SuspendLayout; + // + // topPanel + // + Self.topPanel.Controls.Add(Self.btUpdate); + Self.topPanel.Controls.Add(Self.btClear); + Self.topPanel.Controls.Add(Self.btFill); + Self.topPanel.Controls.Add(Self.btDisconnect); + Self.topPanel.Controls.Add(Self.btConnect); + Self.topPanel.Dock := System.Windows.Forms.DockStyle.Top; + Self.topPanel.Location := System.Drawing.Point.Create(0, 0); + Self.topPanel.Name := 'topPanel'; + Self.topPanel.Size := System.Drawing.Size.Create(568, 24); + Self.topPanel.TabIndex := 0; + // + // btClear + // + Self.btClear.Location := System.Drawing.Point.Create(368, 0); + Self.btClear.Name := 'btClear'; + Self.btClear.TabIndex := 3; + Self.btClear.Text := 'Clear'; + Include(Self.btClear.Click, Self.btClear_Click); + // + // btFill + // + Self.btFill.Location := System.Drawing.Point.Create(200, 0); + Self.btFill.Name := 'btFill'; + Self.btFill.TabIndex := 2; + Self.btFill.Text := 'Fill'; + Include(Self.btFill.Click, Self.btFill_Click); + // + // btDisconnect + // + Self.btDisconnect.Location := System.Drawing.Point.Create(76, 0); + Self.btDisconnect.Name := 'btDisconnect'; + Self.btDisconnect.TabIndex := 1; + Self.btDisconnect.Text := 'Disconnect'; + Include(Self.btDisconnect.Click, Self.btDisconnect_Click); + // + // btConnect + // + Self.btConnect.Location := System.Drawing.Point.Create(0, 0); + Self.btConnect.Name := 'btConnect'; + Self.btConnect.TabIndex := 0; + Self.btConnect.Text := 'Connect'; + Include(Self.btConnect.Click, Self.btConnect_Click); + // + // tbSql + // + Self.tbSql.Dock := System.Windows.Forms.DockStyle.Top; + Self.tbSql.Font := System.Drawing.Font.Create('Courier New', 9.75); + Self.tbSql.Location := System.Drawing.Point.Create(0, 24); + Self.tbSql.Multiline := True; + Self.tbSql.Name := 'tbSql'; + Self.tbSql.Size := System.Drawing.Size.Create(568, 64); + Self.tbSql.TabIndex := 1; + Self.tbSql.Text := ''; + Include(Self.tbSql.Leave, Self.tbSql_Leave); + // + // dataGrid + // + Self.dataGrid.AllowNavigation := False; + Self.dataGrid.DataMember := ''; + Self.dataGrid.DataSource := Self.dataSet; + Self.dataGrid.Dock := System.Windows.Forms.DockStyle.Fill; + Self.dataGrid.HeaderForeColor := System.Drawing.SystemColors.ControlText; + Self.dataGrid.Location := System.Drawing.Point.Create(0, 90); + Self.dataGrid.Name := 'dataGrid'; + Self.dataGrid.Size := System.Drawing.Size.Create(568, 253); + Self.dataGrid.TabIndex := 2; + Self.dataGrid.AllowSorting := False; + // + // dataSet + // + Self.dataSet.DataSetName := 'NewDataSet'; + Self.dataSet.Locale := System.Globalization.CultureInfo.Create(''); + // + // splitter + // + Self.splitter.Cursor := System.Windows.Forms.Cursors.HSplit; + Self.splitter.Dock := System.Windows.Forms.DockStyle.Top; + Self.splitter.Location := System.Drawing.Point.Create(0, 88); + Self.splitter.Name := 'splitter'; + Self.splitter.Size := System.Drawing.Size.Create(568, 2); + Self.splitter.TabIndex := 3; + Self.splitter.TabStop := False; + // + // statusBar + // + Self.statusBar.Location := System.Drawing.Point.Create(0, 343); + Self.statusBar.Name := 'statusBar'; + Self.statusBar.Panels.AddRange(TArrayOfSystem_Windows_Forms_StatusBarPanel.Create(Self.StatusBarPanel1)); + Self.statusBar.ShowPanels := True; + Self.statusBar.Size := System.Drawing.Size.Create(568, 22); + Self.statusBar.TabIndex := 4; + // + // StatusBarPanel1 + // + Self.StatusBarPanel1.AutoSize := System.Windows.Forms.StatusBarPanelAutoSize.Spring; + Self.StatusBarPanel1.Width := 552; + // + // MSDataAdapter1 + // + Self.MSDataAdapter1.DataSet := nil; + Self.MSDataAdapter1.Name := ''; + Self.MSDataAdapter1.Tag := nil; + // + // btUpdate + // + Self.btUpdate.Location := System.Drawing.Point.Create(280, 0); + Self.btUpdate.Name := 'btUpdate'; + Self.btUpdate.TabIndex := 4; + Self.btUpdate.Text := 'Update'; + Include(Self.btUpdate.Click, Self.btUpdate_Click); + // + // TMainForm + // + Self.AutoScaleBaseSize := System.Drawing.Size.Create(5, 13); + Self.ClientSize := System.Drawing.Size.Create(568, 365); + Self.Controls.Add(Self.dataGrid); + Self.Controls.Add(Self.splitter); + Self.Controls.Add(Self.tbSql); + Self.Controls.Add(Self.topPanel); + Self.Controls.Add(Self.statusBar); + Self.Name := 'TMainForm'; + Self.Text := 'Sdac .NET demo - using DataSet component'; + Include(Self.Load, Self.TMainForm_Load); + Self.topPanel.ResumeLayout(False); + (System.ComponentModel.ISupportInitialize(Self.dataGrid)).EndInit; + (System.ComponentModel.ISupportInitialize(Self.dataSet)).EndInit; + (System.ComponentModel.ISupportInitialize(Self.StatusBarPanel1)).EndInit; + Self.ResumeLayout(False); +end; +{$ENDREGION} + +procedure TMainForm.Dispose(Disposing: Boolean); +begin + if Disposing then + begin + if Components <> nil then + Components.Dispose(); + end; + inherited Dispose(Disposing); +end; + +constructor TMainForm.Create; +begin + inherited Create; + // + // Required for Windows Form Designer support + // + InitializeComponent; + ConnectDialog := TMSConnectDialog.Create(nil); + with ConnectDialog do begin + SavePassword := True; + Caption := 'Connect'; + UsernameLabel := 'Username'; + PasswordLabel := 'Password'; + ServerLabel := 'Server'; + ConnectButton := 'Connect'; + CancelButton := 'Cancel'; + end; + MSConnection := TMSConnection.Create(nil); + with MSConnection do begin + ConnectDialog := ConnectDialog; + LoginPrompt := True; + Username := 'sa'; + Database := 'Northwind'; + Password := ''; + end; + MSQuery := TMSQuery.Create(nil); + with MSQuery do begin + Connection := MSConnection; + SQL.Text := 'select * from Orders'; + end; + MSDataAdapter1.DataSet := MSQuery; +end; + +procedure TMainForm.btUpdate_Click(sender: System.Object; e: System.EventArgs); +begin + MSDataAdapter1.Update(dataSet, 'Table1'); +end; + +procedure TMainForm.TMainForm_Load(sender: System.Object; e: System.EventArgs); +begin + tbSql.Text := MSQuery.SQL.Text; +end; + +procedure TMainForm.tbSql_Leave(sender: System.Object; e: System.EventArgs); +begin + MSQuery.SQL.Text := tbSql.Text; +end; + +procedure TMainForm.btConnect_Click(sender: System.Object; e: System.EventArgs); +begin + MSConnection.Open; +end; + +procedure TMainForm.btDisconnect_Click(sender: System.Object; e: System.EventArgs); +begin + MSConnection.Close; +end; + +procedure TMainForm.btFill_Click(sender: System.Object; e: System.EventArgs); +begin + MSDataAdapter1.Fill(dataSet, 'Table1'); + dataGrid.DataMember := 'Table1'; +end; + +procedure TMainForm.btClear_Click(sender: System.Object; e: System.EventArgs); +var + table: DataTable; + i: integer; +begin + dataGrid.DataMember := ''; + dataSet.Clear; + + for i := 0 to dataSet.Tables.Count - 1 do begin + table := dataSet.Tables[i]; + table.Constraints.Clear; + table.Columns.Clear; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/MainForm.resx b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/MainForm.resx new file mode 100644 index 0000000..e036091 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/MainForm.resx @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + True + + + 8, 8 + + + True + + + Private + + + False + + + Private + + + False + + + Private + + + False + + + Private + + + False + + + Private + + + False + + + Private + + + False + + + Private + + + 17, 17 + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + 107, 17 + + + Private + + + False + + + Private + + + False + + + (Default) + + + False + + + False + + + 8, 8 + + + True + + + 64 + + + True + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/ReadMe.txt b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/ReadMe.txt new file mode 100644 index 0000000..e00d37f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/Miscellaneous/WinForms/ReadMe.txt @@ -0,0 +1,7 @@ +SQL Server Data Access Components +Copyright 1997-2007, Core Lab. All Rights Reserved +-------------------------------------------------- + +Shows how to use SDAC to create a WinForm application. This demo +project creates a simple WinForms application and fills a data grid +from an MSDataAdapter data source. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/CategoryFrame.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/CategoryFrame.nfm new file mode 100644 index 0000000..6cf1e3d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/CategoryFrame.nfm @@ -0,0 +1,5 @@ +inherited CategoryFrame: TCategoryFrame + Width = 451 + Height = 304 + Align = alClient +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/CategoryFrame.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/CategoryFrame.pas new file mode 100644 index 0000000..becc115 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/CategoryFrame.pas @@ -0,0 +1,193 @@ +unit CategoryFrame; + +interface + +uses +{$IFDEF LINUX} + QControls, QStdCtrls, QComCtrls, QGraphics, QForms, +{$ELSE} + Controls, StdCtrls, ShellApi, Windows, Forms, +{$IFDEF WIN32} + OleCtrls, SHDocVw, mshtml, ActiveX, +{$ELSE} + Graphics, Types, +{$ENDIF} +{$ENDIF} +{$IFNDEF VER130} + Variants, +{$ENDIF} + SysUtils, Classes, DemoFrame; + +type +{$IFNDEF WIN32} + TOnNavigate = procedure (DemoDescription: string) of object; +{$ELSE} + TOnNavigate = procedure (Index: integer) of object; +{$ENDIF} + + TCategoryFrame = class(TDemoFrame) + protected + FOnNavigate: TOnNavigate; + FDemosDescription: {$IFNDEF WIN32}TListBox{$ELSE}TWebBrowser{$ENDIF}; + FTempFileName: string; // for Win98 problem avoidance + public + procedure SetDemoDescriptions(Descriptions: TStrings); + constructor Create(AOwner: TComponent); override; + {$IFNDEF WIN32} + procedure DemosDescriptionDblClick(Sender: TObject); + procedure DemoDescriptionMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); + {$ELSE} + procedure DemosDescriptionBeforeNavigate2(Sender: TObject; + const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, + Headers: OleVariant; var Cancel: WordBool); + {$ENDIF} + property OnNavigate: TOnNavigate read FOnNavigate write FOnNavigate; + {$IFNDEF WIN32} + property DemosDescription: TListBox read FDemosDescription; + {$ENDIF} + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFDEF VER130} +function TryStrToInt(const S: string; out Value: Integer): boolean; +begin + Result := True; + try + Value := StrToInt(S); + except + Result := False + end; +end; +{$ENDIF} + +constructor TCategoryFrame.Create(AOwner: TComponent); +begin + inherited; +{$IFNDEF WIN32} + FDemosDescription := TListBox.Create(self); +{$IFDEF LINUX} + FDemosDescription.Font.Name := 'adobe-courier'; + FDemosDescription.Font.Pitch := fpFixed; +{$ENDIF} +{$IFDEF CLR} + FDemosDescription.Font.Name := 'courier new'; + FDemosDescription.Font.Size := 11; +{$ENDIF} + FDemosDescription.OnDblClick := DemosDescriptionDblClick; + FDemosDescription.OnMouseMove := DemoDescriptionMouseMove; +{$ELSE} + FDemosDescription := TWebBrowser.Create(self); + FDemosDescription.Navigate('about:blank'); // to create document object + FDemosDescription.OnBeforeNavigate2 := DemosDescriptionBeforeNavigate2; +{$ENDIF} + InsertControl(FDemosDescription); + FDemosDescription.Align := alClient; +end; + +{$IFNDEF WIN32} + +procedure TCategoryFrame.SetDemoDescriptions(Descriptions: TStrings); +begin + FDemosDescription.Items.Assign(Descriptions); +end; + +procedure TCategoryFrame.DemoDescriptionMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +var + n: integer; +begin + n := FDemosDescription.ItemAtPos(Point(X, Y), True); + If (n = -1) or (Trim(FDemosDescription.Items[n]) = '') or (FDemosDescription.Items[n][1] = ' ') then + FDemosDescription.Cursor := crDefault + else + FDemosDescription.Cursor := crHandPoint; +end; + +// Navigation +procedure TCategoryFrame.DemosDescriptionDblClick(Sender: TObject); +begin + inherited; + if (Trim(FDemosDescription.Items[FDemosDescription.ItemIndex]) <> '') and (pos(' ', FDemosDescription.Items[FDemosDescription.ItemIndex]) <> 1) and Assigned(FOnNavigate) then begin + FOnNavigate(FDemosDescription.Items[FDemosDescription.ItemIndex]); + end; +end; + +{$ELSE} + +procedure TCategoryFrame.SetDemoDescriptions(Descriptions: TStrings); +var + v: Variant; + HTMLDocument: IHTMLDocument2; + Len: integer; +begin + HTMLDocument := FDemosDescription.Document as IHTMLDocument2; + if Assigned(HTMLDocument) then begin + v := VarArrayCreate([0, 0], varVariant); + v[0] := Descriptions.Text; + HTMLDocument.Write(PSafeArray(TVarData(v).VArray)); + HTMLDocument.Close; + end + else begin + Len := GetEnvironmentVariable(PChar('TEMP'), nil, 0); + if Len > 0 then + begin + SetLength(FTempFileName, Len - 1); + GetEnvironmentVariable(PChar('TEMP'), PChar(FTempFileName), Len); + end; + if Length(FTempFileName) > 1 then begin + if FTempFileName[length(FTempFileName) - 1] <> '\' then + FTempFileName := FTempFileName + '\'; + FTempFileName := FTempFileName + 'DAC_Demo_tmp.html'; + Descriptions.SaveToFile(FTempFileName); + FDemosDescription.Navigate(FTempFileName) + end; + end; +end; + +// Navigation +procedure TCategoryFrame.DemosDescriptionBeforeNavigate2(Sender: TObject; + const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, + Headers: OleVariant; var Cancel: WordBool); +var + Index: integer; + str: string; +begin + str := ExtractFileName(URL); + if (str = 'blank') or (str = ExtractFileName(FTempFileName)) then // navigating 'about:blank', or the html temporary file + Exit; // let navigator to handle + // our handler + Cancel := True; +{$IFNDEF LINUX} + if not TryStrToInt(str, Index) then begin + str := ExtractFilePath(Application.Exename) + copy(url, 4, Length(url) - 3); + ShellExecute(0, 'open', PChar(str), '', '.', SW_SHOW); + exit; + end; +{$ENDIF} + if Assigned(FOnNavigate) then + FOnNavigate(Index); +end; + +{$ENDIF} + +{$IFDEF WIN32} +initialization + OleInitialize(nil); + +finalization + OleUninitialize; +{$ENDIF} + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DacDemo.inc b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DacDemo.inc new file mode 100644 index 0000000..27dc695 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DacDemo.inc @@ -0,0 +1,13 @@ +{$IFNDEF LINUX} + { $DEFINE USE_SYNEDIT} + {$IFNDEF VER130} + {$IFNDEF VER140} + {$IFNDEF CLR} + {$DEFINE XPMAN} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF} +{$IFNDEF CLR} + {$DEFINE HAVE_COMPRESS} +{$ENDIF} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoBase.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoBase.pas new file mode 100644 index 0000000..5bebb5b --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoBase.pas @@ -0,0 +1,416 @@ +unit DemoBase; + +interface + +uses + Classes, SysUtils, DemoFrame, CategoryFrame, DBAccess, MemUtils, +{$IFDEF LINUX} + QControls, QGraphics, QComCtrls, QForms +{$ELSE} + Windows, ComCtrls, Controls, Graphics, Forms, + HTMLConsts, ShellAPI +{$ENDIF} + ; + +type + TDemoType = (dtDemo, dtCategory); + + TDemo = class + protected + FName: string; + FFileName: string; + FHint: string; + FDescription: string; + FDemoType: TDemoType; + FFrameClass: TDemoFrameClass; + FFrame: TDemoFrame; + public + constructor Create(Name, Hint, Description: string; DemoType: TDemoType; FrameClass: TDemoFrameClass; FileName: string = ''); + destructor Destroy; override; + + procedure LoadDemoCode(Strings: TStrings); + procedure LoadFormCode(Strings: TStrings); + procedure OpenDemoFolder; + procedure FreeFrame; + + property Name: string read FName; + property Hint: string read FHint; + property Description: string read FDescription; + property DemoType: TDemoType read FDemoType; + property FrameClass: TDemoFrameClass read FFrameClass; + property Frame: TDemoFrame read FFrame; + end; + + TDemos = class + protected + FDemoTreeNodes: TTreeNodes; + FSelectedDemo: TDemo; + FSupplementaryDemosDescription: TStrings; + function GetSelectedDemo: TDemo; + function GetItems(Index: integer): TDemo; + + function WrapDescription(Demo: TDemo): TStrings; + public + constructor Create(TreeNodes: TTreeNodes); virtual; + destructor Destroy; override; + + procedure RegisterCategory(CategoryName, Hint: string; ImgIndex: integer = -1; SupplementaryDemo: boolean = False); + procedure RegisterDemo(DemoName, DemoHint, DemoDescription, DemoCategory: string; FrameClass: TDemoFrameClass; ImgIndex: integer; FileName: string = ''; SupplementaryDemo: boolean = False); + procedure Clear; + //Navigation + function SelectDemo(DemoIndex: integer): TDemo; //Create demo frame by DemoIndex + + function GetDemoIndex(AbsoluteIndex: integer): integer; + + property Items[Index: integer]: TDemo read GetItems; default; + property SelectedDemo: TDemo read GetSelectedDemo; + end; + +implementation + +const + MainDemosHeader = 'Main Demo Projects'; + SupplementaryDemosHeader = 'Supplementary Demo Projects'; + SupplementaryDemosNote = ' Note, the demo projects listed below are separate projects. ' {$IFNDEF WIN32} + #13#10 {$ENDIF} + ' This project contains only their descriptions and links to their folders.'; + +{$IFNDEF WIN32} +procedure WriteTable(CategoryName, CategoryDescription: string; List: TStrings); +var + strs: TStringList; +begin + List.Add(' '); + List.Add(' ' + CategoryName); + strs := TStringList.Create; + strs.Text := CategoryDescription; + List.AddStrings(strs); + strs.Free; +end; +{$ELSE} +procedure WriteTable(CategoryName, CategoryDescription: string; List: TStrings); +begin + if CategoryName = '' then begin // used to close virtual category + List.Add(''); + Exit; + end; + + List.Add('

' + CategoryName + '

'); + List.Add(''); + List.Add(''); + List.Add(''); + List.Add(''); + List.Add(''); + if CategoryDescription <> '' then begin + List.Add(CategoryDescription); + List.Add('
DemoDescription
'); + end; +end; +{$ENDIF} + +constructor TDemos.Create(TreeNodes: TTreeNodes); +begin + inherited Create; + + if not Assigned(TreeNodes) then + raise Exception.Create('TreeNodes should be set'); + FDemoTreeNodes := TreeNodes; + FSupplementaryDemosDescription := TStringList.Create; +{$IFNDEF WIN32} + FSupplementaryDemosDescription.Text := #13#10' ' + SupplementaryDemosHeader; + FSupplementaryDemosDescription.Add(SupplementaryDemosNote); +{$ENDIF} +end; + +destructor TDemos.Destroy; +begin + Clear; + inherited; +end; + +procedure TDemos.RegisterCategory(CategoryName, Hint: string; ImgIndex: integer = -1; SupplementaryDemo: boolean = False); +var + Node: TTreeNode; + Index: integer; + Category: TDemo; +begin + if SupplementaryDemo then + WriteTable(CategoryName, Hint, FSupplementaryDemosDescription) + else begin + Category := TDemo.Create(CategoryName, Hint, '', dtCategory, TCategoryFrame); + Node := FDemoTreeNodes.AddChildObject(FDemoTreeNodes.GetFirstNode, CategoryName, Category); + if ImgIndex < 0 then + Index := 0 + else + Index := ImgIndex; + Node.ImageIndex := Index; + Node.SelectedIndex := Index; + {$IFNDEF LINUX} + Node.StateIndex := Index; + {$ENDIF} + end; +end; + +procedure TDemos.RegisterDemo(DemoName, DemoHint, DemoDescription, DemoCategory: string; FrameClass: TDemoFrameClass; ImgIndex: integer; FileName: string = ''; SupplementaryDemo: boolean = False); + + function FindCategoryNode(CategoryName: string): TTreeNode; + var + RootNode: TTreeNode; + begin + RootNode := FDemoTreeNodes.GetFirstNode; + if RootNode <> nil then + Result := RootNode.getFirstChild + else + Result := nil; + while Result <> nil do begin + if Result.Text = CategoryName then + break; + Result := Result.getNextSibling; + end; + end; + +{$IFNDEF WIN32} + function CompleteWithSpaces(s: string; ResultLength: word): string; + var + n, i: integer; + begin + result := s; + n := ResultLength - Length(s); + if n > 0 then + for i := 1 to n do + result := result + ' '; + end; +{$ENDIF} + + function ToTableLine(Name, Description, DemoLink: string): string; + begin + {$IFDEF WIN32} + Result := Format(' ' + + '%s%s'#13#10, + [DemoLink, Name, Description]); + {$ELSE} + Result := CompleteWithSpaces(Name, 15) + '- ' + Description + {$IFDEF LINUX}#13{$ELSE}#13#10{$ENDIF}; + {$ENDIF} + end; + +var + CategoryNode, DemoNode: TTreeNode; + Index: integer; + Category, Demo: TDemo; +begin + if SupplementaryDemo then + FSupplementaryDemosDescription.Text := FSupplementaryDemosDescription.Text + ToTableLine(DemoName, DemoDescription, '..\' + DemoCategory + '\' + DemoName) + else begin + CategoryNode := FindCategoryNode(DemoCategory); + if not Assigned(CategoryNode) then + raise Exception.Create('DemoCategory is wrong'); + + Category := TDemo(CategoryNode.Data); + Demo := TDemo.Create(DemoName, DemoHint, DemoDescription, dtDemo, FrameClass, FileName); + DemoNode := FDemoTreeNodes.AddChildObject(CategoryNode, Demo.Name, Demo); + if ImgIndex < 0 then + Index := 1 + else + Index := ImgIndex; + DemoNode.ImageIndex := Index; + DemoNode.SelectedIndex := Index; + {$IFNDEF LINUX} + DemoNode.StateIndex := Index; + {$ENDIF} + + Category.FDescription := Category.FDescription + ToTableLine(DemoName, DemoDescription, IntToStr(DemoNode.AbsoluteIndex)); + end; +end; + +procedure TDemos.Clear; +var + i: integer; +begin + for i := 0 to FDemoTreeNodes.Count - 1 do + if FDemoTreeNodes[i].Data <> nil then + TDemo(FDemoTreeNodes[i].Data).Free; +end; + +function TDemos.GetSelectedDemo: TDemo; +begin + if FSelectedDemo <> nil then + Result := FSelectedDemo + else + raise Exception.Create('No selected demo'); +end; + +function TDemos.GetDemoIndex(AbsoluteIndex: integer): integer; +var + i: integer; +begin + Result := -1; + for i := 0 to FDemoTreeNodes.Count - 1 do + if FDemoTreeNodes[i].AbsoluteIndex = AbsoluteIndex then begin + if FDemoTreeNodes[i].Data <> nil then + Result := i; + Break; + end; +end; + +function TDemos.GetItems(Index: integer): TDemo; +var + i: integer; +begin + i := GetDemoIndex(Index); + if i >= 0 then + Result := TDemo(FDemoTreeNodes[i].Data) + else + raise Exception.Create('Wrong demo index'); +end; + +function TDemos.WrapDescription(Demo: TDemo): TStrings; + +var + CatNode, RootNode: TTreeNode; +begin + Result := TStringList.Create; +{$IFDEF WIN32} + Result.Add(HTMLHeader); + Result.Add('

' + MainDemosHeader + '

'); +{$ELSE} + Result.Add(''); + Result.Add(' ' + MainDemosHeader); + Result.Add(''); +{$ENDIF} + if Demo <> GetItems(0) then //RootCategory + WriteTable(Demo.Name, Demo.Description, Result) + else begin + RootNode := FDemoTreeNodes.GetFirstNode; + CatNode := RootNode.getFirstChild; + while CatNode <> nil do begin + WriteTable(TDemo(CatNode.Data).Name, TDemo(CatNode.Data).Description, Result); + CatNode := CatNode.getNextSibling; + end; +{$IFDEF WIN32} + Result.Add('


' + SupplementaryDemosHeader + '

'); + Result.Add('

' + SupplementaryDemosNote + '

'); +{$ENDIF} + + Result.AddStrings(FSupplementaryDemosDescription); + end; +{$IFDEF WIN32} + Result.Add(HTMLFooter); +{$ENDIF} +end; + +function TDemos.SelectDemo(DemoIndex: integer): TDemo; //Init and show demo by DemoIndex +var + Descriptions: TStrings; +begin + Result := GetItems(DemoIndex); + if (FSelectedDemo <> nil) and (Result <> FSelectedDemo) then + if FSelectedDemo.DemoType <> dtCategory then + FSelectedDemo.FreeFrame //In case of demo selection change we should free demo frame except category description + else + FSelectedDemo.Frame.Hide; + FSelectedDemo := Result; + with FSelectedDemo do + if FFrame = nil then begin + FFrame := FFrameClass.Create(nil); + if DemoType = dtCategory then begin + Descriptions := WrapDescription(FSelectedDemo); + try + TCategoryFrame(FFrame).SetDemoDescriptions(Descriptions); + finally + Descriptions.Free; + end; + end; + end + else + FFrame.Show; +end; + +{TDemo} +constructor TDemo.Create(Name, Hint, Description: string; DemoType: TDemoType; FrameClass: TDemoFrameClass; FileName: string = ''); +begin + inherited Create; + + FName := Name; + if FileName = '' then + FFileName := Name + else + FFileName := FileName; + FHint := Hint; + FDescription := Description; + FFrameClass := FrameClass; + FDemoType := DemoType; +end; + +destructor TDemo.Destroy; +begin + FreeFrame; + + inherited; +end; + +procedure TDemo.LoadDemoCode(Strings: TStrings); +var + FileName: string; +begin + if DemoType = dtCategory then + Strings.Clear + else begin + {$IFDEF LINUX} + FileName := Format('%s/%s/%s.pas', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ELSE} + FileName := Format('%s\%s\%s.pas', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ENDIF} + + if FileExists(FileName) then + Strings.LoadFromFile(FileName) + else + Strings.Clear; + end; +end; + +procedure TDemo.LoadFormCode(Strings: TStrings); +var + FileName: string; +begin + if DemoType = dtCategory then + Strings.Clear + else begin + {$IFDEF LINUX} + FileName := Format('%s/%s/%s.xfm', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ENDIF} + {$IFDEF CLR} + FileName := Format('%s\%s\%s.nfm', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ENDIF} + {$IFDEF WIN32} + FileName := Format('%s\%s\%s.dfm', [ExtractFilePath(Application.ExeName), Name, FFileName]); + {$ENDIF} + + if FileExists(FileName) then + Strings.LoadFromFile(FileName) + else + Strings.Clear; + end; +end; + +procedure TDemo.OpenDemoFolder; +{$IFNDEF LINUX} +var + FolderName: string; +begin + if DemoType = dtDemo then begin + FolderName := ExtractFilePath(Application.ExeName) + Name; + ShellExecute(0, 'open', PChar(FolderName), '', '.', SW_SHOW); + end; +end; +{$ELSE} +begin + +end; +{$ENDIF} + +procedure TDemo.FreeFrame; +begin + FFrame.Free; + FFrame := nil; +end; + + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoForm.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoForm.nfm new file mode 100644 index 0000000..631bd91 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoForm.nfm @@ -0,0 +1,937 @@ +object DemoForm: TDemoForm + Left = 71 + Top = 139 + Width = 957 + Height = 500 + Caption = 'Data Access Components demos' + Color = clSilver + Constraints.MinHeight = 500 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + Scaled = False + ShowHint = True + WindowState = wsMaximized + OnCreate = FormCreate + OnDestroy = FormDestroy + OnResize = FormResize + PixelsPerInch = 96 + TextHeight = 13 + object TVSplitter: TSplitter + Left = 216 + Top = 69 + Height = 374 + Beveled = True + Color = 9790720 + MinSize = 150 + ParentColor = False + OnCanResize = TVSplitterCanResize + OnMoved = TVSplitterMoved + end + object MainPanel: TPanel + Left = 219 + Top = 69 + Width = 730 + Height = 374 + Align = alClient + BevelOuter = bvNone + Constraints.MinWidth = 730 + TabOrder = 2 + object pnDemo: TPanel + Left = 0 + Top = 0 + Width = 730 + Height = 374 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + end + object pnSource: TPanel + Left = 0 + Top = 0 + Width = 730 + Height = 374 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + Visible = False + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 443 + Width = 949 + Height = 20 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Panels = < + item + Width = 220 + end + item + Width = 100 + end + item + Width = 480 + end + item + Width = 50 + end> + UseSystemFont = False + end + object PanelUnderTree: TPanel + Left = 0 + Top = 69 + Width = 216 + Height = 374 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object TreeView: TTreeView + Left = 0 + Top = 22 + Width = 351 + Height = 352 + Align = alLeft + HideSelection = False + HotTrack = True + Images = ImageList1 + Indent = 21 + ParentShowHint = False + ReadOnly = True + ShowHint = True + TabOrder = 0 + OnChange = TreeViewChange + OnClick = TreeViewClick + OnKeyDown = TreeViewKeyDown + OnMouseMove = TreeViewMouseMove + end + object ToolBar: TToolBar + Left = 0 + Top = 0 + Width = 216 + Height = 22 + AutoSize = True + ButtonWidth = 28 + Caption = 'ToolBar' + DisabledImages = ilDisabledButtons + EdgeInner = esNone + EdgeOuter = esNone + Flat = True + Images = ilButtons + TabOrder = 1 + object tbBrowseBack: TToolButton + Left = 0 + Top = 0 + Hint = 'Back' + Caption = ' Back ' + DropdownMenu = BackHistoryPopup + ImageIndex = 0 + Style = tbsDropDown + OnClick = tbBrowseBackClick + end + object tbBrowseForward: TToolButton + Left = 41 + Top = 0 + Hint = 'Forward' + DropdownMenu = ForwardHistoryPopup + ImageIndex = 1 + Style = tbsDropDown + OnClick = tbBrowseForwardClick + end + end + end + object pnTopLabel: TPanel + Left = 0 + Top = 0 + Width = 949 + Height = 41 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + object lbTitle: TLabel + Left = 0 + Top = 0 + Width = 949 + Height = 42 + Cursor = crArrow + Align = alTop + Caption = 'DAC demos' + Color = 9790720 + Constraints.MinWidth = 130 + Font.Charset = RUSSIAN_CHARSET + Font.Color = clWhite + Font.Height = -35 + Font.Name = 'Verdana' + Font.Style = [fsBold, fsItalic] + ParentColor = False + ParentFont = False + OnMouseMove = lbTitleMouseMove + end + object lbAbout: TLabel + Left = 854 + Top = 12 + Width = 34 + Height = 13 + Caption = 'About' + Color = 9790720 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold, fsUnderline] + ParentColor = False + ParentFont = False + OnClick = lbAboutClick + OnMouseMove = lbAboutMouseMove + end + end + object Panel2: TPanel + Left = 0 + Top = 41 + Width = 949 + Height = 28 + Align = alTop + BevelOuter = bvNone + TabOrder = 4 + object Shape1: TShape + Left = 0 + Top = 25 + Width = 949 + Height = 3 + Align = alBottom + Brush.Color = 9790720 + Pen.Color = clBtnFace + end + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 375 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 0 + object sbConnect: TSpeedButton + Left = 1 + Top = 1 + Width = 100 + Height = 22 + Hint = 'Connect to database' + Caption = 'Connect' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + Glyph.Data = { + F6050000424DF60500000000000036000000280000001E000000100000000100 + 180000000000C005000000000000000000000000000000000000800080800080 + 8000808000808000808000808000808000808000808000804B40388000808000 + 8080008080008080008080008080008080008080008080008080008080008080 + 00808000803E3E3E800080800080800080800080000080008080008080008080 + 00808000808000808000808000808000808000808000804C40373E352D800080 + 8000808000808000808000808000808000808000808000808000808000808000 + 808000803E3E3E33333380008080008000008000808000808000808000808000 + 808000808000808000807E6A5C80008066574B594B414C403880008080008080 + 0080800080800080800080800080800080800080800080686868800080555555 + 4949493E3E3E8000808000800000800080800080800080800080800080800080 + 8000808000808000807E6B5D72615466564B594B428000808000808000808000 + 808000808000808000808000808000808000808000806868685E5E5E54545449 + 49498000808000800000800080A2C8D864A8C0608D9F5D83964A768D346D8C30 + 70925C8AA38874647E6B5C73615466564B800080800080800080C8C8C8A7A7A7 + 8D8D8D8484847878787070707373738C8C8C7171716868685F5F5F5454548000 + 808000800000800080638CA53FBCE884D5E8A1EBF673E4FF24BEF3039FDE148B + BE45729080008080008080008066574B8000808000808E8E8EBBBBBBD1D1D1E6 + E6E6DFDFDFBCBCBCA0A0A08D8D8D767676800080800080800080555555800080 + 00008000806B94AD44C4F090EAFAA1EBF671D9F424BCF201A7E8039CDA2A6384 + 800080800080800080736154800080800080969696C3C3C3E4E4E4E6E6E6D5D5 + D5BBBBBBA8A8A89D9D9D6666668000808000808000805F5F5F80008000008000 + 806B94AD44C4F08DE4F4A1EBF670D7F224B9EE01A7E8039CDA2F688897806F91 + 7A6A887464800080800080800080969696C3C3C3DFDFDFE6E6E6D3D3D3B8B8B8 + A8A8A89D9D9D6B6B6B7D7D7D77777771717180008080008000008000806B9CAD + 3FBCE88EE4F5A1EBF670D7F224B9EE01A7E8039CDA306B8A8000808000808000 + 808000808000808000809B9B9BBBBBBBDFDFDFE6E6E6D3D3D3B8B8B8A8A8A89D + 9D9D6D6D6D80008080008080008080008080008000008000806B9CB53BB8E67E + E4FEA1EBF672D9F224B9EE01A7E8039CDA326D8D800080800080800080800080 + 8000808000809E9E9EB8B8B8E0E0E0E6E6E6D5D5D5B8B8B8A8A8A89D9D9D7070 + 708000808000808000808000808000800000800080739CB53BB8E67EE4FEA1EB + F66FD7F21FB7EE01A7E8039CDA346F8F80008080008080008080008080008080 + 00809E9E9EB8B8B8E0E0E0E6E6E6D3D3D3B6B6B6A8A8A89D9D9D727272800080 + 800080800080800080800080000080008073A5BD3BB8E67EE4FEA0EAF56ED6F2 + 1FB7EE01A7E8039CDA317092800080800080800080800080800080800080A6A6 + A6B8B8B8E0E0E0E5E5E5D2D2D2B6B6B6A8A8A89D9D9D73737380008080008080 + 0080800080800080000080008073A5BD58C9E78CECFFA0EAF5A6EDF894E7F871 + D9F63CBDE9437C97800080800080800080800080800080800080A6A6A6C5C5C5 + E7E7E7E5E5E5E8E8E8E2E2E2D6D6D6BCBCBC7D7D7D8000808000808000808000 + 8080008000008000806691A2A0DFEAC5F9FDC5F9FDC5F9FDC5F9FDC5F9FDA0DF + EA6691A2800080800080800080800080800080800080919191DBDBDBF4F4F4F4 + F4F4F4F4F4F4F4F4F4F4F4DBDBDB919191800080800080800080800080800080 + 0000800080B8D1DB84AFBF6FA2B46B9BAE6C9DAF6B9BAE6FA2B484AFBFB8D1DB + 800080800080800080800080800080800080D1D1D1AFAFAFA1A1A19B9B9B9D9D + 9D9B9B9BA1A1A1AFAFAFD1D1D180008080008080008080008080008000008000 + 8080008080008080008080008080008080008080008080008080008080008080 + 0080800080800080800080800080800080800080800080800080800080800080 + 8000808000808000808000808000808000808000808000800000} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = sbConnectClick + end + object sbDisconnect: TSpeedButton + Left = 102 + Top = 1 + Width = 100 + Height = 22 + Hint = 'Dsisconnect from database' + Caption = 'Disconnect' + Enabled = False + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + Glyph.Data = { + 9A050000424D9A0500000000000036000000280000001E0000000F0000000100 + 1800000000006405000000000000000000000000000000000000800080800080 + 800080800080800080800080800080AFBBF7800080800080800080CFCBE38000 + 80800080800080800080800080800080800080800080800080800080CBCBCB80 + 0080800080800080D2D2D2800080800080800080000080008080008080008080 + 0080800080800080CFCBE31140FD6178EE8000806176EA3154F2CFCBE3800080 + 800080800080800080800080800080800080800080D2D2D27373739898988000 + 809696967F7F7FD2D2D280008080008000008000808000808000808000808000 + 808000808000803157F90134FF214BF90134FF3155F480008080008080008080 + 00808000808000808000808000808000808000808383836B6B6B7A7A7A6B6B6B + 8080808000808000808000800000800080A2C8D864A8C0608D9F5D83964A768D + 346D8CFFFFFF1140FD0134FF113FFC800080800080800080800080800080C8C8 + C8A7A7A78D8D8D848484787878707070FFFFFF7373736B6B6B72727280008080 + 00808000808000800000800080638CA53FBCE884D5E8A1EBF673E4FFFFFFFF61 + 7CF60134FF0134FF0134FF6178EE8000808000808000808000808E8E8EBBBBBB + D1D1D1E6E6E6DFDFDFFFFFFF9D9D9D6B6B6B6B6B6B6B6B6B9898988000808000 + 8080008000008000806B94AD44C4F090EAFAA1EBF671D9F4BFC8F70134FF3158 + FBFFFFFF3157F91140FDBFC8F7800080800080800080969696C3C3C3E4E4E4E6 + E6E6D5D5D5D5D5D56B6B6B848484FFFFFF838383737373D5D5D5800080800080 + 00008000806B94AD44C4F08DE4F4A1EBF670D7F224B9EEAFBBF7FFFFFF2F6888 + 800080CFCBE3800080800080800080800080969696C3C3C3DFDFDFE6E6E6D3D3 + D3B8B8B8CBCBCBFFFFFF6B6B6B800080D2D2D280008080008080008000008000 + 806B9CAD3FBCE88EE4F5A1EBF670D7F224B9EE01A7E8039CDA306B8A80008080 + 00808000808000808000808000809B9B9BBBBBBBDFDFDFE6E6E6D3D3D3B8B8B8 + A8A8A89D9D9D6D6D6D80008080008080008080008080008000008000806B9CB5 + 3BB8E67EE4FEA1EBF672D9F224B9EE01A7E8039CDA326D8D8000808000808000 + 808000808000808000809E9E9EB8B8B8E0E0E0E6E6E6D5D5D5B8B8B8A8A8A89D + 9D9D7070708000808000808000808000808000800000800080739CB53BB8E67E + E4FEA1EBF66FD7F21FB7EE01A7E8039CDA346F8F800080800080800080800080 + 8000808000809E9E9EB8B8B8E0E0E0E6E6E6D3D3D3B6B6B6A8A8A89D9D9D7272 + 72800080800080800080800080800080000080008073A5BD3BB8E67EE4FEA0EA + F56ED6F21FB7EE01A7E8039CDA31709280008080008080008080008080008080 + 0080A6A6A6B8B8B8E0E0E0E5E5E5D2D2D2B6B6B6A8A8A89D9D9D737373800080 + 800080800080800080800080000080008073A5BD58C9E78CECFFA0EAF5A6EDF8 + 94E7F871D9F63CBDE9437C97800080800080800080800080800080800080A6A6 + A6C5C5C5E7E7E7E5E5E5E8E8E8E2E2E2D6D6D6BCBCBC7D7D7D80008080008080 + 008080008080008000008000806691A2A0DFEAC5F9FDC5F9FDC5F9FDC5F9FDC5 + F9FDA0DFEA6691A2800080800080800080800080800080800080919191DBDBDB + F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4DBDBDB9191918000808000808000808000 + 808000800000800080B8D1DB84AFBF6FA2B46B9BAE6C9DAF6B9BAE6FA2B484AF + BFB8D1DB800080800080800080800080800080800080D1D1D1AFAFAFA1A1A19B + 9B9B9D9D9D9B9B9BA1A1A1AFAFAFD1D1D1800080800080800080800080800080 + 0000800080800080800080800080800080800080800080800080800080800080 + 8000808000808000808000808000808000808000808000808000808000808000 + 808000808000808000808000808000808000808000808000808000800000} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = sbDisconnectClick + end + object btCreate: TSpeedButton + Left = 203 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Create database objects' + Caption = 'Create' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + Glyph.Data = { + 36060000424D3606000000000000360000002800000020000000100000000100 + 1800000000000006000000000000000000000000000000000000800080800080 + AC9584785E4B785E4B785E4B785E4B785E4B785E4B785E4B785E4B785E4B785E + 4B785E4B785E4B8000808000808000809292925B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B800080800080800080 + AC9584FEFCFCFAEEE8F8E9E2F7E5DCF5E0D6F4DCD0F3D7C9F2D2C4F1CFBFEFCB + B9EEC8B5785E4B800080800080800080929292FCFCFCEDEDEDE8E8E8E4E4E4DF + DFDFDBDBDBD5D5D5D1D1D1CDCDCDC9C9C9C6C6C65B5B5B800080800080800080 + AC9584FFFFFFFEFDFBFDF9F7FCF5F2FAF1ECF9EBE5F7E6DEF6E1D7F4DBCFF3D6 + C9F0CBB9785E4B800080800080800080929292FFFFFFFCFCFCF8F8F8F4F4F4F0 + F0F0EAEAEAE5E5E5E0E0E0DADADAD5D5D5C9C9C95B5B5B800080800080800080 + AD9786FFFFFFFFFFFFFEFDFBFEF9F7FCF5F29B9491020202F8E6DEF6E1D7F4DB + CFF0CEBD785E4B800080800080800080949494FFFFFFFFFFFFFCFCFCF8F8F8F4 + F4F4939393020202E5E5E5E0E0E0DADADACCCCCC5B5B5B800080800080800080 + AF9A89A8A6A3020202868381D8D6D6020202020202D6CCC8F9EBE50202020202 + 02A38D82785E4B800080800080800080979797A5A5A5020202828282D6D6D602 + 0202020202CBCBCBEAEAEA0202020202028C8C8C5B5B5B800080800080800080 + B29C8CD9D9D9FFFFFF020202020202FFFDFBD7D5D2020202D6CCC9020202F8E6 + DEF2D5C7785E4B800080800080800080999999D9D9D9FFFFFF020202020202FC + FCFCD4D4D4020202CCCCCC020202E5E5E5D3D3D35B5B5B800080800080800080 + B59F8FFFFFFF020202FFFFFF020202FFFFFFFEFCFC020202D6D0CE020202FAEC + E5F4D9CD785E4B8000808000808000809C9C9CFFFFFF020202FFFFFF020202FF + FFFFFCFCFC020202D0D0D0020202EBEBEBD8D8D85B5B5B800080800080800080 + B9A393020202D9D9D9FFFFFF020202D9D9D9FFFFFF020202D7D4D2020202FBF0 + EBF5DDD1785E4B800080800080800080A0A0A0020202D9D9D9FFFFFF020202D9 + D9D9FFFFFF020202D3D3D3020202EFEFEFDCDCDC5B5B5B800080800080800080 + BBA697D9D9D9020202020202D9D9D9020202020202B9B9B9FFFCFC020202FCF5 + F1F6E2D8785E4B800080800080800080A3A3A3D9D9D9020202020202D9D9D902 + 0202020202B9B9B9FCFCFC020202F4F4F4E1E1E15B5B5B8000808000802AAFDA + 44CBF06BE5FF3BBEE599D8DF91E1F681D0E9FFFFFFFFFFFFFFFFFFFEFCFBFDF9 + F7D9CBC0785E4B800080800080ADADADC7C7C7DFDFDFBBBBBBD3D3D3DEDEDECE + CECEFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8C9C9C95B5B5B80008080008052DAFB + 32B7DF7FE9FD5FC6E693F0FF31B6DFA0E8F9FFFFFFFFFFFFFFFFFFFFFFFFFEFC + FCD9CBC0785E4B800080800080D4D4D4B4B4B4E3E3E3C4C4C4EAEAEAB3B3B3E5 + E5E5FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCC9C9C95B5B5B8000808000807CEAFF + 93F1FFBFF8FFAFE8F4C7FBFF93F1FF9FF0FFFFFFFFFFFFFFFFFFFFFAF0EB785E + 4B785E4B785E4B800080800080E4E4E4EAEAEAF3F3F3E5E5E5F6F6F6EAEAEAEB + EBEBFFFFFFFFFFFFFFFFFFEFEFEF5B5B5B5B5B5B5B5B5B80008080008021AAD9 + 55BFE1AFE8F4F0FFFDB4EBF655BFE138BBE5FFFFFFFFFFFFFFFFFF967E6BF4DB + CED1BAAF785E4B800080800080A9A9A9BDBDBDE5E5E5FCFCFCE8E8E8BDBDBDB9 + B9B9FFFFFFFFFFFFFFFFFF7A7A7AD9D9D9B9B9B95B5B5B8000808000807CEAFF + 96F3FFC7FBFFADE5F3C3FBFF96F3FF8BD7E2FEFDFBFDFBF9FDF9F6967E6BD1BA + AFAC9584800080800080800080E4E4E4ECECECF6F6F6E3E3E3F6F6F6ECECECD1 + D1D1FCFCFCFAFAFAF8F8F87A7A7AB9B9B992929280008080008080008051D9FA + 33B8E08CF1FF5AC2E390F1FF30B6DF4BD2F4BBA696B9A293B69F8FB29C8BB099 + 88800080800080800080800080D3D3D3B5B5B5EAEAEAC0C0C0EAEAEAB3B3B3CD + CDCDA3A3A3A0A0A09C9C9C9999999696968000808000808000808000802AAFDA + 44CBF07CEAFF25AEDB72E8FF4CD4F52AAFDA8000808000808000808000808000 + 80800080800080800080800080ADADADC7C7C7E4E4E4ACACACE1E1E1CECECEAD + ADAD800080800080800080800080800080800080800080800080} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btScriptClick + end + object btDrop: TSpeedButton + Left = 289 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Drop database objects' + Caption = 'Drop' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + Glyph.Data = { + 36060000424D3606000000000000360000002800000020000000100000000100 + 1800000000000006000000000000000000000000000000000000800080800080 + A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A77A37A + 77A37A779063608000808000808000807D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D + 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D676767800080800080800080 + A67E78FFE8D2FFE8D2FFE8D1FFE6CEFFE3C5FFDEBDFFDDBAFFD8B2FFD6AEFFD2 + A5FFD2A3936662800080800080800080808080E3E3E3E3E3E3E3E3E3E1E1E1DD + DDDDD7D7D7D6D6D6D0D0D0CECECEC9C9C9C8C8C8696969800080800080800080 + AB817AFFE8D2FFE8D2FFE6CEFFE3C6FFE1C2FFDDBBFFDAB6FFD7B0FFD4A9FFD2 + A4FFD2A3966965800080800080800080838383E3E3E3E3E3E3E1E1E1DDDDDDDB + DBDBD6D6D6D3D3D3CFCFCFCBCBCBC9C9C9C8C8C86C6C6C800080800080800080 + B0837CFFECD9FFECD9FFE8D2FFE6CEFFE3C6FFE1C2FFDDBBFFD9B4FFD7B0FFD4 + A9FFD4A99A6C67800080800080800080858585E8E8E8E8E8E8E3E3E3E1E1E1DD + DDDDDBDBDBD6D6D6D2D2D2CFCFCFCBCBCBCBCBCB6F6F6F800080800080800080 + B6897FFFEEDDFFEEDDFFECD9DFD1D8FFE6CEFFE3C6FFE1C2EFD2BFFFD9B4FFD7 + B0FFD7B09E6F698000808000808000808A8A8AEAEAEAEAEAEAE8E8E8D4D4D4E1 + E1E1DDDDDDDBDBDBCFCFCFD2D2D2CFCFCFCFCFCF727272800080800080800080 + BC8E81FFF2E4FFF2E4CFCBE31342FD637AEEFFE6CE6378EA3356F2EFD2BFFFD9 + B4FFD9B4A2726B8000808000808000808F8F8FEFEFEFEFEFEFD2D2D27474749A + 9A9AE1E1E1979797808080CFCFCFD2D2D2D2D2D2757575800080800080800080 + C39581FFF4E8FFF4E8EFE6E63359F90336FF234DF90336FF3357F4EFD6C5FFDD + BBFFDDBBA5766D800080800080800080949494F1F1F1F1F1F1E6E6E68484846C + 6C6C7B7B7B6C6C6C828282D3D3D3D6D6D6D6D6D6787878800080800080800080 + CA9B84FFF7F0FFF7F0FFF4E8EFE6E61342FD0336FF1341FCEFDBD0FFE3C6FFE0 + C1FFE1C2A8796F800080800080800080999999F5F5F5F5F5F5F1F1F1E6E6E674 + 74746C6C6C747474D9D9D9DDDDDDDADADADBDBDB7B7B7B800080800080800080 + D2A187FFF9F4FFF9F4FFF7F0637EF60336FF0336FF0336FF637AEEFFE6CEFFE3 + C6FFE3C6AC7C718000808000808000809E9E9EF8F8F8F8F8F8F5F5F59F9F9F6C + 6C6C6C6C6C6C6C6C9A9A9AE1E1E1DDDDDDDDDDDD7D7D7D800080800080800080 + D9A88AFFFDFBFFFDFBBFC8F70336FF335AFBDFDAE73359F91342FDDFD1D8FFE6 + CEFFE6CEAE7E74800080800080800080A4A4A4FCFCFCFCFCFCD5D5D56C6C6C86 + 8686DEDEDE848484747474D4D4D4E1E1E1E1E1E1808080800080800080800080 + DFAE8CFFFFFFFFFFFFFFFDFBAFBBF7EFEBF0FFF4E8EFE6E6CFCBE3FFECD9FFC8 + C2FFB0B0B08075800080800080800080A9A9A9FFFFFFFFFFFFFCFCFCCBCBCBEC + ECECF1F1F1E6E6E6D2D2D2E8E8E8CCCCCCB8B8B8818181800080800080800080 + E5B38FFDFDFDFDFDFDFFFFFFFFFFFFFFFFFEFFFAF6FFF9F3FFF5EAF4DECEB281 + 76B28176B28176800080800080800080ADADADFCFCFCFCFCFCFFFFFFFFFFFFFE + FEFEF9F9F9F7F7F7F2F2F2DBDBDB838383838383838383800080800080800080 + EAB891FEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFEFFFAF6FFF9F3F5E1D2B281 + 76EDA757D2AA95800080800080800080B1B1B1FEFEFEFEFEFEFFFFFFFFFFFFFF + FFFFFEFEFEF9F9F9F7F7F7DEDEDE838383969696A8A8A8800080800080800080 + EFBC92FFFFFFFFFFFFFCFCFCFAFAFAF7F7F7F5F5F5F2F1F1F0EDEAE9DAD0B281 + 76D9B198800080800080800080800080B5B5B5FFFFFFFFFFFFFBFBFBFAFAFAF7 + F7F7F5F5F5F1F1F1ECECECD8D8D8838383ADADAD800080800080800080800080 + F2BF94DCA987DCA987DCA987DCA987DCA987DCA987DCA987DCA987DCA987B281 + 76800080800080800080800080800080B7B7B7A4A4A4A4A4A4A4A4A4A4A4A4A4 + A4A4A4A4A4A4A4A4A4A4A4A4A4A4838383800080800080800080800080800080 + 8000808000808000808000808000808000808000808000808000808000808000 + 8080008080008080008080008080008080008080008080008080008080008080 + 0080800080800080800080800080800080800080800080800080} + NumGlyphs = 2 + ParentFont = False + Transparent = False + OnClick = btScriptClick + end + end + object cbDebug: TCheckBox + Left = 871 + Top = 8 + Width = 68 + Height = 13 + Hint = 'Set Debug property for connection and query components' + Caption = 'Debug' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + TabOrder = 1 + OnClick = cbDebugClick + end + object pnShowSource: TPanel + Left = 440 + Top = 1 + Width = 259 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 2 + object sbDemo: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Show demo' + GroupIndex = 1 + Down = True + Caption = 'Demo' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = sbDemoClick + end + object sbSource: TSpeedButton + Left = 87 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Show demo source code' + GroupIndex = 1 + Caption = 'Demo source' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = sbSourceClick + end + object sbFormText: TSpeedButton + Left = 173 + Top = 1 + Width = 85 + Height = 22 + Hint = 'Show demo form as text' + GroupIndex = 1 + Caption = 'Form as text' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = sbFormTextClick + end + end + object pnOpenDemoDir: TPanel + Left = 720 + Top = 1 + Width = 138 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 3 + object sbOpenDemoDir: TSpeedButton + Left = 1 + Top = 1 + Width = 136 + Height = 22 + Hint = 'Open folder containing the demo source files' + Caption = 'Open demo folder' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 1800000000000003000000000000000000000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF728890628190627A81527281526272425A62424A5232 + 3A42223232222232121A22121212121222FFFFFFFFFFFFFFFFFF72889090A0B0 + 72B0D00290D00290D00290D00290C01288C01281B01281B0227AA0227290224A + 62FFFFFFFFFFFFFFFFFF81889081C0D090A8B081E0FF62D0FF52C8FF52C8FF42 + C0F032B0F032A8F022A0E01290D0226A815B6369FFFFFFFFFFFF8190A081D0F0 + 90A8B090C0D072D8FF62D0FF62D0FF52C8FF52C0FF42B8F032B0F032A8F01288 + D0224A62FFFFFFFFFFFF8190A081D8F081C8E090A8B081E0FF72D0FF62D8FF62 + D0FF62D0FF52C8FF42C0F042B8F032B0F0226A816C8B9AFFFFFF8198A090E0F0 + 90E0FF90A8B090B8C072D8FF62D8FF62D8FF62D8FF62D0FF52D0FF52C8FF42B8 + F032A0E04B6979FFFFFF8198A090E0F0A0E8FF81C8E090A8B081E0FF81E0FF81 + E0FF81E0FF81E0FF81E0FF81E0FF72D8FF72D8FF52A8D087929D90A0A0A0E8F0 + A0E8FFA0E8FF90B0C090B0C090A8B090A8B081A0B081A0B08198A08198A08190 + A08190A081889072889090A0B0A0E8F0A0F0FFA0E8FFA0E8FF81D8FF62D8FF62 + D8FF62D8FF62D8FF62D8FF62D8FF728890FFFFFFFFFFFFFFFFFF90A0B0A0F0F0 + B0F0F0A0F0FFA0E8FFA0E8FF72D8FF90A0A08198A08198A08190A08190907288 + 90FFFFFFFFFFFFFFFFFF90A8B0A0D0E0B0F0F0B0F0F0A0F0FFA0E8FF90A0B0B3 + C9CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF906A52906A52906A52CDD6DA90A8B0 + 90A8B090A8B090A8B090A8B0B6C5CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFD2C7C6906A52906A52FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFF907A62C8BAB3FFFFFFFFFFFFA09081D2CDC7907A62FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D3A09081A08881B098 + 81C5BEB7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentFont = False + Transparent = False + OnClick = sbOpenDemoDirClick + end + end + end + object ImageList1: TImageList + Height = 17 + Left = 616 + Top = 8 + end + object BackHistoryPopup: TPopupMenu + OnPopup = BackHistoryPopupPopup + Left = 8 + Top = 133 + end + object ForwardHistoryPopup: TPopupMenu + OnPopup = ForwardHistoryPopupPopup + Left = 40 + Top = 133 + end + object ilButtons: TImageList + Left = 88 + Top = 141 + Bitmap = { + 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C0D0 + C9007DAC86002C7D31000269090002640700005E0400206323006D967200C3CF + CB0000000000000000000000000000000000000000000000000000000000C0D0 + C9007DAC86002C7D31000269090002640700005E0400206323006D967200C3CF + CB00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000AEC7B600328C + 36000C98220011B62F000DB4250009B21C0006B0160001AE0B00009107001065 + 1400B4C6BB000000000000000000000000000000000000000000AEC7B600328C + 36000C98220011B62F000DB4250009B21C0006B0160001AE0B00009107001065 + 1400B4C6BB000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B0C9B800178C23001CB6 + 45001BBA440017B83A0012B630003CC352001AB72D0008B21B0004AF110000AD + 090000670500B6C7BD00000000000000000000000000B0C9B800178C23001CB6 + 45001BBA440017B83A005DCD720079D588000BB3210008B21B0004AF110000AD + 090000670500B6C7BD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000CCDDD30043A4480023B7530024BE + 580021BD51001CBA45006FD38800FFFFFF00B5E8BE000EB426000AB21D0007B1 + 180002AE0D0010691400C9D5D00000000000CCDDD30043A4480023B7530024BE + 580021BD51001CBA4500D4F2DC00FFFFFF00A6E4B1000EB426000AB21D0007B1 + 180002AE0D0010691400C9D5D000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000009CCEA10017A437002EC26B002CC1 + 660025BF5A0076D69500FFFFFF00FFFFFF009AE0AB0013B6310011B62E000BB3 + 210009B21C00078E120086A88B00000000009CCEA10017A437002EC26B002CC1 + 660025BF5A001CBB470075D69400FFFFFF00FFFFFF00A6E4B10011B62E000BB3 + 210009B21C00078E120086A88B00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040B1410028BB5E002EC26B002EC2 + 6B007CD9A100FFFFFF00FFFFFF00ACE6BF001CBB47001ABA430015B8380012B6 + 30000FB52A000AB21D00227A27000000000040B1410028BB5E002EC26B002EC2 + 6B001CBB47001CBB470025BE590076D69700FFFFFF00FFFFFF00A6E4B10014B7 + 34000FB52A000AB21D00227A2700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040B141002EC26B002EC26B007CD9 + A300FFFFFF00FFFFFF00F1FBF50092DFAC0092DFAC008EDDA3008DDDA2008BDC + 9D0014B7340011B62F00057710000000000040B141002EC26B0062D19000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A8E5 + B60014B7340011B62F0005771000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040B841002EC26B0048CA7E00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF001BBA440017B83A00097E14000000000040B841002EC26B0062D19000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D5F3 + DE001BBA440017B83A00097E1400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040BB410033C36E002EC26B007CD9 + A300FFFFFF00FFFFFF00FFFFFF00A4E4BE0097E1B50097E1B50095E0B10092DF + AC0021BD51001CBA4500077F13000000000040BB410033C36E002EC26B002EC2 + 6B002EC26B002EC26B002EC26B0089DDAC00FFFFFF00FFFFFF00D7F3E2002EC2 + 6B0021BD51001CBA4500077F1300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000040BB410044C665003FC776002EC2 + 6B007CD9A300FFFFFF00FFFFFF00D8F4E3003BC674002EC26B002EC26B002CC1 + 660025BF5A0023BE5700238B2C000000000040BB410044C665003FC776002EC2 + 6B002EC26B002EC26B0055CD8700F2FBF600FFFFFF00D8F4E3002EC26B002CC1 + 660025BF5A0023BE5700238B2C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000A2D7A50031BE3C0072D5950052CC + 820035C470007CD9A300FFFFFF00FFFFFF00A4E4BE002EC26B002EC26B002EC2 + 6B002DC26A0033963B009EC8A40000000000A2D7A50031BE3C0072D5950052CC + 820035C470002EC26B00BEECD100FFFFFF00D8F4E3002EC26B002EC26B002EC2 + 6B002DC26A001AA73E009EC8A400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000D7E7DC0040C2400075D6830082DA + A00066D28E0044C879007FDAA400F2FBF60089DDAC002EC26B002EC26B002EC2 + 6B002BBF640023962900C3E2C70000000000D7E7DC0040BB410075D6830082DA + A00066D28E002EC26B002EC26B0097E1B5002EC26B002EC26B002EC26B002EC2 + 6B002BBF640023962900C3E2C700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000C9E3CD0040C2400077D7 + 800098E0AD0076D798005ACE86003AC573002EC26B002EC26B002EC26B0028BD + 5E00189E2600C9E4CD00000000000000000000000000C9E3CD0040BB410077D7 + 800098E0AD0076D798005ACE86003AC573002EC26B002EC26B002EC26B0028BD + 5E00189E2600C9E4CD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000CAE4CE0040C2 + 400047CB490084DA91008CDCA6006AD391004ECB7F002DBF610017B1360043B5 + 4700CAE5CE000000000000000000000000000000000000000000CAE4CE0040BB + 410047CB490084DA91008CDCA6006AD391004ECB7F002DBF610017B1360043B5 + 4700CAE5CE000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DBE9 + DF009AD99D0040C2400040C2400040C2400040C2400040C240009AD99D00DBEA + DE0000000000000000000000000000000000000000000000000000000000DBE9 + DF009AD99D0040C2400040C2400040C2400040C2400040C240009AD99D00DBEA + DE00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00FFFFFFFF00000000E00FE00F00000000 + C007C00700000000800380030000000000010001000000000001000100000000 + 0001000100000000000100010000000000010001000000000001000100000000 + 0001000100000000000100010000000000010001000000008003800300000000 + C007C00700000000E00FE00F0000000000000000000000000000000000000000 + 000000000000} + end + object ilDisabledButtons: TImageList + Left = 120 + Top = 141 + Bitmap = { + 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CCCC + CC009B9B9B005D5D5D00404040003D3D3D00383838004848480086868600CCCC + CC0000000000000000000000000000000000000000000000000000000000CCCC + CC009B9B9B005D5D5D00404040003D3D3D00383838004848480086868600CCCC + CC00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF006868 + 6800656565007B7B7B0076767600727272006F6F6F006A6A6A00575757004343 + 4300C0C0C0000000000000000000000000000000000000000000BFBFBF006868 + 6800656565007B7B7B0076767600727272006F6F6F006A6A6A00575757004343 + 4300C0C0C0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000C1C1C1005F5F5F008383 + 830085858500808080007B7B7B00929292007C7C7C00727272006C6C6C006868 + 68003E3E3E00C2C2C200000000000000000000000000C1C1C1005F5F5F008383 + 83008585850080808000A5A5A500B3B3B30074747400727272006C6C6C006868 + 68003E3E3E00C2C2C20000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000D8D8D8007D7D7D00888888008E8E + 8E008B8B8B0085858500B1B1B100FFFFFF00D5D5D50077777700727272007070 + 70006A6A6A0045454500D2D2D20000000000D8D8D8007D7D7D00888888008E8E + 8E008B8B8B0085858500E8E8E800FFFFFF00CDCDCD0077777700727272007070 + 70006A6A6A0045454500D2D2D200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000BBBBBB0073737300979797009595 + 95008F8F8F00B7B7B700FFFFFF00FFFFFF00C8C8C8007C7C7C007B7B7B007474 + 740072727200595959009B9B9B0000000000BBBBBB0073737300979797009595 + 95008F8F8F0086868600B7B7B700FFFFFF00FFFFFF00CDCDCD007B7B7B007474 + 740072727200595959009B9B9B00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000828282008E8E8E00979797009797 + 9700BDBDBD00FFFFFF00FFFFFF00D3D3D30086868600848484007F7F7F007B7B + 7B0079797900727272005757570000000000828282008E8E8E00979797009797 + 970086868600868686008E8E8E00B8B8B800FFFFFF00FFFFFF00CDCDCD007D7D + 7D00797979007272720057575700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000828282009797970097979700BEBE + BE00FFFFFF00FFFFFF00F8F8F800C7C7C700C7C7C700C2C2C200C2C2C200C0C0 + C0007D7D7D007B7B7B004B4B4B00000000008282820097979700B1B1B100FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D0D0 + D0007D7D7D007B7B7B004B4B4B00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008787870097979700A4A4A400FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00858585008080800051515100000000008787870097979700B1B1B100FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E9E9 + E900858585008080800051515100000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000888888009999990097979700BEBE + BE00FFFFFF00FFFFFF00FFFFFF00D1D1D100CBCBCB00CBCBCB00C9C9C900C7C7 + C7008B8B8B008585850051515100000000008888880099999900979797009797 + 9700979797009797970097979700C5C5C500FFFFFF00FFFFFF00EAEAEA009797 + 97008B8B8B008585850051515100000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000888888009A9A9A009F9F9F009797 + 9700BEBEBE00FFFFFF00FFFFFF00EBEBEB009E9E9E0097979700979797009595 + 95008F8F8F008E8E8E006363630000000000888888009A9A9A009F9F9F009797 + 97009797970097979700AAAAAA00F8F8F800FFFFFF00EBEBEB00979797009595 + 95008F8F8F008E8E8E0063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000C2C2C20087878700B6B6B600A8A8 + A8009B9B9B00BEBEBE00FFFFFF00FFFFFF00D1D1D10097979700979797009797 + 9700979797006F6F6F00B8B8B80000000000C2C2C20087878700B6B6B600A8A8 + A8009B9B9B0097979700DEDEDE00FFFFFF00EBEBEB0097979700979797009797 + 97009797970077777700B8B8B800000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000E1E1E1008C8C8C00B2B2B200BEBE + BE00B1B1B100A1A1A100BFBFBF00F8F8F800C5C5C50097979700979797009797 + 97009393930068686800D6D6D60000000000E1E1E10088888800B2B2B200BEBE + BE00B1B1B1009797970097979700CBCBCB009797970097979700979797009797 + 97009393930068686800D6D6D600000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D9D9D9008C8C8C00B2B2 + B200C8C8C800B9B9B900ABABAB009D9D9D009797970097979700979797009090 + 90006B6B6B00DADADA00000000000000000000000000D9D9D90088888800B2B2 + B200C8C8C800B9B9B900ABABAB009D9D9D009797970097979700979797009090 + 90006B6B6B00DADADA0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000DADADA008C8C + 8C0095959500BABABA00C3C3C300B3B3B300A6A6A600929292007B7B7B008787 + 8700DBDBDB000000000000000000000000000000000000000000DADADA008888 + 880095959500BABABA00C3C3C300B3B3B300A6A6A600929292007B7B7B008787 + 8700DBDBDB000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E4E4 + E400C0C0C0008C8C8C008C8C8C008C8C8C008C8C8C008C8C8C00C0C0C000E4E4 + E40000000000000000000000000000000000000000000000000000000000E4E4 + E400C0C0C0008C8C8C008C8C8C008C8C8C008C8C8C008C8C8C00C0C0C000E4E4 + E400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00FFFFFFFF00000000E00FE00F00000000 + C007C00700000000800380030000000000010001000000000001000100000000 + 0001000100000000000100010000000000010001000000000001000100000000 + 0001000100000000000100010000000000010001000000008003800300000000 + C007C00700000000E00FE00F0000000000000000000000000000000000000000 + 000000000000} + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoForm.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoForm.pas new file mode 100644 index 0000000..95bbae7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoForm.pas @@ -0,0 +1,667 @@ +{$I DacDemo.inc} + +unit DemoForm; + +interface + +uses +{$IFNDEF WIN32} + Types, +{$ENDIF} + SysUtils, Classes, DB, +{$IFDEF LINUX} + QControls, QStdCtrls, QComCtrls, QGraphics, QMenus, QTypes, QImgList, QForms, + QButtons, QExtCtrls, Qt, QDialogs, +{$ELSE} + Windows, Forms, Messages, Controls, StdCtrls, + Graphics, ImgList, ToolWin, + ComCtrls, Dialogs, ExtCtrls, Tabs, Menus, DBCtrls, Buttons, ShellAPI, +{$IFNDEF VER130} + Variants, +{$ENDIF} +{$ENDIF} +{$IFDEF CLR} + System.ComponentModel, +{$ENDIF} + DBAccess, + DAScript, + DemoBase, + DemoFrame, + CategoryFrame + {$IFDEF XPMAN}, UxTheme{$ENDIF} + {$IFDEF USE_SYNEDIT}, SynMemo, SynEdit, SynEditHighlighter, SynHighlighterPas{$ENDIF} + ; +const + MAX_HISTORY_SIZE = 6; + +type + TDemoForm = class(TForm) + StatusBar: TStatusBar; + ImageList1: TImageList; + PanelUnderTree: TPanel; + TreeView: TTreeView; + MainPanel: TPanel; + Shape1: TShape; + TVSplitter: TSplitter; + pnTopLabel: TPanel; + lbTitle: TLabel; + lbAbout: TLabel; + Panel2: TPanel; + Panel1: TPanel; + sbConnect: TSpeedButton; + sbDisconnect: TSpeedButton; + btCreate: TSpeedButton; + btDrop: TSpeedButton; + cbDebug: TCheckBox; + pnSource: TPanel; + pnDemo: TPanel; + sbDemo: TSpeedButton; + pnShowSource: TPanel; + ToolBar: TToolBar; + tbBrowseBack: TToolButton; + tbBrowseForward: TToolButton; + BackHistoryPopup: TPopupMenu; + ForwardHistoryPopup: TPopupMenu; + ilButtons: TImageList; + ilDisabledButtons: TImageList; + sbSource: TSpeedButton; + sbFormText: TSpeedButton; + pnOpenDemoDir: TPanel; + sbOpenDemoDir: TSpeedButton; + + procedure FormCreate(Sender: TObject); virtual; + procedure TreeViewChange(Sender: TObject; Node: TTreeNode); + procedure TreeViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure TreeViewClick(Sender: TObject); + procedure TreeViewMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure TVSplitterMoved(Sender: TObject); + procedure TVSplitterCanResize(Sender: TObject; var NewSize: Integer; + var Accept: Boolean); + procedure lbAboutClick(Sender: TObject); virtual; + procedure lbAboutMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbTitleMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure cbDebugClick(Sender: TObject); + procedure sbOpenDemoDirClick(Sender: TObject); + procedure sbConnectClick(Sender: TObject); + procedure sbDisconnectClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure HistoryItemClick(Sender: TObject); + procedure sbDemoClick(Sender: TObject); + procedure FormResize(Sender: TObject); + procedure BackHistoryPopupPopup(Sender: TObject); + procedure ForwardHistoryPopupPopup(Sender: TObject); + procedure tbBrowseBackClick(Sender: TObject); + procedure tbBrowseForwardClick(Sender: TObject); + procedure btScriptClick(Sender: TObject); + procedure OnScriptError(Sender: TObject; E: Exception; SQL: String; + var Action: TErrorAction); + procedure sbSourceClick(Sender: TObject); + procedure sbFormTextClick(Sender: TObject); + protected + Demos: TDemos; + ActiveNode: TTreeNode; + //History + History: Array of integer; //Absolute indexes in TreeView + HistoryIndex: integer; //Current History index + HistoryEnd: integer; + IgnoreScriptErrors: boolean; + DropScriptActive: boolean; + DemoSourceLoaded, FormSourceLoaded: boolean; + + //Product customization + function GetConnection: TCustomDAConnection; virtual; abstract; //This function should return DAC product specific connection (i.e. OraSession, MyConnection) + function ApplicationTitle: string; virtual; abstract; //This function should return DAC product specific title + function ProductName: string; virtual; abstract; ////This function should return product name + procedure RegisterDemos; virtual; abstract; //This procedure should regiter DAC product specific demos + //XP manifest + {$IFDEF XPMAN} + procedure ReplaceFlatStyle(Control: TWinControl; Flat: boolean); + {$ENDIF} + //Demo selection + procedure InitializeDemoFrame(Frame: TDemoFrame; DemoType: TDemoType); virtual; + procedure UpdateDemo; + procedure ShowDemo; + procedure ShowDemoSource; + procedure ShowFormSource; + {$IFNDEF WIN32} + procedure OnNavigate(DemoDescription: string); + {$ELSE} + procedure OnNavigate(Index: integer); + {$ENDIF} + //History + procedure SelectDemo; + procedure NavigateHistory(Offset: integer); + procedure GetBackHistory(BackList: TStrings); + procedure GetForwardHistory(ForwardList: TStrings); + procedure DisableBrowse(Back, Forward: boolean); + procedure FillHistoryPopup(BackHistory: boolean); + //Connection + procedure AfterConnect(Sender: TObject); + procedure AfterDisconnect(Sender: TObject); + public +{$IFDEF USE_SYNEDIT} + SourceBrowser: TSynMemo; +{$ELSE} + SourceBrowser: TMemo; +{$ENDIF} + function GetIsXPMan: boolean; + function ProductColor: TColor; virtual; abstract; //This function should return DAC product specific color + procedure ExecCreateScript; virtual; abstract; + procedure ExecDropScript; virtual; abstract; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFDEF XPMAN} + {$R WindowsXP.res} +{$ENDIF} + +procedure TDemoForm.FormCreate(Sender: TObject); +begin + SetLength(History, MAX_HISTORY_SIZE); + HistoryIndex := -1; + Demos := TDemos.Create(TreeView.Items); + RegisterDemos; +{$IFDEF XPMAN} + if GetIsXPMan then begin + ReplaceFlatStyle(Self, False); + pnTopLabel.Color := ProductColor; + end; +{$ENDIF} + +{$IFDEF USE_SYNEDIT} + SourceBrowser := TSynMemo.Create(pnSource); + + SourceBrowser.Highlighter := TSynPasSyn.Create(SourceBrowser); + SourceBrowser.Options := [eoAltSetsColumnMode, eoAutoIndent, eoAutoSizeMaxScrollWidth, eoDisableScrollArrows, eoDragDropEditing, eoDropFiles, eoEnhanceEndKey, eoGroupUndo, eoHideShowScrollbars, eoKeepCaretX, eoShowScrollHint, eoSmartTabDelete, eoSmartTabs, eoTabIndent, eoTabsToSpaces]; + with SourceBrowser.Gutter do begin + Visible := True; + AutoSize := True; + DigitCount := 3; + LeftOffset := 0; + RightOffset := 0; + ShowLineNumbers := True; + Width := 1; + end; +{$ELSE} + SourceBrowser := TMemo.Create(pnSource); + SourceBrowser.ScrollBars := ssVertical; + SourceBrowser.Font.Name := 'Courier New'; + SourceBrowser.Font.Size := 10; +{$ENDIF} + with SourceBrowser do begin + Parent := pnSource; + Align := alClient; + ReadOnly := True; + end; + Resize; + TreeView.Items[0].Expand(True); + TreeView.Items[0].Selected := True; + with GetConnection do begin + AfterConnect := Self.AfterConnect; + AfterDisconnect := Self.AfterDisconnect; + end; + SelectDemo; +end; + +procedure TDemoForm.FormDestroy(Sender: TObject); +begin + with GetConnection do begin + AfterConnect := nil; + AfterDisconnect := nil; + end; + SetLength(History, 0); + Demos.Free; +end; + +//TreeView routines +procedure TDemoForm.TreeViewChange(Sender: TObject; Node: TTreeNode); +begin + if (TreeView.Selected.Data <> nil) then + StatusBar.Panels[0].Text := TDemo(TreeView.Selected.Data).Hint + else + StatusBar.Panels[0].Text := TreeView.Selected.Text; + StatusBar.Repaint; +end; + +procedure TDemoForm.TreeViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + if Key = {$IFDEF LINUX}4100{$ELSE}13{$ENDIF} then + SelectDemo; +end; + +procedure TDemoForm.TreeViewClick(Sender: TObject); +begin + SelectDemo; +end; + +//TreeView Hints +procedure TDemoForm.TreeViewMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +var + Node: TTreeNode; +begin + Node := TreeView.GetNodeAt(X, Y); + if (Node <> nil) and (Node.Data <> nil) then + TreeView.Hint := TDemo(Node.Data).Hint + else + TreeView.Hint := ''; +end; + +//Sizing constraints +procedure TDemoForm.TVSplitterMoved(Sender: TObject); +begin + if PanelUnderTree.ClientWidth = 0 then + PanelUnderTree.ClientWidth := 150; +end; + +procedure TDemoForm.TVSplitterCanResize(Sender: TObject; + var NewSize: Integer; var Accept: Boolean); +begin + Accept := (NewSize >= PanelUnderTree.Constraints.MinWidth) and + ((ClientWidth - MainPanel.Constraints.MinWidth - NewSize) > 0); +end; + +function TDemoForm.GetIsXPMan: boolean; +begin + Result := {$IFDEF XPMAN}UseThemes; {$ELSE} False;{$ENDIF} +end; + +{$IFDEF XPMAN} +procedure TDemoForm.ReplaceFlatStyle(Control: TWinControl; Flat: boolean); +var + i: integer; +begin + for i := 0 to Control.ControlCount - 1 do + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := Flat + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := Flat + else + if Control.Controls[i] is TWinControl then begin + if Control.Controls[i] is TPanel then begin + TPanel(Control.Controls[i]).ParentBackground := False; + TPanel(Control.Controls[i]).Color := clBtnFace; + end; + ReplaceFlatStyle(TWinControl(Control.Controls[i]), Flat); + end; +end; +{$ENDIF} + +//Demo Change +procedure TDemoForm.InitializeDemoFrame(Frame: TDemoFrame; DemoType: TDemoType); +begin + Frame.Connection := GetConnection; + Frame.SetDebug(cbDebug.Checked); + Frame.Parent := pnDemo; + if DemoType = dtCategory then //Attach browser event handlers + TCategoryFrame(Frame).OnNavigate := OnNavigate; +{$IFDEF XPMAN} + if GetIsXPMan then + ReplaceFlatStyle(Frame, False); +{$ENDIF} + Frame.Initialize; +end; + +procedure TDemoForm.UpdateDemo; +var + i: integer; +begin + for i := 1 to StatusBar.Panels.Count - 1 do + StatusBar.Panels[i].Text := ''; + ActiveNode := TreeView.Selected; + if (ActiveNode <> nil) then + with Demos.SelectDemo(ActiveNode.AbsoluteIndex) do begin + InitializeDemoFrame(Frame, DemoType); + DemoSourceLoaded := False; + FormSourceLoaded := False; + if DemoType = dtCategory then begin + pnShowSource.Visible := False; + pnOpenDemoDir.Visible := False; + ShowDemo; + end + else begin + pnShowSource.Visible := True; + {$IFNDEF LINUX} + pnOpenDemoDir.Visible := True; + {$ELSE} + pnOpenDemoDir.Visible := False; + {$ENDIF} + if sbDemo.Down then + ShowDemo + else + if sbSource.Down then + ShowDemoSource + else + ShowFormSource; + end; + Self.Caption := ApplicationTitle + ' - ' + Name; + Application.Title := ApplicationTitle; + end; + StatusBar.Repaint; +end; + +procedure TDemoForm.ShowDemo; +begin + pnSource.Visible := False; + pnDemo.Visible := True; +end; + +procedure TDemoForm.ShowDemoSource; +begin + if not DemoSourceLoaded then begin + Demos.SelectedDemo.LoadDemoCode(SourceBrowser.Lines); + DemoSourceLoaded := True; + FormSourceLoaded := False; + end; + pnSource.Visible := True; + pnDemo.Visible := False; +end; + +procedure TDemoForm.ShowFormSource; +begin + if not FormSourceLoaded then begin + Demos.SelectedDemo.LoadFormCode(SourceBrowser.Lines); + FormSourceLoaded := True; + DemoSourceLoaded := False; + end; + pnSource.Visible := True; + pnDemo.Visible := False; +end; + +//User control +procedure TDemoForm.sbOpenDemoDirClick(Sender: TObject); +begin + Demos.SelectedDemo.OpenDemoFolder; +end; + +procedure TDemoForm.cbDebugClick(Sender: TObject); +begin + Demos.SelectedDemo.Frame.SetDebug(cbDebug.Checked); +end; + +{$IFNDEF WIN32} +procedure TDemoForm.OnNavigate(DemoDescription: string); +var + Node: TTreeNode; + DemoName, CategoryName, FolderName: string; + ListBox: TListBox; + i: integer; +begin + Node := TreeView.Items.GetFirstNode; + DemoName := Trim(Copy(DemoDescription, 1, pos('-', DemoDescription) - 1)); + while Node <> nil do begin + if TDemo(Node.Data).Name = DemoName then begin + TreeView.Selected := Node; + SelectDemo; + break; + end; + Node := Node.GetNext; + end; + // Demo was not found in the tree. This is supplementary demo. + + if (Demos.SelectedDemo.DemoType = dtCategory) and (DemoName <> '') then begin + ListBox := TCategoryFrame(Demos.SelectedDemo.Frame).DemosDescription; + for i := ListBox.ItemIndex downto 0 do + if (ListBox.Items[i] <> '') and (ListBox.Items[i][1] = ' ') then begin + CategoryName := Trim(ListBox.Items[i]); + Break; + end; + end; +{$IFNDEF LINUX} + FolderName := ExtractFilePath(ExtractFileDir(Application.ExeName)) + CategoryName + '\' + DemoName; + ShellExecute(0, 'open', FolderName, '', '.', SW_SHOW); +{$ENDIF} +end; + +{$ELSE} +procedure TDemoForm.OnNavigate(Index: integer); +begin + TreeView.Items[Index].Selected := True; + SelectDemo; +end; +{$ENDIF} + +procedure TDemoForm.lbAboutClick(Sender: TObject); +begin + lbAbout.Font.Color := $FFFFFF; + lbAbout.Cursor := crDefault; +end; + +//About highlite +procedure TDemoForm.lbAboutMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbAbout.Font.Color := TColor($FF00001A); //clHotLight + lbAbout.Cursor := crHandPoint; +end; + +procedure TDemoForm.lbTitleMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbAbout.Font.Color := $FFFFFF; + lbAbout.Cursor := crDefault; +end; + +procedure TDemoForm.sbConnectClick(Sender: TObject); +begin + GetConnection.Connect; +end; + +procedure TDemoForm.sbDisconnectClick(Sender: TObject); +begin + GetConnection.Disconnect; +end; + +procedure TDemoForm.AfterConnect(Sender: TObject); +begin + sbDisconnect.Enabled := True; + sbConnect.Enabled := False; +end; + +procedure TDemoForm.AfterDisconnect(Sender: TObject); +begin + sbDisconnect.Enabled := False; + sbConnect.Enabled := True; +end; + +//History +procedure TDemoForm.SelectDemo; +var + i: integer; +begin + if TreeView.Selected = ActiveNode then //Same demo selected + Exit; + UpdateDemo; + if HistoryIndex = (MAX_HISTORY_SIZE - 1) then + for i := 0 to MAX_HISTORY_SIZE - 2 do + History[i] := History[i + 1] + else + Inc(HistoryIndex); + History[HistoryIndex] := ActiveNode.AbsoluteIndex; + HistoryEnd := HistoryIndex; + DisableBrowse(HistoryIndex = 0, True); +end; + +procedure TDemoForm.NavigateHistory(Offset: integer); +begin + if ((HistoryIndex + Offset) < 0) or ((HistoryIndex + Offset) >= MAX_HISTORY_SIZE) then + raise Exception.Create('Wrong history index'); + HistoryIndex := HistoryIndex + Offset; + TreeView.Items[Demos.GetDemoIndex(History[HistoryIndex])].Selected := True; + DisableBrowse(HistoryIndex = 0, HistoryIndex = HistoryEnd); + UpdateDemo; +end; + +procedure TDemoForm.GetBackHistory(BackList: TStrings); +var + i: integer; +begin + BackList.Clear; + for i := HistoryIndex - 1 downto 0 do + BackList.Add(Demos[History[i]].Name); +end; + +procedure TDemoForm.GetForwardHistory(ForwardList: TStrings); +var + i: integer; +begin + ForwardList.Clear; + for i := HistoryIndex + 1 to HistoryEnd do + ForwardList.Add(Demos[History[i]].Name); +end; + +procedure TDemoForm.DisableBrowse(Back, Forward: boolean); +begin + tbBrowseBack.Enabled := not Back; + tbBrowseForward.Enabled := not Forward; +end; + +procedure TDemoForm.FillHistoryPopup(BackHistory: boolean); +var + NewItem: TMenuItem; + List: TStrings; + i: integer; + HistoryPopup: TPopupMenu; +begin + if BackHistory then + HistoryPopup := BackHistoryPopup + else + HistoryPopup := ForwardHistoryPopup; + HistoryPopup.Items.Clear; + List := TStringList.Create; + if BackHistory then + GetBackHistory(List) + else + GetForwardHistory(List); + for i := 1 to List.Count do begin + NewItem := TMenuItem.Create(HistoryPopup); + HistoryPopup.Items.Add(NewItem); + NewItem.Caption := List[i - 1]; + if BackHistory then + NewItem.Tag := -i + else + NewItem.Tag := i; + NewItem.OnClick := HistoryItemClick; + end; + List.Free; +end; + +procedure TDemoForm.HistoryItemClick(Sender: TObject); +begin + if Sender is TMenuItem then + NavigateHistory(TMenuItem(Sender).Tag); +end; + +procedure TDemoForm.BackHistoryPopupPopup(Sender: TObject); +begin + FillHistoryPopup(True); +end; + +procedure TDemoForm.ForwardHistoryPopupPopup(Sender: TObject); +begin + FillHistoryPopup(False); +end; + +procedure TDemoForm.tbBrowseBackClick(Sender: TObject); +begin + NavigateHistory(-1); +end; + +procedure TDemoForm.tbBrowseForwardClick(Sender: TObject); +begin + NavigateHistory(1); +end; + +procedure TDemoForm.sbDemoClick(Sender: TObject); +begin + ShowDemo; +end; + +procedure TDemoForm.sbSourceClick(Sender: TObject); +begin + ShowDemoSource; +end; + +procedure TDemoForm.sbFormTextClick(Sender: TObject); +begin + ShowFormSource; +end; + +procedure TDemoForm.FormResize(Sender: TObject); +begin + lbAbout.Left := lbAbout.Parent.ClientWidth - 100; + cbDebug.Left := cbDebug.Parent.ClientWidth - 100; + pnOpenDemoDir.Left := cbDebug.Left - (pnOpenDemoDir.Width + 15); + pnShowSource.Left := pnOpenDemoDir.Left - (pnShowSource.Width + 15); +end; + +procedure TDemoForm.OnScriptError(Sender: TObject; E: Exception; + SQL: String; var Action: TErrorAction); +var + OperationStr, + ScriptFileStr, + MessageStr: string; +begin + if DropScriptActive then begin + OperationStr := 'drop'; + ScriptFileStr := 'UninstallDemoObjects.sql'; + end + else begin + OperationStr := 'create'; + ScriptFileStr := 'InstallDemoObjects.sql'; + end; + MessageStr := Format('An error has been occured: %s' + + #$d#$d'You can manually %s objects required for demo by using the ' + + 'following file: %%%s%%\Demos\%s' + + #$d'%%%s%% is the %s installation path on your computer.' + #13#10 + 'Ignore this exception?', + [E.Message, OperationStr, ProductName, ScriptFileStr, ProductName, ProductName]); + Action := eaContinue; + if not IgnoreScriptErrors then + case MessageDlg(MessageStr, mtError, [mbYes, mbNo{$IFNDEF LINUX}, mbYesToAll{$ENDIF}], 0) of + mrNo: + Action := eaAbort; + {$IFNDEF LINUX} + mrYesToAll: + IgnoreScriptErrors := True; + {$ENDIF} + end; +end; + +procedure TDemoForm.btScriptClick(Sender: TObject); +var + s: string; +begin + DropScriptActive := Sender = btDrop; + if DropScriptActive then + s := 'removed from database' + else + s := 'created in database'; + if MessageDlg(Format('Objects required for the demo will be %s. Continue?', [s]), + mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin + IgnoreScriptErrors := False; + GetConnection.Connect; + if Sender = btCreate then + ExecCreateScript + else + ExecDropScript; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoFrame.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoFrame.nfm new file mode 100644 index 0000000..08110ca --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoFrame.nfm @@ -0,0 +1,7 @@ +object DemoFrame: TDemoFrame + Left = 0 + Top = 0 + Width = 308 + Height = 228 + TabOrder = 0 +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoFrame.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoFrame.pas new file mode 100644 index 0000000..6636031 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/DemoFrame.pas @@ -0,0 +1,57 @@ +unit DemoFrame; + +interface + +uses + Classes, +{$IFDEF LINUX} + QControls, QStdCtrls, QGraphics, QForms, +{$ELSE} + Forms, Windows, Messages, SysUtils, StdCtrls, Graphics, Controls, Dialogs, + ComCtrls, Buttons, ExtCtrls, DBCtrls, +{$ENDIF} + DBAccess + {$IFNDEF VER130}, Variants{$ENDIF} + ; + +type + TDemoFrame = class(TFrame) + public + Connection: TCustomDAConnection; + procedure Initialize; virtual; + procedure SetDebug(Value: boolean); virtual; + + procedure AssignConnectionTo(Dest: TCustomDAConnection); + end; + + TDemoFrameClass = class of TDemoFrame; + + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TDemoFrame.Initialize; +begin +end; + +procedure TDemoFrame.SetDebug(Value: boolean); +begin +end; + +procedure TDemoFrame.AssignConnectionTo(Dest: TCustomDAConnection); +begin + Dest.Assign(Connection); + Dest.AfterConnect := nil; + Dest.AfterDisconnect := nil; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/HtmlConsts.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/HtmlConsts.pas new file mode 100644 index 0000000..32944d8 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/HtmlConsts.pas @@ -0,0 +1,142 @@ +unit HtmlConsts; + +interface + +const + HTMLHeader: string = + ''#13#10 + + ''#13#10 + + ''#13#10 + + ' Samples - Oracle Data Access Components'#13#10 + + ''#13#10 + + ''#13#10 + + ''#13#10; + + HTMLFooter: string = '' + #13#10 + ''; + +implementation + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacAbout.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacAbout.nfm new file mode 100644 index 0000000..0067eb0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacAbout.nfm @@ -0,0 +1,3078 @@ +object SdacAboutForm: TSdacAboutForm + Left = 582 + Top = 202 + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'About SDAC' + ClientHeight = 276 + ClientWidth = 386 + Color = clBtnFace + ParentFont = True + OldCreateOrder = True + Position = poScreenCenter + OnMouseMove = FormMouseMove + PixelsPerInch = 96 + TextHeight = 13 + object Bevel1: TBevel + Left = 8 + Top = 8 + Width = 123 + Height = 263 + end + object Image1: TImage + Left = 9 + Top = 9 + Width = 120 + Height = 260 + AutoSize = True + Picture.Data = { + 07544269746D6170D66D0100424DD66D01000000000036000000280000007800 + 0000040100000100180000000000A06D0100C30E0000C30E0000000000000000 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C26268C26268C26268C26268C27278D27278D27278D27278D27278D27278D27 + 278D26268C26268C26268C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C26268C26268C + 27278D28288D28288E29298E2A2A8F2B2B8F2C2C902D2D902D2D902E2E912E2E + 912E2E912E2E912E2E912D2D902C2C902B2B8F29298E28288E28288D27278D26 + 268C26268C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C26268C27278D28 + 288D28288E29298E2A2A8F2C2C902D2D902E2E91303092323293333393343494 + 3636953737953939963A3A973A3A973A3A973A3A973838963636953434943232 + 933030922E2E912B2B8F29298E28288D27278D26268C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C26268C26268C2727 + 8D28288D28288E29298E2A2A8F2B2B8F2C2C902D2D902E2E9130309232329334 + 34943737953A3A973C3C9840409A42429B45459D47479E49499F4A4A9F49499F + 48489E46469E43439C40409A3C3C983838963434943030922D2D902A2A8F2828 + 8E27278D26268C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C26268C + 26268C27278D27278D27278D26268C26268C25258C25258C25258C25258C2525 + 8C25258C26268C28288E2C2C902F2F913434943A3A9740409A45459D4B4BA051 + 51A35555A55858A75959A85A5AA85858A75555A55151A34B4BA046469E40409A + 3A3A973535953030922D2D9029298E28288D26268C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C26268C26268C26268C + 27278D27278D27278D27278D27278D27278D27278D26268C26268C25258C2525 + 8C2E2E9139399644449C4D4DA15757A65E5EAA6363AD6767AF6868AF6767AF63 + 63AD5E5EAA5757A75050A348489E40409A3A3A973434942E2E912B2B8F28288E + 27278D26268C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C26268C27278D27278D28288D28 + 288E29298E29298E2A2A8F2B2B8F2B2B8F2B2B8F2B2B8F2B2B8F2B2B8F2A2A8F + 2A2A8F29298E28288E28288D27278D25258C28288E39399648489E5656A66262 + AC6A6AB17171B47474B57373B56F6FB36969B06262AC5858A74F4FA245459D3D + 3D993535952F2F912B2B8F28288E27278D26268C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C26268C27278D28288D28288E2929 + 8E2B2B8F2C2C902D2D902E2E912F2F9130309231319231319232329332329331 + 31923131923030922F2F912E2E912E2E912D2D902B2B8F2A2A8F28288E27278D + 26268C2A2A8F3F3F9A5151A36262AC6F6FB37878B87C7CBA7D7DBA7A7AB97373 + B56969B05E5EAA5353A448489E3F3F9A3636953030922C2C9028288E27278D26 + 268C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C26268C27278D28288D28288E29298E + 2B2B8F2D2D902E2E913030923232933434943535953636953737953838963838 + 963838963838963838963737953636953535953434943333933232933030922F + 2F912E2E912C2C902A2A8F28288E27278D25258C3636954D4DA16262AC7272B5 + 7E7EBB8484BE8686BF8181BD7A7AB96F6FB36363AC5656A649499F3F3F9A3636 + 952F2F912B2B8F28288D26268C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C26268C27278D28288D29298E2B + 2B8F2D2D902F2F913131923434943636953838963A3A973B3B983C3C983E3E99 + 3E3E993E3E993E3E993E3E993D3D993C3C983B3B983A3A973A3A973838963737 + 953535953434943333933232933030922E2E912D2D902B2B8F29298E28288D26 + 268C3030924B4BA06363AC7575B68383BE8B8BC28C8CC28787C07E7EBB7272B5 + 6363AD5656A649499F3D3D993434942E2E912A2A8F28288D26268C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C26268C27278D28288D2929 + 8E2C2C902E2E913030923434943636953939963B3B983E3E9940409A41419B42 + 429B43439C43439C43439C3E3E963333872929772424711C1C651B1B6317175E + 12125612125617175E1919631A1A6520206F2323742A2A822F2F8F3030922E2E + 912E2E912C2C902A2A8F28288D26268C2E2E914C4CA16666AE7B7BBA8989C191 + 91C59191C58B8BC28080BC7272B56363AC5353A446469E3B3B983333932D2D90 + 29298E27278D26268C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C26268C27278D28288D + 29298E2C2C902E2E913131923434943838963B3B983E3E9941419B43439C4545 + 9D46469E46469E44449B35358725257119196012125612125612125612125612 + 1256121256121256121256121256121256121256121256121256121256121256 + 1212561717601F1F6F26267F2D2D902D2D902B2B8F29298E28288D26268C3333 + 935151A36D6DB28181BD9090C49696C89494C78C8CC38080BC6F6FB35F5FAB50 + 50A342429B3838963030922B2B8F28288D26268C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C26268C27278D28 + 288D29298E2B2B8F2E2E913131923535953939963D3D9940409A43439C46469E + 48489E49499F4A4A9F3A3A8A26267115155A1212561212561212561212561212 + 5612125612125612125612125612125612125612125612125612125612125612 + 125612125612125612125612125612125612125614145A1D1D6C2727822D2D90 + 2B2B8F29298E28288D25258C3A3A975A5AA87575B68A8AC19696C89A9ACA9696 + C88C8CC27C7CBA6B6BB15A5AA84B4BA03E3E993434942E2E9129298E27278D26 + 268C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2626 + 8C27278D28288E2B2B8F2E2E913131923434943939963D3D9941419B45459D48 + 489E4B4BA04B4BA048489B2E2E7A17175D121256121256121256121256121256 + 12125612125612125613135814145A15155B16165C16165D17175D17175D1616 + 5D16165C15155B14145A13135812125612125612125612125612125612125612 + 125612125615155C2020742B2B8D2A2A8F28288E27278D25258C45459D6464AD + 7F7FBB9292C69C9CCB9D9DCB9696C88888C07777B76464AD5353A444449C3939 + 963030922B2B8F28288D26268C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 26268C27278D28288E2A2A8F2D2D903030923434943838963D3D9941419B4545 + 9D49499F4C4CA14E4EA247479A2C2C7714145912125612125612125612125612 + 125612125714145A16165D1818601A1A621B1B641D1D661D1D671E1E681E1E69 + 1F1F691F1F691E1E691E1E681D1D671C1C651B1B6419196118186016165D1414 + 5A1212571212561212561212561212561212561313591E1E7129298B29298E28 + 288D26268C3030925252A47272B58B8BC29A9ACAA0A0CD9E9ECC9292C68282BD + 6F6FB35C5CA94B4BA03E3E993434942D2D9028288E27278D25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C26268C27278D28288D29298E2C2C902E2E913333933737953C3C9840409A + 45459D4A4A9F4D4DA14F4FA249499B2A2A731313571212561212561212561212 + 5612125715155B17175E1A1A621C1C651E1E6820206B21216D23236F24247125 + 257225257326267427277527277526267425257325257224247123236F21216D + 20206A1E1E681C1C651A1A6217175E15155B1212571212561212561212561212 + 561313581C1C6E28288A28288E27278D25258C40409A6363AC8080BC9696C8A1 + A1CDA3A3CE9B9BCA8C8CC27979B86565AE5252A443439C3737952F2F912A2A8F + 27278D26268C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C26268C27278D28288E2A2A8F2E2E913131923535953A3A9740 + 409A44449C49499F4C4CA15050A35050A1343480141459121256121256121256 + 12125614145917175D1919611D1D661F1F6921216D2323702525732727752929 + 782A2A7A2B2B7B2C2C7D2D2D7E2D2D7E2D2D7F2D2D7F2D2D7E2D2D7E2C2C7D2B + 2B7B2A2A7A29297827277525257323237021216D1F1F691C1C6519196117175D + 1313581212561212561212561212561313591F1F7429298D28288D26268C2E2E + 915252A47474B58E8EC39F9FCCA6A6D0A2A2CE9595C78282BD6E6EB25A5AA849 + 499F3B3B983232932C2C9028288D26268C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C26268C27278D28288D29298E2C2C902F2F913434943939 + 963E3E9943439C48489E4C4CA15050A35151A34343921D1D6312125612125612 + 125612125614145A18185F1B1B631E1E6821216C2323702626742828772B2B7B + 2D2D7E2E2E803030823131843232863333873434883434883434893434893434 + 883434883333873232863131843030822E2E802D2D7E2B2B7B28287726267423 + 237021216C1E1E681B1B6318185F14145A12125612125612125612125615155E + 22227D28288E27278D25258C43439C6767AF8686BF9B9BCAA6A6D0A6A6D09C9C + CB8B8BC27676B76262AC4F4FA240409A3434942E2E9128288E27278D25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C26268C27278D28288E2B2B8F2E2E91323293 + 3636953B3B9840409A46469E4B4BA04F4FA25151A34E4E9E2A2A721212561212 + 5612125612125614145A18185F1B1B641F1F6922226E2525722828762B2B7B2D + 2D7E2F2F8131318433338735358A36368C37378D39398F3939903A3A913A3A92 + 3B3B933B3B933A3A923A3A9139399039398F37378D36368C35358A3333873131 + 842F2F812E2E7E2C2C7B28287625257222226E1F1F691B1B6418185F14145A12 + 125612125612125612125618186525258728288D26268C3535955A5AA87B7BBA + 9595C7A5A5D0AAAAD2A2A2CE9292C67F7FBB6969B05555A545459D3838962F2F + 912A2A8F27278D26268C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C26268C28288D29298E2C2C902F + 2F913434943939963F3F9A44449C49499F4E4EA25151A35353A43A3A8516165A + 12125612125612125614145918185F1B1B641F1F6923236F2626742929782C2C + 7D2F2F8131318434348836368B38388E3939903B3B933C3C953E3E973F3F983F + 3F9940409A41419B41419B41419B40409A40409A3F3F993F3F983E3E973C3C95 + 3B3B9339399038388E3C3C8D43438F3E3E8A3232822C2C7D2929782626742222 + 6E1F1F691B1B6418185F14145912125612125612125613135821217728288D27 + 278D28288E4C4CA17070B48E8EC3A2A2CEAAAAD2A7A7D19999C98686BF7070B4 + 5C5CA94A4A9F3B3B983232932C2C9028288D26268C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C26268C27278D28288D2A2A + 8F2E2E913131923636953B3B9841419B47479E4C4CA15151A35353A44949971F + 1F6612125612125612125613135817175D1A1A631F1F6922226E252574292979 + 2C2C7E2F2F8232328634348A37378D3939913B3B943D3D973F3F9940409C4242 + 9D43439F4343A04444A14545A24545A24545A34545A34545A24545A24444A143 + 43A042429E42429D40409C40409948489B54549F55559D505099474793383889 + 2F2F822C2C7D28287825257422226E1E1E691A1A6317175D1313581212561212 + 561616591D1D6825258527278D25258C40409A6565AE8686BF9E9ECCAAAAD2AA + AAD29F9FCC8D8DC37878B86363AC4F4FA240409A3434942E2E9128288E27278D + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C26268C27278D + 28288E2B2B8F2E2E913333933838963E3E9944449C4A4A9F4F4FA25353A45454 + A332327C12125612125612125612125615155C1A1A621D1D6821216D25257328 + 28782C2C7E2F2F8232328735358B38388F3A3A933D3D963F3F9941419C43439F + 4444A14646A44747A54848A74848A74949A94A4AAA4A4AAA4A4AAA4A4AAA4A4A + AA4A4AAA4949A94848A74848A74646A54646A45151A76060AC6060AA4E4EA04B + 4B9C55559F4F4F9A3B3B8D3232872F2F822C2C7D28287825257221216D1D1D67 + 19196115155B12125616165919195C16165A1F1F7627278D26268C3434945959 + A87B7BBA9797C8A7A7D1ABABD3A4A4CF9494C78080BC6969B05555A544449C38 + 38962F2F912A2A8F27278D26268C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C26268C26 + 268C28288D29298E2C2C903030923434943A3A9740409A46469E4C4CA15151A3 + 5555A54E4E9C21216812125612125612125614145A1818601C1C6620206C2424 + 722828772B2B7D2F2F8232328735358B3838903B3B943E3E9840409C42429E44 + 44A14646A44848A74949A94A4AAA4B4BAC4C4CAD4D4DAF4E4EB04E4EB04E4EB1 + 4E4EB14E4EB14E4EB14E4EB04E4EB04D4DAF4C4CAD4B4BAC5757AF6B6BB76A6A + B55656AA4545A142429E5050A25A5AA452529E41419435358B3232872F2F822B + 2B7D28287724247121216C2020681C1C611C1C5F1A1A5D141458121256191968 + 27278A26268C29298E4D4DA17171B49090C4A4A4CFACACD3A8A8D19A9ACA8686 + BF7070B45B5BA849499F3A3A973131922B2B8F28288D26268C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C26268C27278D28288E2A2A8F2E2E913232933737953D3D9943439C49499F4F + 4FA25353A45656A641418D16165A12125612125612125616165D1A1A631F1F69 + 2323702727752A2A7B2F2F8132328635358B3838903B3B943E3E9840409C4343 + A04545A34747A64949A94B4BAB4C4CAD4E4EAF4F4FB15050B35151B45252B552 + 52B65252B65353B75353B75353B75353B75252B65252B65252B55151B45A5AB7 + 7373C07474BF5B5BB34D4DAC4949A94747A64545A34F4FA45E5EA85757A44444 + 9738389035358B32328630308133337F34347C3131782C2C712424691B1B6013 + 135612125612125615155D23238127278D25258C42429B6666AE8787C09F9FCC + ABABD3ABABD3A0A0CD8D8DC37777B76161AC4D4DA13E3E993333932C2C902828 + 8E26268C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C26268C27278D28288E2B2B8F2E2E913434943939963F3F9A4545 + 9D4B4BA05151A35555A55555A42E2E7612125512125512125514145918185F1D + 1D6621216C2525722929782D2D7E30308334348938388E3B3B923E3E9740409B + 43439F4646A34848A64A4AA94C4CAC4E4EAE4F4FB15050B25252B55353B65454 + B75454B85555B95656BA5656BB5656BB5656BB5656BB5656BB5656BB5656BA55 + 55B95C5CBC7676C67C7CC76262BB5252B34F4FB14E4EAE4C4CAC4A4AA94848A6 + 5454A96262AC5A5AA649499B3E3E9440409248489346468E40408736367F2C2C + 7624246D1D1D6618185E1313571212551212551212561E1E7227278D26268C37 + 37955C5CA97E7EBB9999C9AAAAD2ADADD4A4A4CF9393C67E7EBB6767AF5252A4 + 41419B3535952E2E9129298E27278D25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C26268C28288D29298E2C2C903030923535953A3A97 + 41419B47479E4D4DA15252A45656A64C4C991D1D631212551212551212551616 + 5B1A1A621F1F6823236F2727752B2B7C2F2F8133338736368C3A3A923D3D9640 + 409B43439F4646A34848A64A4AA94C4CAC4E4EAF5050B25252B55353B65454B8 + 5555BA5656BB5757BC5858BE5858BE5959BF5959BF5959C05959C05959C05959 + C05959BF5959BF5959BF6C6CC68787D06E6EC55555BA5454B85353B65252B450 + 50B24E4EAF4C4CAC4C4CAA5454AB6464B06161AC5757A45858A254549D464694 + 3A3A8A3131822B2B7A27277522226E1F1F681A1A6215155A1212561212551212 + 5518186526268A26268C2D2D905151A37575B69393C6A7A7D1AEAED4A9A9D199 + 99C98484BE6D6DB25757A745459D3838962F2F912A2A8F27278D26268C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C26268C27278D28288D2A2A8F2E2E9131319237 + 37953D3D9943439C4A4A9F5050A35454A55757A73C3C86141458121255121255 + 13135718185F1D1D6621216C2525722A2A792D2D7E32328535358A39398F3C3C + 943F3F9942429D4545A24848A64A4AA94D4DAD4E4EB05050B25252B55454B755 + 55BA5656BB5858BD5858BE5959C05A5AC15B5BC25B5BC35C5CC35C5CC45C5CC4 + 5C5CC45C5CC45C5CC45C5CC45C5CC35B5BC26E6EC98C8CD57474CA5A5ABF5858 + BD5656BB5555BA5454B75252B55050B24E4EB04D4DAD5656AE6666B36464AF58 + 58A745459B3F3F9638388F3535893131832D2D7E29297929297326266E222268 + 1C1C6016165916165915155816165E23238127278D25258C46469E6C6CB18C8C + C3A4A4CFAEAED4ABABD39E9ECC8A8AC17373B55D5DA94A4A9F3B3B983131922B + 2B8F28288D26268C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C26268C27278D28288E2B2B8F2E2E + 913333933939963F3F9A45459D4B4BA05151A35656A65454A229297012125512 + 125512125515155A1A1A611F1F6823236F2727752B2B7C30308233338737378D + 3B3B923E3E9742429C4444A04747A54A4AA94C4CAC4E4EB05050B25252B55454 + B85656BA5757BC5858BE5959C05A5AC15B5BC35C5CC45D5DC45D5DC65E5EC65E + 5EC75E5EC75E5EC75E5EC75E5EC75E5EC75E5EC75E5EC75E5EC66565C87E7ED2 + 8B8BD67373CC5E5EC25959C05858BE5757BC5656BA5454B85252B55050B24E4E + AF5454AF5656AE4A4AA64444A041419C3E3E973D3D933C3C8F3D3D8B3F3F8938 + 388233337B2E2E7527276D2222661B1B5F17175A17175A17175A1F1F7427278D + 25258C3D3D996363AC8585BF9F9FCCADADD4AEAED4A3A3CE9090C47979B86262 + AC4E4EA23F3F9A3434942D2D9028288E26268C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C26268C27278D29298E + 2C2C902F2F913434943A3A9740409A47479E4D4DA15353A45757A64F4F9C1E1E + 6312125512125512125617175C1B1B6420206B2525712929782D2D7E32328535 + 358A3939903D3D9540409A43439F4646A34949A84C4CAC4E4EAF5050B25252B5 + 5454B85656BB5757BC5959BF5A5AC05B5BC25C5CC45D5DC45E5EC65E5EC75E5E + C75F5FC86060C96060C96060C96060C96060C96060C96060C96060C96060C960 + 60C95F5FC86565CA8181D49292DA7575CE5E5EC55B5BC25A5AC05858BE5757BC + 5656BA5454B85252B55050B24E4EAF4B4BAB4949A74848A44E4EA35252A25353 + 9E4F4F9942428F3C3C893535812D2D7929297322226B1E1E641A1A5E16165917 + 175A19195C1C1C6A26268A26268C3434945959A87D7DBA9999C9AAAAD2AFAFD5 + A6A6D09595C77F7FBB6868AF5353A442429B3636952E2E9129298E27278D2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C26268C28 + 288D29298E2D2D903030923535953C3C9842429B49499F4F4FA25454A55757A7 + 43438E15155A11115511115514145918185F1D1D6722226D2626742A2A7A2E2E + 8133338736368C3A3A923D3D9741419D4444A14747A64A4AAA4D4DAE4F4FB151 + 51B55353B75555BA5656BC5A5AC05F5FC36161C46262C66363C76464C96363C9 + 6464CA6565CB6464CB6565CD6464CC6363CC6161CC6060CC6060CC6060CC6060 + CC6060CC6060CB6060CB6060CB5F5FC96464CB8080D68F8FDB7A7AD15F5FC75B + 5BC45A5AC25959C15757BE5656BC5555BA5353B75151B54F4FB15252B06161B3 + 6262B15D5DAC5050A34242993C3C9338388D3232862E2E802A2A792525732020 + 6C1C1C6518185F13135812125615155819196125258526268C2C2C905050A374 + 74B59292C6A7A7D1AFAFD5AAAAD29A9ACA8585BF6E6EB25858A746469E3A3A97 + 3030922A2A8F28288D26268C25258C02000002000025258C25258C25258C2626 + 8C27278D28288E2A2A8F2E2E913232933737953E3E9944449C4B4BA05151A356 + 56A65858A733337C11115511115511115515155B1A1A621F1F69232370282876 + 2C2C7D30308334348938388F3C3C943F3F9A43439F4646A44949A84B4BAC4E4E + B05050B35252B65454B95656BC5757BE5D5DC16262C56464C76565C86565C966 + 66CA6565CB6666CB6767CD6666CD6666CE6767CE6666CE6666CE6565CE6262CD + 6161CD6161CD6161CD6161CD6161CC6161CC6161CC6060CC6060CB6767CE7C7C + D59393DD7A7AD26262C95D5DC65B5BC45A5AC25959C05757BE5656BB5656BA5E + 5EBB6F6FC06B6BBB5D5DB35050AB4646A342429E3F3F993B3B9437378E343489 + 3030822B2B7C27277522226E1D1D6719196014145912125612125616165B2222 + 7C26268C25258C45459D6A6AB18B8BC2A3A3CEADADD4ABABD39E9ECC8B8BC275 + 75B65E5EAA4B4BA03D3D993333932C2C9028288E26268C02000002000025258C + 25258C26268C27278D28288E2B2B8F2E2E9134349439399640409A46469E4C4C + A15252A45757A65454A225256C11115511115512125617175D1C1C6420206B25 + 25722929792E2E8032328636368C3A3A923D3D9741419C4444A14747A64A4AAA + 4D4DAE4F4FB25151B55353B85555BB5757BE5959C05C5CC36464C76565C86666 + CA6767CB6767CC6767CB6868CD6767CD6868CE6868CE6767CE6767CF6868CF67 + 67CF6767CF6666CE6363CE6262CE6262CD6262CD6262CD6262CD6161CD6161CC + 6161CC6161CC6868CE8282D88F8FDC7B7BD46565CB5D5DC75C5CC55B5BC45A5A + C25959C06969C57A7AC96F6FC35C5CB94F4FB14C4CAD4A4AA94747A54444A040 + 409B3D3D9639399035358B3131852D2D7E2828772424711F1F691A1A6216165B + 1111551111551313561E1E7227278D25258C3B3B986060AB8282BD9D9DCBABAB + D3ACACD3A3A3CE9191C57B7BBA6565AE5151A341419B3636952E2E9129298E02 + 000002000025258C26268C28288D29298E2C2C903030923535953A3A9741419B + 48489E4E4EA25353A45757A74B4B971A1A5F11115511115514145918185F1D1D + 6722226E2626742B2B7B2F2F8233338837378E3B3B943F3F9942429E4545A348 + 48A84B4BAC4E4EB05050B35353B75454BA5656BC5858BF5959C15B5BC36060C6 + 6767CA6767CA6868CC6868CC6969CE6969CE6868CE6969CE6868CE6868CF6969 + CF6868CF6868D06868D06767D06767D06464CF6262CE6262CE6262CE6262CE62 + 62CE6262CD6262CD6161CD6161CC6161CC6666CE8080D89595DF7878D35F5FC9 + 5D5DC75D5DC65E5EC56A6AC88282D17474CA5A5ABE5454B95252B65050B34D4D + AF4B4BAC4848A74545A342429D3E3E983A3A9236368C3232862E2E802A2A7A25 + 257320206C1C1C6517175E1313571111551212561A1A6726268A26268C323293 + 5656A67979B89595C7A7A7D1ACACD3A6A6D09797C88282BD6C6CB15757A74646 + 9E3A3A9731319202000002000027278D28288D2A2A8F2E2E913232933737953D + 3D9943439C4A4A9F5050A35454A55757A73E3E8814145811115511115515155B + 1A1A621F1F692323702828772C2C7D30308335358A3939903C3C9640409B4444 + A04747A54A4AA94D4DAE4F4FB25151B55353B85555BB5757BE5959C05A5AC25B + 5BC45C5CC66464C96969CB6969CC6969CD6A6ACE6969CF6A6ACF6A6ACF6969CF + 6A6ACF6969CF6969D06969D06868D06868D06868D06767D06565CF6262CE6262 + CE6262CE6262CE6262CE6262CE6262CE6262CD6262CD6161CD6161CC7979D597 + 97E18080D75F5FCA5F5FC95E5EC86E6ECD8383D57676CE6060C45959C05757BE + 5555BB5353B85151B54E4EB14C4CAD4949A94646A443439F3F3F9A3C3C943838 + 8F3434893030822B2B7C27277522226E1D1D6718185F14145911115512125517 + 175F24248426268C28288D4A4A9F6E6EB28C8CC3A2A2CEAAAAD2A8A8D19C9CCB + 8989C17474B55E5EAA4C4CA13F3F9A02000002000028288E2B2B8F2E2E913333 + 933939963F3F9A45459D4B4BA05151A35656A65555A42E2E7611115511115512 + 125617175D1C1C6420206B2525722929792E2E8032328636368C3A3A923D3D97 + 41419D4545A24848A64B4BAB4D4DAF5050B35252B65454BA5656BC5858BF5959 + C15B5BC35C5CC55D5DC75E5EC86565CB6B6BCD6B6BCE6A6ACF6B6BCF6B6BCF68 + 68CF6868CF6969CF6868CF6868D06868D06969D06969D06868D06868D06868D0 + 6565CF6262CE6262CE6262CE6262CE6262CE6262CE6262CE6262CE6262CD6262 + CD6B6BD18B8BDD8D8DDD6D6DD16060CC6060CB6B6BCE8484D87F7FD56464CA5C + 5CC45B5BC35959C15757BE5656BC5454B95252B65050B24D4DAE4A4AAA4747A6 + 4444A140409C3D3D9639399035358B3131842D2D7E2828772424701F1F691A1A + 6215155B11115512125617175B22227C27278D25258C3E3E996262AC8282BD9A + 9ACAA7A7D1A9A9D19F9FCC8F8FC47B7BBA6767AF5454A50200000200002C2C90 + 3030923434943A3A9740409A47479E4D4DA15252A45757A64C4C991D1D631111 + 5511115514145918185F1D1D6722226D2626742B2B7B2F2F8233338837378E3B + 3B943F3F9942429F4646A44949A94C4CAD4E4EB15151B55353B85555BB5757BE + 5959C05A5AC25B5BC45C5CC65D5DC75E5EC85F5FC96666CC6C6CCF6C6CD06C6C + CF6B6BD06B6BD06464CE6262CD6262CE6262CE6262CE6464CF6969D06969D069 + 69D06868D06868D06565CF6262CE6262CE6262CE6262CE6262CE6262CE6262CE + 6262CE6262CE6262CE7E7ED89898E27A7AD76363CE6161CC6060CC8181D88585 + D96A6ACD5E5EC85D5DC75C5CC65B5BC45A5AC25858BF5757BD5555BA5353B750 + 50B34E4EB04B4BAC4848A74545A342429D3E3E983A3A9236368C3232862E2E80 + 2A2A7925257220206B1C1C6417175D1212561212561616591F1F7127278C2626 + 8C3131925454A57575B69191C5A2A2CEA7A7D1A2A2CE9595C78383BE6F6FB302 + 00000200003232933737953C3C9843439C49499F4F4FA25353A45757A641418C + 15155A11115511115515155B1A1A621F1F692323702828772C2C7D3030833434 + 8A3939903C3C9640409B4444A04747A54A4AAA4D4DAE4F4FB25151B55454B956 + 56BC5757BE5959C15B5BC35C5CC45D5DC75E5EC85F5FC95F5FC96060CB6767CE + 6D6DD06D6DD06D6DD16D6DD06C6CD06464CF6262CE6262CE6262CE6262CE6464 + CF6969D06969D06969D06969D06868D06666CF6262CE6262CE6262CE6262CE62 + 62CE6262CE6262CE6262CE6262CE6464CF8D8DDE9292E06969D06262CD6161CD + 7070D28F8FDE7272D36060CB5F5FC95F5FC95D5DC75D5DC65C5CC45A5AC35959 + C05757BE5555BB5353B85151B54F4FB14C4CAD4949A94646A443439F3F3F9A3C + 3C9438388F3434892F2F822B2B7B26267422226D1D1D6718185F141459131356 + 18185B1A1A6425258826268C25258C45459D6767AF8484BE9898C9A3A3CEA2A2 + CE9999C98A8AC10200000200003939963F3F9A45459D4B4BA05050A35454A555 + 55A42D2D7611115511115512125717175E1B1B6420206B2424722929792D2D80 + 31318635358C3939923D3D9741419D4545A24848A64B4BAC4D4DB04F4FB35252 + B75454BA5656BD5757BF5959C25A5AC45B5BC65C5CC75D5DC85E5EC95E5ECA5F + 5FCB6060CC6868CE6D6DD16C6CD16D6DD16D6DD16C6CD16363CF6161CE6161CE + 6161CE6161CE6363CF6969D06969D06868D06868D06868D06565CF6161CE6161 + CE6161CE6161CE6161CE6161CE6161CE6161CE6262CE7070D49696E27F7FDA61 + 61CE6161CD6666CF8282DA8686DB6262CD6060CC5F5FCB5E5ECA5E5EC95D5DC8 + 5C5CC75B5BC55A5AC35858C15757BF5555BC5454BA5353B75151B34D4DAE4B4B + AB4747A64343A03F3F9B3C3C9638389034348A3030832C2C7D2727762323701E + 1E681A1A6215155B16165918185B16165D22227E27278D26268C3434945555A5 + 7474B58C8CC29A9ACA9E9ECC9A9ACA02000002000040409A46469E4C4CA15151 + A35555A54B4B991D1D6311115511115514145A1818601D1D6722226E2626742A + 2A7B2F2F8233338837378E3B3B943E3E994444A04D4DA65555AC5858B15A5AB5 + 5858B75353B85454BB5656BE5858C05959C25B5BC45C5CC65D5DC75E5EC95E5E + C95F5FCB6060CC6060CC6060CC6868CF6E6ED16E6ED16D6DD26D6DD26C6CD163 + 63CF6161CE6161CE6161CE6161CE6363CF6969D06969D06969D06868D06868D0 + 6565CF6161CE6161CE6161CE6161CE6161CE6161CE6161CE6161CE6464CF7B7B + D89595E27272D46161CE6262CE7272D48A8ADD7676D56161CD6161CC6060CC5F + 5FCB5F5FCB5E5EC95D5DC85D5DC75B5BC65A5AC45959C25D5DC26868C46A6AC2 + 6A6AC16B6BBF6262B85959B14F4FAA4646A441419D3D3D9739399235358C3131 + 862D2D8029297924247220206B1B1B641A1A6019195C1616591212561C1C7028 + 288C27278D25258C41419B5F5FAB7979B88C8CC29595C702000002000048489E + 4D4DA15252A45555A53B3B8613135811115512125616165C1A1A631F1F692323 + 702828772C2C7D30308334348A3838903C3C963F3F9B4747A25555AA5A5AB05E + 5EB46060B86262BB6464BE6161C05858BF5858C15A5AC35B5BC55C5CC75D5DC8 + 5E5EC95E5ECA5F5FCB6060CC6060CC6060CC6060CD6969CF6F6FD16E6ED26E6E + D26D6DD26D6DD26363CF6161CE6161CE6161CE6161CE6363CF6A6AD16A6AD169 + 69D06969D06868D06565CF6262CE6363CF6161CE6161CE6161CE6161CE6464CF + 6262CE6868D18989DE8D8DDF6969D16161CE6565CF8080D98B8BDE6969D06262 + CD6161CD6161CC6060CC6060CC5F5FCB5E5EC95E5EC95D5DC85D5DC86565C879 + 79CF8484D18686D18383CD8080CA7A7AC57575C26868B85858AF4646A442429F + 3E3E993B3B9437378E3333882F2F822A2A7B26267422226E1E1E681E1E641C1C + 6012125611115517176226268628288D26268C29298E46469E6161AC7575B602 + 00000200004F4FA25252A44F4F9E27276F11115511115514145918185F1C1C66 + 21216C2525732929792E2E8031318535358B3939913D3D9741419C4848A35656 + AB5C5CB05F5FB46161B86464BC6767BF6868C36969C46666C55B5BC35B5BC55C + 5CC65D5DC75E5EC95F5FCA5F5FCA6060CB6060CB6060CC6161CC6161CC6A6AD0 + 6F6FD26F6FD16E6ED16E6ED16D6DD16464CE6161CD6161CD6161CD6161CD6363 + CE6A6AD06A6AD06A6AD06969D06969D06A6AD07272D47676D57B7BD87A7AD77A + 7AD77D7DD87C7CD87878D68383DB9A9AE48383DB6363CE6363CE6A6AD18686DC + 8181D96565CF6262CC6262CC6161CC6161CC6060CB6060CB5F5FCA5E5EC95E5E + C96C6CCD8383D58F8FD98C8CD78989D48585D08484CE8282CB7D7DC77979C36F + 6FBD5B5BB14646A54343A03F3F9A3C3C9538388F3434893030832C2C7D282877 + 23237024246C25256919195E12125611115516165B23237D28288E28288D2626 + 8C28288E40409A0200000200005151A339398415155911115512125716165C1A + 1A621E1E6923236F2727762B2B7C2F2F8233338837378E3B3B933E3E9942429E + 4949A45959AD5D5DB16161B66363BA6666BD6868C06A6AC36C6CC66D6DC86D6D + C96969CA5D5DC65E5EC85E5EC95F5FCA6060CB6060CB6060CB6060CC6161CC61 + 61CC6161CD6A6AD06F6FD26F6FD26F6FD16E6ED16D6DD16464CE6161CD6161CD + 6161CD6161CD6363CE6A6AD06A6AD06A6AD06A6AD06B6BD08282DA9292E19B9B + E49393E19494E19494E19595E29393E19393E19A9AE48F8FDF7474D56464CE64 + 64CE7272D48B8BDE7777D66464CF6363CE6262CD6262CC6262CC6161CC6060CB + 6060CB5F5FCA6666CD8181D69292DD9191DC8A8AD77E7ED17070CA6969C67272 + C87C7CCA7F7FC97B7BC46E6EBD5454AE4747A64444A141419C3D3D9739399135 + 358B3131852E2E802929792929752C2C7323236A181860141459121256151558 + 1A1A6726268828288E28288D27278D0200000200002020671111551111551515 + 5B1919601D1D6621216D2525732929782D2D7E31318535358A3838903C3C953F + 3F9B4343A04A4AA65959AE5F5FB46262B86565BA6767BE6969C16B6BC46D6DC7 + 6E6EC97070CB7070CC7070CD6C6CCD6060CA5F5FCA6060CB6060CB6060CC6060 + CC6161CC6161CC6262CD6464CE6C6CD07070D26F6FD26F6FD26F6FD16E6ED164 + 64CE6161CD6161CD6161CD6161CD6363CE6B6BD06B6BD06A6AD06A6AD07070D3 + 9B9BE49393E06A6AD07777D67777D67878D67070D37474D47474D56969D06F6F + D26868D06565CE6565CE7878D68B8BDE7070D36363CE6363CE6363CE6262CD62 + 62CC6262CC6161CC6060CB6060CB7474D39090DD9393DE8F8FDB7676D15F5FC6 + 5C5CC35B5BC25C5CC16868C47A7AC98080CA7C7CC66767BA4E4EAD4848A74545 + A242429E3E3E993B3B9337378E3333882F2F822E2E7D32327C2D2D752020691B + 1B6316165D1313571111551313581F1F7529298E29298E020000020000121256 + 15155A18185F1C1C651F1F6A2424702727762B2B7C2F2F8233338737378D3A3A + 923D3D9741419D4444A14C4CA75C5CB06060B56464B96666BC6868C06B6BC26D + 6DC56E6EC76F6FCA7070CB7171CC7272CE7272CF7272CF6D6DCF6161CB6060CB + 6060CC6161CC6161CC6464CE6A6AD06E6ED17070D27070D27070D27070D26F6F + D26F6FD26E6ED16464CE6161CD6161CD6161CD6161CD6363CE6B6BD06B6BD06B + 6BD06A6AD07777D59C9CE48484DB6767CF6767CF6262CD6161CD6161CD6161CD + 6161CD6262CD6464CE6565CE6565CE6666CE7777D68F8FE06868CF6363CE6363 + CE6363CE6363CE6262CD6262CC6262CC6161CC6464CE8383D99595E19595E082 + 82D86262CA5D5DC75C5CC65B5BC45A5AC25858C06969C57F7FCD8080CA7474C3 + 5656B44C4CAD4949A94646A54343A03F3F9B3C3C9538389035358A3232853939 + 8536368028287421216D1E1E6719196116165C12125711115515155F23237C02 + 00000200001818601C1C651F1F6A22226F2626742929792E2E8031318535358A + 38388F3B3B943F3F9A42429E4545A34E4EAA5E5EB26363B76565BB6868BE6A6A + C16C6CC46D6DC66C6CC76767C87272CC7272CD7373CF7373CF7373D17474D274 + 74D16E6ED06161CC6161CC6565CD6C6CD17272D27272D27272D27272D27171D2 + 7070D27070D27070D26F6FD26F6FD16464CE6161CD6161CD6161CD6161CD6464 + CE6C6CD06C6CD06B6BD06B6BD07D7DD79898E38888DC6969D06868CF6868CF65 + 65CE6363CE6161CD6262CD6565CE6666CF6666CF6565CE6666CF7878D68F8FDF + 6A6AD16363CE6363CE6363CE6363CE6363CE6262CD6262CD6262CC6A6ACF8C8C + DE9797E19292DF7272D25F5FCA5E5EC95D5DC75C5CC65B5BC55A5AC36060C37D + 7DCE8585D07F7FCB5D5DBB4F4FB24D4DAE4A4AAA4747A64444A141419D3D3D97 + 3A3A9237378D40408E3E3E8A2F2F7F28287724247120206B1C1C661919611616 + 5C1313581111550200000200001F1F6A22226F2525742929792C2C7D2F2F8233 + 338836368D3939923D3D9740409C4343A14646A54B4BAA5E5EB36363B86666BB + 6868BF6B6BC26D6DC56E6EC86C6CC85F5FC55B5BC66767CB7373CF7373D07474 + D17474D27474D27474D27474D26E6ED16C6CD07373D37373D37373D37272D371 + 71D27171D27171D27070D27070D27070D26F6FD26E6ED16262CE6060CD6060CD + 6060CD6060CD6262CE6B6BD16B6BD16B6BD06A6AD07D7DD89B9BE48484DB6B6B + D16868D06767CF6767CF6767CF6464CE6464CE6666CF6666CF6565CF6565CF66 + 66CF7B7BD78888DD6E6ED36060CD6161CD6262CE6262CE6262CE6262CE6161CD + 6161CD6C6CD08D8DDF9797E38E8EDE6B6BD05F5FCB5E5ECA5D5DC95D5DC85C5C + C65B5BC55C5CC47C7CD08888D48282CF6262C05252B74F4FB34D4DB04A4AAB48 + 48A84444A342429F3E3E9A3B3B954646974848943333872D2D802A2A7B262676 + 2323701F1F6B1D1D661A1A6217175F0200000200002626742929792C2C7D2F2F + 8232328735358B3838903C3C953E3E9A41419E4444A34747A74A4AAB5757B365 + 65BB6868BE6A6AC06C6CC36D6DC56F6FC86E6ECA6060C65B5BC65C5CC75D5DC9 + 6868CD7575D17575D27575D27575D37575D37575D37575D37575D37474D37373 + D37373D37373D37272D37171D27171D27171D27070D27070D27070D26969D060 + 60CD6060CD6060CD6060CD6060CD6060CD6767CF6B6BD16B6BD16B6BD07373D4 + 9E9EE58686DB6B6BD16969D06868D06767CF6767CF6767CF6767CF6666CF6666 + CF6666CF6565CF6565CF7D7DD88484DB6B6BD16060CD6060CD6161CD6262CE62 + 62CE6262CE6262CE6161CD6A6AD18C8CDE9898E39292E07474D46060CB5F5FCB + 5E5ECA5D5DC95D5DC85C5CC76868CB8484D58B8BD78181D16262C35454BA5252 + B85050B44E4EB14B4BAE4848A94646A54343A141419C49499D51519D38388F33 + 33893030842D2D7F29297A26267624247121216D1E1E690200000200002D2D7F + 2F2F8232328735358B37378F3A3A943D3D9840409D4343A14646A54848A94B4B + AD4E4EB16262BA6969BF6B6BC26D6DC56F6FC67171C96E6ECA6161C75C5CC65C + 5CC75D5DC95E5ECA5E5ECA6A6ACF7676D27676D37676D37676D37575D47575D4 + 7575D37474D37474D37373D37373D37373D37272D37171D27171D26F6FD26D6D + D16969D06161CD6060CD6060CD6060CD6060CD6060CD6060CD6161CD6767CF69 + 69D06A6AD07272D39E9EE58585DB6B6BD16969D06969D06868D06868D06767CF + 6767CF6767CF6666CF6666CF6666CF6565CF7979D78989DD6969D06060CD6060 + CD6060CD6161CD6262CE6262CE6262CE6262CE6565CF8585DB9999E49797E286 + 86DC6969D05F5FCB5F5FCB5E5ECA5D5DC96161CA7777D28F8FDB8E8ED98080D2 + 5F5FC35656BE5555BC5353B95151B64F4FB34C4CAF4A4AAB4747A74747A55353 + A75555A43E3E9839399136368D3333883030842D2D802B2B7C29297826267402 + 000002000033338835358C3838903A3A943D3D9840409C4242A04545A44747A7 + 4A4AAB4C4CAF4E4EB25151B56767BF6D6DC36F6FC67070C97272CA7373CB6A6A + CB5C5CC75D5DC85D5DC95E5ECA5F5FCB5F5FCB5F5FCB6A6AD07777D37777D376 + 76D47676D47575D47575D47575D37474D37474D37373D37373D37171D26B6BD1 + 6767CF6363CE6161CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060 + CD6060CD6060CD6060CD6262CE7272D49A9AE38D8DDE6A6AD06A6AD16C6CD16D + 6DD26C6CD16969D06B6BD16767CF6A6AD06666CF6666CF6262CE6A6AD18C8CDF + 6D6DD26060CD6060CD6060CD6060CD6262CE6262CE6262CE6262CE6262CE7575 + D59494E19999E49595E28383DA6C6CD16464CD6060CB6767CD7878D48D8DDB91 + 91DD9090DC7676D05B5BC45858C15757BF5555BD5353BA5252B75050B44E4EB1 + 4B4BAD4E4EAC5B5BAF5757AA43439E3E3E993D3D9641419543439341418F3F3F + 8C3B3B883838840200000200003939913B3B943D3D9840409C4242A04444A247 + 47A64949AA4B4BAE4E4EB15050B45252B75454BA6868C37171C77272C97373CB + 7474CD7575CE7575CF6969CC5D5DC95E5ECA5F5FCB5F5FCB5F5FCC5F5FCC6060 + CC6B6BD07777D47676D47676D47676D47575D47575D47575D37474D37070D268 + 68D06363CE6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD + 6060CD6060CD6060CD6060CD6060CD6060CD6060CD6C6CD29191E19393E18383 + DB8686DB8B8BDD8787DC8888DC8686DC8B8BDE8D8DDE8484DB7373D46363CE60 + 60CD6D6DD28989DD7676D66060CD6060CD6060CD6262CE6363CE6363CE6262CE + 6262CE6262CE6868D08181DA9797E39999E49797E38E8EDF8080D97D7DD78484 + DA9292E09595DF9292DE8888D96767CC5B5BC65A5AC35959C25858C05656BD54 + 54BB5252B85151B54E4EB25757B36666B75757AE4646A44343A04848A05757A5 + 5B5BA353539E4F4F9A4D4D974A4A940200000200003E3E9940409D4242A04444 + A24646A64848A94B4BAC4D4DB04F4FB35151B55252B85454BB5656BD6363C373 + 73CA7474CB7575CE7676CF7676D07777D17878D16A6ACE5F5FCB5F5FCB5F5FCC + 6060CC6060CC6060CD6060CD6B6BD17777D47676D47676D47676D47575D47272 + D36969D06161CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD60 + 60CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6262CE + 7575D58E8EDF9898E39797E39393E19898E39898E39E9EE59696E29797E29F9F + E58383DB6363CE6060CD6868D08484DB8181DA6161CE6060CD6262CE6464CE64 + 64CE6363CE6363CE6262CE6262CE6363CE6B6BD18787DD9595E29999E49898E3 + 9696E29696E29797E29696E19494E18A8ADC6E6ED05F5FC95C5CC75B5BC65A5A + C45959C35858C15656BE5555BC5353BA5252B75E5EBA7070C05555B24A4AAB47 + 47A75252AA6464AF5555A749499F48489C4747994242960200000200004343A1 + 4545A44747A64848A94A4AAC4C4CAF4E4EB25050B45252B75353BA5555BC5656 + BE5858C05B5BC36D6DCA7777CE7878D07878D17979D27878D27979D47A7AD36B + 6BCF5F5FCC6060CC6060CC6060CD6060CD6060CD6060CD6B6BD07676D47676D4 + 7575D46C6CD16262CE6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060 + CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD60 + 60CD6060CD6060CD6060CD6E6ED37171D46F6FD37171D47575D57676D67070D2 + 7373D47979D69393E18E8EDF6A6AD16060CD6363CE7B7BD88B8BDE6B6BD26262 + CE6464CE6464CE6464CE6363CE6363CE6363CE6262CE6161CD6161CD6C6CD27B + 7BD89090E09696E39999E49797E29696E28D8DDE8080D86B6BD05F5FCB5E5ECA + 5D5DC95C5CC75C5CC65B5BC55959C35959C25757C05656BD5656BC6A6AC26F6F + C25454B54D4DB04C4CAD6262B56767B54E4EA84343A141419E40409C3E3E9902 + 00000200004747A84848AA4A4AAC4C4CAF4D4DB24F4FB45151B75252B95454BC + 5555BD5757C05858C25858C35A5AC55C5CC77070CD7878D17979D27979D37979 + D47A7AD47A7AD57878D46C6CD05F5FCC5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F + 5FCD6363CE6565CF6363CE5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD + 5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5F + CD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD6060CD5F5FCD5F5FCD5F + 5FCD5F5FCD6161CE6262CE6161CD7A7AD89797E37575D65F5FCD5F5FCD6F6FD3 + 8C8CDF7C7CD86565CF6464CF6363CE6363CE6363CE6363CE6262CE6161CE5F5F + CD5F5FCD5F5FCD6161CE6767D07979D77B7BD87C7CD87A7AD66F6FD26363CE5E + 5ECB5E5ECB5E5ECB5D5DCA5C5CC95C5CC85B5BC75A5AC65959C45858C25858C1 + 6060C37979CB6666C25252B84F4FB55353B46F6FBE6969BB4C4CAD4747A84545 + A64343A24242A10200000200004B4BAE4C4CB04D4DB24F4FB45151B75252B953 + 53BB5454BD5656BF5757C15858C35959C45A5AC65B5BC75C5CC85F5FC97171D0 + 7A7AD47B7BD47A7AD47A7AD57B7BD57B7BD57A7AD56C6CD15F5FCD5F5FCD5F5F + CD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F + 5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD + 5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5F + CD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD6E6ED39696E38181DA63 + 63CF5F5FCD6363CE8484DC8C8CDE6F6FD46464CF6464CF6363CE6363CE6363CE + 6262CE5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD6060CE6363CE6363CF5F5F + CD5F5FCC5F5FCC5E5ECC5E5ECB5E5ECB5E5ECB5D5DCA5C5CC95C5CC95B5BC75A + 5AC65A5AC55C5CC57171CC7C7CCF5E5EC25454BC5353BA6262BE7B7BC76262BB + 4C4CB04B4BAE4949AB4848AA4747A80200000200004F4FB35050B55151B65252 + B95353BA5454BC5656BE5757BF5858C15959C35A5AC45B5BC55B5BC65C5CC85C + 5CC85D5DC96060CB7373D17B7BD37B7BD47B7BD47B7BD47B7BD57B7BD57A7AD5 + 6C6CD05F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC6565 + CE8787DC9393E16C6CD15F5FCC6262CD7171D39292E08080D86767CF6464CE64 + 64CE6363CD6262CD5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCB5F5FCB5E5ECB5E5ECA5E5ECA5E5E + CA5D5DC95C5CC85C5CC75B5BC66A6ACB8181D27272CB5858C05656BF5B5BBF74 + 74C87C7CCA5D5DBB5050B54F4FB34D4DB14C4CAF4B4BAD0200000200005252B7 + 5353B95454BB5555BC5656BE5757BF5858C15959C35A5AC45A5AC55B5BC65C5C + C75C5CC85D5DC95E5ECA5E5ECA5E5ECA6060CC7373D27C7CD47C7CD47B7BD57B + 7BD57B7BD57B7BD57A7AD56C6CD05F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC6060CD7171D39A9AE38080D96464CD6666CE6666CE8383DA9494 + E06F6FD26565CE6464CE6262CD5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCB5F5FCB + 5E5ECB5E5ECA5E5ECA5E5ECA5D5DC95C5CC86262C97E7ED47E7ED36363C85959 + C35858C16969C78383D07373C85858BD5353B95252B75151B64F4FB44F4FB302 + 00000200005454BC5555BD5656BF5757C05858C15959C35A5AC45A5AC55B5BC6 + 5C5CC75C5CC85D5DC95D5DC95E5ECA5E5ECA5E5ECA5E5ECB5F5FCB6262CC7474 + D37C7CD57C7CD57B7BD57B7BD57B7BD57B7BD57979D46464CE5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC6565CE8989DD9393E07676D46767CE + 6767CE6C6CD18888DC9090DE7171D36363CD6060CC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCB5F5FCB5E5ECB5E5ECB5E5ECA5E5ECA6161CB7C7CD58787DA + 6C6CCD5C5CC65A5AC55F5FC67E7ED28282D26464C65757BF5555BD5454BC5353 + BA5353B95252B80200000200005757C05858C15858C25959C35A5AC45A5AC55B + 5BC65C5CC75C5CC85C5CC85D5DC95E5ECA5E5ECA5E5ECA5E5ECB5E5ECB5F5FCB + 5F5FCB5F5FCC6262CD7474D37C7CD57C7CD57B7BD57B7BD57B7BD57B7BD56666 + CE5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC6060CC7373D496 + 96E18E8EDE6D6DD06767CE6767CE7272D39191DF8989DD6C6CD15F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCB5F5FCB5E5ECB6161CB7A + 7AD58C8CDC7272D15E5EC95C5CC85C5CC76868CB8E8ED97B7BD25D5DC55858C2 + 5858C15757BF5656BF5555BD5454BC0200000200005959C35A5AC45A5AC55B5B + C55B5BC65C5CC75C5CC85C5CC85D5DC95E5ECA5E5ECA5E5ECA5E5ECB5E5ECB5F + 5FCB5F5FCB5F5FCC5F5FCC5F5FCC5F5FCC7171D27C7CD57C7CD57C7CD57B7BD5 + 7B7BD57979D46464CE5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC6B6BD19595E19898E27373D46767CF6767CE6767CE7676D58B8BDD89 + 89DC7272D36060CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CB6363CC7E7ED78A8ADC7777D45E5ECA5E5ECA5D5DC95D5DC96666CB8888D981 + 81D66E6ECD5A5AC55A5AC45959C35858C25858C15757C00200000200005A5AC5 + 5A5AC65B5BC75B5BC85B5BC85C5CC95C5CC95D5DCA5D5DCA5D5DCA5D5DCA5D5D + CB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC6565CE7B7BD57C7CD57C + 7CD57B7BD57B7BD57A7AD56E6ED15E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC6464CE8686DC9797E27E7ED86C6CD16767CF6666CF6666 + CE6767CE7272D38B8BDE8A8ADE7171D36060CD5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC6161CD6C6CD28282DA8B8BDD7676D55D5DCB5D5DCB5D5DCA5D5DCA5D5D + CA5E5ECA6A6ACE8484D98B8BDA6D6DCE5B5BC65A5AC55959C55959C45858C302 + 00000200005B5BC85B5BC85C5CC95C5CC95C5CC95D5DCA5D5DCA5D5DCA5D5DCB + 5D5DCB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC7171 + D27C7CD67C7CD67C7CD57C7CD57B7BD57777D46161CD5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CE8484DB9B9BE47A7AD76464CE6666CF + 6767CF6767CF6666CF6666CE6666CE7070D28181DA8E8EDF8383DA6E6ED26363 + CE5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC6C6CD17979D78989DD8686DC7171D46060CD5E5ECB5E5ECB + 5D5DCB5D5DCB5D5DCA5D5DCA5D5DCA6565CD8B8BDB8C8CDB7070D05E5EC95B5B + C75A5AC65A5AC60200000200005C5CC95D5DCA5D5DCA5D5DCA5D5DCA5D5DCA5D + 5DCB5D5DCB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC6363CE7B7BD57C7CD67C7CD67C7CD57C7CD57C7CD56B6BD05E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CE8282DA9696E27E7ED860 + 60CD5E5ECC6262CD6767CF6767CF6666CF6666CF6666CE6565CE6767CF7272D4 + 8D8DDF8A8ADD8080D97474D56A6AD16464CE5F5FCC5E5ECC5E5ECC6060CD6161 + CD6060CD5F5FCC6666CF6E6ED27C7CD88585DB8C8CDE7D7DD86A6AD15E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECB5E5ECB5D5DCB5D5DCB5D5DCA5D5DCA6666CD8787DB + 9191DF7474D35F5FCA5B5BC85B5BC80200000200005D5DCA5D5DCA5D5DCB5D5D + CB5D5DCB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC6E6ED17D7DD67D7DD67C7CD67C7CD67C7CD67777D4 + 5F5FCC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CE8181DA9898 + E37F7FD96161CD5E5ECC5E5ECC5F5FCC6666CF6767CF6767CF6767CF6666CF66 + 66CE6262CD5F5FCC6262CE7C7CD88484DB8A8ADD8585DB7F7FD97C7CD87272D4 + 7B7BD87979D67676D57373D48181DA8585DB8484DB8989DD7B7BD86F6FD36161 + CD5E5ECC5E5ECC5F5FCC6060CD5F5FCC5E5ECC5E5ECC5E5ECB5E5ECB5E5ECB5D + 5DCB5D5DCB6767CE8787DB8E8EDE7676D46161CC5D5DCA0200000200005E5ECB + 5E5ECB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5F5FCC7777D47E7ED67D7DD67D7DD67C + 7CD67C7CD66B6BD05E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6363CE + 8282DA9595E28282DA6464CE5E5ECC5E5ECC5E5ECC5E5ECC6262CD6767CF6767 + CF6868D07373D47070D26464CE5F5FCC5E5ECC6161CD6868D07171D47B7BD781 + 81DA8282DA8888DC8282DA8282DA8282DA8989DD7F7FD97979D67676D66969D0 + 5E5ECC5E5ECC5E5ECC5E5ECC6060CD7878D67676D66868D05E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECB5E5ECB5E5ECB6969CF8282D99292E07171D35F5FCC02 + 00000200005E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6666CF7C7CD57E7E + D67E7ED67D7DD67D7DD67979D56262CD5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5F5FCC6161CD6363CE6363CE6161CD5F5F + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC7676D59999E38282DA6464CE5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5F5FCC6767CF6767CF7B7BD79696E29595E17A7AD66868D05E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC6060CD6565CF6565CF6868D06969D06969D16161CD6161CD64 + 64CE6060CD5E5ECC5E5ECC5F5FCC6262CD6F6FD38585DB9494E19898E38282DA + 6060CD5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CF9393 + E08484DA6363CD0200000200005E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC63 + 63CE6D6DD17272D27171D27171D27171D27171D27171D27171D27171D27070D2 + 7676D47E7ED67E7ED67E7ED67D7DD67D7DD67272D25F5FCC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6262CD6969CF7070D27373D37373D3 + 7373D37272D26E6ED16767CF6161CD5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC6262CE8A8ADE9393E16C6CD25E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC6666CE7D7DD89797E29898E29898E29C9CE48E8EDE + 7A7AD66868CF6262CD6262CD6262CD6161CD6161CD6161CD6161CD6060CD5F5F + CC5E5ECC5E5ECC5E5ECC5E5ECC5F5FCC6666CF7070D38181DA9292E09595E281 + 81DA8383DB9393E18181DA6464CE5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5F5FCC7272D49090E08181DA5E5ECC0200000200005D5DCC5D5DCC5D5DCC5D5D + CC5D5DCC6868D07A7AD57D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D + 7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67C7CD66969D05D5DCC + 5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5D + CC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6767CF7373D37575D475 + 75D37474D37474D37373D37373D37272D37272D36F6FD26565CF5D5DCC5D5DCC + 5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6262CE7F7FD99999E47B7BD86161 + CE5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5E5ECC7070D39D9DE49595E17575D574 + 74D58888DC9696E29C9CE49191E18787DC7A7AD77070D36767D06363CE6363CE + 6262CE6161CD6161CD5E5ECC5D5DCC6363CE6E6ED37A7AD78585DC9292E19494 + E18585DC7171D46161CD6060CD7676D69494E28888DD6464CF5D5DCC5D5DCC5D + 5DCC5D5DCC5D5DCC7171D48F8FE08C8CDF6C6CD25D5DCC0200000200005D5DCC + 5D5DCC5D5DCC5D5DCC6464CE7C7CD67D7DD67D7DD67D7DD67D7DD67D7DD67D7D + D67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67A + 7AD56363CE5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC + 5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6A6AD07676 + D47676D47575D47575D37575D37474D37474D37373D37373D37373D37272D371 + 71D26868CF5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6868D1 + 8B8BDE9696E27B7BD86565CF5D5DCC5D5DCC5D5DCC5E5ECC7070D49292E09696 + E17878D66767CF6767CF6767CF7272D48080D99090E09595E19595E19494E07F + 7FD96666CF6363CE6363CE6262CE6161CD6161CD5E5ECC7D7DD98E8EDF9191E1 + 8E8EDF8181DA7070D46464CF5D5DCC5D5DCC5D5DCC5F5FCD7A7AD79494E28787 + DD6868D05D5DCC5D5DCC5D5DCC7171D48F8FE09191E17272D45D5DCC5D5DCC02 + 00000200005D5DCB5D5DCB5D5DCB5D5DCB7171D27D7DD57D7DD57D7DD57D7DD5 + 7D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7D + D57D7DD57D7DD57777D35E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 6868CE7777D37676D37676D37676D37575D37272D26F6FD16E6ED17171D17373 + D27373D27272D27272D27171D26565CE5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5E5ECB6B6BD18A8ADE9898E37B7BD76060CC5D5DCB5D5DCB6F6FD3 + 8F8FDF9191E07373D36969CE6868CE6767CE6767CE6767CE6767CE6D6DD07676 + D58080D99B9BE39595E16C6CD16363CD6363CD6363CD6262CD6161CC6161CC87 + 87DC9696E37575D56363CD6262CD5E5ECC5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 6363CD7777D69393E18B8BDE6767CF5E5ECB6F6FD29090E09191E07373D45D5D + CB5D5DCB5D5DCB0200000200005D5DCB5D5DCB5D5DCB5D5DCB7A7AD47D7DD57D + 7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD5 + 7D7DD57D7DD57D7DD57D7DD57D7DD56F6FD15D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB6161CC7575D37777D37777D37676D37474D26868CF6161CC5D5DCB + 5D5DCB6161CC6868CE7171D17373D27272D27272D26F6FD16060CC5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6969D08B8BDE9999E47C7CD863 + 63CD7272D48F8FE08E8EDF6F6FD26464CD6868CF6868CE6868CE6767CE6767CE + 6767CE6666CE6565CE6767CF8888DC9696E16E6ED16363CD6363CD6363CD6363 + CD6262CD6868CF8888DC8D8DDF5E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB6060CC7979D69393E18686DC7B7BD78F8FDF9292E1 + 7272D45E5ECC5D5DCB5D5DCB5D5DCB0200000200005D5DCB5D5DCB5D5DCB5D5D + CB7B7BD57D7DD57D7DD57D7DD57D7DD57D7DD57C7CD57C7CD57C7CD57C7CD57C + 7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57272D26060CC5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB6A6ACF7878D47878D47777D37474D26464CD5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6363CD7171D27373D27272D27272D2 + 6767CE5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6666 + CF8787DC9999E48C8CDE9393E19090E06E6ED25D5DCB5E5ECB6565CD6868CE68 + 68CE6767CE6767CE6767CE6666CE6666CE6969D08686DB9494E17070D26464CD + 6363CD6363CD6363CD6262CD6969CF8787DC8989DD6161CD5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6262CD7474D58C8CDE98 + 98E38C8CDE7373D45D5DCB5D5DCB5D5DCB5D5DCB5D5DCB0200000200005D5DCB + 5D5DCB5D5DCB5D5DCB7B7BD57D7DD57D7DD57D7DD57D7DD57878D46565CE6565 + CD6565CD6565CD6565CD6565CD6565CD6565CD6565CD6565CE6262CD5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5E5ECB7373D27878D47878D47777 + D36969CF5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6868CE73 + 73D27373D27272D26E6ED05E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB6565CE7E7ED99090E08989DD6F6FD25D5DCB5D5DCB5D5D + CB5D5DCB5F5FCC6060CC6060CC6060CC6060CC6060CC5F5FCC6262CD8686DB8F + 8FDF6C6CD16363CD6464CD6363CD6363CD6363CD6565CE8787DC8C8CDE6464CE + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5E5ECB6B6BD17272D46D6DD15E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB02 + 00000200005D5DCB5D5DCB5D5DCB5D5DCB7B7BD57D7DD57D7DD57D7DD57D7DD5 + 7676D35D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6161CC7878D4 + 7878D47878D47575D36161CC5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB6161CC7171D17373D27373D27171D26060CC5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6363CD6868CF6666CF5E5ECB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB8686DC8E8EDF6A6AD06363CD6565CD6464CD6363CD6363CD6363CD86 + 86DC8D8DDF6767CF5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5E5ECC5E5ECB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB0200000200005C5CCB5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D + 7DD57D7DD57D7DD57575D35D5DCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB6363CD7777D47878D47777D47171D25C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6D6DD17272D27272D27171D26161CD5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB8181DA8F8FE06868D06262CD6464CD6464CD6363 + CD6262CD6464CE8787DD8B8BDE6666CF5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005C5CCB5C5CCB5C5CCB5C5C + CB7B7BD57D7DD57D7DD57D7DD57D7DD57575D35D5DCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB6363CD7878D47979D47878D47171D25C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6E6ED17373D27272D2 + 7272D26161CD5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5F5FCC7D7DD99191E16969D06262CD + 6464CE6464CD6363CD6363CD6262CD8888DD8B8BDE6565CF5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005C5CCB + 5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D7DD57D7DD57D7DD57575D35C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6060CC7878D47979D47979D47575 + D36060CC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6060CC71 + 71D27474D37373D27272D25F5FCC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6161CD8181DA8E + 8EDF6868D06363CD6464CE6464CE6464CD6363CD6464CE7F7FDA9090E06363CE + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB02 + 00000200005C5CCB5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D7DD57D7DD57D7DD5 + 7777D46464CE6464CD6464CD6464CD6464CD6464CD6464CD6464CD6464CD6464 + CE6161CD5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5D5DCB7474D3 + 7979D47979D47878D46969CF5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB6868CF7474D37474D37474D36F6FD15D5DCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5E5ECC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC6161CD8181DA9797E27474D56969D07171D36E6ED16F6FD16C6CD17373D489 + 89DE9090E06363CE5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB0200000200005C5CCB5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D + 7DD57D7DD57D7DD57D7DD57B7BD57B7BD57B7BD57B7BD57B7BD57B7BD57B7BD5 + 7B7BD57B7BD57B7BD57B7BD57171D25F5FCC5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB6A6ACF7979D47979D47979D47676D36464CD5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB6363CD7272D27575D37474D37474D36767CE5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5D5DCB6666CE6A6ACF6A6ACF6969CF6969CF + 6868CF6868CF6868CF6767CE7A7AD69696E29999E49595E19090DF9191E09191 + E09797E39898E39393E17C7CD85E5ECC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005C5CCB5C5CCB5C5CCB5C5C + CB7979D47D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D + 7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD56F6FD15C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB6060CC7777D47979D47979D47979D47676D369 + 69CF6060CC5C5CCB5C5CCB6060CC6868CF7474D37676D37575D37575D37272D2 + 6060CC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6565CE6B6BD06B6BD06B + 6BD06A6ACF6969CF6969CF6969CF6868CF6868CF6A6AD07B7BD78989DC8B8BDD + 8C8CDE8F8FDF8E8EDF8282DA8787DD7878D66363CE5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005B5BCB + 5B5BCB5B5BCB5B5BCB7070D27C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7C + D57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD575 + 75D35C5CCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB + 5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB6767CF7979D47979 + D47979D47878D47777D47474D37070D27070D27373D37676D47575D37575D375 + 75D37474D36565CE5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB + 5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5C5CCB6969 + CF6B6BD06A6AD06A6AD06A6AD06969CF6969CF6969CF6868CF6767CF6767CF68 + 68CF6B6BD06A6AD06D6DD16666CE6464CE6969D06565CF5D5DCC5B5BCB5B5BCB + 5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5B + CB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB02 + 00000200005B5BCA5B5BCA5B5BCA5B5BCA6262CC7B7BD47C7CD57C7CD57C7CD5 + 7C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7C + D57C7CD57C7CD57979D46161CC5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA6B6BCF7979D47979D47878D37878D37777D37777D37777D37777D37676 + D37676D37575D37575D26969CE5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5E5ECB6A6ACF6C6CCF6B6BCF6A6ACF6A6ACF6A6ACF6969CF6969CE6969 + CE6868CE6767CE6767CE6767CE6666CE6666CE6565CD6565CD6464CD5D5DCB5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA0200000200005B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6767CE79 + 79D47C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD5 + 7C7CD57C7CD57C7CD57C7CD57C7CD57B7BD46767CE5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA6767CE7575D37979D47878D37878D37777D3 + 7777D37777D37777D37676D37373D26666CE5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA6161CC6C6CCF6C6CCF6C6CCF6B6BCF6A6ACF6A6ACF + 6A6ACF6969CF6969CE6969CE6868CE6767CE6767CE6767CE6666CE6565CD6464 + CD5F5FCB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA0200000200005B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA6060CC6A6ACF6F6FD06E6ED06E6ED06E6ED06E6ED06E6ED06E + 6ED06E6ED06E6ED07373D27C7CD57C7CD57C7CD57C7CD57C7CD57070D15C5CCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6060CB6969CE73 + 73D27777D37777D37777D37676D37272D16868CE6060CB5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6767CE6D6DD06C6CD06C6CCF6C + 6CCF6B6BCF6767CE6363CD6464CD6363CD6363CD6363CC6363CC6262CC6262CC + 6262CC6060CC5D5DCB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA0200000200005B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6464CD7A7AD47C7CD57C7CD57C7CD57C + 7CD57878D36060CB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5C5CCA5F5FCB6262CC6262CC5F5FCB5C5CCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5E5ECB6C6CCF6D6D + D06D6DD06C6CD06C6CCF6A6ACF6060CB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA02 + 00000200005B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5C5CCA7575D27C7C + D57C7CD57C7CD57C7CD57C7CD56969CF5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 6363CD6E6ED06E6ED06D6DD06D6DD06C6CD06969CE5C5CCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA0200000200005A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA6B6BD07B7BD57B7BD57B7BD57B7BD57B7BD57575D35B5BCA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5B5BCA6B6BCF6D6DD06D6DD06D6DD06C6CD06C6CD06363CD5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA0200000200005A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5F5FCC7979D47B7BD57B7BD57B7BD57B7BD57B7BD5 + 6868CF5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA6363CD6F6FD16E6ED06E6ED06D6DD06D6DD06B + 6BD05D5DCB5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA0200000200005A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA6F6FD17B7BD57B7BD57B + 7BD57B7BD57B7BD57676D35D5DCB5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5D5DCB6C6CD06F6FD16F6FD16E6E + D06D6DD06D6DD06666CE5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA02 + 00000200005A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA6262 + CD7A7AD47B7BD57B7BD57B7BD57B7BD57B7BD56C6CD05A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5AC95959C85959C85959C75959C76565CC7070D0 + 6F6FD06F6FD16F6FD16E6ED06D6DD05F5FCC5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA0200000200005A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA6E6ED07B7BD57B7BD57B7BD57B7BD57B7BD57979D46060 + CC5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95A5AC95A5ACA5A5ACA + 5A5ACA5A5ACA5A5AC95A5AC95A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95959C75858C55757C45656C25A + 5AC36C6CCB6E6ECD6F6FCF6F6FD06F6FD16F6FD16666CE5A5AC95A5AC95A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5AC95A5AC95A5AC95A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95A5AC95A5AC95A5AC9 + 5A5AC95A5AC95A5AC95A5ACA5A5ACA0200000200005A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5D5DCB7171D17B7BD57B7BD57B7BD57B7BD5 + 7B7BD57B7BD56363CD5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95A5AC95959C85959C75858C55858C458 + 58C45858C55858C55858C55858C45858C45858C45858C55959C75959C75959C8 + 5959C85959C85959C85959C75959C75959C75959C85959C75858C45656C25555 + BF5353BB5252B95858BA6969C16A6AC56C6CC96D6DCC6D6DCE6D6DCE6666CB59 + 59C55858C45858C55858C65959C75959C85959C85959C85959C85959C85959C8 + 5959C85959C85959C75959C75858C55858C45858C45858C45858C45858C65959 + C75959C75959C75959C85959C85959C75959C75959C75959C75858C55858C458 + 58C45757C45757C35757C35757C45858C45858C55959C70200000200005959CA + 5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959 + CA5959CA5959CA5959CA5959CA5959CA5959CA5C5CCB7070D17A7AD57A7AD57A + 7AD57A7AD57A7AD57A7AD57878D45F5FCC5959CA5959CA5959CA5959CA5959CA + 5959CA5959CA5959CA5959CA5959CA5959CA5959C95858C85757C65656C25454 + C05353BD5353BD5353BD5353BD5353BD5353BD5353BC5353BC5353BD5353BD54 + 54BF5555C05656C25555C15555C15656C25555C15555C15555C15656C25555C1 + 5353BD5252BA5050B54D4DB04B4BAB5050AC6161B56464BA6666BF6969C56969 + C66868C66868C56060C15454BD5353BD5454BE5555C05656C25656C25656C256 + 56C25656C25656C25555C15555C15555C05454BF5353BD5353BD5353BC5353BC + 5353BD5454BF5454C05555C05555C05656C25656C25555C15555C15555C15454 + C05454BE5353BD5353BD5252BB5252BB5252BB5353BC5353BD5454BF5555C102 + 00000200005959C95959C95959C95959C95959C95959C95959C95959C95959C9 + 5959C95959C95959C95959C95959C95959C95959C95959C95B5BCA7070D17A7A + D47A7AD47A7AD47A7AD47A7AD47A7AD47A7AD46969CE5959C95959C95959C959 + 59C95959C95959C95959C95959C95959C95959C95959C95959C95858C75757C3 + 5555C05252BA5050B54F4FB34F4FB24F4FB14F4FB24F4FB34E4EB14E4EB04D4D + AF4E4EB14E4EB14F4FB35151B65151B85151B75151B75151B85151B85151B751 + 51B75151B85151B74F4FB34D4DAE4B4BA94848A245459B45459B5050A35C5CAB + 6060B36363B86565BC6363BA6161B86161B75A5AB54F4FB14F4FB35050B55151 + B85252B85151B85151B85252B85151B85151B75151B75151B64F4FB34E4EB14E + 4EB14E4EB14E4EB14F4FB25050B55151B65151B65151B65151B85151B85151B8 + 5151B85151B85050B54F4FB34F4FB24F4FB14E4EB14E4EB14E4EB04E4EB04E4E + B14F4FB35151B80200000200005959C95959C95959C95959C95959C95959C959 + 59C95959C95959C95959C95959C95959C95959C95959C95959C95959C95C5CCA + 7070D17A7AD47A7AD47A7AD47A7AD47A7AD47A7AD47A7AD46969CE5959C95959 + C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959C959 + 59C85757C55555C05252B94F4FB14B4BAA4A4AA84A4AA64949A64A4AA74A4AA7 + 4949A44848A24848A24848A24848A24949A64B4BA94C4CAB4B4BA94B4BAA4C4C + AC4C4CAC4B4BA94C4CAB4C4CAD4C4CAB4A4AA64848A246469E4242953E3E8D3E + 3E8D4141924C4C9A5757A35B5BAA5E5EAE5D5DAC5A5AA95959A85959A85454A7 + 4B4BA64B4BA94C4CAD4D4DAD4C4CAC4C4CAD4D4DAD4C4CAC4B4BA94B4BA94A4A + A84848A34747A04747A04747A04747A14848A34A4AA84B4BAA4B4BA94B4BA94C + 4CAC4C4CAC4C4CAB4C4CAB4C4CAC4B4BA94A4AA64949A54949A54949A44848A2 + 4747A14747A14848A24949A64D4DAD0200000200005959C95959C95959C95959 + C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959C959 + 59C95C5CCA7070D17A7AD47A7AD47A7AD47A7AD47A7AD47A7AD47A7AD46969CE + 5959C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959 + C95959C95959C95858C75656C25252BA4F4FB14A4AA646469E45459B44449A44 + 449944449A44449A42429540409141419241419241419242429444449A45459B + 44449A44449A46469E45459D44449A45459B46469E45459C4343974242944141 + 923D3D8A3939813939813B3B853C3C8846468F52529954549D53539A51519751 + 51975050985151994D4D9945459A46469E46469E45459D46469E46469E45459C + 4444994444994343974040913E3E8D3F3F8F40408F4040904141934444994545 + 9B44449944449A45459D45459D45459B45459B45459D44449A43439743439743 + 43984343974242944141924141924141934343984848A20200000200005959C9 + 5959C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959 + C95959C95959C95C5CCA7070D17A7AD47A7AD47A7AD47A7AD47A7AD47A7AD47A + 7AD46969CE5959C95959C95959C95959C95959C95959C95959C95F5FCB6161CC + 5F5FCB5959C95959C95959C95959C95858C75454BF5050B54B4BAA46469E4242 + 9441419240409140408F4040914040903D3D8A3B3B853B3B853B3B863B3B853C + 3C883E3E8C3E3E8D3D3D8B3E3E8C3F3F8F3E3E8D3D3D8B3E3E8C40408F42428F + 4D4D926D6DA45D5D9A3A3A8236367A35357937377D37377D38387F4242874D4D + 8F4B4B8C4949884A4A8A4B4B8C4A4A8C4B4B8D4848914141924040913F3F8F40 + 408F4040913E3E8D3D3D8A3D3D8B3C3C883A3A8238387F3939813A3A843B3B84 + 3C3C883E3E8D40408F3E3E8C3E3E8C40408F3F3F8F3E3E8C3F3F8E40408F3E3E + 8D3D3D8B3E3E8C3F3F8F3E3E8D3D3D8B3C3C883C3C883C3C883F3F8E44449A02 + 00000200005959C95959C95959C95959C95959C95959C95959C95959C95959C9 + 5959C95959C95959C95959C95B5BCA7070D07A7AD47A7AD47A7AD47A7AD47A7A + D47A7AD47A7AD46969CE5959C95959C95959C95959C95959C95959C95959C969 + 69CE7878D37A7AD47878D36B6BCF5D5DCA5959C95959C95858C65454BE4F4FB3 + 4A4AA743439840408F3F3F8E3E3E8D3E3E8C3E3E8D3E3E8C3B3B8438387F3939 + 8039398038387F3939803B3B853B3B853939813939813B3B843A3A8338387F3B + 3B824646894C4C8A7777A3E8E8E8B7B7C939398035357835357736367A363679 + 35357837377D41418447478445458147478347478647478647478749498B4747 + 8E3D3D883B3B853B3B863C3C883A3A843939803A3A8239398036367934347636 + 367937377D37377D3939803C3C873C3C883A3A833A3A823B3B863B3B853A3A82 + 3A3A843C3C873A3A843A3A823B3B843C3C883C3C873A3A843939813939803939 + 813C3C884242950200000200005959C95959C95959C95959C95959C95959C959 + 59C95959C95959C95959C95959C95959C95959C96868CE7A7AD47A7AD47A7AD4 + 7A7AD47A7AD47A7AD47A7AD46969CE5959C95959C95959C95959C95959C95959 + C95959C96969CE7A7AD47A7AD47A7AD47A7AD47A7AD47575D26767CE5A5AC958 + 58C65454BD4F4FB35F5FAF6F6FAD6161A13E3E8D3E3E8D3E3E8C4949936A6AA3 + 67679D38387F38387F39398037377D38387F3A3A843A3A8438387F38387E3939 + 8138387E3E3E7D4747814C4C884C4C877777A2EBEBEBBBBBCC57579164649736 + 367A37377D36367A35357837377C5B5B946A6A9A5A5A8D464683484885474785 + 47478649498B4B4B8D4242893A3A823A3A833A3A8439398037377D3939805959 + 9262629362629135357735357936367A37377D3A3A843B3B8439398038387F3A + 3A8239398138387E39398068689D66669A4E4E8B39398051519167679C66669A + 38387E38387E3939803C3C884343970200000200005858C95858C95858C95858 + C95858C95858C95858C95858C95858C95858C95858C95858C95959C97070D179 + 79D47979D47979D47979D47979D47878D36868CE5858C95858C95858C95858C9 + 5858C95858C95858C96868CE7979D47979D47979D47979D47979D47979D47979 + D47979D47474D26464CB6363C5C5C5E0ECECECECECECEAEAEAB0B0CC3F3F8F83 + 83B4E6E6E6E3E3E3E3E3E3D7D7DC5B5B963A3A8466669DE3E3E3B4B4C93B3B88 + 66669DE2E2E2B6B6C848488573739DE9E9E9C0C0D04D4D8A7A7AA7F1F1F1E9E9 + E9E6E6E6E3E3E3C7C7D1505090393981434385C1C1CFE3E3E3E3E3E3E3E3E3A3 + A3BC4A4A8B4A4A8A9292B5E4E4E49393B848488E8A8AB2E3E3E38989B1393983 + 5B5B95CBCBD5E0E0E0E2E2E2E2E2E2E0E0E05A5A9366669BE4E4E4B5B5CA3C3C + 8967679EE3E3E3B5B5C9393983383880C4C4D3E7E7E7E9E9E9BCBCCEAFAFC7E9 + E9E9E6E6E6E4E4E4D6D6DB7D7DA93B3B883F3F8F44449C0200000200005858C9 + 5858C95858C95858C95858C95858C95858C95858C95858C95858C95858C95858 + C95959C97474D27979D47979D47979D47979D47979D46C6CD05858C95858C958 + 58C95858C95858C95858C95858C96868CE7979D37979D37979D37979D37979D3 + 7979D47979D47979D47979D47979D47878D2C6C6EAF8F8F8C0C0DE7979BA8A8A + BEB8B8D46666AAF6F6F6E5E5EB7B7BB49191BDECECECDDDDE23E3E8F6C6CA7E9 + E9E9BBBBD14949957676A8E7E7E7BDBDCE50508D7878A5EEEEEEC6C6D7525293 + 8080B1FBFBFBD5D5E38080B2B1B1CBE9E9E9ADADC83D3D8CB2B2CCECECECA7A7 + C76C6CA8CACADAE9E9E99696BB5050959999BFEAEAEA9999C04F4F999090BAE9 + E9E98E8EB83D3D8CD7D7E1EAEAEA8F8FBB6C6CA66B6BA59999BE60609F6D6DA7 + ECECECBBBBD14141946C6CA7E9E9E9BABACF3D3D8C6B6BA4ECECECD5D5DF4646 + 8C5252929090B860609E3D3D8C4A4A93E6E6E6D8D8DD4040924343984747A302 + 00000200005858C95858C95858C95858C95858C95858C95858C95858C95858C8 + 5858C85757C75757C65757C47070CD7676CF7676CF7777D07777D07777D07171 + CD5D5DC65656C45656C45656C55757C65757C66666CB7676CF7676CE7676CE76 + 76CE7676CE7676CE7676CE7676CE7777D07777D17878D27878D2FFFFFFFFFFFF + 7777C36464B45D5DAA5555A49D9DCBFFFFFFA7A7D14646A045459ED4D4E5F4F4 + F47474B27E7EB5F6F6F6C9C9DD5E5EA58484B7F2F2F2C6C6D857579A8080B1F7 + F7F7CDCDDF58589E8585BAFFFFFFD4D4E75C5CA56464A7F7F7F7F2F2F2424297 + FAFAFAF8F8F85151A344449B8282B9F5F5F5C9C9DC55559FA2A2CBF5F5F5A1A1 + CC5656A89999C8F5F5F59797C77575B5FBFBFBDEDEEA7575B77474B57373B472 + 72B25050A27474B5F7F7F7C4C4DD4747A27474B5F2F2F2C2C2DA44449B7272B2 + F2F2F2C2C2D83F3F913E3E8E3F3F8F8A8ABCBABAD6DCDCE7EFEFEFDFDFE54646 + 9F4848A54C4CAD0200000200005858C95858C95858C95858C95858C95858C958 + 58C95858C85757C75656C55555C35454BF5252BC6262C17171C67171C77171C7 + 7272C87272C87171C76D6DC45A5ABF5252BC5353BE5454BF6363C47373C97272 + C87171C77070C57070C57070C47070C47070C57171C77272C87373CA7575CD76 + 76CFFFFFFFFFFFFF6F6FC36A6AB96565B06262ABA6A6D0FFFFFF9D9DCE4848A6 + 4848A4CECEE6FFFFFF8585BE8A8AC0FFFFFFD5D5E96363AE8A8AC0FEFEFECFCF + E35B5BA28787BAFFFFFFD4D4E75D5DA58888BEFFFFFFD4D4E95F5FAA5E5EA9FF + FFFFFFFFFF5050A2FFFFFFFFFFFF4848A44C4CA58585BEFFFFFFD3D3E75A5AA7 + A8A8D2FFFFFFAAAAD75757B2A0A0D3FFFFFF9F9FD37B7BC2FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFDFDFD7B7BC27B7BC2FFFFFFCFCFE94D4DB17C7CC3FEFEFECC + CCE64B4BAB7A7AC0FBFBFBC9C9E246469F44449C9C9CCBFFFFFFFFFFFFFFFFFF + C0C0E06D6DBA4C4CAE4E4EB25050B80200000200005858C95858C95858C95858 + C95858C95858C95858C95858C85656C55555C15252BC5050B64E4EB25252B167 + 67B96A6ABA6B6BBB6C6CBD6B6BBC6A6ABA6A6AB96767B85454B34E4EB35E5EBA + 6E6EC06D6DBF6C6CBD6B6BBB6A6ABA6A6AB96969B86161B55E5EB46A6ABA6C6C + BD6E6EC17272C87474CBDADAF1FFFFFFB2B2DF6A6AB97979BAABABD29595C5FF + FFFFE6E6F35454AC6D6DB8FFFFFFFFFFFF6B6BB08C8CC1FFFFFFE0E0EF6E6EB4 + ABABD2FFFFFFDFDFEE6868ABA9A9CFFFFFFFD4D4E85555A48484BEFFFFFFDFDF + EE6B6BB28A8AC2FFFFFFE9E9F35C5CA7DCDCEDFFFFFFA0A0D05B5BAAC9C9E2FF + FFFFB2B2D55B5BA8A8A8D3FFFFFFC0C0E35353B8C5C5E7FFFFFFA2A2D95D5DBD + F3F3FAE8E8F65252BC5252BCDCDCF1FFFFFF6868C37F7FCCFFFFFFDCDCF25E5E + C0A2A2DAFFFFFFD1D1EC5050B87F7FC9FFFFFFD0D0EA4C4CAE4B4BACCFCFE9FF + FFFF9595D14F4FB55050B87E7ECB5151BA5252BC5454BF0200000200005858C9 + 5858C95858C95858C95858C95858C95858C95757C65555C15252BC4F4FB44B4B + AB4848A54747A24E4EA55E5EAA6262AC6464AF6262AC6060A96060A96161AA5E + 5EAA5959AA6666B26666B46666B36565B06363AE6262AC6262AB5959A647479E + 45459E4D4DA25959A96565B36D6DBE7070C58D8DD2F6F6FBFFFFFFFFFFFFFFFF + FFD4D4E65C5CA1B7B7D7FFFFFFFFFFFFFFFFFFFFFFFF9494C76060A88A8AC0FF + FFFFF5F5F9FFFFFFFFFFFFFFFFFFD4D4E7FFFFFFFFFFFFFFFFFF9E9ECB434399 + 7676B5FFFFFFF4F4F9FFFFFFFFFFFFFFFFFFA7A7CD5959A17A7AB4F3F3F9FFFF + FFFFFFFFFFFFFFDEDEEC6363A75858A2A7A7D0FFFFFFF4F4FAFFFFFFFFFFFFFF + FFFF7777CE5555C29A9ADBFFFFFFE8E8F7DDDDF3FFFFFFBBBBE75555C38282D3 + FFFFFFF4F4FBFFFFFFFFFFFFFFFFFFA4A4DE5555C1FFFFFFFFFFFFFFFFFFFFFF + FFD1D1EC8B8BD0FFFFFFF4F4FBD1D1EEF4F4FBD2D2EE5555C15555C35656C302 + 00000200005757C85757C85757C85757C85757C85757C85757C75555C35252BC + 4E4EB44949A944449D4040943F3F913F3F9145459256569A5B5B9E59599C5656 + 9756569656569757579759599B5C5CA15D5DA35D5DA35C5CA15C5CA05B5B9E52 + 52994141913D3D8C3D3D8C3E3E8F3F3F9147479D5959AE6565BB6D6DC07979C5 + A6A6D6ACACD3A8A8CC6D6DA554549543438E7E7EB49999C59A9AC76666A94747 + 975B5BA16767A78787B97D7DB47272AEA6A6CB9B9BC455559D6666A79C9CC88D + 8DC03F3F913D3D8C4A4A947272AC7171A96C6CA6A5A5CA9A9AC3535396535395 + 5252956969A3A4A4C8A4A4CA9898C15D5D9D5151965252986A6AAA7C7CBE6565 + BB7F7FCDA4A4DE8383D55757C75757C75757C76D6DCEA5A5E1A5A5E18F8FDA57 + 57C75757C76262CB8484D67979D26D6DCEA5A5E19A9ADD5757C75757C7A5A5E1 + FFFFFFDDDDF38282D37676CD5454C26C6CCBA4A4E0A5A5E0A5A5E16D6DCE5757 + C75757C75757C70200000200005757C85757C85757C85757C85757C85757C857 + 57C75454C25151B94C4CAE4646A23F3F923B3B883A3A85393984393983414189 + 52529352528F4F4F8A4F4F894F4F8A4F4F8951518D5454935656975656975555 + 955555954E4E923F3F8C3B3B873939823838813838813A3A853F3F914747A24C + 4CAD5656B66464BA6868B65F5FA656569651518D4E4E8A3D3D823838813B3B88 + 3C3C8A3C3C8942428E5656985757985757975858995656974E4E9043438E3F3F + 8F3E3E8F3E3E8E3D3D8D3B3B873838813838813939823B3B844A4A8C52529351 + 51914E4E8D4D4D8B4D4D8B4D4D8B4E4E8E5050924E4E8F4C4C8B4C4C8D4B4B8F + 43439145459E4B4BAD5050B85454C15656C65757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C857 + 57C85757C88484D7FFFFFFD2D2F05656C65656C65656C65757C75757C75757C7 + 5757C85757C85757C85757C85757C80200000200005757C85757C85757C85757 + C85757C85757C85757C75454C14F4FB74A4AAB44449D3D3D8C38388137377E36 + 367C36367B3838804040874C4C884B4B834A4A824A4A824A4A804B4B834F4F8A + 51518D51518D51518D4B4B8C3C3C883A3A8639398236367C35357A35357A3737 + 7D3C3C8A45459E4A4AAB4D4DB15E5EB76767B45D5DA35353914D4D8649498139 + 397934347837377F393983393982404088545494555594555594555594545492 + 47478A3B3B883C3C8B3C3C8B3C3C8A3B3B8838388135357935357935357A3636 + 7C39398148488A4D4D8A4A4A854949844949834949834A4A864C4C8B4A4A8648 + 48844646833D3D833C3C8A4343994A4AA94F4FB75454C05656C65757C85757C8 + 5757C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C857 + 57C85757C85757C85757C85757C85757C85757C85757C80200000200005757C8 + 5757C85757C85757C85757C85757C85757C75454C04F4FB77474BC5959A63C3C + 8B37377F36367B3535793434774D4D8B65659C3E3E834848824A4A814A4A8048 + 487E49497F56568C7777A27777A152528C3B3B845B5B975B5B9839398336367D + 35357A35357936367C3C3C8944449D4A4AAB4D4DB27575C18D8DC65E5EA45454 + 924C4C8548488038387734347737377E5E5E986A6AA057579553539355559454 + 549360609A8080AD7676A73B3B883C3C8B3C3C8A3C3C8A5E5E9C67679B656596 + 33337634347735357950508D6B6BA07272A14848814848824949834848826C6C + 9C7777A56B6B9B4545813B3B7F3939823C3C8A43439B4A4AAB5050B85454C156 + 56C65757C85757C85757C85757C85757C85757C85757C85757C85757C85757C8 + 5757C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C802 + 00000200005757C85757C85757C85757C85757C85757C85757C75454C2B2B2DC + ECECECE6E6E6B8B8CDE2E2E2B3B3C635357A70709EE7E7E7E3E3E3CCCCD6CBCB + D4DDDDDD7575A04C4C85616192DFDFE3EAEAEAECECEC8D8DB39999BCE8E8E8E3 + E3E3B4B4C9DDDDDDDBDBDB3838813939833E3E8F4646A14B4BAD8989CDFAFAFA + F2F2F2DADAE3D5D5DDE3E3E37575A13C3C7F5B5B94D4D4DEEFEFEFF1F1F1EFEF + EF9D9DC0565697A8A8C6EFEFEFF1F1F1F2F2F2E6E6EB3E3E8E6262A2D5D5DFE8 + E8E8E7E7E7E7E7E7E8E8E85B5B95B2B2CAEFEFEFECECECECECECDEDEE28B8BB0 + 4E4E8BE4E4E8EEEEEEECECECEAEAEAD0D0D95C5C983C3C893F3F914646A04C4C + AF5151BA5454C25757C75757C85757C85757C85757C85757C85757C85757C857 + 57C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C8 + 5757C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757 + C85757C85757C80200000200005757C85757C85757C85757C85757C85757C857 + 57C78282D3FDFDFDDFDFEC8080BE9D9DC5EAEAEABABACE383880C0C0D3F1F1F1 + 7878AC4A4A95D2D2DDE5E5E57373A74F4F909999BBEFEFEFB7B7CF3C3C885353 + 95F6F6F6F2F2F24B4B976161A3E5E5E5E0E0E03D3D8C3E3E9043439A4949A94E + 4EB4D1D1ECFFFFFF9B9BD16F6FB6D9D9E2E7E7E77B7BAB42428DD6D6E1EDEDED + 9393BF7070AD9797C2A1A1C69999C1F4F4F4D3D3E18E8EBA8686B6D0D0E14141 + 96DEDEE9F1F1F19191BE6D6DA96B6BA59999BE6161A09292BC6262A34040934B + 4B97EDEDEDE0E0E54E4E94A6A6C76666A44C4C997A7AB0E6E6E6ADADC9404093 + 43439A4848A64E4EB35252BC5555C35757C75757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C857 + 57C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C8 + 5757C85757C85757C85757C85757C80200000200005656C85656C85656C85656 + C85656C85656C85656C8A4A4E0FFFFFFA1A1D94C4CB07575BAF3F3F3C1C1D63C + 3C8CBCBCD7FBFBFB9696C44E4EA1C5C5DDEFEFEF7171B343439B9595C4F4F4F4 + 9595C33F3F933E3E91F2F2F8FEFEFE8080BB44449EEFEFEFE6E6E643439C4444 + 9F4747A64D4DB25050BAC5C5E9FFFFFFB3B3E07474BFD0D0E4F2F2F28484B977 + 77B5F7F7F7D2D2E44646A44646A24C4CA46060ABD4D4E8FCFCFC9494C66262AC + 5555A64545A17676BBFFFFFFE3E3EF7575B97373B57272B27070B24F4FA14343 + 9B8C8CC2BBBBDADFDFEBF6F6F6E9E9EF45459E5151A49999CAC6C6DFE6E6EDEE + EEEEB3B3D14545A14747A64C4CB05050B95353C05555C55656C75656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C80200000200005656C8 + 5656C85656C85656C85656C85656C85656C8A4A4E1FFFFFFA3A3DD5050B97C7C + C5FBFBFBC8C8E04242995A5AA5CDCDE4FFFFFFFFFFFFFFFFFFFEFEFE7979C24A + 4AAB9D9DD0FBFBFB9A9ACD44449F44449E7777B9E6E6F3FFFFFFFFFFFFFCFCFC + F2F2F24A4AAC4B4BAE4D4DB35050BA5252BF6B6BCBD6D6F0FFFFFFFFFFFFFFFF + FFFFFFFF8F8FC97F7FC3FFFFFFCFCFE94D4DB24C4CB05151B16767B9D7D7ECFF + FFFF9191CC6969B95C5CB34B4BAD7B7BC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FDFDFD7A7AC19E9ED2FFFFFFFFFFFFFFFFFFC3C3E36E6EBD4B4BADCFCFE9FFFF + FFFFFFFFF3F3FAB3B3DB5656B24C4CB04D4DB35050B95252BF5454C35555C656 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C802 + 00000200005656C85656C85656C85656C85656C85656C85656C88E8EDAFFFFFF + E8E8F75E5EC47F7FCCFFFFFFCFCFE94848A85353AB5555AF4B4BAE7C7CC7E7E7 + F5FFFFFF7F7FCC4F4FB8A1A1D9FFFFFFA0A0D64B4BAE4A4AAD6363B84C4CB059 + 59B98A8ACFFFFFFFFEFEFE5050B95050BA5151BD5353C15454C46060C97272CE + 7575CE9898D9ECECF8FFFFFF9494D36363C0F3F3FAFFFFFF8080CE5252BB8585 + CFA7A7DBB2B2DEFFFFFFCFCFEB7979C76C6CC3ADADDE5B5BBDF3F3FAE8E8F650 + 50BA5050BADCDCF1FFFFFF6767C2D0D0ECFFFFFF9797D65050BB5050B97F7FCC + 5050B9FFFFFFFFFFFF6868C45050BA5C5CBE7272C65050BA5151BB5252BF5454 + C35555C55656C75656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C80200000200005656C85656C85656C85656C85656C85656C856 + 56C85656C8D2D2F0FFFFFFFFFFFFFFFFFFFFFFFFD0D0EC4E4EB57C7CC7FFFFFF + D0D0ECDCDCF1FFFFFFE8E8F75E5EC48181D1FFFFFFFFFFFFFFFFFFFFFFFFA1A1 + D9A2A2DAF3F3FAD1D1EDE8E8F6FFFFFFC6C6EA5353C15353C25454C35555C555 + 55C68383D6FFFFFFDBDBF3E4E4F5FFFFFFECECF87D7DCF6E6ECAA7A7DFFFFFFF + FFFFFFFFFFFFFFFFFFB5B5E47C7CCEE3E3F5FFFFFFFFFFFFFFFFFFFFFFFF5353 + C19898DAFFFFFFE8E8F7DDDDF3FFFFFFBABAE65353C28C8CD6FFFFFFF4F4FBD1 + D1EFF4F4FBD1D1EE5353C1AFAFE2FFFFFFE8E8F7D1D1EFFFFFFFA3A3DE5353C1 + 5454C35454C35555C55656C75656C75656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C80200000200005656C85656C85656C85656 + C85656C85656C85656C85656C85656C89A9ADEA5A5E1A4A4E1FFFFFFD1D1EE52 + 52BF5E5EC28C8CD4A3A3DDA4A4DF9898DC6060CA5656C76060CABBBBE8FFFFFF + BBBBE78282D36A6ACA6B6BCB9898DBA4A4E0A4A4E08E8ED95555C65656C75656 + C75656C75656C85656C86161CC9C9CDFB7B7E7B7B7E7AEAEE48181D57878D278 + 78D27878D28A8AD8B7B7E7B7B7E7AEAEE48181D57878D27878D2A5A5E1B7B7E7 + B0B0E57878D25656C75656C76D6DCEA5A5E1A5A5E18E8EDA5656C75656C75656 + C76D6DCEA5A5E1A5A5E1A5A5E16D6DCE5656C75656C77878D2A5A5E1A5A5E19A + 9ADD6161CB5656C75656C75656C75656C75656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C80200000200005656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C88383 + D6FFFFFFD2D2F05555C55454C45555C55555C55555C65656C75656C85656C856 + 56C8A5A5E2FFFFFFA5A5E15555C65555C65555C65656C75656C75656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C86666CD7878D37878D37878 + D37878D37878D37878D37878D37878D37878D37878D37878D37878D37878D378 + 78D37878D37878D36666CD5656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C802 + 00000200005555C75555C75555C75555C75555C75555C75555C75555C75555C7 + 5555C75555C76C6CCEA4A4E19898DC5555C55454C45454C45454C45454C55555 + C65555C65555C65555C75555C75555C75555C75555C75555C75555C75555C755 + 55C75555C75555C65555C65454C55454C55454C45454C45454C55454C55A5AC8 + 7474D07777D27777D27777D27777D27777D27777D27777D27777D27777D27777 + D27777D27777D27777D27777D27474D15A5AC95555C75555C75555C75555C755 + 55C75555C75555C75555C75555C75555C75555C65555C65555C75555C75555C7 + 5555C75555C75555C75555C75555C75555C75555C75555C75555C75555C75555 + C75555C65555C65454C55454C55454C45454C45454C55454C55555C65555C655 + 55C75555C75555C75555C75555C75555C75555C75555C75555C75555C75555C7 + 5555C75555C75555C75555C75555C75555C75555C75555C75555C75555C75555 + C75555C75555C70200000200005555C75555C75555C75555C75555C75555C755 + 55C75555C75555C75555C75555C65454C55454C45353C25252BF5151BE5151BD + 5151BD5151BD5151BE5252C05353C25454C45454C55555C65555C65555C75555 + C75555C75555C75555C65454C55353C35252C15151BE5151BD5050BB5050BB51 + 51BD5151BE5252C15F5FC77474D07777D17777D17777D17676D07575CF7575CE + 7575CE7575CE7474CD7474CD7575CE7575CE7373CE5F5FC85454C55555C65555 + C65555C75555C75555C75555C75555C75555C65454C55454C45353C35353C253 + 53C25353C35454C45454C55555C65555C75555C75555C75555C75555C75555C7 + 5555C75555C65454C55353C35252C15151BE5151BD5050BB5050BB5151BD5151 + BE5252C15353C35454C55555C65555C65555C65454C55454C45353C35353C353 + 53C35353C25353C25353C35353C35353C35454C45454C55555C65555C65555C7 + 5555C75555C75555C75555C75555C70200000200005555C75555C75555C75555 + C75555C75555C75555C75555C75555C75555C65454C45252C15151BD4F4FB84D + 4DB44C4CB24B4BB04B4BB04C4CB14D4DB34E4EB64F4FB85050BB5252BF5353C2 + 5454C45555C65555C65555C65454C55353C35252BF5050BB4E4EB74C4CB24B4B + AF4A4AAC4A4AAC4B4BAF4C4CB24E4EB75050BB5959C26767C87171CD7272CD71 + 71CB6F6FC86E6EC66E6EC56D6DC36C6CC26C6CC26B6BC26363C05858BE5151BE + 5252C15353C35454C55555C65555C75555C75555C75555C65454C55353C25252 + BF5050BB4F4FB94F4FB95050BB5151BE5353C25454C45555C65555C75555C755 + 55C75555C75555C65454C55353C35252BF5050BB4E4EB74C4CB24B4BAF4A4AAC + 4A4AAC4B4BAF4C4CB24E4EB75050BB5252BF5353C25353C35353C25252C15151 + BE5050BB5050BB4F4FB94F4FB84F4FB84F4FB94F4FBA5050BB5151BE5252C153 + 53C35454C55555C65555C75555C75555C75555C75555C70200000200005555C7 + 5555C75555C75555C75555C75555C75555C75555C75555C65454C45252BF4F4F + B94C4CB24949AB4747A54646A34545A24646A34646A54747A74848A94A4AAC4B + 4BB04D4DB54F4FBA5151BE5353C25454C45454C45353C25151BD4E4EB64B4BAF + 4747A64444A042429B41419942429A43439C4545A24848A84B4BAF4E4EB65050 + BB5151BD5151BD5050BB4E4EB64C4CB14A4AAE4949AB4848A94848A94949AB4A + 4AAD4C4CB14E4EB75050BC5252C15454C45555C65555C75555C75555C75454C5 + 5353C25151BD4E4EB64B4BAF4949AC4949AC4A4AAE4D4DB35050BB5252C05454 + C45555C65555C75555C75555C65454C55353C25151BD4E4EB64B4BAF4747A644 + 44A042429B41419942429A43439C4545A24848A84B4BAF4E4EB65050BB5151BD + 5151BD5050BB4E4EB64C4CB14A4AAE4949AB4848A94848A94949AB4A4AAD4C4C + B14E4EB75050BC5252C15454C45555C65555C75555C75555C75555C75555C702 + 00000200005555C75555C75555C75555C75555C75555C75555C75555C75454C5 + 5252C04F4FB94B4BB04646A542429B4040953E3E923E3E924040954141974242 + 9A43439C44449E4545A24848A84A4AAE4D4DB55050BB5151BE5151BE5050BB4C + 4CB24848A843439C3E3E913B3B893838833737823838843B3B893E3E9042429A + 4545A24949AB4C4CB14D4DB44D4DB54C4CB24949AC4747A544449E4141994040 + 9640409641419944449E4747A54B4BAF4E4EB75151BE5353C25454C55555C755 + 55C75555C65454C45151BD4D4DB54949AA44449F41419941419943439D4747A5 + 4C4CB15050BB5353C25454C55555C75555C65454C55353C25050BB4C4CB34848 + A843439C3E3E913B3B893838833737823838843B3B893E3E9042429A4545A249 + 49AB4C4CB14D4DB44D4DB54C4CB24949AC4747A544449E414199404096404096 + 41419944449E4747A54B4BAF4E4EB75151BE5353C25454C55555C75555C75555 + C75555C75555C70200000200005555C75555C75555C75555C75555C75555C755 + 55C75555C65353C35050BC4C4CB14646A44040953B3B8B393985383884393986 + 3B3B8B3D3D8E3E3E903E3E913E3E913F3F9341419744449E4747A74B4BAF4D4D + B44D4DB44B4BAF4646A34040953A3A8734347B3131722F2F6F30307031317334 + 347B3838833C3C8D4040974444A04747A74949AC4A4AAC4848A84545A1404097 + 3C3C8C38388336367E36367E3838833C3C8C4141994747A54C4CB15050BB5353 + C25454C55555C75555C75555C65252C14F4FB84949AB43439C3C3C8C38388338 + 38823A3A894040954747A54D4DB35151BD5454C45555C65454C55353C25050BB + 4C4CB14646A44040953A3A8734347B3131722F2F6F30307031317334347B3838 + 833C3C8D4040974444A04747A74949AC4A4AAC4848A84545A14040973C3C8C38 + 388336367E36367E3838833C3C8C4141994747A54C4CB15050BB5353C25454C5 + 5555C75555C75555C75555C75555C70200000200005454C75454C75454C75454 + C75454C75454C75454C75454C65151C14D4DB74848AA41419A3A3A8A36368035 + 357E36367F3838853B3B8C3D3D913E3E923C3C8F3B3B8B3939883939883C3C8D + 3F3F9643439F4646A54646A643439E3D3D913737823030722B2B672929622A2A + 622B2B672E2E6E3232773636803A3A893D3D904141994444A04646A54646A645 + 45A341419B3C3C8E3636803131732E2E6C2E2E6C3131733636813E3E924444A2 + 4A4AB04F4FBB5252C25353C55454C75454C75353C45050BD4B4BB14444A13C3C + 8D34347B2F2F702F2F7033337839398741419B4949AC4E4EB95252C25353C552 + 52C35050BD4C4CB34646A53E3E933737823030722B2B672929622A2A622B2B67 + 2E2E6E3232773636803A3A893D3D904141994444A04646A54646A64545A34141 + 9B3C3C8E3636803131732E2E6C2E2E6C3131733636813E3E924444A24A4AB04F + 4FBB5252C25353C55454C75454C75454C75454C75454C70200000200005454C7 + 5454C75454C75454C75454C75454C75454C75353C55050BE4C4CB34646A53E3E + 9338388535357E35357E3838853C3C8E40409742429C42429B3F3F953B3B8C37 + 378335357D35357E3838853B3B8C3E3E933F3F943B3B8C35357E2F2F6F292962 + 26265B26265B2929612D2D6A31317436367F3939873C3C8E3E3E934141994343 + 9E4545A24545A44545A241419A3B3B8C34347B2D2D6A2929622929622D2D6A34 + 347B3D3D904545A34B4BB35050BD5252C35454C65454C75454C65252C24E4EB8 + 4848AA3F3F953636802E2E6C2929622929622E2E6C35357E3E3E934646A54C4C + B55050BE5252C25151BF4D4DB74747A93F3F963737822F2F7029296226265B26 + 265B2929612D2D6A31317436367F3939873C3C8E3E3E9341419943439E4545A2 + 4545A44545A241419A3B3B8C34347B2D2D6A2929622929622D2D6A34347B3D3D + 904545A34B4BB35050BD5252C35454C65454C75454C75454C75454C75454C702 + 00000200005454C75454C75454C75454C75454C75454C75454C75353C55050BD + 4B4BB14444A26A6AA78888B18787AF8888B18B8BB87878B46666B24747A94646 + A643439E3D3D9037378232327630307231317433337936368036368033337839 + 39746F6F9084849BA7A7B4A7A7B69393AB75759E3838853D3D9040409742429C + 43439E4444A14545A34646A54646A64545A441419B3B3B8C3333782B2B652727 + 5B27275B2B2B6533337A3E3E924646A54C4CB55151BF5353C55454C65454C753 + 53C55151BF4C4CB37A7AB86565A03C3C7B2A2A6226265926265B2B2B67333379 + 3C3C8D4444A24B4BB14F4FBB5151BF4F4FBB4A4AAF43439E3939873C3C797070 + 9184849BA7A7B4A7A7B69393AB75759E3838853D3D9040409742429C43439E44 + 44A14545A34646A54646A64545A441419B3B3B8C3333782B2B6527275B27275B + 2B2B6533337A3E3E924646A54C4CB55151BF5353C55454C65454C75454C75454 + C75454C75454C70200000200005454C75454C75454C75454C75454C75454C754 + 54C75353C44F4FBC8E8ECBE4E4EAECECECECECECEFEFEFF2F2F2F5F5F5F5F5F5 + F2F2F2E1E1E8A7A7D05A5AAD4040973737833030722C2C692B2B662C2C692E2E + 6C2E2E6D8181A1D4D4D7E0E0E0E0E0E0E2E2E2E3E3E3E5E5E5E5E5E5CFCFDB85 + 85BD4747A94848AB4848AB4848AC7777C0F7F7F7F3F3F3CBCBDFB9B9D1B0B0C6 + AAAABDA7A7B6B4B4BEDDDDDDE5E5E56565993F3F954747A94E4EB85252C25454 + C65454C65454C65353C44F4FBB4949ACD2D2DEDDDDDDD5D5D5BABAC175759026 + 265B2C2C693333793B3B8C43439E4949AE4D4DB74F4FBB4D4DB64747A83E3E93 + 8686ABD4D4D8E0E0E0E0E0E0E2E2E2E3E3E3E5E5E5E5E5E5CFCFDB8585BD4747 + A94848AB4848AB4848AC7777C0F7F7F7F3F3F3CBCBDFB9B9D1B0B0C6AAAABDA7 + A7B6B4B4BEDDDDDDE5E5E56565993F3F954747A94E4EB85252C25454C65454C6 + 5454C75454C75454C75454C75454C70200000200005454C75454C75454C75454 + C75454C75454C75454C75353C46767C6FDFDFDFAFAFAFAFAFAFBFBFBF1F1F7B4 + B4D99D9DD2A0A0D8C5C5E9FEFEFEF2F2F2E5E5E59393BD42428A2F2F6F292962 + 26265B26265B27275D9C9CB1E9E9E9E9E9E9EBEBEBEFEFEFF3F3F3F7F7F7F8F8 + F8F9F9F9F7F7F7F4F4F4D1D1E67979C74D4DB74D4DB65959BB7C7CC9C4C4E7FC + FCFCF2F2F2E8E8E8E0E0E0DDDDDDDEDEDEA5A5B76C6C9543438841419A4949AE + 5050BD5353C55454C75454C75454C65151C14D4DB66A6AB6EFEFEFE5E5E5DDDD + DDD7D7D7BDBDC32929602F2F7036367F3C3C8D42429D4848AB4C4CB34D4DB64A + 4AB04444A1A5A5C4E9E9E9E9E9E9EBEBEBEFEFEFF3F3F3F7F7F7F8F8F8F9F9F9 + F7F7F7F4F4F4D1D1E67979C74D4DB74D4DB65959BB7C7CC9C4C4E7FCFCFCF2F2 + F2E8E8E8E0E0E0DDDDDDDEDEDEA5A5B76C6C9543438841419A4949AE5050BD53 + 53C55454C75454C75454C75454C75454C75454C75454C70200000200005353C6 + 5353C65353C65353C65353C65353C65353C65252C4A1A1DCFFFFFFFFFFFFFFFF + FF9B9BCC5151AB4848AC4C4CB54F4FBD5252C37474CEF3F3FAF2F2F2E2E2E2B7 + B7C638387126265C2323532222519A9AAEEDEDEDEFEFEFF2F2F2F6F6F6FCFCFC + FFFFFFF2F2F6BFBFDB9C9CCF9F9FD6B8B8E3E7E7F6FEFEFEB8B8E36666C34D4D + B94D4DB94D4DB9CFCFEBFFFFFFF5F5F5EBEBEBE4E4E4B1B1C028285F2D2D6A36 + 368241419B4A4AAF4F4FBD5252C45353C65353C65252C34F4FBC4949AFB1B1D6 + F6F6F6EFEFEFE6E6E6E0E0E0DCDCDC4F4F7F3232783838863D3D9041419B4646 + A74949AE4949AF4747A9ABABCFF1F1F1F0F0F0F2F2F2F6F6F6FCFCFCFFFFFFF2 + F2F6BFBFDB9C9CCF9F9FD6B8B8E3E7E7F6FEFEFEB8B8E36666C34D4DB94D4DB9 + 4D4DB9CFCFEBFFFFFFF5F5F5EBEBEBE4E4E4B1B1C028285F2D2D6A3636824141 + 9B4A4AAF4F4FBD5252C45353C65353C65353C65353C65353C65353C65353C602 + 00000200005353C65353C65353C65353C65353C65353C65353C65252C4A2A2DD + FFFFFFFFFFFF9292CE4848AC4A4AB04C4CB64E4EBB5151C15252C35050BE7C7C + C9FEFEFEECECECDEDEDEA9A9B824245722225070708BECECECF2F2F2F7F7F7FB + FBFBFFFFFFFFFFFF8F8FB13737833F3F974646A74A4AB14C4CB54C4CB69494D3 + E7E7F5FFFFFF4C4CB54C4CB64D4DB7A0A0D7FFFFFFFFFFFFF4F4F4EAEAEA8181 + 9E28285F2D2D6B37378241419C4A4AAF4F4FBD5353C55353C65353C55151C14D + 4DB75353AEF2F2F8FDFDFDF8F8F8F0F0F09B9BB0CDCDD58F8FAF3737833C3C8E + 3E3E9541419B4444A34747A94747A98D8DC6F8F8F8F7F7F7F8F8F8FBFBFBFFFF + FFFFFFFF8F8FB13737833F3F974646A74A4AB14C4CB54C4CB69494D3E7E7F5FF + FFFF4C4CB54C4CB64D4DB7A0A0D7FFFFFFFFFFFFF4F4F4EAEAEA81819E28285F + 2D2D6B37378241419C4A4AAF4F4FBD5353C55353C65353C65353C65353C65353 + C65353C65353C60200000200005353C65353C65353C65353C65353C65353C653 + 53C65353C5B9B9E7FFFFFFD0D0ED4D4DB74C4CB64D4DB94F4FBC5050BE5151C1 + 5050BE4D4DB74747AAE6E6F1F6F6F6E8E8E8DEDEDE6D6D8A222250CFCFD6F1F1 + F1F7F7F7FBFBFBFEFEFEFFFFFF51517C2E2E6E3838853F3F974545A44848AB48 + 48AC4848AB4747A85252ADC1C1E24747A94949AE4A4AB17A7AC5FFFFFFFFFFFF + FBFBFBEFEFEF5B5B842828602D2D6B37378341419C4A4AAF4F4FBD5252C45353 + C55252C34F4FBD4B4BB28E8EC6FFFFFFFFFFFFFFFFFFF9F9F9797999A3A3BCD4 + D4DD3B3B8D3F3F9740409A41419B43439F4545A44545A5E6E6F2FEFEFEFDFDFD + FDFDFDFEFEFEFFFFFF51517C2E2E6E3838853F3F974545A44848AB4848AC4848 + AB4747A85252ADC1C1E24747A94949AE4A4AB17A7AC5FFFFFFFFFFFFFBFBFBEF + EFEF5B5B842828602D2D6B37378341419C4A4AAF4F4FBD5252C45353C55353C5 + 5353C55353C65353C65353C65353C60200000200005353C65353C65353C65353 + C65353C65353C65353C65353C5D1D1EFFFFFFF8A8AD55050BE4F4FBD5050BE50 + 50BF5050BE4F4FBC4C4CB54747AA41419BCACAE0FEFEFEF2F2F2E9E9E99898AC + 666687F1F1F1F5F5F5F9F9F9FBFBFBFBFBFB8989A226265C2E2E6D3737833E3E + 9442429E4444A24343A141419C3F3F973E3E943E3E943F3F9742429E4646A678 + 78C0FFFFFFFFFFFFFEFEFEF1F1F15B5B8428285F2D2D6A37378241419B4949AE + 4E4EBB5151C25252C35050BF4D4DB74747A9D9D9EAFFFFFFFFFFFFFFFFFFFEFE + FE454576676798F4F4F46E6EAE42429E42429E41419B41419B42429E8181BEFF + FFFFFFFFFFFFFFFFFDFDFDFBFBFB8989A326265C2E2E6D3737833E3E9442429E + 4444A24343A141419C3F3F973E3E943E3E943F3F9742429E4646A67878C0FFFF + FFFFFFFFFEFEFEF1F1F15B5B8428285F2D2D6A37378241419B4949AE4E4EBB51 + 51C25252C35252C35252C45252C45353C55353C65353C60200000200005353C6 + 5353C65353C65353C65353C65353C65353C65353C6D1D1F0FFFFFF5252C45252 + C35151C15151C15050BE4E4EBA4B4BB24646A7404099393988E4E4EDFFFFFFFA + FAFAF3F3F3BBBBC98888A6F8F8F8F9F9F9F9F9F9F7F7F7E4E4E823235526265B + 2D2D6B35357F3B3B8D3F3F963F3F973E3E943A3A8B36368234347C34347B3636 + 803A3A8B3F3F977575B9FFFFFFFFFFFFFBFBFBEEEEEE5A5A8127275C2C2C6835 + 357F4040984747AA4C4CB64F4FBD4F4FBC4C4CB64949AE6868B1FFFFFFFFFFFF + FFFFFFFFFFFFD3D3DE2B2B6735357EE2E2EDADADD24545A54444A241419B3F3F + 963F3F979999C8FFFFFFFFFFFFFFFFFFF8F8F8E4E4E824245526265B2D2D6B35 + 357F3B3B8D3F3F963F3F973E3E943A3A8B36368234347C34347B3636803A3A8B + 3F3F977575B9FFFFFFFFFFFFFBFBFBEEEEEE5A5A8127275C2C2C6835357F4040 + 984747AA4C4CB64F4FBD4F4FBD5050BE5050C05151C15252C35353C55353C602 + 00000200005353C65353C65353C65353C65353C65353C65353C65353C69898DD + A3A3E15353C55252C45151C25050BE4D4DB74949AF4444A23E3E943737846767 + 99FFFFFFFFFFFFFFFFFFFEFEFEC5C5D5C8C8D9FFFFFFFEFEFEF9F9F9F3F3F39D + 9DB225255927275D2D2D6B35357E3B3B8D3E3E953E3E953C3C8E373782313174 + 2D2D6B2C2C6A2F2F6F34347B3B3B8C7272B3FFFFFFFFFFFFFAFAFAECECEC5858 + 7F26265A2A2A6533337B3D3D924444A24949AD4B4BB24949AF4747A843439FB1 + B1D3FFFFFFFFFFFFFEFEFEFEFEFE8B8BA82E2E6D3838869A9ACAECECF35252AE + 4545A44040993C3C903B3B8DCBCBE1FFFFFFFFFFFFFFFFFFF5F5F59E9EB42525 + 5927275D2D2D6B35357E3B3B8D3E3E953E3E953C3C8E3737823131742D2D6B2C + 2C6A2F2F6F34347B3B3B8C7272B3FFFFFFFFFFFFFAFAFAECECEC58587F26265A + 2A2A6533337B3D3D924444A24949AD4B4BB34B4BB34C4CB44D4DB74F4FBC5151 + C15252C45353C60200000200005252C65252C65252C65252C65252C65252C652 + 52C65252C65252C65252C65252C55151C34F4FBE4C4CB64747AC42429F3B3B90 + 35357F2E2E70D3D3DFFFFFFFFFFFFFFFFFFFFFFFFF9191B5C9C9DEFFFFFFFFFF + FFFBFBFBF2F2F28484A42828612929632E2E6E35357F3B3B8E3E3E963E3E953A + 3A8D34347D2D2D6C28286127275F2A2A653030733737846F6FAEFFFFFFFFFFFF + F8F8F8EAEAEA57577D24245728286131317639398A3F3F974242A04343A24141 + 9E3E3E96474795F2F2F6FFFFFFFEFEFEFBFBFBFBFBFB4444722F2F713A3A8B5B + 5BADFDFDFD9898CE4444A33E3E95393989373784CACADEFFFFFFFFFFFFFFFFFF + F2F2F28383A32828602929632E2E6E35357F3B3B8E3E3E963E3E953A3A8D3434 + 7D2D2D6C28286127275F2A2A653030733737846F6FAEFFFFFFFFFFFFF8F8F8EA + EAEA57577D24245728286131317639398A3F3F974242A04444A34444A34444A5 + 4747AC4B4BB44D4DBB5050C15252C50200000200005252C65252C65252C65252 + C65252C65252C65252C65252C65252C65252C55151C34F4FBE4C4CB64747AB41 + 419C3A3A8C33337B2D2D6CA3A3B9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFF60609E + CCCCE3FFFFFFFFFFFFFEFEFEF1F1F16161942D2D6D2C2C6B3030733535813B3B + 8E3D3D943D3D933939893232782B2B6727275D26265C2929632F2F723636836F + 6FABFFFFFFFFFFFFF7F7F7E8E8E856567B2424562828602F2F713636823A3A8D + 3C3C913C3C9139398A3636828585B0FFFFFFFFFFFFFCFCFCF8F8F8CECED82929 + 633232783C3C904444A5CECEE9E0E0ED4343A23D3D9437378434347DC9C9DCFF + FFFFFFFFFFFFFFFFF1F1F16060902C2C6A2C2C6A3030733535813B3B8E3D3D94 + 3D3D933939893232782B2B6727275D26265C2929632F2F723636836F6FABFFFF + FFFFFFFFF7F7F7E8E8E856567B2424562828602F2F713636823A3A8D3C3C913D + 3D933C3C923E3E9642429F4747AB4B4BB64F4FBE5151C40200000200005252C6 + 5252C65252C65252C65252C65252C65252C65252C65252C65151C44F4FBF4C4C + B74747AC40409B3939893232783838719F9FB5F5F5F5FCFCFCFFFFFFFFFFFFFF + FFFFCACAE03F3F999C9CD0FFFFFFFFFFFFFFFFFFF5F5F5C6C6D5B6B6C9B9B9CC + E3E3E8F4F4F4F4F4F4EFEFEFE6E6E6DDDDDDD4D4D4BBBBC3A4A4B3ABABBA2C2C + 6A3232793838886F6FAEFFFFFFFFFFFFF5F5F5E6E6E657577E26265B2929632F + 2F7234347E37378437378636368333337B303074D5D5E2FFFFFFFEFEFEF9F9F9 + F4F4F48787A52D2D6D3535813E3E974545A89292CFF8F8F88888C13D3D943737 + 8433337B9292B9FFFFFFFFFFFFFFFFFFF5F5F5C5C5D3B6B6C9B9B9CCE3E3E8F4 + F4F4F4F4F4EFEFEFE6E6E6DDDDDDD4D4D4BBBBC3A4A4B3ABABBA2C2C6A323279 + 3838886F6FAEFFFFFFFFFFFFF5F5F5E6E6E657577E26265B2929632F2F723434 + 7E3737843838863737863737843939893E3E954444A44949B14E4EBC5151C302 + 00000200005252C65252C65252C65252C65252C65252C65252C65252C65252C5 + 5050C14D4DBA4848AF41419E3A3A8B323278515181C4C4CFF2F2F2FAFAFAFFFF + FFFFFFFFFFFFFFF2F2F75A5AA94646A98787CDFFFFFFFFFFFFFFFFFFFDFDFDCD + CDDF9A9AC08F8FB99393BD9696C29898C5B1B1D5EAEAEFECECECE2E2E2DBDBDB + D8D8D8C6C6CF33337B3838863C3C917171B1FFFFFFFFFFFFF4F4F4E5E5E55959 + 852A2A662D2D6D32327835358036368235358033337B30307456568AFCFCFCFE + FEFEFBFBFBF5F5F5EFEFEF3A3A7632327939398A40409B4646AA5555B5F9F9F9 + D8D8E53E3E9638388735357F7878AAFFFFFFFFFFFFFFFFFFFCFCFCCCCCDC9999 + BE8F8FB89393BD9696C29898C5B1B1D5EAEAEFECECECE2E2E2DBDBDBD8D8D8C6 + C6CF33337B3838863C3C917171B1FFFFFFFFFFFFF4F4F4E5E5E55959852A2A66 + 2D2D6D32327835358036368235358134347F34347D3636823B3B904242A04848 + AF4D4DBA5151C30200000200005252C65252C65252C65252C65252C65252C652 + 52C65252C65151C44F4FBE4B4BB44444A53C3C9033337B77779CDEDEE1F1F1F1 + F9F9F9FFFFFFFFFFFFFFFFFFF2F2F86868B24747AC4B4BB54D4DBBE8E8F6FFFF + FFFFFFFFFFFFFF9898CC41419E3E3E963D3D933D3D943E3E973E3E97CBCBE2F8 + F8F8F0F0F0E9E9E9E4E4E4A0A0BF3B3B8D3E3E9741419E9A9ACBFFFFFFFFFFFF + F6F6F6E8E8E85F5F9232327834347D38388639398A8888B37C7CAB35357F3232 + 78A9A9C4FEFEFEFFFFFFFCFCFCF5F5F5B0B0C835358139398A3E3E974444A448 + 48AE4A4AB3CECEE9F3F3F39292C43C3C923A3A8B39398AE5E5F0FFFFFFFFFFFF + FFFFFF9696C73F3F993D3D943D3D933D3D943E3E973E3E97CBCBE2F8F8F8F0F0 + F0E9E9E9E4E4E4A0A0BF3B3B8D3E3E9741419E9A9ACBFFFFFFFFFFFFF6F6F6E8 + E8E85F5F9232327834347D38388639398A8787B27A7AA936368235357F373784 + 3C3C904242A04848AF4D4DBA5151C30200000200005252C65252C65252C65252 + C65252C65252C65252C65252C65151C34D4DBB4848AE40409B43438BABABC1EC + ECECF2F2F2FAFAFAFFFFFFFFFFFFFFFFFFF2F2F86969B54848AD4B4BB54D4DBA + 4E4EBC8A8AD4FFFFFFFFFFFFFFFFFFC3C3E64747AC4545A64343A242429F4141 + 9E41419DF2F2F8FFFFFFFFFFFFF8F8F8F2F2F27B7BB74242A04545A74747AC9C + 9CD2FFFFFFFFFFFFFEFEFEF0F0F0C5C5D54646933C3C913E3E973F3F999898C1 + D0D0DC3B3B8D515195FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA8585BA3F3F984141 + 9E4545A64848AE4B4BB64D4DB9CFCFECFBFBFBF5F5F56767B341419E41419C81 + 81BFFFFFFFFFFFFFFFFFFFC1C1E34646A94444A54343A242429F41419E41419D + F2F2F8FFFFFFFFFFFFF8F8F8F2F2F27B7BB74242A04545A74747AC9C9CD2FFFF + FFFFFFFFFEFEFEF0F0F0C5C5D54646933C3C913E3E973F3F999595BEC8C8D33B + 3B8F3A3A8D3B3B9040409A4545A74A4AB34E4EBD5151C30200000200005151C5 + 5151C55151C55151C55151C55151C55151C55151C54F4FC04B4BB64545A86060 + A5C8C8D6EFEFEFF5F5F5FBFBFBFFFFFFFFFFFFFFFFFFD8D8EA5D5DB24848AF4A + 4AB54B4BB74C4CB84C4CB84D4DBAB8B8E5FFFFFFFFFFFFFFFFFF6363C04949B2 + 4747AE4646AB4646A97777BEFFFFFFFFFFFFFFFFFFFFFFFFCDCDE74646AA4848 + AF4A4AB44A4AB5DBDBF0FFFFFFFFFFFFFFFFFFFEFEFED1D1E4E7E7EE8989C35C + 5CB17E7EC0E6E6EDF2F2F29696C8D9D9EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 6969B74646AA4747AD4949B24B4BB64D4DBB4D4DBCDBDBF1FFFFFFFFFFFFF2F2 + F96C6CBD4646AB4747ADB6B6DFFFFFFFFFFFFFFFFFFF6262BF4949B24747AE46 + 46AB4646A97777BEFFFFFFFFFFFFFFFFFFFFFFFFCDCDE74646AA4848AF4A4AB4 + 4A4AB5DBDBF0FFFFFFFFFFFFFFFFFFFEFEFED1D1E4E7E7EE8989C35C5CB17D7D + BFDEDEE5E4E4E48181BA40409D4242A04444A64848AF4C4CB84E4EBF5050C302 + 00000200005151C55151C55151C55151C55151C55151C55151C55151C44F4FC0 + 4A4AB46767B4E6E6EBF3F3F3F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFA4A4CE5151 + AD4A4AB34B4BB74B4BB74A4AB54949B24848B04A4AB34C4CB8ACACE0FFFFFFFF + FFFFDCDCF25959C04C4CB94B4BB65656B9DBDBF0FFFFFFFFFFFFFFFFFFF3F3FA + 5656B96363C1A0A0DAA0A0DBC4C4E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5252 + AFCECEE9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFC3C3E79E9ED74C4CB94D4DBB4E4EBD7E7ED1C4C4EAFFFFFF + FFFFFFFFFFFFFFFFFFF3F3FAABABDE4C4CB94D4DBBACACE0FFFFFFFFFFFFDCDC + F25959C04C4CB94B4BB65656B9DBDBF0FFFFFFFFFFFFFFFFFFF3F3FA5656B963 + 63C1A0A0DBA1A1DCC4C4E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5555B7CECEEA + FFFFFFFFFFFFFEFEFEF9F9F9F1F1F1E1E1E85252B14848AF4949B24C4CB94E4E + BD4F4FC15151C40200000200005151C55151C55151C55151C55151C55151C551 + 51C55151C44E4EBF5656B9E1E1EDF8F8F8FBFBFBFEFEFEFFFFFFFFFFFFF1F1F6 + 7B7BB24242A14949B14C4CB94C4CB94A4AB44747AE4545A84444A54646AA4949 + B24C4CB97D7DD0DCDCF3FFFFFFE8E8F7ADADE2A1A1DCE7E7F6FFFFFFFFFFFFFF + FFFFC4C4E85959C04E4EBD7171CAD0D0EDD0D0EDDBDBF1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF4646AA4747AC9D9DD4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFD0D0EDD0D0EDD0D0EDD0D0EED0D0EED0D0EED0D0EE5050C25050C25050C396 + 96DBD0D0EFD0D0EFD0D0EFD0D0EFD0D0EFD0D0EFD0D0EE5050C25050C25050C3 + 7F7FD3DCDCF3FFFFFFE8E8F7ADADE2A1A1DCE7E7F6FFFFFFFFFFFFFFFFFFC4C4 + E85A5AC14E4EBE7272CDD0D0EFD0D0EFDCDCF3FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFF4E4EBD4E4EBDA1A1DCFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA9B9BD64D4DBB + 4E4EBD4F4FC05050C25050C35151C40200000200005151C55151C55151C55151 + C55151C55151C55151C55151C44F4FC09E9ED7FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFD5D5E14D4D8B3B3B904343A44949B24B4BB74949B24646AB4343A240409B + 3F3F9A4242A14747AC4A4AB54E4EBE5151C47474D1A2A2E0C5C5EBD1D1EFD0D0 + EFC5C5EBA2A2DE6767CA5050C24F4FC14F4FC04E4EBD4C4CB94A4AB44848AF46 + 46AB5050AC7575BC9B9BCED9D9EC4343A44444A64646AB6060BAB7B7E2F3F3FA + F3F3FBA1A1DE5050C25050C25050C35151C45151C45151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C551 + 51C55151C55151C55151C55151C57474D1A2A2E0C5C5EBD1D1EFD0D0EFC5C5EB + A2A2DE6767CA5050C25050C35151C45151C45151C55151C55151C55151C55D5D + C97F7FD4A2A2E0DCDCF35151C45151C45151C46868CCB9B9E7F3F3FBF3F3FBA2 + A2DF5050C25050C25050C35151C45151C45151C55151C50200000200005151C5 + 5151C55151C55151C55151C55151C55151C55151C54F4FC0F3F3FAFFFFFFFFFF + FFFFFFFFFFFFFFAAAAC32C2C6C33337C3B3B8F41419F4646AB4848AF4545A841 + 419F3E3E963B3B903B3B9040409B4545A74A4AB34E4EBD5151C45151C55151C5 + 5151C55151C55151C55151C55151C55151C45050C34F4FC04D4DBB4A4AB44747 + AD4444A641419F3F3F9A3E3E973E3E963E3E963E3E963E3E973F3F9941419E44 + 44A54747AD4B4BB64E4EBD5050C25151C45151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C551 + 51C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C502 + 00000200005151C55151C55151C55151C55151C55151C55151C55151C57373CE + FFFFFFFFFFFFFFFFFFFFFFFFD4D4E33D3D7B2F2F7233337D3A3A8D3F3F9A4343 + A34444A541419E6C6CAD52529A38388839398B3E3E974444A64949B24E4EBD50 + 50C35151C45151C45050C35050C35151C45151C45050C34F4FC14E4EBD4C4CB8 + 4848AF4444A640409D3D3D943A3A8D39398A38388839398A39398A39398B3939 + 8B39398C3B3B8F3E3E964242A04747AC4B4BB64E4EBF5050C35151C55151C551 + 51C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C551 + 51C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C50200000200005050C55050C55050C55050C55050C55050C550 + 50C55050C57E7ED3FFFFFFFFFFFFFFFFFFFDFDFD7676AC33337E32327C343481 + 38388A3C3C943F3F9B3F3F9B5555A2E9E9E97D7DAE37378639398C3E3E994444 + A84949B44D4DBD4F4FC24F4FC24E4EC04E4EC04D4DBF4E4EC04E4EC04D4DBE4C + 4CBB4949B54646AC4242A13D3D9639398C35358334347F34347F353583373788 + 38388A38388B37378836368636368638388B3D3D964343A44848B24D4DBD4F4F + C25050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C50200000200005050C55050C55050C55050 + C55050C55050C55050C55050C57F7FD4FFFFFFFFFFFFFFFFFFFBFBFB3E3E9839 + 398D37378837378839398C3B3B913C3C943D3D958282B6E9E9E96666A338388B + 3B3B9141419F4646AC4A4AB74D4DBE4E4EC04D4DBF4C4CBB4B4BB94A4AB64A4A + B64A4AB64949B44747AF4444A840409D3B3B9137378733337F32327B32327B34 + 34803737873A3A8F3C3C943C3C9339398D3737883535833737863B3B9141419F + 4747AE4C4CBA4F4FC25050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C50200000200005050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C5F3F3FBFFFFFFFFFF + FFFFFFFF4F4FAD41419F3E3E983D3D963D3D963D3D973E3E983E3E98C1C1D9EC + ECEC6A6AAB3D3D9740409E4444A84848B24C4CBB4E4EC04E4EC04C4CBB4A4AB6 + 4848B14646AD4646AD4646AC4444A84343A43F3F9B3B3B9137378633337F3232 + 7A3E3E8263639B8A8AB58C8CBA8D8DBE7777B640409D3D3D963A3A8E37378738 + 38893B3B9141419F4646AD4B4BB94F4FC25050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C502 + 00000200005050C55050C55050C55050C55050C55050C55050C55050C55050C5 + A2A2E0FFFFFFFFFFFFFFFFFF9A9AD34646AD4444A74242A34242A14242A14242 + A17F7FBFF7F7F7F2F2F27070B74343A64545AB4848B24B4BB94D4DBF4E4EC04D + 4DBD4B4BB94848B24545AB4343A54343A44242A140409E3E3E983B3B90373787 + 3434807B7BA6B8B8CBEBEBEBEFEFEFF3F3F3F4F4F4F1F1F1EBEBEBD9D9E08080 + B93E3E983B3B913B3B913E3E984343A44848B04C4CBB4F4FC25050C55050C550 + 50C55050C55050C55050C45050C45050C44F4FC34F4FC34F4FC34F4FC34F4FC3 + 5050C45050C45050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C50200000200005050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55C5CC8DCDCF3FFFFFFFFFFFFFFFFFF9999D14646AC4444A8 + 4343A64343A58E8EC9F3F3F9FFFFFFFBFBFB7676C14848B24A4AB64C4CBB4D4D + BF4F4FC24E4EC14D4DBD4A4AB64747AF4343A641419F3F3F9B3D3D973B3B9239 + 398D36368665659DD4D4DEF0F0F0F4F4F4F9F9F9FFFFFFB3B3DA7777C38686CE + DADAF0F3F3F3E9E9E97878BA41419F40409E4242A14444A84848B24B4BB94D4D + BE4E4EC04E4EC04E4EC04E4EC04E4EC04D4DBF4D4DBD4D4DBD4C4CBC4C4CBB4C + 4CBB4C4CBC4D4DBD4D4DBF4E4EC14F4FC35050C45050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C50200000200005050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C44F4FC2A0A0DCFFFFFFFFFFFFFF + FFFFF2F2F8CBCBE6CDCDE7F2F2F9FFFFFFFFFFFFFFFFFFFFFFFF7979C74A4AB7 + 4C4CBB4E4EC04F4FC24F4FC34F4FC34D4DBE4B4BB84747AF4343A53F3F9C3D3D + 953A3A8E37378842428AA6A6C4F5F5F5F9F9F9FDFDFDFFFFFFD8D8E95959AA44 + 44A84848B24B4BB95858C0FFFFFFF6F6F6E3E3EA4545AB4444A84444A84646AC + 4747AF4848B24949B54A4AB64A4AB64A4AB64A4AB64949B44949B44848B24848 + B24848B04747AF4747AF4747AF4848B24A4AB64B4BB94D4DBE4E4EC15050C450 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C50200000200005050C4 + 5050C45050C45050C45050C45050C45050C45050C45050C34F4FC14D4DBC4A4A + B65454B48F8FCBA7A7D4CCCCE5CCCCE5CCCCE5C0C0DF9A9ACD9B9BCE8F8FCA77 + 77C15454B44A4AB54C4CBA4E4EBF4F4FC15050C34F4FC24E4EBF8383CB4848B1 + 4444A63F3F9B3C3C9338388A5C5C9ADEDEE8FCFCFCFFFFFFFFFFFFFFFFFF9595 + C13C3C933F3F9A4343A34646AB4848B14A4AB5FFFFFFFFFFFFFAFAFA7777C448 + 48AF4646AC4545AA4545A84444A84444A74444A64343A54343A54343A54343A5 + 4444A64343A54343A54343A44242A24242A14242A14343A44545A84747AE4A4A + B64D4DBC4F4FC15050C35050C45050C45050C45050C45050C45050C45050C450 + 50C45050C45050C45050C45050C45050C45050C45050C45050C45050C45050C4 + 5050C45050C45050C45050C45050C45050C45050C45050C45050C45050C45050 + C45050C45050C45050C45050C45050C45050C45050C45050C45050C45050C402 + 00000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44E4EC2 + 4C4CBD4949B64646AD4141A23E3E993B3B933A3A903A3A903B3B933C3C953D3D + 973E3E9A3F3F9C4040A04343A54545AB4848B24A4AB84D4DBE4E4EC14E4EC1AA + AADFBCBCE14747AF4242A43D3D9839398D8282B1EBEBF0FCFCFCFFFFFFFFFFFF + C9C9DD5E5E9D37378A39398E3B3B933D3D9740409E4242A45E5EB6FFFFFFFFFF + FFCFCFEC6D6DC54848B34646AE4343A74040A03E3E9A3C3C953B3B923B3B913B + 3B923B3B933C3C953D3D973E3E993E3E9A3D3D983C3C963B3B943B3B933C3C95 + 3E3E9A4242A34646AE4A4AB74D4DBE4E4EC24F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC40200000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC34D4DC04B4BB94646AE4141A13B3B93373789353583343482353584 + 37378938388C39398E3A3A8F3A3A8F3A3A913C3C953F3F9C4343A54646AE4A4A + B74C4CBC7C7CD0FFFFFFFCFCFC9898CE40409E52529EB3B3CEF6F6F6FBFBFBFE + FEFEC8C8DB6969A034348236368537378737378737378737378939398D3B3B93 + 9999CACDCDE77777C44949B54949B64848B34545AB4040A03C3C943737893333 + 8031317A31317931317933337E35358337378A39398D3A3A913A3A9139398E38 + 388A37378837378939398D3D3D974242A44747B04B4BBA4E4EC14F4FC34F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC40200000200004F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC34D4DBE4949B54444A83D3D9737378833337E32 + 327C32327D35358338388A3A3A8F3A3A9039398D37378936368636368638388B + 3C3C954141A14545AC4949B54A4AB89292D3E6E6F4FFFFFFFBFBFBF8F8F8F9F9 + F9E0E0E9ABABC768689D33337F36368538388A39398D38388C37378735358333 + 337E33337E3434814444923C3C954141A24545AC4848B24747B14444AA3F3F9C + 39398D32327D2D2D6F2A2A672929652A2A682D2D6F31317A36368539398D3B3B + 933C3C943B3B9238388C3737873636853737873A3A8F3F3F9C4444AA4949B54D + 4DBF4F4FC34F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC40200000200004F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44E4EC24C4CBC4747B14141A23A3A + 9135358332327C32327C35358338388C3C3C953E3E9A3E3E993B3B9338388A34 + 348132327B32327C3535843B3B914040A04545AB4646AE4545AB4040A05555A0 + 6B6BA467679B3C3C7B2E2E7330307834348038388A3B3B933D3D983E3E9A3D3D + 973A3A9036368732327D3030762F2F743131793535833B3B9140409F4444AA46 + 46AE4444A93F3F9D38388C30307829296625255B24245825255D2A2A69313179 + 3737893C3C943F3F9C40409F3F3F9D3C3C963A3A8F38388A37378939398D3E3E + 994343A74848B34C4CBC4E4EC24F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC402 + 00000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44E4EC24B4BBA + 4646AE40409F6868A68787B08686AF8888B28C8CB87777B36363B04343A74242 + A43F3F9B39398E3434802F2F742D2D702F2F763434823A3A9140409E4141A13F + 3F9C3A3A8F3333802E2E732B2B6B3939756565979191B99393C09696C69595C9 + 7171B94E4EAA4242A33F3F9B3A3A903434822F2F752C2C6D2B2B6C2E2E733333 + 803A3A9040409F4444A84444A840409E39398D30307727276222225521215123 + 235850508063639A7676AE9191C39191C79090C78D8DC36060AE3E3E9A3B3B94 + 3A3A903A3A913E3E9A4343A64848B24C4CBC4E4EC24F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC40200000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44E4EC14B4BB98B8BCAE3E3EAECECECECECECEFEFEFF2F2F2F5F5F5F5F5F5 + F2F2F2E1E1E8A5A5CE5757AC3C3C943434812D2D702A2A682A2A692F2F743535 + 833A3A8F3B3B9138388A32327D2D2D6F7C7CA0C1C1D1FBFBFBFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF8F8F8EFEFEFC6C6DB8181BD3F3F9C38388C32327B2B2B6C + 2828642929652D2D6F6969A2FFFFFFF8F8F8D7D7E4B8B8D1AFAFC6A9A9BCA5A5 + B5B3B3BDDDDDDDE6E6E6EFEFEFF7F7F7FCFCFCFEFEFEFBFBFBF5F5F5EEEEEEE6 + E6E68D8DC34141A13E3E9A3E3E9940409E4444A94848B34C4CBC4E4EC24F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC40200000200004E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44D4DC16262C3FDFDFDFAFAFAFAFAFAFBFBFBF1F1F7B2 + B2D89B9BD19D9DD6C3C3E9FEFEFEF2F2F2E5E5E59191BC3F3F882B2B6D272762 + 2727612A2A692E2E753333803434823030796F6F9BDADAE1F9F9F9FEFEFEFFFF + FFFFFFFFD8D8EAA7A7D69D9DD6B7B7E3F3F3FBFFFFFFF7F7F7E9E9E9C8C8D56F + 6FAD3535852D2D7127276225255D272762494984A1A1C6D8D8EBFEFEFEF3F3F3 + E7E7E7E0E0E0DEDEDEE0E0E0E9E9E9D8D8E0B8B8CE9494C19999CD9C9CD5ABAB + E0E7E7F7FFFFFFF6F6F6E1E1E84545AE4343A84141A44242A74545AE4848B54B + 4BBC4D4DC24E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC40200000200004E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44D4DC29E9EDBFFFFFFFFFFFFFFFF + FF9999CB4E4EA94444AA4747B34B4BBC4D4DC17070CDF3F3FAF2F2F2E2E2E2B6 + B6C635357025255D24245B2626602B2B6B2E2E742E2E739393B1F0F0F0F4F4F4 + F9F9F9FFFFFFD6D6E56F6FAE4242A54747B34B4BBC4D4DC14E4EC3A1A1DFFFFF + FFFCFCFCEBEBEBDBDBDB9494B730307928286423235923235928286530307939 + 398ECCCCE5FFFFFFF5F5F5ECECECE8E8E8E8E8E89D9DB125255E2E2E7339398E + 4141A44848B54C4CBF4E4EC4A1A1DFFFFFFFF9F9F97575C74747B34646AF4646 + B04848B54A4ABA4C4CBF4D4DC24E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC402 + 00000200004E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44D4DC29F9FDC + FFFFFFFFFFFF8F8FCD4444AA4545AE4848B44A4AB94C4CBF4D4DC14B4BBC7878 + C7FEFEFEECECECDDDDDDA6A6B623235923235724245B2828652B2B6B9F9FB7EF + EFEFF1F1F1F5F5F5FBFBFBABABC53636873E3E9D4545AE4A4ABB4D4DC14E4EC3 + 4E4EC44E4EC49595DBFFFFFFFEFEFEE9E9E9D9D9D99191B02A2A692323582222 + 5524245B2B2B6D3434839696C6FFFFFFFFFFFFF6F6F6EFEFEFECECEC30306026 + 265F2E2E733939904242A54848B54C4CC04E4EC44E4EC4C4C4EBFFFFFF9D9DD9 + 4A4ABA4949B84949B84A4ABB4C4CBE4D4DC14E4EC34E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC40200000200004E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC3B7B7E6FFFFFFCECEEC4848B54848B54949B74A4ABA4B4BBC4C4CBF + 4B4BBC4848B54343A8E5E5F1F5F5F5E5E5E5D9D9D96A6A8822225624245B2727 + 629E9EB7F0F0F0F2F2F2F5F5F5F9F9F9A8A8C03030783A3A914242A54848B54C + 4CBF4E4EC34E4EC44E4EC44E4EC44E4EC4A1A1DFFFFFFFFBFBFBE6E6E6D6D6D6 + 8383A224245A20205122225528286431317A6D6DABFFFFFFFFFFFFFEFEFEF5F5 + F5B8B8C622225626265F2E2E743939904242A54848B54C4CC04E4EC44E4EC45A + 5AC7F3F3FBD0D0EE4C4CBF4C4CBF4C4CBE4C4CBF4D4DC14D4DC24E4EC34E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC40200000200004E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC3D0D0EFFFFFFF8888D44B4BBC4B4BBC4B4BBC4B + 4BBD4B4BBC4A4ABA4747B34343A83D3D99C9C9DFFBFBFBECECECE0E0E09090A5 + 23235826265F696992F0F0F0F4F4F4F6F6F6F8F8F8DEDEE53737703333803D3D + 984545AC4A4ABA4D4DC24E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4E7E7F6FF + FFFFF4F4F4E0E0E0D3D3D352527A20205020205125255E2E2E736C6CA7FFFFFF + FFFFFFFFFFFFF5F5F5B6B6C522225626265F2E2E743939904242A54848B54C4C + C04E4EC44E4EC44E4EC4B8B8E7FFFFFF4D4DC24D4DC24D4DC24D4DC24E4EC34E + 4EC34E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC40200000200004E4EC3 + 4E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC3D0D0EFFFFFFF4D4DC14D4D + C04C4CBE4C4CBE4B4BBB4949B74646AF4242A43C3C97363686E3E3ECFDFDFDF2 + F2F2E9E9E9B0B0BE26265F36366FE3E3E7F4F4F4F7F7F7F8F8F8F8F8F8797999 + 2B2B6A3535853F3F9D4646AF4B4BBB4E4EC24E4EC34E4EC34E4EC34E4EC34E4E + C34E4EC3A0A0DDFFFFFFFFFFFFECECECDADADAAFAFBA2020501F1F4E2323592B + 2B6D6969A2FFFFFFFFFFFFFFFFFFF2F2F2B3B3C122225626265F2E2E7339398F + 4242A44848B44C4CBF4E4EC34E4EC34E4EC35A5AC77D7DD34E4EC34E4EC35858 + C69999DC8383D55656C64E4EC34E4EC34E4EC34E4EC34E4EC34E4EC35F5FC97A + 7AD26565CB4E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC3 + 4E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4E + C34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC302 + 00000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC39494DB + A0A0DF4D4DC24C4CC14B4BBF4A4ABB4747B44444AC3F3FA03A3A923333826565 + 98FFFFFFFEFEFEF8F8F8F2F2F2B8B8C82A2A6A8989AEF6F6F6F8F8F8F8F8F8F7 + F7F7D8D8DF2323592B2B6D3636893F3FA14646B24B4BBE4D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC36464C8FFFFFFFFFFFFF6F6F6E3E3E3D5D5D55050 + 741E1E4D2222562929696969A0FFFFFFFFFFFFFEFEFEEFEFEFB0B0BE22225625 + 255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC35757C79A9ADD9B9BDD8F8FD95D5DC84E4EC34D4DC34D4DC34D4D + C34D4DC35E5EC97979D27878D26B6BCD4F4FC44D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC30200000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC24C4CC04A4ABB4747B44343A93E3E9D38388D + 32327D2B2B6ED3D3DFFFFFFFFEFEFEFCFCFCF9F9F98B8BAF303079E2E2ECFBFB + FBFAFAFAF8F8F8F3F3F381819B24245A2C2C7037378C4040A24747B34B4BBE4D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34C4CC0F3F3FAFFFFFFFEFEFE + EBEBEBDBDBDB8E8EA21E1E4C21215428286668689EFFFFFFFFFFFFFCFCFCEFEF + EFB0B0BE22225625255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC35757C79B9BDD8E8ED99D9DDE9A9ADD7272CF + 5252C54D4DC34D4DC34D4DC35F5FC97A7AD27373D07A7AD27373D05A5AC74E4E + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC30200000200004D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC24C4CC04A4ABB4747B44242A83D + 3D9A36368A3030792A2A6AA2A2B9FBFBFBFEFEFEFFFFFFFFFFFFFFFFFF5C5C9B + 5E5EA1FFFFFFFFFFFFFBFBFBF6F6F6EFEFEF48486F24245B2C2C7038388D4040 + A34747B44B4BBE4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34C4CC0CE + CEECFFFFFFFFFFFFF2F2F2E2E2E2C3C3C91E1E4C22225529296768689FFFFFFF + FFFFFFFCFCFCEEEEEEAFAFBD22225625255F2E2E7338388F4141A44747B44B4B + BF4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC35858C79C9CDE7878D265 + 65CB9494DB9E9EDE8383D55A5AC74D4DC34D4DC36060C97979D26161CA6060C9 + 7B7BD37878D16565CB4E4EC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC30200000200004D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34C4CC14A4ABC4747 + B44343A93C3C993535872F2F7735356F9E9EB4F5F5F5FCFCFCFFFFFFFFFFFFFF + FFFFC9C9DF3B3B949797C9FFFFFFFFFFFFFCFCFCF4F4F4ECECEC1F1F5024245A + 2C2C7037378C4040A34747B44B4BBE4D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34C4CC0AAAADDFFFFFFFFFFFFF7F7F7E7E7E7E0E0E02B2B5722225629 + 29696969A0FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD22225625255F2E2E7338388F + 4141A44747B44B4BBF4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC35858 + C79C9CDE7474D04E4EC35B5BC88585D6A0A0DF9191DA6363CA4D4DC36161CA79 + 79D25B5BC84D4DC35C5CC87373D07C7CD36D6DCE5353C54D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC302 + 00000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC2 + 4B4BBE4848B84444AC3D3D9B3636892F2F764F4F80C4C4CFF2F2F2FAFAFAFFFF + FFFFFFFFFFFFFFF2F2F75757A74141A4A7A7D6FFFFFFFFFFFFFBFBFBF1F1F1BF + BFC92020502323592B2B6E37378A4040A14646B24B4BBE4D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34B4BBE9D9DD7FFFFFFFFFFFFFAFAFAECECECE3E3 + E35555772323592B2B6D6969A3FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD22225625 + 255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC35858C79C9CDE7575D14F4FC44D4DC35656C67676D19B9BDD9A9A + DD7373D06666CC7979D25C5CC84D4DC34E4EC35757C66A6ACD7C7CD37474D05D + 5DC84E4EC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC30200000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34C4CC14A4ABB4646B14040A238388E30307975759BDEDEE1F1F1F1 + F9F9F9FFFFFFFFFFFFFFFFFFF2F2F76565B14343A94545B0CDCDE9FFFFFFFFFF + FFFBFBFBEEEEEEB0B0BE2020512323592A2A6B3535873F3F9E4545B04A4ABC4D + 4DC24D4DC34D4DC34D4DC34D4DC34D4DC34D4DC24B4BBD9C9CD5FFFFFFFFFFFF + FCFCFCEFEFEFE6E6E656567A25255D2E2E736B6BA7FFFFFFFFFFFFFCFCFCEEEE + EEAFAFBD22225625255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC35858C79D9DDE7575D14F4FC44D4DC34D4DC3 + 4E4EC36868CC9595DBA3A3E09292DA8585D65C5CC84D4DC34D4DC34D4DC35050 + C46363CB7B7BD37A7AD26767CC5252C54D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC30200000200004C4CC34C4CC34C4CC34C4C + C34C4CC34C4CC34C4CC34C4CC34B4BC04848B84343AB3C3C993F3F89AAAAC0EC + ECECF2F2F2FAFAFAFFFFFFFFFFFFFFFFFFF2F2F86565B44242AB4545B24747B5 + CDCDEAFFFFFFFFFFFFFBFBFBECECECAEAEBD2020532222572929683333823C3C + 9A4444AE4949BB4B4BC14C4CC34C4CC34C4CC34C4CC34C4CC34B4BC14848BA9B + 9BD4FFFFFFFFFFFFFDFDFDF1F1F1EAEAEA58587D27276430307B6C6CABFFFFFF + FFFFFFFCFCFCEEEEEEAFAFBD21215625255F2D2D7338388F4040A44646B44B4B + BF4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC35757C79D9DDE7575D14E + 4EC44C4CC34C4CC34C4CC34C4CC35E5EC98A8AD8ADADE4AEAEE47171CF4C4CC3 + 4C4CC34C4CC34C4CC34C4CC35C5CC87575D17E7ED46D6DCE5454C64C4CC34C4C + C34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C + 4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC30200000200004C4CC3 + 4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34A4ABE4646B44141A65D5D + A4C7C7D6EFEFEFF5F5F5FBFBFBFFFFFFFFFFFFFFFFFFD8D8EA5959B04444AE46 + 46B34747B54646B4CDCDEAFFFFFFFFFFFFFBFBFBECECECAEAEBE222256222257 + 27276430307C3A3A944242A84747B74B4BC04C4CC24C4CC34C4CC34C4CC34C4C + C24A4ABE4747B59A9AD0FFFFFFFFFFFFFDFDFDF2F2F2ECECEC4C4C782B2B6D34 + 34846F6FB1FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD21215625255F2D2D7338388F + 4040A44646B44B4BBF4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC35757 + C79D9DDE7575D14E4EC44C4CC34C4CC34C4CC34C4CC34C4CC35656C68989D8B8 + B8E7A6A6E17171CF5454C64C4CC34C4CC34C4CC34C4CC35555C66C6CCE7E7ED4 + 7474D05B5BC84E4EC44C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4C + C34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC302 + 00000200004D4DC34D4DC34D4DC34D4DC34E4EC34E4EC34E4EC34E4EC24C4CBE + 4747B26464B3E6E6EBF3F3F3F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFA4A4CD4F4F + AB4646B14848B54848B54747B34646B0C1C1E3FFFFFFFFFFFFFDFDFDECECECBA + BAC725255D2323592727622E2E7538388C4141A14747B14B4BBC4D4DC14E4EC3 + 4D4DC34D4DC24C4CC04949BA4646AEBFBFDFFFFFFFFFFFFFFDFDFDF3F3F3EFEF + EF2828643131793A3A8F7272B6FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD22225526 + 265F2F2F743A3A904343A54A4AB54E4EC05050C45050C45050C45050C45050C4 + 5050C44E4EC35A5AC79E9EDE7676D14F4FC44D4DC34D4DC34D4DC34D4DC34D4D + C34C4CC36262CA9090DAA2A2E0A3A3E08080D45959C74D4DC34C4CC34C4CC34C + 4CC34E4EC46565CB7D7DD37B7BD36363CB5050C44C4CC34C4CC34C4CC34C4CC3 + 4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4C + C34C4CC34C4CC30200000200005656C65757C75858C75B5BC85D5DC95D5DC95E + 5EC95E5EC85C5CC36161BDE1E1EEF8F8F8FBFBFBFEFEFEFFFFFFFFFFFFF2F2F6 + 8484B45151A65858B55858BD5858BC5656B85454B15656AEA4A4D1FFFFFFFFFF + FFFFFFFFEEEEEEDEDEDE3030692A2A602C2C643333724646895454A05E5EB366 + 66C06A6AC86969CB6464C96363C76161C36060BB5E5EAFDDDDEBFFFFFFFFFFFF + FDFDFDF5F5F5D9D9DF42427850508F5C5CA48C8CC4FFFFFFFFFFFFFCFCFCEEEE + EEB4B4BF34345B3A3A6447477B5959996767B17171C27878CE7C7CD37D7DD37D + 7DD37D7DD37E7ED47E7ED47E7ED38585D6A8A8E28585D66161CA6060CA6060CA + 6060CA6060CA6060CA5E5EC96C6CCE7878D26868CC8F8FDAA7A7E19696DC6262 + CB4F4FC44C4CC34C4CC34C4CC34C4CC35C5CC87878D28080D46E6ECE5252C54C + 4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC3 + 4C4CC34C4CC34C4CC34C4CC34C4CC30200000200006262CB6464CB6868CC6F6F + CF6F6FCF7070CF7171D07272CF7070CAB0B0DCFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFD9D9E26464935A5A9A6868B07070BE6E6EC26868BC6464B46363AD6767A8 + 8F8FBDFFFFFFFFFFFFFFFFFFF2F2F2E0E0E059598835356D33336A3B3B725A5A + 8A68689D7474B07F7FBF8787CB8A8ACE7F7FCB7A7AC87676C07777B77E7EB0FF + FFFFFFFFFFFFFFFFFDFDFDF6F6F6ACACBD66668F7777A68484B9A8A8CFFFFFFF + FFFFFFFCFCFCEEEEEEB9B9C046465E4E4E696060817777A08B8BB99A9ACDA5A5 + DAABABE1ADADE3AEAEE4AEAEE4AFAFE4B0B0E4B1B1E5B2B2E5ACACE39191DA77 + 77D17777D17777D17777D17878D27878D27979D27979D27171CF5A5AC85252C5 + 7C7CD3A4A4E0A7A7E16F6FCF5454C64D4DC34C4CC34C4CC34C4CC35454C66F6F + CF8080D47878D25858C74E4EC44C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C + 4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC30200000200005151C4 + 5151C45656C65B5BC75757C65353C45555C55555C55656C1F5F5FBFFFFFFFFFF + FFFFFFFFFFFFFFB0B0C439396F38387C3E3E8F4B4BA25858AF4F4FB04848A844 + 449F4444974C4C95454592F3F3F8FFFFFFFFFFFFFAFAFAE5E5E57676A4313177 + 2E2E6F3434725050824B4B8C4646974A4AA25B5BB06161B65353B24D4DAC4949 + A54E4E9D9797BDFFFFFFFFFFFFFFFFFFFDFDFDF8F8F86363974646914E4EA253 + 53AE8181C4FFFFFFFFFFFFFBFBFBEDEDEDB1B1BE2A2A572F2F6038387345458C + 4F4FA25858B45E5EC06161C76363C96363CA6363CA6363CA6464CA6565CA6666 + CB6464CA5858C65555C55555C55555C55555C55555C55656C55656C55757C654 + 54C54D4DC24C4CC24E4EC36767CB9D9DDEA9A9E28686D65757C64C4CC24C4CC2 + 4C4CC24C4CC24F4FC36565CB8181D47F7FD36464CA4D4DC24C4CC24C4CC24C4C + C24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC202 + 00000200004C4CC24C4CC25151C45757C65151C44C4CC24C4CC24C4CC27272CD + FFFFFFFFFFFFFFFFFFFFFFFFD4D4E24A4A7F38387531317B36368A42429A4E4E + A54444A43D3D9B6D6DAE55559B42428B3B3B8A9696C6FFFFFFFFFFFFFFFFFFED + EDEDA1A1C234348631317C3434794F4F8442428637378A3A3A944C4CA25252A8 + 4444A33D3D9D3B3B9641418ECDCDDFFFFFFFFFFFFFFFFFFFFEFEFEC5C5D93737 + 8D3D3D9C4242A84444AD7474C1FFFFFFFFFFFFFAFAFAECECECAEAEBD23235B26 + 26612C2C713535873C3C9A4242AA4747B64A4ABD4B4BC04C4CC24C4CC24C4CC2 + 4C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4C + C24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24D4DC25656C59292DAAAAAE29B + 9BDD6565CA4C4CC24C4CC24C4CC24C4CC24C4CC25A5AC77C7CD28181D47171CF + 5151C44C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4C + C24C4CC24C4CC20200000200004B4BC24B4BC25050C45656C65050C44B4BC24B + 4BC24B4BC27D7DD2FFFFFFFFFFFFFFFFFFFDFDFD7676AB4444833D3D7E32327F + 3535883E3E9449499D40409A5252A0F1F1F18585B44141893B3B8C48489DE5E5 + F3FFFFFFFFFFFFFAFAFAE5E5E546469C36368D39398655558D43438835358737 + 378E4747984C4C9C3F3F9738389236368B7171A7FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF6D6DAD3D3D9D4242AA4444B14545B17474C1FFFFFFFFFFFFF8F8F8EAEA + EAADADBF2828672A2A6D2E2E783535893B3B994141A84545B44949BC4A4AC04B + 4BC14B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24C4C + C24C4CC27979D2A5A5E1AAAAE27474D04C4CC24B4BC24B4BC24B4BC24B4BC251 + 51C46E6ECE8181D47B7BD25858C74C4CC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC20200000200004B4BC24B4BC25151C45656 + C65151C44B4BC24B4BC24B4BC27E7ED2FFFFFFFFFFFFFFFFFFFBFBFB3D3D974D + 4D9343438B34348635358A3D3D914646973D3D948181B5EEEEEE6B6BA643438E + 3D3D913D3D9D7474C0FFFFFFFFFFFFFFFFFFF4F4F49797C73D3D9F4141985E5E + 9C49499337378C37378E4545934949963C3C9136368C424290E5E5EFFFFFFFFF + FFFFFFFFFFFFFFFFA3A3CE3E3EA14343AD4545B44747B74646B48282C8FFFFFF + FFFFFFFCFCFCEEEEEEB2B2C62F2F7A30307D3333853838913D3D9D4141A84545 + B44848BA4A4ABF4B4BC14B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24C4CC26767CC9D9DDEACACE38888D75858C64B4B + C24B4BC24B4BC24B4BC24F4FC36363CA8181D48181D46666CB4F4FC34B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC20200000200004B4BC2 + 4B4BC25151C45656C65151C44B4BC24B4BC24B4BC24F4FC3F5F5FCFFFFFFFFFF + FFFFFFFF4E4EAB5656A64B4B9B3B3B9439399440409749499B3F3F97C1C1D9EF + EFEF6D6DAD4A4A9A42429E4141A64444B09191D4FFFFFFFFFFFFFFFFFFF2F2F2 + 6E6EBC4848A86A6AAF5050A23C3C983A3A9748489B4C4C9B3E3E95383891BCBC + DAFFFFFFFFFFFFFFFFFFFFFFFFD8D8EC4141A74444B04747B74848BA4848BB47 + 47B89C9CD6FFFFFFFFFFFFFFFFFFF7F7F7BABAD23838913939933B3B973D3D9E + 4040A64343AE4646B64949BC4A4AC04B4BC14B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24C4CC25959C79090D9 + ADADE39B9BDD6767CC4B4BC24B4BC24B4BC24B4BC24D4DC35959C77C7CD38383 + D57272CF5454C54B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC202 + 00000200004B4BC24B4BC25151C45656C65151C44B4BC24B4BC24B4BC24F4FC3 + B1B1E4FFFFFFFFFFFFFFFFFF9999D25E5EB55454AD4141A43E3EA14545A44E4E + A67F7FBFF8F8F8F4F4F47272B85151A94848AB4545B04747B74949BC9E9EDDF6 + F6FCFFFFFFFFFFFFE9E9F18282C87474BE5757B14141A63F3FA44D4DA65252A7 + 4E4EA7CBCBE5FFFFFFFFFFFFFFFFFFFFFFFFCCCCE85050B44646B44848BA4949 + BD4A4ABF4A4ABE4848BBC2C2E7FFFFFFFFFFFFFFFFFFFFFFFFE7E7EE4B4BA940 + 40A54141A74242AA4444AF4646B44848BA4949BD4A4AC04B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC25353C57F7FD3ABABE3A7A7E17575D04B4BC24B4BC24B4BC24B4BC2 + 4B4BC25353C57070CF8383D57B7BD25B5BC74B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC20200000200004B4BC24B4BC25151C45656C65151C44B4BC24B + 4BC24B4BC24F4FC37676D0DEDEF4FFFFFFFFFFFFFFFFFFA8A8D95A5ABA4646B1 + 4343AD4A4AAF9797D0F3F3FAFFFFFFFBFBFB7777C35757B64D4DB64848B84949 + BC4A4ABF6060C88A8AD7D5D5F0FFFFFFFFFFFFFBFBFBC3C3E38E8ECE4646B244 + 44AF7373BFA4A4D4F3F3F9FFFFFFFFFFFFFFFFFFFFFFFFA0A0D74646B64848BA + 4949BD4A4ABF4B4BC14B4BC17A7AD19E9EDCFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFBCBCE17373C55C5CBC4646B54747B74848BA4949BD4A4ABF4B4BC14B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC25050C46E6ECE9D9DDEAFAFE48888D755 + 55C54B4BC24B4BC24B4BC24B4BC25151C46666CB7F7FD48181D46666CB4D4DC3 + 4B4BC24B4BC24B4BC24B4BC24B4BC20200000200004B4BC24B4BC25151C45656 + C65151C44B4BC24B4BC24B4BC24F4FC36D6DCD5D5DC8A0A0DEFFFFFFFFFFFFFF + FFFFF3F3FACDCDEBCECEECF3F3FAFFFFFFFFFFFFFFFFFFFFFFFF7C7CCC5C5CC1 + 5050BF4B4BBE4A4AC04B4BC16060C97878D16161C97B7BD2C3C3EAFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3FABBBBE57979CB52 + 52BF4A4ABE4A4AC04B4BC14B4BC14B4BC24B4BC2FFFFFFFFFFFFF3F3FBCFCFEE + CECEEDCECEEDCECEEDDBDBF2FFFFFFFEFEFE9C9CD94949BD4949BD4A4ABF4A4A + C04B4BC14B4BC14B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC26161 + C99494DBB0B0E49494DB6868CC4B4BC24B4BC24B4BC24B4BC24C4CC25D5DC87C + 7CD38585D66E6ECE5454C54B4BC24B4BC24B4BC24B4BC20200000200004B4BC2 + 4B4BC25151C45656C65151C44B4BC24B4BC24B4BC24F4FC36E6ECE5D5DC84C4C + C25757C69595DBBABAE7D5D5F1CFCFEECFCFEEC5C5EBA9A9E1A2A2DE9292D97A + 7AD05C5CC66060C75353C44C4CC14B4BC24B4BC26060C97878D16161C94B4BC2 + 4B4BC25F5FC9ABABE2ACACE3C3C3EACFCFEED4D4F0D5D5F0A2A2DE8686D45656 + C35A5AC66868CA5555C44B4BC14B4BC24B4BC24B4BC24B4BC24B4BC27B7BD26F + 6FCE4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC26363CA7B7BD26363CA4B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC25858C78787D6AFAFE4A6A6E17575D05050C44B4BC24B4B + C24B4BC24B4BC25858C67575D08585D67777D15B5BC74B4BC24B4BC24B4BC202 + 00000200004A4AC24A4AC25050C45656C65050C44A4AC24A4AC24A4AC24E4EC3 + 6D6DCE5C5CC84B4BC24A4AC24E4EC36C6CCD6161CA4C4CC34A4AC25353C55E5E + C95151C44A4AC24A4AC25050C46060C95353C54B4BC24A4AC24A4AC26060C978 + 78D26161CA4A4AC24A4AC25353C58181D56464CB4B4BC24A4AC25D5DC86363CA + 5050C44A4AC24A4AC25A5AC86969CC5454C54A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24F4FC47676D1A2A2E0B1B1E5 + 8383D55A5AC84B4BC24A4AC24A4AC24A4AC25050C46B6BCD8282D58080D46161 + CA4E4EC34A4AC20200000200004A4AC24A4AC25050C45656C65050C44A4AC24A + 4AC24A4AC24E4EC36D6DCE5C5CC84B4BC24A4AC24E4EC36D6DCE6262CA4C4CC3 + 4A4AC25353C55F5FC95151C44A4AC24A4AC25050C46161CA5353C54B4BC24A4A + C24A4AC26060C97878D26161CA4A4AC24A4AC25353C58282D56464CB4B4BC24A + 4AC25D5DC86464CB5050C44A4AC24A4AC25A5AC86969CD5454C54A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24B + 4BC26060C99191DAB2B2E59696DC6363CA4A4AC24A4AC24A4AC24A4AC24C4CC3 + 5F5FC97A7AD28484D66B6BCD5252C50200000200004A4AC24A4AC25050C45656 + C65050C44A4AC24A4AC24A4AC24E4EC36E6ECE5C5CC84B4BC24A4AC24E4EC36D + 6DCE6262CA4C4CC34A4AC25353C55F5FC95151C44A4AC24A4AC25050C46161CA + 5353C54B4BC24A4AC24A4AC26060C97979D26161CA4A4AC24A4AC25454C58383 + D56464CB4B4BC24A4AC25D5DC86464CB5050C44A4AC24A4AC25A5AC86969CD54 + 54C54A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24B4BC26060C9ABABE3B3B3E58080D44A4AC24A4AC24A + 4AC24A4AC24A4AC24B4BC26262CA8686D68282D55E5EC90200000200004A4AC2 + 4A4AC25050C45656C65050C44A4AC24A4AC24A4AC24E4EC36E6ECE5C5CC84B4B + C24A4AC24E4EC36D6DCE6262CA4C4CC34A4AC25353C55F5FC95151C44A4AC24A + 4AC25050C46161CA5353C54B4BC24A4AC24A4AC26161CA7A7AD26161CA4A4AC2 + 4A4AC25454C58383D56464CB4B4BC24A4AC25D5DC86464CB5151C44A4AC24A4A + C25A5AC86969CD5454C54A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24D4DC36262CA9E9EDEAEAEE49999DD5959 + C74A4AC24A4AC24A4AC24A4AC24C4CC36262CA8080D48181D56C6CCD4B4BC202 + 00000200004A4AC24A4AC25050C45757C65050C44A4AC24A4AC24A4AC24E4EC3 + 6F6FCE5C5CC84B4BC24A4AC24F4FC46D6DCE6363CA4C4CC34A4AC25353C55F5F + C95151C44A4AC24A4AC25050C46161CA5353C54B4BC24A4AC24A4AC26161CA7A + 7AD26161CA4A4AC24A4AC25454C58383D56464CB4B4BC24A4AC25E5EC96464CB + 5151C44A4AC24A4AC25B5BC86A6ACD5454C54A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC25050C47070CFAEAEE4B0B0E4 + 8383D55050C44A4AC24A4AC24A4AC24A4AC24F4FC46B6BCD8686D67F7FD46060 + C94A4AC24A4AC20200000200004A4AC14A4AC15050C35757C55050C34A4AC14A + 4AC14A4AC14E4EC27070CE5D5DC84B4BC14A4AC14F4FC36D6DCD6363CA4C4CC2 + 4A4AC15353C45F5FC85151C34A4AC14A4AC15050C36161C95353C44B4BC14A4A + C14A4AC16161C97A7AD26161C94A4AC14A4AC15454C48484D56565CA4B4BC14A + 4AC15E5EC86464CA5151C34A4AC14A4AC15B5BC76A6ACC5454C44A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4A + C14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A + 4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4A + C14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC15656C58A8AD7B2 + B2E4A6A6E16969CB4B4BC14A4AC14A4AC14A4AC14A4AC15757C57777D08585D5 + 7575D05353C44A4AC14A4AC14A4AC10200000200004A4AC14A4AC15050C35757 + C55050C34A4AC14A4AC14A4AC14E4EC27070CE5E5EC84B4BC14A4AC14F4FC36F + 6FCE6464CA4C4CC24A4AC15353C45F5FC85252C44A4AC14A4AC15050C36262C9 + 5353C44B4BC14A4AC14A4AC16161C97B7BD26262C94A4AC14A4AC15454C48585 + D56565CA4B4BC14A4AC15E5EC86565CA5151C34A4AC14A4AC15B5BC76B6BCC54 + 54C44A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4A + C14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A + 4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC16464 + CAA1A1DFB2B2E49797DB5656C54B4BC14A4AC14A4AC14A4AC14A4AC16161C980 + 80D38585D56B6BCC4B4BC14A4AC14A4AC14A4AC14A4AC10200000200004949C1 + 4949C14F4FC35757C64F4FC34949C14949C14949C14D4DC27070CE5D5DC84A4A + C14949C14E4EC36E6ECE6363CA4B4BC24949C15252C45F5FC95151C44949C14A + 4AC14F4FC36161C95252C44A4AC14949C14949C16060C97B7BD26161C94949C1 + 4949C15353C48484D56464CA4A4AC14949C15D5DC86464CA5050C34949C14949 + C15A5AC76A6ACC5454C54949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C17272CFADADE3ACACE37E7ED34C4CC24949C14949C14949C14949C14A4A + C16C6CCD8484D57D7DD35E5EC84949C14949C14949C14949C14949C14949C102 + 00000200004949C14949C15050C35757C65050C34949C14949C14949C14D4DC2 + 7070CE5D5DC84A4AC14949C14E4EC36F6FCE6363CA4B4BC24949C15252C45F5F + C95151C44949C14A4AC14F4FC36161C95252C44A4AC14949C14949C16161C97B + 7BD26161C94949C14949C15353C48585D56565CA4A4AC14949C15E5EC86464CA + 5050C34949C14949C15A5AC76A6ACC5454C54949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C15757C68B8BD7B0B0E4A0A0DF6868CC4C4CC24949C14949C14949C1 + 4949C15656C57777D18484D57272CF5656C54A4AC14949C14949C14949C14949 + C14949C14949C10200000200004949C14949C15050C35757C65050C34949C149 + 49C14949C14D4DC27070CE5D5DC84A4AC14949C14E4EC36F6FCE6363CA4B4BC2 + 4949C15252C45F5FC95151C44949C14A4AC14F4FC36262CA5252C44A4AC14949 + C14949C16161C97C7CD26161C94949C14949C15353C48686D66565CA4A4AC149 + 49C15E5EC86565CA5050C34949C14949C15A5AC76B6BCC5454C54949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C16565CA9999DCB0B0E49696DB5C5CC74A4AC14949C149 + 49C14949C14949C16262CA7C7CD28484D56A6ACC5050C34949C14949C14949C1 + 4949C14949C14949C14949C14949C10200000200004949C14949C15050C35757 + C65050C34949C14949C14949C14D4DC27171CF5E5EC84A4AC14949C14E4EC370 + 70CE6363CA4B4BC24949C15353C46060C95151C44949C14A4AC15050C36262CA + 5252C44A4AC14949C14949C16161C97C7CD26262CA4949C14949C15353C48686 + D66666CB4A4AC14949C15E5EC86565CA5050C34949C14949C15B5BC76B6BCC54 + 54C54949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C17676D0A9A9E2ADADE37F7FD35252C44949 + C14949C14949C14949C14D4DC26C6CCD8484D57D7DD35F5FC94C4CC24949C149 + 49C14949C14949C14949C14949C14949C14949C14949C10200000200004949C1 + 4949C15050C35757C65050C34949C14949C14949C14D4DC27171CF5E5EC84A4A + C14949C14E4EC37070CE6363CA4B4BC24949C15353C46060C95151C44949C14A + 4AC15050C36262CA5252C44A4AC14949C14949C16161C97C7CD26262CA4949C1 + 4949C15353C48686D66666CB4A4AC14949C15E5EC86565CA5050C34949C14949 + C15B5BC76B6BCC5454C54949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C15959C78787D6AEAEE49E9EDE6E6ECE + 4E4EC34949C14949C14949C14A4AC15959C77575D08484D57171CF5858C64A4A + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C102 + 00000200004949C14949C15050C35757C65050C34949C14949C14949C14D4DC2 + 7272CF5E5EC84A4AC14949C14E4EC37171CF6262CA4A4AC14949C15353C46060 + C95151C44949C14A4AC15050C36363CA5151C44A4AC14949C14949C16161C97C + 7CD26262CA4949C14949C15454C58686D66363CA4A4AC14949C15E5EC86565CA + 5050C34949C14949C15B5BC76B6BCC5353C44949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14A4AC16666CB9595DBAFAFE492 + 92DA6161C94A4AC14949C14949C14949C14D4DC26262CA7C7CD28383D56969CC + 5050C34949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C10200000200005454C55454C55C5CC86262CA5F5FC95959C65B + 5BC75B5BC75F5FC87777D16464CA5050C34F4FC35555C57676D07171CE6060C8 + 5D5DC86565CB6E6ECE6262C95959C75A5AC76060C87272CF6868CC6363CA6363 + CA6060C97474D08686D66B6BCD5252C45353C45D5DC78E8ED87979D16767CB66 + 66CB7575D07979D16565CB5F5FC95F5FC96F6FCE7F7FD37070CF6969CC6B6BCD + 6B6BCD6C6CCD6C6CCD6C6CCD6C6CCD6D6DCD6D6DCD6D6DCD6E6ECD6F6FCE6F6F + CE6F6FCE6F6FCE7070CE7070CE7070CE7070CE7171CF7171CF7171CF7272CF72 + 72CF7373CF7373CF7373CF7373CF7474CF7171CE6363CA5A5AC75959C75959C7 + 5959C75959C75959C75A5AC75A5AC75656C54D4DC24949C14E4EC37575D0A8A8 + E1AAAAE28383D55252C44949C14949C14949C14949C15050C36C6CCD8383D57B + 7BD26161C94949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C10200000200006767CB6767CB6D6DCE7474 + D07878D17777D17878D17979D27A7AD27C7CD36969CC5B5BC75B5BC75E5EC979 + 79D28383D58282D58282D58585D68282D57979D27676D17777D17B7BD28989D7 + 8A8AD78B8BD88C8CD88C8CD89191DA8C8CD97373CF6363CA6363CA6B6BCD9898 + DC9696DB9595DB9595DB9999DC9494DB8888D78484D58585D69090D99F9FDE9D + 9DDE9D9DDE9E9EDE9F9FDEA0A0DEA0A0DFA1A1DFA2A2E0A3A3E0A4A4E0A4A4E0 + A6A6E1A7A7E1A7A7E1A7A7E1A8A8E2A9A9E2AAAAE2ABABE2ABABE3ACACE3ADAD + E3AEAEE4AEAEE4AFAFE4AFAFE4B0B0E4B0B0E4B2B2E5B2B2E5B3B3E59292DA75 + 75D07575D07575D07575D07676D17676D17676D17A7AD27272CF5757C65B5BC7 + 8484D5AEAEE49C9CDD6D6DCE4C4CC24848C14848C14848C14949C15757C67373 + D08282D57171CF5555C54848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C10200000200005B5BC8 + 5C5CC85D5DC86262CA6666CB6767CB6767CB6868CB6969CC6565CB5858C75454 + C55353C55454C56363CA6C6CCD6E6ECE6E6ECE6E6ECE6C6CCD6666CB6565CB65 + 65CB6767CC7171CF7272D07474D07474D07575D07878D16D6DCE5D5DC85959C7 + 5959C75D5DC87575D07A7AD27B7BD27C7CD27C7CD27474D06F6FCE6F6FCE6F6F + CE7474D07E7ED38181D48181D48181D48383D58383D58383D58484D68484D685 + 85D68585D68686D68787D68787D68888D78989D78989D78989D78989D78B8BD8 + 8B8BD88B8BD88C8CD88C8CD88E8ED98E8ED98E8ED98E8ED98E8ED98E8ED99595 + DBB3B3E58D8DD86666CB6565CB6565CB6565CB6565CB6565CB6363CA7171CF7C + 7CD37474D09595DBAEAEE49191DA5A5AC74949C14848C14848C14848C14B4BC2 + 5F5FC97A7AD28181D46868CC4C4CC24848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C102 + 00000200004848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C15656C6A6A6E17777D14A4AC24848C14848C14848C14848C14848 + C14848C16464CB9B9BDEB0B0E4A9A9E27F7FD44949C14848C14848C14848C148 + 48C14D4DC36A6ACC8181D47C7CD35E5EC84848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C10200000200004848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C15656C6A7A7E17878D14A4AC24848C14848C1 + 4848C14848C14848C15252C49191DAC4C4EBA9A9E26B6BCD4848C14848C14848 + C14848C14949C15151C47373D08181D47272CF5555C54848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C10200000200004848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C15656C6A7A7E17878D14A + 4AC24848C14848C14848C14848C16060C99898DCB7B7E7AFAFE46868CB4848C1 + 4848C14848C14848C14848C15D5DC87C7CD38181D46767CB4C4CC24848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C10200000200004848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C05656 + C5A7A7E17878D14A4AC14848C04848C04848C07272CFA5A5E0ACACE38D8DD87E + 7ED25B5BC64848C04848C04848C04B4BC16B6BCC7F7FD37E7ED35C5CC74848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C002 + 00000200004848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C05656C5A7A7E17878D14A4AC14848C04B4BC18585D5ABABE29E9E + DE6868CB5F5FC87D7DD25B5BC64848C04949C05050C37474CF8181D47373CF53 + 53C44848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C00200000200004848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C05656C5A8A8E17878D14949C05F5FC89797DB + ACACE28C8CD75B5BC64848C06060C87E7ED35A5AC64848C05F5FC87C7CD28181 + D46565CA4F4FC24848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C00200000200004747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C05555C5A8A8E17878D178 + 78D19F9FDEABABE27878D15151C34747C04747C05F5FC87C7CD26060C86868CB + 7F7FD37C7CD25959C64B4BC14747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C00200000200004747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C05555 + C5A8A8E19E9EDEAAAAE29D9DDD6A6ACC4B4BC14747C04747C04747C05D5DC87F + 7FD37A7AD17F7FD36F6FCE5353C44747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C002 + 00000200004747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C05454C4A9A9E2A9A9E28888D65F5FC84949C14747C04747C04747 + C04747C05D5DC87F7FD37B7BD26464CA4E4EC24747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C00200000200004747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C05050C38F8FD97A7AD15252C44848C04747C0 + 4747C04747C04747C04747C05858C67070CE5D5DC84848C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C00200000200004747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04848C05555C54747C047 + 47C04747C04747C04747C04747C04747C04747C04B4BC14D4DC24747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C00200000200004747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C002 + 00000200004747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C00200000200004747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C00200000200004646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C00200000200004646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C002 + 00000200004545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD45 + 45BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD45 + 45BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD45 + 45BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD0200000200004242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242 + B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242 + B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242 + B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B80200000200003F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB1 + 3F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB1 + 3F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB1 + 3F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB10200000200003A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A + 3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A + 3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A + 3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA602 + 0000020000333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 9933339933339933339933339933339933339933339933339933339933339933 + 3399333399333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 9933339933339933339933339933339933339933339933339933339933339933 + 3399333399333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 9933339933339933339933339933339933339933339933339933339933339933 + 3399333399333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 993333993333990200000200002C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C + 8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C + 8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C + 8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A0200000200002323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378232378232378232378 + 2323782323782323782323782323782323782323782323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378232378232378232378 + 2323782323782323782323782323782323782323782323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378232378232378232378 + 2323782323782323782323782323782323782323782323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378020000020000191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196419 + 1964191964191964191964191964191964191964191964191964191964191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196419 + 1964191964191964191964191964191964191964191964191964191964191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196419 + 1964191964191964191964191964191964191964191964191964191964191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196402 + 00000200000E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E + 0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E + 0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E + 0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C02000002000008083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F02000002000008083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F02000002000008083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F02 + 00000200005E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E + 5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E + 5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E + 5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB00200000200005757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757 + AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757 + AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757 + AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC0200000200004A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA6 + 4A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA6 + 4A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA6 + 4A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA60200000200003B3B9F + 3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B + 9E3A3A9C39399A38389838389738389738389738389839399B3A3A9D3B3B9E3B + 3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9E3A3A9C39399A383898383898383898 + 39399A3A3A9D3B3B9E3B3B9F3B3B9E3B3B9E3A3A9C39399B39399A39399A3939 + 9A39399A39399B3A3A9C3B3B9E3B3B9E3B3B9F3B3B9F3B3B9F3B3B9F3B3B9E3A + 3A9D39399A38389838389738389839399A39399B3A3A9D3B3B9E3B3B9F3B3B9F + 3B3B9F3B3B9F3B3B9E3A3A9D39399B39399A39399A39399A39399A39399A3939 + 9A39399A39399A39399A39399A39399A39399A39399A39399B3A3A9C3A3A9D3B + 3B9E3A3A9D39399A38389838389838389939399A39399B39399B39399A39399A + 39399A3A3A9C3B3B9E3B3B9E3B3B9E3A3A9D3A3A9D3A3A9D3A3A9D3A3A9C3939 + 9A38389838389838389939399B3A3A9D3B3B9E3B3B9F3B3B9F3B3B9F3B3B9F02 + 00000200002C2C972C2C972C2C972C2C972C2C972C2C972C2C972C2C972C2C96 + 2B2B952A2A9229298D2727872525832525812424802525812525822525832626 + 8628288B2A2A902B2B952C2C962C2C972B2B952A2A9229298D27278725258225 + 258125258125258226268427278829298D2A2A922B2B942A2A9229298D272787 + 25258325258225258225258327278729298D2A2A922C2C962C2C972C2C972C2C + 962B2B9429298F27278926268425258124248025258126268427278729298D2A + 2A922B2B952C2C972C2C972C2C962B2B942A2A9028288A262686252583252582 + 2525812525822525832626842626852626852626842525822525822525822626 + 8528288A29298F29298F28288A26268424248024248025258226268526268626 + 268525258225258125258327278829298F2A2A922A2A9229298E28288A28288A + 28288927278726268425258124247F25258126268528288B2A2A912B2B952C2C + 972C2C972C2C970200000200001F1F911F1F911F1F911F1F911F1F911F1F911F + 1F911F1F901E1E8D1D1D871B1B7E18187416166C15156815156916166B16166D + 17176E17176F1717711818751A1A7D1C1C861E1E8C1E1E8D1D1D881B1B7F1818 + 7416166C15156815156916166A16166A16166A16166E1818751B1B801D1D871D + 1D871B1B7E1818731515691414631414631515691818731B1B7F1D1D891F1F8F + 1F1F911F1F901E1E8D1C1C8519197A17176E15156715156615156916166C1717 + 701818731919791B1B811D1D891F1F8F1F1F911F1F901E1E8D1C1C861A1A7C18 + 187216166A14146514146214146315156817176F18187318187417177116166C + 15156814146516166A1818741A1A7D1A1A7B1717711515661313611414631616 + 6A17176F17176F16166A1414641414621515681818731B1B801D1D871C1C841A + 1A7B18187317177017177017177016166E16166A151566141463151568181872 + 1B1B7F1D1D8A1F1F8F1F1F911F1F9102000002000016168C16168C16168C1616 + 8C16168C16168C16168C1515881414801212730F0F630D0D570C0C520C0C550E + 0E5D0F0F6610106B10106B1010690F0F640F0F6310106812127313137D141480 + 1212760F0F660D0D570C0C510C0C560E0E5E0F0F630E0E5F0C0C560C0C530D0D + 580F0F6712127613137D1212760F0F670C0C540A0A490A0A490C0C540F0F6712 + 127815158516168A16168C1515891414811111710E0E5F0C0C520B0B4E0C0C55 + 0E0E5E0F0F650F0F660F0F6610106911117113137D15158716168C16168C1515 + 881414811212761010680D0D580B0B4C0909450A0A490C0C530F0F6210106B11 + 116E1010690E0E620D0D580B0B500C0C540E0E6010106D1010690D0D5A0A0A4B + 0A0A470B0B4E0D0D5A0E0E5E0D0D5A0B0B500A0A480A0A490C0C530F0F641212 + 7413137E13137910106A0D0D5A0C0C530C0C560D0D5C0E0E610E0E600D0D580B + 0B4E0B0B4D0D0D5710106913137A15158616168C16168C0200000200000F0F89 + 0F0F890F0F890F0F890F0F890F0F890F0F860E0E7E0C0C6E09095B4545778383 + A1A3A3BAC2C2D5C2C2D9C3C3DCA5A5CC7777B22A2A840B0B6A0A0A610A0A5E0B + 0B660C0C710C0C710A0A635555868383A1C1C1D1C2C2D4A4A4C58585B5383881 + 0808510606440606430808516767A08686BB8686BA8585B28383A582829D8282 + 9D64648F0B0B650D0D780E0E850F0F880F0F890E0E820C0C7438387C8383A4A2 + A2B7C1C1D0C2C2D49494B867679F0A0A640A0A5F0A0A5D0A0A640C0C720E0E80 + 0F0F882D2D988787C38787C18686BC8585B58484AA8383A182829B82829D8383 + A58585B18686B88686BB8686B98585B58585AF65659308085009095B39398485 + 85B2A3A3BFC1C1D19393AB8383A336367328286C8484A8C1C1D082829C54547A + 08084D0A0A640C0C754A4A9E7777B119196907074A54547D8383A4A3A3C1C3C3 + D9A4A4C77575A426266006063F0606420808540B0B6B0E0E7D0F0F870F0F8902 + 00000200000C0C870C0C870C0C870C0C870C0C870C0C870B0B800A0A7265659A + E1E1E9FFFFFFFFFFFFF0F0F4A3A3C38585B88585BEA4A4D0F1F1F8FFFFFF7676 + B209096B08086409096709096B565697F0F0F5FFFFFFFFFFFFE1E1E87474A0C2 + C2DBFFFFFFFFFFFFE1E1EA53537B0404380505436464989494C2FFFFFFFFFFFF + FFFFFFFFFFFF9292A864648E0909650A0A770B0B800B0B800B0B800B0B7AA3A3 + C7FFFFFFFFFFFFFFFFFFC1C1D08383A8B2B2CDF0F0F6E1E1EC55558C07075408 + 085C09096D0B0B7C0C0C852A2A968686C39595CAF1F1F7FFFFFFFFFFFFFFFFFF + FFFFFF9292A88383A59494BCC3C3DEF1F1F8FFFFFFFFFFFFFFFFFFC2C2D70808 + 5B555593FFFFFFFFFFFFFFFFFFFFFFFFA2A2B8B2B2C6FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFE0E0E7B2B2C81818710B0B798585BFFFFFFFD1D1E1C1C1D0FFFFFF + E1E1E8A3A3C2FFFFFFFFFFFFFFFFFFF0F0F433335F04043705054608085E0A0A + 760C0C830C0C870200000200000B0B870B0B870B0B870B0B870B0B870B0B8619 + 1984B2B2D1FFFFFFFFFFFFFFFFFFD1D1DB1616580808680A0A7B0B0B860B0B87 + 1A1A8FD2D2E9FFFFFFC2C2DE18187E0909756666A8FFFFFFFFFFFFFFFFFFB1B1 + C0040441070758090971E1E1EFFFFFFFFFFFFFFFFFFF52527504044107075809 + 0972FFFFFFFFFFFFFFFFFFFFFFFF04043705054807076109096F090973090972 + 090973A3A3CAFFFFFFFFFFFFFFFFFF81819A04044006065307075E171769B2B2 + CAFFFFFF44447706065508086A0A0A7B0B0B850B0B870B0B870B0B879595C9FF + FFFFFFFFFFFFFFFFFFFFFF04043806064C0808690A0A7D1A1A8F6767B4FFFFFF + FFFFFFC2C2DD0909707575B0FFFFFFFFFFFFFFFFFFE1E1EA05054805054B7373 + 9FFFFFFFFFFFFFFFFFFFC1C1CD14144944447E09096E0A0A7F8585C1FFFFFFFF + FFFFFFFFFFA1A1B505054307075C282884FFFFFFFFFFFFFFFFFFF0F0F323234E + 05054307075C0909740B0B820B0B870200000200000B0B870B0B870B0B870B0B + 870B0B870B0B859494C5FFFFFFFFFFFFFFFFFFFFFFFF43436D06065109096D0A + 0A7F0B0B870B0B870B0B871A1A8FD2D2E9FFFFFF8585BF0A0A7DF1F1F7FFFFFF + FFFFFFFFFFFF82829D0404400606520808668484B7FFFFFFFFFFFFFFFFFFC1C1 + CF05054807075E090972FFFFFFFFFFFFFFFFFFFFFFFF03033505054306065507 + 075D07075B07075836367DFFFFFFFFFFFFFFFFFFFFFFFF62628444447144447F + 45458645458344447763638924245C07075709096E0A0A7E0B0B860B0B870B0B + 870B0B878585C1FFFFFFFFFFFFFFFFFFFFFFFF04043806064C0808690A0A7D0B + 0B870B0B878585C3FFFFFFC2C2E00A0A7F191988C2C2E0FFFFFFFFFFFFFFFFFF + B2B2C744447A454581FFFFFFFFFFFFFFFFFFC1C1CE0505410707580909720A0A + 818585C1FFFFFFFFFFFFFFFFFF53537604043F060654080866D1D1E4FFFFFFFF + FFFFFFFFFFA1A1B605054A0808630A0A780B0B840B0B870200000200000B0B87 + 0B0B870B0B870B0B870B0B872A2A93FFFFFFFFFFFFFFFFFFFFFFFFD1D1D90404 + 3C06065209096D0A0A800B0B870B0B870B0B870B0B870B0B840A0A7E0A0A790A + 0A79FFFFFFFFFFFFFFFFFFFFFFFF63638D05054606064F07075D8484B1FFFFFF + FFFFFFFFFFFFC1C1D207075908086B090977FFFFFFFFFFFFFFFFFFFFFFFF0404 + 3C05054506064F06065106064D06064C444480FFFFFFFFFFFFFFFFFFFFFFFFC1 + C1D2C1C1D2C1C1D5FFFFFFFFFFFFFFFFFFFFFFFF73739B0808610909750B0B82 + 0B0B870B0B870B0B870B0B878585C1FFFFFFFFFFFFFFFFFFFFFFFF0404380606 + 4C0808690A0A7D0B0B870B0B870B0B874848A539399E0B0B860B0B860B0B8438 + 38959393BFC2C2D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1C1D006064D + 0808620A0A770B0B838585C1FFFFFFFFFFFFFFFFFF43436804043B06064C0707 + 5AC2C2D7FFFFFFFFFFFFFFFFFFC1C1D207075A09096F0A0A7E0B0B860B0B8702 + 00000200000B0B870B0B870B0B870B0B870B0B876767B3FFFFFFFFFFFFFFFFFF + FFFFFFC1C1CC04043A06064F08086B0A0A7D0B0B870B0B870B0B870B0B840A0A + 7C09096F080866080869C2C2DDFFFFFFFFFFFFFFFFFF9393B907075706065607 + 075AB2B2CDFFFFFFFFFFFFFFFFFFA3A3C409096E0A0A780A0A7AFFFFFFFFFFFF + FFFFFFFFFFFF35356F252569C2C2D5E1E1EAB2B2C9353572171766F0F0F6FFFF + FFFFFFFFFFFFFF17176707075907075CC2C2D7FFFFFFFFFFFFE1E1EB17176C09 + 09720A0A7E0B0B850B0B870B0B870B0B870B0B878585C1FFFFFFFFFFFFFFFFFF + FFFFFF04043806064C0808690A0A7D0B0B870B0B870B0B870B0B870B0B870B0B + 870B0B875858ACC2C2E0E1E1EE9393BC07075B07075B64649CFFFFFFFFFFFFFF + FFFFC1C1D50707600909700A0A7E0B0B858585C1FFFFFFFFFFFFFFFFFF72728E + 04043A050549060656F0F0F5FFFFFFFFFFFFFFFFFF64649A09096C0A0A7B0B0B + 840B0B870B0B870200000200000B0B870B0B870B0B870B0B870B0B877676BCFF + FFFFFFFFFFFFFFFFFFFFFFC1C1CE04043A0505480707610909740A0A800B0B83 + 0A0A810A0A7A09096D07075B06065307075A282881D2D2E7FFFFFFFFFFFFF1F1 + F76666A508086B6565A1FFFFFFFFFFFFFFFFFFD2D2E51818800A0A7E0B0B8229 + 2990FFFFFFFFFFFFFFFFFFFFFFFFD1D1E3B2B2D1FFFFFFFFFFFFFFFFFFA3A3C7 + 0909706666ABFFFFFFFFFFFFFFFFFF7575B009096E27277EFFFFFFFFFFFFFFFF + FF6666A50909760A0A7F0B0B840B0B870B0B870B0B870B0B870B0B858585BFFF + FFFFFFFFFFFFFFFFFFFFFF0404370505490808650A0A790B0B850B0B860B0B87 + 0B0B870B0B870B0B870B0B879595CBFFFFFFFFFFFFF1F1F709097009096D7575 + ADFFFFFFFFFFFFFFFFFF9494BF0909750A0A7E0B0B840B0B868585C0FFFFFFFF + FFFFFFFFFFE0E0E7727292545486C2C2D8FFFFFFFFFFFFFFFFFFB2B2D1090974 + 0A0A7C0B0B830B0B870B0B870B0B870200000200000B0B870B0B870B0B870B0B + 870B0B8739399EFFFFFFFFFFFFFFFFFFFFFFFFC1C1D104044005054606065608 + 08670909730A0A7709097509096DB2B2CDC1C1D405054906065409096C191986 + 8585C3E1E1F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2E66666AE0A0A800B0B + 830B0B86C3C3E1FFFFFFFFFFFFFFFFFFFFFFFFB3B3D7C2C2DFFFFFFFFFFFFFFF + FFFFF1F1F747479D0A0A7F0B0B832A2A95A4A4D2F1F1F8FFFFFFD2D2E7FFFFFF + FFFFFFE1E1EF8585BE0A0A7F0B0B820B0B850B0B870B0B870B0B870B0B870B0B + 850A0A818585BBFFFFFFFFFFFFFFFFFFFFFFFF04043A0505490707600909730A + 0A800B0B840B0B870B0B870B0B870B0B870B0B870B0B877676BCE1E1F0FFFFFF + C2C2E0D2D2E7FFFFFFFFFFFFFFFFFF8585BD0A0A7E0B0B820B0B850B0B860B0B + 858585BEFFFFFFFFFFFFFFFFFFD1D1DAF0F0F4FFFFFFFFFFFFFFFFFFFFFFFFA4 + A4CE1919860A0A810B0B850B0B870B0B870B0B870B0B870200000200000B0B87 + 0B0B870B0B870B0B870B0B870B0B87C3C3E1FFFFFFFFFFFFFFFFFFFFFFFF1616 + 5C06064E06065307075D08086708086B08086B8484B2FFFFFFFFFFFF06065107 + 075D0909710A0A800B0B870B0B871A1A8F4848A54848A54848A40B0B850B0B86 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B8739399E2A2A960B0B + 870B0B8739399E39399E0B0B870B0B870B0B870B0B870B0B870B0B870B0B8739 + 399E4848A54848A42A2A940B0B850B0B860B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B830A0A7D8484B8FFFFFFFFFFFFFFFFFFFFFFFF0505460606 + 4F07075E09096D0A0A7A0B0B820B0B860B0B870B0B870B0B870B0B870B0B870B + 0B870B0B871A1A8F4848A54848A54848A439399C0B0B850B0B860B0B870B0B87 + 0B0B870B0B860B0B828585BCFFFFFFFFFFFFFFFFFF8282A106064C0707604747 + 982A2A920B0B860B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B8702 + 00000200000B0B870B0B870B0B870B0B870B0B870B0B871A1A8FD2D2E9FFFFFF + FFFFFFFFFFFFA3A3C70808620707600808620808660808697474ABFFFFFFFFFF + FFFFFFFF08086609096D0A0A7A0B0B830B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B830A0A7D9494C2FFFFFFFFFFFFFFFFFF + FFFFFF07075D0707600808680909710A0A7A0B0B820B0B860B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B860A0A818585BCFFFFFFFFFFFFFFFFFF8383AB + 07075C08086B0A0A7A0B0B840B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870200000200000B0B870B0B870B0B870B0B870B0B870B0B870B + 0B871A1A8F9595CBFFFFFFFFFFFFFFFFFFE1E1EE7575B14747956666A8C2C2DD + FFFFFFFFFFFFFFFFFFF1F1F70A0A790A0A7D0A0A810B0B850B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B872A2A968585C2A4A4D0F1F1F7FF + FFFFFFFFFFFFFFFFFFFFFFC2C2DC8484BA4747990A0A7A0A0A800B0B840B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B872A2A964848A2C2C2DFFFFFFFFF + FFFFFFFFFF8484B70909720A0A790A0A810B0B860B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870200000200000B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B871A1A8F6767B49595CAC3C3E1C3C3E0C2 + C2E0C2C2E08585C05757A90B0B827676BA6767B30B0B850B0B850B0B860B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B872A2A968585 + C38585C28585C28585C18585C18585C18585C18585C18585C14848A10B0B830B + 0B850B0B860B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B876767B4C3C3 + E1C3C3E1C2C2E0C2C2E0F1F1F88585C00A0A800B0B820B0B850B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870200000200000B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B8702 + 00000200000B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870200000200000B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870200000200000B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000} + end + object Label1: TLabel + Left = 146 + Top = 22 + Width = 230 + Height = 20 + Caption = 'SQL Server Data Access' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -17 + Font.Name = 'Verdana' + Font.Pitch = fpVariable + Font.Style = [fsBold, fsItalic] + ParentFont = False + end + object Label3: TLabel + Left = 146 + Top = 108 + Width = 156 + Height = 13 + Caption = 'Copyright '#169' 1997-2007 Core Lab' + end + object Label5: TLabel + Left = 146 + Top = 132 + Width = 26 + Height = 13 + Caption = 'Web:' + end + object Label6: TLabel + Left = 146 + Top = 156 + Width = 31 + Height = 13 + Caption = 'E-mail:' + end + object lbMail: TLabel + Left = 186 + Top = 156 + Width = 80 + Height = 13 + Cursor = crHandPoint + Caption = 'sdac@crlab.com' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentColor = False + ParentFont = False + OnClick = lbMailClick + OnMouseMove = lbMailMouseMove + end + object lbWeb: TLabel + Left = 186 + Top = 132 + Width = 101 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com/sdac' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbWebClick + OnMouseMove = lbWebMouseMove + end + object Label4: TLabel + Left = 186 + Top = 46 + Width = 119 + Height = 20 + Caption = 'Components' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -17 + Font.Name = 'Verdana' + Font.Pitch = fpVariable + Font.Style = [fsBold, fsItalic] + ParentFont = False + end + object Label10: TLabel + Left = 146 + Top = 180 + Width = 32 + Height = 13 + Caption = 'Forum:' + end + object lbForum: TLabel + Left = 186 + Top = 180 + Width = 109 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com/forums' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbForumClick + OnMouseMove = lbForumMouseMove + end + object OKBtn: TButton + Left = 308 + Top = 248 + Width = 75 + Height = 24 + Cancel = True + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacAbout.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacAbout.pas new file mode 100644 index 0000000..6438bb5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacAbout.pas @@ -0,0 +1,127 @@ + +////////////////////////////////////////////////// +// MS SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC About Window +// Created: 24.07.01 +// Last modified: 14.01.02 +////////////////////////////////////////////////// + +unit SdacAbout; + +interface +uses + Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, +{$IFDEF WIN32} + Jpeg, +{$ENDIF} + Buttons, ExtCtrls; +type + TSdacAboutForm = class(TForm) + OKBtn: TButton; + Image1: TImage; + Label1: TLabel; + Label3: TLabel; + Label5: TLabel; + Label6: TLabel; + lbMail: TLabel; + lbWeb: TLabel; + Label4: TLabel; + Bevel1: TBevel; + Label10: TLabel; + lbForum: TLabel; + procedure lbWebClick(Sender: TObject); + procedure lbMailClick(Sender: TObject); + procedure lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbMailMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbForumMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbForumClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + SdacAboutForm: TSdacAboutForm; + +procedure ShowAbout; + +implementation + +uses + ShellApi; + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure ShowAbout; +begin + with TSdacAboutForm.Create(Application) do + try + ShowModal; + finally + Free; + end; +end; + +procedure TSdacAboutForm.lbWebClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'open', 'http://www.crlab.com/sdac', '', '', SW_SHOW); + lbWeb.Font.Color := $FF0000; +{$ENDIF} +end; + +procedure TSdacAboutForm.lbMailClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'open', 'mailto:sdac@crlab.com', 'zxczxc', '', SW_SHOW); + lbMail.Font.Color := $FF0000; +{$ENDIF} +end; + +procedure TSdacAboutForm.lbForumClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'open', 'www.crlab.com/forums/viewforum.php?f=6', '', '', SW_SHOW); + lbWeb.Font.Color := $FF0000; +{$ENDIF} +end; + +procedure TSdacAboutForm.lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $4080FF; +end; + +procedure TSdacAboutForm.lbMailMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +begin + lbMail.Font.Color := $4080FF; +end; + +procedure TSdacAboutForm.lbForumMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbForum.Font.Color := $4080FF; +end; + +procedure TSdacAboutForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $FF0000; + lbMail.Font.Color := $FF0000; + lbForum.Font.Color := $FF0000; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacDemoForm.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacDemoForm.nfm new file mode 100644 index 0000000..d4b657d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacDemoForm.nfm @@ -0,0 +1,896 @@ +inherited SDACForm: TSDACForm + Left = 190 + Top = 236 + Caption = 'SDACForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited TVSplitter: TSplitter + Color = clGreen + end + inherited pnTopLabel: TPanel + inherited lbTitle: TLabel + Caption = ' SDAC' + Color = clGreen + end + inherited lbAbout: TLabel + Left = 939 + Color = clGreen + end + end + inherited Panel2: TPanel + inherited Shape1: TShape + Brush.Color = clGreen + end + inherited Panel1: TPanel + Color = clGreen + end + inherited pnShowSource: TPanel + Color = clGreen + end + inherited pnOpenDemoDir: TPanel + Color = clGreen + end + end + inherited ImageList1: TImageList + Left = 593 + Top = 15 + Bitmap = { + 494C01010C000E00040010001100FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000004400000001002000000000000044 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000008BB8 + CB00317DA400317DA400317DA400699BB7000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 00000000000000800000000000000000000000000000008000000000000063B6 + D50082E9F70054D5FB003296CF001479B4000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 00000000000000800000000000000080000000800000000000000000000063B6 + D50082E9F70054D5FB003296CF001479B400000000000080000000800000B1A4 + 9A000080000000800000B1A49A00B1A49A000080000000800000634935006349 + 350063493500634935006349350063493500000000000080000000800000B1A4 + 9A000080000000800000B1A49A00B1A49A000080000000800000634935006349 + 3500634935006349350063493500634935000000000000000000000000000000 + 0000BBB0A700000000000000000000000000BBB0A7000000000000000000BBB0 + A7000000000000000000BBB0A700573E2B000000000000800000008000000000 + 00000080000000800000000000000000000000800000008000000000000063B6 + D50082E9F70054D5FB003296CF001479B40000000000BBA69700D2BDA800D4BD + AA00E9D6CA00E9D6CA00E9D7CC00E9D6CA00E9D6CA00E9D6CA00E9D6CA00E7CF + C200E6CEC000E6CCBE00E6CCBD006349350000000000BBA69700D2BDA800D4BD + AA00E9D6CA00E9D6CA00E9D7CC00E9D6CA00E9D6CA00E9D6CA00E9D6CA00E7CF + C200E6CEC000E6CCBE00E6CCBD006349350000000000C4B2A500D8C5B300D9C5 + B500EDDED700EDDDD400ECDCD200ECDBD100EBD9CF00D9C5B500EAD5CA00EAD5 + C900E8D4C800E8D2C600E8D2C500573E2B000000000000000000000000000000 + 000000000000000000000000000000000000DDD3CB00B1A49A006349350063B6 + D50082E9F70054D5FB003296CF001479B40000000000BBA69700FEFEFC00D2BD + A800FDF8F600FCF6F300FBF3EF00FAF0EA00F9ECE600D2BDA800F7E6DE00F6E3 + D900F5E0D500F4DDD200E6CCBE006349350000000000BBA69700FEFEFC00D2BD + A800FDF8F600FCF6F300FBF3EF00FAF0EA00F9ECE600D2BDA800F7E6DE00F6E3 + D900F5E0D500F4DDD200E6CCBE006349350000000000B39D8D00FEFEFC00CDB5 + 9F00FDF7F500FCF5F100FAF1ED00F9EEE700F8EAE300CDB59F00F6E3DA00F5DF + D400F4DCD000F3D9CD00E3C6B700573E2B000000000000000000000000000000 + 000000000000000000000000000000000000BBA69700D5C7BD00F6EFEA00C6E7 + ED009ED7E1009ED7E1009ED7E100699BB70000000000BBA69700D2BDA800D2BD + A800FDFBFA00D2BDA800D2BDA800D2BDA800FAEFEA00D2BDA800F8E9E100D2BD + A800D2BDA800D2BDA800E6CEC0006349350000000000BBA69700D2BDA800D2BD + A800FDFBFA00D2BDA800D2BDA800D2BDA800FAEFEA00D2BDA800F8E9E100AC8F + 7100AC8F7100AC8F7100E6CEC0006349350000000000B39D8D00CDB59F00CDB5 + 9F00FDFAF900CDB59F00CDB59F00CDB59F00F9EDE700CDB59F00F7E6DD00CDB5 + 9F00CDB59F00CDB59F00E3C8B900573E2B000000000000000000000000000000 + 00000000000000000000BBA69700634935006349350063493500634935006349 + 35006349350063493500EFE0D8006349350000000000BBA69700FFFFFF00D2BD + A800FEFDFD00FEFBFB00FDF9F700FCF6F300FBF3EF00D2BDA800F9ECE600F8EA + E200F7E6DD00F6E3D900E7CFC1006349350000000000BBA69700FFFFFF00D2BD + A800FEFDFD00FEFBFB00FDF9F700FCF6F300FBF3EF00D2BDA800F9ECE600F8EA + E200F7E6DD00F6E3D900E7CFC1006349350000000000B39D8D00FFFFFF00CDB5 + 9F00FEFDFD00FEFAFA00FDF8F600FCF5F100FAF1ED00CDB59F00F8EAE300F7E7 + DE00F6E3D900F5DFD400E4C9BA00573E2B000000000000000000E2DEDE00D9DA + D4000000000000000000BBA69700D5C7BD00F6EFEA00F3EAE400F1E5DE00EFE1 + D800D0BEB10063493500F0E4DC006349350000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D2BDA800FCF6F300D2BDA800FAEFEA00D2BD + A800D2BDA800D2BDA800E7D0C3006349350000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D2BDA800FCF6F300D2BDA800FAEFEA00F9ED + E600AC8F7100F7E6DE00E7D0C3006349350000000000B39D8D00CDB59F00CDB5 + 9F00FFFFFF00CDB59F00CDB59F00CDB59F00FCF5F100CDB59F00F9EDE700CDB5 + 9F00CDB59F00CDB59F00E4CABC00573E2B000000000000000000E0DDDD003A87 + 1A00DDD3CB00B1A49A0063493500634935006349350063493500634935006349 + 3500EFE0D80063493500BBA697006349350000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFEFC00FEFBFA00FDF9F700D2BDA800FBF3EF00FAF0 + EB00F9ECE600F7E9E100E8D2C6006349350000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFEFC00FEFBFA00FDF9F700D2BDA800FBF3EF00AC8F + 7100AC8F7100AC8F7100E8D2C6006349350000000000B39D8D00FFFFFF00CDB5 + 9F00FFFFFF00FFFFFF00FFFEFC00FEFAF900FDF8F600CDB59F00FAF1ED00F9EE + E800F8EAE300F6E6DD00E5CDBF00573E2B00000000007CAA680036851600277D + 0400277D0400EAE3DE00F6EFEA00F1E9E200F1E5DE00EFE1D800D0BEB1006349 + 3500F0E4DC0063493500BBA69700BBA6970000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D2BDA800FEFBFA00D2BDA800FCF6F300D2BD + A800D2BDA800D2BDA800E8D3C8006349350000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D2BDA800FEFBFA00D2BDA800FCF6F300FCF3 + EF00AC8F7100F9EDE600E8D3C8006349350000000000B39D8D00CDB59F00CDB5 + 9F00FFFFFF00CDB59F00CDB59F00CDB59F00FEFAF900CDB59F00FCF5F100CDB5 + 9F00CDB59F00CDB59F00E5CEC100573E2B007FAB6B0030820E00000000002F81 + 0D00DDD3CB00FCFAF900D4C6BC00BAA69600BBA69700D2C1B500EFE0D8006349 + 3500BBA6970063493500000000000000000000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFDFD00D2BDA800FDF9F700FCF6 + F300FBF3EF00FAF0EA00E9D5CA006349350000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFDFD00D2BDA800FDF9F700FCF6 + F300FBF3EF00FAF0EA00E9D5CA006349350000000000B39D8D00FFFFFF00CDB5 + 9F00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFDFD00CDB59F00FDF8F600FCF5 + F100FAF1ED00F9EEE700E6D0C400573E2B000000000000000000000000000000 + 0000BBA69700FAF6F300BBA69700F7F1ED00F5EDE700BBA69700F0E4DC006349 + 3500BBA69700BBA69700000000000000000000000000EFAD8C00EFAD9400EFAD + 8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E7845200EF844A00E773 + 4200E7733900E7733900E7733900CE6A370000000000EFAD8C00EFAD9400EFAD + 8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E7845200EF844A00E773 + 4200E7733900E7733900E7733900CE6A370000000000E7A18000E69E7D00E49A + 7800E3957200DF916C00DD8C6500DB865E00D9805700D57B5000D2764800D16F + 4200CE693C00CD653600CA613100C85E2D000000000000000000000000000000 + 0000BBA69700BBA69700FAF6F300F8F4F000F7F0EC00F5ECE600BBA697006349 + 35000000000000000000000000000000000000000000F7B59400FFC6A500FFCE + AD00FFC6A500FFC6A500FFBD9C00FFBD9400FFB58C00FFB58C00FFAD7B00FFAD + 7B00FFA57300FF9C7300F7946300CE69380000000000F7B59400FFC6A500FFCE + AD00FFC6A500FFC6A500FFBD9C00FFBD9400FFB58C00FFB58C00FFAD7B00FFAD + 7B00FFA57300FF9C7300F7946300CE69380000000000E7A18000E69F7D00E49A + 7800E3957100E1916C00DD8C6500DB865E00D9805800D57A5000D3764900D16F + 4200CF6A3C00CD653600CA613100C85D2E00000000002F810D00000000003082 + 0E006C904900BBA69700BBA69700BBA69700BBA69700BBA69700BBA69700BBA6 + 97000000000000000000000000000000000000000000EFAD8C00EFAD8C00EFAD + 8C00EFAD9400EFAD8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E78C + 5A00EF845200E77B4200E77B4200CE69380000000000EFAD8C00EFAD8C00EFAD + 8C00EFAD9400EFAD8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E78C + 5A00EF845200E77B4200E77B4200CE69380000000000E7A18000E69F7D00E49A + 7800E3957100E1916C00DD8C6500DB865E00D9805800D57A5000D3764900D16F + 4200CF6A3C00CD653600CA613100C85D2E00277D0400277D0400368516007CAA + 6800000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000003A871A00E0DDDD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000A7BED7006195 + A800688F9C0031738D00206C910092ADC4000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000447DA500447D + A500447DA500447DA500447DA500000000000000000000800000000000000080 + 00000000000000800000000000000080000000800000000000004692B9005FDA + FF00A1ECF80057D1F60002A8E7003B8EB4000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000000000000000 + 0000000000000000000000000000000000000000000000800000000000000080 + 0000000000000080000000000000008000000080000000000000447DA5008ADE + F00055C2E6003AB4E100447DA500000000000000000000800000008000000000 + 00000080000000800000000000000000000000800000008000004DA0C9005FD8 + FC00A0EAF60056CEF40003AAEB003286AD00000000000080000000800000B1A4 + 9A000080000000800000B1A49A00B1A49A000080000000800000634935006349 + 3500634935006349350063493500634935000000000000800000008000000000 + 0000008000000080000000000000000000000080000000800000000000000000 + 0000000000000000000000000000000000000000000000800000008000000000 + 0000008000000080000000000000000000000080000000800000447DA500A1EB + F60081D9EE0050C0E500447DA500000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000050A5C8005ED8 + FC00A0EAF60056CFF40005ACED0027789C0000000000BBA69700D2BDA800D4BD + AA00E9D6CA00E9D6CA00E9D7CC00E9D6CA00E9D6CA00E9D6CA00E9D6CA00E7CF + C200E6CEC000E6CCBE00E6CCBD00634935000000000000000000000000000000 + 0000000000000000000000000000529CED00BECEE30000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000447DA5008DE7 + FA009EE9F50077D4EC00447DA500000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000051A7CB005DD6 + FC00A0EAF60056CFF40001A6E7003A8DB60000000000BBA69700FEFEFC00D2BD + A800FDF8F600FCF6F300FBF3EF00FAF0EA00FAEFEB00E6DBCF00247C0000659F + 4700F9EDE600F5E1D700E6CCBE00634935000000000000000000000000000000 + 000000000000000000000000000082B2E9002D8BF100BECEE300000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000447DA500447D + A5004278A000447DA500447DA500000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000004EA9CD0060DA + FC009EE8F5004DCBF40000A5EB00348BB30000000000BBA69700D2BDA800D2BD + A800FDFBFA00D2BDA800D2BDA800D2BDA800FBF2ED00E6DBCF00FBF3EF00FBF1 + EC00FAEEE800F6E3D900E6CEC0006349350000000000A7BED7006191A900698A + 9D00316F8D002068910092ADC400000000004597F1003E85F400BECEE3000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000996952000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000067B6D0008BEF + FF00ADF8FF008AEFFF0059DDFF005DA8C20000000000BBA69700FFFFFF00D2BD + A800FEFDFD00FEFBFB00FDF9F700FCF6F300FCF5F100E6DBCF005E9C40007AAC + 6000FBF1EC00F8E9E100E8D1C30063493500000000004692B9005FDAFF00A1EC + F80057D1F60002A8E7003B8EB400000000009ABDE7004498F400377FF300BECE + E300000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000996952000000000000000000000000006448370062483700624A34006249 + 35006449350064483700624A3400634833006248370000000000AAD2DE0099D3 + E00095CED7009ED0D500A3D7DD00A8C8D10000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D2BDA800D3BFAB00FCF7F500E6DBCF0097BD8200247C + 0000A5C38F00FBF1ED00EBD8CD00664D3900000000004DA0C9005FD8FC00A0EA + F60056CEF40003AAEB003286AD000000000000000000589EED00408DF4003279 + F300BECEE3000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000099695200000000000000000000000000B7A89500FFFAF700D2BDA700FCF6 + F100F7F2EF00FAE9E000F6E6DF00F7E6DD006149330000000000000000000000 + 00000000000000000000000000000000000000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFEFC00FEFCFB00FEFBFA00E6DBCF00FDF8F6007AAD + 6200247C0000B3CB9F00F0E2DB006F5745000000000050A0C8005ED8FC00A0EA + F60056CFF40005ACED0027789C000000000000000000B2C8E5002F84F3002872 + F2002F74F300BECEE30000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E6CA + BE0070311700E6CABE000000000000000000BDA59900D0BDA800D3BBA700FEF7 + F400D4BCA800D0BCAA00D3BBA700F8E8E1006448370000000000000000000000 + 00000000000000000000000000000000000000000000BBA69700D2BDA800D2BD + A800FFFFFF00D2BDA800D6C3B000E3D6C80098C18600B2C29800FDFAF800FDF8 + F6004F9531005E9C4000F2E7E10077604E000000000051A2CB005DD6FC00A0EA + F60056CFF40001A6E7003A8DB6000000000000000000000000004694EF00256F + F2002272F2003079F300BECEE3000000000000000000447DA500447DA500447D + A500447DA500447DA50000000000000000000000000000000000E6CABE009C59 + 3900BD69400095492700E6CABE0000000000BBA79500FFFDFD00CFBCA700FAF8 + F800FDF6F300FAF0E900F9EEEA00F9ECE400654A360000000000000000005D8A + 4400337F130036751600000000000000000000000000BBA69700FFFFFF00D2BD + A800FFFFFF00FFFFFF00FFFFFF00FFFFFF007BB0660031820E00B5D1A700A6C8 + 95003284100097BE8200F2E5DF00725B4900000000004EA4CE0060DAFC009EE8 + F5004DCBF40000A5EB00348BB30000000000000000002B87F2003382F300226E + F2002275F2002281F2002D8BF100A6C3E60000000000447DA5008ADEF00055C2 + E6003AB4E100447DA500000000000000000000000000E6CABE00A56C5100D58E + 6B00DD8B6400CC764D00974D2B00E6CABE00BBA69700D4BDA700D1BEA900FEF9 + FB00D4BDA700D2BDA800D2BDA700FBF0EC005F49370000000000000000000000 + 00003485130035861300000000000000000000000000EFAD8C00EFAD9400EFAD + 8C00EFAD8C00EFA58400EFA57B00E7946B00E7AB8D00ECBFA9008E9F5900598D + 2B00588C2A00999D5C00E6B19700CE6A37000000000068B1D1008BEFFF00ADF8 + FF008AEFFF0059DDFF005DA8C200000000000000000082B2E9002F7EF300226D + F2002276F2002281F200000000000000000000000000447DA500A1EBF60081D9 + EE0050C0E5004278A0009969520099695200996952007F503900CF937600E8A7 + 8700E59E7B00E0926C00C2744E0074391F00BFAD9C00FEFAF900D8C5B000FCF7 + F600FCF3EF00F6EAE800FCF1ED00F8EFEE006950350000000000000000003485 + 1300000000006CA15400000000000000000000000000F7B59400FFC6A500FFCE + AD00FFC6A500FFC6A500FFBD9C00FFBD9400E1977300E4A28300E9B59D00EABA + A200E8B79E00E4A98B00D9886000D272430000000000AAD2DE0099D3E00095CE + D7009ED0D500A3D7DD00A8C8D1000000000000000000000000003176F300226E + F2002276F2002380F2002E8AF1000000000000000000447DA5008DE7FA009EE9 + F50077D4EC00447DA500000000000000000000000000E6CABE00A7725800DD9F + 8100EAAA8B00DA977800A2664900E6CABE00E9A98A00E3A08100E49D7C00DD99 + 7600D9957000D8896000D47F5200B37334009A7935003485130034851300A7C0 + 9A000000000000000000000000000000000000000000EFAD8C00EFAD8C00EFAD + 8C00EFAD9400EFAD8C00EFAD8C00EFA58400EFA57B00E7946B00EF946300E78C + 5A00EF845200E77B4200E77B4200CE6938000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000009ABDE700217C + F200227EF2002283F2002287F2004696EF0000000000447DA500447DA500447D + A500447DA500447DA50000000000000000000000000000000000E6CABE00A772 + 5800CF937600A7725800E6CABE0000000000EAAC8E00E7A38000E39B7900DF94 + 6E00DC8A6100D7805400D5784B00CE6E3E00C66B370000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E6CA + BE007F503900E6CABE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400C2A6 + A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6 + A400C2A6A400C2A6A40000000000000000000000000000800000000000000000 + 0000000000000080000000000000008000000080000000800000000000000000 + 00000000000000000000000000000000000000000000DB322E00DB322E00DB32 + 2E0000000000DB322E0000000000DB322E000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400FEFC + FB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFC + FB00FEFCFB00C2A6A40000000000000000000000000000800000000000000080 + 0000000000000080000000000000000000000000000000800000A5C7D5005F95 + A800678E9C002F728C001E6B900091B1C40000000000DB322E00000000000000 + 000000000000DB322E00DB322E00DF8785000000000000000000A6C7D5006195 + A800688F9C0031738D00206C910092B1C4000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400FEFC + FB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFCFB00FEFC + FB00FEFCFB00C2A6A40000000000000000000000000000800000000000000080 + 00000000000000800000000000000080000000800000000000004497B8005FDA + FF00A1ECF80057D1F60002A8E7003B8EB40000000000DB322E00000000000000 + 000000000000DB322E0000000000DB322E0000000000000000004698B8005FDA + FF00A1ECF80057D1F60002A8E7003B8EB40077848F006E7C8500626F7900535F + 6800444E5600333C4300252C3200191F240010151A0010151A0010151A001015 + 1A0010151A0010151A0010151A00000000000000000000000000C2A6A400FEFA + F500FEFCFB00FEFAF500FEFAF500FEFCFB00FEFAF500FEFAF500FEFCFB00FEFA + F500FEFAF500C2A6A40000000000000000000000000000800000008000000000 + 00000080000000800000000000000000000000800000008000004AA4C8005FD8 + FC00A0EAF60056CEF40003AAEB003286AD0000000000DB322E00DB322E00DB32 + 2E0000000000DB322E00DB322E00DB322E0000000000000000004DA5C9005FD8 + FC00A0EAF60056CEF40003AAEB003286AD0079879200A2DFF00072CDEA004BB8 + E20039AEDB002FA9D90028A1D2002398C700228EBC002083AE001B81AB00177E + A9001D799F0021749600191F2400000000000000000000000000C2A6A400FEFA + F500FEFAF500FEFAF500FEFAF500FEFAF500FEFAF500FEFAF500FEFAF500FEFA + F500FEFAF500C2A6A400000000000000000000000000BBA79600BBA69700BBA6 + 9700BBA69700BBA69700BBA69700BBA69700BBA69700BBA697004CA3C6005ED8 + FC00A0EAF60056CFF40005ACED0027789C000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000050A5C8005ED8 + FC00A0EAF60056CFF40005ACED0027789C007C8A9500A9ECF60095E5FC0082DE + FB0075D5FA006CD0F7005DC5F40052BEF00044B4EC0038ABE9002EA4E300229A + DF001890D7001D799F0022292F00000000000000000000000000C2A6A400FEF7 + F000FEF7F000FEF7F000FEF7F000FEF7F000FEF7F000FEF7F000FEF7F000FEF7 + F000FEF7F000C2A6A400000000000000000000000000BBA69700F3E2D900EEE1 + D900EEDED800EBDFD300EEDDD400EBDBD400EADAD400E9DAD1004EA6CA005DD6 + FC00A0EAF60056CFF40001A6E7003A8DB6000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000051A7CB005DD6 + FC00A0EAF60056CFF40001A6E7003A8DB6007F8E9800B6EEF8009BE8FB0095E5 + FC0082DEFB0075D5FA006ACAF4005DC5F4004FBCF00044B4EC0038ABE9002EA4 + E3001F96DC00177EA9002F363D00000000000000000000000000C2A6A400FEF7 + F000FEF7F000FEF7F000FEF7F000FEF3E900FEF7F000FEF7F000FEF3E900FEF7 + F000FEF7F000C2A6A400000000000000000000000000BBA79600F1E1DA00F0E0 + D900CDBAB200CCBCAF00CABBB200CFBBB000EBDBD400CCBAAF004BA8CD0060DA + FC009EE8F5004DCBF40000A5EB00348BB30000000000BBA69700634935006349 + 35006349350063493500634935006349350063493500634935004BA6C90060DA + FC009EE8F5004DCBF40000A5EB00348BB30083959F00B6EEF800ABEDFB009BE8 + FB008BE2FC0082DEFB0075D5FA006ACAF4005DC5F4004FBCF00040B3ED0038AB + E900269EE2001282B4003D454D00000000000000000000000000C2A6A400FEF3 + E900FEF3E900FEF3E900FEF3E900FEF3E900FEF3E900FEF3E900FEF3E900FEF3 + E900FEF3E900C2A6A400000000000000000000000000B8A59600F4E2DB00F1E1 + DA00FFF3ED00FFF3EF00FCF4ED00CCB9B100E9DDD300FFF3ED0065B5D0008BEF + FF00ADF8FF008AEFFF0059DDFF005DA8C20000000000BBA69700EBE6E200EBE4 + E000EAE1DC00D2BDA800E8DCD400E5D3C900E4CFC500D2BDA80067B6D0008BEF + FF00ADF8FF008AEFFF0059DDFF005DA8C20083959F00BEF0F900ABF0F700A5EC + FB009BE8FB008BE2FC007EDCFC0075D5FA0065CCF7005DC5F4004FBCF00040B3 + ED002EA4E3000E8ABF004B555E00000000000000000000000000C2A6A400FFF0 + E200FFF0E200FEF3E900FFEEDE00FEF3E900FFEEDE00FEF3E900FFEEDE00FEF3 + E900FFEEDE00C2A6A400000000000000000000000000BBA79500F1E4DC00EEE3 + DB00F1E2D900F0E0D900EEDED700EDDED500EFDFD300E9DCD400AAD2DE0099D3 + E00095CED7009ED0D500A3D7DD00A8C8D10000000000BBA69700FFFFFE00FEFD + FC00FDFAF900D2BDA800FCF5F100F9EBE400F8E8E000D2BDA800AAD2DE0099D3 + E00095CED7009ED0D500A3D7DD00A8C8D100869AA300BEF0F900B6EEF800B6EE + F800A5ECFB0095E5FC008BE2FC007EDCFC0075D5FA0065CCF7005DC5F4004FBC + F00037A9E7000E8FC70059656D00000000000000000000000000C2A6A400FEF3 + E900FFEEDE00FFF0E200FEF3E900FFEEDE00FFF0E200DDCFC200DDCFC200DDCF + C200DDCFC200C2A6A400000000000000000000000000B9A69700F3E3DC00F5E3 + DC00FFFFFF00FFFFFF00FFFFFF00FBFFFF00FDFFFF00FFFFFE00FFFFFF00FDFF + FF00E4D7CF00E9D7D000624837000000000000000000BBA69700D2BDA800D2BD + A800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BD + A800D2BDA8006349350000000000000000008A9DA700BEF0F900B6EEF800B6EE + F800ABF0F700A5ECFB0095E5FC008BE2FC007EDCFC0071D3FA0065CCF70057C3 + F3004FBCF0001B99CF0065727C00000000000000000000000000C2A6A400FFEE + DE00FFEEDE00FFEEDE00FFEEDE00FFEEDE00FFEEDE00C3B4A800C3B4A800C3B4 + A800C3B4A800C2A6A400000000000000000000000000BBA69700F1E4DC00EEE4 + DA00F0E2DC00F3E2D900F3E2D900F0E0D900ECDED800EADDD500E9DDD300E9DD + D300EBD9D200E9D9D200644934000000000000000000BBA69700FFFFFF00FFFF + FF00FFFEFE00D2BDA800FDFAF900FAF1ED00F9EDE800D2BDA800F7E7DF00F7E4 + DC00F5E1D7006349350000000000000000008FA4AC00BEF0F900BEF0F900BEF0 + F900BEF0F900B4F2F800ABEDFB00A5ECFB0095E5FC008ADFFC007EDCFC0075D5 + FA006ACAF4005DC5F40065727C00000000000000000000000000C2A6A400FFEE + DE00FFEAD700FFEEDE00FFEAD700FFEAD700FFEEDE00B0A29600B0A29600B0A2 + 9600B0A29600C2A6A400000000000000000000000000BBA59A00F3E3DD00F4E5 + DC00FDFFFF00FFFFFF00FFFFFE00FFFFFE00FFFFFE00FFFFFE00FFFFFF00FFFE + FF00E8DCD200E9D9D200624A34000000000000000000BBA69700FFFFFF00FFFF + FF00FFFFFF00D2BDA800FEFCFB00FBF4F100FAF1EC00D2BDA800F8EAE300F7E7 + DF00F6E4DB006349350000000000000000008FA4AC008FA4AC008FA4AC008FA4 + AC008FA4AC008CA0A9008A9DA7008A9DA700869AA300869AA3008395A0008395 + A0008395A0008395A00000000000000000000000000000000000C2A6A400FFEA + D700FFEAD700FFEAD700FFEAD700FFEAD700C9B9AC00FEFAF500FEF7F000E6DA + D900C2A6A40000000000000000000000000000000000BBA59900F4E4DD00F5E2 + DD00F5E3DC00F2E2DB00F0E3DB00EFE1DB00EDE0D800EEDFD600EDDED500EDDD + D600EBDBD400ECDAD300634834000000000000000000BBA69700D2BDA800D2BD + A800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BDA800D2BD + A800D2BDA8006349350000000000000000008FA4AC00B2E4EC00B6EEF800B6EE + F800A9ECF60092E1F3008FA4AC00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400FFEA + D700FFE6D000FFEAD700FFE6D000FFEAD700C5B5A900FEFAF500DDCFC200C2A6 + A4000000000000000000000000000000000000000000E1997100E1966F00E092 + 6E00E1926900DD8E6300DD895F00DC865C00DB815800D97D5200D6794C00D374 + 4800CF724100D06E3E00D26C3C000000000000000000BBA69700FFFFFF00FFFF + FF00FFFFFF00D2BDA800FFFFFF00FDFAF800FCF7F400D2BDA800FAF1EB00F9EE + E700F8EAE300634935000000000000000000000000008FA4AC008FA4AC008FA4 + AC008FA4AC008FA4AC0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400FFE6 + D000FFE6D000FFE6D000FFE6D000FFE6D000C9B9AC00DDCFC200C2A6A4000000 + 00000000000000000000000000000000000000000000E3977300E2977100DF93 + 6F00E0906B00DD8C6600DB896000D9855B00D7825500D47E5000D47A4B00D375 + 4700D2714500D56F3F00D06C3C000000000000000000BBA69700FFFFFF00FFFF + FF00FFFFFF00D2BDA800FFFFFF00FEFBFA00FDF9F700D2BDA800FBF3EF00FAF0 + EA00F9ECE6006349350000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C2A6A400C2A6 + A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400C2A6A400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BBA69700BBA69700BBA6 + 9700BBA69700BBA69700BBA69700BBA69700BBA69700BBA69700BBA69700BBA6 + 9700BBA69700BBA697000000000000000000424D3E000000000000003E000000 + 2800000040000000440000000100010000000000200200000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF + BA3FBA3FAABBBA20ABBFABBF98ABABA0AA7FAA7FAAABAA608000800080009320 + 800080008000FF00800080008000FF00800080008000FC00800080008000CC00 + 800080008000C00080008000800080008000800080002003800080008000F003 + 800080008000F00F800080008000A00F8000800080000FFFFFFFFFFFFFFF9FFF + FFFFFFFFFFFFFFFFBA3FBA3FBA3FBA3FAB80ABBFABBFAB81AA40AA7FAA7FAA41 + 93008000933F9301FFC08000FE7FFFC1FFC08000FE3FFFC1FFC08000811FFFF7 + FFC08000810FFFF7004080008187FFF7007F80008183FFE3007F800081C183C1 + 00638000818083800073800081838000006B800081C18380000F8000FFC083C1 + 007FFFFFFFFFFFE3FFFFFFFFFFFFFFFFFFFFC003BA3F8AFFFFFFC003AB80B8C0 + FFFFC003AA40BAC00001C003930088C00001C0038000FFC00001C0038000FFC0 + 0001C003800080000001C003800080000001C003800080000001C00380018003 + 0001C003800180030001C003800180030003C0078001800301FFC00F80018003 + 83FFC01F80018003FFFFC03FFFFF8003} + end + object MSConnection: TMSConnection + Database = 'master' + ConnectDialog = MSConnectDialog1 + Left = 465 + Top = 10 + end + object MSConnectDialog1: TMSConnectDialog + Caption = 'Connect' + UsernameLabel = 'User Name' + PasswordLabel = 'Password' + ServerLabel = 'Server' + DatabaseLabel = 'Database' + ConnectButton = 'Connect' + CancelButton = 'Cancel' + LabelSet = lsCustom + Left = 500 + Top = 10 + end + object scCreate: TMSScript + SQL.Strings = ( + 'CREATE TABLE SDAC_Long_char (' + ' Code INT IDENTITY (1, 1) PRIMARY KEY,' + ' Title VARCHAR(30),' + ' Value VARCHAR(5000)' + ');' + '' + 'CREATE TABLE SDAC_Pictures (' + ' UID int IDENTITY (1, 1) PRIMARY KEY NOT NULL,' + ' Name VARCHAR(50),' + ' Picture IMAGE' + ');' + '' + 'CREATE TABLE Loaded1 (' + ' uid INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,' + ' Field1 VARCHAR(20),' + ' Field2 VARCHAR(20),' + ' Field3 VARCHAR(20)' + ');' + '' + 'CREATE TABLE Loaded2 (' + ' uid INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,' + ' Field1 VARCHAR(20),' + ' Field2 VARCHAR(20),' + ' Field3 VARCHAR(20)' + ');' + '' + 'CREATE TABLE ThreadTable (' + ' ID INT,' + ' NAME VARCHAR(30)' + ');' + '' + 'CREATE TABLE SDAC_Text (' + ' UID INT IDENTITY PRIMARY KEY,' + ' [Name] NVARCHAR(50),' + ' TextField TEXT' + ');' + '' + 'CREATE TABLE Sdac_Loaded (' + ' Code INT,' + ' Num INT,' + ' Num1 FLOAT,' + ' Str VARCHAR(50),' + ' Dat DATETIME' + ');' + '' + 'CREATE TABLE CRGRID_TEST(' + ' Id int PRIMARY KEY,' + ' Name VARCHAR(10),' + ' Country VARCHAR(30),' + ' City VARCHAR(30),' + ' Street VARCHAR(30),' + ' BirthDate DATETIME,' + ' Job VARCHAR(9),' + ' Hiredate DATETIME,' + ' Sal NUMERIC(7, 2),' + ' Remarks TEXT' + ');' + '' + 'INSERT INTO CRGRID_TEST ' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5001, '#39'SMITH'#39', '#39'ENGLAND'#39', '#39'LONDON'#39', '#39'BOND st.'#39', '#39'12-OCT-63'#39', ' + + #39'CLERK'#39','#39'17-DEC-80'#39', 800);' + 'INSERT INTO CRGRID_TEST' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5002, '#39'ALLEN'#39', '#39'ENGLAND'#39', '#39'LONDON'#39', '#39'BAKER st.'#39', '#39'04-MAR-61'#39',' + + ' '#39'SALESMAN'#39','#39'20-FEB-81'#39', 1600);' + 'INSERT INTO CRGRID_TEST ' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5003, '#39'MARTIN'#39', '#39'FRANCE'#39', '#39'LION'#39', '#39'WEAVER st.'#39', '#39'23-JAN-57'#39', ' + + #39'MANAGER'#39','#39'02-APR-81'#39', 2900);' + ' ' + ' CREATE TABLE DEPT (' + ' DEPTNO INT PRIMARY KEY,' + ' DNAME VARCHAR(14),' + ' LOC VARCHAR(13)' + ');' + 'INSERT INTO DEPT VALUES (10,'#39'ACCOUNTING'#39','#39'NEW YORK'#39');' + 'INSERT INTO DEPT VALUES (20,'#39'RESEARCH'#39','#39'DALLAS'#39');' + 'INSERT INTO DEPT VALUES (30,'#39'SALES'#39','#39'CHICAGO'#39');' + 'INSERT INTO DEPT VALUES (40,'#39'OPERATIONS'#39','#39'BOSTON'#39');' + '' + 'CREATE TABLE emp (' + ' EMPNO int IDENTITY(1,1) NOT NULL PRIMARY KEY,' + ' ENAME varchar(10) default NULL,' + ' JOB varchar(9) default NULL,' + ' MGR int default NULL,' + ' HIREDATE datetime default NULL,' + ' SAL float default NULL,' + ' COMM float default NULL,' + ' DEPTNO int default NULL' + ' );' + + 'INSERT INTO emp VALUES ('#39'SMITH'#39', '#39'CLERK'#39', 7902, '#39'1980-12-17 00:0' + + '0:00'#39', 800, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'ALLEN'#39', '#39'SALESMAN'#39', 7698, '#39'1981-02-20 0' + + '0:00:00'#39', 1600, 300, 30);' + + 'INSERT INTO emp VALUES ('#39'WARD'#39', '#39'SALESMAN'#39', 7698, '#39'1981-02-22 00' + + ':00:00'#39', 1250, 500, 30);' + + 'INSERT INTO emp VALUES ('#39'JONES'#39', '#39'MANAGER'#39', 7839, '#39'1981-04-02 00' + + ':00:00'#39', 2975, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'MARTIN'#39', '#39'SALESMAN'#39', 7698, '#39'1981-09-28 ' + + '00:00:00'#39', 1250, 1400, 30);' + + 'INSERT INTO emp VALUES ('#39'BLAKE'#39', '#39'MANAGER'#39', 7839, '#39'1981-05-01 00' + + ':00:00'#39', 2850, NULL, 30);' + + 'INSERT INTO emp VALUES ('#39'CLARK'#39', '#39'MANAGER'#39', 7839, '#39'1981-06-09 00' + + ':00:00'#39', 2450, NULL, 10);' + + 'INSERT INTO emp VALUES ('#39'SCOTT'#39', '#39'ANALYST'#39', 7566, '#39'1987-07-13 00' + + ':00:00'#39', 3000, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'KING'#39', '#39'PRESIDENT'#39', NULL, '#39'1981-11-17 0' + + '0:00:00'#39', 5000, NULL, 10);' + + 'INSERT INTO emp VALUES ('#39'TURNER'#39', '#39'SALESMAN'#39', 7698, '#39'1981-09-08 ' + + '00:00:00'#39', 1500, 0, 30);' + + 'INSERT INTO emp VALUES ('#39'ADAMS'#39', '#39'CLERK'#39', 7788, '#39'1987-07-13 00:0' + + '0:00'#39', 1100, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'JAMES'#39', '#39'CLERK'#39', 7698, '#39'1981-12-03 00:0' + + '0:00'#39', 950, NULL, 30);' + + 'INSERT INTO emp VALUES ('#39'FORD'#39', '#39'ANALYST'#39', 7566, '#39'1981-12-03 00:' + + '00:00'#39', 3000, NULL, 20);' + + 'INSERT INTO emp VALUES ('#39'MILLER'#39', '#39'CLERK'#39', 7782, '#39'1982-01-23 00:' + + '00:00'#39', 1300, NULL, 10);' + '' + 'GO' + '' + 'CREATE PROCEDURE SDAC_InsertEmp ' + #9'@ENAME'#9'nvarchar(20),' + #9'@JOB'#9'nvarchar(10)' + 'AS' + #9'INSERT INTO ' + #9#9'EMP (ENAME, JOB) ' + #9'VALUES' + #9#9'(@ENAME, @JOB) ' + #9'RETURN @@Identity;' + '' + 'GO' + '' + 'CREATE PROCEDURE SDAC_UpdateEmp ' + #9'@EMPNO'#9'int,' + #9'@ENAME'#9'nvarchar(20),' + #9'@JOB'#9'nvarchar(10),' + ' @EMPINFO nvarchar(30) OUTPUT' + 'AS' + #9'UPDATE EMP' + #9'SET ' + #9#9'ENAME = @ENAME, JOB = @JOB ' + #9'WHERE' + #9#9'EMPNO = @EMPNO' + ' SET @EMPINFO = CAST(@EMPNO AS nvarchar) + '#39' '#39' + @JOB' + ' RETURN @EMPNO;' + '' + 'GO' + '' + 'CREATE PROCEDURE SDAC_DeleteEmp ' + #9'@EMPNO'#9'int,' + #9'@Result'#9'int OUTPUT' + 'AS' + #9'DELETE Emp' + #9'WHERE' + #9#9'EmpNO = @EmpNO' + #9'SET @Result = @EmpNO + 2;' + '' + 'GO' + '' + 'CREATE PROCEDURE "Ten Most High-Paid Employees" AS' + 'BEGIN' + ' SET ROWCOUNT 10' + ' SELECT Emp.EName AS TenMostHighPaidEmployees, Emp.SAL' + ' FROM Emp' + ' ORDER BY Emp.SAL DESC' + ' SET ROWCOUNT 0' + 'END;'#9) + OnError = OnScriptError + Connection = MSConnection + Left = 465 + Top = 45 + end + object scDrop: TMSScript + SQL.Strings = ( + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'Loaded1]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [Loaded1];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'Loaded2]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [Loaded2];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Long_char]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Long_char];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Pictures]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Pictures];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dbo].[SDAC_DeleteEmp]'#39') AND OBJECTPROPERTY(id, N'#39'IsProcedure'#39') =' + + ' 1)' + ' DROP PROCEDURE [dbo].[SDAC_DeleteEmp];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dbo].[SDAC_InsertEmp]'#39') AND OBJECTPROPERTY(id, N'#39'IsProcedure'#39') =' + + ' 1)' + ' DROP PROCEDURE [dbo].[SDAC_InsertEmp];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dbo].[SDAC_UpdateEmp]'#39') AND OBJECTPROPERTY(id, N'#39'IsProcedure'#39') =' + + ' 1)' + ' DROP PROCEDURE [dbo].[SDAC_UpdateEmp];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'ThreadTable]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [ThreadTable];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Text]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Text];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Loaded]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Loaded];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dbo].[Ten Most High-Paid Employees]'#39') AND OBJECTPROPERTY(id, N'#39'I' + + 'sProcedure'#39') = 1)' + ' DROP PROCEDURE [dbo].[Ten Most High-Paid Employees];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'CRGRID_TEST]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [CRGRID_TEST];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'SDAC_Loaded]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [SDAC_Loaded];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'emp]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [emp];' + + 'IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'#39'[' + + 'dept]'#39') AND OBJECTPROPERTY(id, N'#39'IsUserTable'#39') = 1)' + ' DROP TABLE [dept];') + OnError = OnScriptError + Connection = MSConnection + Left = 500 + Top = 46 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacDemoForm.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacDemoForm.pas new file mode 100644 index 0000000..db2a022 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Base/SdacDemoForm.pas @@ -0,0 +1,184 @@ +{$I DacDemo.inc} +unit SdacDemoForm; + +interface + +uses + SysUtils, Classes, DB, + {$IFDEF VER6P} + Variants, + {$ENDIF} + Windows, Messages, Graphics, Controls, Forms, SdacVcl, + Dialogs, Menus, ImgList, StdCtrls, ComCtrls, Buttons, ExtCtrls, ToolWin, + DBAccess, MSAccess, SdacAbout, DemoFrame, DemoForm, DemoBase, DAScript, + MSScript; + +type + TSdacForm = class(TDemoForm) + MSConnection: TMSConnection; + MSConnectDialog1: TMSConnectDialog; + scCreate: TMSScript; + scDrop: TMSScript; + procedure lbAboutClick(Sender: TObject); override; + procedure cbDebugClick(Sender: TObject); + private + { Private declarations } + protected + //Product customization + function GetConnection: TCustomDAConnection; override; + function ApplicationTitle: string; override; + function ProductName: string; override; + procedure RegisterDemos; override; + public + function ProductColor: TColor; override; + procedure ExecCreateScript; override; + procedure ExecDropScript; override; + end; + +var + SdacForm: TSdacForm; + +implementation + +uses + CachedUpdates, +{$IFDEF CRDBGRID} + CRDBGrid, +{$ENDIF} + ConnectDialog, FetchAll, LongStrings, MasterDetail, + Pictures, Query, ServerCursors, Sql, StoredProc, StoredProcUpdates, +{$IFNDEF STD} + ServiceBroker, +{$ENDIF} +{$IFDEF WIN32} + Threads, +{$ENDIF} + FilterAndIndex, Table, Text, UpdateSQL, VTable{$IFNDEF STD}, Loader{$ENDIF}; + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +function TSdacForm.GetConnection: TCustomDAConnection; +begin + Result := MSConnection; +end; + +function TSdacForm.ProductColor: TColor; +begin + Result := clGreen; +end; + +procedure TSdacForm.ExecCreateScript; +begin + scCreate.Execute; +end; + +procedure TSdacForm.ExecDropScript; +begin + scDrop.Execute; +end; + +function TSdacForm.ApplicationTitle: string; +begin + Result := 'SQL Server Data Access Components demos'; +end; + +function TSdacForm.ProductName: string; +begin + Result := 'SDAC'; +end; + +procedure TSdacForm.RegisterDemos; +begin + Demos.RegisterCategory('SDAC Demo', 'SDAC Demo'); + Demos.RegisterCategory('Working with components', 'Working with components'); + Demos.RegisterCategory('General demos', 'General demos'); + Demos.RegisterCategory('SQL Server specific', 'SQL Server specific'); + + Demos.RegisterDemo('ConnectDialog', 'Customizing login dialog', 'Demonstrates how to customize the SDAC connect dialog. Changes the standard SDAC connect dialog to two custom connect dialogs. The first customized sample dialog is inherited from the TForm class, ' + 'and the second one is inherited from the default SDAC connect dialog class.', 'Working with components', TConnectDialogFrame, 2); +{$IFDEF CRDBGRID} + Demos.RegisterDemo('CRDBGrid', 'Using TCRDBGrid component', 'Demonstrates how to work with the TCRDBGrid component. Shows off the main TCRDBGrid features, like filtering, searching, stretching, using compound headers, and more.', 'Working with components', TCRDBGridFrame, 3); +{$ENDIF} +{$IFNDEF STD} + Demos.RegisterDemo('Loader', 'Using TMSLoader component', 'Uses the TMSLoader component to quickly load data into a server table. This demo also compares the two TMSLoader data loading handlers: GetColumnData and PutData.', 'Working with components', TLoaderFrame, 4); +{$ENDIF} + Demos.RegisterDemo('Query', 'Using TMSQuery component', 'Demonstrates working with TMSQuery, which is one of the most useful SDAC components. Includes many TMSQuery usage scenarios. Demonstrates how to execute queries in both standard and NonBlocking mode' + ' and how to edit data and export it to XML files. Note: This is a very good introductory demo. We recommend starting here when first becoming familiar with SDAC.', 'Working with components', TQueryFrame, 5); + Demos.RegisterDemo('Sql', 'Using TMSSQL component', 'Uses the TMSSQL component to execute SQL statements. Demonstrates how to work in a separate thread, in standard mode, in NonBlocking mode, and how to break long-duration query execution.', 'Working with components', TSqlFrame, 6); + Demos.RegisterDemo('StoredProc', 'Using TMSStoredProc component', 'Uses the TMSStoredProc component to access an editable recordset from an MS SQL stored procedure in the client application.', 'Working with components', TStoredProcFrame, 7); + Demos.RegisterDemo('Table', 'Using TMSTable component', 'Demonstrates how to use TMSTable to work with data from a single table on the server without manually writing any SQL queries. Performs server-side data sorting and filtering and retrieves results for browsing and editing.', 'Working with components', TTableFrame, 8); + Demos.RegisterDemo('UpdateSQL', 'Using TMSUpdateSQL component', 'Demonstrates using the TMSUpdateSQL component to customize update commands. Lets you optionally use TMSSQL and TMSQuery objects for carrying out insert, delete, query, and update commands.', 'Working with components', TUpdateSQLFrame, 9); + Demos.RegisterDemo('VirtualTable', 'Using TVirtualTable component', 'Demonstrates working with the TVirtualTable component. This sample shows how to fill virtual dataset with data from other datasets, filter data by a given criteria, locate specified records, perform file operations, and change data and table structure.', 'Working with components', TVirtualTableFrame, 10, 'VTable'); +{$IFNDEF STD} + Demos.RegisterDemo('ServiceBroker', 'Using TMSServiceBroker component', 'Demonstrates working with the TMSServiceBroker component. This sample shows how to organize simple messaging.', 'Working with components', TServiceBrokerFrame, 11); +{$ENDIF} + + Demos.RegisterDemo('CachedUpdates', 'Cached updates, transaction control', 'Demonstrates how to perform the most important tasks of working with data in CachedUpdates mode, including highlighting uncommitted changes, managing transactions, and committing changes in a batch.', 'General demos', TCachedUpdatesFrame, 1); + Demos.RegisterDemo('FetchAll', 'Illustrates how to open TMSQuery with or without fetching all data to client', 'Demonstrates how to open a query that returns a large recordset using different values of the FetchAll option. This demo lets the user to fill in the table used in the query.', 'General demos', TFetchAllFrame, 1); + Demos.RegisterDemo('FilterAndIndex', 'Using Filter and IndexFieldNames', 'Demonstrates SDAC''s local storage functionality. This sample shows how to perform local filtering, sorting and locating by multiple fields, including by calculated and lookup fields.', 'General demos', TFilterAndIndexFrame, 1); Demos.RegisterDemo('MasterDetail', 'Master/detail relationship', 'Master/detail relationship', 'General demos', TMasterDetailFrame, 1); + Demos.RegisterDemo('Pictures', 'Working with BLOB field', 'Uses SDAC functionality to work with graphics. The sample demonstrates how to retrieve binary data from MS SQL database and display it on visual components. Sample also shows how to load and save pictures to files and to the database.', 'General demos', TPicturesFrame, 1); + Demos.RegisterDemo('StoredProcUpdates', 'Using StoredProcs to Insert, Update and Delete with TMSQuery component', 'Demonstrates updating a recordset using stored procedures. Update events are tied to stored procedure calls in design time, and every recordset change causes the corresponding stored procedure call to be performed. ' + 'The commands to call stored procedures are stored in the SQLInsert, SQLDelete, SQLUpdate properties of TMSQuery.', 'General demos', TStoredProcUpdatesFrame, 1); +{$IFNDEF CLR} + Demos.RegisterDemo('Threads', 'Using Sdac in multi-threaded environment', 'Demonstrates how SDAC can be used in multithreaded applications. This sample allows you to set up several threads and test SDAC''s performance with multithreading.', 'General demos', TThreadsFrame, 1); +{$ENDIF} + Demos.RegisterDemo('LongStrings', 'Working with string fields', 'Demonstrates SDAC functionality for working with long string fields (fields that have more than 256 characters). Shows the different ways they can be displayed as memo fields and string fields.', 'SQL Server specific', TLongStringsFrame, 1); + Demos.RegisterDemo('ServerCursors', 'Open and navigate using client and server cursor types', 'Compares performance of opening a large recordset with different cursor types: client cursor in FetchAll=True mode, client cursor in FetchAll=False mode, and server cursor.', 'SQL Server specific', TServerCursorsFrame, 1); + Demos.RegisterDemo('Text', 'Working with long string fields', 'Uses SDAC functionality to work with text. The sample demonstrates how to retrieve text data from MS SQL database and display it on visual components. Sample also shows how to load and save text to files and to the database.', 'SQL Server specific', TTextFrame, 1); + + Demos.RegisterCategory('Miscellaneous', '', -1, True); +{$IFDEF CLR} + Demos.RegisterDemo('AspNet', 'AspNet', 'Uses MSDataAdapter to create a simple ASP .NET application. This demo shows how to create an ASP.NET application that lets you connect to a database and execute queries. ' + 'Application displays query results in a DataGrid and sends user changes back to the database.', 'Miscellaneous', nil, 1, '', True); +{$ENDIF} +{$IFNDEF CLR} + Demos.RegisterDemo('Dll', 'Dll', 'Demonstrates creating and loading DLLs for SDAC-based projects. This demo project consists of two parts - an MS_Dll project that creates a DLL of a form that sends a query to the server and displays its results, ' + 'and an MS_Exe project that can be executed to display a form for loading and running this DLL. Allows you to build a dll for one SDAC-based project and load and test it from a separate application.', 'Miscellaneous', nil, 1, '', True); +{$ENDIF} + Demos.RegisterDemo('FailOver', 'FailOver', 'Demonstrates the recommended approach to working with unstable networks. This sample lets you perform transactions and updates in several different modes, ' + 'simulate a sudden session termination, and view what happens to your data state when connections to the server are unexpectedly lost. Shows off CachedUpdates, LocalMasterDetail, FetchAll, Pooling, and different Failover modes.', 'Miscellaneous', nil, 1, '', True); +{$IFNDEF CLR} + Demos.RegisterDemo('Midas', 'Midas', 'Demonstrates using MIDAS technology with SDAC. This project consists of two parts: a MIDAS server that processes requests to the database and a thin MIDAS client that displays an interactive grid. ' + 'This demo shows how to build thin clients that display interactive components and delegate all database interaction to a server application for processing.', 'Miscellaneous', nil, 1, '', True); + Demos.RegisterDemo('Performance', 'Performance', 'Measures SDAC performance on several types of queries. This project lets you compare SDAC performance to BDE, ADO, and dbExpress. Tests the following functionality: Fetch, Master/Detail, ' + 'Stored Procedure Call, Multi Executing, and Insert/Post.', 'Miscellaneous', nil, 1, '', True); +{$ENDIF} +{$IFDEF CLR} + Demos.RegisterDemo('WinForms', 'AspNet', 'Shows how to use SDAC to create a WinForm application. This demo project creates a simple WinForms application and fills a data grid from an MSDataAdapter data source.', 'Miscellaneous', nil, 1, '', True); +{$ENDIF} + +{$IFNDEF CLR} + Demos.RegisterCategory('', '', -1, True); +{$ENDIF} + Demos.RegisterCategory('TechnologySpecific', '', -1, True); + Demos.RegisterDemo('MSSQLCompact', 'MSSQLCompact', 'Demonstrates how to create applications that work with MS SQL Server Compact Edition. Demo connects to a database and opens a table. If the specified database does not exists, it will be created automatically.', 'TechnologySpecific', nil, 1, '', True); +{$IFNDEF CLR} + Demos.RegisterCategory('', '', -1, True); +{$ENDIF} + +{$IFNDEF CLR} + Demos.RegisterCategory('ThirdParty', '', -1, True); + Demos.RegisterDemo('FastReport', 'FastReport hint', 'Demonstrates how SDAC can be used with FastReport components. This project consists of two parts. The first part is several packages that integrate SDAC components into the FastReport editor. ' + 'The second part is a demo application that lets you design and preview reports with SDAC technology in the FastReport editor.', 'ThirdParty', nil, 1, '', True); + Demos.RegisterDemo('InfoPower', 'InfoPower hint', 'Uses InfoPower components to display recordsets retrieved with SDAC. This demo project displays an InfoPower grid component and fills it with the result of an SDAC query. Shows how to link SDAC data sources to InfoPower components.', 'ThirdParty', nil, 1, '', True); + Demos.RegisterDemo('IntraWeb', 'IntraWeb hint', 'A collection of sample projects that show how to use SDAC components as data sources for IntraWeb applications. Contains IntraWeb samples for setting up a connection, querying ' + 'a database and modifying data and working with CachedUpdates and MasterDetail relationships.', 'ThirdParty', nil, 1, '', True); + Demos.RegisterDemo('QuickReport', 'QuickReport hint', 'Lets you launch and view a QuickReport application based on SDAC. This demo project lets you modify the application in design-time.', 'ThirdParty', nil, 1, '', True); + Demos.RegisterDemo('ReportBuilder', 'ReportBuilder hint', 'Uses SDAC data sources to create a ReportBuilder report that takes data from an MS SQL database. This demo project shows how to set up a ReportBuilder document in design-time and how to integrate SDAC components into the ' + 'Report Builder editor to perform document design in run-time.', 'ThirdParty', nil, 1, '', True); +{$ENDIF} +{$IFNDEF CLR} + Demos.RegisterCategory('', '', -1, True); +{$ENDIF} + +end; + +procedure TSdacForm.lbAboutClick(Sender: TObject); +begin + inherited; + SdacAboutForm.ShowModal; +end; + +procedure TSdacForm.cbDebugClick(Sender: TObject); +begin + inherited; + scCreate.Debug := (Sender as TCheckBox).Checked; + scDrop.Debug := (Sender as TCheckBox).Checked; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CRDBGrid/CRDBGrid.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CRDBGrid/CRDBGrid.nfm new file mode 100644 index 0000000..717f548 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CRDBGrid/CRDBGrid.nfm @@ -0,0 +1,264 @@ +inherited CRDBGridFrame: TCRDBGridFrame + Width = 441 + Height = 275 + Align = alClient + object CRDBGrid: TCRDBGrid + Left = 0 + Top = 51 + Width = 441 + Height = 224 + OptionsEx = [dgeLocalFilter, dgeLocalSorting] + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + Columns = < + item + Expanded = False + FieldName = 'ID' + Width = 63 + Visible = True + end + item + Expanded = False + FieldName = 'NAME' + Title.Caption = 'PERSON|NAME' + Width = 63 + Visible = True + end + item + Expanded = False + FieldName = 'COUNTRY' + Title.Caption = 'PERSON|ADDRESS|COUNTRY' + Width = 63 + Visible = True + end + item + Expanded = False + FieldName = 'CITY' + Title.Caption = 'PERSON|ADDRESS|CITY' + Width = 63 + Visible = True + end + item + Expanded = False + FieldName = 'STREET' + Title.Caption = 'PERSON|ADDRESS|STREET' + Width = 63 + Visible = True + end + item + Expanded = False + FieldName = 'BIRTHDATE' + Title.Caption = 'PERSON|BIRTHDATE' + Width = 63 + Visible = True + end + item + Expanded = False + FieldName = 'JOB' + Title.Caption = 'JOB|JOB NAME' + Width = 63 + Visible = True + end + item + Expanded = False + FieldName = 'HIREDATE' + Title.Caption = 'JOB|HIREDATE' + Width = 63 + Visible = True + end + item + Expanded = False + FieldName = 'SAL' + Title.Caption = 'JOB|SAL' + Width = 63 + Visible = True + end + item + Expanded = False + FieldName = 'REMARKS' + Width = 63 + Visible = True + end> + end + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 51 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 438 + Height = 49 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object Panel3: TPanel + Left = 1 + Top = 24 + Width = 436 + Height = 24 + BevelOuter = bvNone + TabOrder = 0 + object chkFiltered: TCheckBox + Left = 5 + Top = 4 + Width = 65 + Height = 17 + Caption = 'Filtered' + TabOrder = 0 + OnClick = chkFilteredClick + end + object chkFilterBar: TCheckBox + Left = 91 + Top = 4 + Width = 65 + Height = 17 + Action = actFilterBar + TabOrder = 1 + end + object chkSearchBar: TCheckBox + Left = 178 + Top = 4 + Width = 81 + Height = 17 + Action = actSearchBar + TabOrder = 2 + end + object chkRecCount: TCheckBox + Left = 265 + Top = 4 + Width = 89 + Height = 17 + Caption = 'Record Count' + TabOrder = 3 + OnClick = chkRecCountClick + end + object chkStretch: TCheckBox + Left = 368 + Top = 4 + Width = 57 + Height = 17 + Caption = 'Stretch' + TabOrder = 4 + OnClick = chkStretchClick + end + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 1 + Width = 270 + Height = 22 + Flat = True + TabOrder = 1 + end + end + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM crgrid_test') + Left = 8 + Top = 88 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 40 + Top = 88 + end + object ActionList1: TActionList + Left = 72 + Top = 96 + object actSearchBar: TAction + Caption = 'Search Bar' + OnExecute = actSearchBarExecute + OnUpdate = actSearchBarUpdate + end + object actFilterBar: TAction + Caption = 'Filter Bar' + OnExecute = actFilterBarExecute + OnUpdate = actFilterBarUpdate + end + end + object scCreate: TMSSQL + SQL.Strings = ( + 'CREATE TABLE CRGRID_TEST(' + ' Id int PRIMARY KEY,' + ' Name VARCHAR(10),' + ' Country VARCHAR(30),' + ' City VARCHAR(30),' + ' Street VARCHAR(30),' + ' BirthDate DATETIME,' + ' Job VARCHAR(9),' + ' Hiredate DATETIME,' + ' Sal NUMERIC(7, 2),' + ' Remarks TEXT' + ');' + '' + 'INSERT INTO CRGRID_TEST ' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5001, '#39'SMITH'#39', '#39'ENGLAND'#39', '#39'LONDON'#39', '#39'BOND st.'#39', '#39'12-OCT-63'#39', ' + + #39'CLERK'#39','#39'17-DEC-80'#39', 800);' + '' + 'INSERT INTO CRGRID_TEST' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5002, '#39'ALLEN'#39', '#39'ENGLAND'#39', '#39'LONDON'#39', '#39'BAKER st.'#39', '#39'04-MAR-61'#39',' + + ' '#39'SALESMAN'#39','#39'20-FEB-81'#39', 1600);' + '' + 'INSERT INTO CRGRID_TEST ' + + ' (Id, Name, Country, City, Street, BirthDate, Job, HireDate, Sa' + + 'l)' + 'VALUES ' + + ' (5003, '#39'MARTIN'#39', '#39'FRANCE'#39', '#39'LION'#39', '#39'WEAVER st.'#39', '#39'23-JAN-57'#39', ' + + #39'MANAGER'#39','#39'02-APR-81'#39', 2900);') + CommandTimeout = 0 + Left = 448 + Top = 8 + end + object scDrop: TMSSQL + SQL.Strings = ( + 'DROP TABLE CRGRID_TEST') + CommandTimeout = 0 + Left = 488 + Top = 8 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CRDBGrid/CRDBGrid.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CRDBGrid/CRDBGrid.pas new file mode 100644 index 0000000..d0eb5bf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CRDBGrid/CRDBGrid.pas @@ -0,0 +1,129 @@ +unit CRDBGrid; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Db, MemDS, DBAccess, Grids, DBGrids, CRGrid, StdCtrls, + ActnList, ExtCtrls, DBCtrls, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm; + +type + TCRDBGridFrame = class(TDemoFrame) + MSQuery: TMSQuery; + DataSource: TDataSource; + ActionList1: TActionList; + actSearchBar: TAction; + actFilterBar: TAction; + scCreate: TMSSQL; + scDrop: TMSSQL; + CRDBGrid: TCRDBGrid; + Panel2: TPanel; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + Panel3: TPanel; + chkFiltered: TCheckBox; + chkFilterBar: TCheckBox; + chkSearchBar: TCheckBox; + chkRecCount: TCheckBox; + chkStretch: TCheckBox; + DBNavigator1: TDBNavigator; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure actSearchBarExecute(Sender: TObject); + procedure actSearchBarUpdate(Sender: TObject); + procedure actFilterBarExecute(Sender: TObject); + procedure actFilterBarUpdate(Sender: TObject); + procedure chkFilteredClick(Sender: TObject); + procedure chkRecCountClick(Sender: TObject); + procedure chkStretchClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TCRDBGridFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TCRDBGridFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TCRDBGridFrame.actSearchBarExecute(Sender: TObject); +begin + actSearchBar.Checked := not actSearchBar.Checked; + if actSearchBar.Checked then + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx + [dgeSearchBar] + else + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx - [dgeSearchBar]; +end; + +procedure TCRDBGridFrame.actSearchBarUpdate(Sender: TObject); +begin + actSearchBar.Checked := dgeSearchBar in CRDBGrid.OptionsEx; +end; + +procedure TCRDBGridFrame.actFilterBarExecute(Sender: TObject); +begin + actFilterBar.Checked := not actFilterBar.Checked; + if actFilterBar.Checked then + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx + [dgeFilterBar] + else + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx - [dgeFilterBar]; +end; + +procedure TCRDBGridFrame.actFilterBarUpdate(Sender: TObject); +begin + actFilterBar.Checked := dgeFilterBar in CRDBGrid.OptionsEx; +end; + +procedure TCRDBGridFrame.chkFilteredClick(Sender: TObject); +begin + CRDBGrid.Filtered := chkFiltered.Checked; +end; + +procedure TCRDBGridFrame.chkRecCountClick(Sender: TObject); +begin + if chkRecCount.Checked then + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx + [dgeRecordCount] + else + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx - [dgeRecordCount]; +end; + +procedure TCRDBGridFrame.chkStretchClick(Sender: TObject); +begin + if chkStretch.Checked then + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx + [dgeStretch] + else + CRDBGrid.OptionsEx := CRDBGrid.OptionsEx - [dgeStretch]; +end; + +// Demo management +procedure TCRDBGridFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; +end; + +procedure TCRDBGridFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/CachedUpdates.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/CachedUpdates.nfm new file mode 100644 index 0000000..5eb14e3 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/CachedUpdates.nfm @@ -0,0 +1,372 @@ +inherited CachedUpdatesFrame: TCachedUpdatesFrame + Width = 443 + Height = 277 + Align = alClient + object DBGrid: TDBGrid + Left = 0 + Top = 102 + Width = 443 + Height = 175 + Align = alClient + DataSource = DataSource + Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgCancelOnExit] + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + OnDrawDataCell = DBGridDrawDataCell + end + object Panel8: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 102 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object ToolBar: TPanel + Left = 1 + Top = 1 + Width = 667 + Height = 100 + BevelOuter = bvNone + Color = clGreen + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object RefreshRecord: TSpeedButton + Left = 408 + Top = 1 + Width = 82 + Height = 22 + Caption = 'RefreshRecord' + Flat = True + Transparent = False + OnClick = RefreshRecordClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 240 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel1: TPanel + Left = 1 + Top = 47 + Width = 368 + Height = 52 + BevelOuter = bvNone + TabOrder = 1 + object Label2: TLabel + Left = 5 + Top = 5 + Width = 48 + Height = 13 + Caption = 'Updates' + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel3: TPanel + Left = 20 + Top = 23 + Width = 333 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btApply: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Apply' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btApplyClick + end + object btCommit: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Commit' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCommitClick + end + object btCancel: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Cancel' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCancelClick + end + object btRevertRecord: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Revert' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btRevertRecordClick + end + end + end + object Panel2: TPanel + Left = 1 + Top = 24 + Width = 317 + Height = 22 + BevelOuter = bvNone + TabOrder = 2 + object Label4: TLabel + Left = 220 + Top = 5 + Width = 51 + Height = 13 + Caption = 'Batch Size' + end + object cbCachedUpdates: TCheckBox + Left = 8 + Top = 4 + Width = 97 + Height = 12 + Caption = 'CachedUpdates' + TabOrder = 0 + OnClick = cbCachedUpdatesClick + end + object cbCustomUpdate: TCheckBox + Left = 113 + Top = 4 + Width = 97 + Height = 14 + Caption = 'Custom Update' + TabOrder = 1 + OnClick = cbCustomUpdateClick + end + object edUpdateBatchSize: TEdit + Left = 276 + Top = 1 + Width = 37 + Height = 21 + TabOrder = 2 + Text = '1' + end + end + object Panel4: TPanel + Left = 370 + Top = 47 + Width = 296 + Height = 52 + BevelOuter = bvNone + TabOrder = 3 + object Label3: TLabel + Left = 5 + Top = 5 + Width = 74 + Height = 13 + Caption = 'Transactions' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel5: TPanel + Left = 24 + Top = 23 + Width = 250 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btStartTrans: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Start' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btStartTransClick + end + object btCommitTrans: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Commit' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btCommitTransClick + end + object btRollBackTrans: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Rollback' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = btRollbackTransClick + end + end + end + object Panel6: TPanel + Left = 319 + Top = 24 + Width = 347 + Height = 22 + BevelOuter = bvNone + TabOrder = 4 + object Label1: TLabel + Left = 6 + Top = 4 + Width = 64 + Height = 13 + Caption = 'RecordTypes' + end + object cbDeleted: TCheckBox + Left = 284 + Top = 4 + Width = 59 + Height = 17 + Caption = 'Deleted' + TabOrder = 0 + OnClick = cbDeletedClick + end + object cbInserted: TCheckBox + Left = 221 + Top = 4 + Width = 61 + Height = 17 + Caption = 'Inserted' + TabOrder = 1 + OnClick = cbInsertedClick + end + object cbModified: TCheckBox + Left = 155 + Top = 4 + Width = 67 + Height = 17 + Caption = 'Modified' + TabOrder = 2 + OnClick = cbModifiedClick + end + object cbUnmodified: TCheckBox + Left = 77 + Top = 4 + Width = 76 + Height = 17 + Caption = 'Unmodified' + TabOrder = 3 + OnClick = cbUnmodifiedClick + end + end + object Panel7: TPanel + Left = 491 + Top = 1 + Width = 175 + Height = 22 + BevelOuter = bvNone + TabOrder = 5 + end + end + end + object DataSource: TDataSource + DataSet = MSQuery + OnStateChange = DataSourceStateChange + OnDataChange = DataSourceDataChange + Left = 233 + Top = 50 + end + object MSQuery: TMSQuery + SQL.Strings = ( + 'SELECT * FROM Emp') + CachedUpdates = True + OnUpdateError = MSQueryUpdateError + OnCalcFields = MSQueryCalcFields + Left = 205 + Top = 48 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/CachedUpdates.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/CachedUpdates.pas new file mode 100644 index 0000000..7d6313f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/CachedUpdates.pas @@ -0,0 +1,319 @@ +unit CachedUpdates; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, MemDS, StdCtrls, ToolWin, + ComCtrls, Buttons, DBAccess, MSAccess, SdacVcl, + DemoFrame, SdacDemoForm; + +type + TCachedUpdatesFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + MSQuery: TMSQuery; + Panel8: TPanel; + ToolBar: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + RefreshRecord: TSpeedButton; + DBNavigator: TDBNavigator; + Panel1: TPanel; + Label2: TLabel; + Panel3: TPanel; + btApply: TSpeedButton; + btCommit: TSpeedButton; + btCancel: TSpeedButton; + btRevertRecord: TSpeedButton; + Panel2: TPanel; + cbCachedUpdates: TCheckBox; + cbCustomUpdate: TCheckBox; + Panel4: TPanel; + Label3: TLabel; + Panel5: TPanel; + btStartTrans: TSpeedButton; + btCommitTrans: TSpeedButton; + btRollBackTrans: TSpeedButton; + Panel6: TPanel; + Label1: TLabel; + cbDeleted: TCheckBox; + cbInserted: TCheckBox; + cbModified: TCheckBox; + cbUnmodified: TCheckBox; + Panel7: TPanel; + Label4: TLabel; + edUpdateBatchSize: TEdit; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btApplyClick(Sender: TObject); + procedure btCancelClick(Sender: TObject); + procedure btStartTransClick(Sender: TObject); + procedure btCommitTransClick(Sender: TObject); + procedure btRollbackTransClick(Sender: TObject); + procedure cbCachedUpdatesClick(Sender: TObject); + procedure MSQueryUpdateError(DataSet: TDataSet; E: EDatabaseError; + UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); + procedure MSQueryUpdateRecord(DataSet: TDataSet; + UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); + procedure cbCustomUpdateClick(Sender: TObject); + procedure MSQueryCalcFields(DataSet: TDataSet); + procedure btCommitClick(Sender: TObject); + procedure cbUnmodifiedClick(Sender: TObject); + procedure cbModifiedClick(Sender: TObject); + procedure cbInsertedClick(Sender: TObject); + procedure cbDeletedClick(Sender: TObject); + procedure DataSourceDataChange(Sender: TObject; Field: TField); + procedure DataSourceStateChange(Sender: TObject); + procedure DBGridDrawDataCell(Sender: TObject; const Rect: TRect; + Field: TField; State: TGridDrawState); + procedure btRevertRecordClick(Sender: TObject); + procedure RefreshRecordClick(Sender: TObject); + private + { Private declarations } + procedure ShowTrans; + procedure ShowPending; + procedure ShowUpdateRecordTypes; + public + destructor Destroy; override; + + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +uses + UpdateAction; + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TCachedUpdatesFrame.ShowTrans; +begin + if MSQuery.Connection .InTransaction then + SdacForm.StatusBar.Panels[2].Text := 'In Transaction' + else + SdacForm.StatusBar.Panels[2].Text := ''; +end; + +procedure TCachedUpdatesFrame.ShowPending; +begin + if MSQuery.UpdatesPending then + SdacForm.StatusBar.Panels[1].Text := 'Updates Pending' + else + SdacForm.StatusBar.Panels[1].Text := ''; +end; + +procedure TCachedUpdatesFrame.ShowUpdateRecordTypes; +begin + if MSQuery.CachedUpdates then begin + cbUnmodified.Checked := rtUnmodified in MSQuery.UpdateRecordTypes; + cbModified.Checked := rtModified in MSQuery.UpdateRecordTypes; + cbInserted.Checked := rtInserted in MSQuery.UpdateRecordTypes; + cbDeleted.Checked := rtDeleted in MSQuery.UpdateRecordTypes; + end; +end; + +procedure TCachedUpdatesFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TCachedUpdatesFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TCachedUpdatesFrame.btApplyClick(Sender: TObject); +begin + MSQuery.Options.UpdateBatchSize := StrToInt(edUpdateBatchSize.Text); + MSQuery.ApplyUpdates; + ShowPending; +end; + +procedure TCachedUpdatesFrame.btCommitClick(Sender: TObject); +begin + MSQuery.CommitUpdates; + ShowPending; +end; + +procedure TCachedUpdatesFrame.btCancelClick(Sender: TObject); +begin + MSQuery.CancelUpdates; + ShowPending; +end; + +procedure TCachedUpdatesFrame.btStartTransClick(Sender: TObject); +begin + MSQuery.Connection.StartTransaction; + ShowTrans; +end; + +procedure TCachedUpdatesFrame.btCommitTransClick(Sender: TObject); +begin + MSQuery.Connection.Commit; + ShowTrans; +end; + +procedure TCachedUpdatesFrame.btRollbackTransClick(Sender: TObject); +begin + MSQuery.Connection.Rollback; + ShowTrans; +end; + +destructor TCachedUpdatesFrame.Destroy; +begin + FreeAndNil(UpdateActionForm); + inherited; +end; + +procedure TCachedUpdatesFrame.cbCachedUpdatesClick(Sender: TObject); +begin + try + MSQuery.CachedUpdates := cbCachedUpdates.Checked; + except + cbCachedUpdates.Checked := MSQuery.CachedUpdates; + raise; + end; + ShowUpdateRecordTypes; +end; + +procedure TCachedUpdatesFrame.MSQueryUpdateError(DataSet: TDataSet; E: EDatabaseError; + UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); +begin + UpdateActionForm.rgAction.ItemIndex := Ord(UpdateAction); + UpdateActionForm.rgKind.ItemIndex := Ord(UpdateKind); + UpdateActionForm.lbField.Caption := String(DataSet.Fields[0].Value); + UpdateActionForm.lbMessage.Caption := E.Message; + UpdateActionForm.ShowModal; + UpdateAction := TUpdateAction(UpdateActionForm.rgAction.ItemIndex); +end; + +procedure TCachedUpdatesFrame.MSQueryUpdateRecord(DataSet: TDataSet; + UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); +begin + UpdateActionForm.rgAction.ItemIndex := Ord(UpdateAction); + UpdateActionForm.rgKind.ItemIndex := Ord(UpdateKind); + UpdateActionForm.lbField.Caption := String(DataSet.Fields[0].NewValue); + UpdateActionForm.lbMessage.Caption := ''; + UpdateActionForm.ShowModal; + UpdateAction := TUpdateAction(UpdateActionForm.rgAction.ItemIndex); +end; + +procedure TCachedUpdatesFrame.cbCustomUpdateClick(Sender: TObject); +begin + if cbCustomUpdate.Checked then + MSQuery.OnUpdateRecord := MSQueryUpdateRecord + else + MSQuery.OnUpdateRecord := nil; +end; + +procedure TCachedUpdatesFrame.MSQueryCalcFields(DataSet: TDataSet); +var + St:string; +begin + case Ord(TCustomMSDataSet(DataSet).UpdateStatus) of + 0: St := 'Unmodified'; + 1: St := 'Modified'; + 2: St := 'Inserted'; + 3: St := 'Deleted'; + end; + DataSet.FieldByName('Status').AsString := St; + +{ case Ord(TMSDataSet(DataSet).UpdateResult) of + 0: St := 'Fail'; + 1: St := 'Abort'; + 2: St := 'Skip'; + 3: St := 'Applied'; + end; + DataSet.FieldByName('Result').AsString := St;} +end; + +procedure TCachedUpdatesFrame.cbUnmodifiedClick(Sender: TObject); +begin + if cbUnmodified.Checked then + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes + [rtUnmodified] + else + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes - [rtUnmodified]; +end; + +procedure TCachedUpdatesFrame.cbModifiedClick(Sender: TObject); +begin + if cbModified.Checked then + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes + [rtModified] + else + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes - [rtModified]; +end; + +procedure TCachedUpdatesFrame.cbInsertedClick(Sender: TObject); +begin + if cbInserted.Checked then + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes + [rtInserted] + else + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes - [rtInserted]; +end; + +procedure TCachedUpdatesFrame.cbDeletedClick(Sender: TObject); +begin + if cbDeleted.Checked then + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes + [rtDeleted] + else + MSQuery.UpdateRecordTypes := MSQuery.UpdateRecordTypes - [rtDeleted]; +end; + +procedure TCachedUpdatesFrame.DataSourceStateChange(Sender: TObject); +begin + ShowPending; + SdacForm.StatusBar.Panels[3].Text := 'Record ' + IntToStr(MSQuery.RecNo) + ' of ' + IntToStr(MSQuery.RecordCount) ; +end; + +procedure TCachedUpdatesFrame.DataSourceDataChange(Sender: TObject; Field: TField); +begin + DataSourceStateChange(nil); +end; + +procedure TCachedUpdatesFrame.DBGridDrawDataCell(Sender: TObject; const Rect: TRect; + Field: TField; State: TGridDrawState); +begin + if MSQuery.UpdateResult in [uaFail,uaSkip] then + TDBGrid(Sender).Canvas.Brush.Color := clRed + else + if MSQuery.UpdateStatus <> usUnmodified then + TDBGrid(Sender).Canvas.Brush.Color := clYellow; + + TDBGrid(Sender).DefaultDrawDataCell(Rect, Field, State); +end; + +procedure TCachedUpdatesFrame.btRevertRecordClick(Sender: TObject); +begin + MSQuery.RevertRecord; + ShowPending; +end; + +procedure TCachedUpdatesFrame.RefreshRecordClick(Sender: TObject); +begin + MSQuery.RefreshRecord; +end; + +// Demo management +procedure TCachedUpdatesFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + UpdateActionForm := TUpdateActionForm.Create(nil); + cbCachedUpdates.Checked := MSQuery.CachedUpdates; + ShowUpdateRecordTypes; +end; + +procedure TCachedUpdatesFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/UpdateAction.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/UpdateAction.nfm new file mode 100644 index 0000000..22e0817 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/UpdateAction.nfm @@ -0,0 +1,139 @@ +object UpdateActionForm: TUpdateActionForm + Left = 586 + Top = 306 + Width = 235 + Height = 300 + HorzScrollBar.Range = 199 + VertScrollBar.Range = 131 + AutoScroll = False + Caption = 'UpdateAction' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 5 + Top = 4 + Width = 217 + Height = 262 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object Panel5: TPanel + Left = 1 + Top = 1 + Width = 215 + Height = 128 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 6 + Top = 15 + Width = 46 + Height = 13 + Caption = 'Message:' + end + object Label2: TLabel + Left = 6 + Top = 1 + Width = 35 + Height = 13 + Caption = 'Record' + end + object lbField: TLabel + Left = 64 + Top = 2 + Width = 141 + Height = 13 + AutoSize = False + Caption = 'lbFileld' + end + object lbMessage: TLabel + Left = 7 + Top = 29 + Width = 201 + Height = 95 + AutoSize = False + Caption = 'lbMessage' + WordWrap = True + end + end + object Panel7: TPanel + Left = 1 + Top = 130 + Width = 98 + Height = 131 + BevelOuter = bvNone + TabOrder = 1 + object rgAction: TRadioGroup + Left = 6 + Top = 1 + Width = 87 + Height = 126 + Caption = 'UpdateAction' + Items.Strings = ( + 'Fail' + 'Abort' + 'Skip' + 'Retry' + 'Applied' + 'Default') + TabOrder = 0 + end + end + object Panel4: TPanel + Left = 100 + Top = 130 + Width = 116 + Height = 89 + BevelOuter = bvNone + TabOrder = 2 + object rgKind: TRadioGroup + Left = 7 + Top = 2 + Width = 103 + Height = 83 + Caption = 'UpdateKind' + Enabled = False + Items.Strings = ( + 'Modify' + 'Insert' + 'Delete') + TabOrder = 0 + end + end + object Panel9: TPanel + Left = 100 + Top = 220 + Width = 116 + Height = 41 + BevelOuter = bvNone + TabOrder = 3 + object Panel2: TPanel + Left = 16 + Top = 9 + Width = 84 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOk: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Ok' + Flat = True + Transparent = False + OnClick = btOkClick + end + end + end + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/UpdateAction.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/UpdateAction.pas new file mode 100644 index 0000000..3322b25 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/CachedUpdates/UpdateAction.pas @@ -0,0 +1,48 @@ +unit UpdateAction; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, Buttons; + +type + TUpdateActionForm = class(TForm) + Panel1: TPanel; + Panel5: TPanel; + Label1: TLabel; + Label2: TLabel; + lbField: TLabel; + lbMessage: TLabel; + Panel7: TPanel; + rgAction: TRadioGroup; + Panel4: TPanel; + rgKind: TRadioGroup; + Panel9: TPanel; + Panel2: TPanel; + btOk: TSpeedButton; + procedure btOkClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + UpdateActionForm: TUpdateActionForm; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TUpdateActionForm.btOkClick(Sender: TObject); +begin + ModalResult := mrOk; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectDialog.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectDialog.nfm new file mode 100644 index 0000000..78c07d3 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectDialog.nfm @@ -0,0 +1,115 @@ +inherited ConnectDialogFrame: TConnectDialogFrame + Width = 441 + Height = 275 + Align = alClient + object DBGrid: TDBGrid + Left = 0 + Top = 54 + Width = 441 + Height = 221 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 54 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 398 + Height = 52 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel3: TPanel + Left = 1 + Top = 24 + Width = 396 + Height = 27 + BevelOuter = bvNone + TabOrder = 1 + object rbInherited: TRadioButton + Left = 216 + Top = 5 + Width = 113 + Height = 17 + Caption = 'Inherited connect' + TabOrder = 0 + OnClick = rbInheritedClick + end + object rbMy: TRadioButton + Left = 112 + Top = 5 + Width = 81 + Height = 17 + Caption = 'My connect' + TabOrder = 1 + OnClick = rbMyClick + end + object rbDefault: TRadioButton + Left = 8 + Top = 5 + Width = 65 + Height = 17 + Caption = 'Default' + Checked = True + TabOrder = 2 + TabStop = True + OnClick = rbDefaultClick + end + end + end + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 464 + Top = 32 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Emp') + Left = 432 + Top = 32 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectDialog.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectDialog.pas new file mode 100644 index 0000000..219c3f7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectDialog.pas @@ -0,0 +1,93 @@ +unit ConnectDialog; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Db, MemDS, Grids, DBGrids, DBCtrls, StdCtrls, ExtCtrls, DBAccess, + MSAccess, SdacVcl, Buttons, DemoFrame, + InheritedConnectForm, MyConnectForm; + +type + TConnectDialogFrame = class(TDemoFrame) + DataSource: TDataSource; + MSQuery: TMSQuery; + DBGrid: TDBGrid; + ToolBar: TPanel; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + Panel3: TPanel; + rbInherited: TRadioButton; + rbMy: TRadioButton; + rbDefault: TRadioButton; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure rbDefaultClick(Sender: TObject); + procedure rbMyClick(Sender: TObject); + procedure rbInheritedClick(Sender: TObject); + private + { Private declarations } + public + destructor Destroy; override; + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +destructor TConnectDialogFrame.Destroy; +begin + MSQuery.Connection.ConnectDialog.DialogClass := ''; + inherited; +end; + + +procedure TConnectDialogFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TConnectDialogFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TConnectDialogFrame.rbDefaultClick(Sender: TObject); +begin + MSQuery.Connection.ConnectDialog.DialogClass := ''; +end; + +procedure TConnectDialogFrame.rbMyClick(Sender: TObject); +begin + MSQuery.Connection.ConnectDialog.DialogClass := 'TfmMyConnect'; +end; + +procedure TConnectDialogFrame.rbInheritedClick(Sender: TObject); +begin + MSQuery.Connection.ConnectDialog.DialogClass := 'TfmInheritedConnect'; +end; + +// Demo management +procedure TConnectDialogFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; +end; + +procedure TConnectDialogFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug:= Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectForm.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectForm.nfm new file mode 100644 index 0000000..722acee --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectForm.nfm @@ -0,0 +1,112 @@ +object ConnectForm: TConnectForm + Left = 368 + Top = 255 + ActiveControl = edUsername + BorderIcons = [] + BorderStyle = bsDialog + Caption = 'Connect' + ClientHeight = 175 + ClientWidth = 291 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + Scaled = False + PixelsPerInch = 96 + TextHeight = 13 + object Panel: TPanel + Left = 8 + Top = 8 + Width = 273 + Height = 121 + BevelInner = bvRaised + BevelOuter = bvLowered + FullRepaint = False + TabOrder = 0 + object lbUsername: TLabel + Left = 16 + Top = 20 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Username' + Layout = tlCenter + end + object lbPassword: TLabel + Left = 16 + Top = 54 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Password' + Layout = tlCenter + end + object lbServer: TLabel + Left = 16 + Top = 88 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Server' + Layout = tlCenter + end + object edUsername: TEdit + Left = 104 + Top = 16 + Width = 153 + Height = 21 + AutoSelect = False + MaxLength = 32767 + TabOrder = 0 + end + object edPassword: TEdit + Left = 104 + Top = 50 + Width = 153 + Height = 21 + AutoSelect = False + MaxLength = 32767 + PasswordChar = '*' + TabOrder = 1 + end + object edServer: TComboBox + Left = 104 + Top = 84 + Width = 153 + Height = 21 + DropDownCount = 10 + ItemHeight = 13 + TabOrder = 2 + end + end + object btConnect: TButton + Left = 52 + Top = 141 + Width = 89 + Height = 25 + Caption = 'Connect' + Default = True + TabOrder = 1 + OnClick = btConnectClick + end + object btCancel: TButton + Left = 148 + Top = 141 + Width = 89 + Height = 25 + Cancel = True + Caption = 'Cancel' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ModalResult = 2 + ParentFont = False + TabOrder = 2 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectForm.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectForm.pas new file mode 100644 index 0000000..09cd94c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/ConnectForm.pas @@ -0,0 +1,123 @@ + +////////////////////////////////////////////////// +// MS SQL Server Data Access Components +// Copyright © 1998-2001 Core Lab. All right reserved. +// Connect Form +////////////////////////////////////////////////// + +unit ConnectForm; +interface +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, DBAccess, OLEDBAccess, OLEDBIntf, OLEDBC; + +type + TConnectForm = class(TForm) + Panel: TPanel; + lbUsername: TLabel; + lbPassword: TLabel; + lbServer: TLabel; + edUsername: TEdit; + btConnect: TButton; + btCancel: TButton; + edPassword: TEdit; + edServer: TComboBox; + procedure btConnectClick(Sender: TObject); + + private + FConnectDialog: TCustomConnectDialog; + FRetries: integer; + FOldCreateOrder: boolean; + FRetry: boolean; + + procedure SetConnectDialog(Value: TCustomConnectDialog); + + protected + procedure DoInit; virtual; + procedure DoConnect; virtual; + + public + + published + property ConnectDialog: TCustomConnectDialog read FConnectDialog write SetConnectDialog; + + property OldCreateOrder: boolean read FOldCreateOrder write FOldCreateOrder; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TConnectForm.DoInit; +begin + FRetry := False; + FRetries := FConnectDialog.Retries; + Caption := FConnectDialog.Caption; + + with FConnectDialog do begin + lbUsername.Caption := UsernameLabel; + lbPassword.Caption := PasswordLabel; + lbServer.Caption := ServerLabel; + btConnect.Caption := ConnectButton; + btCancel.Caption := CancelButton; + + FConnectDialog.GetServerList(edServer.Items); + edUsername.Text := Connection.Username; + edPassword.Text := Connection.Password; + edServer.Text := Connection.Server; + + if (edUsername.Text <> '') and (edPassword.Text = '') then + ActiveControl := edPassword; + end; +end; + +procedure TConnectForm.DoConnect; +begin + FConnectDialog.Connection.Password := edPassword.Text; + FConnectDialog.Connection.Server := edServer.Text; + FConnectDialog.Connection.UserName := edUsername.Text; + try + FConnectDialog.Connection.PerformConnect(FRetry); + ModalResult := mrOk; + except + on E: EMSError do begin + Dec(FRetries); + FRetry := True; + if FRetries = 0 then + ModalResult := mrCancel; + + if E.MSSQLErrorCode <= NE_MAX_NETERROR then + ActiveControl := edServer + else + if E.OLEDBErrorCode = DB_SEC_E_AUTH_FAILED then + if ActiveControl <> edUsername then + ActiveControl := edPassword; + raise; + end + else + raise; + end; +end; + +procedure TConnectForm.SetConnectDialog(Value: TCustomConnectDialog); +begin + FConnectDialog := Value; + DoInit; +end; + +procedure TConnectForm.btConnectClick(Sender: TObject); +begin + DoConnect; +end; + +initialization + if GetClass('TConnectForm') = nil then + Classes.RegisterClass(TConnectForm); +// Classes.GroupDescendentsWith(TConnectForm, TForm); +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/InheritedConnectForm.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/InheritedConnectForm.nfm new file mode 100644 index 0000000..3eba499 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/InheritedConnectForm.nfm @@ -0,0 +1,43 @@ +inherited fmInheritedConnect: TfmInheritedConnect + Left = 359 + Top = 212 + Caption = 'Inherited Connect' + PixelsPerInch = 96 + TextHeight = 13 + inherited Panel: TPanel + BevelOuter = bvNone + inherited lbUsername: TLabel + Width = 80 + Font.Color = clNavy + Font.Style = [fsBold] + ParentFont = False + end + inherited lbPassword: TLabel + Width = 55 + Font.Color = clNavy + Font.Style = [fsBold] + ParentFont = False + end + inherited lbServer: TLabel + Width = 38 + Font.Color = clNavy + Font.Style = [fsBold] + ParentFont = False + end + inherited lbDatabase: TLabel + Font.Color = clNavy + Font.Style = [fsBold] + ParentFont = False + end + end + inherited btConnect: TButton + Left = 98 + Width = 82 + Height = 22 + end + inherited btCancel: TButton + Left = 193 + Width = 82 + Height = 22 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/InheritedConnectForm.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/InheritedConnectForm.pas new file mode 100644 index 0000000..a937a48 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/InheritedConnectForm.pas @@ -0,0 +1,32 @@ +unit InheritedConnectForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Mask, ExtCtrls, MSConnectForm; + +type + TfmInheritedConnect = class(TMSConnectForm) + private + { Private declarations } + public + { Public declarations } + end; + +var + fmInheritedConnect: TfmInheritedConnect; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +initialization + if GetClass('TfmInheritedConnect') = nil then + Classes.RegisterClass(TfmInheritedConnect); +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/MyConnectForm.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/MyConnectForm.nfm new file mode 100644 index 0000000..d9a93b0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/MyConnectForm.nfm @@ -0,0 +1,151 @@ +object fmMyConnect: TfmMyConnect + Left = 305 + Top = 192 + BorderStyle = bsDialog + Caption = 'My Connect' + ClientHeight = 216 + ClientWidth = 288 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Panel: TPanel + Left = 8 + Top = 8 + Width = 273 + Height = 201 + BevelInner = bvRaised + BevelOuter = bvLowered + TabOrder = 0 + object lbUsername: TLabel + Left = 16 + Top = 20 + Width = 54 + Height = 13 + Caption = 'Username' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsItalic] + ParentFont = False + end + object lbPassword: TLabel + Left = 16 + Top = 54 + Width = 52 + Height = 13 + Caption = 'Password' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsItalic] + ParentFont = False + end + object lbServer: TLabel + Left = 16 + Top = 88 + Width = 37 + Height = 13 + Caption = 'Server' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsItalic] + ParentFont = False + end + object Bevel1: TBevel + Left = 1 + Top = 150 + Width = 270 + Height = 6 + Shape = bsBottomLine + end + object lbDatabase: TLabel + Left = 16 + Top = 122 + Width = 52 + Height = 13 + Caption = 'Database' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsItalic] + ParentFont = False + end + object edUsername: TEdit + Left = 104 + Top = 16 + Width = 153 + Height = 21 + TabOrder = 0 + end + object edPassword: TMaskEdit + Left = 104 + Top = 50 + Width = 153 + Height = 21 + PasswordChar = '*' + TabOrder = 1 + end + object edServer: TComboBox + Left = 104 + Top = 84 + Width = 153 + Height = 21 + ItemHeight = 13 + TabOrder = 2 + end + object edDatabase: TEdit + Left = 104 + Top = 118 + Width = 153 + Height = 21 + TabOrder = 3 + end + end + object btConnect: TBitBtn + Left = 81 + Top = 174 + Width = 82 + Height = 24 + Caption = 'OK' + Default = True + TabOrder = 1 + OnClick = btConnectClick + Glyph.Data = { + DE010000424DDE01000000000000760000002800000024000000120000000100 + 0400000000006801000000000000000000001000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 3333333333333333333333330000333333333333333333333333F33333333333 + 00003333344333333333333333388F3333333333000033334224333333333333 + 338338F3333333330000333422224333333333333833338F3333333300003342 + 222224333333333383333338F3333333000034222A22224333333338F338F333 + 8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224 + 33333338F83338F338F33333000033A33333A222433333338333338F338F3333 + 0000333333333A222433333333333338F338F33300003333333333A222433333 + 333333338F338F33000033333333333A222433333333333338F338F300003333 + 33333333A222433333333333338F338F00003333333333333A22433333333333 + 3338F38F000033333333333333A223333333333333338F830000333333333333 + 333A333333333333333338330000333333333333333333333333333333333333 + 0000} + NumGlyphs = 2 + end + object btCancel: TBitBtn + Left = 177 + Top = 174 + Width = 82 + Height = 24 + TabOrder = 2 + Kind = bkCancel + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/MyConnectForm.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/MyConnectForm.pas new file mode 100644 index 0000000..6ed1db5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ConnectDialog/MyConnectForm.pas @@ -0,0 +1,128 @@ +unit MyConnectForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OLEDBIntf, + OLEDBC, StdCtrls, Mask, ExtCtrls, Buttons, MSAccess, OLEDBAccess, DBAccess, SdacVcl; + +type + TfmMyConnect = class(TForm) + Panel: TPanel; + lbUsername: TLabel; + lbPassword: TLabel; + lbServer: TLabel; + edUsername: TEdit; + edPassword: TMaskEdit; + edServer: TComboBox; + btConnect: TBitBtn; + btCancel: TBitBtn; + Bevel1: TBevel; + edDatabase: TEdit; + lbDatabase: TLabel; + procedure btConnectClick(Sender: TObject); + private + FConnectDialog: TMSConnectDialog; + FRetries:integer; + FRetry: boolean; + + procedure SetConnectDialog(Value: TMSConnectDialog); + + protected + procedure DoInit; virtual; + procedure DoConnect; virtual; + + public + + published + property ConnectDialog: TMSConnectDialog read FConnectDialog write SetConnectDialog; + + end; + +var + fmMyConnect: TfmMyConnect; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TfmMyConnect.DoInit; +begin + FRetry := False; + FRetries := FConnectDialog.Retries; + Caption := FConnectDialog.Caption; + + lbUsername.Caption := FConnectDialog.UsernameLabel; + lbPassword.Caption := FConnectDialog.PasswordLabel; + lbServer.Caption := FConnectDialog.ServerLabel; + btConnect.Caption := FConnectDialog.ConnectButton; + btCancel.Caption := FConnectDialog.CancelButton; + + FConnectDialog.GetServerList(edServer.Items); + edUsername.Text := FConnectDialog.Connection.Username; + edPassword.Text := FConnectDialog.Connection.Password; + edServer.Text := FConnectDialog.Connection.Server; + edDatabase.Text := FConnectDialog.Connection.Database; + + if (edUsername.Text <> '') and (edPassword.Text = '') then + ActiveControl := edPassword; +end; + +procedure TfmMyConnect.DoConnect; +begin + FConnectDialog.Connection.Password := edPassword.Text; + FConnectDialog.Connection.Server := edServer.Text; + FConnectDialog.Connection.UserName := edUsername.Text; + FConnectDialog.Connection.Database := edDatabase.Text; + try + FConnectDialog.Connection.PerformConnect(FRetry); + ModalResult := mrOk; + except + on E: EMSError do begin + Dec(FRetries); + FRetry := True; + if FRetries = 0 then + ModalResult := mrCancel; + + if E.MSSQLErrorCode <= NE_MAX_NETERROR then + ActiveControl := edServer + else + if E.OLEDBErrorCode = DB_SEC_E_AUTH_FAILED then + if ActiveControl <> edUsername then + ActiveControl := edPassword; + raise; + end + else + raise; + end; +end; + +procedure TfmMyConnect.SetConnectDialog(Value: TMSConnectDialog); +begin + FConnectDialog:= Value; + DoInit; +end; + +procedure TfmMyConnect.btConnectClick(Sender: TObject); +begin + DoConnect; +end; + +initialization + if GetClass('TfmMyConnect') = nil then begin + {$IFDEF VER6P} + Classes.StartClassGroup(TfmMyConnect); + {$ENDIF} + Classes.RegisterClass(TfmMyConnect); + {$IFDEF VER6P} + ActivateClassGroup(TfmMyConnect); + {$ENDIF} + end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FetchAll/FetchAll.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FetchAll/FetchAll.nfm new file mode 100644 index 0000000..216a2cf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FetchAll/FetchAll.nfm @@ -0,0 +1,188 @@ +inherited FetchAllFrame: TFetchAllFrame + Width = 691 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 105 + Width = 691 + Height = 2 + Cursor = crVSplit + Align = alTop + Color = clGreen + ParentColor = False + end + object DBGrid: TDBGrid + Left = 0 + Top = 107 + Width = 691 + Height = 170 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 691 + Height = 25 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 0 + Width = 727 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btFillTables: TSpeedButton + Left = 480 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Fill tables' + Flat = True + Transparent = False + OnClick = btFillTablesClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel2: TPanel + Left = 398 + Top = 1 + Width = 81 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object FetchAllCB: TCheckBox + Left = 9 + Top = 4 + Width = 70 + Height = 17 + Caption = 'FetchAll' + TabOrder = 0 + OnClick = FetchAllCBClick + end + end + object Panel3: TPanel + Left = 563 + Top = 1 + Width = 163 + Height = 22 + BevelOuter = bvNone + TabOrder = 2 + object Label1: TLabel + Left = 6 + Top = 5 + Width = 52 + Height = 13 + Caption = 'Row count' + end + object edRowCount: TEdit + Left = 68 + Top = 2 + Width = 91 + Height = 21 + TabOrder = 0 + Text = '3000' + end + end + end + end + object Memo: TMemo + Left = 0 + Top = 25 + Width = 691 + Height = 80 + Align = alTop + ScrollBars = ssVertical + TabOrder = 2 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 528 + Top = 120 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'select TOP 100000 * from Loaded1, Loaded2') + ReadOnly = True + FetchAll = False + Left = 496 + Top = 120 + end + object MSSQLFillTables: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'declare' + ' @i INTEGER;' + 'begin' + ' SET @i = 0' + ' WHILE @i <= :Cnt' + ' BEGIN' + ' SET @i = @i + 1' + ' INSERT INTO Loaded1 (' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39',' + ' '#39'23456789012345678901'#39');' + ' INSERT INTO Loaded2 (' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39',' + ' '#39'23456789012345678901'#39');' + ' END;' + 'end;') + CommandTimeout = 0 + Left = 525 + Top = 60 + ParamData = < + item + DataType = ftInteger + Name = 'Cnt' + ParamType = ptInput + Value = 1000 + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FetchAll/FetchAll.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FetchAll/FetchAll.pas new file mode 100644 index 0000000..15d7b36 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FetchAll/FetchAll.pas @@ -0,0 +1,100 @@ +unit FetchAll; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, SdacVcl, + ComCtrls, Buttons, MemDS, DBAccess, MSAccess, OLEDBAccess, DemoFrame, + SdacDemoForm; + +type + TFetchAllFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + Memo: TMemo; + MSQuery: TMSQuery; + Panel1: TPanel; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + btOpen: TSpeedButton; + Splitter1: TSplitter; + Panel2: TPanel; + FetchAllCB: TCheckBox; + btFillTables: TSpeedButton; + Panel3: TPanel; + Label1: TLabel; + edRowCount: TEdit; + MSSQLFillTables: TMSSQL; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure FetchAllCBClick(Sender: TObject); + procedure btFillTablesClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TFetchAllFrame.btOpenClick(Sender: TObject); +var + dt: TDateTime; +begin + MSQuery.Connection.Open; + + MSQuery.SQL.Assign(Memo.Lines); + + if MSQuery.FetchAll then + SdacForm.StatusBar.Panels[1].Text := 'FetchAll is True' + else + SdacForm.StatusBar.Panels[1].Text := 'FetchAll is False'; + + dt := Now; + MSQuery.Open; + SdacForm.StatusBar.Panels[2].Text := 'Opened in ' + TimeToStr(Now - dt); + SdacForm.StatusBar.Update; +end; + +procedure TFetchAllFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TFetchAllFrame.FetchAllCBClick(Sender: TObject); +begin + MSQuery.FetchAll := FetchAllCB.Checked; +end; + +// Demo management +procedure TFetchAllFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + Memo.Lines.Text := MSQuery.SQL.Text; + FetchAllCB.Checked := MSQuery.FetchAll; +end; + +procedure TFetchAllFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +procedure TFetchAllFrame.btFillTablesClick(Sender: TObject); +begin + MSSQLFillTables.ParamByName('cnt').AsString := edRowCount.Text; + MSSQLFillTables.Execute; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FilterAndIndex/FilterAndIndex.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FilterAndIndex/FilterAndIndex.nfm new file mode 100644 index 0000000..6bff59c --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FilterAndIndex/FilterAndIndex.nfm @@ -0,0 +1,311 @@ +inherited FilterAndIndexFrame: TFilterAndIndexFrame + Width = 443 + Height = 277 + Align = alClient + object DBGrid: TDBGrid + Left = 166 + Top = 47 + Width = 277 + Height = 230 + Align = alClient + DataSource = DataSource + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object Panel4: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 47 + Align = alTop + BevelOuter = bvNone + Locked = True + TabOrder = 1 + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 651 + Height = 47 + Align = alLeft + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object Panel5: TPanel + Left = 388 + Top = 1 + Width = 149 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbCalcFields: TCheckBox + Left = 8 + Top = 0 + Width = 142 + Height = 23 + Caption = 'Calculated/Lookup fields' + Color = clBtnFace + ParentColor = False + TabOrder = 0 + OnClick = cbCalcFieldsClick + end + end + object Panel2: TPanel + Left = 167 + Top = 24 + Width = 483 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object cbFilter: TCheckBox + Left = 380 + Top = 0 + Width = 54 + Height = 21 + Caption = 'Filter' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentColor = False + ParentFont = False + TabOrder = 0 + OnClick = cbFilterClick + end + object edFilter: TEdit + Left = 6 + Top = 2 + Width = 365 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Text = 'DEPTNO = 10' + OnExit = edFilterExit + end + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 1 + Width = 220 + Height = 23 + DataSource = DataSource + Flat = True + TabOrder = 2 + end + object Panel1: TPanel + Left = 538 + Top = 1 + Width = 112 + Height = 22 + BevelOuter = bvNone + TabOrder = 3 + object cbCacheCalcFields: TCheckBox + Left = 9 + Top = 0 + Width = 100 + Height = 23 + Caption = 'CacheCalcFields' + Color = clBtnFace + ParentColor = False + TabOrder = 0 + OnClick = cbCacheCalcFieldsClick + end + end + object Panel6: TPanel + Left = 0 + Top = 24 + Width = 166 + Height = 22 + BevelOuter = bvNone + TabOrder = 4 + object cbIndex: TCheckBox + Left = 9 + Top = 3 + Width = 64 + Height = 15 + Caption = 'Index' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentColor = False + ParentFont = False + TabOrder = 0 + OnClick = cbIndexClick + end + end + end + end + object Panel3: TPanel + Left = 0 + Top = 47 + Width = 166 + Height = 230 + Align = alLeft + BevelOuter = bvNone + ParentColor = True + TabOrder = 2 + object Panel8: TPanel + Left = 0 + Top = 146 + Width = 166 + Height = 84 + Align = alBottom + BevelOuter = bvNone + Caption = 'Panel8' + Color = clGreen + TabOrder = 0 + object Panel7: TPanel + Left = 1 + Top = 1 + Width = 164 + Height = 82 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 6 + Top = 3 + Width = 90 + Height = 13 + Caption = 'IndexFieldNames =' + end + object lbIndexFieldNames: TLabel + Left = 6 + Top = 22 + Width = 126 + Height = 54 + AutoSize = False + Transparent = False + WordWrap = True + end + end + end + object lbFields: TListBox + Left = 0 + Top = 0 + Width = 166 + Height = 146 + Align = alClient + ItemHeight = 13 + MultiSelect = True + TabOrder = 1 + OnClick = lbFieldsClick + end + end + object Query: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Emp') + Debug = True + RefreshOptions = [roAfterInsert, roAfterUpdate] + Left = 272 + Top = 55 + end + object DataSource: TDataSource + DataSet = Query + Left = 304 + Top = 55 + end + object Query2: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Emp') + Debug = True + OnCalcFields = Query2CalcFields + Left = 272 + Top = 88 + object Query2CALCULATED: TIntegerField + FieldKind = fkCalculated + FieldName = 'CALCULATED' + Calculated = True + end + object Query2LOOKUP: TStringField + FieldKind = fkLookup + FieldName = 'LOOKUP' + LookupDataSet = LookupQuery + LookupKeyFields = 'DEPTNO' + LookupResultField = 'DNAME' + KeyFields = 'DEPTNO' + Lookup = True + end + object Query2EMPNO: TIntegerField + FieldName = 'EMPNO' + Required = True + end + object Query2ENAME: TStringField + FieldName = 'ENAME' + Size = 10 + end + object Query2JOB: TStringField + FieldName = 'JOB' + Size = 9 + end + object Query2MGR: TIntegerField + FieldName = 'MGR' + end + object Query2HIREDATE: TDateTimeField + FieldName = 'HIREDATE' + end + object Query2SAL: TFloatField + FieldName = 'SAL' + end + object Query2COMM: TFloatField + FieldName = 'COMM' + end + object Query2DEPTNO: TIntegerField + FieldName = 'DEPTNO' + end + end + object LookupQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Dept') + Left = 304 + Top = 88 + object LookupQueryDEPTNO: TIntegerField + FieldName = 'DEPTNO' + Required = True + end + object LookupQueryDNAME: TStringField + FieldName = 'DNAME' + Size = 14 + end + object LookupQueryLOC: TStringField + FieldName = 'LOC' + Size = 13 + end + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FilterAndIndex/FilterAndIndex.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FilterAndIndex/FilterAndIndex.pas new file mode 100644 index 0000000..7891adf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/FilterAndIndex/FilterAndIndex.pas @@ -0,0 +1,206 @@ +unit FilterAndIndex; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, SdacVcl, + MemDS, DBAccess, MSAccess, DB, Buttons, DemoFrame, SdacDemoForm; + +type + TFilterAndIndexFrame = class(TDemoFrame) + Query: TMSQuery; + DBGrid: TDBGrid; + DataSource: TDataSource; + Panel4: TPanel; + ToolBar: TPanel; + btClose: TSpeedButton; + btOpen: TSpeedButton; + DBNavigator1: TDBNavigator; + Panel3: TPanel; + Query2: TMSQuery; + LookupQuery: TMSQuery; + Query2EMPNO: TIntegerField; + Query2ENAME: TStringField; + Query2JOB: TStringField; + Query2MGR: TIntegerField; + Query2HIREDATE: TDateTimeField; + Query2SAL: TFloatField; + Query2COMM: TFloatField; + Query2DEPTNO: TIntegerField; + LookupQueryDEPTNO: TIntegerField; + LookupQueryDNAME: TStringField; + LookupQueryLOC: TStringField; + Query2CALCULATED: TIntegerField; + Query2LOOKUP: TStringField; + Label1: TLabel; + lbIndexFieldNames: TLabel; + Panel5: TPanel; + Panel2: TPanel; + Panel7: TPanel; + Panel8: TPanel; + lbFields: TListBox; + cbFilter: TCheckBox; + cbCalcFields: TCheckBox; + Panel1: TPanel; + cbCacheCalcFields: TCheckBox; + edFilter: TEdit; + Panel6: TPanel; + cbIndex: TCheckBox; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure Query2CalcFields(DataSet: TDataSet); + procedure cbFilterClick(Sender: TObject); + procedure cbCalcFieldsClick(Sender: TObject); + procedure cbIndexClick(Sender: TObject); + procedure lbFieldsClick(Sender: TObject); + procedure cbCacheCalcFieldsClick(Sender: TObject); + procedure edFilterExit(Sender: TObject); + private + FOldActive: boolean; + FFilterFilterNames: TStringList; + procedure BeginChange; + procedure EndChange; + public + destructor Destroy; override; + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +var + FilterAndIndexFrame: TFilterAndIndexFrame; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TFilterAndIndexFrame.btOpenClick(Sender: TObject); +var + i: integer; +begin + if DataSource.DataSet.Active then + Exit; + lbFields.Items.Clear; + lbFieldsClick(nil); + cbFilterClick(nil); + DataSource.DataSet.Open; + for i := 0 to DataSource.DataSet.FieldCount - 1 do + lbFields.Items.Add(DataSource.DataSet.Fields[i].FieldName); +end; + +procedure TFilterAndIndexFrame.btCloseClick(Sender: TObject); +begin + DataSource.DataSet.Close; +end; + +procedure TFilterAndIndexFrame.Query2CalcFields(DataSet: TDataSet); +begin + Query2CALCULATED.AsInteger := Query2EMPNO.AsInteger * 2; +end; + +procedure TFilterAndIndexFrame.BeginChange; +begin + FOldActive := DataSource.DataSet.Active; + if FOldActive then + btCloseClick(nil); +end; + +procedure TFilterAndIndexFrame.EndChange; +begin + if FOldActive then + btOpenClick(nil); +end; + +procedure TFilterAndIndexFrame.cbFilterClick(Sender: TObject); +begin + DataSource.DataSet.Filtered := cbFilter.Checked; + DataSource.DataSet.Filter := edFilter.Text; +end; + +procedure TFilterAndIndexFrame.cbCalcFieldsClick(Sender: TObject); +begin + BeginChange; + if cbCalcFields.Checked then + DataSource.DataSet := Query2 + else + DataSource.DataSet := Query; + EndChange; +end; + +procedure TFilterAndIndexFrame.cbIndexClick(Sender: TObject); +begin + if cbIndex.Checked then + TMSQuery(DataSource.DataSet).IndexFieldNames := lbIndexFieldNames.Caption + else + TMSQuery(DataSource.DataSet).IndexFieldNames := '' +end; + +procedure TFilterAndIndexFrame.lbFieldsClick(Sender: TObject); +var + i, k: integer; + s: string; +begin + i := 0; + while i < FFilterFilterNames.Count do begin + k := lbFields.Items.IndexOf(FFilterFilterNames[i]); + if (k < 0) or not lbFields.Selected[k] then + FFilterFilterNames.Delete(i) + else + Inc(i); + end; + for i := 0 to lbFields.Items.Count - 1 do + if lbFields.Selected[i] and + (FFilterFilterNames.IndexOf(lbFields.Items[i]) < 0) then + FFilterFilterNames.Add(lbFields.Items[i]); + + s := ''; + for i := 0 to FFilterFilterNames.Count - 1 do begin + if s <> '' then + s := s + ', '; + s := s + FFilterFilterNames[i]; + end; + lbIndexFieldNames.Caption := s; + + cbIndexClick(nil); +end; + +procedure TFilterAndIndexFrame.cbCacheCalcFieldsClick(Sender: TObject); +begin + BeginChange; + TMSQuery(DataSource.DataSet).Options.CacheCalcFields := cbCacheCalcFields.Checked; + EndChange; +end; + +procedure TFilterAndIndexFrame.edFilterExit(Sender: TObject); +begin + cbFilterClick(nil); +end; + +destructor TFilterAndIndexFrame.Destroy; +begin + FFilterFilterNames.Free; + inherited; +end; + +// Demo management +procedure TFilterAndIndexFrame.Initialize; +begin + inherited; + Query.Connection := Connection as TMSConnection; + Query2.Connection := Connection as TMSConnection; + FFilterFilterNames := TStringList.Create; +end; + +procedure TFilterAndIndexFrame.SetDebug(Value: boolean); +begin + Query.Debug := Value; + Query2.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Fetch.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Fetch.nfm new file mode 100644 index 0000000..9030202 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Fetch.nfm @@ -0,0 +1,62 @@ +object FetchForm: TFetchForm + Left = 396 + Top = 205 + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'Loading' + ClientHeight = 134 + ClientWidth = 299 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsStayOnTop + KeyPreview = True + OldCreateOrder = False + Position = poMainFormCenter + OnKeyDown = FormKeyDown + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 61 + Width = 287 + Height = 13 + Caption = 'Press Cancel button to interrupt loading operation.' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel1: TPanel + Left = 102 + Top = 93 + Width = 84 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btCancel: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Cancel' + Flat = True + Transparent = False + OnClick = btCancelClick + end + end + object ProgressBar: TProgressBar + Left = 8 + Top = 25 + Width = 287 + Height = 16 + TabOrder = 1 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Fetch.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Fetch.pas new file mode 100644 index 0000000..6019ccf --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Fetch.pas @@ -0,0 +1,72 @@ +unit Fetch; + +interface + +uses +{$IFDEF LINUX} + QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QDBCtrls, QComCtrls, QExtCtrls, QGrids, QButtons, +{$ELSE} + Windows, Messages,Graphics, Controls, Forms, Dialogs, Buttons, + DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, +{$ENDIF} +{$IFDEF CLR} + System.ComponentModel, +{$ENDIF} + SysUtils, Classes; + +type + TFetchForm = class(TForm) + Label1: TLabel; + Panel1: TPanel; + btCancel: TSpeedButton; + ProgressBar: TProgressBar; + procedure btCancelClick(Sender: TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure FormShow(Sender: TObject); + private + { Private declarations } + public + CancelLoad: boolean; + end; + +var + FetchForm: TFetchForm; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TFetchForm.btCancelClick(Sender: TObject); +begin + CancelLoad := True; + Hide; +end; + +procedure TFetchForm.FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + +{$IFDEF LINUX} +const + VK_ESCAPE = 27; +{$ENDIF} +begin + if Key = VK_ESCAPE then + Close; +end; + +procedure TFetchForm.FormShow(Sender: TObject); +begin + ProgressBar.Position := 0; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Loader.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Loader.nfm new file mode 100644 index 0000000..d159881 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Loader.nfm @@ -0,0 +1,185 @@ +inherited LoaderFrame: TLoaderFrame + Width = 443 + Height = 277 + Align = alClient + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 64 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object ToolBar: TPanel + Left = 1 + Top = 1 + Width = 586 + Height = 62 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 24 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 87 + Top = 1 + Width = 85 + Height = 24 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btLoad: TSpeedButton + Left = 173 + Top = 1 + Width = 85 + Height = 24 + Caption = 'Load' + Flat = True + Transparent = False + OnClick = btLoadClick + end + object btDeleteAll: TSpeedButton + Left = 259 + Top = 1 + Width = 85 + Height = 24 + Caption = 'Delete All' + Flat = True + Transparent = False + OnClick = btDeleteAllClick + end + object DBNavigator: TDBNavigator + Left = 345 + Top = 1 + Width = 240 + Height = 24 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel1: TPanel + Left = 1 + Top = 26 + Width = 171 + Height = 35 + BevelOuter = bvNone + TabOrder = 1 + object Label1: TLabel + Left = 6 + Top = 14 + Width = 49 + Height = 13 + Caption = 'Load rows' + end + object edRows: TEdit + Left = 66 + Top = 10 + Width = 87 + Height = 21 + TabOrder = 0 + Text = '1000' + end + end + object Panel3: TPanel + Left = 173 + Top = 26 + Width = 412 + Height = 35 + BevelOuter = bvNone + TabOrder = 2 + object rgEvent: TRadioGroup + Left = 9 + Top = -1 + Width = 225 + Height = 32 + Columns = 2 + Items.Strings = ( + 'GetColumnData' + 'PutData') + TabOrder = 0 + OnClick = rgEventClick + end + end + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 64 + Width = 443 + Height = 213 + Align = alClient + DataSource = DataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object DataSource: TDataSource + DataSet = Query + Left = 440 + Top = 64 + end + object Query: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Sdac_Loaded ORDER BY CODE') + AfterOpen = QueryAfterOpen + BeforeClose = QueryBeforeClose + AfterRefresh = QueryAfterOpen + Left = 408 + Top = 64 + end + object MSLoader: TMSLoader + Connection = SDACForm.MSConnection + TableName = 'Sdac_Loaded' + Columns = < + item + Name = 'Code' + FieldType = ftInteger + Size = 0 + end + item + Name = 'Num' + FieldType = ftInteger + Size = 0 + end + item + Name = 'Num1' + FieldType = ftFloat + Size = 0 + Precision = 15 + end + item + Name = 'Str' + Size = 50 + end + item + Name = 'Dat' + FieldType = ftDateTime + Size = 0 + end> + OnGetColumnData = MSLoaderGetColumnData + Left = 408 + Top = 96 + end + object TruncCommand: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'TRUNCATE TABLE SDAC_Loaded') + CommandTimeout = 0 + Left = 408 + Top = 128 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Loader.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Loader.pas new file mode 100644 index 0000000..945d828 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Loader/Loader.pas @@ -0,0 +1,245 @@ +unit Loader; + +interface + +uses +{$IFNDEF VER130} + Variants, +{$ENDIF} + SysUtils, +{$IFDEF LINUX} + Types, Classes, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QDBCtrls, QComCtrls, QExtCtrls, QGrids, QDBGrids, QButtons, SdacClx, +{$ELSE} + Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, Buttons, + Grids, DBGrids, StdCtrls, ExtCtrls, DBCtrls, SdacVcl, +{$ENDIF} +{$IFDEF CLR} + System.ComponentModel, +{$ENDIF} + Db, MemDS, DBAccess, Fetch, + DALoader, MSLoader, MSScript, MSAccess, DemoFrame, DAScript, SDacDemoForm + ; + +type + TLoaderFrame = class(TDemoFrame) + DataSource: TDataSource; + Query: TMSQuery; + MSLoader: TMSLoader; + TruncCommand: TMSSQL; + Panel2: TPanel; + ToolBar: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btLoad: TSpeedButton; + btDeleteAll: TSpeedButton; + DBNavigator: TDBNavigator; + Panel1: TPanel; + Label1: TLabel; + edRows: TEdit; + DBGrid: TDBGrid; + Panel3: TPanel; + rgEvent: TRadioGroup; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btDeleteAllClick(Sender: TObject); + procedure QueryAfterOpen(DataSet: TDataSet); + procedure QueryBeforeClose(DataSet: TDataSet); + procedure PutData(Sender: TMSLoader); + procedure rgEventClick(Sender: TObject); + procedure QueryBeforeFetch(DataSet: TCustomDADataSet; + var Cancel: Boolean); + procedure QueryAfterFetch(DataSet: TCustomDADataSet); + procedure MSLoaderGetColumnData(Sender: TObject; Column: TMSColumn; + Row: Integer; var Value: Variant; var IsEOF: Boolean); + private + { Private declarations } + public + PMInterval: integer; + Count: integer; + destructor Destroy; override; + + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +destructor TLoaderFrame.Destroy; +begin + FreeAndNil(FetchForm); + inherited; +end; + +procedure TLoaderFrame.btOpenClick(Sender: TObject); +begin + Query.Open; +end; + +procedure TLoaderFrame.btCloseClick(Sender: TObject); +begin + Query.Close; +end; + +procedure TLoaderFrame.btLoadClick(Sender: TObject); +var + Start, Finish, Freq: Integer; +begin + Start := GetTickCount; + ShortDateFormat := 'yyyy-mm-dd'; + MSLoader.Connection.Connect; + FetchForm.Show; + Count := StrToInt(edRows.Text); + FetchForm.ProgressBar.Max := Count; + FetchForm.CancelLoad := False; + try + MSLoader.Load; // loading rows + finally + FetchForm.Hide; + Finish := GetTickCount; + Freq := 1000; + SDacForm.StatusBar.Panels[2].Text := 'Time: ' + FloatToStr(Round((Finish - Start) / Freq * 100) / 100) + ' sec.'; + if Query.Active then + Query.Refresh; + end; +end; + +procedure TLoaderFrame.MSLoaderGetColumnData(Sender: TObject; + Column: TMSColumn; Row: Integer; var Value: Variant; var IsEOF: Boolean); +begin + IsEOF := Row > Count; + case Column.Index of + 0: Value := Row; + 1: Value := Random(100); + 2: Value := Random*100; + 3: Value := 'abc01234567890123456789'; + 4: Value := Date; + else + Value := Null; + end; + + FetchForm.ProgressBar.Position := Row; + + if PMInterval = 100 then begin // 100 fields per time + Application.ProcessMessages; + if FetchForm.CancelLoad then begin + MessageDlg('Loading was cancelled by user.' + #13#10 + + 'Sucessfully loaded '+ IntToStr(Row - 1) + ' rows.', mtInformation, [mbOK], 0); + IsEof := True; + end; + end + else + inc(PMInterval); +end; + +procedure TLoaderFrame.PutData(Sender: TMSLoader); +var + i: integer; +begin + PMInterval := 0; + + for i := 1 to Count do begin + Sender.PutColumnData(0, i, i); + Sender.PutColumnData('NUM', i, Random(100)); + Sender.PutColumnData(2, i, Random*100); + Sender.PutColumnData(3, i, 'abc01234567890123456789'); + Sender.PutColumnData(4, i, Date); + FetchForm.ProgressBar.Position := i; + if PMInterval = 100 then begin // 100 records per time + PMInterval := 0; + Application.ProcessMessages; + if FetchForm.CancelLoad then begin + MessageDlg('Loading was cancelled by user.' + #13#10 + + 'Sucessfully loaded '+ IntToStr(i) + ' rows.', mtInformation, [mbOK], 0); + Abort; + end; + end + else + inc(PMInterval); + end; +end; + +procedure TLoaderFrame.btDeleteAllClick(Sender: TObject); +begin + TruncCommand.Execute; + if Query.Active then + Query.Refresh; +end; + +procedure TLoaderFrame.QueryAfterOpen(DataSet: TDataSet); +begin + SDACForm.StatusBar.Panels[1].Text := 'Count: ' + IntToStr(DataSet.RecordCount); +end; + +procedure TLoaderFrame.QueryBeforeClose(DataSet: TDataSet); +begin + SDACForm.StatusBar.Panels[1].Text := ''; +end; + +procedure TLoaderFrame.rgEventClick(Sender: TObject); +begin + if rgEvent.ItemIndex = 0 then begin + MSLoader.OnGetColumnData := MSLoaderGetColumnData; + MSLoader.OnPutData := nil; + end + else begin + MSLoader.OnGetColumnData := nil; + MSLoader.OnPutData := PutData; + end +end; + +procedure TLoaderFrame.QueryBeforeFetch(DataSet: TCustomDADataSet; + var Cancel: Boolean); +begin + if DataSet.FetchingAll then begin + FetchForm.Show; + Application.ProcessMessages; + Cancel := not FetchForm.Visible; + + if Cancel then + SdacForm.StatusBar.Panels[1].Text := 'RecordCount: ' + IntToStr(DataSet.RecordCount); + end; +end; + +procedure TLoaderFrame.QueryAfterFetch(DataSet: TCustomDADataSet); +begin + if not DataSet.FetchingAll then begin + FetchForm.Close; + Application.ProcessMessages; + + SdacForm.StatusBar.Panels[1].Text := 'RecordCount: ' + IntToStr(DataSet.RecordCount); + end; +end; + +// Demo management +procedure TLoaderFrame.Initialize; +begin + inherited; + Query.Connection := Connection as TMSConnection; + MSLoader.Connection := Connection as TMSConnection; + TruncCommand.Connection := Connection as TMSConnection; + + if FetchForm = nil then + FetchForm := TFetchForm.Create(SDACForm); + rgEvent.ItemIndex := 1; +end; + +procedure TLoaderFrame.SetDebug(Value: boolean); +begin + Query.Debug := Value; + TruncCommand.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/LongStrings/LongStrings.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/LongStrings/LongStrings.nfm new file mode 100644 index 0000000..1966184 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/LongStrings/LongStrings.nfm @@ -0,0 +1,186 @@ +inherited LongStringsFrame: TLongStringsFrame + Width = 443 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 193 + Width = 443 + Height = 2 + Cursor = crVSplit + Align = alTop + end + object DBGrid: TDBGrid + Left = 0 + Top = 25 + Width = 443 + Height = 168 + Align = alTop + DataSource = DataSource + TabOrder = 2 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 25 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object ToolButton1: TToolButton + Left = 390 + Top = 2 + Width = 17 + Caption = 'ToolButton1' + Style = tbsSeparator + end + object Panel1: TPanel + Left = 1 + Top = 0 + Width = 498 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object Panel2: TPanel + Left = 398 + Top = 1 + Width = 99 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbLongStrings: TCheckBox + Left = 7 + Top = 4 + Width = 97 + Height = 17 + Caption = 'LongStrings' + TabOrder = 0 + OnClick = cbLongStringsClick + end + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 1 + end + end + end + object meComments: TDBMemo + Left = 0 + Top = 221 + Width = 443 + Height = 56 + Align = alClient + DataField = 'VALUE' + DataSource = DataSource + ScrollBars = ssVertical + TabOrder = 3 + end + object ToolBar1: TPanel + Left = 0 + Top = 195 + Width = 443 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object ToolButton2: TToolButton + Left = 150 + Top = 2 + Width = 25 + Caption = 'ToolButton2' + Style = tbsSeparator + end + object Panel3: TPanel + Left = 1 + Top = 1 + Width = 250 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClear: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Clear' + Flat = True + Transparent = False + OnClick = btClearClick + end + object btSave: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Save to file' + Flat = True + Transparent = False + OnClick = btSaveClick + end + object btLoad: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Load from file' + Flat = True + Transparent = False + OnClick = btLoadClick + end + end + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 440 + Top = 88 + end + object OpenDialog: TOpenDialog + Left = 264 + Top = 219 + end + object SaveDialog: TSaveDialog + Left = 296 + Top = 219 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM SDAC_Long_char') + Debug = True + FetchRows = 1 + Left = 408 + Top = 88 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/LongStrings/LongStrings.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/LongStrings/LongStrings.pas new file mode 100644 index 0000000..998881a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/LongStrings/LongStrings.pas @@ -0,0 +1,138 @@ +unit LongStrings; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, SdacVcl, + ComCtrls, MemDS, DBAccess, MSAccess, Buttons, DemoFrame, SdacDemoForm; + +type + TLongStringsFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + meComments: TDBMemo; + Splitter1: TSplitter; + ToolBar1: TPanel; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + ToolButton1: TToolButton; + ToolButton2: TToolButton; + Panel1: TPanel; + Panel2: TPanel; + DBNavigator: TDBNavigator; + btClose: TSpeedButton; + btOpen: TSpeedButton; + cbLongStrings: TCheckBox; + Panel3: TPanel; + btClear: TSpeedButton; + btSave: TSpeedButton; + btLoad: TSpeedButton; + MSQuery: TMSQuery; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btSaveClick(Sender: TObject); + procedure cbLongStringsClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TLongStringsFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TLongStringsFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TLongStringsFrame.btLoadClick(Sender: TObject); +var + List: TStringList; +begin + if MSQuery.Active and OpenDialog.Execute then begin + if MSQuery.State = dsBrowse then + MSQuery.Edit; + + if MSQuery.FieldByName('Value') is TBlobField then + TBlobField(MSQuery.FieldByName('Value')).LoadFromFile(OpenDialog.FileName) + else begin + List := TStringList.Create; + try + List.LoadFromFile(OpenDialog.FileName); + MSQuery.FieldByName('Value').AsString := List.Text; + finally + List.Free; + end; + end; + end; +end; + +procedure TLongStringsFrame.btSaveClick(Sender: TObject); +var + List: TStringList; +begin + if not MSQuery.EOF and SaveDialog.Execute then + if MSQuery.FieldByName('Value') is TBlobField then + TBlobField(MSQuery.FieldByName('Value')).SaveToFile(SaveDialog.FileName) + else begin + List := TStringList.Create; + try + List.Text := MSQuery.FieldByName('Value').AsString; + List.SaveToFile(SaveDialog.FileName); + finally + List.Free; + end; + end; +end; + +procedure TLongStringsFrame.cbLongStringsClick(Sender: TObject); +var + OldActive: boolean; +begin + OldActive := MSQuery.Active; + MSQuery.Active := False; + MSQuery.Options.LongStrings := cbLongStrings.Checked; + MSQuery.Active := OldActive; +end; + +procedure TLongStringsFrame.btClearClick(Sender: TObject); +begin + if MSQuery.Active then begin + if MSQuery.State = dsBrowse then + MSQuery.Edit; + MSQuery.FieldByName('Value').AsString := ''; + end; +end; + +// Demo management +procedure TLongStringsFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + cbLongStrings.Checked := MSQuery.Options.LongStrings; +end; + +procedure TLongStringsFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/MasterDetail/MasterDetail.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/MasterDetail/MasterDetail.nfm new file mode 100644 index 0000000..d826427 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/MasterDetail/MasterDetail.nfm @@ -0,0 +1,277 @@ +inherited MasterDetailFrame: TMasterDetailFrame + Width = 443 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 0 + Width = 443 + Height = 1 + Cursor = crVSplit + Align = alTop + end + object Splitter3: TSplitter + Left = 0 + Top = 143 + Width = 443 + Height = 1 + Cursor = crVSplit + Align = alTop + Color = clGreen + ParentColor = False + end + object DBGrid: TDBGrid + Left = 0 + Top = 27 + Width = 443 + Height = 116 + Align = alTop + DataSource = dsMaster + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 1 + Width = 443 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 554 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 240 + Height = 22 + DataSource = dsMaster + Flat = True + TabOrder = 0 + end + object Panel4: TPanel + Left = 408 + Top = 1 + Width = 145 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object cbLocalMasterDetail: TCheckBox + Left = 10 + Top = 3 + Width = 135 + Height = 17 + Caption = 'Use LocaMasterDetail' + TabOrder = 0 + OnClick = cbLocalMasterDetailClick + end + end + end + end + object ToolBar1: TPanel + Left = 0 + Top = 145 + Width = 443 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 650 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object DBNavigator1: TDBNavigator + Left = 1 + Top = 1 + Width = 240 + Height = 22 + DataSource = dsDetail + Flat = True + TabOrder = 0 + end + object Panel6: TPanel + Left = 532 + Top = 1 + Width = 117 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object cbCacheCalcFields: TCheckBox + Left = 5 + Top = 3 + Width = 108 + Height = 17 + Caption = 'CacheCalcFields' + Enabled = False + TabOrder = 0 + OnClick = cbCacheCalcFieldsClick + end + end + object Panel3: TPanel + Left = 242 + Top = 1 + Width = 289 + Height = 22 + BevelOuter = bvNone + TabOrder = 2 + object rbSQL: TRadioButton + Left = 5 + Top = 4 + Width = 63 + Height = 17 + Caption = 'SQL link' + Checked = True + TabOrder = 0 + TabStop = True + OnClick = rbClick + end + object rbSimpleFields: TRadioButton + Left = 75 + Top = 4 + Width = 97 + Height = 17 + Caption = 'Simple field link' + TabOrder = 1 + OnClick = rbClick + end + object rbCalcFields: TRadioButton + Left = 175 + Top = 4 + Width = 113 + Height = 17 + Caption = 'Calculated field link' + TabOrder = 2 + OnClick = rbClick + end + end + end + end + object DBGrid1: TDBGrid + Left = 0 + Top = 171 + Width = 443 + Height = 106 + Align = alClient + DataSource = dsDetail + TabOrder = 3 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object quMaster: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM dept') + OnCalcFields = quCalcFields + Left = 376 + Top = 32 + object quMasterDEPTNO: TIntegerField + FieldName = 'DEPTNO' + end + object quMasterDNAME: TStringField + FieldName = 'DNAME' + Size = 14 + end + object quMasterLOC: TStringField + FieldName = 'LOC' + Size = 13 + end + object quMasterDEPTNO_CALCULATED: TIntegerField + FieldKind = fkCalculated + FieldName = 'DEPTNO_CALCULATED' + Calculated = True + end + end + object quDetail: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM emp' + 'WHERE DeptNo = :DeptNo') + OnCalcFields = quCalcFields + MasterSource = dsMaster + Left = 376 + Top = 216 + ParamData = < + item + DataType = ftUnknown + Name = 'DeptNo' + end> + object quDetailEMPNO: TIntegerField + FieldName = 'EMPNO' + end + object quDetailENAME: TStringField + FieldName = 'ENAME' + Size = 10 + end + object quDetailJOB: TStringField + FieldName = 'JOB' + Size = 9 + end + object quDetailMGR: TIntegerField + FieldName = 'MGR' + end + object quDetailHIREDATE: TDateTimeField + FieldName = 'HIREDATE' + end + object quDetailSAL: TFloatField + FieldName = 'SAL' + end + object quDetailCOMM: TFloatField + FieldName = 'COMM' + end + object quDetailDEPTNO: TIntegerField + FieldName = 'DEPTNO' + end + object quDetailDEPTNO_CALCULATED: TIntegerField + FieldKind = fkCalculated + FieldName = 'DEPTNO_CALCULATED' + Calculated = True + end + end + object dsDetail: TDataSource + DataSet = quDetail + Left = 408 + Top = 216 + end + object dsMaster: TDataSource + DataSet = quMaster + Left = 408 + Top = 32 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/MasterDetail/MasterDetail.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/MasterDetail/MasterDetail.pas new file mode 100644 index 0000000..4e368da --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/MasterDetail/MasterDetail.pas @@ -0,0 +1,189 @@ +unit MasterDetail; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, +{$IFNDEF VER130} { Delphi 6 or higher } + Variants, +{$ENDIF} + ComCtrls, Buttons, MemDS, DBAccess, MSAccess, SdacVcl, DemoFrame, SdacDemoForm; + +type + TMasterDetailFrame = class(TDemoFrame) + quMaster: TMSQuery; + Splitter1: TSplitter; + quDetail: TMSQuery; + dsDetail: TDataSource; + dsMaster: TDataSource; + DBGrid: TDBGrid; + ToolBar: TPanel; + Panel2: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + ToolBar1: TPanel; + Panel1: TPanel; + DBNavigator1: TDBNavigator; + DBGrid1: TDBGrid; + Splitter3: TSplitter; + Panel4: TPanel; + cbLocalMasterDetail: TCheckBox; + Panel6: TPanel; + cbCacheCalcFields: TCheckBox; + Panel3: TPanel; + rbSQL: TRadioButton; + rbSimpleFields: TRadioButton; + rbCalcFields: TRadioButton; + quMasterDEPTNO: TIntegerField; + quMasterDNAME: TStringField; + quMasterLOC: TStringField; + quMasterDEPTNO_CALCULATED: TIntegerField; + quDetailEMPNO: TIntegerField; + quDetailENAME: TStringField; + quDetailJOB: TStringField; + quDetailMGR: TIntegerField; + quDetailHIREDATE: TDateTimeField; + quDetailSAL: TFloatField; + quDetailCOMM: TFloatField; + quDetailDEPTNO: TIntegerField; + quDetailDEPTNO_CALCULATED: TIntegerField; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure cbLocalMasterDetailClick(Sender: TObject); + procedure rbClick(Sender: TObject); + procedure cbCacheCalcFieldsClick(Sender: TObject); + procedure quCalcFields(DataSet: TDataSet); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TMasterDetailFrame.btOpenClick(Sender: TObject); +begin + quMaster.Open; + quDetail.Open; +end; + +procedure TMasterDetailFrame.btCloseClick(Sender: TObject); +begin + quDetail.Close; + quMaster.Close; +end; + +procedure TMasterDetailFrame.cbLocalMasterDetailClick(Sender: TObject); +var + OldActive: boolean; +begin + OldActive := quDetail.Active; + quDetail.Close; + try + quDetail.Options.LocalMasterDetail := cbLocalMasterDetail.Checked; + if OldActive then + quDetail.Open; + except + cbLocalMasterDetail.Checked := quDetail.Options.LocalMasterDetail; + raise; + end; +end; + +procedure TMasterDetailFrame.rbClick(Sender: TObject); +var + OldActive: boolean; +begin + OldActive := dsMaster.DataSet.Active; + if OldActive then + btCloseClick(nil); + cbCacheCalcFields.Enabled := Sender = rbCalcFields; + + if rbSQL.Checked then begin + quDetail.SQL.Text := 'SELECT * FROM Emp WHERE DeptNo = :DeptNo'; + quDetail.DetailFields := ''; + quDetail.MasterFields := ''; + quMaster.FieldByName('DEPTNO_CALCULATED').Visible := False; + quDetail.FieldByName('DEPTNO_CALCULATED').Visible := False; + cbLocalMasterDetail.Checked := False; + cbLocalMasterDetail.Enabled := False; + cbCacheCalcFields.Enabled := False; + end + else begin + if rbSimpleFields.Checked then begin + quDetail.SQL.Text := 'SELECT * FROM Emp'; + quDetail.DetailFields := 'DEPTNO'; + quDetail.MasterFields := 'DEPTNO'; + quMaster.FieldByName('DEPTNO_CALCULATED').Visible := False; + quDetail.FieldByName('DEPTNO_CALCULATED').Visible := False; + cbLocalMasterDetail.Enabled := True; + cbCacheCalcFields.Enabled := False; + end + else begin + quDetail.SQL.Text := 'SELECT * FROM Emp'; + quDetail.DetailFields := 'DEPTNO_CALCULATED'; + quDetail.MasterFields := 'DEPTNO_CALCULATED'; + quMaster.FieldByName('DEPTNO_CALCULATED').Visible := True; + quDetail.FieldByName('DEPTNO_CALCULATED').Visible := True; + cbLocalMasterDetail.Enabled := True; + cbLocalMasterDetail.Checked := True; + cbCacheCalcFields.Enabled := True; + end; + end; + cbCacheCalcFieldsClick(nil); + if OldActive then + btOpenClick(nil); +end; + +procedure TMasterDetailFrame.cbCacheCalcFieldsClick(Sender: TObject); +var + OldActive: boolean; +begin + OldActive := dsMaster.DataSet.Active; + if OldActive then + btCloseClick(nil); + quMaster.Options.CacheCalcFields := cbCacheCalcFields.Checked and cbCacheCalcFields.Enabled; + quDetail.Options.CacheCalcFields := quMaster.Options.CacheCalcFields; + if OldActive then + btOpenClick(nil); +end; + +procedure TMasterDetailFrame.quCalcFields(DataSet: TDataSet); +var + Dst, Src: TField; +begin + Src := DataSet.FieldByName('DEPTNO'); + Dst := DataSet.FieldByName('DEPTNO_CALCULATED'); + if Src.IsNull then + Dst.Value := Null + else + Dst.AsInteger := Src.AsInteger * 2; +end; + +// Demo management +procedure TMasterDetailFrame.Initialize; +begin + inherited; + quMaster.Connection := Connection as TMSConnection; + quDetail.Connection := Connection as TMSConnection; + rbClick(nil); +end; + +procedure TMasterDetailFrame.SetDebug(Value: boolean); +begin + quMaster.Debug := Value; + quDetail.Debug := Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Pictures/Pictures.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Pictures/Pictures.nfm new file mode 100644 index 0000000..7e9e9b5 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Pictures/Pictures.nfm @@ -0,0 +1,170 @@ +inherited PicturesFrame: TPicturesFrame + Width = 443 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 119 + Width = 443 + Height = 2 + Cursor = crVSplit + Align = alTop + Color = clBtnFace + ParentColor = False + end + object ScrollBox1: TScrollBox + Left = 0 + Top = 146 + Width = 443 + Height = 131 + Align = alClient + TabOrder = 0 + object DBImage: TDBImage + Left = 0 + Top = 0 + Width = 439 + Height = 127 + Align = alClient + Center = False + Constraints.MinHeight = 50 + DataField = 'PICTURE' + DataSource = dsPictures + TabOrder = 0 + end + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel2: TPanel + Left = 0 + Top = 1 + Width = 408 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 240 + Height = 22 + DataSource = dsPictures + Flat = True + TabOrder = 0 + end + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 26 + Width = 443 + Height = 93 + Align = alTop + Constraints.MinHeight = 50 + DataSource = dsPictures + Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgConfirmDelete] + TabOrder = 2 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar1: TPanel + Left = 0 + Top = 121 + Width = 443 + Height = 25 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + object Panel1: TPanel + Left = 2 + Top = 0 + Width = 259 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btLoad: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 22 + Caption = 'Load from file ...' + Flat = True + Transparent = False + OnClick = btLoadClick + end + object btSave: TSpeedButton + Left = 87 + Top = 1 + Width = 85 + Height = 22 + Caption = 'Save to file ...' + Flat = True + Transparent = False + OnClick = btSaveClick + end + object btClear: TSpeedButton + Left = 173 + Top = 1 + Width = 85 + Height = 22 + Caption = 'Clear' + Flat = True + Transparent = False + OnClick = btClearClick + end + end + end + object OpenPictureDialog: TOpenPictureDialog + Filter = 'Bitmaps (*.bmp)|*.bmp' + Left = 288 + Top = 115 + end + object SavePictureDialog: TSavePictureDialog + Filter = 'Bitmaps (*.bmp)|*.bmp' + Left = 320 + Top = 116 + end + object dsPictures: TDataSource + DataSet = quPictures + Left = 376 + Top = 16 + end + object quPictures: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM SDAC_Pictures') + Debug = True + FetchRows = 1 + Left = 344 + Top = 16 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Pictures/Pictures.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Pictures/Pictures.pas new file mode 100644 index 0000000..935e884 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Pictures/Pictures.pas @@ -0,0 +1,107 @@ +unit Pictures; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, ExtDlgs, Buttons, MemDS, DBAccess, MSAccess, + DemoFrame, SdacDemoForm; + +type + TPicturesFrame = class(TDemoFrame) + OpenPictureDialog: TOpenPictureDialog; + ScrollBox1: TScrollBox; + SavePictureDialog: TSavePictureDialog; + ToolBar: TPanel; + Panel2: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + DBGrid: TDBGrid; + ToolBar1: TPanel; + Panel1: TPanel; + btLoad: TSpeedButton; + btSave: TSpeedButton; + btClear: TSpeedButton; + Splitter1: TSplitter; + dsPictures: TDataSource; + quPictures: TMSQuery; + DBImage: TDBImage; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btSaveClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TPicturesFrame.btOpenClick(Sender: TObject); +begin + quPictures.Open; +end; + +procedure TPicturesFrame.btCloseClick(Sender: TObject); +begin + quPictures.Close; +end; + +procedure TPicturesFrame.btLoadClick(Sender: TObject); +var + BlobField: TBlobField; + FileName: string; +begin + if OpenPictureDialog.Execute then begin + if quPictures.State in [dsBrowse] then + quPictures.Edit; + BlobField := quPictures.FieldByName('Picture') as TBlobField; + FileName := OpenPictureDialog.FileName; + BlobField.LoadFromFile(FileName); + end; +end; + +procedure TPicturesFrame.btSaveClick(Sender: TObject); +begin + if SavePictureDialog.Execute then begin + TBlobField(quPictures.FieldByName('Picture')). + SaveToFile(SavePictureDialog.FileName); + end; +end; + +procedure TPicturesFrame.btClearClick(Sender: TObject); +begin + if quPictures.State in [dsBrowse] then + quPictures.Edit; + TBlobField(quPictures.FieldByName('Picture')).Clear; +end; + +// Demo management +procedure TPicturesFrame.Initialize; +begin + inherited; + quPictures.Connection := Connection as TMSConnection; +end; + +procedure TPicturesFrame.SetDebug(Value: boolean); +begin + quPictures.Debug := Value; +end; + +end. + + + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Query/Query.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Query/Query.nfm new file mode 100644 index 0000000..48f1bde --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Query/Query.nfm @@ -0,0 +1,310 @@ +inherited QueryFrame: TQueryFrame + Width = 443 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 160 + Width = 443 + Height = 1 + Cursor = crVSplit + Align = alTop + Color = clGreen + ParentColor = False + end + object DBGrid: TDBGrid + Left = 0 + Top = 187 + Width = 443 + Height = 90 + Align = alClient + Constraints.MinWidth = 50 + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object TPanel + Left = 0 + Top = 161 + Width = 443 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel9: TPanel + Left = 1 + Top = 1 + Width = 398 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btRefreshRecord: TSpeedButton + Left = 232 + Top = 1 + Width = 82 + Height = 22 + Caption = 'RefreshRecord' + Flat = True + Transparent = False + OnClick = btRefreshRecordClick + end + object btSaveToXML: TSpeedButton + Left = 315 + Top = 1 + Width = 82 + Height = 22 + Caption = 'SaveToXML' + Flat = True + Transparent = False + OnClick = btSaveToXMLClick + end + object DBNavigator: TDBNavigator + Left = 1 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + end + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 80 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Panel1: TPanel + Left = -8 + Top = 0 + Width = 563 + Height = 78 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 92 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 9 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btPrepare: TSpeedButton + Left = 175 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Prepare' + Flat = True + Transparent = False + OnClick = btPrepareClick + end + object btUnPrepare: TSpeedButton + Left = 258 + Top = 1 + Width = 82 + Height = 22 + Caption = 'UnPrepare' + Flat = True + Transparent = False + OnClick = btUnPrepareClick + end + object btExecute: TSpeedButton + Left = 341 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Execute' + Flat = True + Transparent = False + OnClick = btExecuteClick + end + object Panel2: TPanel + Left = 424 + Top = 25 + Width = 138 + Height = 52 + BevelOuter = bvNone + TabOrder = 0 + object cbRefreshBeforeEdit: TCheckBox + Left = 11 + Top = 1 + Width = 121 + Height = 17 + Caption = 'Refresh BeforeEdit' + TabOrder = 0 + OnClick = cbRefreshBeforeEditClick + end + object cbRefreshAfterInsert: TCheckBox + Left = 11 + Top = 18 + Width = 121 + Height = 17 + Caption = 'Refresh AfterInsert' + TabOrder = 1 + OnClick = cbRefreshAfterInsertClick + end + object cbRefreshAfterUpdate: TCheckBox + Left = 11 + Top = 35 + Width = 121 + Height = 17 + Caption = 'Refresh AfterUpdate' + TabOrder = 2 + OnClick = cbRefreshAfterUpdateClick + end + end + object Panel5: TPanel + Left = 258 + Top = 24 + Width = 165 + Height = 26 + BevelOuter = bvNone + TabOrder = 1 + object StaticText1: TLabel + Left = 6 + Top = 7 + Width = 54 + Height = 13 + Caption = 'FetchRows' + end + object edFetchRows: TEdit + Left = 67 + Top = 2 + Width = 91 + Height = 21 + TabOrder = 0 + OnExit = edFetchRowsExit + end + end + object Panel6: TPanel + Left = 9 + Top = 51 + Width = 414 + Height = 26 + BevelOuter = bvNone + TabOrder = 2 + object Label5: TLabel + Left = 7 + Top = 8 + Width = 22 + Height = 13 + Caption = 'Filter' + end + object edFilter: TEdit + Left = 37 + Top = 3 + Width = 260 + Height = 21 + TabOrder = 0 + OnExit = edFetchRowsExit + end + object cbFiltered: TCheckBox + Left = 328 + Top = 5 + Width = 58 + Height = 17 + Caption = 'Filtered' + TabOrder = 1 + OnClick = cbFilteredClick + end + end + object Panel7: TPanel + Left = 9 + Top = 24 + Width = 248 + Height = 26 + BevelOuter = bvNone + TabOrder = 3 + object Label2: TLabel + Left = 5 + Top = 7 + Width = 73 + Height = 13 + Caption = 'Updating Table' + end + object edUpdatingTable: TEdit + Left = 93 + Top = 3 + Width = 148 + Height = 21 + TabOrder = 0 + OnExit = edFetchRowsExit + end + end + object Panel3: TPanel + Left = 424 + Top = 1 + Width = 138 + Height = 23 + BevelOuter = bvNone + TabOrder = 4 + object cbNonBlocking: TCheckBox + Left = 11 + Top = 4 + Width = 90 + Height = 16 + Caption = 'NonBlocking' + TabOrder = 0 + OnClick = cbNonBlockingClick + end + end + end + end + object Memo: TMemo + Left = 0 + Top = 80 + Width = 443 + Height = 80 + Align = alTop + ScrollBars = ssVertical + TabOrder = 3 + OnExit = edFetchRowsExit + end + object DataSource: TDataSource + DataSet = MSQuery + OnStateChange = DataSourceStateChange + OnDataChange = DataSourceDataChange + Left = 108 + Top = 105 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT dept.DeptNo, dept.DNAME, emp.EmpNo, emp.ENAME, emp.JOB ' + 'FROM dept, emp' + 'WHERE dept.DEPTNO = emp.DEPTNO') + Debug = True + AfterOpen = MSQueryAfterOpen + Left = 76 + Top = 105 + end + object SaveDialog: TSaveDialog + DefaultExt = 'xml' + Filter = 'XML (*.xml)|*.xml' + Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing] + Left = 138 + Top = 103 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Query/Query.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Query/Query.pas new file mode 100644 index 0000000..9d5e10e --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Query/Query.pas @@ -0,0 +1,276 @@ +unit Query; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, Buttons, MemDS, DBAccess, MSAccess, + SdacVcl, DemoFrame, SdacDemoForm; + +type + TQueryFrame = class(TDemoFrame) + DataSource: TDataSource; + MSQuery: TMSQuery; + DBGrid: TDBGrid; + Panel9: TPanel; + btRefreshRecord: TSpeedButton; + DBNavigator: TDBNavigator; + Splitter1: TSplitter; + ToolBar: TPanel; + Panel1: TPanel; + btClose: TSpeedButton; + btOpen: TSpeedButton; + Panel2: TPanel; + cbRefreshBeforeEdit: TCheckBox; + cbRefreshAfterInsert: TCheckBox; + cbRefreshAfterUpdate: TCheckBox; + Panel5: TPanel; + StaticText1: TLabel; + edFetchRows: TEdit; + Panel6: TPanel; + Label5: TLabel; + edFilter: TEdit; + cbFiltered: TCheckBox; + Panel7: TPanel; + edUpdatingTable: TEdit; + Label2: TLabel; + Memo: TMemo; + btPrepare: TSpeedButton; + btUnPrepare: TSpeedButton; + btExecute: TSpeedButton; + Panel3: TPanel; + cbNonBlocking: TCheckBox; + btSaveToXML: TSpeedButton; + SaveDialog: TSaveDialog; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btRefreshRecordClick(Sender: TObject); + procedure DataSourceDataChange(Sender: TObject; Field: TField); + procedure DataSourceStateChange(Sender: TObject); + procedure cbFilteredClick(Sender: TObject); + procedure cbRefreshBeforeEditClick(Sender: TObject); + procedure cbRefreshAfterInsertClick(Sender: TObject); + procedure cbRefreshAfterUpdateClick(Sender: TObject); + procedure MSQueryAfterOpen(DataSet: TDataSet); + procedure edFetchRowsExit(Sender: TObject); + procedure btPrepareClick(Sender: TObject); + procedure btUnPrepareClick(Sender: TObject); + procedure btExecuteClick(Sender: TObject); + procedure cbNonBlockingClick(Sender: TObject); + procedure btSaveToXMLClick(Sender: TObject); + private + { Private declarations } + procedure AssignProperties; + procedure ShowState; + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TQueryFrame.ShowState; +var + St: string; + + procedure AddSt(S:string); + begin + if St <> '' then + St := St + ', '; + St := St + S; + end; + +begin + St := ''; + + if MSQuery.Prepared then begin + AddSt('Prepared'); + + if MSQuery.IsQuery then + AddSt('IsQuery'); + end; + + if MSQuery.Active then + AddSt('Active') + else + AddSt('Inactive'); + + if MSQuery.Executing then + AddSt('Executing'); + + if MSQuery.Fetching then + AddSt('Fetching'); + + edUpdatingTable.Text := MSQuery.UpdatingTable; + + SdacForm.StatusBar.Panels[2].Text := St; +end; + +procedure TQueryFrame.AssignProperties; +begin + try + MSQuery.FetchRows := StrToInt(edFetchRows.Text); + except + edFetchRows.SetFocus; + raise; + end; + try + MSQuery.UpdatingTable := edUpdatingTable.Text; + except + edUpdatingTable.SetFocus; + raise; + end; + + MSQuery.Filter := edFilter.Text; + if MSQuery.SQL.Text <> Memo.Lines.Text then + MSQuery.SQL.Assign(Memo.Lines); +end; + +procedure TQueryFrame.btOpenClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Open; + finally + ShowState; + end; +end; + +procedure TQueryFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; + ShowState; +end; + +procedure TQueryFrame.btRefreshRecordClick(Sender: TObject); +begin + MSQuery.RefreshRecord; +end; + +procedure TQueryFrame.DataSourceStateChange(Sender: TObject); +begin + SdacForm.StatusBar.Panels[1].Text := 'Record ' + IntToStr(MSQuery.RecNo) + ' of ' + IntToStr(MSQuery.RecordCount); +end; + +procedure TQueryFrame.DataSourceDataChange(Sender: TObject; Field: TField); +begin + DataSourceStateChange(nil); +end; + +procedure TQueryFrame.cbFilteredClick(Sender: TObject); +begin + try + MSQuery.Filtered := cbFiltered.Checked; + finally + cbFiltered.Checked := MSQuery.Filtered; + end; +end; + +procedure TQueryFrame.cbRefreshBeforeEditClick(Sender: TObject); +begin + if cbRefreshBeforeEdit.Checked then + MSQuery.RefreshOptions := MSQuery.RefreshOptions + [roBeforeEdit] + else + MSQuery.RefreshOptions := MSQuery.RefreshOptions - [roBeforeEdit]; +end; + +procedure TQueryFrame.cbRefreshAfterInsertClick(Sender: TObject); +begin + if cbRefreshAfterInsert.Checked then + MSQuery.RefreshOptions := MSQuery.RefreshOptions + [roAfterInsert] + else + MSQuery.RefreshOptions := MSQuery.RefreshOptions - [roAfterInsert]; +end; + +procedure TQueryFrame.cbRefreshAfterUpdateClick(Sender: TObject); +begin + if cbRefreshAfterUpdate.Checked then + MSQuery.RefreshOptions := MSQuery.RefreshOptions + [roAfterUpdate] + else + MSQuery.RefreshOptions := MSQuery.RefreshOptions - [roAfterUpdate]; +end; + +procedure TQueryFrame.MSQueryAfterOpen(DataSet: TDataSet); +begin + edUpdatingTable.Text := MSQuery.UpdatingTable; +end; + +procedure TQueryFrame.edFetchRowsExit(Sender: TObject); +begin + AssignProperties; +end; + +procedure TQueryFrame.btPrepareClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Prepare; + finally + ShowState; + end; +end; + +procedure TQueryFrame.btUnPrepareClick(Sender: TObject); +begin + MSQuery.UnPrepare; + ShowState; +end; + +procedure TQueryFrame.btExecuteClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Execute; + finally + ShowState; + end; +end; + +procedure TQueryFrame.cbNonBlockingClick(Sender: TObject); +begin + try + MSQuery.Options.NonBlocking := cbNonBlocking.Checked; + finally + cbNonBlocking.Checked := MSQuery.Options.NonBlocking; + end; +end; + +procedure TQueryFrame.btSaveToXMLClick(Sender: TObject); +begin + if SaveDialog.Execute then + MSQuery.SaveToXML(SaveDialog.FileName); +end; + +// Demo management +procedure TQueryFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + edFetchRows.Text := IntToStr(MSQuery.FetchRows); + + cbRefreshBeforeEdit.Checked := roBeforeEdit in MSQuery.RefreshOptions; + cbRefreshAfterInsert.Checked := roAfterInsert in MSQuery.RefreshOptions; + cbRefreshAfterUpdate.Checked := roAfterUpdate in MSQuery.RefreshOptions; + + edFilter.Text := MSQuery.Filter; + cbFiltered.Checked := MSQuery.Filtered; + + Memo.Lines.Text := MSQuery.SQL.Text; +end; + +procedure TQueryFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.bdsproj b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.bdsproj new file mode 100644 index 0000000..402f933 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.bdsproj @@ -0,0 +1,222 @@ + + + + + + + + + + + + SdacDemo_VclNet.dpr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + False + True + False + True + True + False + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + True + False + False + 4096 + 1048576 + 4194304 + + + + + + + + + True + ..\SdacDemo\ConnectDialog + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.cfg b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.cfg new file mode 100644 index 0000000..86fed96 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.cfg @@ -0,0 +1,47 @@ +-$A- +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-U"..\ConnectDialog\" +-O"..\ConnectDialog\" +-I"..\ConnectDialog\" +-R"..\ConnectDialog\" +-LU"d:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll" +-w-SYMBOL_DEPRECATED +-w-SYMBOL_PLATFORM +-w-UNIT_PLATFORM +-w-UNIT_DEPRECATED +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.dpr b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.dpr new file mode 100644 index 0000000..e33d232 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.dpr @@ -0,0 +1,60 @@ +{$I Base\DacDemo.inc} + +program SdacDemo_VclNet; + +{%DelphiDotNetAssemblyCompiler 'System.Drawing.dll'} +{%DelphiDotNetAssemblyCompiler 'Borland.VclDbRtl.dll'} +{%DelphiDotNetAssemblyCompiler 'Borland.Delphi.dll'} +{%DelphiDotNetAssemblyCompiler 'Borland.VclRtl.dll'} +{%DelphiDotNetAssemblyCompiler 'Borland.Vcl.dll'} +{%DelphiDotNetAssemblyCompiler 'CoreLab.Dac.dll'} +{%DelphiDotNetAssemblyCompiler 'CoreLab.Sdac.dll'} + +uses + Forms, + CategoryFrame in 'Base\CategoryFrame.pas' {CategoryFrame}, + DemoBase in 'Base\DemoBase.pas', + DemoForm in 'Base\DemoForm.pas' {DemoForm}, + DemoFrame in 'Base\DemoFrame.pas' {DemoFrame}, + HtmlConsts in 'Base\HtmlConsts.pas', + VTable in 'VirtualTable\VTable.pas', + SdacAbout in 'Base\SdacAbout.pas' {SdacAboutForm}, + CachedUpdates in 'CachedUpdates\CachedUpdates.pas' {CachedUpdates}, + UpdateAction in 'CachedUpdates\UpdateAction.pas' {UpdateAction}, + ConnectDialog in 'ConnectDialog\ConnectDialog.pas' {ConnectDialog}, + ConnectForm in 'ConnectDialog\ConnectForm.pas' {MyConnect}, + InheritedConnectForm in 'ConnectDialog\InheritedConnectForm.pas' {InheritedConnect}, +{$IFDEF CRDBGRID} + CRDBGrid in 'CRDBGrid\CRDBGrid.pas' {CRDBGrid}, +{$ENDIF} + FetchAll in 'FetchAll\FetchAll.pas' {FetchAll}, + MasterDetail in 'MasterDetail\MasterDetail.pas' {MasterDetail}, + Pictures in 'Pictures\Pictures.pas' {Pictures}, + ServerCursors in 'ServerCursors\ServerCursors.pas' {ServerCursors}, + Sql in 'Sql\Sql.pas' {SqlFrame}, + StoredProc in 'StoredProc\StoredProc.pas' {StoredProcFrame}, + StoredProcUpdates in 'StoredProcUpdates\StoredProcUpdates.pas' {StoredProcUpdatesFrame}, + Table in 'Table\Table.pas' {TableFrame}, + Text in 'Text\Text.pas' {TextFrame}, + ThreadsData in 'Threads\ThreadsData.pas' {ThreadsData: TDataModule}, + UpdateSQL in 'UpdateSQL\UpdateSQL.pas' {UpdateSQLFrame}, + SdacDemoForm in 'Base\SdacDemoForm.pas' {SdacForm}, + Query in 'Query\Query.pas' {QueryFrame: TFrame}, + FilterAndIndex in 'FilterAndIndex\FilterAndIndex.pas', +{$IFNDEF STD} + Loader in 'Loader\Loader.pas', + Fetch in 'Loader\Fetch.pas' {FetchForm}, + ServiceBroker in 'ServiceBroker\ServiceBroker.pas' {ServiceBroker}, +{$ENDIF} + LongStrings in 'LongStrings\LongStrings.pas'; + +{$R *.res} + +[STAThread] + +begin + Application.Initialize; + Application.CreateForm(TSdacForm, SdacForm); + Application.CreateForm(TSdacAboutForm, SdacAboutForm); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.res b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/SdacDemo_VclNet.res new file mode 100644 index 0000000000000000000000000000000000000000..f8aedde88d0388017c893fe46d7ebf413c035a41 GIT binary patch literal 876 zcmZ`&J&)5s5FK-o>!Q;ox9; zgvAgT0RipH==pc#M7Su=`-D4|Ku%RvLGYXK$@K~MeqX-WM`Vl%PEJk_JiM9J0YAC= z&2=}T`^%m)LT^mKUq5@@Qz@jLF2(Dfa$y%6vweF_6n5O|58aIqZdR4`;*$XnS-oL> zc3N!ek)cp5^EI!pc)O^LAy#24cKu=brP!F7RD>6*&C~6wUF>F|qWw}XWV@9@wT?R literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServerCursors/ServerCursors.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServerCursors/ServerCursors.nfm new file mode 100644 index 0000000..62dc117 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServerCursors/ServerCursors.nfm @@ -0,0 +1,230 @@ +inherited ServerCursorsFrame: TServerCursorsFrame + Width = 441 + Height = 275 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 170 + Width = 441 + Height = 2 + Cursor = crVSplit + Align = alTop + Color = clGreen + ParentColor = False + end + object DBGrid: TDBGrid + Left = 0 + Top = 172 + Width = 441 + Height = 103 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 90 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 570 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open and Last' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btFillTables: TSpeedButton + Left = 398 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Fill Tables' + Flat = True + Transparent = False + OnClick = btFillTablesClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel3: TPanel + Left = 481 + Top = 1 + Width = 88 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object edVal: TEdit + Left = 8 + Top = 2 + Width = 73 + Height = 21 + TabOrder = 0 + Text = '1000' + end + end + end + object Panel2: TPanel + Left = 1 + Top = 24 + Width = 570 + Height = 65 + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object Panel4: TPanel + Left = 1 + Top = 1 + Width = 568 + Height = 63 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 355 + Top = 5 + Width = 91 + Height = 13 + Caption = 'Open = 0; Last = 0;' + end + object Label2: TLabel + Left = 355 + Top = 23 + Width = 91 + Height = 13 + Caption = 'Open = 0; Last = 0;' + end + object Label3: TLabel + Left = 355 + Top = 41 + Width = 91 + Height = 13 + Caption = 'Open = 0; Last = 0;' + end + object rbCientCursor1: TRadioButton + Left = 10 + Top = 5 + Width = 330 + Height = 16 + Caption = 'Client cursor (CursorType = ctDefaultResultSet, FetchAll = True)' + TabOrder = 0 + OnClick = rbCientCursor2Click + end + object rbCientCursor2: TRadioButton + Left = 10 + Top = 23 + Width = 330 + Height = 17 + Caption = + 'Client cursor (CursorType = ctDefaultResultSet, FetchAll = False' + + ')' + TabOrder = 1 + OnClick = rbCientCursor2Click + end + object rbServerCursor: TRadioButton + Left = 10 + Top = 41 + Width = 330 + Height = 17 + Caption = 'Server cursor (CursorType = ctKeySet)' + TabOrder = 2 + OnClick = rbCientCursor2Click + end + end + end + end + object Memo: TMemo + Left = 0 + Top = 90 + Width = 441 + Height = 80 + Align = alTop + ScrollBars = ssVertical + TabOrder = 2 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 278 + Top = 60 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'select TOP 100000 * from loaded1, loaded2') + ReadOnly = True + Left = 246 + Top = 60 + end + object MSSQLFillTables: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'declare' + ' @i INTEGER;' + 'begin' + ' SET @i = 0' + ' WHILE @i <= :Cnt' + ' BEGIN' + ' SET @i = @i + 1' + ' INSERT INTO Loaded1 (' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39',' + ' '#39'23456789012345678901'#39');' + ' INSERT INTO Loaded2 (' + ' Field1,' + ' Field2,' + ' Field3)' + ' VALUES (' + ' '#39'01234567890123456789'#39',' + ' '#39'12345678901234567890'#39',' + ' '#39'23456789012345678901'#39');' + ' END;' + 'end;') + CommandTimeout = 0 + Left = 453 + Top = 28 + ParamData = < + item + DataType = ftInteger + Name = 'Cnt' + ParamType = ptInput + Value = 1000 + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServerCursors/ServerCursors.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServerCursors/ServerCursors.pas new file mode 100644 index 0000000..befd86d --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServerCursors/ServerCursors.pas @@ -0,0 +1,136 @@ +unit ServerCursors; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, Buttons, MemDS, DBAccess, MSAccess, + OLEDBAccess, SdacVcl, DemoFrame, SdacDemoForm; + +type + TServerCursorsFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + Memo: TMemo; + MSQuery: TMSQuery; + Splitter1: TSplitter; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + btFillTables: TSpeedButton; + Panel3: TPanel; + edVal: TEdit; + Panel2: TPanel; + Panel4: TPanel; + rbCientCursor1: TRadioButton; + rbCientCursor2: TRadioButton; + rbServerCursor: TRadioButton; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + MSSQLFillTables: TMSSQL; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btFillTablesClick(Sender: TObject); + procedure rbCientCursor2Click(Sender: TObject); + private + + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +{$IFDEF CLR} +uses + Variants; +{$ENDIF} + +procedure TServerCursorsFrame.btOpenClick(Sender: TObject); +var + dt: TDateTime; + s: string; +begin + MSQuery.Connection.Open; + MSQuery.SQL.Assign(Memo.Lines); + + dt := Now; + MSQuery.Open; + s := 'Open = ' + TimeToStr(Now - dt) + '; '; + + dt := Now; + MSQuery.Last; + s := s + 'Last = ' + TimeToStr(Now - dt) + ';'; + if rbCientCursor1.Checked then + Label1.Caption := s + else + if rbCientCursor2.Checked then + Label2.Caption := s + else + if rbServerCursor.Checked then + Label3.Caption := s; + SdacForm.StatusBar.Update; +end; + +procedure TServerCursorsFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TServerCursorsFrame.btFillTablesClick(Sender: TObject); +begin + MSSQLFillTables.ParamValues['cnt'] := edVal.Text; + MSSQLFillTables.Execute; +end; + +procedure TServerCursorsFrame.rbCientCursor2Click(Sender: TObject); +begin + inherited; + MSQuery.Close; + if rbCientCursor1.Checked then begin + MSQuery.CursorType := ctDefaultResultSet; + MSQuery.FetchAll := True; + end + else + if rbCientCursor2.Checked then begin + MSQuery.CursorType := ctDefaultResultSet; + MSQuery.FetchAll := False; + end + else + MSQuery.CursorType := ctKeySet; +end; + +// Demo management +procedure TServerCursorsFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + MSSQLFillTables.Connection := Connection as TMSConnection; + Memo.Lines.Text := MSQuery.SQL.Text; + + if MSQuery.CursorType = ctDefaultResultSet then + rbCientCursor1.Checked := True + else + rbServerCursor.Checked := True; +end; + +procedure TServerCursorsFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; + MSSQLFillTables.Debug := Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServiceBroker/ServiceBroker.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServiceBroker/ServiceBroker.nfm new file mode 100644 index 0000000..edd7e50 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServiceBroker/ServiceBroker.nfm @@ -0,0 +1,312 @@ +inherited ServiceBrokerFrame: TServiceBrokerFrame + Width = 889 + Height = 471 + Align = alClient + object Splitter1: TSplitter + Left = 380 + Top = 0 + Height = 471 + Color = clBtnFace + ParentColor = False + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 380 + Height = 471 + Align = alLeft + Anchors = [akTop] + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object Panel3: TPanel + Left = 0 + Top = 0 + Width = 380 + Height = 136 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 3 + Top = 6 + Width = 111 + Height = 13 + Caption = 'Initiator connection' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel5: TPanel + Left = 1 + Top = 23 + Width = 378 + Height = 112 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btInitiatorBeginDialog: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Begin dialog' + Flat = True + Transparent = False + OnClick = btInitiatorBeginDialogClick + end + object btInitiatorEndDialog: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'End dialog' + Flat = True + Transparent = False + OnClick = btInitiatorEndDialogClick + end + object btInitiatorSend: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Send' + Flat = True + Transparent = False + OnClick = btInitiatorSendClick + end + object btInitiatorReceive: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Receive' + Flat = True + Transparent = False + OnClick = btInitiatorReceiveClick + end + object Panel7: TPanel + Left = 1 + Top = 24 + Width = 376 + Height = 87 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 0 + object lbInitiatorMessage: TLabel + Left = 3 + Top = 37 + Width = 43 + Height = 13 + Caption = 'Message' + end + object lbInitiatorWaitTimeout: TLabel + Left = 3 + Top = 66 + Width = 60 + Height = 13 + Caption = 'WaitTimeout' + end + object cbInitiatorAsynchNotification: TCheckBox + Left = 3 + Top = 8 + Width = 166 + Height = 17 + Caption = 'AsynchNotification' + TabOrder = 0 + OnClick = cbInitiatorAsynchNotificationClick + end + object edInitiatorMessage: TEdit + Left = 66 + Top = 33 + Width = 308 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Text = 'Hello target connection!' + end + object edInitiatorWaitTimeout: TEdit + Left = 66 + Top = 63 + Width = 81 + Height = 21 + TabOrder = 2 + OnChange = edInitiatorWaitTimeoutChange + end + end + object Panel10: TPanel + Left = 333 + Top = 1 + Width = 44 + Height = 22 + Anchors = [akLeft, akTop, akRight] + BevelOuter = bvNone + TabOrder = 1 + end + end + end + object meInitiatorLog: TMemo + Left = 0 + Top = 136 + Width = 380 + Height = 335 + Align = alClient + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + end + end + object Panel2: TPanel + Left = 383 + Top = 0 + Width = 506 + Height = 471 + Align = alClient + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object Panel4: TPanel + Left = 0 + Top = 0 + Width = 506 + Height = 136 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Label2: TLabel + Left = 3 + Top = 6 + Width = 105 + Height = 13 + Caption = 'Target connection' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel6: TPanel + Left = 1 + Top = 23 + Width = 333 + Height = 112 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btTargetReceive: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Receive' + Flat = True + Transparent = False + OnClick = btTargetReceiveClick + end + object btTargetSend: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Send' + Flat = True + Transparent = False + OnClick = btTargetSendClick + end + object Panel8: TPanel + Left = 1 + Top = 24 + Width = 331 + Height = 87 + BevelOuter = bvNone + TabOrder = 0 + object lbTargetMessage: TLabel + Left = 3 + Top = 37 + Width = 43 + Height = 13 + Caption = 'Message' + end + object lbTargetWaitTimeout: TLabel + Left = 3 + Top = 66 + Width = 60 + Height = 13 + Caption = 'WaitTimeout' + end + object cbTargetAsynchNotification: TCheckBox + Left = 8 + Top = 7 + Width = 166 + Height = 17 + Caption = 'AsynchNotification' + TabOrder = 0 + OnClick = cbTargetAsynchNotificationClick + end + object edTargetMessage: TEdit + Left = 66 + Top = 33 + Width = 263 + Height = 21 + TabOrder = 1 + Text = 'Hello initiator connection!' + end + object edTargetWaitTimeout: TEdit + Left = 66 + Top = 63 + Width = 81 + Height = 21 + TabOrder = 2 + OnChange = edTargetWaitTimeoutChange + end + end + object Panel9: TPanel + Left = 167 + Top = 1 + Width = 165 + Height = 22 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 1 + end + end + end + object meTargetLog: TMemo + Left = 0 + Top = 136 + Width = 506 + Height = 335 + Align = alClient + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + end + end + object InitiatorServiceBroker: TMSServiceBroker + WaitTimeout = 5000 + OnMessage = InitiatorServiceBrokerMessage + OnBeginConversation = InitiatorServiceBrokerBeginConversation + OnEndConversation = InitiatorServiceBrokerEndConversation + Left = 240 + Top = 128 + end + object MSConnection2: TMSConnection + Database = 'master' + Left = 384 + Top = 232 + end + object TargetServiceBroker: TMSServiceBroker + Connection = MSConnection2 + WaitTimeout = 5000 + OnMessage = TargetServiceBrokerMessage + OnBeginConversation = TargetServiceBrokerBeginConversation + OnEndConversation = TargetServiceBrokerEndConversation + Left = 416 + Top = 232 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServiceBroker/ServiceBroker.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServiceBroker/ServiceBroker.pas new file mode 100644 index 0000000..d682c66 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/ServiceBroker/ServiceBroker.pas @@ -0,0 +1,279 @@ +unit ServiceBroker; + +interface + +uses +{$IFDEF VER6P} + Variants, +{$ENDIF} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, DemoFrame, ExtCtrls, StdCtrls, DB, DBAccess, MSAccess, + MSServiceBroker, Buttons; + +type + TServiceBrokerFrame = class(TDemoFrame) + Panel1: TPanel; + Splitter1: TSplitter; + Panel2: TPanel; + InitiatorServiceBroker: TMSServiceBroker; + MSConnection2: TMSConnection; + TargetServiceBroker: TMSServiceBroker; + Panel3: TPanel; + Panel4: TPanel; + meInitiatorLog: TMemo; + meTargetLog: TMemo; + Label1: TLabel; + Label2: TLabel; + Panel5: TPanel; + Panel6: TPanel; + btInitiatorBeginDialog: TSpeedButton; + btInitiatorEndDialog: TSpeedButton; + btInitiatorSend: TSpeedButton; + btInitiatorReceive: TSpeedButton; + Panel7: TPanel; + cbInitiatorAsynchNotification: TCheckBox; + lbInitiatorMessage: TLabel; + edInitiatorMessage: TEdit; + edInitiatorWaitTimeout: TEdit; + lbInitiatorWaitTimeout: TLabel; + btTargetReceive: TSpeedButton; + btTargetSend: TSpeedButton; + Panel8: TPanel; + cbTargetAsynchNotification: TCheckBox; + lbTargetMessage: TLabel; + edTargetMessage: TEdit; + lbTargetWaitTimeout: TLabel; + edTargetWaitTimeout: TEdit; + Panel9: TPanel; + Panel10: TPanel; + procedure btInitiatorBeginDialogClick(Sender: TObject); + procedure btInitiatorEndDialogClick(Sender: TObject); + procedure btInitiatorSendClick(Sender: TObject); + procedure btInitiatorReceiveClick(Sender: TObject); + procedure cbInitiatorAsynchNotificationClick(Sender: TObject); + procedure edInitiatorWaitTimeoutChange(Sender: TObject); + procedure btTargetSendClick(Sender: TObject); + procedure btTargetReceiveClick(Sender: TObject); + procedure cbTargetAsynchNotificationClick(Sender: TObject); + procedure edTargetWaitTimeoutChange(Sender: TObject); + procedure InitiatorServiceBrokerBeginConversation(Sender: TObject; + Conversation: TMSConversation); + procedure InitiatorServiceBrokerEndConversation(Sender: TObject; + Conversation: TMSConversation; ErrorMessage: String; + ErrorCode: Integer); + procedure InitiatorServiceBrokerMessage(Sender: TObject); + procedure TargetServiceBrokerBeginConversation(Sender: TObject; + Conversation: TMSConversation); + procedure TargetServiceBrokerEndConversation(Sender: TObject; + Conversation: TMSConversation; ErrorMessage: String; + ErrorCode: Integer); + procedure TargetServiceBrokerMessage(Sender: TObject); + private + FMSConversation: TMSConversation; + public + // Demo management + procedure AssignTargetConnection; + procedure Initialize; override; + end; + +var + ServiceBrokerFrame: TServiceBrokerFrame; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +const + InitiatorServiceName = 'InitiatorService'; + TargetServiceName = 'TargetService'; + +{ TServiceBrokerFrame } + +procedure TServiceBrokerFrame.AssignTargetConnection; +begin + if Connection.Connected and MSConnection2.Connected then + Exit; + + if not Connection.Connected then + Connection.Connect; + + MSConnection2.Disconnect; + MSConnection2.Assign(Connection); + MSConnection2.LoginPrompt := False; + MSConnection2.Connect; + + InitiatorServiceBroker.CreateServerObjects; + + TargetServiceBroker.CreateServerObjects; +end; + +procedure TServiceBrokerFrame.Initialize; +begin + inherited; + + InitiatorServiceBroker.Connection := Connection as TMSConnection; + + InitiatorServiceBroker.Service := InitiatorServiceName; + TargetServiceBroker.Service := TargetServiceName; + + cbInitiatorAsynchNotification.Checked := InitiatorServiceBroker.AsyncNotification; + cbTargetAsynchNotification.Checked := TargetServiceBroker.AsyncNotification; + + edInitiatorWaitTimeout.Text := IntToStr(InitiatorServiceBroker.WaitTimeout); + edTargetWaitTimeout.Text := IntToStr(TargetServiceBroker.WaitTimeout); + + btInitiatorEndDialog.Enabled := False; +end; + +procedure TServiceBrokerFrame.btInitiatorBeginDialogClick(Sender: TObject); +begin + AssignTargetConnection; + + FMSConversation := InitiatorServiceBroker.BeginDialog(TargetServiceName, '', False); + + // Demo managment + btInitiatorEndDialog.Enabled := True; + btInitiatorBeginDialog.Enabled := False; +end; + +procedure TServiceBrokerFrame.btInitiatorEndDialogClick(Sender: TObject); +begin + FMSConversation.EndConversation; + FMSConversation := nil; + + // Demo managment + btInitiatorEndDialog.Enabled := False; + btInitiatorBeginDialog.Enabled := True; +end; + +procedure TServiceBrokerFrame.btInitiatorSendClick(Sender: TObject); +var + TransmitionStatus: string; +begin + AssignTargetConnection; + if FMSConversation <> nil then begin + FMSConversation.Send(edInitiatorMessage.Text); + TransmitionStatus := FMSConversation.GetTransmissionStatus; + if TransmitionStatus <> '' then + meInitiatorLog.Lines.Add(TransmitionStatus) + else + meInitiatorLog.Lines.Add('Message was send successfully'); + end + else + raise Exception.Create('No active dialog'); +end; + +procedure TServiceBrokerFrame.btInitiatorReceiveClick(Sender: TObject); +begin + AssignTargetConnection; + if InitiatorServiceBroker.Receive then + meInitiatorLog.Lines.Add(InitiatorServiceBroker.CurrentMessage.AsString); +end; + +procedure TServiceBrokerFrame.cbInitiatorAsynchNotificationClick(Sender: TObject); +begin + AssignTargetConnection; + InitiatorServiceBroker.AsyncNotification := cbInitiatorAsynchNotification.Checked; +end; + +procedure TServiceBrokerFrame.edInitiatorWaitTimeoutChange(Sender: TObject); +var + WaitTimeout: integer; +begin + try + WaitTimeout := StrToInt(edInitiatorWaitTimeout.Text); + except + Exit; + end; + InitiatorServiceBroker.WaitTimeout := WaitTimeout; +end; + +procedure TServiceBrokerFrame.InitiatorServiceBrokerBeginConversation( + Sender: TObject; Conversation: TMSConversation); +begin + meInitiatorLog.Lines.Add('Conversation started'); +end; + +procedure TServiceBrokerFrame.InitiatorServiceBrokerEndConversation( + Sender: TObject; Conversation: TMSConversation; ErrorMessage: String; + ErrorCode: Integer); +begin + meInitiatorLog.Lines.Add('Conversation finished'); +end; + +procedure TServiceBrokerFrame.InitiatorServiceBrokerMessage(Sender: TObject); +begin + if InitiatorServiceBroker.Receive then + meInitiatorLog.Lines.Add(InitiatorServiceBroker.CurrentMessage.AsString); +end; + +procedure TServiceBrokerFrame.btTargetSendClick(Sender: TObject); +var + TransmitionStatus: string; + Conversation: TMSConversation; +begin + AssignTargetConnection; + if TargetServiceBroker.ConversationCount > 0 then begin + Conversation := TargetServiceBroker.Conversations[0]; + Conversation.Send(edTargetMessage.Text); + TransmitionStatus := Conversation.GetTransmissionStatus; + if TransmitionStatus <> '' then + meTargetLog.Lines.Add(TransmitionStatus) + else + meTargetLog.Lines.Add('Message was send successfully'); + end + else + raise Exception.Create('No active dialog'); +end; + +procedure TServiceBrokerFrame.btTargetReceiveClick(Sender: TObject); +begin + AssignTargetConnection; + if TargetServiceBroker.Receive then + meTargetLog.Lines.Add(TargetServiceBroker.CurrentMessage.AsString); +end; + +procedure TServiceBrokerFrame.cbTargetAsynchNotificationClick(Sender: TObject); +begin + AssignTargetConnection; + TargetServiceBroker.AsyncNotification := cbTargetAsynchNotification.Checked; +end; + +procedure TServiceBrokerFrame.edTargetWaitTimeoutChange(Sender: TObject); +var + WaitTimeout: integer; +begin + try + WaitTimeout := StrToInt(edTargetWaitTimeout.Text); + except + Exit; + end; + TargetServiceBroker.WaitTimeout := WaitTimeout; +end; + +procedure TServiceBrokerFrame.TargetServiceBrokerBeginConversation( + Sender: TObject; Conversation: TMSConversation); +begin + meTargetLog.Lines.Add('Conversation started'); +end; + +procedure TServiceBrokerFrame.TargetServiceBrokerEndConversation( + Sender: TObject; Conversation: TMSConversation; ErrorMessage: String; + ErrorCode: Integer); +begin + meTargetLog.Lines.Add('Conversation finished'); +end; + +procedure TServiceBrokerFrame.TargetServiceBrokerMessage(Sender: TObject); +begin + if TargetServiceBroker.Receive then + if TargetServiceBroker.CurrentMessage.MessageType <> SEndDialogType then + meTargetLog.Lines.Add(TargetServiceBroker.CurrentMessage.AsString); +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Sql/Sql.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Sql/Sql.nfm new file mode 100644 index 0000000..7a22794 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Sql/Sql.nfm @@ -0,0 +1,139 @@ +inherited SqlFrame: TSqlFrame + Width = 443 + Height = 277 + Align = alClient + object Label1: TLabel + Left = 456 + Top = 48 + Width = 32 + Height = 13 + Caption = 'Label1' + end + object Splitter1: TSplitter + Left = 0 + Top = 188 + Width = 488 + Height = 3 + Cursor = crVSplit + Align = alTop + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 488 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object TPanel + Left = 1 + Top = 1 + Width = 350 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btExecute: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Execute' + Flat = True + Transparent = False + OnClick = btExecuteClick + end + object btBreakExec: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Break' + Enabled = False + Flat = True + Transparent = False + OnClick = btBreakExecClick + end + object btExecInThread: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Hint = + 'Assing a long-drawn command to memo (e.g. `SELECT SLEEP(10);`) a' + + 'nd push this button.' + Caption = 'Exec in thread' + Flat = True + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = btExecInThreadClick + end + object Panel1: TPanel + Left = 250 + Top = 1 + Width = 99 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbNonBlocking: TCheckBox + Left = 7 + Top = 3 + Width = 86 + Height = 17 + Caption = 'NonBlocking' + TabOrder = 0 + OnClick = cbNonBlockingClick + end + end + end + end + object meSQL: TMemo + Left = 0 + Top = 26 + Width = 488 + Height = 162 + Align = alTop + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnExit = meSQLExit + end + object meResult: TMemo + Left = 0 + Top = 191 + Width = 488 + Height = 70 + TabStop = False + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Courier New' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 2 + end + object MSSQL: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SET :Cnt = (SELECT COUNT(*) FROM Emp)') + AfterExecute = MSSQLAfterExecute + CommandTimeout = 0 + Left = 224 + Top = 40 + ParamData = < + item + DataType = ftInteger + Name = 'Cnt' + ParamType = ptInputOutput + Value = 830 + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Sql/Sql.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Sql/Sql.pas new file mode 100644 index 0000000..0727b29 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Sql/Sql.pas @@ -0,0 +1,216 @@ +unit Sql; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MSAccess, DBAccess, SdacVcl, Buttons, + DemoFrame, SdacDemoForm, OLEDBAccess, ActiveX; + +type + TSqlFrame = class(TDemoFrame) + ToolBar: TPanel; + meSQL: TMemo; + MSSQL: TMSSQL; + Label1: TLabel; + Splitter1: TSplitter; + meResult: TMemo; + btExecute: TSpeedButton; + btBreakExec: TSpeedButton; + Panel1: TPanel; + cbNonBlocking: TCheckBox; + btExecInThread: TSpeedButton; + procedure btExecuteClick(Sender: TObject); + procedure meSQLExit(Sender: TObject); + procedure MSSQLAfterExecute(Sender: TObject; Result: Boolean); + procedure cbNonBlockingClick(Sender: TObject); + procedure btBreakExecClick(Sender: TObject); + procedure btExecInThreadClick(Sender: TObject); + private + { Private declarations } + OldProvider: TOLEDBProvider; + DoNotRemind: boolean; + FExecThread: TThread; + procedure AssignProperties; + procedure TerminateThread; + public + destructor Destroy; override; + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + + { TExecThread } + + TExecThread = class(TThread) + protected + procedure Execute; override; + procedure Terminate; + end; + +var + SqlFrame: TSqlFrame; + +implementation + +uses ComObj; + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure LogError(EMessage: string); +begin + SqlFrame.meResult.Lines.Add('An error with the following message has beein raised during query execution:' + #13#10 + EMessage); +end; + +{ TExecThread } + +procedure TExecThread.Execute; +begin + CoInitialize(nil); + if SqlFrame.MSSQL <> nil then + try + SqlFrame.btBreakExec.Enabled := True; + SqlFrame.MSSQL.Execute; + except + on e: Exception do begin + LogError(e.Message); + end; + end; + Terminate; +end; + +procedure TExecThread.Terminate; +begin + inherited; + SqlFrame.btBreakExec.Enabled := False; + CoUninitialize; +end; + +{ TSqlFrame } + +procedure TSqlFrame.AssignProperties; +begin + if Trim(MSSQL.SQL.Text) <> Trim(meSQL.Lines.Text) then + MSSQL.SQL.Assign(meSQL.Lines); + MSSQL.NonBlocking := cbNonBlocking.Checked; + if MSSQL.NonBlocking then + btBreakExec.Enabled := False; +end; + +procedure TSqlFrame.TerminateThread; +begin + if FExecThread <> nil then begin + FExecThread.Terminate; + MSSQL.BreakExec; + FExecThread.WaitFor; + FExecThread.Free; + FExecThread := nil; + end; +end; + +procedure TSqlFrame.btExecuteClick(Sender: TObject); +begin + AssignProperties; + meResult.Lines.Clear; + SdacForm.StatusBar.Panels[2].Text := 'Executing...'; + if MSSQL.NonBlocking then + btBreakExec.Enabled := True; + MSSQL.Execute; +end; + +procedure TSqlFrame.meSQLExit(Sender: TObject); +begin + AssignProperties; +end; + +procedure TSqlFrame.MSSQLAfterExecute(Sender: TObject; Result: Boolean); +var + s: string; + i: integer; +begin + btBreakExec.Enabled := False; + if btBreakExec.Enabled then + btBreakExec.Enabled := False; + if Result then + s := 'Success' + ' (' + IntToStr(MSSQL.RowsAffected) + ' rows processed)' + else + s := 'Execution failed'; + SdacForm.StatusBar.Panels[2].Text := s; + + for i := 0 to MSSQL.Params.Count-1 do + meResult.Lines.Add(MSSQL.Params[i].Name + ' = ' + MSSQL.Params[i].AsString); + + meResult.Lines.Add(s); +end; + +procedure TSqlFrame.cbNonBlockingClick(Sender: TObject); +var + oldConnect: boolean; +begin + oldConnect := MSSQL.Connection.Connected; + try + if cbNonBlocking.Checked then begin + if not DoNotRemind then begin + MessageDlg('Note, NonBlocking mode is available only with SQL Native Client installed', mtInformation, [mbOK], 0); + DoNotRemind := True; + end; + MSSQL.Connection.Disconnect; + OldProvider := MSSQL.Connection.Options.Provider; + MSSQL.Connection.Options.Provider := prNativeClient; + end + else + MSSQL.Connection.Options.Provider := OldProvider; + MSSQL.NonBlocking := cbNonBlocking.Checked; + finally + cbNonBlocking.Checked := MSSQL.NonBlocking; + end; + MSSQL.Connection.Connected := oldConnect; +end; + +procedure TSqlFrame.btBreakExecClick(Sender: TObject); +begin + MSSQL.BreakExec; +end; + +destructor TSqlFrame.Destroy; +begin + TerminateThread; + if (self <> nil) and MSSQL.Executing then + MSSQL.BreakExec; + + inherited; +end; + +procedure TSqlFrame.btExecInThreadClick(Sender: TObject); +begin + MSSQL.SQL := meSQL.Lines; + SDACForm.StatusBar.Panels[2].Text := 'Executing...'; + meResult.Lines.Clear; + TerminateThread; + FExecThread := TExecThread.Create(False) +end; + +// Demo management +procedure TSqlFrame.Initialize; +begin + inherited; + + FExecThread := nil; + SqlFrame := Self; + DoNotRemind := False; + MSSQL.Connection := Connection as TMSConnection; + meSQL.Lines := MSSQL.SQL; +end; + +procedure TSqlFrame.SetDebug(Value: boolean); +begin + MSSQL.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProc/StoredProc.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProc/StoredProc.nfm new file mode 100644 index 0000000..2b47bd1 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProc/StoredProc.nfm @@ -0,0 +1,157 @@ +inherited StoredProcFrame: TStoredProcFrame + Width = 441 + Height = 275 + Align = alClient + object DBGrid: TDBGrid + Left = 0 + Top = 49 + Width = 441 + Height = 226 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 49 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 499 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btPrepare: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Prepare' + Flat = True + Transparent = False + OnClick = btPrepareClick + end + object btUnPrepare: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'UnPrepare' + Flat = True + Transparent = False + OnClick = btUnPrepareClick + end + object btExecute: TSpeedButton + Left = 333 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Execute' + Flat = True + Transparent = False + OnClick = btExecuteClick + end + object btPrepareSQL: TSpeedButton + Left = 416 + Top = 1 + Width = 82 + Height = 22 + Caption = 'PrepareSQL' + Flat = True + Transparent = False + OnClick = btPrepareSQLClick + end + end + object Panel2: TPanel + Left = 1 + Top = 24 + Width = 499 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object DBNavigator: TDBNavigator + Left = 278 + Top = 1 + Width = 220 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel3: TPanel + Left = 1 + Top = 1 + Width = 276 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object Label1: TLabel + Left = 4 + Top = 6 + Width = 82 + Height = 13 + Caption = 'StoredProc name' + end + object edStoredProcName: TComboBox + Left = 95 + Top = 1 + Width = 173 + Height = 21 + ItemHeight = 13 + TabOrder = 0 + OnDropDown = edStoredProcNameDropDown + OnExit = edStoredProcNameExit + end + end + end + end + object DataSource: TDataSource + DataSet = MSStoredProc + Left = 432 + Top = 72 + end + object MSStoredProc: TMSStoredProc + StoredProcName = 'Ten Most High-Paid Employees;1' + SQLRefresh.Strings = ( + 'WHERE' + ' DEPTNO = :DEPTNO') + Connection = SDACForm.MSConnection + SQL.Strings = ( + '{CALL "Ten Most High-Paid Employees";1}') + Debug = True + Left = 400 + Top = 72 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProc/StoredProc.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProc/StoredProc.pas new file mode 100644 index 0000000..6c9b973 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProc/StoredProc.pas @@ -0,0 +1,170 @@ +unit StoredProc; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MemDS, DBAccess, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm, DAScript, MSScript; + +type + TStoredProcFrame = class(TDemoFrame) + DataSource: TDataSource; + MSStoredProc: TMSStoredProc; + DBGrid: TDBGrid; + ToolBar: TPanel; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btPrepare: TSpeedButton; + btUnPrepare: TSpeedButton; + btExecute: TSpeedButton; + btPrepareSQL: TSpeedButton; + Panel2: TPanel; + DBNavigator: TDBNavigator; + Panel3: TPanel; + Label1: TLabel; + edStoredProcName: TComboBox; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btPrepareClick(Sender: TObject); + procedure btUnPrepareClick(Sender: TObject); + procedure btExecuteClick(Sender: TObject); + procedure btPrepareSQLClick(Sender: TObject); + procedure edStoredProcNameExit(Sender: TObject); + procedure edStoredProcNameDropDown(Sender: TObject); + private + { Private declarations } + procedure ShowState; + procedure AssignProperties; + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TStoredProcFrame.AssignProperties; +begin + if Trim(MSStoredProc.StoredProcName) <> Trim(edStoredProcName.Text) then + MSStoredProc.StoredProcName := edStoredProcName.Text; + ShowState; +end; + +procedure TStoredProcFrame.ShowState; +var + St: string; + + procedure AddSt(S:string); + begin + if St <> '' then + St := St + ', '; + St := St + S; + end; + +begin + St := ''; + + if MSStoredProc.Prepared then begin + AddSt('Prepared'); + + if MSStoredProc.IsQuery then + AddSt('IsQuery'); + + end; + + if MSStoredProc.Active then + AddSt('Active') + else + AddSt('Inactive'); + + SdacForm.StatusBar.Panels[2].Text := St; +end; + +procedure TStoredProcFrame.btOpenClick(Sender: TObject); +begin + try + AssignProperties; + MSStoredProc.Open; + finally + ShowState; + end; +end; + +procedure TStoredProcFrame.btCloseClick(Sender: TObject); +begin + MSStoredProc.Close; + ShowState; +end; + +procedure TStoredProcFrame.btPrepareClick(Sender: TObject); +begin + try + AssignProperties; + MSStoredProc.Prepare; + finally + ShowState; + end; +end; + +procedure TStoredProcFrame.btUnPrepareClick(Sender: TObject); +begin + MSStoredProc.UnPrepare; + ShowState; +end; + +procedure TStoredProcFrame.btExecuteClick(Sender: TObject); +begin + try + AssignProperties; + MSStoredProc.Execute; + finally + ShowState; + end; +end; + +procedure TStoredProcFrame.btPrepareSQLClick(Sender: TObject); +begin + try + AssignProperties; + MSStoredProc.PrepareSQL; + finally + ShowState; + end; +end; + +procedure TStoredProcFrame.edStoredProcNameExit(Sender: TObject); +begin + AssignProperties; +end; + +procedure TStoredProcFrame.edStoredProcNameDropDown(Sender: TObject); +begin + MSStoredProc.Connection.GetStoredProcNames(edStoredProcName.Items); +end; + +// Demo management +procedure TStoredProcFrame.Initialize; +begin + inherited; + MSStoredProc.Connection := Connection as TMSConnection; + edStoredProcName.Text := MSStoredProc.StoredProcName; + ShowState; +end; + +procedure TStoredProcFrame.SetDebug(Value: boolean); +begin + MSStoredProc.Debug := Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProcUpdates/StoredProcUpdates.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProcUpdates/StoredProcUpdates.nfm new file mode 100644 index 0000000..050ebbd --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProcUpdates/StoredProcUpdates.nfm @@ -0,0 +1,101 @@ +inherited StoredProcUpdatesFrame: TStoredProcUpdatesFrame + Width = 441 + Height = 275 + Align = alClient + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 1 + Top = 1 + Width = 408 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Transparent = False + OnClick = btOpenClick + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 1 + Width = 240 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + end + end + object DBGrid1: TDBGrid + Left = 0 + Top = 26 + Width = 441 + Height = 249 + Align = alClient + DataSource = DataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object MSQuery: TMSQuery + SQLInsert.Strings = ( + '{:EmpNO = CALL SDAC_InsertEmp;1(:ENAME, :JOB)}') + SQLDelete.Strings = ( + '{CALL SDAC_DeleteEmp;1(:EmpNO, :Result)}') + SQLUpdate.Strings = ( + + '{:RETURN_VALUE = CALL SDAC_UpdateEmp;1(:EMPNO, :ENAME, :JOB, :EM' + + 'PINFO)}') + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT EMPNO, ENAME, JOB FROM EMP') + Debug = True + BeforeUpdateExecute = MSQueryBeforeUpdateExecute + AfterUpdateExecute = MSQueryAfterUpdateExecute + Left = 48 + Top = 208 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 80 + Top = 208 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProcUpdates/StoredProcUpdates.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProcUpdates/StoredProcUpdates.pas new file mode 100644 index 0000000..04781f7 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/StoredProcUpdates/StoredProcUpdates.pas @@ -0,0 +1,133 @@ +{ +Insert - example of using SP with return Identity value as result of executing +Update - example of using SP with return arbitrary value as result of executing +Delete - example of using SP with return arbitrary value as parameter +} + +unit StoredProcUpdates; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Db, MemDS, DBAccess, Grids, DBGrids, StdCtrls, + ActnList, ExtCtrls, DBCtrls, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm; + +type + TStoredProcUpdatesFrame = class(TDemoFrame) + MSQuery: TMSQuery; + DataSource: TDataSource; + Panel1: TPanel; + DBGrid1: TDBGrid; + Panel2: TPanel; + DBNavigator1: TDBNavigator; + btClose: TSpeedButton; + btOpen: TSpeedButton; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure MSQueryBeforeUpdateExecute(Sender: TCustomMSDataSet; + StatementTypes: TStatementTypes; Params: TMSParams); + procedure MSQueryAfterUpdateExecute(Sender: TCustomMSDataSet; + StatementTypes: TStatementTypes; Params: TMSParams); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +{$IFDEF CLR} +uses + Variants; +{$ENDIF} + +procedure TStoredProcUpdatesFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TStoredProcUpdatesFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TStoredProcUpdatesFrame.MSQueryBeforeUpdateExecute(Sender: TCustomMSDataSet; + StatementTypes: TStatementTypes; Params: TMSParams); +begin + if stInsert in StatementTypes then begin + Params.ParamByName('EMPNO').ParamType := ptResult; + // Params.ParamByName('RETURN_VALUE').DataType was setted equal to Sender.FieldByName('EMPNO').FieldType + end; + + if stUpdate in StatementTypes then begin + Params.ParamByName('RETURN_VALUE').ParamType := ptResult; + Params.ParamByName('RETURN_VALUE').DataType := ftInteger; // Field 'RETURN_VALUE' does not present in Sender, so we need to set DataType manually + + Params.ParamByName('EMPINFO').ParamType := ptOutput; + Params.ParamByName('EMPINFO').DataType := ftWideString; // Field 'EMPINFO' does not present in Sender, so we need to set DataType manually + end; + + if stDelete in StatementTypes then begin + Params.ParamByName('Result').ParamType := ptOutput; + Params.ParamByName('Result').DataType := ftInteger; // Field 'Result' does not present in Sender, so we need to set DataType manually + end; +end; + +procedure TStoredProcUpdatesFrame.MSQueryAfterUpdateExecute(Sender: TCustomMSDataSet; + StatementTypes: TStatementTypes; Params: TMSParams); +var + EMPNO, ReturnedEMPNO: integer; +begin + if stInsert in StatementTypes then begin + EMPNO := Integer(Params.ParamByName('EMPNO').Value); + Sender.FieldByName('EMPNO').ReadOnly := False; + try + Sender.FieldByName('EMPNO').NewValue := EMPNO; + finally + Sender.FieldByName('EMPNO').ReadOnly := True; + end; + end; + + if stUpdate in StatementTypes then begin + EMPNO := Sender.FieldByName('EMPNO').AsInteger; + ReturnedEMPNO := Integer(Params.ParamByName('RETURN_VALUE').Value); + + if EMPNO <> ReturnedEMPNO then + raise Exception.Create('Error on Update occured!'); + + Caption := String(Params.ParamByName('EMPINFO').Value); + end; + + if stDelete in StatementTypes then begin + EMPNO := Params.ParamByName('EMPNO').AsInteger; + ReturnedEMPNO := Integer(Params.ParamByName('Result').Value); + + if EMPNO + 2 {see StoredProc SDAC_DeleteEmployees} <> ReturnedEMPNO then + raise Exception.Create('Error on Delete occured!'); + end; +end; + +// Demo management +procedure TStoredProcUpdatesFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; +end; + +procedure TStoredProcUpdatesFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Table/Table.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Table/Table.nfm new file mode 100644 index 0000000..3375e6f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Table/Table.nfm @@ -0,0 +1,180 @@ +inherited TableFrame: TTableFrame + Width = 441 + Height = 275 + Align = alClient + object DBGrid: TDBGrid + Left = 0 + Top = 76 + Width = 441 + Height = 199 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 76 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel3: TPanel + Left = 1 + Top = 0 + Width = 657 + Height = 75 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btPrepare: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Prepare' + Flat = True + Transparent = False + OnClick = btPrepareClick + end + object btUnPrepare: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'UnPrepare' + Flat = True + Transparent = False + OnClick = btUnPrepareClick + end + object btExecute: TSpeedButton + Left = 333 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Execute' + Flat = True + Transparent = False + OnClick = btExecuteClick + end + object DBNavigator: TDBNavigator + Left = 416 + Top = 1 + Width = 240 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel7: TPanel + Left = 416 + Top = 24 + Width = 240 + Height = 50 + BevelOuter = bvNone + TabOrder = 1 + object Label3: TLabel + Left = 6 + Top = 4 + Width = 53 + Height = 13 + Caption = 'OrderFields' + end + object edOrderFields: TEdit + Left = 6 + Top = 20 + Width = 219 + Height = 21 + TabOrder = 0 + OnExit = edTableNameExit + end + end + object Panel5: TPanel + Left = 1 + Top = 24 + Width = 165 + Height = 50 + BevelOuter = bvNone + TabOrder = 2 + object Label1: TLabel + Left = 6 + Top = 4 + Width = 56 + Height = 13 + Caption = 'Table name' + end + object edTableName: TComboBox + Left = 6 + Top = 20 + Width = 140 + Height = 21 + ItemHeight = 13 + TabOrder = 0 + OnDropDown = edTableNameDropDown + OnExit = edTableNameExit + end + end + object Panel8: TPanel + Left = 167 + Top = 24 + Width = 248 + Height = 50 + BevelOuter = bvNone + TabOrder = 3 + object Label4: TLabel + Left = 6 + Top = 4 + Width = 43 + Height = 13 + Caption = 'FilterSQL' + end + object edFilterSQL: TEdit + Left = 6 + Top = 20 + Width = 226 + Height = 21 + TabOrder = 0 + OnExit = edTableNameExit + end + end + end + end + object DataSource: TDataSource + DataSet = MSTable + Left = 128 + Top = 32 + end + object MSTable: TMSTable + TableName = 'Emp' + OrderFields = 'EName' + Connection = SDACForm.MSConnection + Debug = True + Left = 96 + Top = 32 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Table/Table.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Table/Table.pas new file mode 100644 index 0000000..0911d54 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Table/Table.pas @@ -0,0 +1,176 @@ +unit Table; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MemDS, DBAccess, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm; + +type + TTableFrame = class(TDemoFrame) + DataSource: TDataSource; + MSTable: TMSTable; + DBGrid: TDBGrid; + ToolBar: TPanel; + Panel3: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btPrepare: TSpeedButton; + btUnPrepare: TSpeedButton; + btExecute: TSpeedButton; + DBNavigator: TDBNavigator; + Panel7: TPanel; + Label3: TLabel; + edOrderFields: TEdit; + Panel5: TPanel; + Label1: TLabel; + edTableName: TComboBox; + Panel8: TPanel; + Label4: TLabel; + edFilterSQL: TEdit; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btPrepareClick(Sender: TObject); + procedure btUnPrepareClick(Sender: TObject); + procedure btExecuteClick(Sender: TObject); + procedure edTableNameExit(Sender: TObject); + procedure edTableNameDropDown(Sender: TObject); + private + { Private declarations } + procedure ShowState; + procedure AssignProperties; + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TTableFrame.AssignProperties; +begin + try + if Trim(MSTable.TableName) <> Trim(edTableName.Text) then + MSTable.TableName := edTableName.Text; + + MSTable.FilterSQL := edFilterSQL.Text; + + try + MSTable.OrderFields:= edOrderFields.Text; + except + edOrderFields.SetFocus; + raise; + end; + finally + ShowState; + end; + +end; + +procedure TTableFrame.ShowState; +var + St: string; + + procedure AddSt(S: string); + begin + if St <> '' then + St:= St + ', '; + St:= St + S; + end; + +begin + St:= ''; + + if MSTable.Prepared then begin + AddSt('Prepared'); + + if MSTable.IsQuery then + AddSt('IsQuery'); + end; + + if MSTable.Active then + AddSt('Active') + else + AddSt('Inactive'); + + SdacForm.StatusBar.Panels[2].Text:= St; +end; + +procedure TTableFrame.btOpenClick(Sender: TObject); +begin + try + AssignProperties; + MSTable.Open; + finally + ShowState; + end; +end; + +procedure TTableFrame.btCloseClick(Sender: TObject); +begin + MSTable.Close; + ShowState; +end; + +procedure TTableFrame.btPrepareClick(Sender: TObject); +begin + try + AssignProperties; + MSTable.Prepare; + finally + ShowState; + end; +end; + +procedure TTableFrame.btUnPrepareClick(Sender: TObject); +begin + MSTable.UnPrepare; + ShowState; +end; + +procedure TTableFrame.btExecuteClick(Sender: TObject); +begin + try + AssignProperties; + MSTable.Execute; + finally + ShowState; + end; +end; + +procedure TTableFrame.edTableNameExit(Sender: TObject); +begin + AssignProperties; +end; + +procedure TTableFrame.edTableNameDropDown(Sender: TObject); +begin + MSTable.Connection.GetTableNames(edTableName.Items); +end; + +// Demo management +procedure TTableFrame.Initialize; +begin + inherited; + MSTable.Connection := Connection as TMSConnection; + edTableName.Text:= MSTable.TableName; + edOrderFields.Text:= MSTable.OrderFields; + ShowState; +end; + +procedure TTableFrame.SetDebug(Value: boolean); +begin + MSTable.Debug:= Value; +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Text/Text.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Text/Text.nfm new file mode 100644 index 0000000..4540520 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Text/Text.nfm @@ -0,0 +1,162 @@ +inherited TextFrame: TTextFrame + Width = 441 + Height = 275 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 208 + Width = 441 + Height = 2 + Cursor = crVSplit + Align = alTop + end + object DBGrid: TDBGrid + Left = 0 + Top = 26 + Width = 441 + Height = 182 + Align = alTop + DataSource = DataSource + Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete] + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object ToolButton1: TToolButton + Left = 362 + Top = 2 + Width = 16 + Caption = 'ToolButton1' + Style = tbsSeparator + end + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 398 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object DBNavigator: TDBNavigator + Left = 167 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + end + end + object meText: TDBMemo + Left = 0 + Top = 236 + Width = 441 + Height = 39 + Align = alClient + DataField = 'TextField' + DataSource = DataSource + ScrollBars = ssBoth + TabOrder = 2 + end + object ToolBar1: TPanel + Left = 0 + Top = 210 + Width = 441 + Height = 26 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + object Panel2: TPanel + Left = 1 + Top = 1 + Width = 250 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btClear: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Clear' + Flat = True + Transparent = False + OnClick = btClearClick + end + object btSave: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Save to file' + Flat = True + Transparent = False + OnClick = btSaveClick + end + object btLoad: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Load from file' + Flat = True + Transparent = False + OnClick = btLoadClick + end + end + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 440 + Top = 32 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM SDAC_Text') + Debug = True + Left = 408 + Top = 32 + end + object OpenDialog: TOpenDialog + Left = 240 + Top = 259 + end + object SaveDialog: TSaveDialog + Left = 272 + Top = 259 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Text/Text.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Text/Text.pas new file mode 100644 index 0000000..294ccb0 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Text/Text.pas @@ -0,0 +1,100 @@ +unit Text; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MemDS, DBAccess, MSAccess, SdacVcl, + Buttons, DemoFrame, DAScript, MSScript; + +type + TTextFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + meText: TDBMemo; + MSQuery: TMSQuery; + Splitter1: TSplitter; + ToolBar1: TPanel; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + ToolButton1: TToolButton; + Panel1: TPanel; + DBNavigator: TDBNavigator; + btClose: TSpeedButton; + btOpen: TSpeedButton; + Panel2: TPanel; + btClear: TSpeedButton; + btSave: TSpeedButton; + btLoad: TSpeedButton; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btSaveClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + private + { Private declarations } + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TTextFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Open; +end; + +procedure TTextFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; +end; + +procedure TTextFrame.btLoadClick(Sender: TObject); +begin + if MSQuery.Active and OpenDialog.Execute then begin + if MSQuery.State = dsBrowse then + MSQuery.Edit; + + TBlobField(MSQuery.FieldByName('TextField')).LoadFromFile(OpenDialog.FileName); + end; +end; + +procedure TTextFrame.btSaveClick(Sender: TObject); +begin + if not MSQuery.EOF and SaveDialog.Execute then + TBlobField(MSQuery.FieldByName('TextField')).SaveToFile(SaveDialog.FileName); +end; + +procedure TTextFrame.btClearClick(Sender: TObject); +begin + if MSQuery.Active then begin + if MSQuery.State = dsBrowse then + MSQuery.Edit; + MSQuery.FieldByName('TextField').Clear; + end; +end; + +// Demo management +procedure TTextFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; +end; + +procedure TTextFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/Threads.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/Threads.nfm new file mode 100644 index 0000000..547862f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/Threads.nfm @@ -0,0 +1,391 @@ +inherited ThreadsFrame: TThreadsFrame + Width = 441 + Height = 275 + Align = alClient + object Panel3: TPanel + Left = 0 + Top = 80 + Width = 441 + Height = 143 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Splitter2: TSplitter + Left = 261 + Top = 0 + Height = 143 + end + object Panel4: TPanel + Left = 0 + Top = 0 + Width = 261 + Height = 143 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object meSQL: TMemo + Left = 0 + Top = 0 + Width = 261 + Height = 73 + Align = alTop + Font.Charset = RUSSIAN_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + object meLog: TMemo + Left = 0 + Top = 73 + Width = 261 + Height = 70 + Align = alClient + Font.Charset = RUSSIAN_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ScrollBars = ssVertical + TabOrder = 1 + end + end + object DBGrid1: TDBGrid + Left = 264 + Top = 0 + Width = 177 + Height = 143 + Align = alClient + DataSource = MSDataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + end + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 441 + Height = 80 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object Panel5: TPanel + Left = 0 + Top = 23 + Width = 418 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btStart: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Start' + Flat = True + Transparent = False + OnClick = btStartClick + end + object btStop: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Stop' + Flat = True + Transparent = False + OnClick = btStopClick + end + object btRun: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Run' + Flat = True + Transparent = False + OnClick = btRunClick + end + object btRunMax: TSpeedButton + Left = 250 + Top = 1 + Width = 83 + Height = 22 + Caption = 'RunMax' + Flat = True + Transparent = False + OnClick = btRunMaxClick + end + object btClearLog: TSpeedButton + Left = 334 + Top = 1 + Width = 83 + Height = 22 + Caption = 'ClearLog' + Flat = True + Transparent = False + OnClick = btClearLogClick + end + end + object Panel6: TPanel + Left = 0 + Top = 0 + Width = 418 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btDeleteAll: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Delete All' + Flat = True + Transparent = False + OnClick = btDeleteAllClick + end + object DBNavigator1: TDBNavigator + Left = 167 + Top = 1 + Width = 250 + Height = 22 + Flat = True + TabOrder = 0 + end + end + object Panel11: TPanel + Left = 417 + Top = 0 + Width = 244 + Height = 47 + BevelOuter = bvNone + Color = clGreen + TabOrder = 2 + object Panel10: TPanel + Left = 1 + Top = 1 + Width = 120 + Height = 45 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 5 + Top = 23 + Width = 92 + Height = 16 + Caption = 'Thread count' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label2: TLabel + Left = 5 + Top = 2 + Width = 89 + Height = 16 + Caption = 'Except count' + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lbThreadCount: TLabel + Left = 104 + Top = 23 + Width = 9 + Height = 16 + Caption = '0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lbExceptCount: TLabel + Left = 104 + Top = 2 + Width = 9 + Height = 16 + Caption = '0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + end + object Panel12: TPanel + Left = 122 + Top = 1 + Width = 121 + Height = 45 + BevelOuter = bvNone + TabOrder = 1 + object lbInterval: TLabel + Left = 57 + Top = 23 + Width = 6 + Height = 13 + Caption = '0' + end + object lbTime: TLabel + Left = 57 + Top = 2 + Width = 6 + Height = 13 + Caption = '0' + end + object Label5: TLabel + Left = 6 + Top = 2 + Width = 23 + Height = 13 + Caption = 'Time' + end + object Label6: TLabel + Left = 6 + Top = 23 + Width = 35 + Height = 13 + Caption = 'Interval' + end + end + end + object Panel13: TPanel + Left = 0 + Top = 46 + Width = 342 + Height = 30 + BevelOuter = bvNone + Color = clGreen + TabOrder = 3 + object Panel14: TPanel + Left = 1 + Top = 1 + Width = 164 + Height = 28 + BevelOuter = bvNone + TabOrder = 0 + object Label3: TLabel + Left = 6 + Top = 6 + Width = 54 + Height = 13 + Caption = 'MaxThread' + end + object edCount: TEdit + Left = 68 + Top = 3 + Width = 89 + Height = 21 + TabOrder = 0 + Text = 'edCount' + OnChange = edCountChange + end + end + object Panel9: TPanel + Left = 166 + Top = 1 + Width = 175 + Height = 28 + BevelOuter = bvNone + TabOrder = 1 + object Label4: TLabel + Left = 7 + Top = 7 + Width = 27 + Height = 13 + Caption = 'Mode' + end + object rbInsert: TRadioButton + Left = 41 + Top = 6 + Width = 63 + Height = 17 + Caption = 'INSERT' + TabOrder = 0 + OnClick = rgModeClick + end + object rbSelect: TRadioButton + Left = 105 + Top = 6 + Width = 81 + Height = 17 + Caption = 'SELECT' + TabOrder = 1 + OnClick = rgModeClick + end + end + end + end + object meErrorLog: TMemo + Left = 0 + Top = 223 + Width = 441 + Height = 52 + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ScrollBars = ssVertical + TabOrder = 2 + end + object Timer: TTimer + Enabled = False + OnTimer = TimerTimer + Left = 48 + Top = 80 + end + object MSDataSource: TDataSource + DataSet = MSQuery + Left = 48 + Top = 112 + end + object scDeleteAll: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'DELETE FROM ThreadTable') + Debug = True + CommandTimeout = 0 + Left = 116 + Top = 113 + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM ThreadTable') + Left = 16 + Top = 112 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/Threads.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/Threads.pas new file mode 100644 index 0000000..a2be42f --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/Threads.pas @@ -0,0 +1,382 @@ +unit Threads; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, Db, MemDS, DBCtrls, ActiveX, + Grids, DBGrids, DBAccess, MSAccess, SdacVcl, + Buttons, ThreadsData, DemoFrame; + +const + WM_ENDTHREAD = $500; + WM_EXCEPTTHREAD = $501; + WM_ENDEXECUTE = $502; + +type + TThreadsFrame = class(TDemoFrame) + Timer: TTimer; + MSDataSource: TDataSource; + scDeleteAll: TMSSQL; + Panel3: TPanel; + Splitter2: TSplitter; + Panel4: TPanel; + meSQL: TMemo; + meLog: TMemo; + DBGrid1: TDBGrid; + Panel2: TPanel; + Panel5: TPanel; + btStart: TSpeedButton; + btStop: TSpeedButton; + btRun: TSpeedButton; + btRunMax: TSpeedButton; + btClearLog: TSpeedButton; + Panel6: TPanel; + btOpen: TSpeedButton; + btDeleteAll: TSpeedButton; + DBNavigator1: TDBNavigator; + Panel11: TPanel; + Panel10: TPanel; + Label1: TLabel; + Label2: TLabel; + lbThreadCount: TLabel; + lbExceptCount: TLabel; + Panel12: TPanel; + lbInterval: TLabel; + lbTime: TLabel; + Label5: TLabel; + Label6: TLabel; + Panel13: TPanel; + Panel14: TPanel; + Label3: TLabel; + edCount: TEdit; + Panel9: TPanel; + Label4: TLabel; + rbInsert: TRadioButton; + rbSelect: TRadioButton; + meErrorLog: TMemo; + MSQuery: TMSQuery; + procedure btRunClick(Sender: TObject); + procedure TimerTimer(Sender: TObject); + procedure btStartClick(Sender: TObject); + procedure btStopClick(Sender: TObject); + procedure edCountChange(Sender: TObject); + procedure btRunMaxClick(Sender: TObject); + procedure btClearLogClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure rgModeClick(Sender: TObject); + procedure btDeleteAllClick(Sender: TObject); + procedure Button1Click(Sender: TObject); + + private + procedure WMEndExecute(var Msg: TMessage); message WM_ENDTHREAD; + procedure WMException(var Msg: TMessage); message WM_EXCEPTTHREAD; + + function RunThread(ObjectPtr: pointer; Method:pointer; EndMethod: pointer): THandle; + + procedure Execute; + procedure EndExecute(Result: boolean); + + procedure Log(St: string); + procedure ErrorLog(St: string); + + procedure TestConnected; + + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +uses +{$IFNDEF VER130}Variants,{$ENDIF} + SdacDemoForm; + +{$WRITEABLECONST ON} + +{$R *.dfm} + +const + MaxThread: integer = 40; + Interval: integer = 2000; + ExceptCount: integer = 0; + +var + ThreadCount: integer; + ThreadNum: integer; + hCountSec: TRTLCriticalSection; + hLogSec: TRTLCriticalSection; + BegTime: TDateTime; + +type + TMethod = procedure (Self: pointer); + TEndMethod = procedure (Self: pointer; Result: boolean); + + PMethodDesc = ^TMethodDesc; + TMethodDesc = record + ObjectPtr :pointer; + Method :pointer; + EndMethod :pointer; + hWindow :HWND; + end; + +procedure ThreadProc(MethodDesc: PMethodDesc); stdcall; +begin + try + TMethod(MethodDesc^.Method)(MethodDesc.ObjectPtr); + PostMessage(MethodDesc.hWindow, WM_ENDTHREAD, DWORD(MethodDesc), 0); + except + on E:Exception do begin + PostMessage(MethodDesc.hWindow, WM_EXCEPTTHREAD, DWORD(MethodDesc), + DWORD(E)); + ExitThread(0); + end; + end; +end; + +procedure TThreadsFrame.WMEndExecute(var Msg: TMessage); +begin + if PMethodDesc(Msg.wParam).EndMethod <> nil then + TEndMethod(PMethodDesc(Msg.wParam).EndMethod)(PMethodDesc(Msg.wParam).ObjectPtr, True); + Dispose(PMethodDesc(Msg.wParam)); +end; + +procedure TThreadsFrame.WMException(var Msg: TMessage); +begin + if PMethodDesc(Msg.wParam).EndMethod <> nil then + TEndMethod(PMethodDesc(Msg.wParam).EndMethod)(PMethodDesc(Msg.wParam).ObjectPtr, False); + Dispose(PMethodDesc(Msg.wParam)); + raise Exception(Msg.lParam); +end; + +function TThreadsFrame.RunThread(ObjectPtr: pointer; Method: pointer; EndMethod: pointer): THandle; +var + ThreadId: DWORD; + MethodDesc: PMethodDesc; +begin + New(MethodDesc); + + MethodDesc.ObjectPtr := ObjectPtr; + MethodDesc.Method := Method; + MethodDesc.EndMethod := EndMethod; + MethodDesc.hWindow := Handle; + + InterlockedIncrement(ThreadCount); + Result:= CreateThread(nil, 1000, @ThreadProc, MethodDesc, 0, ThreadId); +end; + +procedure TThreadsFrame.Log(St: string); +begin + EnterCriticalSection(hLogSec); + if meLog.Lines.Count > 1000 then + meLog.Lines.Clear; + meLog.Lines.Add(St); + LeaveCriticalSection(hLogSec); +end; + +procedure TThreadsFrame.ErrorLog(St:string); +begin + EnterCriticalSection(hLogSec); + meErrorLog.Lines.Add(St); + LeaveCriticalSection(hLogSec); +end; + +const + Delay = 1000; + +procedure TThreadsFrame.Execute; +var + Data: TdmThreadsData; + ThreadNum: integer; + i: integer; +begin + i := CoInitializeEx(nil, COINIT_APARTMENTTHREADED); + if i <> S_OK then + raise Exception.Create('err - ' + IntToStr(i)); + + EnterCriticalSection(hCountSec); + Inc(Threads.ThreadNum); + ThreadNum := Threads.ThreadNum; + lbThreadCount.Caption := IntToStr(ThreadCount); + LeaveCriticalSection(hCountSec); + + Data := TdmThreadsData.Create(nil); + try + try + with Data do begin + Log(IntToStr(ThreadNum) + ' Connecting...'); + MSConnection.Assign(SdacForm.MSConnection); + MSConnection.LoginPrompt := False; + MSConnection.Connect; + Log(IntToStr(ThreadNum) + ' Connected'); + + if rbInsert.Checked then begin + // INSERT + MSSQL.ParamByName('ID').AsInteger := Random(10000); + MSSQL.Execute; +// MSConnection.Commit; + Log(IntToStr(ThreadNum) + ' Executed'); + end + else begin + // SELECT + MSQuery.Open; + i := 0; + while not MSQuery.Eof do begin + MSQuery.Next; + Inc(i); + end; + Log(IntToStr(ThreadNum) + ' Fetched ' + IntToStr(i) + ' rows'); + MSQuery.Close; + end; + + MSConnection.Disconnect; + Log(IntToStr(ThreadNum) + ' Disconnected'); + end; + except + on E:Exception do begin + MessageBeep(1000); + Log(IntToStr(ThreadNum) + ' ' + IntToStr(ThreadCount) + ' Exception ' + E.Message); + ErrorLog(IntToStr(ThreadNum) + ' ' + IntToStr(ThreadCount) + ' Exception ' + E.Message); + Inc(ExceptCount); + lbExceptCount.Caption := IntToStr(ExceptCount); + end; + end; + finally + Data.Free; + CoUninitialize; + end; +end; + +procedure TThreadsFrame.EndExecute(Result: boolean); +begin + InterlockedDecrement(ThreadCount); + EnterCriticalSection(hCountSec); + lbThreadCount.Caption := IntToStr(ThreadCount); + MessageBeep(1000); + LeaveCriticalSection(hCountSec); +end; + +procedure TThreadsFrame.btRunClick(Sender: TObject); +begin + TestConnected; + RunThread(Self, @TThreadsFrame.Execute, @TThreadsFrame.EndExecute); +end; + +procedure TThreadsFrame.btRunMaxClick(Sender: TObject); +var + i: integer; +begin + TestConnected; + for i := 1 to MaxThread do + RunThread(Self, @TThreadsFrame.Execute, @TThreadsFrame.EndExecute); +end; + +procedure TThreadsFrame.btStartClick(Sender: TObject); +begin + TestConnected; + edCount.Text := IntToStr(MaxThread); + BegTime := Time; + TimerTimer(nil); +end; + +procedure TThreadsFrame.btStopClick(Sender: TObject); +begin + Timer.Enabled := False; +end; + +procedure TThreadsFrame.TimerTimer(Sender: TObject); +begin + if ThreadCount < MaxThread then begin + btRunClick(nil); + if ThreadCount < (MaxThread div 10) * 9 then + Dec(Interval, Interval div 10); + end + else + Inc(Interval, Interval div 10); + + lbInterval.Caption := IntToStr(Interval); + lbExceptCount.Caption := IntToStr(ExceptCount); + Timer.Interval := Random(Interval - 1) + 1; + lbTime.Caption := TimeToStr(Time - BegTime); + + lbInterval.Caption := lbInterval.Caption + ' / ' + IntToStr(Timer.Interval); + + Timer.Enabled := True; +end; + +procedure TThreadsFrame.edCountChange(Sender: TObject); +begin + MaxThread := StrToInt(edCount.Text); +end; + +procedure TThreadsFrame.btClearLogClick(Sender: TObject); +begin + meLog.Lines.Clear; + meErrorLog.Lines.Clear; + ThreadNum := 0; + ExceptCount := 0; + lbExceptCount.Caption := IntToStr(ExceptCount); +end; + +procedure TThreadsFrame.btOpenClick(Sender: TObject); +begin + MSQuery.Close; + MSQuery.Open; +end; + +procedure TThreadsFrame.rgModeClick(Sender: TObject); +begin + if rbInsert.Checked then + meSQL.Lines.Assign(dmThreadsData.MSSQL.SQL) + else + meSQL.Lines.Assign(dmThreadsData.MSQuery.SQL) +end; + +procedure TThreadsFrame.btDeleteAllClick(Sender: TObject); +begin + scDeleteAll.Execute; +// MSConnection.Commit; +end; + +procedure TThreadsFrame.Button1Click(Sender: TObject); +begin + Execute; +end; + +procedure TThreadsFrame.TestConnected; +begin + SdacForm.MSConnection.Connect; + if not SdacForm.MSConnection.Connected then + Abort; +end; + +// Demo management +procedure TThreadsFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + dmThreadsData := TdmThreadsData.Create(Self); + edCount.Text := IntToStr(MaxThread); + rbInsert.Checked := True; +end; + +procedure TThreadsFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug := Value; +end; + +initialization + + // We are using Windows threading (vs Delphi TThread), so we need to enable IsMultiThread + IsMultiThread := True; + + InitializeCriticalSection(hCountSec); + InitializeCriticalSection(hLogSec); + Randomize; +finalization + DeleteCriticalSection(hCountSec); + DeleteCriticalSection(hLogSec); +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/ThreadsData.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/ThreadsData.nfm new file mode 100644 index 0000000..4ba49f4 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/ThreadsData.nfm @@ -0,0 +1,36 @@ +object dmThreadsData: TdmThreadsData + OldCreateOrder = False + Left = 202 + Top = 164 + Height = 477 + Width = 739 + object MSConnection: TMSConnection + Database = 'SDACDemos' + Username = 'Sa' + LoginPrompt = False + Left = 24 + Top = 8 + end + object MSQuery: TMSQuery + Connection = MSConnection + SQL.Strings = ( + 'SELECT * FROM ThreadTable') + FetchRows = 1 + Left = 88 + Top = 8 + end + object MSSQL: TMSSQL + Connection = MSConnection + SQL.Strings = ( + 'INSERT INTO ThreadTable(ID, NAME)' + 'VALUES (:ID, '#39'Some name'#39')') + CommandTimeout = 0 + Left = 144 + Top = 8 + ParamData = < + item + DataType = ftUnknown + Name = 'ID' + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/ThreadsData.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/ThreadsData.pas new file mode 100644 index 0000000..ced5b17 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/Threads/ThreadsData.pas @@ -0,0 +1,33 @@ +unit ThreadsData; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Db, MemDS, MSAccess, DBAccess; + +type + TdmThreadsData = class(TDataModule) + MSConnection: TMSConnection; + MSQuery: TMSQuery; + MSSQL: TMSSQL; + private + { Private declarations } + public + { Public declarations } + end; + +var + dmThreadsData: TdmThreadsData; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/UpdateSQL/UpdateSQL.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/UpdateSQL/UpdateSQL.nfm new file mode 100644 index 0000000..ab3c1a3 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/UpdateSQL/UpdateSQL.nfm @@ -0,0 +1,362 @@ +inherited UpdateSQLFrame: TUpdateSQLFrame + Width = 443 + Height = 277 + Align = alClient + object Splitter1: TSplitter + Left = 0 + Top = 121 + Width = 443 + Height = 3 + Cursor = crVSplit + Align = alTop + Beveled = True + Color = clGreen + ParentColor = False + end + object Panel5: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 49 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 1 + Top = 1 + Width = 416 + Height = 47 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btPrepare: TSpeedButton + Left = 167 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Prepare' + Flat = True + Transparent = False + OnClick = btPrepareClick + end + object btUnPrepare: TSpeedButton + Left = 250 + Top = 1 + Width = 82 + Height = 22 + Caption = 'UnPrepare' + Flat = True + Transparent = False + OnClick = btUnPrepareClick + end + object btExecute: TSpeedButton + Left = 333 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Execute' + Flat = True + Transparent = False + OnClick = btExecuteClick + end + object Panel4: TPanel + Left = 1 + Top = 24 + Width = 414 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbDeleteObject: TCheckBox + Left = 13 + Top = 3 + Width = 91 + Height = 17 + Caption = 'DeleteObject' + Color = clBtnFace + ParentColor = False + TabOrder = 0 + OnClick = cbDeleteObjectClick + end + object cbInsertObject: TCheckBox + Left = 116 + Top = 3 + Width = 81 + Height = 17 + Caption = 'InsertObject' + Color = clBtnFace + ParentColor = False + TabOrder = 1 + OnClick = cbDeleteObjectClick + end + object cbModifyObject: TCheckBox + Left = 212 + Top = 3 + Width = 91 + Height = 17 + Caption = 'ModifyObject' + Color = clBtnFace + ParentColor = False + TabOrder = 2 + OnClick = cbDeleteObjectClick + end + object cbRefreshObject: TCheckBox + Left = 311 + Top = 3 + Width = 93 + Height = 17 + Caption = 'RefreshObject' + Color = clBtnFace + ParentColor = False + TabOrder = 3 + OnClick = cbDeleteObjectClick + end + end + end + end + object meSQL: TMemo + Left = 0 + Top = 49 + Width = 443 + Height = 72 + Align = alTop + Anchors = [] + Constraints.MinHeight = 50 + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + OnExit = meSQLExit + end + object Panel3: TPanel + Left = 0 + Top = 124 + Width = 443 + Height = 24 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Panel1: TPanel + Left = 1 + Top = 0 + Width = 315 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btRefreshRecord: TSpeedButton + Left = 232 + Top = 1 + Width = 82 + Height = 22 + Caption = 'RefreshRecord' + Flat = True + Transparent = False + OnClick = btRefreshRecordClick + end + object DBNavigator1: TDBNavigator + Left = 1 + Top = 1 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 148 + Width = 443 + Height = 129 + Align = alClient + DataSource = DataSource + TabOrder = 3 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object MSQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'SELECT * FROM Emp') + Debug = True + UpdateObject = MSUpdateSQL + Left = 18 + Top = 42 + end + object DataSource: TDataSource + DataSet = MSQuery + Left = 82 + Top = 42 + end + object MSUpdateSQL: TMSUpdateSQL + InsertSQL.Strings = ( + 'INSERT INTO Emp' + ' (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)' + 'VALUES' + ' (:ENAME, :JOB, :MGR, :HIREDATE, :SAL, :COMM, :DEPTNO)' + 'SET :EMPNO = SCOPE_IDENTITY()') + DeleteSQL.Strings = ( + 'DELETE FROM Emp' + 'WHERE' + ' EMPNO = :Old_EMPNO') + ModifySQL.Strings = ( + 'UPDATE Emp' + 'SET' + + ' ENAME = :ENAME, JOB = :JOB, MGR = :MGR, HIREDATE = :HIREDATE, ' + + 'SAL = :SAL, COMM = :COMM, DEPTNO = :DEPTNO' + 'WHERE' + ' EMPNO = :Old_EMPNO') + RefreshSQL.Strings = ( + + 'SELECT Emp.ENAME, Emp.JOB, Emp.MGR, Emp.HIREDATE, Emp.SAL, Emp.C' + + 'OMM, Emp.DEPTNO FROM Emp' + 'WHERE Emp.EMPNO = :EMPNO ') + Left = 50 + Top = 42 + end + object DeleteSQL: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'DELETE FROM Emp' + 'WHERE' + ' EMPNO = :Old_EMPNO') + CommandTimeout = 0 + Left = 120 + Top = 15 + ParamData = < + item + DataType = ftUnknown + Name = 'Old_EMPNO' + end> + end + object InsertSQL: TMSSQL + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'INSERT INTO Emp' + ' (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)' + 'VALUES' + ' (:ENAME, :JOB, :MGR, :HIREDATE, :SAL, :COMM, :DEPTNO)' + 'SET :EMPNO = SCOPE_IDENTITY()') + CommandTimeout = 0 + Left = 120 + Top = 45 + ParamData = < + item + DataType = ftUnknown + Name = 'ENAME' + end + item + DataType = ftUnknown + Name = 'JOB' + end + item + DataType = ftUnknown + Name = 'MGR' + end + item + DataType = ftUnknown + Name = 'HIREDATE' + end + item + DataType = ftUnknown + Name = 'SAL' + end + item + DataType = ftUnknown + Name = 'COMM' + end + item + DataType = ftUnknown + Name = 'DEPTNO' + end + item + DataType = ftUnknown + Name = 'EMPNO' + end> + end + object ModifyQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + 'UPDATE Emp' + 'SET' + + ' ENAME = :ENAME, JOB = :JOB, MGR = :MGR, HIREDATE = :HIREDATE, ' + + 'SAL = :SAL, COMM = :COMM, DEPTNO = :DEPTNO' + 'WHERE' + ' EMPNO = :Old_EMPNO') + Left = 120 + Top = 75 + ParamData = < + item + DataType = ftUnknown + Name = 'ENAME' + end + item + DataType = ftUnknown + Name = 'JOB' + end + item + DataType = ftUnknown + Name = 'MGR' + end + item + DataType = ftUnknown + Name = 'HIREDATE' + end + item + DataType = ftUnknown + Name = 'SAL' + end + item + DataType = ftUnknown + Name = 'COMM' + end + item + DataType = ftUnknown + Name = 'DEPTNO' + end + item + DataType = ftUnknown + Name = 'Old_EMPNO' + end> + end + object RefreshQuery: TMSQuery + Connection = SDACForm.MSConnection + SQL.Strings = ( + + 'SELECT Emp.ENAME, Emp.JOB, Emp.MGR, Emp.HIREDATE, Emp.SAL, Emp.C' + + 'OMM, Emp.DEPTNO FROM Emp' + 'WHERE Emp.EMPNO = :EMPNO ') + Left = 120 + Top = 110 + ParamData = < + item + DataType = ftUnknown + Name = 'EMPNO' + end> + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/UpdateSQL/UpdateSQL.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/UpdateSQL/UpdateSQL.pas new file mode 100644 index 0000000..6c90805 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/UpdateSQL/UpdateSQL.pas @@ -0,0 +1,191 @@ +unit UpdateSQL; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Db, Grids, DBGrids, StdCtrls, ToolWin, + ComCtrls, MemDS, DBAccess, MSAccess, SdacVcl, + Buttons, DemoFrame, SdacDemoForm; + +type + TUpdateSQLFrame = class(TDemoFrame) + MSQuery: TMSQuery; + DataSource: TDataSource; + MSUpdateSQL: TMSUpdateSQL; + Panel5: TPanel; + Panel2: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btPrepare: TSpeedButton; + btUnPrepare: TSpeedButton; + btExecute: TSpeedButton; + meSQL: TMemo; + Splitter1: TSplitter; + Panel3: TPanel; + Panel1: TPanel; + btRefreshRecord: TSpeedButton; + DBNavigator1: TDBNavigator; + DBGrid: TDBGrid; + DeleteSQL: TMSSQL; + InsertSQL: TMSSQL; + ModifyQuery: TMSQuery; + RefreshQuery: TMSQuery; + Panel4: TPanel; + cbDeleteObject: TCheckBox; + cbInsertObject: TCheckBox; + cbModifyObject: TCheckBox; + cbRefreshObject: TCheckBox; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btPrepareClick(Sender: TObject); + procedure btUnPrepareClick(Sender: TObject); + procedure btExecuteClick(Sender: TObject); + procedure meSQLExit(Sender: TObject); + procedure btRefreshRecordClick(Sender: TObject); + procedure cbDeleteObjectClick(Sender: TObject); + private + { Private declarations } + procedure ShowState; + procedure AssignProperties; + public + // Demo management + procedure Initialize; override; + procedure SetDebug(Value: boolean); override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} + +procedure TUpdateSQLFrame.ShowState; +var + St:string; + + procedure AddSt(S:string); + begin + if St <> '' then + St:= St + ', '; + St:= St + S; + end; + +begin + St:= ''; + + if MSQuery.Prepared then begin + AddSt('Prepared'); + + if MSQuery.IsQuery then + AddSt('IsQuery'); + end; + + if MSQuery.Active then + AddSt('Active') + else + AddSt('Inactive'); + + if MSQuery.Executing then + AddSt('Executing'); + + if MSQuery.Fetching then + AddSt('Fetching'); + + SdacForm.StatusBar.Panels[0].Text:= St; +end; + +procedure TUpdateSQLFrame.AssignProperties; +begin + if MSQuery.SQL.Text <> meSQL.Lines.Text then + MSQuery.SQL.Assign(meSQL.Lines); +end; + +procedure TUpdateSQLFrame.meSQLExit(Sender: TObject); +begin + if Trim(MSQuery.SQL.Text) <> Trim(meSQL.Lines.Text) then + MSQuery.SQL.Text:= meSQL.Lines.Text; + ShowState; +end; + +procedure TUpdateSQLFrame.btOpenClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Open; + finally + ShowState; + end; +end; + +procedure TUpdateSQLFrame.btCloseClick(Sender: TObject); +begin + MSQuery.Close; + ShowState; +end; + +procedure TUpdateSQLFrame.btPrepareClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Prepare; + finally + ShowState; + end; +end; + +procedure TUpdateSQLFrame.btUnPrepareClick(Sender: TObject); +begin + MSQuery.UnPrepare; + ShowState; +end; + +procedure TUpdateSQLFrame.btExecuteClick(Sender: TObject); +begin + try + AssignProperties; + MSQuery.Execute; + finally + ShowState; + end; +end; + +procedure TUpdateSQLFrame.btRefreshRecordClick(Sender: TObject); +begin + MSQuery.RefreshRecord; +end; + +// Demo management +procedure TUpdateSQLFrame.Initialize; +begin + inherited; + MSQuery.Connection := Connection as TMSConnection; + meSQL.Lines.Assign(MSQuery.SQL); + ShowState; +end; + +procedure TUpdateSQLFrame.SetDebug(Value: boolean); +begin + MSQuery.Debug:= Value; +end; + +procedure TUpdateSQLFrame.cbDeleteObjectClick(Sender: TObject); + function GetComponent(cbObject: TCheckBox; Component: TComponent): TComponent; + begin + if cbObject.Checked then + Result := Component + else + Result := nil; + end; +begin + MSUpdateSQL.DeleteObject := GetComponent(cbDeleteObject, DeleteSQL); + MSUpdateSQL.InsertObject := GetComponent(cbInsertObject, InsertSQL); + MSUpdateSQL.ModifyObject := GetComponent(cbModifyObject, ModifyQuery); + MSUpdateSQL.RefreshObject := GetComponent(cbRefreshObject, RefreshQuery); +end; + +end. + diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/VirtualTable/VTable.nfm b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/VirtualTable/VTable.nfm new file mode 100644 index 0000000..2447d79 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/VirtualTable/VTable.nfm @@ -0,0 +1,565 @@ +inherited VirtualTableFrame: TVirtualTableFrame + Width = 443 + Height = 267 + Align = alClient + object Splitter: TSplitter + Left = 0 + Top = 148 + Width = 443 + Height = 3 + Cursor = crVSplit + Align = alBottom + end + object DBGrid: TDBGrid + Left = 0 + Top = 117 + Width = 443 + Height = 31 + Align = alClient + DataSource = DataSource + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object DBMemo: TDBMemo + Left = 0 + Top = 151 + Width = 443 + Height = 116 + Align = alBottom + DataField = 'MEMO' + DataSource = DataSource + TabOrder = 1 + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 117 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Panel2: TPanel + Left = 1 + Top = 1 + Width = 405 + Height = 115 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Open' + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 102 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Close' + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btAutoFill: TSpeedButton + Left = 203 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Append 100' + Flat = True + Transparent = False + OnClick = btAutoFillClick + end + object btAddField: TSpeedButton + Left = 203 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Add field' + Flat = True + Transparent = False + OnClick = btAddFieldClick + end + object btDelField: TSpeedButton + Left = 304 + Top = 1 + Width = 100 + Height = 22 + Caption = 'Delete field' + Flat = True + Transparent = False + OnClick = btDelFieldClick + end + object btClear: TSpeedButton + Left = 304 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Clear' + Flat = True + Transparent = False + OnClick = btClearClick + end + object btSave: TSpeedButton + Left = 102 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Save...' + Flat = True + Transparent = False + OnClick = btSaveClick + end + object btLoad: TSpeedButton + Left = 1 + Top = 24 + Width = 100 + Height = 22 + Caption = 'Load...' + Flat = True + Transparent = False + OnClick = btLoadClick + end + object Panel4: TPanel + Left = 1 + Top = 47 + Width = 152 + Height = 33 + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 5 + Top = 10 + Width = 22 + Height = 13 + Caption = 'Field' + end + object edField: TEdit + Left = 35 + Top = 5 + Width = 111 + Height = 21 + TabOrder = 0 + Text = 'Number' + end + end + object Panel5: TPanel + Left = 1 + Top = 81 + Width = 403 + Height = 33 + BevelOuter = bvNone + TabOrder = 2 + object Label5: TLabel + Left = 5 + Top = 10 + Width = 22 + Height = 13 + Caption = 'Filter' + end + object cbFiltered: TCheckBox + Left = 325 + Top = 7 + Width = 64 + Height = 17 + Caption = 'Filtered' + TabOrder = 1 + OnClick = cbFilteredClick + end + object edFilter: TEdit + Left = 35 + Top = 5 + Width = 267 + Height = 21 + TabOrder = 0 + OnExit = edFilterExit + end + end + object Panel6: TPanel + Left = 154 + Top = 47 + Width = 250 + Height = 33 + BevelOuter = bvNone + TabOrder = 1 + object Label2: TLabel + Left = 5 + Top = 10 + Width = 27 + Height = 13 + Caption = 'Value' + end + object edValue: TEdit + Left = 37 + Top = 5 + Width = 111 + Height = 21 + TabOrder = 0 + Text = '7' + end + object Panel7: TPanel + Left = 158 + Top = 4 + Width = 87 + Height = 24 + BevelOuter = bvNone + Color = 9790720 + TabOrder = 1 + object btLocate: TSpeedButton + Left = 1 + Top = 1 + Width = 85 + Height = 22 + Caption = 'Locate' + Flat = True + Transparent = False + OnClick = btLocateClick + end + end + end + end + end + object OpenDialog: TOpenDialog + DefaultExt = 'xml' + FileName = 'Data1' + Filter = 'Virtual Table Data (*.xml;*.vtd)|*.xml;*.vtd|All Files (*.*)|*.*' + Left = 416 + Top = 34 + end + object SaveDialog: TSaveDialog + DefaultExt = 'xml' + FileName = 'Data1' + Filter = 'XML Virtual Table Data (*.xml)|*.xml|Binary Virtual Table Data (*.vtd)|*.vtd|All Files (*.*)|*.*' + Left = 448 + Top = 34 + end + object VirtualTable: TVirtualTable + Active = True + Filter = 'String LIKE '#39'%1%'#39 + FieldDefs = < + item + Name = 'NUMBER' + DataType = ftFloat + end + item + Name = 'STRING' + DataType = ftString + Size = 50 + end + item + Name = 'DATE' + DataType = ftDateTime + end + item + Name = 'MEMO' + DataType = ftMemo + end> + Left = 416 + Top = 2 + Data = { + 0300040006004E554D42455206000000000000000600535452494E4701003200 + 000000000400444154450B0000000000000004004D454D4F1000000000000000 + 00006400000008000000000000000000F03F2B00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202831 + 29080000000000C6BF58C8CC420E0000004D656D6F2076616C75652028312908 + 00000000000000000000402B00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283229080000000000 + C6BF58C8CC420E0000004D656D6F2076616C7565202832290800000000000000 + 000008402B00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E74732021212120283329080000000000C6BF58C8CC420E + 0000004D656D6F2076616C7565202833290800000000000000000010402B0000 + 0055736520436F7265204C616220446174612041636365737320436F6D706F6E + 656E74732021212120283429080000000000C6BF58C8CC420E0000004D656D6F + 2076616C7565202834290800000000000000000014402B00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 2120283529080000000000C6BF58C8CC420E0000004D656D6F2076616C756520 + 2835290800000000000000000018402B00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202836290800 + 00000000C6BF58C8CC420E0000004D656D6F2076616C75652028362908000000 + 0000000000001C402B00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E74732021212120283729080000000000C6BF58 + C8CC420E0000004D656D6F2076616C7565202837290800000000000000000020 + 402B00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E74732021212120283829080000000000C6BF58C8CC420E000000 + 4D656D6F2076616C7565202838290800000000000000000022402B0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 732021212120283929080000000000C6BF58C8CC420E0000004D656D6F207661 + 6C7565202839290800000000000000000024402C00000055736520436F726520 + 4C616220446174612041636365737320436F6D706F6E656E7473202121212028 + 313029080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202831 + 30290800000000000000000026402C00000055736520436F7265204C61622044 + 6174612041636365737320436F6D706F6E656E74732021212120283131290800 + 00000000C6BF58C8CC420F0000004D656D6F2076616C75652028313129080000 + 0000000000000028402C00000055736520436F7265204C616220446174612041 + 636365737320436F6D706F6E656E7473202121212028313229080000000000C6 + BF58C8CC420F0000004D656D6F2076616C756520283132290800000000000000 + 00002A402C00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E7473202121212028313329080000000000C6BF58C8CC42 + 0F0000004D656D6F2076616C75652028313329080000000000000000002C402C + 00000055736520436F7265204C616220446174612041636365737320436F6D70 + 6F6E656E7473202121212028313429080000000000C6BF58C8CC420F0000004D + 656D6F2076616C75652028313429080000000000000000002E402C0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 73202121212028313529080000000000C6BF58C8CC420F0000004D656D6F2076 + 616C756520283135290800000000000000000030402C00000055736520436F72 + 65204C616220446174612041636365737320436F6D706F6E656E747320212121 + 2028313629080000000000C6BF58C8CC420F0000004D656D6F2076616C756520 + 283136290800000000000000000031402C00000055736520436F7265204C6162 + 20446174612041636365737320436F6D706F6E656E7473202121212028313729 + 080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202831372908 + 00000000000000000032402C00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283138290800000000 + 00C6BF58C8CC420F0000004D656D6F2076616C75652028313829080000000000 + 0000000033402C00000055736520436F7265204C616220446174612041636365 + 737320436F6D706F6E656E7473202121212028313929080000000000C6BF58C8 + CC420F0000004D656D6F2076616C756520283139290800000000000000000034 + 402C00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E7473202121212028323029080000000000C6BF58C8CC420F0000 + 004D656D6F2076616C756520283230290800000000000000000035402C000000 + 55736520436F7265204C616220446174612041636365737320436F6D706F6E65 + 6E7473202121212028323129080000000000C6BF58C8CC420F0000004D656D6F + 2076616C756520283231290800000000000000000036402C0000005573652043 + 6F7265204C616220446174612041636365737320436F6D706F6E656E74732021 + 21212028323229080000000000C6BF58C8CC420F0000004D656D6F2076616C75 + 6520283232290800000000000000000037402C00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202832 + 3329080000000000C6BF58C8CC420F0000004D656D6F2076616C756520283233 + 290800000000000000000038402C00000055736520436F7265204C6162204461 + 74612041636365737320436F6D706F6E656E7473202121212028323429080000 + 000000C6BF58C8CC420F0000004D656D6F2076616C7565202832342908000000 + 00000000000039402C00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E7473202121212028323529080000000000C6BF + 58C8CC420F0000004D656D6F2076616C75652028323529080000000000000000 + 003A402C00000055736520436F7265204C616220446174612041636365737320 + 436F6D706F6E656E7473202121212028323629080000000000C6BF58C8CC420F + 0000004D656D6F2076616C75652028323629080000000000000000003B402C00 + 000055736520436F7265204C616220446174612041636365737320436F6D706F + 6E656E7473202121212028323729080000000000C6BF58C8CC420F0000004D65 + 6D6F2076616C75652028323729080000000000000000003C402C000000557365 + 20436F7265204C616220446174612041636365737320436F6D706F6E656E7473 + 202121212028323829080000000000C6BF58C8CC420F0000004D656D6F207661 + 6C75652028323829080000000000000000003D402C00000055736520436F7265 + 204C616220446174612041636365737320436F6D706F6E656E74732021212120 + 28323929080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028 + 323929080000000000000000003E402C00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202833302908 + 0000000000C6BF58C8CC420F0000004D656D6F2076616C756520283330290800 + 00000000000000003F402C00000055736520436F7265204C6162204461746120 + 41636365737320436F6D706F6E656E7473202121212028333129080000000000 + C6BF58C8CC420F0000004D656D6F2076616C7565202833312908000000000000 + 00000040402C00000055736520436F7265204C61622044617461204163636573 + 7320436F6D706F6E656E7473202121212028333229080000000000C6BF58C8CC + 420F0000004D656D6F2076616C75652028333229080000000000000000804040 + 2C00000055736520436F7265204C616220446174612041636365737320436F6D + 706F6E656E7473202121212028333329080000000000C6BF58C8CC420F000000 + 4D656D6F2076616C756520283333290800000000000000000041402C00000055 + 736520436F7265204C616220446174612041636365737320436F6D706F6E656E + 7473202121212028333429080000000000C6BF58C8CC420F0000004D656D6F20 + 76616C756520283334290800000000000000008041402C00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 212028333529080000000000C6BF58C8CC420F0000004D656D6F2076616C7565 + 20283335290800000000000000000042402C00000055736520436F7265204C61 + 6220446174612041636365737320436F6D706F6E656E74732021212120283336 + 29080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028333629 + 0800000000000000008042402C00000055736520436F7265204C616220446174 + 612041636365737320436F6D706F6E656E747320212121202833372908000000 + 0000C6BF58C8CC420F0000004D656D6F2076616C756520283337290800000000 + 000000000043402C00000055736520436F7265204C6162204461746120416363 + 65737320436F6D706F6E656E7473202121212028333829080000000000C6BF58 + C8CC420F0000004D656D6F2076616C7565202833382908000000000000000080 + 43402C00000055736520436F7265204C61622044617461204163636573732043 + 6F6D706F6E656E7473202121212028333929080000000000C6BF58C8CC420F00 + 00004D656D6F2076616C756520283339290800000000000000000044402C0000 + 0055736520436F7265204C616220446174612041636365737320436F6D706F6E + 656E7473202121212028343029080000000000C6BF58C8CC420F0000004D656D + 6F2076616C756520283430290800000000000000008044402C00000055736520 + 436F7265204C616220446174612041636365737320436F6D706F6E656E747320 + 2121212028343129080000000000C6BF58C8CC420F0000004D656D6F2076616C + 756520283431290800000000000000000045402C00000055736520436F726520 + 4C616220446174612041636365737320436F6D706F6E656E7473202121212028 + 343229080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202834 + 32290800000000000000008045402C00000055736520436F7265204C61622044 + 6174612041636365737320436F6D706F6E656E74732021212120283433290800 + 00000000C6BF58C8CC420F0000004D656D6F2076616C75652028343329080000 + 0000000000000046402C00000055736520436F7265204C616220446174612041 + 636365737320436F6D706F6E656E7473202121212028343429080000000000C6 + BF58C8CC420F0000004D656D6F2076616C756520283434290800000000000000 + 008046402C00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E7473202121212028343529080000000000C6BF58C8CC42 + 0F0000004D656D6F2076616C756520283435290800000000000000000047402C + 00000055736520436F7265204C616220446174612041636365737320436F6D70 + 6F6E656E7473202121212028343629080000000000C6BF58C8CC420F0000004D + 656D6F2076616C756520283436290800000000000000008047402C0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 73202121212028343729080000000000C6BF58C8CC420F0000004D656D6F2076 + 616C756520283437290800000000000000000048402C00000055736520436F72 + 65204C616220446174612041636365737320436F6D706F6E656E747320212121 + 2028343829080000000000C6BF58C8CC420F0000004D656D6F2076616C756520 + 283438290800000000000000008048402C00000055736520436F7265204C6162 + 20446174612041636365737320436F6D706F6E656E7473202121212028343929 + 080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202834392908 + 00000000000000000049402C00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283530290800000000 + 00C6BF58C8CC420F0000004D656D6F2076616C75652028353029080000000000 + 0000008049402C00000055736520436F7265204C616220446174612041636365 + 737320436F6D706F6E656E7473202121212028353129080000000000C6BF58C8 + CC420F0000004D656D6F2076616C75652028353129080000000000000000004A + 402C00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E7473202121212028353229080000000000C6BF58C8CC420F0000 + 004D656D6F2076616C75652028353229080000000000000000804A402C000000 + 55736520436F7265204C616220446174612041636365737320436F6D706F6E65 + 6E7473202121212028353329080000000000C6BF58C8CC420F0000004D656D6F + 2076616C75652028353329080000000000000000004B402C0000005573652043 + 6F7265204C616220446174612041636365737320436F6D706F6E656E74732021 + 21212028353429080000000000C6BF58C8CC420F0000004D656D6F2076616C75 + 652028353429080000000000000000804B402C00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202835 + 3529080000000000C6BF58C8CC420F0000004D656D6F2076616C756520283535 + 29080000000000000000004C402C00000055736520436F7265204C6162204461 + 74612041636365737320436F6D706F6E656E7473202121212028353629080000 + 000000C6BF58C8CC420F0000004D656D6F2076616C7565202835362908000000 + 0000000000804C402C00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E7473202121212028353729080000000000C6BF + 58C8CC420F0000004D656D6F2076616C75652028353729080000000000000000 + 004D402C00000055736520436F7265204C616220446174612041636365737320 + 436F6D706F6E656E7473202121212028353829080000000000C6BF58C8CC420F + 0000004D656D6F2076616C75652028353829080000000000000000804D402C00 + 000055736520436F7265204C616220446174612041636365737320436F6D706F + 6E656E7473202121212028353929080000000000C6BF58C8CC420F0000004D65 + 6D6F2076616C75652028353929080000000000000000004E402C000000557365 + 20436F7265204C616220446174612041636365737320436F6D706F6E656E7473 + 202121212028363029080000000000C6BF58C8CC420F0000004D656D6F207661 + 6C75652028363029080000000000000000804E402C00000055736520436F7265 + 204C616220446174612041636365737320436F6D706F6E656E74732021212120 + 28363129080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028 + 363129080000000000000000004F402C00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202836322908 + 0000000000C6BF58C8CC420F0000004D656D6F2076616C756520283632290800 + 00000000000000804F402C00000055736520436F7265204C6162204461746120 + 41636365737320436F6D706F6E656E7473202121212028363329080000000000 + C6BF58C8CC420F0000004D656D6F2076616C7565202836332908000000000000 + 00000050402C00000055736520436F7265204C61622044617461204163636573 + 7320436F6D706F6E656E7473202121212028363429080000000000C6BF58C8CC + 420F0000004D656D6F2076616C75652028363429080000000000000000405040 + 2C00000055736520436F7265204C616220446174612041636365737320436F6D + 706F6E656E7473202121212028363529080000000000C6BF58C8CC420F000000 + 4D656D6F2076616C756520283635290800000000000000008050402C00000055 + 736520436F7265204C616220446174612041636365737320436F6D706F6E656E + 7473202121212028363629080000000000C6BF58C8CC420F0000004D656D6F20 + 76616C75652028363629080000000000000000C050402C00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 212028363729080000000000C6BF58C8CC420F0000004D656D6F2076616C7565 + 20283637290800000000000000000051402C00000055736520436F7265204C61 + 6220446174612041636365737320436F6D706F6E656E74732021212120283638 + 29080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028363829 + 0800000000000000004051402C00000055736520436F7265204C616220446174 + 612041636365737320436F6D706F6E656E747320212121202836392908000000 + 0000C6BF58C8CC420F0000004D656D6F2076616C756520283639290800000000 + 000000008051402C00000055736520436F7265204C6162204461746120416363 + 65737320436F6D706F6E656E7473202121212028373029080000000000C6BF58 + C8CC420F0000004D656D6F2076616C75652028373029080000000000000000C0 + 51402C00000055736520436F7265204C61622044617461204163636573732043 + 6F6D706F6E656E7473202121212028373129080000000000C6BF58C8CC420F00 + 00004D656D6F2076616C756520283731290800000000000000000052402C0000 + 0055736520436F7265204C616220446174612041636365737320436F6D706F6E + 656E7473202121212028373229080000000000C6BF58C8CC420F0000004D656D + 6F2076616C756520283732290800000000000000004052402C00000055736520 + 436F7265204C616220446174612041636365737320436F6D706F6E656E747320 + 2121212028373329080000000000C6BF58C8CC420F0000004D656D6F2076616C + 756520283733290800000000000000008052402C00000055736520436F726520 + 4C616220446174612041636365737320436F6D706F6E656E7473202121212028 + 373429080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202837 + 3429080000000000000000C052402C00000055736520436F7265204C61622044 + 6174612041636365737320436F6D706F6E656E74732021212120283735290800 + 00000000C6BF58C8CC420F0000004D656D6F2076616C75652028373529080000 + 0000000000000053402C00000055736520436F7265204C616220446174612041 + 636365737320436F6D706F6E656E7473202121212028373629080000000000C6 + BF58C8CC420F0000004D656D6F2076616C756520283736290800000000000000 + 004053402C00000055736520436F7265204C6162204461746120416363657373 + 20436F6D706F6E656E7473202121212028373729080000000000C6BF58C8CC42 + 0F0000004D656D6F2076616C756520283737290800000000000000008053402C + 00000055736520436F7265204C616220446174612041636365737320436F6D70 + 6F6E656E7473202121212028373829080000000000C6BF58C8CC420F0000004D + 656D6F2076616C75652028373829080000000000000000C053402C0000005573 + 6520436F7265204C616220446174612041636365737320436F6D706F6E656E74 + 73202121212028373929080000000000C6BF58C8CC420F0000004D656D6F2076 + 616C756520283739290800000000000000000054402C00000055736520436F72 + 65204C616220446174612041636365737320436F6D706F6E656E747320212121 + 2028383029080000000000C6BF58C8CC420F0000004D656D6F2076616C756520 + 283830290800000000000000004054402C00000055736520436F7265204C6162 + 20446174612041636365737320436F6D706F6E656E7473202121212028383129 + 080000000000C6BF58C8CC420F0000004D656D6F2076616C7565202838312908 + 00000000000000008054402C00000055736520436F7265204C61622044617461 + 2041636365737320436F6D706F6E656E74732021212120283832290800000000 + 00C6BF58C8CC420F0000004D656D6F2076616C75652028383229080000000000 + 000000C054402C00000055736520436F7265204C616220446174612041636365 + 737320436F6D706F6E656E7473202121212028383329080000000000C6BF58C8 + CC420F0000004D656D6F2076616C756520283833290800000000000000000055 + 402C00000055736520436F7265204C616220446174612041636365737320436F + 6D706F6E656E7473202121212028383429080000000000C6BF58C8CC420F0000 + 004D656D6F2076616C756520283834290800000000000000004055402C000000 + 55736520436F7265204C616220446174612041636365737320436F6D706F6E65 + 6E7473202121212028383529080000000000C6BF58C8CC420F0000004D656D6F + 2076616C756520283835290800000000000000008055402C0000005573652043 + 6F7265204C616220446174612041636365737320436F6D706F6E656E74732021 + 21212028383629080000000000C6BF58C8CC420F0000004D656D6F2076616C75 + 652028383629080000000000000000C055402C00000055736520436F7265204C + 616220446174612041636365737320436F6D706F6E656E747320212121202838 + 3729080000000000C6BF58C8CC420F0000004D656D6F2076616C756520283837 + 290800000000000000000056402C00000055736520436F7265204C6162204461 + 74612041636365737320436F6D706F6E656E7473202121212028383829080000 + 000000C6BF58C8CC420F0000004D656D6F2076616C7565202838382908000000 + 00000000004056402C00000055736520436F7265204C61622044617461204163 + 6365737320436F6D706F6E656E7473202121212028383929080000000000C6BF + 58C8CC420F0000004D656D6F2076616C75652028383929080000000000000000 + 8056402C00000055736520436F7265204C616220446174612041636365737320 + 436F6D706F6E656E7473202121212028393029080000000000C6BF58C8CC420F + 0000004D656D6F2076616C75652028393029080000000000000000C056402C00 + 000055736520436F7265204C616220446174612041636365737320436F6D706F + 6E656E7473202121212028393129080000000000C6BF58C8CC420F0000004D65 + 6D6F2076616C756520283931290800000000000000000057402C000000557365 + 20436F7265204C616220446174612041636365737320436F6D706F6E656E7473 + 202121212028393229080000000000C6BF58C8CC420F0000004D656D6F207661 + 6C756520283932290800000000000000004057402C00000055736520436F7265 + 204C616220446174612041636365737320436F6D706F6E656E74732021212120 + 28393329080000000000C6BF58C8CC420F0000004D656D6F2076616C75652028 + 3933290800000000000000008057402C00000055736520436F7265204C616220 + 446174612041636365737320436F6D706F6E656E747320212121202839342908 + 0000000000C6BF58C8CC420F0000004D656D6F2076616C756520283934290800 + 00000000000000C057402C00000055736520436F7265204C6162204461746120 + 41636365737320436F6D706F6E656E7473202121212028393529080000000000 + C6BF58C8CC420F0000004D656D6F2076616C7565202839352908000000000000 + 00000058402C00000055736520436F7265204C61622044617461204163636573 + 7320436F6D706F6E656E7473202121212028393629080000000000C6BF58C8CC + 420F0000004D656D6F2076616C75652028393629080000000000000000405840 + 2C00000055736520436F7265204C616220446174612041636365737320436F6D + 706F6E656E7473202121212028393729080000000000C6BF58C8CC420F000000 + 4D656D6F2076616C756520283937290800000000000000008058402C00000055 + 736520436F7265204C616220446174612041636365737320436F6D706F6E656E + 7473202121212028393829080000000000C6BF58C8CC420F0000004D656D6F20 + 76616C75652028393829080000000000000000C058402C00000055736520436F + 7265204C616220446174612041636365737320436F6D706F6E656E7473202121 + 212028393929080000000000C6BF58C8CC420F0000004D656D6F2076616C7565 + 20283939290800000000000000000059402D00000055736520436F7265204C61 + 6220446174612041636365737320436F6D706F6E656E74732021212120283130 + 3029080000000000C6BF58C8CC42100000004D656D6F2076616C756520283130 + 3029} + end + object DataSource: TDataSource + DataSet = VirtualTable + OnStateChange = DataSourceStateChange + OnDataChange = DataSourceDataChange + Left = 448 + Top = 2 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/VirtualTable/VTable.pas b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/VirtualTable/VTable.pas new file mode 100644 index 0000000..3ebbefa --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/SdacDemo/VirtualTable/VTable.pas @@ -0,0 +1,201 @@ +unit VTable; + +interface + +uses + Classes, SysUtils, +{$IFNDEF LINUX} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, Buttons, + {$IFNDEF VER130}Variants,{$ENDIF} +{$ELSE} + QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QDBCtrls, QComCtrls, QExtCtrls, QGrids, QDBGrids, QButtons, +{$ENDIF} + DB, MemDS, VirtualTable, DemoFrame, DemoForm; + +type + TVirtualTableFrame = class(TDemoFrame) + DBGrid: TDBGrid; + DBMemo: TDBMemo; + Panel1: TPanel; + Splitter: TSplitter; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + VirtualTable: TVirtualTable; + DataSource: TDataSource; + Panel2: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + btAutoFill: TSpeedButton; + btAddField: TSpeedButton; + btDelField: TSpeedButton; + btClear: TSpeedButton; + btSave: TSpeedButton; + btLoad: TSpeedButton; + Panel4: TPanel; + edField: TEdit; + Label1: TLabel; + Panel5: TPanel; + cbFiltered: TCheckBox; + edFilter: TEdit; + Label5: TLabel; + Panel6: TPanel; + edValue: TEdit; + Label2: TLabel; + Panel7: TPanel; + btLocate: TSpeedButton; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btAutoFillClick(Sender: TObject); + procedure DataSourceDataChange(Sender: TObject; Field: TField); + procedure DataSourceStateChange(Sender: TObject); + procedure btAddFieldClick(Sender: TObject); + procedure btDelFieldClick(Sender: TObject); + procedure btLocateClick(Sender: TObject); + procedure edFilterExit(Sender: TObject); + procedure cbFilteredClick(Sender: TObject); + procedure btLoadClick(Sender: TObject); + procedure btSaveClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + private + { Private declarations } + FFieldNo: integer; + public + procedure Initialize; override; + end; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TVirtualTableFrame.btOpenClick(Sender: TObject); +begin + VirtualTable.Open; + if VirtualTable.Fields.Count > 0 then + edField.Text := VirtualTable.Fields[0].FieldName + else + edField.Text := ''; +end; + +procedure TVirtualTableFrame.btCloseClick(Sender: TObject); +begin + VirtualTable.Close; +end; + +procedure TVirtualTableFrame.btAutoFillClick(Sender: TObject); +var + i:integer; + Field:TField; +begin + Field:= VirtualTable.FindField('STRING1'); + for i:= 1 to 100 do + with VirtualTable do begin + Append; + FieldByName('NUMBER').AsInteger:= i; + FieldByName('STRING').AsString:= 'Use Core Lab Data Access Components !!! (' + IntToStr(i) + ')'; + FieldByName('DATE').AsDateTime:= Date; + FieldByName('MEMO').AsString:= 'Memo value (' + IntToStr(i) + ')'; + + if Field <> nil then + FieldByName('STRING1').AsString:= 'TVirtualTable'; + + Post; + end; +end; + +procedure TVirtualTableFrame.DataSourceStateChange(Sender: TObject); +begin + (Application.MainForm as TDemoForm).StatusBar.Panels[1].Text:= 'RecordCount:' + IntToStr(VirtualTable.RecordCount); + (Application.MainForm as TDemoForm).StatusBar.Panels[2].Text:= 'RecordNo:' + IntToStr(VirtualTable.RecNo); +end; + +procedure TVirtualTableFrame.DataSourceDataChange(Sender: TObject; Field: TField); +begin + DataSourceStateChange(nil); +end; + +procedure TVirtualTableFrame.btAddFieldClick(Sender: TObject); +begin + Inc(FFieldNo); + VirtualTable.AddField('STRING' + IntToStr(FFieldNo), ftString, 30); + btDelField.Enabled := True; +end; + +procedure TVirtualTableFrame.btDelFieldClick(Sender: TObject); +begin + if FFieldNo > 0 then begin + VirtualTable.DeleteField('STRING' + IntToStr(FFieldNo)); + Dec(FFieldNo); + end; + if FFieldNo = 0 then + btDelField.Enabled := False; +end; + +procedure TVirtualTableFrame.btLocateClick(Sender: TObject); +begin + VirtualTable.Locate(edField.Text, Variant(edValue.Text), []); +end; + +procedure TVirtualTableFrame.Initialize; +begin + inherited; + edFilter.Text:= VirtualTable.Filter; + cbFiltered.Checked:= VirtualTable.Filtered; + btDelField.Enabled := False; + FFieldNo := 0; + if (Application.MainForm as TDemoForm).GetIsXPMan then begin + Panel2.Color := clBtnFace; + Panel7.Color := clBtnFace; + end + else begin + Panel2.Color := (Application.MainForm as TDemoForm).ProductColor; + Panel7.Color := Panel2.Color; + end +end; + +procedure TVirtualTableFrame.edFilterExit(Sender: TObject); +begin + VirtualTable.Filter:= edFilter.Text; +end; + +procedure TVirtualTableFrame.cbFilteredClick(Sender: TObject); +begin + try + VirtualTable.Filtered := cbFiltered.Checked; + finally + cbFiltered.Checked := VirtualTable.Filtered; + end; +end; + +procedure TVirtualTableFrame.btLoadClick(Sender: TObject); +begin + OpenDialog.InitialDir := ExtractFilePath(Application.ExeName) + 'VirtualTable'; + if OpenDialog.Execute then + VirtualTable.LoadFromFile(OpenDialog.FileName); +end; + +procedure TVirtualTableFrame.btSaveClick(Sender: TObject); +begin + SaveDialog.InitialDir := ExtractFilePath(Application.ExeName) + 'VirtualTable'; + if SaveDialog.Execute then + if LowerCase(ExtractFileExt(SaveDialog.FileName)) = '.xml' then + VirtualTable.SaveToXML(SaveDialog.FileName) + else + VirtualTable.SaveToFile(SaveDialog.FileName) +end; + +procedure TVirtualTableFrame.btClearClick(Sender: TObject); +begin + VirtualTable.Clear; +end; + +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.bdsproj b/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.bdsproj new file mode 100644 index 0000000..91f1b01 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.bdsproj @@ -0,0 +1,183 @@ + + + + + + + + + + + + MSSQLCompact_VclNet.dpr + + + + + + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + + + + + + + + d:\windows\microsoft.net\framework\v1.1.4322 + d:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll + + + True + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + diff --git a/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.dpr b/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.dpr new file mode 100644 index 0000000..a602fe9 --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.dpr @@ -0,0 +1,15 @@ +program MSSQLCompact_VclNet; + +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\system.drawing.dll'} + +uses + Forms, + Main in 'Main.pas' {fmMain}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TfmMain, fmMain); + Application.Run; +end. diff --git a/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.res b/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/MSSQLCompact_VclNet.res new file mode 100644 index 0000000000000000000000000000000000000000..3adc0361f3a00f24e1a79ea56f342ee10caf9e11 GIT binary patch literal 876 zcmZuw!D`e{6g`;)j6~`bgm%{QM$1G2a#qggXHZrr3(XD^jD^2Biv0~ z`5QtvE@xN4((Ab|$vA?SIeGWIbMAeQ_vQh>j8N^t^q=@S8TF8!z-!a#!)P=;WilfU zi2%biYyKYEZ-dM zKwZ}&*MGS;WQdNBhq*@DYecWha+n~`@TMrv%R}#|n>L&5m1R-9_dKCKajtk*eq3?q z+&nGLeL-AH=6N|Z5XrYGk2*%a*ZaW*ww+5|n)-UgT;R&h_t*KCTgtnBJ=g+sHvAp+ z+!}7}yY$&&;5?G8)VW<5c-*wpNtz-V4CI-YMgtofPh>FEVh5Ut$OrG^q0>MPw068N zJm^aVuz;i`3FuBayES?}O0{e9=?hk?F~}AtM$GRDtStxv z!%JOmK$nm3c^Tv2mjT!@+^ylBIdNd%-^;M07nfIB>38k!LhU{U`s3weN)L#TxF9;> p8*!tmw@=Y;A8-r^Nba7rBEjN=&V@4{X~fY~haufkqYfIpyE(PjVu literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/Main.nfm b/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/Main.nfm new file mode 100644 index 0000000..0dca79a --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/Main.nfm @@ -0,0 +1,353 @@ +object fmMain: TfmMain + Left = 213 + Top = 374 + Width = 975 + Height = 417 + Caption = + 'MSSQL Data Access Demo - using Compact Edition of the MS SQL Ser' + + 'ver' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnClose = FormClose + OnCreate = FormCreate + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object DBGrid: TDBGrid + Left = 0 + Top = 49 + Width = 967 + Height = 315 + Align = alClient + DataSource = DataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object ToolBar: TPanel + Left = 0 + Top = 0 + Width = 967 + Height = 49 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 700 + Height = 47 + BevelOuter = bvNone + Color = clGreen + TabOrder = 0 + object btOpen: TSpeedButton + Left = 1 + Top = 24 + Width = 82 + Height = 22 + Caption = 'Open' + Enabled = False + Flat = True + Transparent = False + OnClick = btOpenClick + end + object btClose: TSpeedButton + Left = 84 + Top = 24 + Width = 82 + Height = 22 + Caption = 'Close' + Enabled = False + Flat = True + Transparent = False + OnClick = btCloseClick + end + object btDisconnect: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Disconnect' + Enabled = False + Flat = True + Transparent = False + OnClick = btDisconnectClick + end + object btConnect: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Connect' + Flat = True + Transparent = False + OnClick = btConnectClick + end + object DBNavigator: TDBNavigator + Left = 469 + Top = 24 + Width = 230 + Height = 22 + DataSource = DataSource + Flat = True + TabOrder = 0 + end + object Panel2: TPanel + Left = 167 + Top = 1 + Width = 532 + Height = 22 + BevelOuter = bvNone + TabOrder = 1 + object Label1: TLabel + Left = 6 + Top = 4 + Width = 78 + Height = 13 + Caption = 'Database name:' + end + object SpeedButton2: TSpeedButton + Left = 511 + Top = 0 + Width = 22 + Height = 22 + Caption = '...' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + Transparent = False + OnClick = SpeedButton2Click + end + object edDBName: TEdit + Left = 88 + Top = 1 + Width = 423 + Height = 21 + TabOrder = 0 + Text = '.\test.sdf' + end + end + object pnTableName: TPanel + Left = 167 + Top = 24 + Width = 301 + Height = 22 + BevelOuter = bvNone + TabOrder = 2 + object lbTableName: TLabel + Left = 6 + Top = 4 + Width = 59 + Height = 13 + Caption = 'Table name:' + Enabled = False + end + object cbTableName: TComboBox + Left = 88 + Top = 1 + Width = 211 + Height = 21 + Enabled = False + ItemHeight = 13 + TabOrder = 0 + OnDropDown = cbTableNameDropDown + end + end + end + object Panel3: TPanel + Left = 705 + Top = 0 + Width = 257 + Height = 24 + BevelOuter = bvNone + Color = clGreen + TabOrder = 1 + object btDrop: TSpeedButton + Left = 84 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Drop' + Flat = True + Transparent = False + OnClick = btDropClick + end + object btCreate: TSpeedButton + Left = 1 + Top = 1 + Width = 82 + Height = 22 + Caption = 'Create' + Flat = True + Transparent = False + OnClick = btCreateClick + end + object Panel4: TPanel + Left = 167 + Top = 1 + Width = 89 + Height = 22 + BevelOuter = bvNone + TabOrder = 0 + object cbDebug: TCheckBox + Left = 13 + Top = 3 + Width = 67 + Height = 17 + Caption = 'Debug' + Checked = True + State = cbChecked + TabOrder = 0 + OnClick = cbDebugClick + end + end + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 364 + Width = 967 + Height = 19 + Panels = < + item + Text = 'State' + Width = 50 + end> + SimplePanel = False + end + object DataSource: TDataSource + DataSet = MSTable + Left = 320 + Top = 144 + end + object MSTable: TMSTable + TableName = 'EMP' + Connection = MSConnection + Debug = True + Left = 288 + Top = 144 + end + object scCreate: TMSScript + SQL.Strings = ( + 'CREATE TABLE EMP (' + ' EMPNO INT PRIMARY KEY,' + ' ENAME NVARCHAR(10),' + ' JOB NVARCHAR(9),' + ' MGR INT,' + ' HIREDATE DATETIME,' + ' SAL FLOAT,' + ' COMM FLOAT' + ');' + '' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7492, '#39'SMITH'#39','#39'CLERK'#39',7902,'#39'1980-12-17'#39',800,600);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7499,'#39'ALLEN'#39','#39'SALESMAN'#39',7698,'#39'1981-2-20'#39',1600,300);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7521,'#39'WARD'#39','#39'SALESMAN'#39',7698,'#39'1981-2-22'#39',1250,500);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7566,'#39'JONES'#39','#39'MANAGER'#39',7839,'#39'1981-4-2'#39',2975,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7654,'#39'MARTIN'#39','#39'SALESMAN'#39',7698,'#39'1981-9-28'#39',1250,1400);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7698,'#39'BLAKE'#39','#39'MANAGER'#39',7839,'#39'1981-5-1'#39',2850,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7782,'#39'CLARK'#39','#39'MANAGER'#39',7839,'#39'1981-6-9'#39',2450,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7788,'#39'SCOTT'#39','#39'ANALYST'#39',7566,'#39'1987-7-13'#39',3000,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7839,'#39'KING'#39','#39'PRESIDENT'#39',NULL,'#39'1981-11-17'#39',5000,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7844,'#39'TURNER'#39','#39'SALESMAN'#39',7698,'#39'1981-9-8'#39',1500,0);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7876,'#39'ADAMS'#39','#39'CLERK'#39',7788,'#39'1987-7-13'#39',1100,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7900,'#39'JAMES'#39','#39'CLERK'#39',7698,'#39'1981-12-3'#39',950,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7902,'#39'FORD'#39','#39'ANALYST'#39',7566,'#39'1981-12-3'#39',3000,NULL);' + '' + 'INSERT INTO EMP' + ' (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)' + 'VALUES ' + ' (7934,'#39'MILLER'#39','#39'CLERK'#39',7782,'#39'1982-1-23'#39',1300,NULL);') + Debug = True + OnError = scError + Connection = MSConnection + Left = 735 + Top = 59 + end + object OpenDialog: TOpenDialog + Filter = 'MS SQL Database Files (*.sdf)|*.sdf|All Files|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofEnableSizing] + Left = 130 + Top = 145 + end + object MSConnection: TMSConnection + Options.Provider = prCompact + AfterConnect = MSConnectionAfterConnect + AfterDisconnect = MSConnectionAfterDisconnect + Left = 210 + Top = 145 + end + object scDrop: TMSScript + SQL.Strings = ( + 'DROP TABLE EMP;') + Debug = True + OnError = scError + Connection = MSConnection + Left = 805 + Top = 59 + end +end diff --git a/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/Main.pas b/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/Main.pas new file mode 100644 index 0000000..bb239af --- /dev/null +++ b/internal/4.10.0.10/1/Demos/dotNet/TechnologySpecific/MSSQLCompact/Main.pas @@ -0,0 +1,268 @@ +unit Main; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, + DBAccess, DAScript, Buttons, MSAccess, MSScript, OLEDBAccess, DB, MemDS, SDACVcl; + +type + TfmMain = class(TForm) + DBGrid: TDBGrid; + DataSource: TDataSource; + ToolBar: TPanel; + StatusBar: TStatusBar; + MSTable: TMSTable; + scCreate: TMSScript; + Panel1: TPanel; + btOpen: TSpeedButton; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; + OpenDialog: TOpenDialog; + MSConnection: TMSConnection; + btDisconnect: TSpeedButton; + btConnect: TSpeedButton; + Panel2: TPanel; + edDBName: TEdit; + Label1: TLabel; + pnTableName: TPanel; + lbTableName: TLabel; + cbTableName: TComboBox; + SpeedButton2: TSpeedButton; + Panel3: TPanel; + Panel4: TPanel; + btDrop: TSpeedButton; + btCreate: TSpeedButton; + cbDebug: TCheckBox; + scDrop: TMSScript; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure MSConnectionAfterConnect(Sender: TObject); + procedure MSConnectionAfterDisconnect(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure SpeedButton2Click(Sender: TObject); + procedure btDisconnectClick(Sender: TObject); + procedure btCreateClick(Sender: TObject); + procedure btDropClick(Sender: TObject); + procedure cbDebugClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure cbTableNameDropDown(Sender: TObject); + procedure scError(Sender: TObject; E: Exception; SQL: String; + var Action: TErrorAction); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + private + Closing: boolean; + procedure ShowState; + procedure CheckConnected; + public + { Public declarations } + end; + +var + fmMain: TfmMain; + +implementation + +{$IFDEF CLR} +{$R *.nfm} +{$ENDIF} +{$IFDEF WIN32} +{$R *.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFNDEF VER130} +{$IFNDEF VER140} +{$IFNDEF CLR} + {$DEFINE XPMAN} + {$R WindowsXP.res} +{$ENDIF} +{$ENDIF} +{$ENDIF} + +{$IFDEF XPMAN} +uses + UxTheme; +{$ENDIF} + +procedure TfmMain.ShowState; +var + St:string; + + procedure AddSt(S:string); + begin + if St <> '' then + St:= St + ', '; + St:= St + S; + end; + +begin + St:= ''; + + if MSTable.Active then + AddSt('Active') + else + AddSt('Inactive'); + + StatusBar.Panels[0].Text:= St; +end; + +procedure TfmMain.CheckConnected; +begin + try + MSConnection.Database := edDBName.Text; + + if not FileExists(MSConnection.Database) then + if MessageDlg('Database file ' + MSConnection.Database + ' does not exists.' + + #13#10+'Create database with this name?', mtConfirmation, [mbYes,mbNo,mbCancel], 0) <> mrYes then + Exit; + + MSConnection.Open; // database file will be created automatically if it does not exist + finally + ShowState; + end; +end; + +procedure TfmMain.btOpenClick(Sender: TObject); +begin + try + MSTable.TableName := cbTableName.Text; + MSTable.Open; + finally + ShowState; + end; +end; + +procedure TfmMain.btCloseClick(Sender: TObject); +begin + MSTable.Close; + ShowState; +end; + +procedure TfmMain.FormShow(Sender: TObject); +begin + ShowState; +end; + +procedure TfmMain.MSConnectionAfterConnect(Sender: TObject); +begin + btConnect.Enabled := False; + btDisconnect.Enabled := True; + cbTableName.Enabled := True; + lbTableName.Enabled := True; + btOpen.Enabled := True; + btClose.Enabled := True; + MSConnection.GetTableNames(cbTableName.Items); + + if cbTableName.Items.Count > 0 then + cbTableName.ItemIndex := 0; +end; + +procedure TfmMain.MSConnectionAfterDisconnect(Sender: TObject); +begin + if Closing then // to prevent AV on form close + Exit; + + btConnect.Enabled := True; + btDisconnect.Enabled := False; + cbTableName.Enabled := False; + lbTableName.Enabled := False; + btOpen.Enabled := False; + btClose.Enabled := False; +end; + +procedure TfmMain.btConnectClick(Sender: TObject); +begin + CheckConnected; +end; + +procedure TfmMain.SpeedButton2Click(Sender: TObject); +begin + if OpenDialog.Execute then + edDBName.Text := OpenDialog.FileName; +end; + +procedure TfmMain.btDisconnectClick(Sender: TObject); +begin + MSConnection.Close; +end; + +procedure TfmMain.btCreateClick(Sender: TObject); +begin + CheckConnected; + scCreate.Execute; +end; + +procedure TfmMain.btDropClick(Sender: TObject); +begin + CheckConnected; + scDrop.Execute; +end; + +procedure TfmMain.cbDebugClick(Sender: TObject); +begin + MSTable.Debug := cbDebug.Checked; + scCreate.Debug := cbDebug.Checked; + scDrop.Debug := cbDebug.Checked; +end; + +procedure TfmMain.FormCreate(Sender: TObject); +{$IFDEF XPMAN} + procedure UpdateStyle(Control: TWinControl); + var + Panel: TPanel; + i: integer; + begin + for i := 0 to Control.ControlCount - 1 do begin + if Control.Controls[i] is TSpeedButton then + TSpeedButton(Control.Controls[i]).Flat := False + else + if Control.Controls[i] is TDBNavigator then + TDBNavigator(Control.Controls[i]).Flat := False; + if Control.Controls[i] is TWinControl then begin + if (Control.Controls[i] is TPanel) then begin + Panel := TPanel(Control.Controls[i]); + Panel.ParentBackground := False; + Panel.Color := clBtnFace; + end; + UpdateStyle(TWinControl(Control.Controls[i])); + end; + end; + end; +{$ENDIF} +begin + cbDebugClick(self); + Closing := False; +{$IFDEF XPMAN} + if UseThemes then + UpdateStyle(Self); +{$ENDIF} +end; + +procedure TfmMain.cbTableNameDropDown(Sender: TObject); +begin + MSConnection.GetTableNames(cbTableName.Items); +end; + +procedure TfmMain.scError(Sender: TObject; E: Exception; SQL: String; + var Action: TErrorAction); +begin + if MessageDlg('An error with the following message ocurred:' + #13#10 + + E.Message , mtError, [mbAbort,mbIgnore], 0) = mrAbort then + Action := eaAbort + else + Action := eaContinue; + +end; + +procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction); +begin + Closing := True; +end; + +end. + diff --git a/internal/4.10.0.10/1/FAQ.html b/internal/4.10.0.10/1/FAQ.html new file mode 100644 index 0000000..c05b096 --- /dev/null +++ b/internal/4.10.0.10/1/FAQ.html @@ -0,0 +1,689 @@ + + + + Frequently Asked Questions + + + + + + + + + + +
+ + + + + + + + + +
SQL Server Data Access Componentssdac@crlab.com
Frequently Asked Questions 
+
+
+ + + +

+This page contains a list of Frequently Asked Questions for SQL Server Data Access Components. +

+

+If you have encounter a question with using SDAC, please browse through this list first. +If this page does not answer your question, refer to the Getting Support topic in SDAC help. +

+ +
+
+

 

+ +Installation and Deployment +
    +
  1. + I am having a problem installing SDAC or compiling SDAC-based projects...
    + +

    + You may be having a compatibility issue that shows up in one or more of the following forms:

    +

      +
    • Get a "Setup has detected already installed DAC packages which are incompatible with current version" message during SDAC installation. +
    • Get a "Procedure entry point ... not found in ... " message when starting IDE. +
    • Get a "Unit ... was compiled with a different version of ..." message on compilation. +
    +

    + You can have such problems if you installed incompatible SDAC, ODAC, MyDAC or IBDAC versions. All these products use common base packages. The easiest way to avoid the problem is to uninstall all installed DAC products and then download from our site and install the last builds.

    +
  2. + +
  3. + What software should be installed on the client computer so that my applications + that use SDAC can run?
    + SDAC requires OLE DB installed on the workstation. In current versions of Microsoft Windows, + such as Windows 2000, OLE DB is already included as part of the standard installation. But it is highly + recommended to download the latest version (newer than 2.5) of Microsoft + Data Access Components (MDAC). +
  4. +
+ +Licensing and Subscriptions +
    +
  1. + Am I entitled to distribute applications written with SDAC?
    +

    If you have purchased a full version of SDAC, you are entitled to distribute pre-compiled programs created with its use. You are not entitled to propagate any components inherited from SDAC or using SDAC source code. For more information see the License.rtf file in your SDAC installation directory.

    +
  2. + +
  3. + Can I create components using SDAC?
    + +

    You can create your own components that are inherited from SDAC or that use the SDAC source code. You are entitled to sell and distribute compiled application executables that use such components, but not their source code and not the components themselves.

    +
    +
  4. + + + +
  5. + What licensing changes can I expect with SDAC 4.00?
    + +

    The basic SDAC license agreement will remain the same. With SDAC 4.00, the SDAC Edition Matrix will be reorganized and a new SDAC Subscription Program will be introduced.

    +
    +
  6. +
  7. + What do the SDAC 4.00 Edition Levels correspond to?
    + +

    SDAC 4.00 will come in four editions: Trial, Standard, Professional, and Professional with Sources.

    +

    When you upgrade to the new version, your edition level will be automatically updated using the following Edition Correspondence Table.


    +
    + Edition Correspondence Table for Upgrading to SDAC 4.00 + + + + + + +
    Old Edition LevelNew Edition Level
    - No Correspondence -SDAC Standard Edition
    SDAC Standard EditionSDAC Professional Edition
    SDAC Professional EditionSDAC Professional Edition with Sources
    SDAC Trial Edition SDAC Trial Edition

    +

    + The feature list for each edition can be found in the SDAC documentation and on the SDAC website.

    +
    +
  8. + + +
  9. + I have a registered version of SDAC. Will I need to pay to upgrade to future versions?
    + +

    After SDAC 4.00, all upgrades to future versions are free to users with an active SDAC Subscription.

    +

    Users that have a registration for versions of SDAC prior to SDAC 4.00 will have to first upgrade to SDAC 4.00 to jump in on the Subscription program.

    +
    +
  10. + +
  11. + What are the benefits of the SDAC Subscription program?
    + +

    The SDAC Subscription Program is an annual maintenance and support service + for SDAC users.

    +

    Users with a valid SDAC Subscription get the following benefits:

    +
      +
    • Access to new versions of SDAC when they are released +
    • Access to all SDAC updates and bug fixes +
    • Product support through the SDAC Priority Support program +
    • Notification of new product versions +
    +

    Priority Support is an advanced product support program which offers you expedited individual assistance with SDAC-related questions from the SDAC developers themselves. Priority Support is carried out over email and has a two business day response policy.

    + + +

    The SDAC Subscription Program is available for registered users of SDAC 4.00 and higher.

    +
    +
  12. + + + +
  13. + Can I use my version of SDAC after my Subscription expires?
    + +

    Yes, you can. SDAC version licenses are perpetual.

    +
    +
  14. + + + +
  15. + I want a SDAC Subscription! How can I get one?
    + +

    An annual SDAC Subscription is included when ordering or upgrading to any registered (non-Trial) edition of SDAC 4.00 or higher.

    +

    You can renew your SDAC Subscription on the SDAC Ordering Page. For more information, please contact sales@crlab.com.

    +
    +
  16. + +
  17. + Does this mean that if I upgrade to SDAC 4 from SDAC 3, I'll get an annual SDAC Subscription for free?
    + + Yes. + +
  18. + + +
  19. + How do I upgrade to SDAC 4.00?
    + +

    To upgrade to SDAC 4.00, you can get a Version Update from the SDAC Ordering Page. For more information, please contact sales@crlab.com.

    +
    +
  20. +
+ +Performance +
    +
  1. + How productive is SDAC?
    +

    SDAC uses the lowest documented protocol level (OLE DB) to access + the database server. This allows SDAC to achieve high performance. From time to time + we compare SDAC with other products, and SDAC always takes first place.

    +
  2. + +
  3. + Why does the Locate function work so slowly the first time I use it?
    +

    Locate is performed on the client. So if you had set FetchAll to False when opening + your dataset, cached only some of the rows on the client, and then invoked Locate, SDAC will have to + fetch all the remaining rows from the server before performing the operation. On subsequent calls, + Locate should work much faster.

    +

    If the Locate method keeps working slowly on subsequent calls or you are working with FetchAll=True, + try the following. Perform local sorting by a field that is used in the Locate method. Just assign + corresponding field name to the IndexFieldNames property.

    +
  4. + +
+ +How To +
    +
  1. + How can I enable syntax highlighting in SDAC component editors at design time?
    +

    To enable syntax highlighting for SDAC, you should download and install the freeware SynEdit component set.

    +
    +
  2. + +
  3. + How can I determine which version of SDAC am I using?
    +

    You can determine your SDAC version number in several ways: +

      +
    • During installation of SDAC, consult the SDAC Installer screen. +
    • After installation, see the history.html file in your SDAC installation directiory. +
    • At design-time, select SQL Server | About SDAC from the main menu of your IDE. +
    • At run-time, check the value of the SdacVersion and DACVersion constants. +

    +
    +
  4. + +
  5. + How can I stop the cursor from changing to an hour glass during query execution?
    +

    Just set the DBAccess.ChangeCursor variable to False anywhere in your program. + The cursor will stop changing after this command is executed.

    +
  6. + +
  7. + How can I execute a query saved in the SQLInsert, SQLUpdate, + SQLDelete, or SQLRefresh properties of a SDAC dataset?
    +

    The values of these properties are templates for query statements, + and they cannot be manually executed. Usually there is no need to fill these properties + because the text of the query is generated automatically.

    + +

    In special cases, you can set these properties to perform more complicated processing + during a query. These properties are automatically processed by SDAC during the execution + of the Post, Delete, or RefreshRecord methods, and are used to construct the query to + the server. Their values can contain parameters with names of fields in the underlying + data source, which will be later replaced by appropriate data values.

    + +

    For example, you can use the SQLInsert template to insert a row into a query instance as follows.

    +
      +
    1. Fill the SQLInsert property with the parametrized query template you want to use. +
    2. Call Insert. +
    3. Initialize field values of the row to insert. +
    4. Call Post. +
    + +

    The value of the SQLInsert property will then be used by SDAC to perform the last step.

    + +

    Setting these properties is optional and allows you to automatically execute additional + SQL statements, add calls to stored procedures and functions, check input parameters, and/or + store comments during query execution. If these properties are not set, the SDAC dataset + object will generate the query itself using the appropriate insert, update, delete, or + refresh record syntax.

    +
    +
  8. + +
  9. + How can I get a list of the databases on the server?
    +

    Use the TCustomDAConnection.GetDatabaseNames method.

    +
  10. + +
  11. + How can I get a list of the tables list in a database?
    + Use the TCustomDAConnection.GetTableNames method. +
  12. + + +
  13. + Some questions about the visual part of SDAC
    +

    + The following questions usually arise from the same problem: +

      +
    • I set the Debug property to True but nothing happens! +
    • While executing a query, the screen cursor does not change to an hour-glass. +
    • Even if I have LoginPromp set to True, the connect dialog does not appear. +
    + To fix this problem, you should add the SdacVcl unit to the uses clause of your + project.

    +
  14. +
+ +General Questions +
    +
  1. + I would like to develop an application that works with SQL Server. Should I use SDAC or DbxSda?
    +

    DbxSda is our dbExpress driver for SQL Server. + dbExpress technology serves for providing a more or less uniform way to access different servers + (SQL Server, MySQL, Oracle and so on). It is based on drivers that include server-specific features. + Like any universal tool, in many specialized cases dbExpress providers lose some functionality. + For example, the dbExpress design-time is quite poor and cannot be expanded.

    +

    SDAC is a specialized set of components for SQL Server, which has advanced server-specific design-time + and a component interface similar to that of BDE.

    +

    We tried to include maximal support of SQL Server-specific features in both DbxSda and SDAC. However, + the nature of dbExpress technology has some insurmountable restrictions. For example, Unicode fields + cannot be passed from a driver to dbExpress.

    +

    SDAC and DbxSda use the same kernel and thus have similar performance. In some cases dbExpress is + slower because data undergoes additional conversion to correspond to dbExpress standards.

    +

    To summarise, if it is important for you to be able to quickly adapt your application to a database + server other than SQL Server, it is probably better to use DbxSda. In other cases, especially when migrating + from BDE or ADO, you should use SDAC. +

  2. + +
  3. + What are the advantages of SDAC over Delphi ADO components for accessing SQL Server?
    + ADO is a universal components while SDAC is specialized in SQL Server, + so SDAC takes into account lots of server specific features. SDAC has great benefit in performance + (5-10 times in different tests) because it works directly through OLE DB, which is a native SQL Server + interface. Moreover, SDAC provides advanced design-time editors. +
  4. + +
  5. + On connect, I get an "OLE DB error occured. Code 800401F0h. CoInitialize has + not been called" error. What can I do?
    + As SDAC uses OLE DB, it is necessary to + initialize OLE by calling CoInitialize before a new connection is established. Usually VCL does this automatically. SDAC does not call to the CoInitialize and CoUninitialize functions itself, as this may cause unexpected + problems if OLE is used in the program by someone else. +
  6. + +
  7. + Are the SDAC connection components thread-safe?
    +

    Yes, SDAC is thread-safe but there is a restriction. But the same TCustomMSConnection object descendant cannot be used in several threads. So if you have a multithreaded application, you should have a TCustomMSConnection object descendant for each thread that uses SDAC.

    +
  8. + +
  9. + When editing a DataSet, I get an exception with the message 'Update failed. + Found %d records.' or 'Refresh failed. Found %d records.' +
    +

    This error occurs when the database server is unable to determine which record + to modify or delete. In other words, there are either more than one record or no records that suit + the UPDATE criteria. Such situation can happen when you omit the unique field in a SELECT statement + (TCustomDADataSet.SQL) or when another user modifies the table simultaneously. This exception can + be suppressed. Refer to TCustomDADataSet.Options topic in SDAC help for more information.

    +
    +
  10. + +
  11. + + Some questions with using TCustomDADataSet.FetchAll=False mode
    + + Common issues when using FetchAll=False: +
      +
    • I have problems working with temporary tables. +
    • I have problems working with transactions. +
    • Sometimes my application hangs on applying changes to database. +
    +

    Usage of FetchAll=False mode has many advantages; however, it also has some restrictions + since it requires an additional connection to server to be created for data fetching. The + additional connection is created to prevent the main connection from blocking.

    + +

    These problems can be avoided by setting the FetchAll property to True. Please see description of the + FetchAll propery and the CreateConnection option in SDAC help for more information.

    + +

    One more way to solve these problems is to use the Multiple Active Result Sets (MARS) feature. + This feature lets you keep more than one unfetched record set within a single connection. + To enable MARS, set the MultipleActiveResultSets option of TMSConnection to True. + Note: To use MARS, you will need to have SQL Server 2005 and SQL Native Client installed.

    +
  12. +
+ + + +

 

 


+

© 2002-2007 Core Lab. All rights reserved.

+ +
+ + + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/History.html b/internal/4.10.0.10/1/History.html new file mode 100644 index 0000000..4638da9 --- /dev/null +++ b/internal/4.10.0.10/1/History.html @@ -0,0 +1,877 @@ + + + + SQL Server Data Access Components + + + + + + + + + + +
+ + + + + + + + + +
SQL Server Data Access Componentssdac@crlab.com
History 
+
+ +
+ +

4.10.0.10 02.08.07

+
    +
  • Added the XML data type to the parameters list in design-time parameters editor +
  • Fixed bug with PSGetDefaultOrder method freezing for queries with complicated ORDER BY clauses +
  • Fixed bug in TCRBatchMove with mapping fields by name when Fields count and FieldDefs count are not equal +
  • Fixed bug with adding fields in TVirtualTable +
  • Fixed bug with Pooling and Local Failover +
  • Fixed bug with "Invalid Variant Type" exception under Windows 2000 when TDataSet.Refresh is called +
  • Fixed bug with performance penalty when processing lookup and calculated fields +
  • Problem with DBMonitor integration under Windows Vista Ultimate fixed +
  • Bug with field names quotation in CRDBGrid fixed +
  • Fixed bug with freezing in NonBlocking mode +
  • Fixed bug with setting wrong parameter types for queries provided to SQLInsert, SQLUpdate, SQLDelete, SQLRefresh +
  • Fixed bug with performance penalty when processing lookup and calculated fields +
  • Fixed bug with setting the CanModify flag for computed fields +
  • Fixed bug with ReturnParams option and parameter types in Update SQLs +
  • Fixed bug with the RereshQuick method for queries with the WHERE clause +
  • Fixed bug with setting the Hidden flag for FieldDescs with SQL Server Compact Edition and Windows Vista +
  • Fixed bug in TMSStoredProc with Local Failover and Disconnected Model +
  • Fixed bug compound field names quotation +
  • Changed ancestor of TMSXMLField from TMemoField to TField due to Delphi field types limitation +
+ +

4.10.0.9 12.06.07

+
    +
  • C++Builder 2007 supported +
  • TMSConnection.Options.FailoverPartner property added +
  • Added ability to customize information view about fields in DataSetManager +
  • Replacement of the TwwDataSource with TMSDataSource in the BDE/ADO Migration Wizard added +
  • Performance of some operations in DataSet Manager improved +
  • Bug with the BaseSQL property set to an empty string after assigning macro values fixed +
  • Bug with incorrect registry key used by connect dialog to save/load the Server value fixed +
  • Bug with refreshing records in detail dataset fixed +
  • Fixed bug with lookup and data fields with the same name +
  • Fixed bug with reopening queries in NonBlocking mode +
  • Fixed bug with calling the RefreshQuick method for the detail DataSet +
  • Fixed bug with calculated fields with ftDate and ftTime data types +
  • Fixed bug with comparing string values during locate ans sort operations +
  • Fixed bug with prepared stored procedures, whose result set depends on parameter values +
  • Avoided Delphi 6 bug in the TryStrToBool function +
  • Fixed bug with retrieving stored procedure output parameters with DECIMAL data type +
  • Fixed bug with raising exceptions when locating records on filtered recordsets +
  • Removed restriction on datasets that TMyDataSource can be associated with +
  • Minor bugs in DataSet Manager fixed +
+ +

4.00.0.7 16.05.07

+
    +
  • Added ability to drag datasets between connections in group by connections mode in DataSet Manager +
  • Added ability to assign DataSource and DataField properties of DevExpress DB-aware controls automatically in DataSet Manager +
  • Extended abilities of assigning default controls for datasets and fields in DataSet Manager +
  • Fixed bug in the MSDataAdapter component with reading BLOB fields +
  • Fixed bug with AV failure after second call to CommitUpdates when there are skipped records in cache +
  • Bug with processing stored procedures with XML parameters fixed +
  • Fixed bug with retrieving information about foreign keys of a table using the TMSMetaData component +
  • Fixed AV bug with opening detail DataSet when master DataSet is not TCustomMSDataSet descendant +
  • Fixed bug with "DisposeBuf failed" exception on updating string fields in CachedUpdates mode +
  • Bug when UnPrepare is not called for TCustomDASQL on changing value of a macro fixed +
  • Fixed bug with loading DataSet Manager package in a localized IDE +
  • Fixed minor bugs in DataSet Manager +
  • Fixed Access Violation bug on Delphi 2006 exit on Windows Vista +
  • Fixed minor bugs in installation for C++Builder and Delphi 2007 +
+ +

4.00.0.6 20.04.07

+
    +
  • Added support for DevExpress controls in DataSet Manager +
  • Added support for using TMemDataSet.IndexFieldNames with RefreshQuick +
  • FastScript v1.9 support added +
  • Fixed bug with SQL Generator in design time +
  • Fixed bug with trimming SQL texts in design-time editors +
  • Bug with setting RecNo property for filtered datasets fixed +
  • Bug with PSGetTableName returning incorrect value after changing the SQL property fixed +
  • Bug with calling TDataSet.Edit for master DataSet in CachedUpdates mode fixed +
  • Minor bugs in installation fixed +
  • Fixed bug in SQL Generator with generating REFRESH statements for detail DataSet +
  • Fixed AV failure with deleting records in CachedUpdates mode +
  • Fixed bug when detail DataSet is refreshed on switching master DataSet to Edit mode +
  • Fixed bug with loading files in TMSScript editor +
  • Fixed bug with calling design-time editors of TDADataSource descendants by double click +
  • Fixed access violation when loading DataSet Manager package under Delphi 2007 and Windows Vista +
  • Fixed bug with DataSet Manager when IDE freezes on loading a form with a large quantity of datasets +
  • Fixed bug with SQL Server Compact and databases with maximum database size greater than 128 MB +
  • Fixed bug with executing parametrized queries in Detail DataSet from design-time editor +
  • Fixed bug with the RefreshQuick method and SELECT statements containing column aliases +
  • Fixed bug in RefreshQuick method with semicolon at the end of the SELECT statement +
  • Fixed bug with displaying invalid object property type in object inspector +
  • Fixed bug with filter expression that contains several consecutive left brackets +
+ +

4.00.0.5 06.04.07

+
    +
  • TCustomMSDataSet.CreateProcCall and TMSSQL.CreateProcCall methods added +
  • DataSet Manager stability improved +
  • Fixed bug in SQL Generator with complex SELECT statements +
  • Bug with setting RecNo property for filtered datasets fixed +
  • Bug with Locate on ordered data fixed +
  • Fixed bug with XmlTextReader.Eof property under C++Builder +
  • Internal error in Delphi 5 fixed +
  • Fixed bug with calling RefreshQuick method for SDAC DataSet with parameters in query +
  • Fixed bug with identity columns in SQL generator +
+ +

4.00.0.4 20.03.07

+ +New functionality: +
    +
  • Delphi 2007 for Win32 supported +
  • Disconnected model for working offline and automatically connecting and disconnecting supported +
  • Local failover for detecting connection loss and implicitly reexecuting some operations supported +
  • Added DataSet Manager to control project datasets +
  • New TMSScript component for easy execution of multistatement scripts with the following features added: +
      +
    • Support for executing individual statements in scripts +
    • Support for executing huge scripts stored in files with dynamic loading +
    • Ability to use standard MS SQL client tool syntax +
    +
  • New component for transferring data between all types of TDataSets descendants added +
  • New TMSServiceBroker component for SQL Server 2005 queuing and reliable messaging added +
  • New TMSLoader component for improving records insertion performance added +
  • New TMSDump component for loading data to and from the server added +
  • Data export and import to/from XML supported +
  • WideMemo field type in Delphi 2006 supported +
  • Support for sending messages to DBMonitor from any point of your program added +
  • Added asynchronous execute and fetch modes +
  • Compressed BLOBs supported +
+

+ Support for more MS SQL server functionality: +

    +
  • MS SQL Server Compact Edition supported +
  • Multiple Active Result Sets (MARS) supported +
  • Support for new data types, including XML, varchar(MAX), nvarchar(MAX), varbinary(MAX) added +
  • Support for a new level of transaction isolation added +
  • Support for more server objects in TMSMetaData added +
  • Stored procedure parameters with default values supported +
+ +Extensions and improvements to existing functionality: +
    +
  • General performance improved +
  • Master/detail functionality extensions: +
      +
    • Local master/detail relationship support added +
    • Master/detail relationship in CachedUpdates mode support added +
    +
  • Working with calculated and lookup fields improvements: +
      +
    • Local sorting and filtering added +
    • Record location speed increased +
    • Improved working with lookup fields +
    +
  • Greatly increased performance of applying updates in CachedUpdates mode +
  • Connection pool functionality improvements: +
      +
    • Efficiency significantly improved +
    • API for draining the connection pool added +
    +
  • Ability to customize update commands by attaching external components to TMSUpdateSQL objects added +
  • Support for DefaultValues on record insertion added +
  • Some performance improvements achieved: +
      +
    • NUMERIC fields fetching +
    • Update commands execution while editing data set +
    • DataSet refreshing +
    • Records refreshing after updates and inserts +
    +
  • Support for selecting database name in TMSConnectDialog added +
+ +Usability improvements: +
    +
  • Syntax highlighting in design-time editors added +
  • Demo projects became better organized and clearer +
  • FAQ added +
+ +

3.80.0.34 05.12.06

+
    +
  • Fixed bug with TraceFlags in DASQLMonitor (D16224) +
  • Fixed bug with TDAParam.AsDate property (D16213) +
  • Fixed bug with wrong value of the StatementTypes variable in the BeforeUpdateExecute event +
  • Bug with AV failure when modifying VirtualTable data in design time fixed +
+ +

3.80.0.33 31.10.06

+
    +
  • Bug with ApplyUpdates and OnUpdateError in SDAC Trial fixed +
  • Bug with comparing Unicode strings fixed +
  • Bug with BeforeDisconnect event lost in design time fixed +
  • Bug with debug mode in design time fixed +
  • Bug with RefreshRecord in CachedUpdates mode fixed +
  • Bug with mouse wheeling in FilterBar and Search bar of CRDBGrid fixed (15675) +
+ +

3.80.0.32 29.09.06

+
    +
  • Limited support added for Windows Vista Beta 2 +
  • Memory usage optimized for tables with many fields +
  • Fixed bug with SQLNCLI provider and server cursors +
  • Fixed bug with unquoted '@' symbol in connection string +
  • Design-time bug with IDE version in TMSConnectionEditor in Delphi 2005 fixed +
  • Fixed bug with macros and "&" operand +
+ +

3.80.0.31 28.08.06

+
    +
  • Support for Professional editions of Turbo Delphi, Turbo Delphi for .NET, Turbo C++ added +
  • Bug with automatic detail field value generation fixed (D12886) +
  • Fixed bug with TrimVarChar +
  • Fixed bug with FindKey method when the primary key has field of type Int64 (D12558) +
  • Added capability to use quoted field names in IndexFieldNames property (D10091) +
  • Bug with canceling edit on record with BLOB fields fixed +
  • Bug with WideString lookup fields size fixed +
  • Bug with loading wide strings in TVirtualTable fixed +
  • Added support for macros names in which first symbol is digit +
  • Bugs with parsing macros fixed +
  • Bug with filtering DateTime fields when filter expression format differs from one in local system fixed (D12823) +
+ +

3.70.3.30 07.07.06

+
    +
  • Fixed bug with wrong line number in DAScript.EndLine property (M12015) +
  • Fixed bug with filtering empty strings (S12329) +
  • Bug with using calculated and lookup fields in Master/Detail relationship fixed +
  • Fixed bug with design-time editor for Detail dataset in Master/Detail relationship (M12021, M11914) +
  • Bug with modifying FieldDefs in TVirtualTable fixed +
  • Performance of SaveToFile and LoadFromFile functions in TVirtualTable improved (D12435) +
  • Bug in TVirtualTable Editor fixed +
+ +

3.70.3.29 31.05.06

+
    +
  • New MS SQL Server 2005 data types supported +
  • TMSConnection.Options.InitialFileName property added +
  • Modifying FieldDefs in TVirtualTable component accelerated +
  • Fixed bug with memory leak in TCustomDADataSet (11636) +
  • Bug with calling Parameter Editor from Object Inspector fixed (11671) +
  • Bug with Master-Detail linked by parameters fixed +
+ +

3.70.2.28 18.05.06

+
    +
  • SDAC is now compatible with InterBase Data Access Components +
  • Bug with Prepare method in Delphi 5 fixed +
+ +

3.70.1.27 12.05.06

+
    +
  • Fixed bug with loosing connection for FetchAll=False datasets (M11398) +
  • Added support for MIDAS TDataSet.PSExecuteStatement ResultSet parameter (M11351) +
  • Fixed bug with AV failure in ApplyUpdates after CommitUpdates +
  • Bug with local filter under CLR fixed (11291) +
  • Bug with using alternative memory managers fixed +
+ +

3.70.1.26 14.04.06

+
    +
  • Fixed bug with positioning in grid after TCustomDADataSet.Locate (11256) +
  • Fixed bug with Master/Detail relations and local sorting and filtering (11254, 11255) +
  • TCustomDADataSet.Locate now centers position in DBGrid (10976) +
  • Bug with displaying query objects in objects tree in DBMonitor fixed +
  • Optimized using of system resources when opening query (O11270) +
  • Fixed bug with design-time SQL Generator +
  • Added OLE DB limitation workaround when preparing query with parameters in subquery +
+ +

3.70.1.25 10.03.06

+
    +
  • Ability of trimming (N)VARCHAR fields with CustomDADataSet.Options.TrimVarChar property added +
  • Added support for MIDAS master-detail relations +
  • Fixed bug with fetching (N)VARCHAR(4000) fields +
  • Fixed bug with erroneous exception on TDAParam.LoadFromStream +
  • Bug with AV failure when calling CommitUpdates method of inactive dataset fixed +
  • Bug with error failure when assigning empty dataset to VirtualTable under CLR fixed +
+ +

3.70.0.24 26.01.06

+
    +
  • Support for Delphi 2006 added +
  • Support for MS SQL Server 2005 added +
  • FastReport 3.20 support added +
  • Fixed bug with single MacroChar in string constants inside SQL +
  • Bug with invalid processing of SQL statements when using SQL keywords as macros name fixed +
  • Fixed MS SQL server bug with processing 'SET STATISTICS IO ON' statements +
  • Fixed bug with using CheckRowVersion property and RefreshRecord method +
+ +

3.55.2.22 19.12.05

+
    +
  • Fixed bug with trimming VARCHAR fields +
  • Bug with restoring BaseSQL property fixed +
+ +

3.55.2.21 07.12.05

+
    +
  • TMSConnection.Options.PersistSecurityInfo property added +
  • TCustomDADataSet.FindKey, TCustomDADataSet.FindNearest methods added for BDE compatibility +
  • Fixed bug with Locate by multiple fields +
  • Fixed bug with unchanging RecordCount value after CancelUpdates +
  • Bug with refreshing record after changing SQL property fixed +
  • Fixed SetWhere function bug +
  • Fixed bug with server cursors when RefreshOptions property contains roBeforeEdit flag +
+ +

3.55.1.20 24.10.05

+
    +
  • Fixed bug with open detail TMSTable when master is not opened +
  • Fixed bug with design-time SQL Generator +
  • Fixed bug with EOLEDBError.MessageWide +
  • Bug with updating FilterSQL fixed +
  • Bug with VirtualTable registration in CBuilder fixed +
  • Bug with VtReg.pas in Pro version fixed +
  • Bug with closing dataset (SQL contains macros) when the InsertSQL property changes fixed +
  • Bug with incorrect sequence of calling BeforeClose, BeforeDisconnect events fixed +
+ +

3.55.1.19 11.10.05

+
    +
  • Unicode error messages support added with EOLEDBError.MessageWide +
  • SQL Generator improved: now in design-time format is used instead of +
  • Fixed some bugs in design-time SQL Generator +
  • Fixed bug with Master/Detail relations on string keys that differ in case only +
  • Bug with reexecution after SQL statement changed fixed +
  • Bug with assertion failure with OnNewRecord fixed +
  • Fixed bug with detail refresh when field referenced by MasterFields property is empty +
  • Fixed bug with extra detail record posts after master record changed +
  • Bug with firing AfterScroll Event after detail dataset refresh fixed +
  • Bug with simultaneous use of several DAC products fixed +
  • Bug with changing FilterSQL of inactive dataset fixed +
  • Bug with column sizing with CRDBGrid.OptionsEx.dgeStretch=True at design-time fixed +
  • Bug with TCRColumn.SummaryMode=smLabel for string and date fields fixed +
+ +

3.55.1.18 02.09.05

+
    +
  • Deferred detail dataset refresh feature with TCustomDADataSet.Options.DetailDelay property added +
  • Fixed bug with locating, filtering and local sorting of strings that contain '--' +
  • Fixed DisposeBuf bug +
+ +

3.55.0.17 02.08.05

+
    +
  • Optimized macros processing +
  • Fixed bug with using keywords as param name +
  • Fixed bug with local sorting in dsEdit state +
  • Fixed bug with getting Null for Blob fields +
  • Improved behavior on parsing inline comments +
+ +

3.55.0.16 05.07.05

+
    +
  • Fixed performance bug with calling Execute (ReadOnly = True) +
  • Fixed bug with sorting by GUID fields +
  • Bug with TDAParam.AsString with TDataTime parameters fixed +
  • Fixed bug with TMSConnection.ConnectioString design time editor +
+ +

3.55.0.15 30.05.05

+
    +
  • Ability of automatic preparing query with TCustomDADataSet.Options.AutoPrepare property added +
  • Ability to synchronize position at different DataSets with TCustomDADataSet.GotoCurrent method added +
  • Optimized MSSQLMonitor BLOB parameters processing +
  • Improved behavior on editing master key on Master/Detail relation +
  • Removed TMSStoredProc.ParamCheck property from design-time +
  • Fixed bug with ignoring MSConnection.Options.WorkstationID +
  • Fixed bug with DADataSet.CheckBookmark on filtered datasets +
  • Fixed bug with Transactions on connection lost +
  • Fixed bug with reconnect on connection lost +
+ +

3.50.0.14 29.04.05

+
    +
  • Update Pack 3 is required for Delphi 8 +
  • Fixed bug with FetchAll = False and QueryRecCount = True for Detail queries (6759) +
  • MSQuery.AddWhere improved +
+ +

3.50.0.13 29.03.05

+
    +
  • Fixed bug with quoting fields in SQLRefresh +
  • Fixed bug with FieldDefs.Update and prepared TMSStoredProc (6147) +
  • Fixed bug with roAfterUpdate and changing primary key values (6389) +
+ +

3.50.0.12 24.02.05

+
    +
  • FastReport3 engine and demo added +
  • TCustomDADataSet.UpdateObject support for MIDAS added +
  • Fixed bug with CLR BLOB Locate +
  • Fixed bug with FmtBCD Locate +
+ +

3.50.0.11 24.01.05

+
    +
  • Support for Delphi 2005 added +
  • Support for MS SQL Server 2005 Beta 2 added +
  • Guid fields support for VirtualTable added +
  • Fixed some bugs with connection pooling +
  • Fixed bug MSParam.Size on CLR +
  • Fixed bug with KeepDesignConnected +
  • Fixed bug with design-time SQL generator and macros +
  • Fixed bug with design-time MSStoredProc SQL generator +
  • Fixed bug with IndexFieldNames on identical values +
  • Fixed infrequent bug with IndexFieldNames +
  • Fixed bug with params on MSQuery.Execute with SELECT +
  • Fixed bug with disconnect on fatal error +
+ +

3.00.2.9 23.11.04

+
    +
  • Fixed bug with IndexFieldNames and Locate +
  • Fixed bug with setting MinValue and MaxValue for tinyint fields +
  • Fixed bug with KeepDesignConnected +
+ +

3.00.2.8 28.10.04

+
    +
  • Fixed C++Builder hpp bug +
+ +

3.00.2.5 21.10.04

+
    +
  • lxPartialCompare option for DataSet.LocateEx added +
  • Fixed bug with OnFilterRecord and Blob fields (4962) +
  • Fixed bug with Reconnect and prepared statements (4910) +
  • Fixed bug with BlobField.SetAsString +
+ +

3.00.1.3 10.09.04

+
    +
  • Common class DADataAdapter isolated to CoreLab.Dac.AdoNet.dll library +
  • Fixed bugs with ctKeyset, ctDynamic and default values (4082) +
  • Fixed bug with evaluation period in Trial version +
  • Support for TDAConnectionOptions.AssignTo added +
  • Fixed bug with filtering NULL string values (4776) +
  • Fixed bug with large blobs in TVirtualTable (4769) +
+ +

3.00.0.2 20.08.04

+
    +
  • Fatal errors processing improved +
  • Delphi 7.1 bug fixed +
  • MDAC 2.8 Lost connection bug fixed +
  • Fixed bug with QueryIdentity and complex table names (4634) +
  • Fixed bug with quoting complex names +
+ +

3.00.0.1 21.07.04

+
    +
  • Support for Delphi 8 added +
  • Local sorting ability with TMemDataSet.IndexFieldNames added +
  • Connection pooling support +
  • TCRDBGrid sources in Standard edition +
  • MSDataAdapter component added +
  • .NET Windows Forms demo project added +
  • ASP.NET demo project added +
  • TMSConnection.GetStoredProcNames, GetTableNames, GetDatabaseNames added +
  • TMSConnection.ClientVersion, ServerVersion added +
  • Milliseconds support added +
  • TCRColumn.TotalValue property added +
  • New time trial limitation +
  • Fixed StackOverflow bug with opening empty ctStatic cursors +
  • Fixed bug with Refresh server cursors (4478) +
  • Fixed bug with small memory leak on SQL error (DbxSda4344) +
  • RefreshRecord now updates timestamp field as default +
  • Fixed bug with updating non-dbo owned tables (4193) +
  • Fixed bug with CustomDADataSet.Options.ReturnParams (4159) +
  • Fixed bug with CRDBGrid +
  • Fixed bug with getting RecordCount if Filtered = True (4125) +
  • Fixed bug with getting OldValue after Insert +
  • Fixed bug with TrimFixedChar and dll +
+ +

2.45.2.25 15.03.04

+
    +
  • Mouse wheel support added to CRDBGrid +
  • Local constraints for ctKeyset, ctDynamic disabled (4082) +
  • Fixed bug with quote char in Filter property +
  • Fixed bug with assigning name with spaces to Database property +
  • Fixed bug with getting Identity value that exceeds MaxInt (4081) +
  • Fixed bug with RefreshRecord and binary key fields (4089) +
+ +

2.45.2.24 05.02.04

+
    +
  • Fixed bug with restoring position after Refresh (M3962) +
  • Fixed bug with TCustomMSDataSet.PSGetKeyFields (M4001) +
+ +

2.45.2.23 30.12.03

+
    +
  • Fixed bug with processing ftTime and ftDate parameters +
  • Fixed bug with setting Null value for string parameters +
  • Fixed bug with processing Blob and Memo parameters (3709, 3726) +
+ +

2.45.2.22 24.11.03

+
    +
  • Fixed bug with getting RecordCount (ParamCheck = False) (3524) +
+ +

2.45.2.21 02.10.03

+
    +
  • Methods TMSSQL.BreakExec and TCustomMSDataSet.BreakExec added +
  • Property TMSConnection.Options.AutoTranslate added +
  • Method ExecSQL in TMSConnection added +
  • Methods GetTableNames and GetDatabaseNames in TMSConnection added +
  • Unicode support for Locate on Win9x added +
  • Fixed bug with MSDataSet.BeforeUpdateExecute and AfterUpdateExecute (3347) +
  • Fixed bug with MSParam.Size (3345) +
  • Fixed bug with calling Refresh after RefreshRecord (M3269) +
  • Fixed bug with MSDataSet.UpdatingTable set at design-time (3164) +
  • Bug with opening queries (FilterSQL <> '', StreamedActive = True) fixed (M3497) +
+ +

2.45.1.20 02.07.03

+
    +
  • Fixed bug with possible AV on destroying DataSet in Delphi5 (3069) +
+ +

2.45.1.19 10.06.03

+
    +
  • Parameter processing for complex queries optimized (3058) +
  • Design-time bug occured in Delphi5 and CBuilder5 fixed +
+ +

2.45.1.18 05.06.03

+
    +
  • SQL Generator improved - support for complicated statements added (2993) +
  • SQL Generator improved - "Quote names" checkbox added +
  • Design-time SQL Generator was simplified +
  • TParam -> TDAParam +
  • Bug on Post (Insert/Append) when InsertSQL execution fails fixed +
  • Fixed bug with ApplyUpdates if Options.ReturnParams is False and Options.QueryIdentity is True +
  • Fixed bug on PSGetKeyFields after dataset is closed(3034) +
  • Fixed bug with wildcard Locate on WideString fields +
  • Fixed memory leak on posting BLOB data with ctKeyset, ctDynamic +
  • Fixed bug with trimming char fields having empty values (2987) +
  • Fixed bug with calling RefreshRecord on SELECT w/o data fields +
  • Fixed bug with calling RefreshRecord on ctDynamic (3053) +
  • Fixed bug with MultiSelect DBGrid for ctKeySet, ctStatic (3054) +
+ +

2.45.0.17 05.05.03

+
    +
  • property MSConnection.Options.WorkstationID added +
  • Performance to insert large BLOBs improved +
  • Fixed bug with using SDAC from dll (2963) +
  • Fixed bug with getting SharedObj-parameters from datasets with LookUp fields (2948) +
+ +

2.45.0.16 04.04.03

+
    +
  • Performance significantly improved +
  • event TMSConnection.OnInfoMessage added +
  • Multiple Errors support added +
  • EMSError now inherited from EOLEDBError +
  • property TBlob.AsWideString added +
  • property MSConnection.Options.ApplicationName added (2813) +
  • Parameters parsing improved. Symbol ':' in string literals is ignored (2836) +
  • Network error processing improved (2554, 2571) +
  • MSConnectDialog improved +
  • Performance demo added +
  • Bug with RefreshRecord fixed +
  • Small memory leak in RefreshRecord on ctKeyset, ctDynamic removed +
  • Fixed bug with storing unicode strings in Memo fields +
  • Fixed bug with processing 'Fail' parameter in TMSConnection.OnError (M2876) +
  • Fixed bug with password storing in MSConnection.ConnectString (2841) +
  • Fixed bug with design-time SQL Generator (2885) +
  • Bug with transaction control on ctKeyset, ctDynamic fixed (2885) +
  • Fixed bug with TMSMetaData.Refresh (2872) +
  • Fixed bug with changing TMSMetaData.ObjectType +
+ +

2.40.0.15 24.02.03

+
    +
  • WideString support added +
  • Refresh improved - current record is restored after Refresh call +
  • Supported types list for TVirtualTable extended. WideString, Smallint, Word, Boolean, Largeint, Currency, Date and Time field +
  • pes added (2779) +
  • Performance of VirtualTable.AssignDataSet improved +
  • Property MSDataSet.Options.QuoteNames added +
  • Property MSConnection.Options.KeepDesignConnected added +
  • Property MSConnectDialog.StoreLogInfo published +
  • Bug with SDAC and ADO incompatibility under CBuilder fixed (2751) +
  • Bug with clearing old value for Null output parameters fixed +
  • Bug with wrong setting parameter values in WHERE clause fixed +
  • Bug with processing empty param values in ConnectString fixed +
  • Bug in MSTable.Execute fixed +
  • Support for LIKE expressions in Filter property added(DAC-2706) +
  • Precision and Size property values setting bug for TBCDField and TFMTBCDField fixed(2723) +
  • Bug with getting field aliases on old clients fixed (2780) +
  • Bug with design-time created fields case sensitivity fixed (2663) +
  • Bug with some memory leak on each connection to server fixed (2679) +
+ +

2.35.0.14 30.01.03

+
    +
  • Improved performance for opening queries with lot of parameters +
  • Dataset 'with many fields' update performance improved +
  • 'Connection Lost' error processing improved +
  • MSDataSet.Locate improved (2589) +
  • Fixed bug with compiling applications on C++ Builder +
  • Fixed bug editing MSConnection.ConnectString property on DataModule (2586) +
  • Getting identity improved for MS SQL 2000 (SCOPE_IDENTITY() instead @@Identity) +
  • Fixed bug with getting Identity value after inserting to view (2567) +
+ +

2.35.0.13 04.01.03

+
    +
  • Bug with string quote in filter expression fixed (O2532) +
+ +

2.35.0.12 26.12.02

+
    +
  • Speed optimization for opening small queries (2378) +
  • MSConnection.Options added (2454) +
  • Limited MSConnection.ConnectString support added (2356) +
  • Output string and (var)bytes parameters are now obtained from the server +
  • with the maximum length not depending on set Param.Size (2355) +
  • DBMonitor client implementation moved to COM server +
  • Bug with complex table names fixed +
  • Fixed common bug with lost data in DT-editors(D2137) +
  • Bug with design-time MSConnection in DataModule fixed (O2290) +
  • Design-time editor for MSTable bug fixed (2433) +
  • BLOB fields post for Server Cursors optimized(2117) +
  • Bug with Master/Detail relation for ClientDataSet fixed (O2423) +
  • Fixed some bugs with OutOfMem (1979) +
+ + + +

 

 


© 1997-2007 Core Lab. All rights reserved.

+
+ + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Lib/D11/CLRClasses.dcu b/internal/4.10.0.10/1/Lib/D11/CLRClasses.dcu new file mode 100644 index 0000000000000000000000000000000000000000..ad927909f974ed05205657316b6be1da60803d68 GIT binary patch literal 21962 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/CRColFrame.dcu b/internal/4.10.0.10/1/Lib/D11/CRColFrame.dcu new file mode 100644 index 0000000000000000000000000000000000000000..f0cddd0084e4a49bed1ca57ca1c9607864ab2b99 GIT binary patch literal 8338 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/CRConnectionPool.dcu b/internal/4.10.0.10/1/Lib/D11/CRConnectionPool.dcu new file mode 100644 index 0000000000000000000000000000000000000000..68c68fcfbae64c3791791fbc659d6a0f1b72b30b GIT binary patch literal 15265 zcmbt44R{pQwRi5$ZYIklSun0i8tE>^G=#Y2znIXx4M`TFK?6xZEdH#U$!0a#!2Tdn zz{QX@+c8#OTOZii7At*LOTVhE&!1Nt`LU(-^(j>!R`InwTM@90mhwUc_MLNQ?(A%K zqhG%l*u8Vl|2g;EbI;7qWrWPwT}Q|>L(O0K%-N$`2z4~BZtM?-l|U@iA8zaK?|p#S zmTt&v@&`PjaG=>uzd$z>Pp0u~@JA6vx@_$O(U{UlNOxYxwYS^~Vz!+4(W&mdmT*i7 zDv|tM-TS)j4dH00Jr)UtgHO-7^E=&n%Rr6d5C8qM4=KS?oz2tk?^YW9y}iww1Ih+8 z=1Kd39cgq!cT9xB&4^9NFK7VgiiQ;7;7v30A{4r%WDwMsAz5Zxa zgS=O|W`A&oH!BEVa}Hh|l)SC&u}EXz2BtvrwnQ1{*Du+*TgNp-gZG!dHX596=t0pP z0~?e*Oce*CZx17+h(lOJ`v;yy;0$k8l%EsZ9}gC2mg=PE4*ve$V1Bz2YgNL*SPy|e z;A|QQH$)=-0RxV$>9MCSB6z!tWtF4kR6owob zV4hy2!y3W^M$$0EG;dRXSkYjbo<@J93ptsdg4TY2*J>pSL4$Ss(pu*&5bV|dP}IZ% zPGL})&5ga0a}Rx|G-zvxMwN(WVV+l;{Iz~nS_uVTn?c!Qf;{qi;hbQ(3E*i`x9F%d)u{&xa+o_NHEW%k#yfR zyEIs!U3)Yu9{u&rHwCAACbMn%C*OhKC6l2#&(GDZcCegj^*|mfF?RVligIT0G(#ng z96*+AT&v>Wq#Q(CkuDDQ7Zdgv2!n)L>kq|10~EQRKk$B8F#q;QN2pKfkH_k~@9hoR zZ;!M?8u)vat|c&su&h-2I%A<;3`<@|QvfReX16z=N39S}hoR;(iwxUI22 z9*)iY@XY@NFG4lGeh?N8_A1&jaPPh=b_W!Qb5s`?EW%@;vA=JFKcaLfn`6JGGf#Bq z8$0*mzrXAb+C9d6=r@l=gAQY=$L>(sv1dVSQv*8+&>Uy`O8@5c5f)vo_yavkS18o& z4J^t!-4f)cXYTz^8dzi;Tw-8RdVAg&Sd_6pZw92XL2n5xGUe3{n5DC57-s3D!(W>?^nf2Ji-gVHaOft;+C=&3DpEZ?lNV6KB=*DlhpVeTmxb}* zSssBbX^Y3waZZr$zT93*?7yt3c8l#wZ?}z96Sr(O$wrDvU{pAghfWt&eKuP%WRh9p zBTVAk#U_cs|Bl9AeNhH~l$GXT(ixf-_f!{j=naPsZK1BkbE_R4=|#{HOK*7O>+>rw z!O*n!!!}Q=$KEGFs`|ebUr4H9tL4HEljd*z?6SpGvvZ^M9EH|F7uz36kh`8g{5-M0 zUA&lwX)y-n6gsuIsM6u-SmW;vbwOp-N@{}C9&;aELaK`+23G}bN=nK@d*hjo%QM!IS%JvPf3O|BbdNV&0sG6B+nju%WEJ0HLa(*V+ zJkL^7shQ#=m6BWVILR^_=q;eAxUy(!In5j6(03&W*$Hy?-6N&N*m8S>3S2g=iaLpe z-j#AKuBoim4%m+V1o>aI_oZQzxi+_m2eXqnB#)_W4tll!uOh!RNKJk zZnErxJ5OKRZc;x!wF97N5mN*ku{6_YNDtm9B*^zr)AjSLCQYX3wr~;E*&^^%=#QCq zlvel>W+l*uy!h&?A1+qymNlvnuud$I$PEs%C&ZbII=>T;jOxzXlrPbk{|;pX2U&FT1t*Mr1MH5E=OZL5`oUnXjYs= zCN8Np)U99_gflQ;FE`+_sp8h71a51IvP?>lJJ5`pOf&51LWqlDHUbnJk|1}Y7SB#o$k5c+xulvYB=M7a(z&_?rR@?8qr1uCiCLLO+h*mh!JCi%u#+fdmT=_e_pZb|pL3q9m+lLt#J7h6DgzC}B;Z~a`J z-bDK#gKn#;n8K7vi|`e+V0PXpZv@cYbVQ5CUEI}fA|7{HF=?YtQfPA(E>nV`uqlZP z@t||-)>M63E=(#XJJ5{XVrC#R+O}>o$r#XfCD(@aD%Ucn>udrQD55!cZ7$QYf_UN* zLYQVQ*%yjLW9h`RyQa1J%>dbDYwGXsQ(#4a9I~>ne-oQH%;72l3tPB_?kOxZpCiL) zqhvM_w^tt*fh9eclX^+tj@;Lqxw9QKEhZM{I2S#Yb><`EZj@hWmXFpAaS>DPw5bo^ zK@`|bM@7AMW~QDv4$?=s^y~vk?=Ot=;{|L5{{#(~-V4G}!H*9Rw2KLZpyIBRw~sMfGp*nm_eNM(rnV$xw~7>M^3 z``?L;cqD!oG$xYSba+%~W(HIi)l6F%Vm~&thwe}a6(y+OX_S96ZZI9?7!_7>l++20 zQW&0=5NazK6;^S$tsVQP2tZwMFTtTwn?D-89Ud+NylPZf$Kf;5Imuf=Fk$Yfa0921 z_-RI{v;^)ibol3O+B3fdwH45LmQg{`5gwa?%bFQJ+y_cmI$7X(rw3B} z2TbPTqMA#xDOh13M1+jr%gL<174U!`fRN-*q=6m&P%i+Nj0!*Hzo5KjZLezVstDLgu%P3NLchB|fcnGnvnga|>`=#OY@E(xKM1gOYhba)^@@ z_*l}Wu?>Lz5016=EQ?162yw0g=&Kw$%?B;qZCV5gDe(jDb&j($9NR~L+6bsOIZ9?I zLsQ9iKpy2ti6J4afa`uh{6R-}Y}#EaA%EVB1>lbyF0(^Wzj*}gLBzh#vD35e{D9F0bRZY=+1Jw8CtE&c$O(T zPQea3&q<6L1LeKN0#*xF?GDMK)tE7n#u04gU{j456U8CK<#XJWHD*k-jaZ<@6mUu- zBpDlcOq8xf2d3*}ykLw``v@x-7wZUf!Pw0TMk$w^Sun<^>_)|xa6P#RbTi%Nav$QH{;Vey4$~oetpHI@pt^_X7|+w+ITZ z&=K4ns8i?R(aoqZPe+*DDG;&#E#k8BjkW~1N>SRCI!ZIQ{+Mr*bOsNms?#=hFxgl= zfxTZYjS636#PvlrMLvEWYLBQ1sf7cnfuqx#LM$nPGoHiq*=E6?kce0URjWluc$`{l zP41}Sq?&jcPJ2#Pz%!NYeIow(5Jr3zN6+Bs^uYx*uOdw+r)Se%5t)O&5pw{Y4E`KaWqN& zojShYu=*04{K6-7A?&3cZ^eojr0Z)|q#8URt1sR7rTy(|)Q{973&w`d#8#_~Vx3Qn zH>r(MollA{RU1p{d?oRP>Ka*Xlo|KXSp0HzjYDm8@TpU6ELPVPvuQlP=;_AtT3>lg zTrhT${#alN)}jXWCG}#|%jkBD#p=}ypf0&w1ZBzP(#UdIZP!$cEH75uHF+b;9csI# z32aF&FG2Cc%gayZt8b|LnW&pUMW=dd@W4d-nziOIBv(!hccwsbT!Lt5#ClMk6jE)n zI+46nRDS`2q|_=&ZJtOrO6vZ^))dJO)PB&iZru(0MAE*7X~h_;K2f{=ZQ|HDUGk2% zw&m%UV3+EZ_v4=yW6%T|n6g*Y{dnQfY|makwOML2mJsx)Ua4)w=Xh3t0Gh%$ctA9e zt{li)1^7p9B?}HcDeN|apY(NPPOr@w`%X%Ohf;HXWqHx7wu^PkN{SvB zV~MBd9hgy}wznqNECp!FE30jyx>~AhlkbvLucqBdA@xJ`cgf~+iLDZeIo0NKs#iA? zFEtMq9PaG72v(viHNPu4i_vHj5yhxtMHg zXP6R(aj3<2Cof``E>*lcX#-r!TVkR>-Z&)cxdn%lZHP#%C}s)}#sUH=g#}~RuUprZ zbo5|lVBDH<`&p$p`GJ8i0~btg>Z_CXSZ8><=;`KtAd{X?_t)C!rQwUsmcd5Zh1v1R%D zTaM3+2e@{FvHEL=SAGnukM4NVD)+JAaz!WYERqbC*!nSvUp2|t?P*S2qnySLb7L}% z)ymBNxp6{RO*_>NYu$M&**UIT^*qZv3^LOX)h)eXXmwF0e$IZNU}bmCZ?%}Q`m`?3GCqeK&lJOz7IU+Sv4udL*u0p;<}fzy;-#ip>(-ej zFQ76OEjVNXoV<~ld@~b{`SF5z6;s{{hOS69pEle%$QMRq;(-U9Saz1ED^Hu`qk9A! z-phciv37ksyaTkpy+0laDC;NR7vjt2jCMNE!V_hD*|k6H>V~IR@rVL2IKMlghk=Z} zvr4_K=>>QQLDZ(FDw0i4Rb4Z5CjM8ou_D=6r8ce@9Fqo*)1k2e%ivhvixZY)Qw6jU zB6JON+Qc~>6=Je|g&Hk~)oiMePTpA8TOn^vCawJKIX($qD!ZTW277C=wq zfYz-pGi7`R1k~V6p}a!1wL(tA>Y^pFi*FT1S}PnQpxV$8A69|74ous+7_Vldky|Rn zYll)>E?=I5A%<&bsJb@(_TT}>4cOkKysi7&p}|p)oRrNZOoo)H^uO0#&lpnPHodB` ztb@Z#KcgTC1|hIrDWg)S%WNPMfqUGttQdBHksY_jm2iNdC%}gV5kqyf3Zy?@JVbO z+$NIPMT6U95-S+o<{&ZN&KcdFPwP@upWc^#Lf?Ys{so5_o5qU^De4ehwd=&eJ0%i-(^yVpxixWox%DFxT7hhJw`As! zs9q;sJ@nR=(#8d6SYn9k8=7(`u9ENS_z6Qf=`-66Cdv?j$xBkfNbFI3TuvjBP=*>^U6tYKNSksON9Nto_7@QzQ_w0qxutSdNirJZ+?;qj;W3-(U44P~nSK+@SHG`{2F9R{D zK$6umoGOD`Pm{RT|C;3(OP&WznWFY5^ji!G^RNKNHu!0c{00%;@CdI-f^EKh zgi@Czzr((d5#iWX!k4S%cZu+By&zS?5(&pkgyU7haR<`pG<`P+Zm~%4f{O%is7UZ0 zi3BeT!3c0SjD7HNl?%rlAX7d;gcD1Ia@OMr=D6m*UA3RrJEe`B07s!Rnf{qI=_`x&zD=MjV>vn z3rpx?C#@}%A<(j)QaJ>ljqn+O&vv>*9-(ElY8G8YtA%5BT0d8K7rv{6d+qeTV&R|d z^c&gV<+Qp+-i`7r=|YF;e+g}&Oxa#qO&{~g2Vps1rxo-8yL^-`p*x*)rvu)|o23mO z(bwrLm^$f$GF>r~As*Bw74lhHg;ZzhquSu1qh&DTwEW5`=UXb_&9^eTa3;OVPFtDm zdg)FnCchtaJKpNaBAGK5>*HJ(}VX1~uLzK%O zSZwlnG;=P?x^kLuqD=*&mcT5bN=2F8?VzKw>=rlE$C%4*@p`(xhTbt3#k$2dx(${{ zEN2Vjq6-%qlS2AfrQ9GE3Jqe3aG?waSR{u`Md5;6K<^{>+vp5J`z*A0(KPb))vISy z_XEX84w7{WmjH{uY2_YYv`6FYI(C?0|DxVQ)>Lt+aKN%0-{zF*vqlW&TC z9CnF&aX2p?#6hsWj)T>D6o-84SsbQY^DQu3Y&`|vZfgrpW?SPpTwxu;VV-paheg&a zak$btf^5y!-8i&Z-3VM|?Zctd>K0)bvYyA;h_wJ`-?WzEu**6D->+H^A?kJOt2n%A deFBH0)}uK5!TJFXf3)tx;REX)96q%A{|^Hd$E5%O literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/CRDataEditor.dcu b/internal/4.10.0.10/1/Lib/D11/CRDataEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..8c7774fb9fd7d2903aba5c1211d3b7fffeff5246 GIT binary patch literal 6995 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/CRParser.dcu b/internal/4.10.0.10/1/Lib/D11/CRParser.dcu new file mode 100644 index 0000000000000000000000000000000000000000..70bef5a7effefb7c024689b6fca78b9201d4d332 GIT binary patch literal 16202 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 Jhhtpme*s#_bp`+c literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/CRXml.dcu b/internal/4.10.0.10/1/Lib/D11/CRXml.dcu new file mode 100644 index 0000000000000000000000000000000000000000..5a38d9fa08b9e54c8645856e72a364a766d2edfb GIT binary patch literal 25677 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DAConnectionEditor.dcu b/internal/4.10.0.10/1/Lib/D11/DAConnectionEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..cf6d62e6c161faa82b8d8aeeb4f90c3971f7eec7 GIT binary patch literal 16372 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DAConsts.dcu b/internal/4.10.0.10/1/Lib/D11/DAConsts.dcu new file mode 100644 index 0000000000000000000000000000000000000000..25c9b2f3ef3e79e85c006de7eb32bbca3c992205 GIT binary patch literal 5932 zcmd^DU2Ggz6~5lMCRzNGq>T#+EjK9(ZHP^iB}o-kA=$MpyR{wHW4BEx(Ak;0-f3oM zw)10W1C$6vi(N8~bqf?>pZ;_uTV$=N=*U9=TJ9?>;+y^1$oA`G_d(oH|<%gE)y_6hjYo#wI79 zD1Mmi*zxqi(n;YCS=~5MZ6TUNaT0mK+RN|$@E4oqvq9`x`up1GnOQqd{c4Qsf^5f zfwEM`j_f3iu8OaG`&$!3LhP@MS@XtUzyH;xV}qsf8+et35F=$#DX-X#)VC8a46cgL zXR3QEqYL(>)s>kC>Mc8(SNP{UAN}Leok9#%cU!B$#UR`WrtHLC>2}l=;d#w7gQ7Ap zDa2suy+pnT;(mbWF=E?5>iz6T4xiSOCwEGuAUecoF?^gsB7RBin<-ZBE-hJ zijqEFcz`Hw2So;yPKM0=Flx>DzFM>W8P88tWGp{Lx^IPU4w6kqNp-0csW`?#iRy^8 zsFYjt!$zOQ^$}#-&%IZhKUWjgJFK~2-S$1#!pSQ4T;nO_nEO9P2HZggWKh|Q71iN_ zf|fUIKTN8_J*wHNdo02(q;XPHb=zreIrLf5I{-bx$u@wpp`;f`htaYfx*R{5@>xGp zw%eT!?1sOEO1m$^Qt;RrUaCxiV&GxbW$(nx>gm*jCyb4(lR?K|5P&!U#9Az)94eC# zcKNP3!A~w;3^j$JuTO_o&NV4J^6-YM zZ5KK1tGS>VF4}D~L6>M}Z^zCwNCrS@r+1=o-E$Q(g{iE>Ms-s`zbMyvh9xDcR|d?3 zoV8awNPpBsUdz}>hYWcS40$XHgEjeIP>C3YZzg0yJE8Q$F{WAJ5!E}32wV;7VY?Gi z&{*DObEk{6z};A&h~qSH2#zFDu53`G#n7U5KG zOtuzl^|OuYqT$M0+J;lGi~4J+WG+VOTZ*V>Y>E6cv`=(FuD`$*)fawaxIhcY-BpCB zVU3RP=_o>KAd3rNj3|i^4#WWqvJB;eH_uLU0M=6nQi>UE`B24pqd9LhN!Ptb4oSQRb7KqTeXQT+~Z~n)S7g2AUcCV zcel;PKqx9HbVdz3Mm&yM3$_!5Fyp4(jX_3h8n;#=JBV%G$6T-!g=-Y=h80heZ{7vp zti~#m$)-kcwZyrh7O*;%w9MBtwzsw9>XMRSWRpRYlC75&7nRcqBNtvCwU$*A2DSR~ zER$IhX62xp5bY^qa7HCgYdPF7x2PSh0lLB+ot!*+KVH-a7Q=cN!JtkUxJ#Iz+J>i^ zWYS@nL~+O^HmkYl=!F{MS<>*;R_NtC!r9i$RHIBpEghF7g;T50hB1 zwk04RCG!rk#|R`h>{vP(k^u& z=>pe-?QJuf?e?C;n~Upyh~jJ3?O3@x$_T{zr85^uCrAhA^%wDKe- zh{J5uFtT)8Qc*LE+H=jNF!XV5#yUQ&GjYpxa%EazB}$R6!*Tg(n`≫4OEbgd;521FaUEC6GD|Ao?aZsC3*~IM7 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.UyViX0 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 F{|}x|umk`A literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DADesign.res b/internal/4.10.0.10/1/Lib/D11/DADesign.res new file mode 100644 index 0000000000000000000000000000000000000000..8a83ab006f8e25df12f2b20b134f5f8e4179d99a GIT binary patch literal 3680 zcmdUwT}&KR6vsznOnj@+2NPfVXngRYqBNRlTB4;%TaD5tO$eqILm*AD_Cx%r4ML%U z8c9lvfNf)u(xymFj8U5fnm&*|u*)~Y!WMRyWtU}lVL#^kWBuQ~^me+t&?Rb&H)m(h zJ#)`*&N*}DUXJ6q&G;pg^au5U5qO;Aw!)H3KFSqw`?#IlJNVzrZR2*~e;c{ix?XLV;@R$r^0iNakrsC(Kp zD>EyH8sW}dm_nI!N*6%SI@r^T_r2{HxW%SW=oD8f)N*j=OIBgb@jHEnDhHe+o{@oo zbC}2!WGKK7`FRHf_LO4xPeKNH+t0kMd(zg;+pYu1I5#`bkJ!4XXt9VIT~e2WYS^!Y z=H;MA4$R?}G(RnRrUdtdI5#HT9Zk4~5;G2<(l~}J>QVyhwZt-GQbk_$5RT84W*250 zh$@Z4*64|-7GKt)VQnR-L;^}^L0qL+Wxs2`>;%(2YXL2x;CadU?@3A&#rO8CRUcDT3{^5@8d8kByI6#9B8v(- zYRRiCx>N6N28H7L(m6>C!@zn|BT-oeD8gAGQCS7q@qIVejK|PSO(kt0i+Fd25YrPY zghSrlq7p%qqfn&DCBG|^L*hv$vEDRvQ`bm#D7Y->Qd}2EM`^Jz3I&u(I&&UPE(d1O zr19;_VcISo%n3e_=&=i zqXi?CuMZu1#ZjI=SeD1WQ$P$`t8ueM|MQ&w`&sR`CiT~E)L$Buo_hIujePZ#)cLt| zxk|irOt^4FXg@5p9*Vb=$Iq9=n?JCZz4&i%NNQbQk-UDa_FW=*d68H1;o0xXU5%wP z^(9W4*QdM3J}w+x&FfW1MZVpV7Ypp~C=Z^G1vnkI<5Vo-3b;aUH}@7!%zLLJ$Nk6W zBhsAS@&XmA)5KxfPzA8wbNe=Pq3%{AHg@#k`a%Op;{Za1!s!7qX1f-24rdkG?d;J| zD3-conoA@gv#-YbbgJWuAajYt%Ao;dUcp)Yu65nOM~yEU`)4dnwyBVh5_06wy(npt zT_R03#G&z!?Zz~*)fkFQHW}=nE1?Z>R^v(ST3O>6J-)+Uk)K%;tA*8v#6yQ^7}!V^ zQ5WMhp0N`YlV3q0@NK8|yT!)ur@@U6nuWKhXZB)kryL4Z^|5Xj(r%`2Ldx4LwzucG#LTIqNj7eW1JK$g}0O&wqHKsIL2?j^36ucQ$49p$(gg>VDJu#_zCr Pm`hgWf8DfMGlKCibdQ;+ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DADesign10p.res b/internal/4.10.0.10/1/Lib/D11/DADesign10p.res new file mode 100644 index 0000000000000000000000000000000000000000..8688e5c807135258e5786ba7242e6f4f7fd5cf32 GIT binary patch literal 8112 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 B`sM%t literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DADesignUtils.dcu b/internal/4.10.0.10/1/Lib/D11/DADesignUtils.dcu new file mode 100644 index 0000000000000000000000000000000000000000..bb9c214fabe12d80d230a506b3733a5e0091c259 GIT binary patch literal 19047 zcmd5@4SZC^wZD7!X0utAWPv1xEn>0;8Y!ee0FfvBSo0xRKth5oN@|zQ-LTJmxw{dt z@>~Uc#5L4@VEq6JK3|_$v4V;T6(1Nyu~O0cS}EGESFAB;p+y^7H1B_A?%ciiW|L3~ z?c>Mn+?jLcf6kn9=FH69&83nwyzUxFYF}4=xi`LLlq3%=^Ovd7a9!i#ShzlVpX9i* zIlU|pEDkpY%M0Yo<>p}~hT`Txl=`JwN7brmOl^>)PJP>*zl!nH%DMf$S|3RIz zScALq`Fm#7jno>&Re_LN8mO-?Ul~-JW8tR8U9K0`CdvL#OpTN_H9~qzkjPJ&$XBVM zrihA(3i8uL_6YE@aI`rP3od_#dUN$&H56#6kIe}**4C?$-9#H9XbaR8b0I9y7*wAn zLbf1OL{wE!+KG}SC`@|Ost)RO&YlOm_@i~-9QoF!y0nTweN>Gee6Xj^;g3euNKC@N zy7bw+@uyjp-nwA|rnEi~jV=f@sNd&6bEB;1+ZWxxtuBkfRz#W_xYZZUJ3U&HRazfe z`q&R<)n(4+^Qj0o!kVkPzSjIwol+fXQEwsf84RE_5G!GXprPy@mJPRF_q3?%diF-CH->+*f?H8snLu zlzH~UvLD#%h9&VeMcxTKd;4HRyD=2=6;@o_Tnno~<+1-(QC>G938@n@78QPXFwj2` z=+NrYMNE;VmPk--FTee{x=i31`W_ltlQ|gFNt&8<`Y^I_`p3_L=YzB0`RFWoP7se* zw-+o`3~iFZ_od%n(gA&iJvC35c@j^2^iti$7MCuLs7WSXEcTkhAea= zVwzgqPs_AcnOd*LRFzs8(HItZM2#-LiJBMnQ4ukP*-Rnbe5r_f1k7!$RabTpUvi#0 zkwOzNjOW@dH@u59ENr3K3e`k1QeO>VND!x{)&N9Z2t(h~p9UO;@hl__lHL;DfR23W zPbZ9AtA?CbLQ3`>3v^Dug2wix1Dj`(nJKY3ZF;}hoIZ=jW+zu)GB6x@j)_4vt)eN? zKq**F|8lsowrK@>b|3{~d#7$!>AXdHat^9PwJcs*A4V=C24|UnUQ?h}jUabZD&&p) zU7=^{T*yFL+kRJBI%O%X$+Fa)_doIy%TmTpwf@eFXqg)OtXb;O_Kuo9JTRwmDgPJo zT%_Ze*Ug+azdoN9g-M8c-E7DBpz6RmsHLHqop<xmhZp$%O>_>b^Cb)$?u)(L&|hplf~I4slokT`NQ4D)1eojL4d=7y?ZB-{+2FgNhV zsf~Lkb2sqz&%^hxWp3b2rt#6qZ_VXyFmyie*!2)Iv7yhZwXLe_H+^_4dP~GZZs0fs zkqp7hcfbCsk%+NL;&dXCkBl0aedHi;kIq77!Lpx814o#8`C9OU5S(g0`^Kdk+c&%} z2dC;MTO~L(d2G2VIMsY^DGN?D99$~Et1pf@ASF*8i_j8#vLt;aIL6T!T!2%}-O~NP zbTm!FQEyBJPTMP+!x6RiZs{T3DO2ZyCVy>hxbbdj3-46MWHtupHU@Dl3dF+8>VdJ1 zQyk+)R4-7~+Ulm#-htt4WgHViX<`lJvV^k9iYvIXRHN%G9dD!Q~EJY#B!OFtyQN$DG$ z2E+n8GG?xn>CD%modn%5Ahcz<#HA-W^xd;lK^LT57pQMhb0vnnS|E?y9St9ubh`MakL8mxL>?PZB+tZg=~-s*AvpyDhqGru@edBO54A(&r)MRyokXsZO(Gp) znoiBhA<5BWnekXD*OQ#FLMtXD4L|YVW%e;7JjbqO2-=bixiOh>*cC7?b&&i?%7(lY zRyG809tH2D0YPCzen5;%dkEC83=+5u(?1|4Vu5dlap^~dd55yWJFuc&QnYeFP$()u zpCizngDJ`|0|N7NsVu5pnd8!4ZqL+HhiW$qnEq0?@dh53p4VnQD%Gr$yTT}%_38nk zF>5pQe-m_I;JFt{qdY)v6Uh0g<_;%S2e8lc-D^L=zQ4h^duidEFDDgd+t}s-VWF@A z_636V%c<;|FKf%BLUK@g*&$$4=0a$DZ3O54im+N=i*(g__WJG}5E%NJfL}a&jSmT6 zx=Hj|tqUV+b09)5C*sme1p0PrD`4vH3ZVXzHQq7S;_qkj(cka({-RrM|*c#?;Pk{#yd!dJ5XO zbdV57Z!sK>40(^8266;q%4CXThRA!b6V&x*b;2kRn3tr|55INp8|MERetW zw;DbO?Em}TsS zh?|34;5ObR(L=dtn-G_BLz){+rlPp?CW$zla#703)WNPOI|Zzpef1E&6&F|v5c;A) zT3XWdBY~#L7jn&YGP1U%Xe?G9TE(~ zfROYPbEePHMnc{YEJMv#B%kvE67fGe*@O`HxwaGeh)#wENda-6yMyGvE6ACaTZb?6 zAPxVGpgVw0dz#O4jQWr1{j`-(|L{+7EXKamhmf6PC&GtYOn8S<*EHJDl&@`O^ zpcaNULdXydzg2iRn z=zU`|6wG{rpn0qtH|(239Fqh`ra8OEeMOZ-pDO6XQ*0`}aW%wqh2Y79jm$7&lkklX z6X#69`MLf$k@TTj3o-izb54@kn6-Vyt;AL?*fR8^1P}@oSZ}T%4FQ6FBJfSbg>92< zz90?-(Xg-kCi{t8DadY9KJ-o5Nz}!HYM63zG4pIOZKDGBEYUgP!PIHoH+>s%)@YnT zq`fO-X@*or>2FpR@?AWux3~B9t+Vkc)n9yP_a$&0rnWmp?XIuODBUc~bk*%#+%eW}ei(H1VYJrI{gxFU<^t`SK}Yq``fud6KWI z^X1E`lA|3Rq(dP-+N<%w!>ki4nAY##D#r(e`7O~{{xUVc=@vB-3D>HP`3N7JKWp(z zr2P88D*8SY`C{EsEcoY1Ho2mGA3ikM<^``jX}h5_(b=c7+n=g)e5%fiQgzBD`)=qw zmpPuzx?nl(7nI}vjCpA}?h`iUx6rZ2Lpg4?p5rXDb0(q_yEcH&s<$)o)L{(jZm|-E zBs#hAPIND^($W&qdEKQcdM9>^@U*kReN)ZvgszOPry9Cd^hq@bM1Wo>o3dPUGQq5x z1uJl?GMiGm+fzt3t?tjJnTeliHtO06ZmT&ASTjEdy#z$XaaHc zwm*pvHjA}KW785Zo04tI7;8s%hp+EQ3scOQSTUvRN$^<+S!VSk+s& zZXcSotG|ari@=RBlTj{VV|kFB=nA2=2L*7VtBSgyxS@+u>K;0DCb=e1SDLBIi>{JS z+7|af3l28F2Oit=ny^9w$E>L|j*P=Nx=6b|GvPVNuQA1}xLrF*VL(Z?{> zqUd+2%dF^H>M|+X9V0DIB(*%zR({H;<*AOVO1<~R z^Ow>570QPw68J};T!Au{#_CARsr5RK9}S#TK^G2~yo<$;*7Zf+#o|Zn8ilUD zLH?Go1O+);Rb(KJ`vH?-TK!pT@1f4lzCmtL^9f=ztN9S`GOD?rcNx^|UfDOq4LY9c zXu&j?6Pb?Pb1jCB4biPf=NT604#wIy&~GzA>4Cli21ps`Jj`EE&gm@N-#KxRIA8N( zPt|qoikx^GE@CsG(EbK2$3uIUZ5y7s%Ua8Oh=?P#MocU|lPK>=ID0F{XYDR`E=&82OdldWUn5)4 zi;9%CI8W!thlM1wMV?DxkqdoNPsYYex;3=ec$Bn!hwMSyd`f#DHfDFhkRp=cM&n?^R(7qyu6`Xh}~qKB`rzA_PqY=V~Cdvbr;z$v@qL>PH9$K zUD#OSFALd~k6!8+7S;h$@f9*uze&c881nRfi(W5uUt^6Yjd%i^)1aYqNXRmq<3}mX z!CtrhBjVV&}$__to({Jr1viE3Z9sn)_G?p%AKvHa}wq5*3x<1 zi>%~qA~VYn2Q$r}c6m=oHQR+!qID5b)V$z4ucwSE-1_+CrsFs%Qbg1L3O<-N=l15y zi{X9W?oG%qo1VX{rH-A_=`d0PHg5fnlO(!~M8||^{iHDiJ=*c3r{k`Q(Cy!UdgpIF}qXn7un3|2SD#_m)^2Lc;%Pu~xFLvkC`x9JCj% z+n2Qw@0QtjVy3%POO7S4v?%lvnqF`x)7W+N{^m?Vd(pWXuHtJ+yZc!Y2FuQcWR>p- z&+ChiUN%^>(7A5q7fkmrTzK8dZTJpk8c8aIP0qu2Aaw8RlO@rIi`~l#$&g+yD^#fN zxRS(9$5Z=qe6Y-%Pzn>(h02oa&nYAJCmSwW^WrJ~sa<4q@iX6eN56rHw7 zD1MZkC>v3>DHGlJ{hV!*JQ=DvZI1Eofb51EF1c`=yFnfgZK$}Y$m2X|^)9(M*VgQk zBcsz|;`x@*X$RQzt1kJq(P?k9=XYH4FGr`n&z_IFwZWa8u<)y{N^PN6<{3v;% zmkXfEBTshAQ+B&o%M)RTA`}-DA>B*T*Lsld0T&f{+^g;fWG|fIq9PQ@XDZ|~A^A*&d?viz zy&X2=#f4fQP{allahu40%wuDGY|MB~4aV)oAg)F`e)%^M&M!i7Q4zAe@;#abn#7XTdgN%ui$$cqcL4$C}yufen5GI;P4gO}gr-ke3g_!ghG zm;!_I0+q{p+I>WJAXbOFkIB~{e#fJ@sL12;m_0bssAM+}GH$G5bn~e1TW89f#>!jt z|3z|jF2kMf{=WV{pEM$9D9t2rrK{yf$BO@6D+^cJEB6TR@_`u7_5R46 zV;?Ke_8>`kZ3|uUmAQDj9>pWi!n8)SCt6~o+>`9%@wZ1*TvSAK`IuvJ<;TR@WHc{W zL|FRm6K#Hb5sHh780eKB&t_x2@)JTkM)rbB#6u+n^5R0Rj}=0n%riNKad^Qfh6f-z z0MP-6MoEg^B}6|hEc6$l1LO08U4YzdABR5}DnfBl5g-$p@-wu>$OvB0`KTw{t08)| zeHscfQgYN}HfoN@Bt$?a(MIiZw?S4LWVK-wijXyhjk-n~#Ry)|xvX98&33muIU5Py zMMWO>w0nm=6S+Pg#YKgL>;Ti0cK2S+yB7o$;ync3L*PAxE)?QD#ChMfyRl2SsL12m z-CbyQp@~Ax(-?Oe<4&Usg~pxc<1!S7J4YGqE>JSrCcqbOzI&1~5xa_4p6p56jhwDW zjKT&_QuussbNj*P@5|@se14s;5^`#k;n=lYROE4wxx*M5MiYhR)}oBXPx;5olc&hn z<;l}Wp@H=?4;7a+#oekf+qGg0iahQS_eRBy{mw;29`~qw8=BkDM4{$R$lHk~3d!5A zWZL#CdA6Cz`TGGi#p9M0wA@4Gd!=tWWRD~_*yZ8dGo)`XSP+mUSvqEKpz5T3HB}$m z+o(Eie}JkqWjj?FN(WU#m4j3bQ;tz}vGOTZ1xk(`)fi7r_ta+<2uN```}Rmq`h zqf$xLHl>ED|5UkwNoje>KSDcRUL|-s=dlis`e`zsXC}^qw0_n_&<%` Bkum@P literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DADualListEditor.dcu b/internal/4.10.0.10/1/Lib/D11/DADualListEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..a70496d3aa7e5a859576375a2cda8205ba319029 GIT binary patch literal 11661 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 BJ|O@A literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DADump.dcu b/internal/4.10.0.10/1/Lib/D11/DADump.dcu new file mode 100644 index 0000000000000000000000000000000000000000..ecdf5891f6f44a18021b176535b37572e7ecc0ec GIT binary patch literal 11936 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 IN^|`G4Gt5cr2qf` literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DADumpEditor.dcu b/internal/4.10.0.10/1/Lib/D11/DADumpEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..5fb08d04eab68b700b6ef62d915236da5daf256f GIT binary patch literal 10534 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DALoader.dcu b/internal/4.10.0.10/1/Lib/D11/DALoader.dcu new file mode 100644 index 0000000000000000000000000000000000000000..e9d2efebfca8fabd0093e23f1b5087df9d5e603a GIT binary patch literal 15621 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

MB`-kgG}3{y*?njP@6iCaj{5makp3$= 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 z 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSConnectionPool.dcu b/internal/4.10.0.10/1/Lib/D11/MSConnectionPool.dcu new file mode 100644 index 0000000000000000000000000000000000000000..e36d338c919420aec4352c894165fb085f9145a9 GIT binary patch literal 6571 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSConsts.dcu b/internal/4.10.0.10/1/Lib/D11/MSConsts.dcu new file mode 100644 index 0000000000000000000000000000000000000000..63e988398bd21063585a770bdbad0563a1a2ebdf GIT binary patch literal 8308 zcmeHMYiwj?89qCdrIc>Bdtq5Hl5Z=8-K8Baa z<6PPuR9qq4)<_T|K@-uC=noT3AcmkZhDbEgADZ~XL}UEn4-=G_h>0O!SfBU(&N(xC z+OmY-_Q(6Ro%i;=_wSugXxi>rXxdL6uOHhr@yENg(%`&a^}Q&Lp4YbD9$Z#4%(Cs7 z^#i421Hqtf_5LgcJIm$!GwgC;M1-VS+x2b~OIOp{+oL$Ny_HvQ{QP&?LsMR4>-pa+ zBPUK8p5@3H+cO-e`{w6@Uz*lsAf5H>SkqQ6KRF8}49}GJ9DVO@^GL4NS?#m0J@dPg zc_f!JU>@la4x8gc_vlm8Q+mDLY@X8|So!xY+coX6+qRAG!2j#jg+`-U*Xv8?wDant z%JFTL-Fn>(;;w#bPLB;JFTMDzX4~x(1KRkuvZf7`YUlBDwWeteUjR)&H-#sH&|kAH zX=#-!^o6;4ZMq(Yepn!H5c#zr2ZpFk3rRS_H_arJR#{YiON#MNceKig;?eNq89(u? z0-IZj&1jE}=f|Q=ctkj_L$NIgPZQx72%GYu#D>gF?NHc}AT~Cc+i~a~!+OJS$|!MS zT^8-|2r)VeMyC=Pc7>Znu?S_Hgr1OR3^R7R!uKTpMdTuqv6vJ|Bt`vISlK$D<@+HzWYB&&)9}waQMSUP$5~i5HE~a0|3QCfZXeZ9oVzmZ2Dr%0dx| z{GX8+i{+VkY(k8A{EL7?#%$MEkz>LLB^$*sO&P>S%Yo<}Bzne{j9TI#a1TTB5 zp1g0v3#j~A0``FdBGw0)wMX%sQ3$);7exs6 zj0KrYX-WR9b_{PtS_P&{#Pk3$WmS|vO@*p7&B_49$33C%t<2Y^s;6Z!|3hMQGZ-NLF9GM47)+Gsu$Exkut(v`m6^PY>P|oCe`ngBzhM_+X_$Qh!hWyI)yqKA(soc zK1_7Oplc!csn!w>Wl}2dG~K&EGeI;v`eZQ@5$X1dH*ZI-fq>kKC<2afQzRlHPc0x5 z+o(QU5m{8{{1l1YKtxMn;+e=-t3XvI{YIc4Q^gq;83HY6p*=5Me}nriB02;j(@)Sg zsD4pBB>uu>0d|^=!+!XMxSPI{xE^(> zS@ioAeAGQ{`>41OQ&96c5^y3lAG?uN6R470p_!kZaiJ=MK^M1(Q4L|TerY>(y(3*? zD@o6gq&qJnDMEd9jT=ybb3q&A3{jTRRFxEK?)4;M2qGxQXlhN+P)Fb*o>Mj@$wN3v zhnb8FuA!NVswWaH!fao#Twa41k7qA6t|)A(g!~ET?B*;^kiJ(z-yREPeGUn4g%T+( z59ry&iV_g@O`uLu1e$e-u7^NDlzF~4`B35`X?t^EU)W`LOKnrQTRy_~6yv+0`DAvQ z#H5**X&8#HSzvRLH2fGegu{wjU{)TF?jRncdbK0X)m}d=aLEmQ(_z7w6dY-<6Nhio zDp%=Cwu@oHa070|Tg-&hq|JV4lVhioYc}<1l`AuItHBPl4Q1w5`eb%bN4RvxA;%NB zZAv^)Fh|%JGzu*89+V<-6|@wpR@tvF8Q}^V-$l6OB}Sq1C<&<-GTW0WGadS?GMtLK zo>|c5EE(n)41*#|<#>x>13|^qxRu?uQLkYd;bO+;-eMb$zcPh+X02EWzd-DdT$KH~ z9e46khHS|K5FfkxMy0CbM;ol!H)(q}^whs#Ofs3UFLJcX)%qN|j-%r>fb1q?XQO<< zK9AA`Zo>r_U!ZRjLH3x${24%1bO6Cui24V5o}zJwJ$ln$pQi^!;H2|+v3UKNq)15N zmjVeueYK<`Sr~c~{skH6J;F554lLLnPq!Eox_XA<1Jr*!loEbwSUEjV)3(C}o|+sF zYEWqrb1e9(7eP^@Jiew_YKI0F1P4=4vB4vPDiqita7<`w6%3bGsQgL>bE3X#rX<2j zLb@yhFOMop0pjX=YN9u{Y+vt^(Xd0&l#0Z-C5hce8%$tS#^|0kU*WfL8`UY5c?`Vn zVZ#pdK(kjjL?gjYND4dValkR~Xi47zG?zfl8u@6$-SauIrx`nwmJa)f?4qstzjU`` zle=MkAwx)<*z%T^Pd14Btc|OCf0#B-L6a^4_L7ztnNMCN9h=Z`iN_8vO5Ea{5+!X^ z3!C0$7mh5-MH4E<SlMdcIm8dvFMpu_ zJa~xaeh#fDkS0<9s?ubY#pXocjMdv>@C0bUbo@%~g?1Lt^w#tyy~J_ULT8XnIRir! zOgP0#K3R02^f0wz=%eKsoPiYxY9n!)$hI)yWU8*I_IrJX^F(v8D#+?s_+i*aD)ECH z#^zGSGb2|Is#nC`#h8*VLe$U-quAD|22E_6Eht|k$In1%y*^j3F7@p^@->eu@v0|D zX>+GFry5z6TQ4j(`}ABCx|^<6L>p4NMPg~~k|XyVlC72c`J(Rc%?1iwM#c*P^~_?K zeTCRA_FRySHon3Z>u>}2blPJX0bc7tXu~jAKPuyL>Zv6N6~HKIk*TTB&;uZ~>A2mLsw<)w=4n$>JgMw* zZX)E!Z?191b`w{4iQ7U+LA9px6=H)f5ECp8_PtWqlU8JgHrt8@JKC5QRA`b4A~i6q zljBoLOXM@wxdAPTspOn$sNG`?W)3!lz*EHPQ((1##V>RsO|g=eq0{Bs!0$#3$<&@( zUH({Ij~rtumizcM_gqH?rOE*Y zS!pL{Kz-B_c&1-0_9ghXpgK3(kkTrq-xDP7IOJsuvwY!9EE*W?@Yt?8+`ynf5knhV(4xV5f`SsMDngZBQq-%>@+xP4-2%(oIHjlN7CQ zWwb}H&0l0Sp3j9fJ4)Yj(we7l3rNuq+KyjNcII!M3ir;R{@Lf{Tj&<#751QVV1ej5 zy2a(VMe01F86lcFZrw$34U2D?`-tK?P|VL(n+y8F%u*TXdcAqN-Ym~AOwZ2M%dB3x zQodO`Rw~~zqYY{Yhxw~N`(bv-S&hB{)b2myjFN(FS+o)3ZCF!I!>!f-s$5UrNXSe?FQ8mcQ~=<@M#xIH;}jH(O7O^K8z_ z>-XJzul4k3hrYad<4xlIk9Qt;^HQKh3!QpEejxoHR;bDelhPN_2 z%J4YDI~h(hoMCtu!v@19!_y4!WB3_{ErxA|4>I%^h78vjKFshDhL19Qg5f!a&oF$B z;qwf?#qdRjFERW+!yhpG5yMv)zRK{Y41dn>7Yu*J@HY&9%kcLM|G@B14FAILuMGdj z@b3)&$?$E4|6%wp!}l3pTH<4eI<8d5$JH^ej!AVKQO6zXsH)TDv#z;|W&n_-rAY>P)m5SS40g`2nMrTJLD7P@?NuJr()-1bPzc_1^ z?6KHe13qWa?`!pL_|AXc=Si-gbL}G89lZIY#}0YVuCHtj%6^Z_EjJ2svE2hgSzBu$ z=nuJrzP47!!r4zI5}YY}+Wa!qQ3WeVaMWPL+42pQfOECFGH^BuI6UP zjc&P}ntH;r^)_$1$}aZ>+Fe0+(|V$2YgF0e3N;63xmp{WW&Z}^WvaXizbvawZ3M?- zgmRkUWU5#8oA32J?@d#yaQ)jlHW7}d*dQPLCWbx8@+XOXh6)*F?^DDu+5-XEA7uFF zHB`8o19D*dPy4;erGoz1jM_YJQdQdxTtGj|=WPgXL=^rY8RT7{mr2fWL3|G3g?DJ^Sj@8H}6*R;Q&aLZglUP>($F0Ami zq6<0{8ZX6QnmHzFP39sgq6uoUtl58T)qS}heOZ&se|GP0f9g%CYI8N#$pI(uCGxR<@fJj^@Yb=L-9y8eiVA9&YN1=(CS+pQY7rd?U!|UQ%dKeLWRGrg{*0O zXX*8->dpQIkNk3mS5s-WqBY5pJh!!Mb?{uTwY1LV3&)0Q|1Z;uPfdCFw`Xr%39i^TXqF6Ei9g)SXbXxGncT3JZ#3!nX8@9=t+?v#UwrC?L=^}o*dW<--`$r$ZH59pYe%R>G@ zoBzWV4Wqnfx8GS?HP__}PMGOj=he6P=Uhh?xf=}?ZT=SWw4t8v@;iSs#cM3)_xk$f zw-bCQ5NvB9X0ZtF;P=YLd-I~{P-teGzftx(gB{KC3rotzd(t^X6m@0BXPdpoYXh?p z6~{Q?Q*LqUwBT=4;8{3zEJ2l9U1RUYx7V(pRc3?@3cPWA%R-vL$3^=e^9 z=j%JYmSU~Eu73R(ELbXAfoH1^HDOWGs4%jwtu1(&+|hqOIJprHX#jGa>}s6T+T1Zb zt|HMfkzg*(B~C`9Vp(%rKt@dobSUc#HkJkb6p`*mi^vdYwt((u)Ytgi+Ohm}*n>d2 zHWZWt7c4hC>@imgIobc<=PP`kGqj>pZbo{5jtxB0{onnbjKKh|k@hdVrgoR;oP96M z==Bb3cU|sk4#`#U*_%YLw!7-&>(MTaufGx{rQKDHh1)0a|4bxHyUW?;4^pKARL&MI zll`jBjz(Xw&Hu~~dIr2BR9;zIOFLq+H7Jn`XBKeIB3NMOIig{^1($ z$c9!w?@!sESi;?yA{YXc0x+#!xL(y|-_ibVZ+dYYb<2*|-t^|g5sU3eY8HoF&4#?x zeDBD3E=@u(tjgEo3mQpcP<=>ncP1y~BAz(cB+yj_h3Yhk~>lo7!&B zq|`=lA!%D;?8p?*Nm6GfkWwRjDG6X{PzR+7UrYwydV)40)6udMNJaYmHj+9kK|}C` zHk!IfD3Q7l;$8p!p#;?4>n4G$NHfZyqD=bf+VB|(2a{&}cM}Fibz385Bf0TR;*N|! zYpzn23*1hPM@cA+gD)m0*}oAwV7{+tZmjaPUdQKqq$AC(B*}9VWN8gSAJ0uJw4(8q zF>p@PIR)MnB%G~YSx|%P8f-uDauG4uXZL?J%WEbkUt69jzF`!W?4ZBK6&Rbj{Y8&i z%OBT#@k%}xL9N{N>LUT~8Cp?U1S?vCFXz3tiSlJ%i(~8SvNz3fW6^ij!fN z&a_Ox#7B&nRZ{7c%Fo_jh(R=%O(7`zuPti}wFWOGp}e7mE+hVk1bkAinwX;#Fl+pB zyUQfhUYIcI)5r4kx2x$Oo=`ZvxjQhFVOsF=-qqc{n$autCR- zvK!eB2~|;pRv;s(7LC2~=?7E2Db$!o`t`Og-I$%r?G5dXSiv;jv3vDE z4X+UA>k)r=@dZ&Kj`77q503B*2T-IxDMId?wB{{Oj*?wRGkE~M{Cg?in-SaBRBN%m zbE4AIYH$#_SXrJo*E|*QWT7n)NYNRQIorP0o6Q}~&z+)qhYpPX(wm>KS}}E<7$l98 zr(SNynNT8hE*4PdyeT9&HnE^Or%@6tH=chAl6+=roCZk@G3wZAIoQSnE5V68V#PZnm18jQrxI3hG=TUGbI@!GGggp+?Ceo%`La9 zIdNPR?koB9c5DmE>bMzgA-`J|c=O)cT1~UcV9tfVUUMJKN;BI;k;k>lBP`}!#)laFfc1A|QmBqV$iU~nL;$%~F!w(LgKi^}7Aco?F zqkGI4<#7@s4^ln$_^|3vJgJZut?*^A{m3GhH?269=zM9`Zx9bLf&?|E%27TOjr}yU z^C&Vn-f(Oa*Ub3&>J!!c8P!as<|4+;kbZs0n?ehS>_<@0Af4Qod61^MICI*5m-S0; zIwZ*f*J5D`knsE~?t2UCOSQ8$B>Ow+uT4JUHB$?`c>dH69NuIqLhsR^dam@4XCpm( z*(F7n2!$fF;xkS6dPiW}jjS<<(4o`dIiX;CC|K_EZ(V-(eH_DyjhEa=D_+OjXIv{V zBD4kTKKTu1)M}?TSuSdy^gPX|QKahf)JzQ2YA1%Ns}VL`?m2Tkt%VWF^b3v}xpDQh zPdxuV=YI<0crh@}6B znNc~X-i}Er)GSjs_z=dv%(n`0%BIoZedqj}Jj1B0_~iEBgDz1~brL^&2z+QcYlAlf zM95v&_yAMxWd$H(v9d+df7^7}q$nN1Ze= zO^7l&^U5oa9dgT3`AqOq)L3%({cZktr)}8}ZTP4S1Tm1kS*k;^RmMVqU7-(?vCroz zb<1WxAe4iIv`RvXY=S2L^8QvjHJAzKw6q5!jCJ#$>4J8=ZW-6E%2`={b-BIXUR62! zGH2u4kFN1rD?w7vTRCMEkm}}C*VNCcsjr+f+j%ugHIBOa`OaAmNBt9YoL3YtQeNq_ z&#ZEg=;i2$I=HLKQAXAIv7J1OE1^v~!x1O;P_PMMuN)3M(=hQeX-BMQobu(J_jS=!8Y5)Qcyxrl=iHh#Od05s2`&b zF5xJsZzlin!s~y3V;n1b+2;L;We|%Yepny)8_C!b;V7EXDNx|=B$b~?3M&BLM{==#h`D8}Fj4Dc8tG(n zq<1b!!>FGz`Pg9qWP4- zM}Mrde$&?V0Q$JBPHh%RhgzT(l}+1czkOp2#Q4LCRz7K4N>Qk9qsLyQ`(8PWM~Nuo z(blcEe80s#MSGy!$*$gb=kF!=6z$Ql-aRGq9OqUPv?n*;r+VT^36_PGC`BH5+>a7> zI)CP|#yv%S2(bRe+r6(c7b z4^lC5wy_q)$o~9uDrwv2;YkoxcP5Nw@uHTwZla=^`7!naijf3kir!st7R88?WQaXG zRsw#2E_$hxUH99x$L?oEG!jlA*Uh^BuVlfRf{}boV;sqTiko<_b$eECcz_k12{4NO zL_*zchkk40Lj|LG^eU-gBCM)A4tpMEMWcYFuKI(;x|wf7M%E(*e5&JvGG3+s^bh>_ zSFDKU$prjvw&Lgcj>igeRlAT&#UtEu$Is4M$BJ?kqXtQIvy~g3+3`d{p5kjhoZ~^h zclE2!KFNx50iurhSdnh_v+&{O4FzKfrQYTDMiS@2W_Pkb^dBFykrkbN3c}s&@L1cf z%>{e~=PL^VD%-$Lw(LOT_NQ6V85{{KR1~wD-Jf;)4bR3zkr*Mdx_2^r`H@TeVxlOK zTsOO_J^SeMLK7w0wAH_pJwJ8a%B@0^cxE^I-)k?qbXx(>jwu|pgO*O#*K$qrORR_{ z{uoX-+k5Y=>t8P58>Xn_p_7e$=a%MISWzl!MA5sM-LfX{)dHUOYe_*TyEOH)6+2lG z?GH3+H}hVQb;)jl9kp6_vYTqVQ~oHhqv+l2Crcjr?Q6pF_$;B5tv_emS9^rz@yu?v z+qwT&Zx--OCvGwCWG~hFX1~pfXo8R9b+Zqagpa*bfM-0=J8GftWD5=)-nx$!rNuG2 zSx43xf%gjdjxVy_bTZ>5Yi@s^74f~8whVQ%vjbbFd|1F&p-6Yp9>WZlDvlX@gCL`#m9Y;*_4wdo>=UXUlZi5R9JEBqrrF@0GAL`z z0x>EH%ojy9&zp!M97)l{*mM*IXKW5o<1!u>NN_;ZOvG4=!EH0ux3trle!#;@A2lvQ zL}H1?b7QfxF?IxlR8aW4GmQQ1980Yo0(3whs9=9%Q|a}OrP4XWs;ixY=$}Z}6=rHj z8x$kx*cNPyQRfq*UeEF^k?_f8hmB_&@p=%R0%tS5#g>GYJ*;q}P3OyI7L(1S;(OTN z`rL(Cm4QfQ{>Djjv)tIpesle*sqC;`8U$|Bz$K$CsjQ{Z!}R^`!j!sDYXqp1UH`q@ zjcoWCtbY(dz9lmDve{LZ{3J|Y8El4WoUYiyX22*7)@A~Jjmz(9K_iE4$?!9|%)`ET z=1bc!#p~1^psfA7EycOGnfgJz9|CJFwqXiM2OSbWR@IS`52Yg$ zT2CovCwqdlyH~$L)y~7#^aEwPib9r(fTq}qO)TOa`03a;j*$Z&QXTkEyaRV}*oV>z z$DRll=O+BoeJ49Yh{lytLPUwWWUq=i?nH>_Y5qty(8)d{$Vc_v{Si!4z8;3T$Fd93 zZF*WFDR9+^!aS$BQM@+fVIz;&Vn?mfW~~f3kV$vk(1Zu$*^KLSK-GyaqeCXq#w3MZ`H0H!Di8%T%YT)pSD9uea3q5U#(SDqYdCrM3qxx$(0hbsxpLp0K z{R#RDLnSh6dDvC^)&8?m|A}XsGA3#1Lzq^gszG6hwK;T>z<%c0se37~A5**KvG~BQ z=7^7_71CM55Qu67K1*mFhVFg^&chx%HH%VcAYy|fPE)ekPmL!sa=xlk0aQ|Io_PE| z_u6im%zQ#M^NDyfJ2>VOX@wLMLt?6iK2LbnFjN8buqXZ*hIXk+QBa|)6YTKfXR5wm z8VqFV2G!CH@s>WwK{uooD%0o?psK0Q5g_%cg6Lrz{u!n|u4+{RQ%|-HjW;^WF~vtl zZ&r=o9B=e44!=3AaN;S#tLA4Dv<&kVY!BOfYUV51SfW9?S5<}%=HfTT@wUA%Wn~)K z_N;2#v+=ea<#5lY71Bw;AUH9JZ6lOg{s3W+f;S8 zLETEEFgGHJlz=sbV{J<-q!S^<5fLm(R4%7CD6m~6q<526L_^uqMT$X5y?D&t$m&`2 zjE)SMR(reJ3O!Mc+Em3V>nnQd3HCsD|EsF9uf{1`%VAy>u@DUtrDqd?xC|?zQQ|d9 ztT*&rs5U?cTiUTim{+Bha=-;jCxSQ;2;q`W>6;hAHZwF(I><=6-XK!}* zzo`Pe8D%6zOo(H>DSBiOR+OcGC!`YeNE8(6FIDSn14bN5MqBaps^2-8OIp$YnySTX zl%(|Vs;{LLj)WO;Cm+$(EkD2iZq~h`{~fjVJ5+l)ul-J1Asxp>pN&LU{rQx_VXSjS z|9fiH_o(WsQB~VtFfPf2`tu z9ECfZaMyF(kJAdjn;17nS#`Om{18(Pf!D0mM}bFek;x0sso*^28>}?Fm4nSO-Zr7V z@lwJYC3W{l08RO3Y-9Nh$q zZ^B~N>SeHEy)8BN(YuEQ`)w)88wi5sVb^094d>9?2p)Fhep{+iP!e$uyJ;V`UUDwhhx> zfoj9{?_*=3Rrwwie}h~>dNThmApKk_jC#HTAjTfbHxc8jOPGnVHCag&e$yugW;&M* z*ZsvX_A54)O)yl@^Bkrh-HuhmA~viOEEU=leWsUgT&WwSa#AalAQYQKrq}CqD|Pt_ zyVw%h$};`OYm>WI>c*)&deJ1Zf$o#iS0%5+s-m*>G+*>dsoRrRtkg|ZsBW(LL(fSS z&8DMV^Y+h$;>CmDb`e|&ulP_}u~}Q$`lQhZNRcTj%cSlY`y}gLsx)2Uh}Ir?L#k*u z>5Sy3_Tz>Ea#JyX_l180MBRPq$C^z*y_na1B&}H0f1C;W+g0iyEwfB$(4n$pv@9XK zN`)nKdF)ZC;#!kg=wdMPE*orlHDOlsijT!vKA$ja6_&t!V!c%1F%1`(DMMj)5M~3f z_(U9L7h%pZ5}2Fcl`3vFUA@?+v*Jh7H2EYaXL9qB(E z4VJT}DaLf(-We4SdF5?s6S6Df57JesYgX#I6scmfw#@hGQ|)AK zkIEVrmEZMA`YEJZufi0nz5GSRpT&31oUG22uN&1SKA)k3paz!m~r&Fkz=6LnrAYvyxn z<~1a$(?fM0b%K&%_S-=OjKzpRa(m{y_r@Vr+J7pe^g-#E#CR6;tG=wfS0m) zaw5Rx1o$|w^Nym$d;Jylrp3bAmPB>#r8?_*o%fVFA0DZwF?FC$6`L1IRA)8S*~II7 zsMPsrYsEa%Qq-Bva+VmSudogk506PSC@bpIv$bXnvuAkSkCeI}o280tOg*Sv$EI~r zgEm%djZP%`Bxwiv<2hdM_{ovW>qXpkIPrqavUq-5g6ADluy}k{U=Gyqu#C}DdpeY>P^)3A>5Zo zmH!pDsk{-L(o`v~CwX^)OiVtBOvF$vA0qdh_#b&>+KEN};oK9wTEPuHkwC2DL-77>Y#Z{e8E)N>+^<)vWHWU} zBF49_ZGv|kxv~l9-@2~xuU2wJ^r?j_GYU7T%(CP5&ku8sUax!aqJ9#%RKwo}c_Pbw^ zKEX2wLj6sh033LV2xJZl!klHldnF=s7ndPIj7;b6c9Bddji~oShNB;xzU-DJ7R({= zUs1&ynqq1Z{b>%kE*`M!Z)vyPNrAL2oIX&O+0~bJ=PeXEU4Q**V4$W+k9*!kS6?V| z(+re0zXG6*{c6*_T_3^lnnkQB6OLD^MQW64HO7L?>78HdLf7?nk>h*sp~{;KY9nDm ztv<53N|g>fj__LH{;q*rGB-Iiyak%Xi$b8`$ZB#;*fdZ(E!=Pf2H`Gv@a*0$>ghpE z-9uDGsJDwkVz3BNqd>PzpgCpI!D{m7jb!dU6i~tiT#148oDkis2PZdmLv$c?r0H&c z?WeB6oziugo9YMK6d4zbbc-kgIC@R5LkteMdy%Lf-m~mW+bvaL$FZI+it}w3*mYJ#q0?wDGnWecanc25qJ}fit7xyw`Cg z61&P!+!-~mkcqa5P8%-TxU@}d)XG2y-x0-Y(0HP5jaL3Tb5JgD`M2Y3zE+zXKZa_< zLyCI!_a^z=1_`0lsG($O#pTZyBD&LZrPdp2o>S)^+eD8|l|}C|(w}%Vb&au!d!h+F zF!M5l(>OE`Q4@LH%{6W%6ncZRpj z=XVmf+0(Ee3U3NR zf}7IoI2?AC3j3U;8-JkEG5HmQ9fy@UJ(vQy%_~(V6&{Ebj?}D%9;^oP9H@pyFn1gq zsIm4oywBO9jfVFzv^TvnxH64z{4XP1HcbHmM1M_~AUFX@!#R`tdK`y(9f!~YW=S-N z&VfLBZ&_)$;Sd*t#b_P>OV^M%UF)+pwB74?Ut|b8S>Sxwq+G@9tIj}i-TMMhA|8Lm zIOe(BUBi3!vA#L4KRliS-Apb}esbYr+*9CRh))60nV+?>>zR)=;`=Fnb}@6ZT0Co- zgO3AG(`K?_Rsy+oak%K)Wn255lXv$t^eeHS2lYkYPTsACc5g#J#=!CifDp#5+W2wb`vby%3CJylxn>2Z9a6g`{& zDl!{#6+M|2uA2N7lvO5!NEVL3%uYlP@9BCA+3d1CsNZ?x#H65pa^FE|o$j{25E5TC z=R3xekno<%y572ZRN3Ue^;RFjJO+PF8<=aQMcrW?XfRb=7WzX|%R|a&rfrqdKBl%KFis7OnE1*|$UudI-$}@UvKbKu_Y{Pe zEjhx{ZhI37V)7)Trgb|$iyaUBG+3^VQmUcpbxaH(FT`IiJ?7G9mn4 zRjg?lYGb9~wbj`|i~HyqgHIRn{W3e^g12bV8M0?+A`*PdA*3r^myzgq|*oc;Fj&`qh(qx**cdH}>?`4CIO5$i0`IihCiG z*uDQhkWYQeIHf=y($kgToWfN84d&$uQ7tqyQMM=A`xnp4lcC1x&&xHaebRYZ+1F6+ zE7G`ru}!1X7{$lCmB}{TAAWr`T%n|?hv{^O)+A1=iA{i&MVAsu#dF)D4hkumy|oW} zbR0lNR^RZR+ujO}qzwB-+GkD@3ASM?!#j~fH0 zeA7cs%H?oGh+TJ?mAp|EhQEWukqSi|hTOwM0_6kFQcArr>xUamJvG>&S$k^AYnrsq zTF5idJ>jwm7w!y=E)AYZs1cy>&dJ*+_i=Y#xg}gSX-J`UI?)r!N=RI}#fiuX?^#VP z)rd3i&3tntmekm0uuI4s+fzSQ|6y+TM0iAn>kJNOo2R&1Z)*`ZVQO>Mf5L2cxzC}r&b>ZRAsHi;(<`(|EM|+%N z9(+PZ9UFJVahRWAA(WK9Y=lUnUhj<170LStQ8q>>3Iy%NRL2d~5hGA5`Za}UKTzGF zI^zt~!?40HCj@Q5Hswq6_${}HEj1B+R^wKi9cUk@D5%)d9ieENpGT%&XqCCW ziFBsnDh5f6G7}f_9mSn0hDJMrw2HxYL1 z!T6kN3bQg6d63eGDy`sKIFmh8s^w1^c4 zehq})hOJ?T;D>Q5rV4YE&>dW;k5j_J(r`oH#!0H#U47qM)Z1`qW4TI5+hC}|Js#RT zEsli4EL?qPvsNM8@N@+JU~zB5x`^8AdK;cp)PAzJVWVRH#)!O@=X|B3DQn$k6V&5k zy^fvAbzkHu(=@b&$uS(-yrHw5tcU0BP zs-!I~(ddc2posS{xXLw~f|S+qsE*j6uzoN!Yvs_abwjgW8k+UTp;`NfW*r-vm5$_m z2)h!gv50L-L{>cUuhfnn#}1+Rw4qt_Sayh7*9^@H4$V4&H-0d5t(8Nvl!2Qt(*C`9 z3Ehq+J^FHuGCg71Vmf>MI06?qAXFop(Og2&*lkHsGBZCN(bzys#v~0gv{djY+q${_ylw>jMUknW2fX~6F z5TA72aLJ_0FzKu&U8+f!Y0_nzbm=Btj!9PnMlC+$@R^9uczmYdlZDT8e6}Z>@H=lN zT`uk~#>bA21D{d&RN_;OPd+{k(nww2Y%9KfulvL>3vHToDbg70=O}+}D8=VAb=Zrx z=L3J&33NCBp3tGxiZ9XYjv8j7L7~8Ll#fG!saO$Uonfr2oEPX|6r@uBHp2|hF(bm2qO!FVXxgKGmmGCn?hTBHgqenLQ3 zVw{D>O}d4c7p9;*1dQJnqFwMOHg-?8XVeLEFG}pzHvy1Gq#x8E$O? zeHWSwtd+p2G!_B}`Wwest5L27F20?wt2|A8Tg+pu_>#Y_);Jb8=nv@IfN}$H@eTe{ z(l?PGdY~_U2tYR<`Zg%~E<|}DaPcMoQ^E};@WWE{n+rHD^xHxOS4LR|t_bu%J z){37V&~+FKfP*mueV3rT1h`9pD+^qkNjFAav&Zr^+Xu#4^91Ws2ro4jLl}b!mAg>x zLgg-0UVH+jLg4K{$8_Mj7uO}YF2!d(?w>QCXYBz_k8vt+FnED`56br#&%@^$E57)z z(8Lm=th{CBwIl4D3(%ac6Op@NomiCR2-b zA1z%_1X8+mu2s5dH10-ns2M1IWGz9dB-ti`k88SAnl3#mjmB-BG!p`)R(tXtI(u?a zQjgvuRg95l=SfTT=~B%Y5DTQbsEb9qzy_jCs!JEV8tI24ac7~AR7AHq(%n&%sZu>J zNsmkE(t3$1E3&E5CMjKa+&EjRuaN4qaaRoH80i@aO{U_OT0lcNkt&(6AV;dokg75z zS$`WCsk#>=i?kh|%k#MS%xr0%uu3*q7bn|v<|K=BMYe8n@-)ewoQJD$QI54Md9JQ1^DURu}Q1o zzYcvi?k$ohTbiBD@2(jsHD&UBWblhLu#H7TY;!!qzA@Gi}kam*0It9R%t~Z z>SgHKGo=~n(!6xZFa8hpKD2H}qub%3<*YWNF0 z70jbs9o=3(OZp_q4=y}v;i6D$G%u6?MqACMROE*UZ3`|BS+h(z31K**;d2$-f}S`R z`DX?`Mb>eqJmjOJbvrH6?o#QGW2AGbtZH9kD#FjXl3j{+BO}_4=2Q+#RDzwMMnj1S z1Hv>$I+`?Ey2&QpY>~d#4FU|AO(xKtFrnIHL>8K1osWj*n~FJPwE=D*$PB60ph3v=xiA9R4T1_ucLH)3Aa?#SDE(E`J8M46}DdKC4!A`C&m8Rx^XrYf(G(#aqD0#Sr0X+EVj#_)f znrohFxESccLhE?*82o~!MY>l?w@xvS72w&J4vHeT8InE8YPFkFp-QUmPkKyJ=2WRC zDMN@XkV=v<4T98*Ng#5+(^?Ba3bN}nq%Htzw*qjXIbF9r$%3DRq?#5E{w~0&+>>P0 z-J|g`L{$n?(U_>EoME(`3rDbU{+7kOl!zI8bA3sOM(WRi|NXq zlm{9n4EQ74x)cs1O_oM!auf(uRy7ekp_RB#l`c*?Z0%9%_C(b+7%cdu$4FhlBl%xh zmz%B9D#hC2kXz2>s;u`$(MN%PFQ=DVS4Yu(ps!ZwYt0h5AHV%$#Hw$RR^$FTvlXj0 zCY1}UJIo`+w2@;lP*3L=##6lH7^a8|kDeR@AFnxv6cQO}-D^G&Z(&K9gXgN0AIx;%??%!18+JmvTx z%0y#C<~f8Xs;x!55s(hOuKVYa&=mqcmA96w79$G$BT4y#;lDOX_1<`32@k8TLOiLi zN>Ln&Xi|j6DHMd6LJ?Dk727ilpEe%VM!XeUAV4AJRN7zkR%~A|sYTHY=*9-nN}^~- zA-51TI8CcN9C9*fuvDXs0<8r!8Ukt?KF~s-K||22y7kb9hQU{sq=ou)-EFxBtJ#vH zqt9_9(Z{hvId068K9RNhxzl$#O^#|y(P`{ThF1^`=OGrPCE=%-TbXlq|p-Y#(nl7vK^Xal$-$9r4 z`YyU`(mzO-9s0-VvP-{04Q5<)hFrRgGK{CoID?%om4+#FsWmL5 zOUO`5mnDW4x-2*J(B(nHQo3w1gy`~|VL4s?WVn|u2Mnv}qBE|gORjMTT}q7W=`sbs PUWUtb<8ySe8(seoWM{Xn literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSDesign.res b/internal/4.10.0.10/1/Lib/D11/MSDesign.res new file mode 100644 index 0000000000000000000000000000000000000000..acad9b317b5343b83f99e058d1dd6a0a73121fcd GIT binary patch literal 38688 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 Vb8`=Un|0{xtg-l9U4LKv{{_KhplNgO} zsDp~qA_^+_0w@Zot$_HtQ4=+a#*U~M9Z^B$O|*dlL}mmL2IOs?Uv&^KfSM zwv%wZgNj}Z*U4c&sd~^E=8@Q=l-!Av-D*3SW1B)z~&<+K>7mzO^5{Mf#Hg=r@C0de7gw z@6dij`%im)2VJ7o9X}FmG=>?&!W~h_X$%SriZIdp4fie5A%_K~Gg(cKhzNJ4pQPy# z5fLbXx-d08-DEVSiwKf1njg;2Tvb@Wl<7v}℘W*VXy@j;vzoUR0(URbi861kiL} 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSDump.dcu b/internal/4.10.0.10/1/Lib/D11/MSDump.dcu new file mode 100644 index 0000000000000000000000000000000000000000..de5300405073e743e637b1a16aef650620b2c9f0 GIT binary patch literal 13535 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 DhcAG{ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSDumpEditor.dcu b/internal/4.10.0.10/1/Lib/D11/MSDumpEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..01a0586bbb19733d99f919eddad2ebe160315261 GIT binary patch literal 6974 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSLoader.dcu b/internal/4.10.0.10/1/Lib/D11/MSLoader.dcu new file mode 100644 index 0000000000000000000000000000000000000000..8a9cb5a806e62ae015030d4195a15ac774756083 GIT binary patch literal 16679 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSMenu.dcu b/internal/4.10.0.10/1/Lib/D11/MSMenu.dcu new file mode 100644 index 0000000000000000000000000000000000000000..c1bc648280f3353ff224d2d755afdeb45adb1eb2 GIT binary patch literal 8569 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSNamesEditor.dcu b/internal/4.10.0.10/1/Lib/D11/MSNamesEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..19e2fbe39198f10d410ee275d77d87bb504b96d8 GIT binary patch literal 6002 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSParamsFrame.dcu b/internal/4.10.0.10/1/Lib/D11/MSParamsFrame.dcu new file mode 100644 index 0000000000000000000000000000000000000000..218b9deb0db6a0364a8dc1703e3537deecdc7a0d GIT binary patch literal 5772 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSParser.dcu b/internal/4.10.0.10/1/Lib/D11/MSParser.dcu new file mode 100644 index 0000000000000000000000000000000000000000..62f4cdf55a1b07af8823165c7b706df7817bde21 GIT binary patch literal 5350 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSReg.dcu b/internal/4.10.0.10/1/Lib/D11/MSReg.dcu new file mode 100644 index 0000000000000000000000000000000000000000..adfaed6fee523234481eeb8660a1ebe4f6b6cc3d GIT binary patch literal 1741 zcmeHGQEMDk6uxt_nVqbY&1Ms7O(i6;)mU{%jO*H}B~2!2ZL`>9l3>#no!q%I8Qq;3 zW+u_35d-2w2x!$(P|(_E5nGB{eX0#oN-0t(go5}WDAx8xDX0kDo;#Df+vtOTzb>h6_ z%bewu=p|L1D7HgbK*EzWqh?~SMNx`znqrh%@$@JYGDK}Y2x%E1Qw&1icC0TRI(*zr z?RElNtJ+q&f3NNsB|2<7dZ{#j?M3ffVkF_{Gmaf11bDEd2LTNbva)b>8*=)CZrO7k z>V&~7pWOQzF{FaFn-Cg6kl8q1&<0({p(M0j=a6#w11qg;;CA89ZkQ5KqqEeXAD>R% zv>I4MWac0LX()1z>(eEgKdv2)osroV^j?YzXrb#<20Y;zdPsqJ$?G|1H8OXVDyZq!sEDeEy5`RMgzn$7eNSAZ z#wlB*_szTDV1b4@WYZ_jEuUL5OU0QTJO2`i0UL!v1sCS&`s)L#5kEZrY2Et$t3ls1 zuS~Edz@jHf365kS>H17nTQ9lRwg-M)vzl404Yc(4`3IwIXvDWYSfAMdA+fRc$JGHV z6%8VCetq%FqfzXLs~ePEjK#*r&vT7G#<8(|Vc+#WVu&Ek*|Gu=ybth@PaeEkjd(%R({gi7iF7Zaf(XdhGu;%ljj zZ)`vh$xOkWqmf#3@taygFPwSnJ4|v_-6u${CS)0ms*=+rcZX!NB=?UUJ;qM*>FISCytO67IzoDVW-B7ya`Yzc z1)V*lbyuUVH`qKTCoeP<_Twt?HI^cc$>m3lVgzOz#Y z4;ssvnTNqxy~e2Pe?GtZ#v=>~tK}IaFC=g=C2ZO(ETnKICA4wS&OsLk_j90fu$=>i zgMAzv;9!!2M>%+cgIzID<;AqHxLF9>ghd&rGBQpGq1=d%pm$O@i*N?xa$O=T;noH8 H9zyzUyTt%c literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSSPCallFrame.dcu b/internal/4.10.0.10/1/Lib/D11/MSSPCallFrame.dcu new file mode 100644 index 0000000000000000000000000000000000000000..710d0a024eb3312119ffffb9aba2044291d30237 GIT binary patch literal 5593 zcmeHLk8>2&9e;00E{|{|XEu3iW1W(c;}arGOuYUl%Vw=Ycnhs^SndNPssGo?AA1 zlc88VVS$7ZjjLU09ApL@k`P z^n|jL2N9e*3GC)3KywkA?}6+L6cvp__>poUQW`uIgM){hlxRe>c`E9}(BaHS&O#3- zYg&3btb(z@5`z}J_Mdu-Q>866o)Pkg@a#EBhLESDx&wwO_o2|&0=Vd@#^kGMx z1yfeB!=?|H>%0(2_0!1Mq{)jAYxQ8dw7r{WRLG1dG$X14;k*QCUn!?u%Pj}G-cVAC zwgL$rJ&S~HC>>WK?1>G+P9nsHFk#G0*&PWgj~$3mJ?9pR>VEQ>djTZo#-oOq>PTZrdl9iY z;FBCXRQn05&$UUpS{8ELgeTBk0`Tz(Y?vDn#_B-G7s z$wIZV_uwh-f?#Z+bi6YKLH*b1GJhA5lJ+pi)&4yM0>yOzSP!N44>;ObKI-O@5>-&# z=_w1fyT}KKTv(imr-TCK$MNrylb`iTa%EgM((XxMR~Gwt4@K-c1?z}u^Oev)_rX4h zl)+t?1aPkhD6hWq%`n5+(zs(EX@#h4G+cHUgDX=_k7p!u zsB$P(8}be=R^NXi)#4q)-Da1pG}NY^;S4vkqm2P5tR8WpsE#SK15#%g;igHj4cb)` z;=BtP^CvNSO)f(OH3&46&LN<{DV?z7h-KixoSfMc8Q{|Pc74b=z3aJDb*R|y9o^gj z#5X*EL9-txFW0;p>6R`G(G~H;>Fr zRfU{R^B2i2so753-Qk04j@}FP(&mOh`%;iZK$1u<4Q&a%cDP6ex0H~rC}yrlG9Es7 zXWNNTz=dFv6QON5+TxM!PrO+!~n?pb>-kUE6 zsC3C}gB~d1-ZI;z6@{XD80HkW?XN*I&$c4uQCy+83r+yLnCCA7R7&)hpjXQD-${#M zb9-LCa-`$WXX16_(i-phUXq+w`(<#Y5Ly-|^#sf-rpRe&$$T%lQ1#u&<;eb3i|!=P zRP6HwTPqS=P1cj3uhp06!r&x{Z@iTyx}12{6F*z%gE9y=i^aqjXsNVQDoJWSmyXa5 zp^A_|uy)BMlNOY=B_OV)h)3Zf8r2829NC9U$7bwpaFlQ z6!spWw-uPP3nFZz08S&krvTTu2euo!v5HD?`o1G{#3e{k)UUo4G|tsdOibK*PaA5l z-WKS@XW6F$+C7vI1-|$>3eVGm)BgYO|Km%lbU(LtHotFFDGnNfLz8rW@oPnRwCQ#79VW~+}nEYIxO>AKK zUItjc?F#HQEg#$5*C&qz2A%=|g*nGRh7S4k^CEZ(x_7#o7r-00^!43v44pwBqbDwb zXXNVsL^K@fPv}`g;{9;vf~#Y{r&5OCA19lC0q~vwa`4SKDJp8#;4lXM+K|||X(VMAn9K?k2l zvG%Q}gToZYpZ7d!i04z-{K-+VgHc9tEzJjwSu;kD)61TMPaxWgyM z!7#MwVo<}eXrdCDkO*!7mO{t%?f4DHZ~q#C^mw{bApTVXp{s-zdX2!~iQjKF|D6+rbG-Y$uE^^>+x1g~k97o9Rc@ z!YB36Y7~wIg);%+^Csw2<5#G!7rqDxe_soofY9I{8($L&AdU84m@8hpUA}L4R5Z_=klWIxIBMu+Rukm>KX370~m~77mc_R||Cn hWDDsT6?IGq?k7L+`9y&T4Ilsj literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSSQLEditor.dcu b/internal/4.10.0.10/1/Lib/D11/MSSQLEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..9c9eb8d37066eae28465635ba6938a618dab52ea GIT binary patch literal 6876 zcmeHLe{dAl9e;0gNgm1NCkYABKoTJa3sg z>0ixEvirWD&-=dj{rTSJB0@^vts>;mU9HPzo*lZD2>G4i@am3MSur*J0LfXQ7r6uh zInv)+D=f>2=Y~Wnpr{g#d~p_b4TZR8N?bIMMC6?Cuwn9kLL#|6H*C6U%oxKbkooCM}LV`oN>R9_o5YUBq*xQ1Ev;Mw(v3p%hSMaZU9t{P_+lrAR@Y` zs9d%w6-cS{P;?Fk+D@-R^db*BV3=Bea||qj5OUpY;So*evynLaD~Mg1p`hz)kTkio}t~hs@>3@K_V(W|yeL>=seFEvjn+s=N+Ko}h&Lw9U>^>k+)f zy@s7y4s7pLjM+LdioH0&d;inK)@4v*k=oF&KO0g)IG=E zz;|uAvyT8cr&+?-y!^XQ*TecQc}N$d?fqCxuOT+wjkT)crWluhg+Q$vXp3p0si;wm zSQv`MDzi6`R+gf{9+SCyJOja1J2jcV=Uo%#IBWh1fnv9^RboGXKSNQA5>imn2}CMV zeC!$u_|&$#;TV9Emcc4(6+;2j445U!*=?HM@AL>O?{OTklHYNZG5yZqJgA@GBpkHr z2O=x>8x@Go%0%s!W!G3Ga-hqkYk;Ddi4b&|Nhri4P`h2a7KhSPxN!k8po6&?R!P~q zFGP6u6tH^()kuQyxO8Z?5wj8TY%QcYC0moRaH?*Xg&sd7EXV+_;lJDj!Wc6~y zAw4I(2uT6Km##p-6EdrtL*ZSCh{v~fC{2`m9AL}gkRHfb#fkAC0v_9&Bj8U+eMqqZ zt8Hw~pxEburNO2QAq6_iq!GcGW^gM$TM+X&01{jrh?#c!>R(6PV<)(_O_K(Uof!)! z5iUEmxeF;Cld(ZVPY`1XgglwHPE^fcpAwU==fk@Zo!b+Z;7pEzPu(Z7d@I;tA2^uj zPtRI$I9fk770+i&h10p7LGD+mO>x`RwF=*S5UHNR2kS6t2CX9s_Vv;o!Fh0v2`OSs zi(0pc{7`f1`Uf|j;vUx+`&RGaXTOM+1k%M=>Za1tp-Eya#rrn$E}Dwh2F;ka zKs!)O?46@Xtjr*Wv{qf$^nHjk85ll za;-y(H{rGy-?KYflflC%JM|V4O>qaZAaN(PTiU=qPonf$9grA9q;(1n)TD!$mu@l@H&fW2sd`K0Sgxz>}gTxC$&Gt|KYiywQ8pbtXP&q znEUNjUBa&SSD&z^hP&`X%RSX4365qD*;8G@`q&4*v^MOLIU9CKA~TErVQ<(aZ2#M- zHY*}+|Q2MN18{Q&b_B`{8>cY!1kZw#t%s52%y#tr%}r4!kWjxj*bj$kz_;c~g*@Qs3l0 zscG_axC{pNjR=~>45`WWL0k!=$uHt6Af~>7X8|<%LD~Q#r_4afe5omU4eoiX#c}k)j1nC)Hi!x7+60*SNxss2N%Wat}H3(_7 z=XzwTK?ZwBrppFFYRGjCmJt&F*=O6xb)=ru=7hNl&3OjN$*HBSGe{orD${L)Q`l^+E}_Nqhf)w7$|ccN}w!Fg=HDZ`y@MS=NO%rWL0D;N)k(uxFAW) z327L(abE$%XmpG&P6EkX8uztB++j+SgDlR1Gl2-?Y!O&Jf~FJeZH!*-Fr*OrV2&j% zI(P2ewue_DE4HDe1D~!RAH0uJLf(L1{9ytiN3!hq|Ns5pc|agD!Skd-3Z##^Qy%X+t)S1|eIxT)u^W@}R_9BV<&&zoX(ZuL^ zIgeYMvGa1CMAWu!$+&Igk;Hb4lQnpfreqi;dtkvML+gmS(3!e@Xb~~%lD4c|lo&Y% zz8D!=kX7`+OD=VZ?WpCynVMP^91WhENEDyjcNxUeV}w@BVqb1oa>wq*RK_3Pzb#eI!1m^g`|k3Ziqv3&u)(TV&zt1x|htY=^eV9?k=%bA0G3sY@jL}9$bw=wM9bxnvjP7Lg7Dj6r-N$Ghqu*q7 zl+i_u1{l4R(QZbsW^^l~EsXXsx|Y#98NHFwdl0z{BTx*=Nc`~J=@?vAyf*V*9%Yi{ilVp z>_6uTg;fH|UN7{2Da@eNLZR@5A0Bx^@f_M@kLKBDhNEMF-T%AO+o8OzRsvx@pk@R9BNQh-N+?=(J2eB!?VIlEp9 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSSQLMonitor.dcu b/internal/4.10.0.10/1/Lib/D11/MSSQLMonitor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..69fc5b0463af7f1ddd998443cedce31444a2b321 GIT binary patch literal 7474 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 Iy<-;s1usGjj{pDw literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSScript.dcu b/internal/4.10.0.10/1/Lib/D11/MSScript.dcu new file mode 100644 index 0000000000000000000000000000000000000000..607b854a3c3eb9b8718f93fbe58036107493e792 GIT binary patch literal 5433 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 Di_l{o literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSServiceBroker.dcu b/internal/4.10.0.10/1/Lib/D11/MSServiceBroker.dcu new file mode 100644 index 0000000000000000000000000000000000000000..d07df44f3f6da9f69c44ff7bc312d20363aba31d GIT binary patch literal 37306 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/OLEDBAccess.dcu b/internal/4.10.0.10/1/Lib/D11/OLEDBAccess.dcu new file mode 100644 index 0000000000000000000000000000000000000000..e3edacbf2d2da88b4ac12d6a9e6c0eff9bcf9623 GIT binary patch literal 178860 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/OLEDBC.dcu b/internal/4.10.0.10/1/Lib/D11/OLEDBC.dcu new file mode 100644 index 0000000000000000000000000000000000000000..53f616555cde7117dc1b500c3249a864f2469e14 GIT binary patch literal 75455 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/OLEDBIntf.dcu b/internal/4.10.0.10/1/Lib/D11/OLEDBIntf.dcu new file mode 100644 index 0000000000000000000000000000000000000000..6d43d7c1e2da181754d622b2ea22a6a50fc0e3d0 GIT binary patch literal 21416 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

vuwb* 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/VTDataEditor.dcu b/internal/4.10.0.10/1/Lib/D11/VTDataEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..a1cbe9b4588587213571d2cbc47a6b6252806dec GIT binary patch literal 9321 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/VTDesign.dcu b/internal/4.10.0.10/1/Lib/D11/VTDesign.dcu new file mode 100644 index 0000000000000000000000000000000000000000..baf1b4cf676c5e59f885febf11b1a2df1c54cd33 GIT binary patch literal 8027 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 pSubMqS=Iq;7~45)vTak?np6juNM literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/VirtualTable.dcu b/internal/4.10.0.10/1/Lib/D11/VirtualTable.dcu new file mode 100644 index 0000000000000000000000000000000000000000..f8988ef17233d5b37da419814480937c521c219b GIT binary patch literal 48945 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 Bc8&l5 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/Win32Timer.dcu b/internal/4.10.0.10/1/Lib/D11/Win32Timer.dcu new file mode 100644 index 0000000000000000000000000000000000000000..52da5e25b64f4a8d088d04f716bef6d627813879 GIT binary patch literal 4184 zcmb_fe{37o9e?k|aW3v9anjVZsaNb!vWS%|=`X6%A-lFiv*w2v+eu4*q*wdh#gTLN z>`U7K8)gZp;RKYSA-0)qXxda2)IY|6mO*7TZ5dLhp>zriGGN)DsoIqYF&0?X?ECJ{ z&QaL3KbER5?|nYs-{0?hr`&{4%?>+4Cmsmgw(`?I-HV8=H!iPR8;%ds^b^RsB~|7Z zqD^r*8gP@_NUCy?ZAu9l2BMfXG@McBAVMPN6VkD`EF{`q|MPaSY-=)^po09_jZaa@ z5>5}%1F!vPPFfM}+CM;}N|RSqXxf*QGfH|Ws>GA>bG9?1lD$CtZipry<`bJ!-8hUG&ngtfA+mcB+i@3#3h-=5d26L?MWflO*48tyLuh_A%Jcno-su) zah`VIeTnq$W6#_nRT^2hvKA(WS$@%28FaTzjw@iYd|RQ2y&M0z9VjgXnt{&S!oK8S z3Q8j@Bi@yw$cH**dL5!VG|(7wRvWhU+3bX=jD!^!J4zcobD!)-FmyC_8I8;o|EG{4Z| z_pX-+2_j`vTAaoYnM7?kNYfbz7K+@YcR!rG=x+TsWcvl?GQ;bH72>x23Zb7U@_F>>z$E>;D)hLkQ5#w4MKqT}pFR<^w|D)D#rw)aIsfo{Jy?ETxx4_c%O7!O?tCM0_5kAa1+3fLSBY|6{=`_n=B^Fe=~SQs*1>It+Vjxu&Xoh=HM@+ z3cc9|G}^Z}B30^n>kb2lUfE%LMzZ&Y`T{%p!d+eMy=|TTuHI)Ky4WIdfCjsQk>Kg! zclSyaFjb4G9C+~`2U*}SNXcOx&L7*lOe)_VPb9SGwfWbdeJXLFq@C(7{CF%H<2q<2 zBS`E@f%T5Qa9c;9Tm1V+El|D=I_MV^0U;3cd$o6yiIs;slbVH0JT7{ol!N;kQQ`^4 z*^A9>(vy0vZu(?&gXxXWqP`Q4{GLQN6d!R*bi?A6-vo!^CEo%EJrl6qAKhRI_938( z@jU|6Vt_}Y4SZ7=^o*}c7CklFQdWm8+QjG)D=;qaO* zBNi(faa(ow4peJ(gFmfQ4rJwk2nuOoumM?JZfkpC-{`W!WWv`%MAkW1sb*6|&e`Z! zYrOFBfZM3s(=rs1<1y<-_H;Hj)|f&wDwjnwTjCw){*vkvm(y(t(S+zgPOBR?iKzaX z+v@E)DATk9Ra#u-VLF&9*gWp4(zb;;qcI1vplA-~%Mh|Vs~VS@eHrtTMVFYfbW5qp z7YDu^sNM>?=MCK(%)0vHr6rj~e_{H!k|$02OmV_cbeI)k1Ou|LKS5(z^jD_mJZw@! z?oxR7hA4zhz{2F0xdsc`<90wuWYPQo#ROp{rv5_^U9u7U2h2kAmj$sJ+3jFq+OSY< zPQy^X$dnt+iL+|Y7#h6xZHwQneKDZS@QFja-A7y~`V-RlxqHDT0omOgqpsbFIE0*D z()ta;9Yb6ta^s`Rr)&*qO?hh}bA-sg9KNbMT2s-g&zAnkB2?R-!?Om*wHm2{gH#TG zRD_K-AY{QfhdoOg#Z=3aHOaO2q)KP6IP< zF!~k2#PZGzIJu^yU$^RSN1izH)g?KMiHAxp&n-qDE--uM$By|gGXsSHOOa^; zOSCXN2xWYcvb0A($xP~V7pW#r6UsHayQ;?+Ie ztATmuWZ-gW27aNjz})@UmI5+#$GUu^zXPDyLUU})r3U82Qy(s9LhJH(?c5m~vtM3w ziRq|c(bmYE>a#2?)g&(0sDav`8n6d@3U=q!zbQ0~=kwrKea);iPcuh9XAU0@yb*kQHEeh8AT0KZTr>nNE*F#n> zWT)p1aP;l(mKoc|qmh{dIVAWU9%``voiQ>uL<3Y-1apa!ONLe?4 zdQ1`znYREVxAj_nhWXNE|r?0ol|y)z?+umW9wJEhU!B&BbIEw3-zI zSObLNcy7=5$gOZhczp0Y;*TPH)P;{N$45DQ)Q-1ucn61h4)<`llEZcm*KoL&!{<4C z7l-{E-p%1w4sYY|H#ywS;Z6<*Io!?RFo*MYJmcbzA$+W!S-YbFb9Owr9$W2rY9sd8 z@$`EB_!0lu`Pc}OE$r>_Y6VXd~zz`DYcht+L4 J59`eq;osn>=Vkx^ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dac105.bpl b/internal/4.10.0.10/1/Lib/D11/dac105.bpl new file mode 100644 index 0000000000000000000000000000000000000000..4070eabfa4b16891634a87749cf7b9e2b49bd9d1 GIT binary patch literal 495616 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 z

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

Wy?+OSosBnd(Y4yv)s+%}=7MM> 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

0c5V zHK(SZY1Cs4Ybu>*l{Rut{44(?O>kN5JL~L9VCl<1|MRCR1!M!iQZeuzs{o>4M{mA0 zr7W`&=Ck;rmSkkhw<}X%$;ga_`Bjfh(|htdS(aLz(D5zUpE8BRU|RVmuNc(4q(6hp zz*5QOkVpQAMVi(O)zKX8H`;m-p*>w4Z zZriIo^A}w*=X~E%_K#WV$VZpV=P}jkEomp}42enEz(ywZuTts^+J2Oqw?wORkkvqc zN@-!M5IY&>D`$)FR+lp}ELt*PWv$GMnbWkS(<%Io(vAM+k2|G{8#Gs-D=BJzSN$F_ zZ&Sb72c>@7b>mq~_YKX#Z1_d11ChQ=y5!kFotJrM)ondRZdu(HPwiHDY2%Fxbo6>&+TdaS+hQrkqour{@!U8e(AAp{N$}ZPUUtcz;fTqv6n;6e z`~hLeH1_LX5xqC?SI_C=ldZQbJUD%>p5c(%U$?`J{xkzsO2!nR_&!Lj@;S zIsa*4Hin=Bh)x4C_L=C&4_22CPwL5hZV@8*}i>}2> z>FvMD?945!v8$$S)I3bY)VWRCuL^ULXev+d1=O;~4*dY7x=@O@Lu=cK7$J-|jnYWy z^|o`xdC5_G*YE}145Gptq&)E2A`SOZ^Bxs|r#3x4S%%-oZGFKj(9>gqgYt4q_d7R`hnampMQ`s*u zWSG91y{IQeZXEi)HndVSqw8Pz?Mc-N^Jl657@s}5=8Vq$0TmaTsiK+fk#kV_x7Z#(5Vnq4_#-O;S>A1H-PEIU4HhXSG>qTrPd@LZP<#x%MvIA^_H$P9{ zY;~8qwRc>ed~jW1{&kXU`59Kf%FREhUvJBk;cFWu9P5-pk^FfIX{4r>%s%_J!h8@H z%Cy3~fU;!Wo+|07Wt(h)a`PXyX@&WY_CdZI7eP?2_13k?y4LDz_a+iX?a4pZSz3;n zdHOK@pX{Bbx1Mhnt7u6|SpDdKu9JS0nNq^%)V$KrOM%i-hR(y8UXwmd%FI`&OShDn zJ@VG9*aj-3Ytb7LXyh?aW7z<6G3os5=xIk8!*@uj41>k0t=eeKmZ?$g4Nt+=*?FC$ z-3>%nJ#(|Jj)2TWQt;Cw=d#5y2QD8jz*sH1AI@d)Jv_(xxmAA7a(+(vB0n#3e(sW= zS<>1lp)!>IrN9M`q{3C*`ZtTdjkVGl|7_vt~_V( ztBKQ~tn4a6oa9Z}mBgERjD@no3}7x-hLNn!hvgW!&R6un=j1{*Pja3Sxl7$8d?_;R zZIv9mqHdN=YMmxGJ^Il^%_;}x^AsQt5@r>Ca^7$S7jr3p?g}2N-Vp44Q~n?P?cdD8 z4(dlg?#+$z?KqW<<`$Z-@!+BH5}rYS?%m{BMbdi0q8sxR7JbHXU_N7f33}hq>-as~ zZzpB#Z?t1oX4EObfeP8_O_`Ci`r6mLZRj(E8L56m+EnqooLvKNi->IA)Y@S(>@z7h zXGzPZRsRIHtba?$Uv)x0hvLEazRlCgN2dPF`>~eB;VKe@ZbG;5t1#sJFLC)RyO~n$ z)c+gL#PrDHh6-(MnN^=-1NC{J54bN+2BG6H7?oS#$pU2v}Z+qTHW zJa-D;{NUP-eHz!u*|Bm3n0K>wY5&XP_cG6K+x&Rf5bpA>4;WkJx;zjg-oBj;J(#cO zT6Dvl82f00$hX-1!}qtM|J7rD)MLJy-`NlG?Gdgc9`m*Q&U@ZvZLI_DiX`+(@TVD>vrwJv73P@~7j|1tO8LDK&@dOR3rX?VcatZYp=R3j!*qe|9s_wfbWgj-Kz8Bm z>GBxJg4v$U9s^lW+q2zcAe$-n?D807h{0ZuL8cfS@EFKE<(@+x16efPGvF~eQw&Bt z23cY-<}o-+3{q&s>@+=F3^F|i=ZHbJ$6$&WO!pX^D+YNUgY(27;4%297!-R9vc;g> zHP};pdq7m6Gn69r-1%Z(js0Vi^YUO?@SJp2dz$=a9}~0HJ~QQ&c4qm;I=M3@|2Pip z=gSK{_ZNBYb3FIcJoguS?mywVpYFN;r04z;&;6%7_qm>XPTq9%k#~)4-7fdsU+cM_ z?YS@T+{?4F?e;UC`_Fpr1D^ZOdG0Gb_qTcOZ};3U_1rJB?xnWPS;%rI|Kxt*qL8|$ zDjSOyqtCR!pQH`p>F4<)WaA41{OP##Fn_7>-%XPBgC`F1i%Y-09O7bE{6F61Z3bSK zUz2qkQ1PTHuk6?_&}~4i$3V3K5s!gt1KK?XstxG!7^pU2v&TTS0oy$WstwrXF;H#5 zUXOul0}gl$R2y)}W1!lA0oNe9%&R70MC>Q)07bK5gxvq>PVGE0(2muI1LXUR{@TTskU(EfsdLKE00q z>?mfo!9Qv-7{lN>l@&+HipRuW7Xp=m2BR|9Ot)}K#A@L_r`ES5J-uy(Y|wG(bY<4OKXr=S>`y(H%f-~%Y_43U za@n7n!(T4bTd`mJWu`7}rAs%X#32E!9`?{vM3L zc8E|@v##cBXhycR+~;y%fO!g}bDsizSMpuQT|9enUCZx!n)xKvCl#77{7P2`6-)g9)twU3&bDp z_d*fmKo@3RTo2)P?*N-f@jsW}dBkZucAMm$>k+Q2K~B;+h-@}yYx!LdyD|Il-~at7 zQ1r_bCz6B1DMr@sQjDpGT(dv@BgGgUNHGE)vxV=c7@5CE=GU&=XC|i_{g|b^=9-zA zsm7tVaO*J}_(-ae`G*vv+GEysMyipAS(C@?Ma%-2^&fWqyEix0*!IU1k6Afp zn>=Pcm{nu8)nhh!d8$#5*)EUS!EhT3b+rp z!ZYwHyan&W+0^SxU@qJW5%>yhgC2MlD^3gTFvF?Unqyp6i{k9$tVWFb2y{N;S5?TX1$- zs&N@CgB|b&q@SE>Tnn{uKfD0%Le43v#;vd(df+c`-l?g^Rj?8sf~TP$-iGtiv4d)O z2)+j|!yvp5d8eTZbi)fU0%xC2n*z=7BpiX$Gcbc@cnJF79hgcRd=(VKop3*FfoI@V zkbg(HPNrQx4=#fM6vOS%0IOj=Y=NiX1$Y(Y-(R?<&{k(b4&=c+2tf_VzqMSqTlcSW z{R^a@NjR_x4#E47mqj?x3-7{|v+xJD!`pDl*|dFdFYJPTcn8inC)HR8&9D{rz+re7 zvZjzv&<0!J1$Yl;ol9AP2jE3`8#2#JHHx4Hz5-7{KOBV%KZ-f5hu!c7BxmC{G{7E6 zJD)f~8$1eqFaqfpq#ARf7P{bja0td=?#Cz>uo?Q{9k^sFc@AHKz3?tv_Hn|8ufR^| zhf^+0HD*8!Y=sfH{vvdQJ}`3dAKGC%ybPmo#x(SXW_Sp8!`qN`F=+x@;AI$v+)q$$ zU^^Uv_aT3Js!;*=!B*&j!*CQ%|75DM7@D99c0eDz4U;cPH7Su1|4&0s5`qBV5xjC2c|e)mYbV>-w^F z9pyUZGTI$zhON*CMR{1^Kt0>!a5Ft6blO3uaIU;7;g*!|*Q1zbP}RkFXfp z;Bgp$Q)Xcf@~@d|H#`L|!=E7e3d$hJzlB_Dp&fd`gseRDg0-*>_JaxOSCTfc6Z+vO zOu35o7Al|}w!_OX3TI!99W=onNXaK$m=AZt1MoDw24isEHL1pDU>U51C*frnfy`?u zpHK?T@DS{V*I*3Jn~htz6ShG=oL)d3gooi7I1HzMn)(VMh`__p1BYM~PWcS&JOrQy z*2Ckl7e?TW&yu#V7@FZ>*aHJFIY60!h0p}u@HD&wXV0Om!cDLmw!w?=Cpcv;c2Emn zf$zZ)NH3)B!jte8oLxlP!D@IK2H^A{X#&l#8G7J-m^zR83eE61{1T2r&ULiKunBg< zA$SKe=aas$80z7E*aLroGZtV63n2nK;ZHF6dfHhig?88i2f&0WHxMVd3D(07H~=GX zNip$&8dwk8pda3c+!ESlSP9#q4+h}$h2$BmhrKWY7c8P~z{Bt&9EI~r$sf2Ax?nH7 z0qHlU8q=W|YGEyGhXe2~oVS=fhiZ5To`E;OSVDP#Tj5@K7@h_b&I{4@K?QWf)9@O+ z2N#r~8#KTs*aNS@yKwPM#1SI!5bT13@HV91jGizb+Tc;x1Fyj-WR(*?sDL(j7<%AO zkaG)RLK|#>9(WDL;JjOD&tWT!z=fY9-=Gbif%FRE0@bh{cETW>eH(FrU9caHzzC$@ zj-D_dYT$1di2y>)*t*Dcn4pLIQBIb|4%p&8`g<6QT{+mK$R&2qUG!=3OH48VES z=m6dDDohU3cEe(bzyl!vp62>X>;8S~`r-4;htD$~KF`qZo&4eR%!ki2^f%{!_&oFB z^9=p#j1Qk@K75|}@OkFL=a~fAnl;1nG~}3bu#h*jvPeySsBun1 zOPx4qn|Zb6KuokpUTHB6HHw=PkuD3(%P$I7anR9;N(UQarEjjQ4##Q|SkMruDXeUX zh}X?|S6XUMi&CMUH*#dXWIx!29&59}gPw5nlFb93dY zIn|WS8c|w`vs2n#`<6RwOS>jGc7;xSn^rb?Yl9=PBpfMLUvW$5$NaiGYHiEd(EW~G zd#$yKfbH1P&Z>%G$F^x@WM*rfFLt(!KF&+L5Fu~;7ueN3oLJ^&%D5[t7QHj($fv=Z4+W9iL> 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dac105.dcp b/internal/4.10.0.10/1/Lib/D11/dac105.dcp new file mode 100644 index 0000000000000000000000000000000000000000..4844ab7b38ea63f88d3b1c07df2ddc1cd3c203cd GIT binary patch literal 648729 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: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

v!{t8S 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

Vjz zTvCZ$J`-h7U*2lARK`;^b@^0JXk=_LS5(H|!%QwueR;rKSs8yv>dWiRaJqbAaiwZK z(Pu^~;~CYG*O>8irO+6}&5p`=CVk_Gxu&wc-}}GGNx=WUvUEUOCvXUU2+qKs|53nG zfaI^>B;Xmq6M*EW;5c9&`~(~WECoCYI05hoAo(dc3>X1C1lR|75O4r+7;rP-0YLIg zFa)>@a33J~C)f*k0B{fBA;8^$M*w#Lo&?+pcph*EU={ohYzM3X+zL1wa0}o9z|DXw z0XG450B!&ze+7ep!}u-- zTnShOxB{>Sumx~7;1a+lzy*Ly0Gj~AfDM3a0P6q;0A~Yk0-OoB6>u8hPQV(#J%Ez| zhXE%59s#TZyZ{&i9PJZ+7+L_!@f`*%1?&SX0UQ7<0Neza2e=i`1Gp0~2XHUo1sC`O zo(DVvcoy&k;2FTPfTsX+^3eW(C4eUY;pgGFOZj;yWIqqZrwWbF+WrDr#RuxG0e zAmZ6aUvbYcfesIj-O0B?PA)*7r+`4e2dC^VW4)(}z<{TQz@P^g9B?7w!Q~Uu^Ry7y z?7=xZJV|&q5!mV(;M6^v3GDE&mx-O8UG%lf6DE?~!imEk&jw0%uV)GI+~)}s81k$k zaKJM_VA!*Vz(LP2fkU1P1P*(S5IEx5MBtcbD}fUp+%Lc%h35bzbjovxz!}d;0_QzP z2wd=-Cy?WIWN#C(uJJCQz-iu<1ZH|W z2+a2Gq?Ca}YMguqVk2?D#kX9?`~=HvnF@v`TNE!Dc`3U7T~eP2g+8ow0< z)z!BOWLmEkn)ili7DpA)T-~EZuIB4P^Ml}N47VpDiGz=v`(NPK!X)Pe@7nb3M_|5p zdAJ8Y;HTgG^mzD~s9Tlj?FqN`@?t@FMyQsx_>u42e*cF=^*ghj>ADdD6blE3A0M`$?hlYSkps^V@{ts{*42_MnPIS<7@gzj}(uG>PqT9 z&>xddEW*9l5w+9Ngk~}&nrGSE_|n_Yhf?f|r!`cr87EJ+KVBT|Scd)+sgHE_^Byno zx4){1c^kWWI>No59zF42kP~kG2yEY_dJ}-TZ`*>~myZ;_Cw7e%0DBcty!>4Zn_=)8 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­Fr7E0-zR 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 MUo$b~fHy<|0H-HJ)&Kwi literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dac105.dcu b/internal/4.10.0.10/1/Lib/D11/dac105.dcu new file mode 100644 index 0000000000000000000000000000000000000000..1e62df2e073a725599b5b14f822bd7f59fbd61bd GIT binary patch literal 2140 zcmeHH&rcIU6rQ(2`%)Gpgpfv!A!tZL3_)~}7-HJ)ieLasTaXxHSf)ceu-z@Yiw5I? zgWNSH9!X3LA;z=eZu~FwE`Nd-b!OWw78dR%&S7`veec)2dEdK6NY647a=3f{&gGxq zUlJugTr%m+5$#=!Ot^{qez@eW{T8dODR7y$DNK}FQ=_)=SqKP=6}CN}RS7ApliW5f z{=)RRV;`;5zETz!;Iz$siKcTV-7w2+#xYADzRkTacZHG#+X`ivmg>2U@~eJ-o-)+) z8A_Sw5h4yoM%pr09%4qu*s9hV@&a{vO+*PSa;ED^rKp6258bgnKXBM-WM>@_&T*%0 ze@$9nY)W*CGdu988kxfUOhfT3uh}rosG#v#Ry9oDj5cnUXhB9-7rEr2U2>kEfueZbb7D!~=fLsecCCJi$jHq*MWM0D*cf*Wn5tp<0uwZB#pECQ|J$nstlQ zG0%F0QAo7j0127a7g&W#T@^? z{?Q5?%Dle>-ybKpM^aF=iMo%lpM*AqSQ4@bMhYeorVt(?%plxDNT*;9A(wZ2$xc@h_Hk(gm7aDo**oz;3>jN5>^pP2x|zHB&;J?Nw5)W2rhy@1p^4z5e5-b p<1m6SI<6ilu%A#r%CC}0sGow3not!*>B3IsHF={b7I{mE`3GOO4O9RC literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dac105.res b/internal/4.10.0.10/1/Lib/D11/dac105.res new file mode 100644 index 0000000000000000000000000000000000000000..1fbafc12c4031228b5f6dcf5353fcae6b1b8560d GIT binary patch literal 1532 zcmaJ=L2FY%5dK~h@~8)!pa;F!AR^*HQVmt;G|L zeNZ2#$JkeQj1O`^3xZvO-$No-Al`>_kkB`RjZ5`=si32{7!vk_f#Q(R3WC7lqW1Df z*eFg_g071@Y)n|sXo0#h71z%gDL`x#S2~JQBix_B2bIAD{~!oD03t zw+SU^OBF{KhmQiI+C02dI$Ik0YqCS%j_i2WTG}G*27LPkp8d|R<_P$F3@nB=ODr}s z{D(;_GUoWS#0gM31y0W3o!WNd%pT2H8CL=1Xx3iFb3DZgUeK1X#x)w_??PUKhio>j zuR>mthx+I(rAKcmhxjekr}8Ydfpu(heuh`vt!Rf$?N{Jl#<%3}GpTn8DO$WPY7|Iv zbuTq^aQUH*b?l*mZPZXkfom08tXzY^E;(P7lS7^-eN4+!gDAR>Y1UgJXNQlWME)n9 zxB~{GrUocWk#ELtG(;gu+5B`@?^^EDIz@^$aRR{Oy7@10W!JkqmIa?antMdx2uK^v+s>K^}-z%Bg>+(~NG OUnO(=-lvm4lYan?fgPOy literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dacvcl105.bpl b/internal/4.10.0.10/1/Lib/D11/dacvcl105.bpl new file mode 100644 index 0000000000000000000000000000000000000000..d0e45610c90fc855bc4900d04911086b29f6dd77 GIT binary patch literal 28160 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dcldac105.bpl b/internal/4.10.0.10/1/Lib/D11/dcldac105.bpl new file mode 100644 index 0000000000000000000000000000000000000000..2464b239c325d0f04889d764d0964f84c586c582 GIT binary patch literal 327680 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 z�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%0AfQs`2AA zUEF6>6ctZ(?H`{4E$^CX`PZe-&YG9OZs?rC1@r8U&`Fu>a4wUJzmxQKYsZ4q>6etU zr@C6y%L!ZV16jPF>^7m%FJKORTD;?@Iv zZb{{xOzHNh?m4ERdG$%VkgmQXUg~k_Ah7b5z-1n%`42Q^jFz!OGp;EVt20s@Mfxiq zrG9t-t3bzp^Q9WK>d@f4ba4O9w4F{o)j9avF&~0|PPDqIK#C4~d7@OilwKN!>=nJS z_qDjX;WKe7as7o@0v(MyF0)VNYXM77q*}R&P4Zet{OyzTa(shjEQT=s8QJEJi*En) zT=lfX$Cie=VX_NldagfetEy(|o$V&?N@H!-#<;73LMhvE*wG}7bCZV{)TBJAuk;-R ztNzDMkW#{Td!A)7cQ;fGfya*T!%T_zW3`5f+Z{M-)Q8PeMX6YVGH)E+CXqd?dlJz? z*6(v;w@0U|gR`0I+(eGaY(S*&&e@}N7fy$FO%wL#F?OEZ&i)yj0>7P6951xr$*p_f z7B18`36AeyiNtR7g5Q~%TAVbSj_ij|+X>VwEVbXHzHX*+@^@2vr_}SdU*6hx#J3Rk z=~1%jiaC2|J9<66a!<`}b+5PxsIL;MZdr7{WY~@*e5i6ngig`_U}8TR$Cu$sN3~o| zEP0v%_3CL!3{+<&5n-1cwt2AxC*#)DnNKB4&o6UjG8rU2&F<*fZ%tw-)SJBG>rbV7 z?g769FM)SJEQv`0Gr%Iy0GiW;anx!TeVREX^}4p!yH_T3yhGMC=UDcewEYIR{YzqB zWZBC&a!yH;+y0kgzsjYvLqvrs(Km=G=ctuo{Mwm*iJGC zCGzJyl}zPnpEwq~f}TRKd5R(e?X!$N=nmRTk4n}`_ew5GXC2OO&gmI~<;<*E1v4_P znU%-$Z{}6@QD{p`PX9x0~mnr{bLJCwsYaH87;*~YBDz)7+`!LjI6%6yMi zUSyvUB;PY7*&pLrZsgkw`AQ(E!hESDaj+BAV||gM!xz5te8rVXGs=AxmOqJ8zRfA- z+nA&xKF+b|;&yiNLi3f5MH4<8TGFkhz7ozfT2ON{d@Yjjg7cU6UV}vKvv^0!ORK7q zfsr|bw*iW4%Ytm~VSho5<;g!SNez(aX)-8`vHQ|j(lM%En&|NjR4+*pvvwi8G)v~J z_1s=Eo(M|jy!2X*eE8n&f7dh*l!yJ~lyt%(p0#U$k^~;vblEITy%d@2sr7qn=$Oa# zR>pHMw{-5*2Euh}oFU?ae$<5!rS7gE&_KuU;i6NS$p%N(W|L}h)lCG_@Wx&K%(cm8 zu2E(oWCy68wf|SZ=Enbw`aMmvxt-!Jng1A0_3>?neX>?uE(Fev%<~W8EYflD$prm=(EFS`3Er$F@DyHYyTZ`DEQ?h@${`yXZ}4$_kz#$f2)L0 zCJ(Af)HSn5hEuY%b?-i;&UDdTc&qsxIfXE}4sq2?Ns<}>_cAPr*+u%7r;f2;t@GU7Ry$(|$!Y6I#9tDbHRZ(&r<}qY z!*bn-_Fi*FOS+uVPmiHhO{UqDO=@onSNal*ks0IRSAXh%qYz~did}9|O>8sO(?W66 zudX@ZFua|ZaIQw+R+RO2xD{o6R`Z@LydN~3Vyj;Om-gDjD_0Z#yRxQ4w_9!2u|=!R z_>r*aeAWqGQsAStS2x% zR`>MA`LB^}R4Bo#Z1i>#aw{%m=hF^+%T;^>bOILg#%_V#`atiAytpb8Im%S;e&UR& zcbe`h`T6g&fAGidc>`a+ihZr>R2)loG)_xIz1Z^?ukODJ62iV)n{jHTm{#Rd#k0Nt zk4Ifk>Fo4ROIBHkWJL>0z|jmSnsZy3ey!)98Ypp0OZL}BiK`27C5P73B~0Z2(OJop z5}&CV;-8c3=L*u!C>Aq1{lc={-}|iQj>*t#&DP>Bx*G8DL*YvJ7-#sHT=z^=%{fRg z2Bu=S$2>DBCb?#?eolO5Qev`iXlE2_fx_YM{ec^VMaBgTB56P~qIXat=^V*-hH54u zGf~lJKB#-u%wE|eDN6IR-L}%mLDwe>CtZHF&Bs&93>k-eqm-na_%6r;c)Z$a-5Un;#_84*$-{wALL_&rwqUpuP>$R8dWF zysBUG!U1AYPn_R*g%A^kxX~tF$l>k~M+?!fiFchUgb6~p-F9_8r=R}?C5)HK?GNg` z=@R}Cs=x$XNP`@0T+X2D|Fq~FZe>5$qswn;JP)G51x`Q7tQmZ9=12nO%1Y8}j&PDMAd+7r>L$>PAA)ERjD1? zf$S($3t**YsP-qLqHMjbdoKkl*B5!@#JnFVZ|dC(AYb$|!`gRWQU z(n894Jl*P_qyv-vF3&jm_6P|Q9-A{I%O>E$wY{wk%f_sOW~!(JJ82o`VsihFxOC>p zt@06EJsr2#manOuSP!PVC|eW=fn^D;v5!A5(so$+GJd22`VXv#vv28$9_G#2=4rLT zcAlEv;h*jP;T12~k+KTQHxXp!>PUYi-D167qGuFP>T1K%bd+Vj#gU|2q@N@lah!34 z*>x;ViX`U{(5c$V5%uA7;v|M0Y;0-QO8Bh|QNo&wba{&Q4^szVS!NUeiOG%5KMZs- zFlQQ;Ry2$0*VS=Ok~85LZ)$^1a+m5MD2Z&1e(zR?^?Q%1<2}%EKX09FdfLP6Th@Ca zc1UMRBqE1HeQRb9ce~2v7)PiFBuQuDRVt~sUvz|nh1C~g?A#@}AE)aO$Z=|*^+;#0 zOKoPbL=K_&Ki1y0;*0k<(ezA9Eit>fFBbP(#XTQ5#jg1lOij~jKEl*9stxXu3in5- zfAC0sI8WwJPgB#yLNwHztJcVYL8qy4n%LerbH8Y=Pr@zOk1nd!SYS#pA`gGTLFT_z zq<%akjKCWOC#@k6Ju7y_?dX6b?MF$2r1m1I#I#FwuJx$7KfuPiKu79Sq#V@Bcku*E zrbkQCBaPZnmNqa&SQtQ#lH-U7X%YIShG^OBPrdx4%{j+=Mf7efm@YH0<(n_Ry!K&g%;;f-NqHY8kTc37*4d-%ko~QUN=&7%Z=slm- zf%ZRAtq~8>NoPvIRY|WWR;PEq9-BbNRAIBzwf1}M4jJL~(I+LJVDvQBFcVf#GWKPg zce{dI?3D`gpjbvYmgEe>hxcUv_#m!vH&rB0(P|;Cn|nKJs5 zPXNu)Wc~tq&yIo1wG86L&ak5g60vJ8#5;FENK2qCCARu0aS^f0Be9XnTl-*l_7wBzcXuSjr=aJtk4g78gkxbrZlQpxFGH3xDQPMNhnD`-)}sn6mFAQ#7B2KPKqO%k+%Shgjr1T-liOq0oG+@7wV$T9J;ZH$uCBMl zy?sLAPvs?RKU$>fc#K`~7Aa}W+K1n^5Wj6|ia6ErjN^$T1Vy>rtnAgnpDxbYrp~=y zT`f-q`{??&ssP<*IvT-beTR4`2ZyW$Nensny~Q9$j$ zq`P33agf$IMzob9&vvW9Qa4hk94-mZ8_>y zJ{jQ{z4NL69!`~o#cQ=hbbn(GfuaqpgO<6wtUuEccdKs^f%G@dz*(SUtVE||D@>!; ze5;`JIxh>Qd`_s$Fm2i&9ev76p_VP72*5T=u^d!MH%}Au*px}$Tb(wLX_ZIyt75yWnWac_mQThu~V-2ma*`TIxMu6gC`wNrmpweLz65PfqjP11oLi*+ zfy`+&J5PnH0m6%|O)(OM(P#bbF)I4LsUhFP3q23@-j_``abmlz*=7r@_3{BG*qibUWt(NSnsL`r*vux5jrZdEj@@F>m@$REjk>6h*FUJZ7FQST z3WArim;qZdo7I^ny7UA7%NT%E=#O4>o?eKoKBMm=k%=?){Z~s6r~KI#1Ur``J#1u) z$yHZMwUUvfs&Hm+MzL>7(Romcg`QyHmXxhhvg>t#)(1nU6RMROesx+F@^ci{h8|EoxUFpHH@$(=Fz zdFpM7n!27QP!1w6-{XoC-${AuPhxc?R$mQVyW-`VA=a4&okQ|(88BP@ObR-FWDfq? zJpZ3XI57Pp>`EW6*AY!g{HuJ-SJP868q*&zb<_jenU&x{SV)4;hZyMCH&GHSn_o@2 zl(m>(TYiNz7a(K)K65V8BbA{I^{{3p-C}0semkEUWem}yHcD+@z$pMd>bFEE8`#E5 z`Jon;F^ddlj{Zgb$Y4fqSQ@J4;jm*KRfz=fwD>X|>d8KHvLYHc>Iw|X&8V*AxhNx7YeNj^; z*F;Y14E6aR$>Uq_iNpH3)ZWRy^B5|TGNydS^{TC6Q*cPQ_#=GP2^+T-vAK zY3qX`HW^L{laC0g{o(_h1~44)<~Gh5z8(#0cJ~dHq zo99%~S6XqdbK)eS@OdNAu4uV4!9TNy(vx`~<@7%^@MKd!O(c3p0l#m>_L@%iS9EMr zDe3u?U_7s2Eou8lpLmX<>Eyq;?%+IB&9we&M222Q=zYv+el8%OgBrk1-{a7G@G2={O4o_%2S-_t#76{p#~&AE>M;M}Ax&R*lWsGIW!LCJs9J^Mk~`@Dn95AX-p zewglA2YSHhUi|ey2lG5rJ?nVy2B+nRBq+VCw6J<3JPZzJA&Iq*%yWx@2 zI8fK7N+BW5qWscV&rHvdHtd_bddObxuhl16yeC;YpOl)_&GCQHM=LDDd2=n)rp^3Q z|GX5nV0KYXF;-vVg&z88_O+P|IG*{}XhxN8V4BX{7d!wU(PTLi?U^69+%52-Y^Tw@$u(s-XpirJV!I500#B_xP6*eXME{DH8U39ZS;KXpC~ zIeGcDORPM2-pBWTR<(H3f^B=0N(7Zg|?MCP3r7RnS=Hu4Oa=Y?!i`#+D&2PhuD=+=WIJiw51oLtd4uW}^1LKmHPuN0I5m21G9FN2# zFaM3FK*vw{Z+&%bm#fbzFS+Sq#}46Pi)7S($*9|iji&E}Yn@?rM%J!o)>QkF78EB{ zur0QVEv)5973E26XDzB(=u0XqyscRJB)W?pzvC&1do7h*Qw#sphZjrSR)J6BMb@;o z4xkl)s7v?-4zW`{`a4}0#Z!VrCLy?4TFT>pFS5ONo*_hCunz@^5#w9TJ!PMjERU(< zUX@bu{9AUZ7=M&e3C9CSk`F;`il<^%L)}TvGVDeBt5ZAf#+{Sw6x-s7Hd?OE8Yk(e z8HMEA=iR#)fsjs*VmB`tx0{_3303`Ycib*QP1dPb`6Lk+6uF9=oC^N`J}S_s8a z&zIp|)N>BRKu0wHscM`{r9aoYhFvBi)yruQt-3~J+97=AKx?YwpW04hB)z)bcz3jx zf*h$9P%(6IIySl``?A~mJ~|E^-?Xf?YCU1BPtv}Z$r?eiBi{$yc8`hO3`fd$xa}Sn zJG&}~RF`5Gly$l=i>&`^r$PM(dq>t+k|2@w+YkdC8~ATm1)rCk%}G-tW!7%&_Sxue zukh%h@6nXXKQ#+(967JPP|Nu=zjaQ_SY*i^@qcp*ySR^=fyT`ZCW zk>9`YWFvsp8cFD2f6h$o!l?BDgu`Z-0IhF=7(D622gQerM%roxC%^?>8 zmm(Qm_Z-&!D}BAxVeaqIH%#@&e#Srh-a`;-%DQzz$5z}q!QHGaVwe9KhV@3} zfw$hqCgr$J`lnzbm;vU2WuO8uC>SCghpvuA5+e}O0ckzEI`V|XPCg+$Z%AGtNv9K1 zlObIqBst+6(oYO&1f=mtnIVS@wOZOc4$NJ)wCP41jwGx|R!zDMzEGy13@Js>2D(FY7^xsWVImupg|Pq^$7 zF5i@9Vx}y>8!pFdE|2V(?r`}GJfXyB8zVL2diyR8}E}BS#58{ z3#(u|u5kjXgW@RiQzTwip@b(@g-xI%Q6lNoR~yS3#EIq~!}bySJD*L;hJ16D=i}En;C7#V zmm$ROC?LZvZO;7_NMcUlCKeB;8-OOvUxyadrX`;Y(6if z?;DcEW|NRs8Ir~3Pat*HS}N|*JZcr!JmzX1kL;)+89Ecy0XU+Kg+Z<2XJ`g}Cu!;Z zli{GWv0Bjwsppg2ivAidMbYb=puP*mQS_f807ubRV-x5Y&wu-DN^8&7XVp(Ufu8Gq z=(4L$=1FKq3N@z%B|jzKOqa*rZP0tJY#-1&!oTfU`ejzQTPEXDm~M^EmD{%H`Sj){ zJIVbHj%88yCHx0EW*{looaAFzO6zqy@&8Uv0t#CaPzx1YgQlk9+7iB z)TXWcQ=w9o_;1#UE8~B#^)+)6pH)7(`}=wvZ1qiVd(W1J?(ctJ_*@IEsfB-P1ROcCC?I9X z!t^fd=`Xk>@@2POve*TCkpDQ_EfJBANaRO$OzPKA9EsEutw>}u#6ZUl{I`3MpPxK} zy79e#+0w9dW3zC%6>8H#{;8qDyxmvNB3(u|yqz}*RqMv3hAO&|EFFz5(_hndz-cZY zLHWFp=$6mxxDok0ZpWBbB$#)KWQ_&p=lX@@M4Wr}J7z zEPIUYY5s<2`WiTBh!GPv!Gh((O;9>3C2*wksvW1A0>zQee_>Fhb1B3?$6xX4D9h&~ zAD6BS?Y4!ZrSiIPm;|jUmw)O$cyXlCmY}5~TT@qOWV17Mbw*C-Y)34=GS-}L&GA_x z8F8US@XtFNG55mD z{hI3xfs0_j8jwkDvoFc%U%UI1_pxqg63LMBb^J*nJ+i7a%mfmwqJMvyyDEB9+)@=K zi)gkGiuxWDNBcHFk*a77M9#nBzf(njV*Ti^e{(JCj}Gq_2tPLOb6^#T1bII_g!c=@ zExcbWyq6G)dJTJr_qkAn_cn-uj%ED+^t|i5V=ZK&MAbyVO-kZhOrW27Ekx!yj#&$V z#sH69Mm%_SXC}+yuxAHb+&#?`J|fy8{;8wGh?WCAIGg7B8$MON*k9b_k=*aC7h#XE zY{wp;lUW8fdw_a#+4`!F#%NV{zyeHfD9Tlc$ z4AAS!>Yv!}m@P8O#a~ms#Pc$=Pgj5UCz~DDNetU0hC>oVB{6*3da~a*=1Ck0tiU&A z^H0Tm4spnu-U5lHUZUA5(flOtbI@a}{_P+FQ@ncz?v+D5?K8omb}$_F}wq& zin2Su%E+mnx`?TszXSQr;C&aJ@x#lw2W>caD4y;0Gy%Eean(7&J04r0dCuofMNGNl zu^sauP@p8q-0_%-d%5GW8*?M{uJgQ}X#8|z+IKugW4D%f`;Nyr-sO(RF3kCu9#9KL z^PV7Xc}~M@$6Sv;_Z^S5#NowG?s%M!SqVyjeaB-h&-K84$Kz(+ESnMfiJIcN%0o_GMI~1%ZdxDw(7T27Wi^13X7&yRV<#ywX54SF~+#h zuMkobqye6x*HjjlXO%1(X+wFx)XKGUxBziG43FAA6Du}zE6{H$MlyzmmpTF38TRYd{e5p9)JA?(#vN0 zuh6G8TdmeDrLb+3SMJ+c)`GQmw~>d~?Q1t9@KpsLNToX~N&=LPmu$p~?)}bIDm-zz zR-9@-+B36w!2|dU@Z$=u-~-!ZpkqZ0h3rko(w|%F4&ysbR_OH-D4#n!KE>5~9c6~T zk|L9I_EvL{xwQ@PkAy3AJ&AtVjD-DbHDh+_RR(=oCoVP9{U$P4+e4an*LU;(2w`hd zBHZk*PvF0TMEVH~5ky09>W&H6Nc(W)BxxTW;lDMoCLrmz;#Rj0x;>LCEgT*~<-Ch< z!phl6g-*T5*$F}2L#Nf@!o>G z%jr~B(n6m#-(8lD@rjB4=KaM%wwCSAk|Bd^ebr~f9iSs*P4sSY+{oE)0X6*^)^a%e zO+oK{!UqRV<|V)$na2e~%=JD&5Y0z$BrivKVHzpUA-td?K-I0y%1>Ahe=$VFe<4Y7 z%@F?)OFrc=9|C?AyFkZ4anXsG^yG&tkLFp=@=Z%-@uI?-GA?}f=`v=%T@8LI`vmob zDPwlB|4#4ADuCZ{EX}E^xw9nMM@sfUx07w%HgcY1KtZ=8yGQMm4%~~)`*0?&A^peo z7I9CsBw;E^btSSHOOa#*jH@MD3`ydGF9hxR9m%2NrjNAge9feuvuclkijal4C#33J zJ*|wT3>K%SkQe&w$Oa*+E}2zf7T@U80_Hk3Hid17{5<5-f$OSE}?-ZXWuPb@AoL^u&AJ%zJFma92X+I_S{(|&6Z6&;d zAe>L2{xw)K=?DC`Kho6ofOMb7Eb$d#1m9~Hm&tpuOb#a+N}`<9qN^Ew?u5}lXZP^T zp|;2xo|J;j{Wh!lZ*oB<5zEMLgrTlKg+!U9v?BbdpTQFn%Jny_$D6-C7nPw=SjODw z4T`%rkbs0IK~(A>y3}wTgkI^YlOPu9AUL1J6-2YBmzttO8N+`^Ecy75;wMR0`v-|w zR`TEa3<{#ukLHY~g%wpr85K3t(ZuusFfZF0J~A9omi7NGlZ^y4=2?8R(P=HBa(UeA2c#&bR9K}-d@ zLHnF^&lC^`Jpm+v(I6XIHfAoU1hpWRF2JLe?7|OYtvPay+@ef}oYf5x1loUhxV3CBgH4aLqp>#mO=}``KG~+B8(-=7?jWXPi z86#sf(YG@&-HAxb8pX+C6;)T1> zXdP(mi$WgpW{gt_}|nju+wC)wX>HODb0N0A$vGwWU7u+~lQHep021oUh{9 z%GV^VwmSQgMqebA?w9JcQ8#yHPLhlVgiPHlWQ@A>^4lEpMMAvDgfDCV+9RgaKfk+H z|Hwj_&PzrGO%7@KNgrOl66^^48(~;2n~`4{?$v7~(~@7NyuV=Hjr`UN zo{-OS=^tcu(Wy{7q_N79yDrs@`mwutv-tcoK5O`xM4w8MFYb9n-sef5n|#pUT20Y( zCG;K8oqXtlU5Tg2BceXQe^)+SOz_SJt;2}M>2M6>CD8Fpaelz*Z~WiL7b%=$$rs6c z-L_h7=`G$Jd*QZuAO9ZS#9?Y2sa=A?1#qj2A!bPVmro}6q@vt+@*K{vEoBGr#4%%2 z$BgA4<-EA~oFS(34@Dz26z zc8kWGeDZb03nnGqdh4xY7FLzvh)7N@o>^F0HYusPrn0i4%I6JQNE7JsPmS7Lzm67p z059@gi9YY1ZdYCmM@y&=xz5%%l>HGIDfA7lP1E0=pp)O+r8q2|X|k7B-*=d&)%VH! z>ifFnzZnwV5^pP_*3&I=z+5XmZmXX@!LjC=Bg$GHTG9NzaKy_*B-fk*OY(9aFWi5` z)8*o(9*^>}05aVS`ob+z1m0w#h&oP=vJg(o%<+TV2XZog)1qAl?KeD2cSt=VfoAorZqP%r1{so-&~Eq}<|8o~t4&QYEbJ8)vc)xDa9cOS zl`+4Bt5%guaLp~|IY*v1ND^ArMu~D-N$mF1H$qSkle*n2W&TU@g7{n2M=~v?)2Ji( zyS%z1XfuJnBXY4K=#=LzCW5boM&NZKAP!IK%IhVnhf^4muU>JKj3cGFCAFllQRkx+ z%SM^3Tp_vIc%OEHXtS;4%V7wd&B8e~rsH@}m|lmsogoj@QKL?h8Vr^DpTyUnT;G8VgW>cglp5)V*v)aZDf1$^Yrbx> zNa}z=yk``aFD#}<{csbV!Q363(ZVrqGSl(!1exymFCzp0>8t3kJglcbe$Ts}vlhRm zzu@#UPe0u*G`$1&<+|ny6R`+%JoN#r>V9T2@6o67anj7<@)|t{l(mG)#4{jzP+oC4 z$6^o8zs8(eDjy{ITQ=a{{_W&hx!#5T3hzmnQ#f_7p1#^zupZd`(lnl>Um8DRs^|gY^2oHnZBw;cQ2AFm;3G;aJ zhX?tt<9U{8^9(|2bP0;Py|BxPbPFpM+)X(i+_KM z@G;na6(&^9#7t%gzve@Q!U=52O&I*WW*EvArAEdY@HV&)S<5EJ00_n6u*57)~#a+P4I~$wF@y&5B#yAX`x7;2z(23I0}MWhqMePq&U_j-u46FX_Z{ zhDg`-{?y(%F?t4LiUbO~-XuQl;?xCs&*Q^xJ?p5Llfbs8)q7^}OW?;4kVNwMQK>vr zNQtY;J%}X{t6z{T*+5-@bz@e%nI+2QCD8Fc{yJGW>#4u<0}tO$KgYW(SF?Kfz?B)K zXXB4K5uy8HbP?N6rXL#E@>=bPP& zbRHCx+=pze4l^U3j6^kn&aItiB^$7nk*2u=2sJhVvYfbtVW@ZaYVyR@T z!4qwjE&N2NY74PR14g5n0LM(}=+nEr6IM@6>Ll+u(TiheR_7);F%QR^#JoUDZP&jg zW+t-8=)PxPqyMgZ?ry=Qe8Mg&e{wE0s>#aNb?*1<_NGd+#pdt91uBE5>nWH+gtIw` z#Lh!QZ4x&PwVa<7%@+#9KZeQ#Q-9}v4q=Dnl~n|#->8O2#OB-e2PHBqBg%QUzFq$l zXV;Svy1X9D)0>gxq(wcfDNc0D?&{>`ItXepVaic7{tOPFJJ_0a=p_Bb!GMR&Q&(%& zk&_w=4(^CRFiq>l&zTe=>4d@ijp?qeEW^^7E|W9+10Ci351khpMlg%3FDWT5tDJP{ zrPAA$&bDd$FAQrpvief~LgZ44)H;{97NVFO450@ zolusKZ%sn{vt)WO>Ks_V5`O6R-7}Cv+2x;}+R)wWi`3`2EFJEDl@|UYNq5kOEKy?9K28QxdDAz+10mMmEf8c;I5zz-?az4e#{4~!E$8oL;NHoFD|rcYsQ1VPE?+kV-+VJ6yj%iAS!FIGueh?Xs*nj2 zo{_CRHz_B5$Z4JO#lIe}<_l-Am7~pQm5C`*A9k)Ib;N7+@@yWJGZ1rqGdjmi4*eh{BDMsE(ctZwf=9TQHZgXT1P;y`gUxssRts{r?h`^b|JwpN~r#VC{7cQ1b?DeP;Umy-v2fFAUoIab>#3+DcX=M6-L9s1$1Z=IF9@dbGEVlQ zGm??o%Wj+AoaE@5@3v-)9?-BW#y&5IGb!2|?nv_ZygC_^h@eTz7wjBj3dY2pWa5U_ z4vjKFA4bdYj~uv0#BWNV=x$)G)dopBfT--w+T;HuMA|KX_bmhTm1UfN&oTXt(Fv1$A{sF805oMo>+%CKXUWk>`0>G0-j(zw*8jv2@

_ZA=+p+OPE4itE71WtW{w%Sj5M`O+bDXf>H)DSI6POKBk^;*4I%eZ zN??21HL)w^Q0KO0BBG^rtRGBc2%0I-Q75ftCP` z1+4#~*SgUXo$z~enVit;+`ZK~z17)NZvn+&I=%j@GyQp9bsf_XrVncF(clA+ZvT6F zT+*W+f=j8QZXRjt5EaCk5Otf}Iga{CTAxuhCuc~_HXWPE?RQ;BJBoNYq=_c^Bxri- zNsZ-6J4@2emOksqshr@Qw)fdikxv=_?FB>8Ynb?+!$j}EcJ~~_MlAULLwx8th~3Cx z3pD4KI@Pm>^(*@q$9wV_!FQW(nWW;ABs-#X~oi9z}X-skha2Gi@J_x0EJeID-B2<8ni4`SNCBHlf&cyoAf zbJ^SOY_ksg&A9hrZglyx?faUWa90AKnV5TA;cgNC(6?bGupi3)Dc;-84ZcT@o$Bd6 zpEX42b6xa5_B(XlU~gAn4k8SivLyk zAB|b>3MYa0(eRaqxzV&#!93CLAnv-4<4$4kaiyb+_h{F<9sXA6Ev|6d zc~`FY&Ad19z8-V4i*EZbfu0S0KBgCQE@m2LE@mobHs)x|&-#}%4!MR&j~Dt@=xLan zF;g)&VvfdK?{c5O`zqe!FzYe1F`HcW(Y)8nJ7%Seexh`2#Qnyv;m`VQ<$Z5C`8uB2 zK^8{)`<3AC@RyJy<{`|v;t#X$uNHdu4MF-^-fLa)t>?X-_f?pcE_&Z^{$F{oM=tZ$ z^e-2i&!$b%u=rcFsg|PI>n(G$Wwuym6z4pPyEw~CvdlEg%(2Y5mbuL`TP(BNGQF(l zNH{r`Io~qtwApY;yy3BRU;+;oj~gsEEq58eZI-#;GNbAZeS&3rEprv~zY^CG%k;3s zDDN?r*=3nMmYLRI>@zJh*D{w|=Dg*`zRogNS>`&++-RBmEc2jc9=1%+3M+ogOt8#k z%S^S*DVCXSnfaDE-!jWAv(_@#Smt`m++>*tEwkG)qgI;u<191LGDlnH1k3bVW{zdf z)n>ybiIO*g-jN3_y60O~dbHVaNs_j2xFp#!M_cX_EO#lEnP!=pmcJD3&gwhALe*>r zfen|WiiOknehr&I$A_<(&hy%aOG>PG$}F?eGJTd=YngSHS#O!kEpwG+uCdIumbuO{ z*IVWW%iL(0n=Es)Wp1&|t(Lh>n^t;$NfmCVr%5cT2e%Gvkq0MX+i?=;NVXEzaLFF+ z>{LeoN7nL@$mGV}-XHIR79h=g#V*irNtz&gLP?fI5#dO-X~+riEp@c(JddWN?&LX%TIGx1|F;s@ zd2@urz`Sooc-Gt+;h9?+q`m(@glF_^5uREXZNd5oPd2prTY~Nm|2V>vdwYauor{*c zDZ*0(ZKI1;2dxrXn~RqE6Wl;M=%Ou!wiTM^>%lnw39SuUwu`p&(Fjk%9k_MT9(xSl zptZYbS8a{(Y=)*>v~AFupmn)u2cWe;o3J<-@913-o~Sz`JYE;A99kT-To>&yv?OTr zT(pV5jqs#ED{;|QLQ8{I=b}ZmMtE|dt#Z+Fpv{GL$VGeTxd_iTXk9Lvg4P19$3>g) ze1vB&w8ZjYIv(E};W-R#w2Kz=LWHLqTBVCN{3X)56#iVa5@g1`TBVEj5i~Efrf&q}UGy*V;+qkkYz2bXqC`bLEGh`H9=bkt<6P?Iz7^}5n5DDFpd|8M|$=_i*wNu&WQ9JgqG-{ zEr50yTB?ioDm2du^20?-Oo;TvK+AT~%Ah4c%XiUsK}&`<-$jc*Gt!d^t;|I$f;I(O zt&6q?S~j%hF50LOk$l)inQ_s4(B?zi;G%7ZRt9aei#F)2NKY-aoi5roXltPDanXh* zMtasm+vlQ{LE8lFpo_K>+E!?BOM-HK{~TlrZM2J4m&9jl&?dNOd!a?GL@!;m)bk=e zanN#Hw0dZX(B`^m&p{gvt;j_iaeky{0<=mOtsI&cTAhpb6to;@t6a3`3nD#pp{;Y# z=0Pihw#!A^I}%-kcF09rbz!7u8?-3eIQw^KG`a>Y&P7Z55^{l-GId~kr1=7|M4tNOc1nr<3 z4EqlH25tb4fG!YsFLfZu21Q^Q*aY@~9x&#+$QY~vkAZd&v5t7bBJdz+0!KjVedsQ@ z1*`&Fz#Cxr{qO{QU=4T_>;n72M_ILl0`*`$*ar53H-P-2=_3sX$zTka1g3#} zAir|VyTKN45KQVmd@_ot{SPNQ#0x=sRJmbJx@FE!c1L6a> zfGwa690iFFk(Xc*cnCZN4uau7M9yFtXaz?>;zr^D_k%VN{V@3kZUnVpCwLVc1;c(s ze4q|&1})$%5b@&(&j>IM%TOGv=$H8;trT`UF;iUEm`ydaH3a2XhHnXT7&r=G&M< ze}y}+6zm6AK2BZ(&l8kQ&;@d~A#0HIYutfXLE3hB1U+ExZ_s%V--OcJLp7$iK6EW!Pt z1)S1C7+^Wr3!PZa4W4 zmVzeG1uoh{odY(4SHbY#k#4XCw1SVosOKU)SAjCH63FjS%;&7hW&v& z1vi4FU?X@I907^@B0QO(1grsDz{}u0F#3<>kZZP}}!Uc8UQScl%49hWx<+ zF!U{S1k`~?z>A<8od0*~4^RiTfPLV7kfg{*PzE-Db`a5lEWvW{ICvWjf1A1zybOB4 zm`?geU>!IB1|3GOU?q4A90qCspnd~ez$;+rKPj_dHmCxd!9EcE4s=ig9s(`kEfCX1 zy#q?XyLsWJs-i0XS^-HD`nhm zJ%1bXJuqS*V@a?I904~n4qpZ~0{OLJ9t9%?M|!4#+rcAXL^R{CA%q7ufEPjh&`8e$ zuns&2rkoV%@qsPiRgf4%`anI{3J!r$Cr5fpz!os{6#Rfypb022A{IYjDL4#9#6@~$ zfn{Jjcnb_WHPSN`RDp-UM_|-2WCMKQLGUa%1Y(#|ke?TGK3EDK0#AVhU=Z^L@*9Ua z+j?G#xxspF#eBUxAF`gG!+al%I~%pA6ov_Zl=oye-31$mONJf9aqu@pG9vC$;(o+uBgKa>5?U<>f&{6OPxadOU z2`Yj7)?pq36B+Bz0Y1i}-$nT5s{1@Z-FUIrqO@2b34#@9|@w}14 z7vuRa#`9l{=f4=we=(l_Vm$xFc>as={1@Z-FUIpszrqhi;K)THQt+M7jw39buj@{yJHUHGQEiS7TFG+6dddF+M433 z+nkuhLsji%H%%{?ky$BG9LMLZ;#+5wSNr5-ADyDHm)j|tS5C9aMg`IK=f_K07CEV}s-19|#ns464lF1s4JOs+Fg(K{j&yOX zL&_+u_DSlhK4CbYG+tZi$HdPOXa6_iKPFx|#QW1kOh8Wl6_i&M-&{)3shY{n&1HSn zB&T$Np}YOe{=`1KnYWdvS5+0>mf`SRxkM|kU2Yv0dBwh*;_{n)C6Y3C336OybDW%Q z>7>K44fPzfzp1QjaZTB={^WoOs1}xM!?+6NPeRRDTxko($uCVW zGzBkAAmIWIk&O5!uli%+7`OQqxz}+PyjJ*r0uSL$4z$l94v8R~EP`RAmsgh_BOkBu zCt(C*4Hrt~0+&p+A4|=3yp>BrwL#0Q%(8N)@R-~P@)VjIk|NPqJ3E57jT$ST z(?b&-49p#;SHeQ7#|rg0?t}UjT6#5KVYEck3w^VW<=3(q->;2r;pD3LI7VZR!>i<; zNW4E`1T`RR3DNSAFr4xoRDfWtl?x?{LwFQFL~HdT!g;Ey9hYV|d3lQq%gQY0r8Nta z$6a<=NDC*a?oSV0Y=r2c?Z?jAa6E+cV{}?`(yL9sXGvvkNWVhc_OT2}@$qzCc*zK- z^Ii@LF0RrQNH8aYDe{dCEjzPo%CoAfDs*nv2=fjHxrGbAUU+kHL3tTHILYkF+HvD8 z@mh8>$`@7Wb8Rb~sw&^zwDk>3`hx$U3a(snvF&9v$wp3(JejimhmmDL=;cnsVdW)tT$#p96i5aT1I_Y?rWd z>;$`GY5KvphvZP$F5xkL+*UhK0hOx>JZ zTbVr0(FtdSW{rj2>FjIg#gbDt@b8q>;0P~h=Y(x!D}F-j8E??7J+!^1tawggRcRr| z$clR%haFDPA~f!h4uIvyZbA?hO?fb^u@(o{al1m0YR53OqJkk#x##P}RprHHA^OJk!_Re9r9MUuPV0G@6P~t_!wSRZ$?W37qOjh?qFB6z%gN)k zsZPAqTa>wKsc>{5kq+<-&V#PCGs6|K?ba?{{RvbLq{8^Kl+{ z>Vh7clAvcV({9B+XV$a7@cZPa!y9A5V%=M2#`Kf=)iLW9>e=9(z)4h{2|@0upu~IuYNj+VI?h6_DX*BQ_h2VV!M?7ds*RacIJkw z^ZL^C>95r2Fv$5nT=XgF!Em(u6UxqVWp!QM85ayGl%rsVQjQmumKSpj zdL;wv(qcWs$B4nnd%3-(Pi^k~lRMQOQ_VrUrYm6crQsoN1Vbalq1;#>E! z!}LSkA-j5WkX?0vX;ZbNoUnrG*Pq@8>0aB{@tPl3d_kYOwAsGL1{*Ko1+vSJ!<}82 zvaYG|U9*UV!HSxyh4i>R((kYF1$+F`W7QL51?7bcaZxRo?hvL!PY+8auL`DenVTM4 zFx1e!ej_2yIxZ`ABFLy<%GX&u5NexrJ4x z72tVV#ljkkUS2d4W|>gaN1oxFF<NMV{J2~qWDT0QQb-R!bQe%_BR;9ath|pDk{eFSi_(2e2IJpU1o9>+BN)q~ z&sdD{d?_6EI~KF;!;i&mTQY|sQ%OaURO_aSwa1#)JO~wl?Koc?iC8G+jw|CGPQA7> zN$w{P(;Wg_nIZWn;>tHxrr|>P_!OaptMJ^R&S0{HRqIbCu)cgrx}?k-i3bIY2$?rp zR54+qH4QKlQ6#fYZOb-aTwIN|B+G1ms{TLr@{yH=V<(PJOHB@!S$b~L_D|l}nb=?4 z{Z!#0auqJ5!s#!Jko1xSiBp%euqqZVMwf~Or&U6D_~c=RNaDmg7LF~mUgnbK2{bHR z7$?#&;jF5E{R$VP?oYV6`h@;N^6MBKamu<$Y&Zr!slxW1Swh`we5GamO)bg1oUspA zods?4%mr?yEAk09Y}gwxf^*(hjLe6nmlw?{)yw;RZS{gl4tqqd$#Z&vdTirx?DS;3 z&cG#{1f`B~{BRqdS-UcQI)`qWJ}E@uf~a&=%M=>c@@q{m%kj^($ucu5tsIa2g`>40 zoS)o6vvDF^$f>xMy-j9&SJ(^=;jf^QaoERpE&I9h zD@;#MxUsc8G_TDnm$=1Eb(Pr$77}ZgR!wgxO)oUkvl6n^TbE5&ru^hjz0FrlKd4Xt z#j4f&E%Akw%%PsBq!f)XSWGl^InFWQ}w&R|9$TGiFbf zmznb7>FY9cff?uY)8X|x_F?tKvCYq%YDPu{y19|IuCR)+j5C4_*E&~@ofr&YX5qpr zGs+3Zd2Fb8*XA5Q$Z?kkgUqO@rn{e+ZssEKsk| z{Z|3uGxB&Gf83D!7jtOnro$nNS0AIRf>*Z&Sbpgf73oJwXFnZLS6gcNq9Dl>w)iol zreJxoT$t8e3-9=|#n$h{!bj2k!zmrYMHc6 z$Xwvf*P(^!e}&=p6YH6aQ_HWJ**mUGf-0xE{NHFLxuNxlj?qF1?8I$A-&7NVQw0U< zkrS4MFn&&4_t<4!3X{_U(VGZL%W^^VZVh()!K~x2j~hE(LE%a)?18Pml`WT_Og5om z(C$~2TifP7zIL|g4sePqA2ybJTV6oM)ySVK;R(IS`uUNBI`A+fEla;oMv96ZJ*51(gZK@Zt zn`4VEH5h)QFAsHbV5h@}X66ycD_jx~OpL6aV==b|S&*!nvH}0Ih_S$Q&z4qGgd*`vc z7!z`Nx@S703)hs2T|`m`7W*hn{E%`ZW`S(fLNZFYRWO>G5{fnEwp;4-CwsJzx_m(k zYOFWS-42^tsBdVrNj@WoS`#;MQMOmx@lnIAoRAAO6i3@9W7h~>4$83IzH|e-osU)4 z@42z*reF8S{FK#Ryq#Azq=;3k{PYZ}G)`7IFJKu{lj5WXcd!jIOpw$kZn8dW|o&XH_LuC+ZYQ?XtH zheoY8QcuA^q10+StF)~5A;KiM0o(OHHQee^EIw}ZUAaQ@RBZHYR(7Zvj+$iDa1Jl? z`jgT=52?{6gy|65*nb>?WpldAjxJK^=vYU%Lfs>5H^#DwjZ_R9yU{9|QlYcc8F?*( zmM3pU&Bmx`8_VNH8``@1Ty}7-xsI7LUuc)u%EAgivN3J7=ab>Jl~5^~Hl=qpx^7yw zwsq`CHjKB;8Ep%V@rcDnFru@u4un|kg0}R^7%*F)2B6L2$h~TLgosd9d1!f9LTI&B z0wj*;-_)_4=j?~#e|!O&n)->=BJ~SRT@5mFV|rp^RN7;bwI*2xCMs14ResXs0cB{k zG)k+5v0s!6^Vw<`x;X5Rj9h^9G8vVECS70Go>e!!XoaO6cjK-RDzY)IR3BI`9$80s zP8v$U@VAs>7L$z>ysC_J+KR=Kb7S#4R2sDC?7$D-AV@|}!!Zq0-v|@jt@TsvtV<5% zutBYmVoEDF_(Ph;qiWS{$55#3cWjt?oRxL$cjczG!WFjW?W8i$aAh-4)GFg8jE6?b zoGm@w%6d7`hFmk&aWhqQ?J_ORk<@0GY1nj>k;;^tG0pixM_mrqg+3#{z%m9JZf*<| zwenxg?`0$xL%XC@OwDW!OTE}Jp_jwRf$mGDdpu5shham%V`^$EY+sukWW~+p4ThVn z=oT`&Mwn!zP@YPauv*<#{mkg5*1OgHZB(6*QQi2X2C#Z7aW=%(c6+m^oej#Z3>;e1 zsQ@W0)5b)*bg)yDw%u}atkILKQ%+}e1Gf0JP$vmTpj{25=2#1_!o04u?TdMSIlfd` z=pSqtD{Z8fR!q1QBeIj&)-mR7trRYYV&yWDt0+sgCX35i+6!pXC+k`tD`#o;gEnj! z@=_Jrq?~%aC6_@JVV~8;)}?+mX0H^ zO(wL3u~`6R1;Z)u?$)7cUNR#CMoBmc6gFBkxy(y?-zQh*_#-@)=z zN?o}Hmp2S)YR)yv!(R-lILhE=j#C?Gi847Vnk$>(G_`eKtM<^s48t`-%3)|5`=p(9 z)}x~3KyznLS1YwOlz^ura8lYD8y>|j!}GY)=_BS~C5zI|S<(RcB&byf`U99!M9w}! z-6j!?sPfwRaw|XD8Iul(+i9V)RrWy+x~y!Kyn;f)%dhb)rBxE!s|Pq%pR$9 z15|PfR(ruHHA}lM#Z)S@c350qqiB+g(UszUdGVc9r>_azBRf<8i>+fLnJ%)ekQ|-OVI@AKo&iIm|i&?xgz1 z^M0nLKq&`aek@I{WBP_lq)>t_I^dd3>V_Ch3vA5qlWQFPN3R?DcSeh=?-$drEUwyG zQVZ144r3N+nKP)uMX~7NVfKSR03{iXf$EFcH{sY;2yvMv*(EdWAg; z*X8SQdvF6f;}y+?sda6>koE;%4?{OD1A`}WK)4{g}}6Rae;{3}}eI58%2k|lu+8I z%H>G?PhGuADftyUN@EwW7+T5Rs0=RD(s&vNY~cmfX*L@z(Cz`YB}=1v2fol2yVXKT zp06v|E}fcEh-}i7YLP<3=QO-!nmlNCri1*I*=fxUS*mAw1CKNz#^+0CjO8MsjBPr; zHgU5Bc6SNWX*2$_wJnV7D_ieoO$V9^^Wk)Lz$q`|Pnh7-U8fM1JU!QLcx z;>vp}6D|Bapsvd)85WamFIOhNc?GUo=Qd? z6(|3YLoWg5g6Umm=#OJ$Bu(hr#&g`T%8!L|RASMh=F6j-&oO&fIiFN}W18EWG3}#d z&4!mUj-ZCVqx@>3~ItE*f}sew1ld|T;|dpbEn1C%|(CjTPG zp?cEfv!_udqa-$(l;_$VD3rN&`*fJMV%5YvM6gL$>r2~t2L9SFS7(*^y2;841!maQ zda8W4kpVg!+|tn0nrHp4p!T)|y_!nD@FG!}Zl_`cXO5l2DvWNAPot{~b{YUDngcd- zqjtA-+_WhjTDENOzU|7YrWD13%=;%sW?MS!=LMxu-VmGa?WQqnt6SST+UW0M=E~$a z^dGt*QM%buz9^B}5qD3B?dpk{TT#P9MQ&9F`a`#-&HRIfvwSC|FJuZ~HfH*U{dCRJ z{UFRInnR@y0?lnRCf!V-Tz+=#swpn@4%R70OMXFR@wH}7utEKXQ40_112MMOjm*p( zkc!UMCBM(1ai8?Gq&*TZ#$i59k{r+c3(=p;k7g z*~m(~lGutX*7?)d*s&>xTNzP1R6^xl1(iAWauBZz+Wz~IB&!i_F8!hGqjBWVCn zS3__kYleD&!F2lyb;XzrFwCj4I&2pczHKxvw3C)nTq$u~e1lBeEY)i}zBH?PYN{hU zT6e8$F>C4?n_DY73WZ`8v~(%TQIK7E`iE-Dl;2|6T5|#iQr}A3tV-Ob*#@sH&v5Z| zggx@D^b}Kd9$Oz-iLrM-bka(t%jk^mj!%PxhhSmH&H#A2XS`|Cr;8`mA5GUfDY`UA z;=l>xKlvsBr!8Lm+!`FbwJcc9TusUvZ)jt4fnKD}+iGV^Ep4~c%}<&0%(!yqg}8LI zGG=qiD3s?^QIs~aNEJ?r%RC%64UMj%gB=@?9KXO z@Ipq^)n{`VBUjwu-_a&XVd|4q;}8g1a=T7RMh&-iN=%%vv?H~U{O(Og4YzWF9@S8} zeXXv;TTaxk%kyEDg+QAa{DnX}{zYwkvPlWDRb;1SbGVdVT7=Wj9t9I6 zG79~OT~n9~m)?A)H*{mwXF9FA($kt)?n4K?nVxE7H<{D*BYczhLur>w@>(S}M8()Z zOGh#psrA6#BkJ80BQwy|N^!7#nspZG;RkK*Me@-)u8Q>Pc+DWbMO10kN*7;y^IH07 zUWe%nsWWIe9&CJ&JmA$a8g7kGmnQWZP-L}IQbnB3lz2LXFv@(IRcz^nE@`$+AF3Dy zX|%VZEHfB8N3Cc;p|TpNrX__&8+}WqiRnS@nPXX_wzTNYNI8(4pWb3@q01SE|aVg!t(34!sL! z9hE4ycB05eI|*)=2^1$cC zWXq77qsv*wiqn(UVkm`FT)e>r967E>cS&84C?cMd<^)FqdKoW@|EWFc+IeJ}bSY z(A?sf4ctPnPjpKe;IsuranR~PksR`BEx_EEaxxWX z+ts&XO*P3X1^qGcqtRaNh|hdPD)~GCf!P&Ki;UtePrzp>s@L%Z;+8uLvaE( zhh4nGD~FEG=IL%&X_qn^{rFU>;iGB?JBHuL3y&J&OApB@T*|#nhitBmM@I;*`ZEmr zGh?UXL>va`{HZIVhI2B^}hjQs?XJ46V z=go((lGkEZ*WsE@ZEqcOTv_^&ibGc#m7LeoUH47dES<2^vdz~ zA?1?l%=ld|n=wR9)p9BZb8mGxnr1f%KxYx9aBE4LYyy;xIfu1qCEUu$JdY>Md)tXb zGD$rOmC+_R%c+E08FKSoQHRU^kvF@1tKmiRLwCFZ8#$0~ z%C&&Qt9G0@l-4v%_9}1j$u_z$N9~nPKYQ3s1 zJJG8>>o%X|Ry?P8#*u^*C4XGw6a%d}+e4%b(rlXaj1v!}%9KNSwBy{nx+#f&rMeq0 zgFNn9Md~aDCTMiCS}yXk7|g#aLo}&BU+xeO6%aQAIM@Tf)xZ$}oK?jB3VszrUq=q- zm?P~8$)T9&&Cwl5sPNL@A|subqsvS6t*mz^=}L_uooO>hQcq_TJ#h^ehXpiD-}4s4 zxSmEoL!=4KGc5CtIGp3s<#v>Gj$S+L>}Tst1{$MAa2Fu2e?dnocemhbPMZ=?!>uL2 z<%d3}v}IBXh3n-rX8l+br8Nn@%;=wBGhCZ3XC<7&&(szU#szkC+nk+@N;roTH}|6p zlkg($bUTLFw&hyHl_g($wdnge3@0;cxRs$4;H#>IF@a_UM87 zi~~<18m}^2-@!Kbvb{kZ-b@iP4RyPmoKZfG53<E9*?*1J`)eYy^tcd5Ox&6)XzJxthe=D>OsOwBb6AE`c8wiV+i1yE;@=YW8?3C;$Ch-f|5Bn}P5cy{ z>N#S+4twoF>7Y>!7{ck*6dmlA2Dt_rLc3TRdLDZH>c2y`XeEr}gv$EK`DS|icV)$O z_yH2gt9+BT3MwI-xXvwfWxf66AWcOIMannUO>3T9N0%%u^H%iEAZ6z~{Z0Fj)M8zx z@-WB4i3jhZ#FPArM5XfO>Zk2)On2Edqcj&%xV6dS=^BSP?3sa=9ByT18Q)d5OU<;6 zU>P;s%8Qn;5}Wq5rK`TB&N(&Ou5_{W<3e7C8)l_TwYGA!)NH~dqrO{gGT-K8SeZ&C z+?qElFXVI*E?sfb6AS0?s%wDBYtL(=9@7uDoTN}IAJ)pUn6N*3&=#w4>aiBy@Pg?| z;%0uhMv;N-iPoO2q3ZpA|D8q+TwCKI0{Bh#NEqn#kS$3MnRtVTtn-Sb&qajn?nlT< zpxQ5zvM&&_eIOz8fm)y+aO6rtwg7DipF4<F17<6euno{^XiS!fr9VeuJ401*Y$(7?bP>I8h2ffJe z7r_fCy9RPW{>beJ2l@cV$Abpg4eSCo0ULp(!2H{g7tr^wBV_JG@Vx_nBhDIp+m34s z`vJ#rC*gKrUk-TymQBHTU{@COz|UKGlA9j;rG4J>pg@F z0``6x`3IKHMBahMFF|&oH*kCg!hxBfh zfU3Dj3v@dkfn5Mqz#w1%u;5|j``gIpB9s$w@>`G-s9p#jK;j{M2Nod>5)et}<4F54 zlpSzjDar-d3d{n$zyM(TqtGjm0A?F`d`wFBD3E#c*JCyE{}lKFc_ZL);9c+n=DdS6fWwE8KcEVj^AGSk1iFLx z_BZf)8~Xn%bO;Kx&h0;cOt_2T!grv!|%Qb0}gx^yn&6tI$$-h2&e-30BibyH;@3fUMP^J3j`7Y z`uE0f@QYj}5HGOr3*ZYZ00sd4fP(|^9asa*0)hYm=3WUN!12qWLtxDS=NfK z3d{m(fq}rW{*VVUw;`<&KF9?O0D1#GfSz9H<%`H8aO4_+>>dOjz&gm(i8#yR&;>9b zhyeY7H8FvV02V|AGBW}>!q5S*3)l{f2NHl6=m~TSAv}ouBfVMRIetELHy8Q2AM)J` znSepS;d{Uj$N}4DA|0R-=m8|YB#^Qhkb645cS6s=9AGT4;%?-98sr7mbbtrY1XKZw z3dmPGWCc#_efcq`-pw&zfez-nM6umV^Hc&8w3;8-(w0h@rCzffHX==+AJADZkOI&IY?%mtz&fDk1mqPUK-=xm127R- zb{p~moV*pX0*8UUz+zx7&^Q+I+=4j3?lH(WkN|q#j5s%e2ha!DU5(#BZ(!*t!~>4p zh&%&TKu=)tNYDU>N5CF|Dxf#8^ajuahp&e`fEVZu5Mak}$Oq)AkY`}`b;uiVco^gY zx&f<)LI=R&O6UMsHv}>Qdn=G0aB?v60t^DyWxxm6l}4U`<0-@g`U9Jiusz^#0(u1c z0qbE?gZ_+g;P{)64~PJp{)D^%Yk<{26;KIefCLZ$fgAZ_IHFy9E zo*Uq1?*S?xq%4%_d6&H;P_&cEie$+QZ17Ck01{~^~11DVEwlt zFVJrh()t$C1*(9<3sE)?ArC+X*s%b51q#6U2Vu{^jt7u7&<8m3P53RK6PO4rn-9B$ zy=@`zW5DrGP=>%jpz~wc@qh3)umIR~5Gg^_V@wlk0NjHBQHn52k^dw{2c-hV8KD8`8Uw~6*2>J4?rLLA@4rO4=e+E z1GzsV9mqSkyGUl8C6Y#M$ohcGRafV2aeM%$;fgL~7xdcc8w*k|EM}Qv# zzXRR}&aL&3Yk?bq7T^Kk8Q@jmUErLXJ>-i(HIN4u0nY=wffK+*V?20)%0n7}uL4g3 z+kqoM?^`@10*nV{0V{y5z+s^0SPuyTV}Y5#GGGhvci@~`JtP2(1?~Y>0Na2gzy;$x zBmvX|bAe}oUBC&T|7{*J444Wm0)7hY2fB~<5I-;um<_A~b^`wf2Hfr;BZ0et?*hLD zjssWR;UTra9AF)A0Jva+hg1QRfO~;0z+s@*M9=~=fbRnPfh+4gWE3zBcmX&BTv_iS z*8!7(xxk-*fejuq2AB;z0~`acX!MXA@Bpw1cmwE>ML7bqf$hMVlRV^l-~nJ0@Bwf+ z2Jk81>%cnTL*Uvb@CRlB%YZGw2Y{~`asb~0{s?%cKu5rBz%1a0z(JtbogOkAm|Gvm18^U(2KXnC$|HSX8SoPDH=uXBhqME$fPVm?f`@bfKL*|b zuI%uTEbugN5*RrR@qwejHFtZ+mw_F?fKKEWcm?P)9pw!i1Y$EhZf~(C0D41@;2r$B`%C2#|cjLw*2sUk0BKYz8j*F8m$v z8gTw{4|x#i@jdVYUIx4?P<}w4?|aCjz{Nj+Ou%P;=pk*uw}77j`+(jnVPC+rz=cnG z$iu*X;ESu^AA$A2nNLBNz!Si`Kx{R10=x>G|Fnlp1fB!_4#b}EkmbN3py#uY1-J>g z7kCQz1Ms;usN2Aofpx$Kz~`UykY->t@E+h_3w;1D0^NQDn**AGZvbn6eZUp#JY*iQ z2k8G}59tIp0`CA9Kkp$GKm#xv_ziIWPvDP$7T^Wo6JW@C)OBDMum*SuI0}6F1^9R1 ztH2Au8^FJTYc{}#0JDGy z@F1`cxcWu-G2jVcJMa-u`E!H=uK;Img3f>kfn7lFmtb!|C-6A%OF-BRI|S|pegmBU zGVBMq1Go?P5%3q_+%3pA@MYj>;GaO|7tkf}H1Ha53>f(e;sHMb-U811CF(lx6<`za z0Z`bAG6FvJE6@WAfj;*1*6?q5d0nY>bfbOqBe?S}Xec(0Vyd5Yr;9=k=!0&-~fy;jjzXo&ytAL%r zap2;ekPmna*aaK|KKDD+Rp3EjJ8QKClS*9nj}>lmYM{unRc%4@d|2 zK5z_(>_%RIZ9v~YddQu?^FY}i$O-%q_%|@%4YcdP-N3WJyFk@mcuH z9)uqOz6JaSI0^Xw?jaL_1;EQd??d1XEC!wfb^-qauKox5qQGlF*gi!sda8fj5D~dmeH>@N3}Tz&%Ic*MQHxkMaX%0Y3%~0k<7RxdWpW3V=U*r*;055U0C*XA7dWr1j5GlAf#-okK;KW5kqV#yJPP~+ zxbloLG7h*OSPr}e+;}E<1DgS%TNxP&tOO1KfwRg;2e1zK1MnemVfQkU0B!|3fk%LK zz;A(ffX|;@M)JTnfaAcmJ<7-=;0a(aFzVCDA21tu0@w;11ui+KjHG}&fO~l0*?dxf$qJ^NIB2|JP2$A-Ulu}58r_M zfO$Z?VgC}6>s%S5r&Y<#BJnl@hsAf)RV#DE#g4&2Ju>Pg6AzU<+)1S zE5^l}#iQae@oW+lZxRQI(vQJESlHx7G zJK~$-gXBA8q!<-93-60Z#P`I*;@`!C;+f=H&v0>+_*Zeim=+I`D}`0$kl39J6)*Pm z_dG3pMF{ER$Leneg%Ysnh&Q}Sc7jyyxwljq2@WCQsLSxvHJ4w+5v zBU7*lHiJwjvq&?!mwbtQncPX5$UUT!w2-N!gS3%Wk|UGIWO5hkPCL1q6iA-X*?jcN zu)ML5EFlk*#pDsPhxF75*aZ z7Y+!265bU4EbJ2w3U3K-3x5*=VnX~-_^0r`@PTktI3`>z?iT(a>=FJbye_;U>=i1- zPXs~46pVPIc&^w}JV(rkCxnlLn0Qz?BD^QOEBr$^B)lVBFPxvrd8#}^JVQN| zo?)Jhr&1UrTqg_@ZWL;ST4A(slTa;;5=II`g%QGV;Rc~fxLz0{e46wo=aOEeCpm|F zhV&qBlE0I;$=}Fd$$qkr93X!oZ;?NfKaqm)RpCD2eqpvSN4Qt`lF%tk7rrda5@rZ9 zg?of)LWgj-&@S{5t`G(YmkIrai-gY#pBMTGmkO5%7Ym;g`U)2czae|cAIKlc@5yem zhrCXHOI{_fp%vIcc9LCWJNY^JHTe~J8OwFAkga4hd5Qdj{E}=TFOrYQ1wwD(Y~c)n z2%nJuknX~#gr34@gmZ;6g-;9JgmZ-RgtLSmLYZ)qh(a&nVQ)fP`FwcBwQo-gn)3B5E8y9Tq}5mfx;ifapG;_Kg6}-bK+CtkHj_N z55!gClj5`DGvd?Y55@0`E5+5~-^7Q+1>z!cg}7XNR9qr{Ph2Q|N1QJ{CN2|~ijRxm z62C1zC_W%QEPhvfM0`U0rnp#qL;Q`nP24X2TKtu`Rs5y+iukVh4RM}$mzWp7Ce9Q) z#i`<4u~q!KI76H!P8aVHza-u-&Jn*X-Y3oyTf}?C*eb>ff3=fz)$8^q1xi{eY- zCh_Ou3*tucC*se<_2N&(zlgiV*Th}o@5G(rZ^a$r>*DXlSH(Yww~C)a+uq=*_tbeN zdM1!N$Sq_dsUruL04J#?p$wy8P8&J5Gt zfoz*`rgls=UoV}t_TlSPoHU|480kI5^4E}&wq5=l#x6>>&srkKC4UlYe4oT#SF9aU z!=71`zhlF)o;f`TD}~@PBZDv_vxTPCMmfxqX=U+FefFqMDlWDaOD%a@NBSnEo> za8Z^f3B8Z@a5sxf3fIHsUl ztaMVW-N0XGrPzO4SE$3*OA~>yT%-f_^l*~3V*r5sw?YReUNW5khKySlE=x@tn5#Q)IefMR-J*vfhZO* zq=uC+s~m1gz2Xip>61X{-SG}U+)=I+)!eE^*uOH^dm>+f_uxVzFjp6 zLs=M0U9GLU+7i*#*yelz_nk32H0UR)*P&{ICPjnDpddrWl-x&6HBYWrMl&-LNj^Zj zs1f%Tvf35!4#_t{y@~=PTa%>LG=SSz>hx5S&*4(Z?W{ymU)Rod)atdscxhDZm;Uld zMJ}X>a|McA(kTN@iiVPr)c|)3S36;XU*+XQ6)1`-SQJ&bD5^+NR8bR^shKpFBkWIC zj$>-6&#>sr(7|BdfF5%-JA{CNj2SAP7q{3m$ei@*^T`=-CJQKJ`fdno)7rCzQF+uy zV+FzOJ#}|=Wb@NC)3}NLX~`??xY*Wy)CIYtLHWTO=WsCvyPXZ)L0wLDbwKH^s9l}G zL)0FP&ZB^zq!qbEn~LN2jjR%9*#irBN>HkKx-N`z`iUiM?ra29!VcW6OOJ#MmUij0 z^CWm{sZRC^7Q!2mr`lF_y|vs9$w|}h4=PuieEkb!iNB#}b{&i^)1Z`&1Zvum4hCA( z4a$x-m|zy}bduC1t{kj7IlY1mtu<9XIxjfu0qt0OY605D!I|dJW@#c+;)`aqI&qa& zVOm|TLsy_o{p@ZwNo+|CL3lL?J2{Kv$n=zpDm85GI_0BIa7wRcQ4>bZqgf@OH`EWM zb1apf)#n9ai4E#$JuLyPS7b?n+BhW7HlipSv=}&^fNvt@a@^sEo_}qta?4MfKcK!UhxqbYYH8?W!=$oxu;J=4yTmGSRa#4Pdy{l{ z%Z>`?IB06h-2+{aN9G_O{I^SIIJ!PGAvdyiSx34Tk8lV_Q5=p>Nh-8eF--&YS5`DT z9b3AJrMo>TD`({~n{g+TtX-Cg-h?FIyi`KA3@qAJ9@A{~kgKP1(PCu-DW(YZ?#bFw z^;5D97}n@ajCVF2;qXpMM~7Phbm6E1)H7+-hgAee0!l9p;^;5w=`gOSZRnWE_kU2S zi)705k3eTRhUHtQ z(o=3s?fN$jwFiJXHze!ClwXaPt3PFvw@JB8J3*&icyHxI54Xa_)zE)scIYln#$V{@ z=+C+8qEch4rFUm`Js-5k;a)z@x&V(Nij3K^T*!!lGSl8Iu~A*KKCdi_TQTcnz;g{{ zJy}}QnAeh1HwNe~58^!D#yu;lS*wv1Yr?a-w-T8r=cdZ~qOczQjRc*#haA-^s#Ae6 zG3Gm*n*nahoSudaovEi`LuK%eHZ%sW$fX(D+05Ptou*uBs5&z)dC|_(Hn#H0aT~Aw zw2h^IV9OFS-(Xu4`RbGo|^( zdvea)s6#b&Ubr&KE|a<&%FoVU>ivY#;&lwP4ktG$YHwYr8Z4UB$)r6O=Uh|bB63}H zbIZ>NyZT~MGr9`&WlnZSa;Lq9s5jS@s{`Tm7CIeIdy`$!lN6i1W=WM~sR_3A;Fgj4 zVNTxfm7jb>8>a>7W78!mJZ#7L1k+Sr#LIWIn_s3-UAa6EGd@BZzMRic|9GC}Ffn=sF&VB;g+(A9~_Hv z2Q4pGHCdZ{+o%}RQF685s#yz$qrjBWP-AoN5Ztv!-+`f$uVGYWQk~$eh&nBIWCk}j zA`enr?$u9l?(&T!pp&ljg^@Z4RoSY$iPvSsR1zCZf^zGq*d!~RtXekAG@WBG+KTD4bA#C<`7#`5ZSxvcheS?G(U_TZxnS&?K8FnO z8XJwATcbJCdYp>Qp~6(J)>$@G^Ad==Qt3-#-&n}gY60^qAsVVZU9HOIYg_3|Zs`n$ zG__(D0X3_=fa2HG)CEo$j~J)fO3R8o8pcd0m7?_YEA>+?C8!W1;2d3>E!`Y zx40CJ7+$IUarAskh*}RLV8!Uv7cPlkWpjJOX=T|^KcaPVa|_y{scnVRBqkO{E=gYz*ai@oaVm^64H(cty!ms8^$6xvp#}_U6+O?CFKWKlIC0Jia=9c zi}L!zsnpC|{m8oJ+-Wi~iP^~3j`r-xR%vG3qM}lVZq1nFD?vlK`dhN~r!70+^}m{% z_NKx0tsNNU{|{)?t_zpXPUc*rPs@acC~uT%?Uw%QkeZ6RLPL{c3{wAs64)fBTW;a@ z6m{WrJAiqm%6YdA9>6dRfL*ESa6rwMW72q=TU!Zo;fv;nt^+ySsAFpNg;8zUmQ!Lt z#g*0)ie_V1WYV4{G^yy+7SI>Wp_QRp>&m^2>O4-Z+E3$8$wS9dx|M?!3shrB0|v?6 zTSwLfAN?QoDKZDXp-J2o-kKFi-|6J8TQc00w$hctU5rtM$4m&V1=9MfBoXGH9D|+5 zMWqYqk{nz5ppsD?7XKC+9fs4F<}h{Vm>bpZG&PtDi>D(+Am))|L*UU-7eIIIDl^cI zvf%wQy7z=-)TP+y0N1di*HCKK(EnzkSyRIxRkvfA77en3IpzuaKl08e!_ zKznK+VkkatLM#R~4UWcmbsrCf>nx&VmeMPY)9^^FBNsXQbk=-mXSM-Py;`iwnl#s_ zIAjt-CF87rqnMzT8l%qAD2KFmwCI{G$zib>6{Eq~o3>R5%#>quZdTbQ)7%-1%1@^F8eHh^#3r^fa{%I+J2qs7^IdNxUPgOxvj* z8YxH9N=SEXy2?c}L*q*3UKF{052}3x>wZ;!d2r}p>+HE8mJr?4W^GfYECS~c@z$whez(_dTio!r4BPz^1)DEMwB3%{-Tn?6UcZegy-S)xzZ9|$(-)et0gv2fHuds)ZOHW-MVx;F+w+Ghbz+b)Yl zTx&e#$`#X0W+vPTizDLy&_R80g$2GZS~E(ADF%W`S=SVK`yz7Hp$y zus5=Cs)ZKfnvRyr3OPPc-)82Z*Ld(E=q?H{WyoArjjgje)S(2;q;7@Cq3=pLnhwF4 za;JtW#_Ss2mF}@M6{Xsj=>HibRO+eO(mX6jN<ELNtT&68H^$NV%TurO4yyQdvr@~1$mCF-`JNZ_OgtVL| zVc+b3k-s)aX{UfwkzV6Yd$4vX6sZci?2F^+_PC?kv9z}jXkRy7Kcr52@Awo9PGczB z946q~<=H)+-IS&mBTvjMoT|E+2b22bcC1dtHimWNa_Z4y)iG*^+fIeIBT7j74CVw-YN~dY}xyD&5nGcPr0(FNP}U=_gNdxv$|8!JNhH^@UT;{7AYe-ezqFm z9dPppw8oh2-@`IdffiG->CvOtN*r6=6wOSzFThC?ZKqz6YH!n4SErapRUJKauRmUR zI%_Jp|CelWc)NCIgRO3Oc2rCWTkip}OQINV@*1dQ~?ak=BU@TZn-9f_6rNM2?@KI|lD&-5)icHR_n)3V!Cu677R3XQu zion^of65}L7vglaf#c|<$PzfEHm{4xVs~_77hRA!S9YUkn ziy<@}lPTs_DC~5-yQQMwwnen4)Y}VmNLZP#n@qRmOAV8<7fe11Qt(New2Ko>V>oJ> z%~4az&=*BPvYVE0O&3yUoke=$5Nm`b2(CLfY-!fIxLd!d6=N03Q2{#QRZC7Tvl6@vWrO;s^rOw3;9!b20Ln@-Drvg|PcrZ;-ZP4FqtahE`2@X?xE19lCdhmr-3v;Gdx1$%ABc#B+frdJ3 zhlJR<^IUVool?atHDBDCgLGsu z9Gm7&kp&ulIwClQoHW#H#_4hf(a{q0d|c0aI&zwt#X!sPfTu3HgJWq^ZiTgVEh>fV zTri8O-W#jB7e^w=kPKDKnZCII*XeUFFGntP{4upnN?VbcTLC$vu4bjtb-p$?Bc&nR zmt!Jw%j?3Ax@`SU7n_c15nR}wOKx`az6ec*-nd6k^c-?(GJ1N@T|CtaPcmPP83s0XiaG6 zSe>JAxb3wVK3c!ZIZY|Esy-cvsdUDxGMp~ib(FCI2d+^j%(h(|v4cQUvy2Pd3gGDb z^gQfr1P68aCw%D<9-Q!+p*E7&k_0oIJ zj9)VY>h*_c49sytjg}inj)Ko-5_`Zj=6TF)h7G>SmXmZ&)EuKKn`84J+{F1&tS2|j zOmAtPQJ0sL%e;Xh95PZBIX44_7^qRBJL*TG95nN$g`yM=%|nSSWq;+wmU6U|JNu|B zdt8{V7nP?)fAK}=!X2A`s1o4f=|7a%Y-KV7J4<81=y&R-I5-k>nIhJh=JsZJ_lv>2 zp-bf?p1Tbo8bwO*l9D?cLR-BwswgzxY(}y)``J!q{)!N!BsnMA!6Ty|M zN<~e^fnlkws{^Z&T32^ITI=deTg{44Eo}$l;TTA(X2z`Di5T`+N>l8>O1=7B-BIV< zsyncf_FyW7rd~|smKoe($kKN9><;NR)GM~^G8l8@aU-_)oT?nvw79AHcU=(NCxmI~ zQ;9ES!ue_(y(XNz&otdz8ul(oPo?-FCWSQf#JoF8(Txzb)H(-KY)qD-v8uVHM=x3} zM%8Y7Xxpe_I8dZ}y*QU6#DxBT=3C_2+?I;`YeNGvz9 zx;@cjo;7skZ$Wq?g;jllo%fb% zs<4!F_Uv8vTp7%O{3b>8&}30Yc3)Va;iO0hd@s(NO1qh`Xq;s` zp*iM|_v58ADWyy;W2eo1xe8EpMJ|TZXf^k2Qb3VOsT+Fga=PFzTANOmu zieTct#^K5Yy}E3D$K(?7W9O4}55e(Wl8%6SB<-C@$r;%P%M)0p3pVUup36u(=rAB` zpl?yyH1O04>gyWl#3-GssAgjbW(D?=@cfoNHT;8gfKRJ(&cv1t$E;KDkWo|+`ph2X zPaoN{r=(Oac>^y^T24)NiEiBw2PyJhgLUuxks?=8_y3@M?s8a+R&R z7KPJ*FdK7qWoxj?LmM4U zZr$Ru+zK47ZYRWYPRSz0lSY;CWY$U}13I^D@K#T<%> z$~WZVVp?5zG4ZaGUW=t0FebI;F$c=_hR}`=JkXH5(vM@WwdB})^7&4BbEFc0&AEeH z*lfIXmafxwzq_0w9aO+ zS-?q+W?TW!Tu#@SumWi}yp~X;5@|y%#ip{ClJy(0r$X57R1i ztTASL&s|=yElny|QVxg2e+=F(#Bm|=OVXe#Z>Et`r$WM)|@8Ur0V51JSsM)5;ylDQgQrp^^$c+-tV+zxQ*Tt zBR3hXd6zQ?R{OK-FR&v{ZFDo0G@Rmh7tB<&x4^#92?=QiSR0xZOKjQ$%=T6m@gzCD z&`V2P^NhtNOZ#W4>@>RDJh(+L8(kLYRUJ-h)Du91%;ZeUb0M*8vUa7X4UwuNS8Btk z(S;htU|70h9Rv3`#!*1Aq9L(bhrDpnOy< zE4|!O;#A?ZfOPX;F~T7={Y<%ALc{4h)h%^7Z5UZhBBfEouMBH#=uq9Ln@pgu$<{TF zYRR!(QPg=A5yj$a>}NrXW2mUnX5!vWq+41V>6n<7IJV$vFSg6StTI&8QfENhRTFDD zK&^P35>iQY`|tT&xYfn3Xk@l5j$DhS`o$u&`Mt_cT|7kJ+#>&Bn*oVUb{fkk(@SS) z!gV(fujFaCP5Y?bk(Zxh&m5a4o0SVPO*^^VBC%Z}R3OVvAp4lo^C*&n^nRBswnIJ( zf&7$wAfVjXFJGZ#y>iP%5_&8{+I-|vmMpLEN2O&~xm%we@WWk2G_saa!yQI^tD{3D zIt@+V*^sUjEG>N+zht51?Mx-dLyHRsuZW8i$2pw!m9Lj9*0SJ+rS&UI8%r~8UxR65 zZf=#Cs!FVDln=YmGMiV919s_2I(~72yUF039x}5vUEGIvS~9DgNoqITlWVVJ`2-D( zMs-`dVz~1=yvrqRv(EP3R&+GyZ~SChq! zWZ7w1S_MiHPBJ;eTPk*ma7f)7IBq1jCXW+I`g9uJk>OSkhXhagMVVp~r00PCOK;1R zBEs;NcDz1$`ro%HMTXPx(oM0+NlS_U>u=t0#g#iLw*5;bT&;yXKN1YtKE|Ui#13a; zib?QMm#g30y9iqHZuMEA9L%=2YCg*PMlJe~{sOK%8$4|2;F_Ajx7zt4m185`c9)M| zjjWRnCmYW&(zBb6+O5c9vjIB7@)feUeG6@6LGCg^o~Y?!E_x-C8&6Z0oq6O=-sOv~ zjI=&7XHaG6%VuaEAbo8sm5?UMDNE#schQ)mg5+TYomZ=ErG=*)^=vjB7j?@Fja$_` zxk+lEPQCCISs<092}Q6H<>GgBZ95~1?df{Bu4QBF*t(L_{;Xz_N_Ws@-ONq>_MK$c ztfEF};&k1b4QyDwg}vHY18=m#p1^f9Rznit?ob!p^krtHxdhH*-Cba&UDS@PV1~Qq zxvnDLR$uU!r~r1NP}VWW8L;LU=_)>+Cmxooqqh+|)(rCy!PN;NLPx&E zpw*Dqwlm@P%gIYm`>E0Bi++xBjlQ$FO|t`*e`ac(t}XY?Ez)+%Q|eG)D!C(QIk$* z^3pIeo43=X8m{(OJ5N{6b*ycBqf+KoN_N;pzhZ7QQ!{lg*Lru+)D>B53(giz&iae= zCd#|>&Dw+Oj`Cp0iaUa*O9M4)18$NY-cDtYO&wXKOJQdrs*-pS4ezWw3JEEiCp8x- zqa<=owgnpsq_;N_RFX;#1>x)eROeXhG@K!gIbBKc+SxR&&>aR7-bTWaG~F zl-~Y0Na?Ufr^zdgT-ZGlHq+8(T6N^4t>amn7E>gtkol#fBc*rKfvDYDgc=bHl(iXn zlb3cS+dG@-*+a=HSyO~2aw^v2R3f@1+(AnUKiAxY5K<^hPA(!&&{{aPr{k8b3Cf(8 zTv=V|i=|Ulp;Tm7&d8`+IiMD)e5G>eJf(7=wNg`WF`huP3B;YC3ZrI{)1fd%k#pJB zS#NJ2{EmXkhXu=hg*JcC)bmlvT=>h&ZtR_Db)P0P$kXW%n5--*+-%mGZ)|SC<~rth zxxUCnX00>BE`&BV3u?w$ni?rLA&1&&j^1SrOCl&04EEZEB?T9S(BU>^%+2Ge#4V{V zFpW`B^m#3vgRZk!RDPT`&oHkHk?4!Nh6fsTPMaUUA=g;f;PZwubRT&&t|qRV%+6NT zDi1AEFRT&C6m*9dEeLMl%`G`zFh6~~EkUU>tkPi9yt*t-O;!n1esBYM*;XRnh+B!W z4R;#&V!^%!^ONZ6P0!Tg7k07Geu^$R_&Syni;E#N^Lx?&ic`$W-FU`-b?j;t@s%?H zigd;R8alGIqdlwLT5nos4ThDWA|xD8&?Z0S>C_1md;^+08U}dT|A#MUx9!>|M&HPm zYLh7)TiHk5;CA;qKehS-y&}?a!x}$gu0DtDBlLE|Q;PgwR4do2IaP^ds0yTw4IGQr z0!QMJ)7n;AE*x9abD^tfH|Oo{zR*+Bf~E=BFs1hqYUy(`G^WsqiRP^BnHWQO?U-6R zeL&}OTl2EbyAZH(qrMHpk#k&S04}g}k|`#3b*u8$Xi0Hd8m%4q2DZ+t^|vjXVA`;u zPrk>|RUp&36c_Og2Y*~?bpv1*TI!@LvyDgN9iJhvtD!|aW^IT zAN+3!rq24~-J$-}nEFeL#{IQ%(Ep$$|1YWk6%F(xWSxf)(c9hI%iGs`nfEHM-y8E* zc(3=?c*l9`y;Hn-?+ov3?>z59?-K8F?<((F?*{K??>6sF?;h`d?;-C|?+LHy>+b92 z>+8GBca_iYi}@;i*ZXRG<9zkLDZadKhHtiSo^PRViEp`Ym2a(YgKx8Mn{TIYk8i*4 zkngDPgirK$_xJMm^gYO1E41OFuBXmyag3!gG zD?-yy(K{lIZg2s_5G2hUn(#w&>32p6LGQq3F@*iKrOs9_tnB z8@nuaRm>lY#VTUg$7*8ZV)d~pv3zVsY<6s3Y+-CkY}c#nOpJGr_loz8UlzYA?vKaf74hriHSuxr`uLQ1K0YHpJ3cSIFuo+dJiaQvHohUg zIle8vGrlLjKYl2FG=3s3Cb}njCHf{VOI(%kCt`_;#Px}q#JEI#VoD;Pn30&Bn3q_X zSdv(tSe1A_@kZjU#CwSoiA$1KCnL%0lQqe4$@=7!WIj0~IXgKoxiGmTxjeZlxi+~W zxjDHlxih&Zxj%U*c{F(0r55+d)5(3DU~)Pv@NtVv?sJbbSQK*bRr~%yN7#)`-U$IUlsO;W8sSM_2HWExNv=VN;n^$ z5uP2M7hV`%5?&r&64Qi42TXM{_z3vf$>3cZ#)=}#1rvMyfR)D9}%yP*T%=j$Hyne z8{Ci9Zy7KE5&j`}iN@S0rvtJeYViu`;nfu_duJu|2UPu`97Vu`h8T zaWHW>aU^jpaXfJ{L6T+3Zpj|Wp2^cH!fyqHhZ!!oUkVs~dmC35)h-7uL zHaRvqJ~=Vjm~2Ysl5NRCvNJg|IV(9QIX5{!xgfbHxj4Brxh%ONxiYyrxhA(d+4o6=j-ThrUqJJP$-yVHBq`_c!}2h)esN7BdA$I~aNzwi=LDbRn* zyxqJ#ygj|Wy?wm>y#2icyaT<1yk2k68}TN*8E>Vx$~(ea?XC5W^^W&W^fr2%yg6^1 zx8Uvc&h*am&hgIm&i5|xF7ht+F7+<+uJEq(uJ*3+uJf+0q^_X ze|kH8bA5|_%X}+*D}AedYkcc`>wO!2n|xb*TYcMoJAAu*yM23o`+Ns{2YrWqM|{V8 z$9*S##9!v`=I`gf7X5$;{-61~!z)Y<+#7f<@M@p|b^2?;4}!;o>q2Ltwq1=D@@r@p zSCqe0{(iY9QiT@pt;o9(61_M&Dq0s^hPEmSOCA$zk3AN98WwmW))D_&{JZgA#COLB zB)*uqF>w!UT>e|ZK3$fqE-iZA*c0oKEzaf4s(JeVV*$lgUDR~C$>hjbrse94t z98P7@FQ#9kH>2E-wC`NcsuX~^q!i6(}Ir%e;xcD`aLhf4@TkZCcv-#JlwbZ67)}g zUB0`VM9Lyt(5n~~t&QFqy((50YmGgG*8cU_C$Y29!e12sBIhwfieV!Sg6`vEI z8=oIv5MLBu9A6q=7GDux8DAY=6JHl!kD9(Iz9qgjzCFGpz6&L{H@+`^Abv1@IDRC4 zEPgzGGENd@iEfD=iJpnxi9U&biT;TJiGhhh32!2ph$Iq;OrkPTl^BtzPShsGCdMZw zCK?k>iCm&BQAl(qW+fIUet@3A*2JDfI(Y-?zqv2)D(dfa6t3(Cpi^ zHJ(Vw0qAzQ_gU0}pTqj!_Fm}=_%gm~-$Y-dugTZu>-5d^&GOAbZJ6&{;9G<`v9yb| zqKChyzqh{+YDa(n0RKS$Aivii^hf*&f5uHJ%^`9r*BVBPESqW3m>{H zy#hXTO|ky7jgYGUG5@*UyTiN7yW6|hyAOW!p!cx%i1(QHxc4NyO_{HouZORvueYy{ zub;2KZ-8&0Z;;RH3;H6yl_Dsc7jj3;^evelo$ z^kDa=-%Ec?{m?A=?d7>EQCflQz>P!$*fuT&ct8yFv$7-&R3bAh%%A3N2@b1IwOmjjgF5_j5bD_qPb{Wv=Hr#&Wz5Idz34q z??nal9a9+VRmCR68e-p!JsFF}AB_J5mXU#%{S5j@)~7b6Hl?MLvvv(XrI=)X5Y{m!-R@wtI{LV z)#x{kO^;7cOgE;R(z$e7x{&Tn&qQBpPI_*7KD@!A^kUYlqCSDwuX>%@?gB!Nzz0nB z-sgP;zJ9a!UCeuYh?$R%G567p)x{g&>mTu*15dl&|Bin^U})eOj9WIs*7^rS!C@GS zycB#5vkTu39SLQ_PoRE<%kM`2<@xeIl)qJe1Z^j^hdz=1|A*Pboao%>{OAIVGuB{U zU{CZ@7*kvpy8^wIM`P#1PaI8Ll)N-~4cgSVlK)JeiQdUKP~t1)Qr`OigAz9PoIgyH zWf*3|S6%20c+1f@9_hWw`y~3fFM03w{lfPz^i$`duh%E=W%!xr;Y-d9hB4+`8~k1H z&%wjNlffQn8+(WPg$9HMh6aVapDk|9MLVO~kqT*AUv?vxpNk4&tU9oPo&Y>Hpo1}YHHx+aBMctqDf6=SaMq~8Z`uEX7>-0DEw@2RGX1jkH8Q2X1RdVIY)dqR|9jx)TD8LBj9XUs{o*gwT~kL`u^Q~%hs*vBAY7y&8cH{k!z#QDbuLjt%l z{#3jliy4*cI`nW~Js`@Bx2~ zx=r`6u9vPH5}p8k5jdzNnC(L_s}INgJu$k(@V#NbApnw=D9oE1VoT%x9N#m3X#6Mf z$!KT$6YlOZ5G#1DjN=|e`)UPg{P^(i!4Fo1>mfT205|_>ghENUFy|D!nMGuWqt#x^6x=j-ALs2mKxB#rNsM^;&(jK2D#gPty0+Cxa77*ALPU z(PyA{=jzS+LcLvItRJm+=*Q_N>0i}P)xWKup`W8K!RmUUevy8${ww`*{VIK_{yY78 z{U&{xeh1cj2lVBTNmYWQxuCzIuSH483Q*u}I)J-TH^|=%1&4Aex{aYTWX(fSQ#s%? z9ENd*lQA`r619fhw6y^?_%rnV;79o<>-!} zRdo1JaLV^U|B!=K`HqNV5gKR?rbQlte&BY^U7E3)Dc}ni@x0)s-<%J$Ym2c;a%jhC zCxNRbJ!gh?jw0pD%wB_34;J(jlFKDko zu5nYVkLrQBL6{5XMZFJcg^-Opq;Y>nJ zf-iU|#yx3&Q_jhCUcJI3QWrRG5bBF-fjsJI^tkikw?^C^aVJ(k(GhVG6Cpd&MP@~A z!-zUlvsUvHxcf?tQX33D{z35Wy}_rOwd1v~p(cb{C~cqyu4}m{->85nHiLJ-9IpO1 z&f-L-++J6ytHcdAu9`|#&Z$x0k-y=VVrYuMEmZn0}3T=~&<$nejk_K(oaEupkp>2ie#_Fc%=I9pb zR_RK0-|05#cIfu#4qya3j+~s;UC>?8)#|S6IK8hvKp&zH)wkzIm3uI*Jos-LSrpL^ zME8w;6sw}V==|uHqhH5*=0@}rhNmFcUS|l8854Uh))#u8`El3cLgMd??;M{4$!%W3 z%aEr|A@m9L;dX$hdjK3=5@ej&kZX=^qEvHJ3s>cFSnDQ5^o~e|JSaV4P{a^kDrCl5 z!Tu{GL%xw@?VJiZ&vVd>z6*KI9<2VSXg<*_!#Z~dzqY-ix&ABGwZFx9*0SF8bkz5d zFP@94kLslRyY3-KPy6Z~rBbAs(3+O%g7xv}8&Bw;(&t3ajs5}a+`8xqhI!C#{DPU) z25sY;G4IFR0$Jn6*khPE{Niql3yaHvtb%F$dh-(g+<%*NpK+4O2`LHb{7N_*YhiPX zSHnlah3fSCQdrgGwZbjXf40{CO{;-L!(hnt#%aIMF43;g zu7-@^d+i48X6-g`7w4fX`Abw^XfZEGJq>Gv6S_9~PI`^LyS_jA&hy~nPU+i4KZ22T zZuF<fP>0h)OUdB%{BzO!jmofykNeLCb2HJgJQ8~I(h?4tO2ZPBw{D8 z)k7?m_vXqZyn;mUZNm)19B5JJ8x|TCLAtleaMEzbaNQ6Jt>lBS5=eq|Kn5%VMmK5? zuo1df4m$r1(C#NTsM{y=!Hn21VwXVQSJ?#pUQ*mZ*!h?tQ)*nIR2g?8&IkH`Z4>nU zZ&Tg=chKUWZB&P!1UbP_%;i&?Ajv+P;M2tq66@$DNT_FY`J&4bNF8=Sqklot=co8k z*?{-;Qv$U2Md72MtDgh?{8uvVd_#O}`-poZ9>9u<=#aj&-aRqFYe8D>>qCUpyKF}?L-O)K{pknmH^`Gn4=+{Al zvlI4%C-sjH-iU`HM}QM*huPw3SaiZArQsXHj~D}Y84kei@ucCRp~i3nmX9H@eC!Z&XUx4Z55;I;twHo* z{bJHUv8T8O(;y*lz{q`#)M<~GRt!Ze+sGfs!LxDa}p@z4s-hbFkxs~-5KrUTXY zF4L~mu7#b$kFa&w3XRTg?S5!=j%iP7>%mRysSYOvnj5p5-ewl`G#jEeLo4IkfEFeh zJ<_NnvwoSAq=lohl@5@oxJzm?A(JIi*gg7S=!kP6Nq#HZfY!OzV2imUwgA>L!LVj} z3APcD@m=Hd<8Q=wNq8PT?*jCseqGvNJ@ieNA4tC|@!?*@B^2_H9ufKA2fu;km2adD z7S{VACH=cbr+Egp10QOB(A-5=7RA~xA*;NmeJIKp^)jp=e~dZ;OXrVt&%*lnBy2cT z(NCkVTrv#6$bAZH?m|dxJHqy6I_znd$9*5CfL+xl=u(ogHv0s++rPr%wHNHvkcq`U z)TSyYd_wqSSe35~kBWF6wZ9BDU=@)QwL7(;Q4d6!V2$aB8V_sB2OtBOpgX3!A1nWP zpvHN9tLQr+6Y3s40Q8s|y%Y0E04yNK8QzZFjCD#Y%o>}q;(spwv-s7RD|W{pg!OJ9 ztnT6xhGDH}Nw6i1On46Z$g$AxOvdaz7ux4F&_^Bu-EJm?cDW04N-SjmgJ3yQ1by+F zu(?~=rGnUlVel#@MTl65m32bo$jCy-|BqL!Y$@78YG{ZW9OVaj-c{Y*uv1IM zdTWmU0qFUYu+BOLskaK+_lFGYp)q{~qr(?5-^9Eb`+4lC*gNBf!iF&v`Tjco1&p78 zuvz&YHo!*-&B|E)-4nhhqAKDR@Z;^Z{k1ueZm!pA(IWRm^+3z=1BLzx%Z=5r6W;{M zyb80^C((zZeIO(L!LZG+7xk3}YqDjq=D0VubF2}zSf^tBp>0c#x51KZU;OO}{jge^ z2z#3H1P$zGdV&VIuuNVr=S0eVs9l+NK1ADOyTUnGo3DUu*B@iU-LOnc!0v%e=v5|Q z&%nnKYa+Hp9F91Tb`cucH8Kr)v`T2$uSSNTmxse{I9-zi8<1BZ-Ty?h8a5t>AnWX? zeFIkhtzhBX5!%;2u-~^qlFsS;V6*!G?C>&Ri@ylg_leMhJg(2tkB4lPSlD)e1^ohk zK0Jh4QW$PCgkgsG2j+$sVVSoPqkk{V@slAhc@MVi-@}r9H|$zNoNQUAK^OXUY#i(h zpNxAe?t{2Nuq1s3w&icdFMy_JIojgo_?q}@@%8aa*p&sN6~2}*kJ=k1!ZzXcF2vYi z6RKMStIU+}=dtr*3#@@ofqw~sH1P?n-Y%g26_Iygd^BSZ1gG(XE%kjE@1BJXObD!3 zI>9EoA1t94Khxkoo=$ZJrT2s%K$^ut0xCe?xBvcXpW0 zlK!yvc;0Z#aM@662!aj&$e2Sh$6_9d9SqAoYwUSg+=a*WzzjACHnu+Tk(l-0h0T0> z@HUeZc4E|t?h+3x_IcFuN5LJyT%im%VK>Q7;k!|iE09i;HLRz(;P;W3o^`P>ZD^gF z)PODB3z26c{WN!?-8~8WNE0lO#%d;NKG*Dqq*be(4vC9D`hG5K#&3n}(tt5*gl;0N zJyyZ;O$}LjZ@mQ?w)gbs^!n(hVE=X``X218_`whu6AP=i*|6_i4vXpX7THS=iG3!v z2zHbUn_xE?5O;T6r?`0Rl;{teNF$`9HdsQA$3BVa;7E$8e&{od1gGNb;)Af?;X&xZ zpHKL6m%n#0U_^WZmNW}67I2{oE)I3;7ycz?_|@UxMr?~X67gqPCe8#;eK7Ku$WTp! zra$H5?u7-_63ngNV8_ii?6|4XDq$s|#>ydu+CmgI!3KitwK*PD1uMe8xLaN5y#sT6FUwwZ^I!-7l*qIR< zGh$mt?8*e2GEb6*>#!?n503f{*{*~**^Y!E{BDG|VGTW>-*vD_w$tDWb{P0#cR_o8 zXTf)nB%F(_iuH*D&BGO3EiMYW-|dd@u<*{|y6}YXp5gt#s}6;2cL7!-FMuO?9W^o+ z>yppHm%^@h<9}?o+cK<7x5@UoHN0nLA~bz-uwUkDaJgGFyD$@;(EOr7ffE&+mNYpp zHvfY>*!u(gkI(-B3M?DnL(huo&k=P=B39?v63R`&)gRXqT!V03j%#aN7y59HP+Y+R zJ8s5r+Sg!=|?4zMteyKoIqaE>@!)wn)^Yc#GSa81E=8m_sx%JC3AHW?Nj z9>O^!Ji{gY4!|x2p2Y~?g6n!*PvBaPt8XCZsKxaTTtk(dBN5m8a2?OR^OL&==@Ny5~B%c>Ngwu?Z#)yy5 z-bnt*C)7*0+Dmx2m+(X{;VE9iGrWWsdI@)U37_gEyu?fRVlUyPUc$?~gqM2>zu+aD zBOM$cH~M=CS9=K$_Y$7yB|ODTc!rnoLNDPCFX23X}AMW3lJy&n?xMLR&t_k4gDk)ExA}55zCROy z4!eE1fwK68xYx<>FWl?PJwyg{{J?}t+`8hioX9RKkkH#UbT1nafPz< za{uPX-73qEBg~IGBYSRs(2pA}%YWrVe%yT7{i_fAInm1=>BoWO;^!W{ANLno{t^v% zE{lI5#*bSm%ip4|ewjlE;Iua@QKKrcToSQfvsw;xv|%YR0)AGckGPn+h){Y{pi zL67-y?Pd7QxG$9DFOciY_2Bw(1Gqk1cdkEtXg(q9>sNoNtUYzKrs6yUA=g=?o36^i9^*#c3;`Q_42L_7k*mdQeS{)QEt}NoPIrHRq`$P)zT>L z@ba|af5Y65{Ysa7n*3=0hi0rFzvq{%cRpZXsIRM4mrm{7TDfDx@vYw;*|6&Hx+VKp zf4XVmu}xArG`J~JrElAf5K zn(%Z=Y;Hfpuw=A7o#`J@?mr-8@NyUwf5zjFjp^OHw9vdVD`U;Dr}kN&`OaioU>R=F zN3%S9I(>qi{;0CqZ@-~XC>Z@wWf!)rme-dE59Iir{^(^yM}47|5yc(;<9Ry<&iicIn*J^QY?0R@9z4 zf?i*JbWio69i;v2-gs%}51Zec>|S5(p1#vRvuz8iOibOI2f1pv%d?2jX7syy_5|oq zcjg!dtJ;%CYEB-iIdQP&_<`zU`)W{xBfF{(@2ons1J#Ep4BiFiz{ClqBS+zXLjV3n zk97Me&xHE=V$kFGu~a^v_42|6@1ueyj2*LQ*DiSQ*|ljs(q;blUwcVjUw~)zi&DUY z`XayAGp=1Y3-Y2@UfTYx2v2Hi?T&$mcYJ)fe(47@mdqPnSF!5m@l|z){&i^Ol-Kgp zGDp88rxL??z2?gGD;G$W{c?&lgOlZ?%8u-*I`s3E{aa9F+dq28y}s^vCJdF;;wp3L zU@p1ZviggkR(!gC$w%LQ_TJh>b5}2%wQ|Aq74zR=Rmp(ISywNdc{ZbO z-7l3-_m8bRdjhpncj_4aYfm1=Kgz=Di^03Y{5)|&`IOg+x^_Kuv|`<~$(suc#mYiL z|C;ma-o1N4c~(31H?Hm8xt&(o2K=MTT-y1gNPh+|uP^v9{b684$Gmp&tPA`=$HxN? z*Q2uV`)bB(zZ_m$UwgRj!p=)4HdgKV@~00SIep_@C_|9XRN!|FRd(^LBB~z0n##j9 z$M-8|D)76qZ_BPP-*d08P9wu3#&&5+l`SuR>iy@2mTme`o^%6#RLV{I*|KW!^-E{3 zovT2t)gAe{X8%T1nV6Fag-_n7t-4Wjs1#?le>KW+NEDmimT_(Ts?mpOv2T3 zC$65U$f5mlF8nyZ@TK&$H-|p?ZGi>#C60$n=1l>GP&MK|=uhga zYzzLco~^jDceA{{7`!-b5%Qv!3A30Byii}He|PAC+gpxZnX^+ig3`NGQ!NqyCxK3;S3aMVwEsIRI6+c2YvR1%|yzhFrH=a8mU z*{-smN(LoPO$ncw+4G05zhD>|?q9oqShZu_@@=I{ep<0;{nC%V|JMiKevXdz?$-;Z zi#d6H)Ucb^ug#w_=H|7!sn6zuA9x`<^+ruqepPzTTC=UKHZshfkL81)a1?KdM z<@?@vvuf#*a~~}{`0|8ZFOEWemD=sA?K}&;;{CT!FJc!HJ-c_1UUu!mnW}@^&Ec2z)tc!iKKa_nndBo^vM1sS!`okGO zjw$Ts)w&zC)u=KwKMXHd&z-D0eT;BH$M#i~?=1iEYmrJ~^q8^TpIZF1SY@qp|LiiC z?OMHb({#tS7alKnq~NzWBXR1WaMYTJ!JB8zN3&S}+Wq57cy3&~idwsN`P|iW6>C3v zSIo(@F&1waNVxDp2P{ZWL;r@AZ%U*J9ag3h(B8`e z`q(uUghWTG$CRBC>m0osoqF$2rDA zO{9{Dq3_fIsH6AyE%sPh04pm@IrPo)Q)kYVPk6k1{D5O+>%_PXdp0foko7Or8uOsm zSVvpGWMNJ+&uKFxtDk&Oj;-NaKsE{>#|9Ebx{#={POL9@Fqg^et5JAFk;4n)A(_AM z^I5y&_}(46H-58uWPF zViT#a+R7up9Np($U+HfTX`r%zfBTDBN4BnaNz|oViMMjF(;rX9@6-q5PR$#A;`Qu` z34@Nkn0&0b+fjQge(SR%MBs|CX;&OQ#42d`7O@%y5HT~42NGS7stXebdJ6ls3|<-! z$t&*5JLhhGT} z-(!6}F(cDk&thrqo&W0Y=`S5#yTm=|hC@(UH%sT;SUv0difLCDPpif~!?%diD1dveJdvnEtgvY>499wB+t;6ql>Tc9kgZ`*2BCrxl)Li(1Yd^*?c;Q<8 z$Mxi&c|Jbuxqm&n_o{Yz`KuS}pZNCJ)Qe>P8ozGy4~ySh_u0H}7QMUnersiY@{THmh)@6UfC9}WQFGz{ z4-(m>gEV{#`ZNk4(vaxMh<1!PK~E;w{)l`MJf*+sXMbd8_5)UU7;e$i#H0X!blo}; zm_?TdV%*H?6V>pKWxxdwkgy*^4m{geFWj;EIUX@5EIMwRk`rKNco-^% zMD*hpnQTf<-(nD@f5*~LeuJ#+Ytrw>lf+Bady?lI|2$qBK6u8uS;X%_Nc<^y+v?up$&g>V-qI^_3 z`<2B-uY6vN+xe^CamUj@quui3r$e9lOWwHq3+JX!_|!Uo%?y|5;;l#@)?jI_q()n@ zbAy;4F^Wge|8%4ESRw?Hd5+kEIN5{9Y~h5t4xkun*^l|fe|S88#E}|LS;P}lUOV{n zPaY>81|#BOaq$m$j4V)GFr$X*ii1^0_lWZfLo4FP?HBWBx!|upwqKk-MEvjoGi2?M zvAJM|6w@O-n$eBg8u`%4Fk`eT%TJJFW`4lmym}P^U?SB%f2#I0k&goN&-Pwr1zp_X zD;JEbnEU+E>9#|!=VJWYJ^E2^m|5J)1>*_)H0z<)hwU3bc-Qlfdc*9VmU{?t>q0kn zD?$#Q*-bO<7VUU`^Z~rLdJ&^&$G3}`(2m`Dq+a$v2!Fsn0EWl>UOKz=NWHv%+7Dhy z0VIAOmd@g1(u+sxZShnuELL-=NBW7HcLF~MqfWPvJWs!$pS64Zvn1d-vU)ZAN7k$n z16!OrLoQ;5rvd!l+D!wEiD3KuGkNw{it=>Dr@)Uc$Mcwbx18F&>C~=`l|QdX$jP#G zC%1lkVoT|XO>0hUT8$LNJiFufMjz77ZeB+c&_Iy}O*Bxaq1Q$T)j;iq2I|Ve?MOn7 zA6XUCf`^pInf}cp3(`UT>OZI zADBnx!9TRp_=gdT7{bU>bLvRt_8*#yAM-r$fIYo=jha`{%0&n&myN|DSrCX8)m;26 zlPneHNBeAO>`c1-Rlj(;kNl^-sEZd*yT9zNzDDy6_ zZq|N)4Y*lW@sA|%&q~1p8Cfn*&%OMPsZplh1wX?~GB12k7eI?rh#ifQh0lLuiv~IV zhIz4F&-KIH*#feNNdP}Y=tPSC_4I4Y-@N+e>sLR2x$cvfYCarY{r<@6xzAM1Hn)H* za{LV}T#$dPU0OgE5&wU)r&(iT3kuS#vC$p>kK5Mve=9O(;_cmE?KEh5ygNX%#zyz( zBxLil9v9;hXo?K7)A6joa~kX!0+)Rraoj~%GMvh5pUsPxAP2$q zPaGdH$`HZEMQV--qqnoi!I;)omLnVnrqxIHR>20kd($G!UOk815m(Pw!qkl5 zIei3#swMW~`>Kx-WAUo;9edWe;vohZ*XjTdLdg?_AE*c(S~~fosv|qy@rVE@9gH%G zsbUof1#4PZ-jhWOv;(kNMCoc_#SVM!V}wxdcnBYV;~L;WC=n;~T)TJ%9@sv*gkzPm zXU*r{=tE2=uhtMtUy`Lur0y>LLhwLgffjYpC7_2qA0Tl&V;uU@IdB3>2#9oE0L%Yu%+;R56_Otu9o!Pq;A*Xk4JiT*6<&O1`PgHLI zp22_l?rRV!ZC)}DBLxPps~69q-PfKzh7e-We0T@hlec&Cu^*O+@OVVvuhuaS{?U8! zk1}kc8Z$x+}{4^Pq1z=)XK(P~L z-!b@;?>SD)eg62Y;$!bv55HkP_^N6DgrR#KkL`ReW&4QU+brF-(c`KlSGWyTzJ-sn)v@;BsWG|U;5=&$oI0ZmWX|W zg^0J`tXV4-41N|ahBWN?H{eGS?89;*+>t9n@XzwkZhyc0|E~BMa#j}RZ+l0W`TDQ1gQNV%6^HTrVLAORJN!LD@&)MISdu{~9cMLi70c{`GD!C#O4CO59%AdDfAc8dH3;hxC8Ji0^b0@)tL zI8Cw@g|Ky$|E<_hIJ={Ju(2BaX4T=JQ4m-BH*eA;2p`1bhj9d9W5Ei6lLdnYPWDXQ z1#m-z1FZuWLl`3Le>{v)wHk~+NdjCplGy2vA5r8#$|AY)k^mt4XwIJ^_$i|#k0Sc9 zyl}^l(fB6$-ash;NsK=UHwP{Z3?1RZ_^o8%d?{~8cI#m0DPew5gmNfN2>*M0Ulpl{ zU59^gqYoYKfuBh{2)D?Rpqw?tM3^&JMSy2S253c`tYt}1Dq&Kr#x7ALadZ!wlMDUD z(lHOV5VDGJ2`5X6OXmoF>|UW2;R1kLRD?TzmVGv70fuZ}!tdJEo7c$Fhw`ddhyj2n&NCyf;eP(txk!VXZvNzj!sX-=%u zk&3`hCE8r+(g9S$(By*OrKGGlE`hkcNqR&TJZxxk2S5mV1V%p>{BHE&0~ncjDhZvA z;3u7q?cbzSBBdZh6O|SmYdU^f(S%T>Ey0eAF0Fw72CWF%>1ahWMjs)ZG*{Lm*vg*PH5Q0$fJLX~2UxO3JXhIV z{Io4$0B1?i0i237NWW$)Y%&e~aus7ZrlDVef0dj*{L=HImrs2-5f%w2=f8CFpN@*T zqmREk>e#FiN2goM-zg}6^XWrVhQZkFz@(@4PZ+#+>|=Wz>ARorzw6oL9V7efu=n`c z+I3rDm$HIbvLt<4w>4KXlHix5P)n_vd7UjxSG)uL)U~BkuYL9U)qlNu^^2FWJgr+a zuJ)6cYCm$+e)xRN2hY|(WA)Dw{5tjBf-AH0ugn~NWhR!YxmTv;Y|V39@IpM$h*~Gd}UGNuIzgJXUVk3I7ITnilX)J}WKyL{AxlZ^|gj0+@AB+cmPQ2%+ zm^T^=+2gZ{Kp(8p%ijQfat^*q=`()t-j_h1wB4gqc8yBjiA8NukL{E`+X#IOWl!tn z^br}A|2dDaPDlh-=7U2o$p>e1digl;5RV)VcELZqa1IUy$AfzMqZ>8o9W`qv+fs4I zK5g3)i!bTZ@Vzo^d7%W0Q^v)6cI=*X|6Dl7jik?61l5-~lDsFLkKkAU0G8&E`y3Wk z^`-yH3G_aL2N<-Gz?WiPN#Z3*23ts{VD(r~U`DoN|tP z@dC$n;ax}E6W6BHizCkjhd3%YWi7`UujBRIH#wi{^$z9D`tmk(1aF5kzlu03z9z1K zv%{up1bkM`#^rGqgsAbKga2FM@(@b?3%D$V=A!`_5hIVw?<{ zgk)13_fovMfF`)rID3v^u_4@uxFmKq*BRd=z^l1Yd~AZx27GG3k#K@-BvLoyYQ!B0 z&!rg6G$$rNlM-~I`E)Kv7Z`{2p(PQpOZf@p9z-l5JPWuAxTid%mV+{p+W&<)M7n&S^>%kFOW@DDUAk$co9T6VhIkV8rJ%q6AOyO==r8*Iy$LqiqUG!A80fe znfO3%Oxh@0pMpF)7h0LrHOXYl8&)vDo@cgkp&3ct(k&LVt-CqTRAA>gLy~1=f!Sir z=0eTAP3A%d#tjsraiRT^y7o0@SuM7nNX5j3#wT@6do)={eqZ<0?iMruXmt0~bYrIQ zXkqtMK3s(;Dcy}`0q#sv*GG#?)=>iF2&87T8-?48-Baba@6rT&nF>r+BZ|!9{5+}a zfWmB}-Gt2WK^tX30pX&5JK30!yprhH8MKIC7xAc&sOok+q$d6&oq zr1nVe(KW3{Z12bN3eravnr!j#WLrksVsRz;mjaS9^B6?8q#m)jVNdy+9#*R@p7=X< zN6FR6#!NNIr@Cua7U-t#ZpkmS6rg#b)1;^L48IthF13;%$?Nx6Uba0~S?a?Dq!Su< zvlIuJGyB+0`Tfw+e3MN%c13_P-BPINz=O`@{Ck`7hUMCo>o`@{f~;JN)fVh;98N&} zjKcvMU>x4fVz*oJxgdgwK`UAXpgQ_nvrSe7r|MsT#-BA@)kaE-24H$kPcasl%z^Zu zM5lRBF6L+^0{Bb>_z0Q!*-Iu=#^I?Xmr`b=^l3fubZHB^NEO`EV$BbA4dByUp%Bu{ z^-*;<7Ls=4?*`l|C9l|IwxyV?eLx#UMo_w`*e;NOyT}(WpqssbmXMT6d5;gD#1{%F zlM2&$r`DWVt4`<=6J;pTxTI52MfoNm93d#u0hL$XFIE^D`QKXBT^7n>x*8&C8LYOUbim<*I^m3I`gkd1QQ*JxjBXGMj?Y1cK?9 z$p|GYPpkd~q`8@p>w;k>)vXdWWx*l+3rIK*(_Vs+LK#UzX)T45Cdc}6D|BTxu#;{a zBEMl3+nH9Za*5Ce>xEH7(MN0~PSN}@uY!1iS!VRGp2jRwNP|=lVo%)(9!wtyv<{?q z9>~n%yHS`0^TZ8$#55|!Y8sJe8X4HSzd5_R)dY&taWya?#bV1N!;&hr(2``zF&3Ha z2>4sR4BSNU$_Hg zTCQazgCxF&hdtL(Pu?f|_&!l1R>t3@F2UxJM#cosqvILYi|=IU6(PcS5F$=m?o&ia zN?w+|$ZG0L+FH<2v@1Hi<{Jxl!QZVf`6r(daAd_#Hjoe}toSqF7e2zA&+Z*q-ou9# zKE2={-X^X1Cl=S>%W+dik}uvkLT+ntr2)9o0CMG@(*SZ$0_YVG>`LR~!6Xu&en?-n zqMsKUtzZ@c`2su7Cuxk5{M;*zthYBnNwGgE`ah!Ln_}Q^(R-?XUGD*(j&hO?7$6(9 zRRTW}m}VSd;yDpvW_6iC=eK|w{%i^k6sf`o{I?RsM9 z6T!yZ0F1emvsdv~dDj-k*&{;NR#t$`lyiYS3dlSkL@`jmfcIi35Q_^LGW4`@xo1QA zy=+L|BqYU&Oj@eXt-USQXR%VSmSqO95C(BY`3l7Q5!}1N> zCtVNRiiLyCZZ+nCo$lN>uYe8Y%4DDRE)N(p%_*G5`>H_9XePwBj8fr&HJ`s}c*yk3 zDGJ<|veri;q>ncS@hli!PYhzZJlv&ue?XYy5HR7xOeh>OZ4Q?CS?#g~fxwGbinUwc z0$v;=tT7X-x59t`bV9}$w3VgEf-n(LPhP<=RXf+G2qevht#kgA?!L|=M8C~*Fl$8` z){3Ta?VQ_2D&bQUT&u2FG-6y}^iTzvvIp2q)&lTJe50Xrvnn9dmXv2STZW0<+)JV% zjML+r(d|CL?4GrrZ+%+QFhpkjc43~oou5Vhjb>*iy3vJ&B8hTVtvog!#eMW4W;d~A zIkzAlfK*7cn$f?+W>m=qF@lqdRt4H}L3pxm7pEJi)u#I_F7*tqp*F<@rjw?ZYckno zX$T9ufbL-|Rjg;ya*c&1KU;39DVueG4ul5E&xN%{8-eC+T(c;xK7+eii)^`_T^Y*2 z6jK2o7)-fLqy=e!A5BsfV6%76vu2r1WK~6j0&KaDo6Kg*NS2Ym|7ICc^(Y|Re0D%{ zbELB6_OhBx1uR1`|IrN5C8{6&XW4NcsoIK7Y?_ymN~$l$bM`^Qv!Y{F|1XYC!kAx5`G

0*;OIJ1A0f7 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 b6MK;E!0$LxNIaGqT!^6Sw`=!lTJnDZO`T1u literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dcldac105.dcu b/internal/4.10.0.10/1/Lib/D11/dcldac105.dcu new file mode 100644 index 0000000000000000000000000000000000000000..2d6237c0eee5a93e6c82e9e46fb99aba77149b86 GIT binary patch literal 5845 zcmeHKeQ0D?6@R~%WaeZtS+d)@ye(U4{bH25v|?(Mwq!Cd*+epRc4m^z7Psupo14jN z-n{qv=4Cfo+LB6Js;G3U7F%?&(n=K-5s^it6zvzKh=__v5h+Dl5fPD6M5^b$OlD^5 zyCe8_9-O&z&+ndd&pr3td(U~VVI2C+VZ*p||Ln)E+PQetFmuNmj@J;*4cAXTk}+BH6y1WzDdET)45rJVRz`+wEAk45OK!bA92t=SA!W{u^h)=Ny@3 zaKU$Dg-%z5vmu&tF%XR>Ub*%0=7BxVlJD*DXj%=gY&7q?CO+ZFj4hn1Y^E!x<+?4~ zZqqjmHL_Ti{-*j%c5#oNW)s=Lxnx3}RuQ?vkK5^R_N41Kf^!;_c)d%p>*?TS5ej;De&Vc&;@WNu}Wj~h&q58Y;<0F9NY1l2B!)~Uo0aH zoSE}PT+@WvXyQv1Xqq+6ZpEcI(yb|LyTS`}k)JJjZnzq0PR__&5VbTmXDd;#1@(&*(t zX$^4dFvq?|GM6kztk$F^Ko3=9yUunH2LG;i$yxYgcjd5u6Lof!mXSIUd(z-cC~2Ykqjm4$S8eD?vJ zZKyj?vya*0)*!bP!*KSj_8BD=&wBGl>p{3E&r02yrCQ7vJU_PS=4bhEsS76^J;+PzYBcjf7-$&SK7(ss?3Yp$=kut>qXd0Se3cE~PrS|D1>!rPR4 zRycBeFRSZh6pl>Zlx~mlvT&lHJ;$;GRG)jnYtm%@gKCFdDk=D|K@PiHPs z(H+EAB);h_QdzOt3VRXW9&U$9I{OI&XQ~|Qu>5MXT z*73MF=`e=4*B!Xp(=o#QuGAQJ1YhN=!so}DKWB2ZThb*qS@&W&omYmXGJoIWn&PMM<;`NVBIhN^{({Df&Z zh0Cg-4stj_-cb$pV;9XrU&XegCNqrO#kZ$b>ryA%mvYE(bEoIz41~ zPab)JWl1U6|Moqw?}2>}?0aC}1OJByE-9IxC%>=1^Y0sq(R$7_@~4Ifr-m#H6EYUw zNBF=L3WN_4t|J^HTtj$|h3g3)vG7sCjq{iye1dQj;g$lX2{RUK!W?0q@W~Y{5^g0_ z2vrMp!m@=G!fjLdG~sr_8N%v38iX~%I^hlr9>FI}5Dr-g36X`EaF(z|IB(%D!aal? z!ef&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dclsdac105.bpl b/internal/4.10.0.10/1/Lib/D11/dclsdac105.bpl new file mode 100644 index 0000000000000000000000000000000000000000..292f5af5aa732f7022b7cbbe886e793f62ac2b82 GIT binary patch literal 342528 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

jh~_uU9c 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 H_V@n*d~`5v literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dclsdac105.dcp b/internal/4.10.0.10/1/Lib/D11/dclsdac105.dcp new file mode 100644 index 0000000000000000000000000000000000000000..476e61e52ad30a36b72288226bdcd9f325971baa GIT binary patch literal 141105 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/dclsdac105.res b/internal/4.10.0.10/1/Lib/D11/dclsdac105.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/sdac105.bpl b/internal/4.10.0.10/1/Lib/D11/sdac105.bpl new file mode 100644 index 0000000000000000000000000000000000000000..f97196e50f5fbde3f2d27a2c9779148935618ba7 GIT binary patch literal 365056 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

K)4cqxxvzcR|%t%xusEjXn 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/sdac105.dcp b/internal/4.10.0.10/1/Lib/D11/sdac105.dcp new file mode 100644 index 0000000000000000000000000000000000000000..965e35aa791d1d427c2d7651b26527bb221cc7d2 GIT binary patch literal 416478 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±{Fz(`A;l7;P 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�jtJS%m6W=p>}fij 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/sdac105.dcu b/internal/4.10.0.10/1/Lib/D11/sdac105.dcu new file mode 100644 index 0000000000000000000000000000000000000000..c708814470de5822dbb2b4c65a17ba27a85db31c GIT binary patch literal 2221 zcmeHHZBG+H5Z*bUjO8Rq2x*8R_!83?LeO~F7@~z11VW*3sf}2_f;jem4FH6MumI33c~udGlI-fbNIQ&OEa-JG1l5B|_TYBOxDOjNCle z`(=VC*youBz1FY2iI73Jr6Tm1?($Eu8jmzC^R~q;rF>*lUVSYzghliX&u1k<3hF4g z4U2CYK6mWzOXbg$H4AXu=DtLeS%a<`1vcpz=I+<2w}sZKX3n;%I!sFQ>}uh8k3T~h zX7nLSndgPOZ_DT@$F>=j5wnhCg_{X4!p!r97s}L(uFp(n91+HG!|hw9Cr8r5^#Vr% zikKQ^agC|jtl@ex^{}j(QnQPtS|6l8v~s+p z2YvEq7ez)hxnXLC`)yg^CewYF+l3nMj-;H@bbclLx{@9a2bx8;X~Q?dQ50=D%B`BE znq>v<`R+#eZ8bggw;sg$4JeA8E4s|6Q54aJb^fB*utvpCh((J{;%Me8Lge=}s7MX2 ze`saq4+X8cGA9U8sCG#IMyegL9jPXsP-RdX)k2us5!h6T8Kc@MW_D5SBoVtsv?}i| zQtdeLE(gA<%)25CtJI4JNR@k6>3~e`0>(R%cbQ+ANRkjaBX6-SBF7d{+Z00MCk9pp z=?sulgX=i9qr?w~>Q+!k65aWclqZgr&SnRMN9CB~a$2%|!b2akN33^vM_d#m`~UjK zEAT<)|0&qNoj!h-iqbQp?jr2Qpb;SwgMNhT3AlkUfRI4Ah0u%87lT2B+c8KY46j2P zVH9BuVFF~*wt9uIUM%8_}E77QW5FFH~swhe;o>g9wSBg?3 I+k_au0I+Nk)&Kwi literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/sdac105.res b/internal/4.10.0.10/1/Lib/D11/sdac105.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/sdacVcl.dcu b/internal/4.10.0.10/1/Lib/D11/sdacVcl.dcu new file mode 100644 index 0000000000000000000000000000000000000000..46e6fda9f02872bc08af9718285d26521dc7da59 GIT binary patch literal 5195 zcmcgveQZA5Ca%2q0u@k0m00Egp%5 z-}u5ee-g3;d{H@(*!OOo7P2I=@^D??z^T(r(Y);;jm3Rx40R)l7ExoruwA_nc9`mp zNMcyll)+zesVggGA$cUK?UrM~D2uO+{CnF;nvHr7OpblF>c=cBwsqqM+7scI>*i8nsZHO2FV19*eNfjw9jUH9`WyfUZtcCb(+#(LxGFpFyumPpGR zABC&(0Ntt_WWl$%*qJBpV{*{1;pS$zraDjKXIhUu#NOfZx;**8;UL2MSU7@*HhO)j zx?he)GJqJaewV9j@>U;;M>M7zys>oU(<3ZCx+jJS5t0>lldJRn>0oG29sLWJyYm=# zvXB~Qx;B$S3ri7xImCQ;44vl`Hq4XkZyeza^s;yYH-W+RwkHyia4evH;OTk>trltS zpd63M+%+D}@_;#cCwcP^xJPs9HMYo$VEt=%2lG`JoDtS}4vi)}T;Hy^HiFI?j-r7CZ^*Ai|lrSakc zcgv?(6rU&0txbeIB~d-9770ZZna54$FpPb%2j0$eOc~MGAV;h!i9jHvj@8fNXINYZ4m^?52<*-gO;cmXIdtvgIDNd! zL^H?}h{T*Q1A2OL^Q*i*OGGNuOTwJ_sgeM{dW~Q! zAzTSo?Drdc=~CmoIoksTlC{3S-V0ZH3x(Dd(_hCt-|x>RTtyCm8F0+|#~)!g$P%H5 z=TV2O$*1H5d!^^rrf|hBrWxVJMBkit-U-|D%;1t8^!2;pI&4`5S**7`>|n~A^`EaR z!SVy$ow>wEr+j_AavYNbOM+PsMPfnqEbo`C=JzZK-+1!}zo$xT_Io67rP*cIDXn>J zwi#8~KDz-`X7B*^B7<3c0o3H2=vP{oM)eE=a?yHDX)Sbn4AnWmzo)FL%8Nv%c#|Oh z=k4|Nu)&cFYeq8$O;6pv>E24co4TL@T63HJzS3M%GJHu;|L&DQathFB>0=4}Ou9e- zrOCRFjrPjgpbaQ(Tg1N=05IS`&=ok;-q$(c!xoCUJK*nV_YFYvs->>*?@PuhJ!nbj z-nFQLloH$?!Ox;07q|-zrpTlfz~QcJURlJ2`C)jIg#DanFh%ot)?^*079~Zd44xH5 zJef*L!qc4N=T&8mITF!Bye?R6@hm%VHpb#EkOZVk8&qqGsIn>R*DwPP_X_ zuFX7_uegSjaDekA$MU?ic(Q5d0*8nm&KitOMIM$a^d$6hP7i%D>6}5@P(+&Db~jdP z68xOakxvF5fva3#r|8}MlZcF3#_~?WUQV_ylL6I-5l89-J? z5wgleRupE8jaKW}+qZK8uE}DJlgQi$kk?tnTW4aW{Hp^(T}9B(n^4ibQXs502cs$C zF(HzkdEIK5Ujz_VUjS<|U`husn+9E1i64M({j`mrayw9f)j%JXMfX>CbBXbn!lz(P zjOP`64lI%VzovHG5HZXh#%Iw7le=pzlA4>cgV|3con#BZBL5kb$ug8u$kqbRwxgE+ zOaxz628G3dqHPG_zdTq{fP!j3R2w4j0r{w9U^OcNH60}o7FbdRh}&HPXN8Kw3P2og zyvU*m1=)`%jN~H!<@>c9mSjHSdP}g`prSDA5f>A(tMT#^Hb6bo~7nu504?tM~OKNN|7i z_3>-^Xyv_Y~teQCrCK^50s?0ldLr$538+_`_^*pcJYrTiHGO$O)3 z&GhGp`Z&0q*n0W&v_6gQAh9mQOIIkFut}4YJZqDtBr;{A^?g#>N!|5y*g?`bb#<{HRc1J!I~&Q5!4`Pk>83ldG%lQ{=%l<4Xm(!7O! z+a@hI$ORi+D@nKP`xL%O|3&f4k-T(jq literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/sdacvcl105.bpl b/internal/4.10.0.10/1/Lib/D11/sdacvcl105.bpl new file mode 100644 index 0000000000000000000000000000000000000000..ec28ec530e0c3e1b5effca15acfbf6795ab251d3 GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/sdacvcl105.dcp b/internal/4.10.0.10/1/Lib/D11/sdacvcl105.dcp new file mode 100644 index 0000000000000000000000000000000000000000..1ba73bb33412f8950acc716ac30aad5f7bdaf1be GIT binary patch literal 14019 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 JGdV~I|9@BVH%I^g literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/sdacvcl105.dcu b/internal/4.10.0.10/1/Lib/D11/sdacvcl105.dcu new file mode 100644 index 0000000000000000000000000000000000000000..b8ba0bc4b226b8ce06284d40a38d92115491e64c GIT binary patch literal 2890 zcmeHI-)kII6u#e>?0(ryODv@fB2rXjkrJwyTBJyl-E7m4O}E)i8j46Kvp2i9nVnf@ zr)?5MqErzPsXwSiB&ZaTA|fJEeHC9Ml+riBKfwMI>YX)BnmTuVm)?ir-t*ma?m1^Z zzVn0-`=$nk`0>q&=N~@w+mx^dhdXuGyWsiH93Hun5yzsvJLlngwDgx=eY=d2?0l@< zt@f^)?d7Z5C}gI(+KFXLh=yHKf$OU^H&$VA=WP2IPi8fEB2aOHj#gZ6*=@+_(5+wl zedhDV-n*8$z`twbXmY)>+_-cwK9%_ET<1MMJv!&zNV!4WNr$tiRZtHv8c^!g=3?cW zU>&;$oUN_4PXtS$;pKwwb~@4&T9;T-z7d|44b_RG)%4h`zT($ZtJ>}9zdN2Om22Z( zJ>7Tkw5rQ$9I2pT$SqR{TPGLKrMp|j@pOP?+3L|O7G^7M)R9rTcUF5B-Plb>`wO!R zEdv4U;#l?6bUDS>*^=q0v3%Z-m44m;k9l!0 zt$$@YoGD&xjkQ%e$U+#zQD|akrkj-^>He||&Kt0SN$G3i#!CjA6-|y7Ff?_qTVXyLvq29Z8&DAI$F`Juc%dZBHbz<}Uhj zT_giQ*h7}^^1Gye3pvn5?i&I3VjEWe-chyQO;zMJ{v1tqid)hrZwr-6W`-t@T9dbg zO3mk{@cZpE+L4L(gY}>T|HBU4NNW1I`~Bno?VZHX`c>GQ#HNEjBICdz9?9cT;xPvY ziN}fk!~q9S5>GkE6HgO|h+*O|@$4j?BaRS9i5K!XM!e`?lo%(9L}>wt`2%s8kJ zvkq#+{0bI`GsH{8%MQ*Giw^3<644~iIq->qXcG|;6BmdTV$H#;#B0Pl@rHv-#9PGM z#5*f^mw1o3Onl(rBjO5imH5QLr^E*F8S%wYTqC|Dz9Oy@UlZRD-xA*u-xEI&H;A7c o3=#Vr`=*7>oP8_#TDhEkySuS-wq;p+xyQOJ-nXn7@u3jz-*tS(JOBUy literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/sdacvcl105.res b/internal/4.10.0.10/1/Lib/D11/sdacvcl105.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/License.rtf b/internal/4.10.0.10/1/License.rtf new file mode 100644 index 0000000000000000000000000000000000000000..40b871b0409cb7c586f18cc1bcb2fe67c3507ca5 GIT binary patch literal 3366 zcmb_fU2ozz6y4{M=09A`%Y29;=yY~=wod`l4iY7760}0fi%ASv4Nlf^ps4D9-(!bB znC(Qn(pCty{y0AO+;gwp=Sb;QKVq^F_AAcU{p&CNDB-JB?>Sm!QtM@kUwY9>iZoiq z8>R}buX{Jo(Idgmk|+g2hfVs zge|+|q$&AkV?jPI42h&dy!y{S)xP8Rl4cXv30(4BXGG!maX^#t(4At$x%XZ7!JURQ zbbR-2KA9}KG+0~^rVGO3X%IS-$#{BCo=@|@{9+*k?=JikARStGa~e-age)P>lI zq-1Fem&`7O(}g~K>=5=6m&sKLvvvTIG|b#2b97sCsNbb~-+}L-?JLuk{y*xA){2=D zG}O)6l0WI+E7Txc={-XwZP@`K5-26KJRtr;$aTsoIhE~xlbPwlLKMe+EkUEyi%haK zJy0g`;RG4BrfOq!g;Ha>+YIfxi)_sn{`mfT*c=bR_(T(_$@a41Sa$%cASQB^X&!4k z*}_Xm94(m^h8(!mT_V-iZgvMa63_86=+udu4+V=b-jS5Mmw2lQhb~3xYg$j ziwX2QTB&Rc^n*Q+vXxoY0(%PBTIXUH?Um3PPTVpCB3N2>pmK)G$x^7m8#XVw@Z<(=wS#gT%fjCoZfi72!ZOBl!MDEXdh7n)pw(zc-3fU8cAjB_?x;K7;;&CjoXm>7`lz@)E7YmtTL2Qu9rtralQ39M_^TT%IZ8^`qy` zrL;#6%SzoMm8lfSs!fuGh9F20@~6njb2!145K5*X_aqNGS%Q2aw>;Mr8ha8?ge9Oi zOk26pXU>WzC=HI3qOjouVQR82?Ds|GtqLY*@grOF+e*LJq?_YWVIyWr*Wni6i}H&> zs~)PIPajSv+Rl`SmEg%oLX^u=q>07KP^Zco;rNa*M$gM7;y(vr<+ZD}T*W5lf~9Rt z2S3Nx8oH(k16ffyW;*3bpYDuoI^!_abe3@1R|x Z3{Z`@k2gqXZhFwazw|Ej#(yBc{0%7uVk-au literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/ReadMeSrc.txt b/internal/4.10.0.10/1/ReadMeSrc.txt new file mode 100644 index 0000000..ab0f678 --- /dev/null +++ b/internal/4.10.0.10/1/ReadMeSrc.txt @@ -0,0 +1,128 @@ +SQL Server Data Access Components Source Code +Copyright 1997-2007, Core Lab. All Rights Reserved + +There are two ways to compile and install SDAC for Windows manually. + +I. Using IDE + +Delphi and C++Builder for Win32 +-------------------------------- + +Run your IDE and walk through the folowing steps: + 1) Compile DAC run-time package (dacXX.dpk) + 2) For Delphi 6,7 or C++Builder 6 compile DAC GUI related package dacvclXX.dpk + 3) Compile DAC design-time package (dcldacXX.dpk) + 4) Compile SDAC run-time package (sdacXX.dpk) + 5) For Delphi 6,7 or C++Builder 6 compile SDAC GUI related package sdacvclXX.dpk + 6) Compile and install SDAC design-time package (dclsdacXX.dpk) + +You can find these packages in + Source\Delphi5\*.dpk - for Delphi 5 + Source\Delphi6\*.dpk - for Delphi 6 + Source\Delphi7\*.dpk - for Delphi 7 + Source\Delphi9\*.dpk - for Delphi 2005 + Source\Delphi10\*.dpk - for Delphi 2006 + Source\Delphi11\*.dpk - for Delphi 2007 + Source\CBuilder5\*.bpk - for C++Builder 5 + Source\CBuilder6\*.bpk - for C++Builder 6 + +To compile SDAC based applications, add SDAC Source directory path +to the "Library Path". + +Delphi for .NET +----------------- + +Run your IDE and walk through the folowing steps: + 1) Compile DAC run-time package (CoreLab.Dac.dpk) + 2) Compile DAC design-time package (CoreLab.Dac.Design.dpk) + 3) Compile SDAC run-time package (CoreLab.Sdac.dpk) + 4) Compile SDAC run-time package (CoreLab.Sdac.AdoNet.dpk) + 5) Compile and install SDAC design-time package (CoreLab.Sdac.Design.dpk) + 6) Specify the path to compiled assembles in "Assembly Search Paths" + 7) To register the MSDataAdapter component in Delphi for .Net Tool Palette, follow + these steps: + - Open Delphi for .Net and go to the "Tool Palette" window; + - Add "SDAC" category using popup menu; + - Select "Installed .NET Components..." from popup menu; + - Go to the "Installed .NET Components" tab within opened dialog; + - Check the MSDataAdapter component; + - Press the OK button. + +You can find these packages in + Source\Delphi8\*.dpk - for Delphi 8 + Source\Delphi9\*.dpk - for Delphi 2005 + Source\Delphi10\*.dpk - for Delphi 2006 + +To compile SDAC based applications, add CoreLab.Dac and CoreLab.Sdac to +Namespace prefixes, add SDAC Source directory path to the "Library Path" list. + +II. Using make-files + +Delphi and C++Builder for Win32 +-------------------------------- + + 1) Go to one of the following folders (let's denote this folder %MakePath%): + Source\Delphi5 - for Delphi 5 + Source\Delphi6 - for Delphi 6 + Source\Delphi7 - for Delphi 7 + Source\Delphi9 - for Delphi 2005 + Source\Delphi10 - for Delphi 2006 + Source\Delphi11 - for Delphi 2007 + Source\CBuilder5 - for C++Builder 5 + Source\CBuilder6 - for C++Builder 6 + + 2) Find in the 'make.bat' line containing + + set IdeDir="D:\Program Files\Borland\Delphi7 + + and make sure that correct path to IDE is set (always include forward + quote and do not include ending quote) + + 3) Run 'Make.bat'. Binaries will be copied to the %MakePath%\Sdac subfolder + 4) Copy %MakePath%\Sdac\*.bpl files to a folder that is included in the + PATH environment variable + 5) Run IDE and add dclsdacXX.bpl via Component->Install Packages... menu + 6) To compile SDAC based applications, add SDAC Source directory path + to the "Library Path" list + +Delphi for .NET +----------------- + + 1) Go to the following folders (let's denote this folder %MakePath%): + Source\Delphi8 - for Delphi 8 + Source\Delphi9 - for Delphi 2005 + Source\Delphi10 - for Delphi 2006 + + 2) Find in the 'Make.bat' line containing + + For Delphi 8: + set IdeDir="D:\Program Files\Borland\BDS\2.0 + + For Delphi 2005: + set IdeDir="D:\Program Files\Borland\BDS\3.0 + + For Delphi 2006: + set IdeDir="D:\Program Files\Borland\BDS\4.0 + + and make sure that correct path to IDE is set (always include forward + quote and do not include ending quote) + + 3) Run 'Make.bat'. Binaries will be copied to the %MakePath%\Sdac subfolder + 4) Run IDE and add CoreLab.Sdac.Design.dll via Component->Installed + .NET Components->.NET VCL Components->Add... menu. Specify the path to compiled assembles + in Component->Assembly Search Paths->Add... menu + 5) To register the MSDataAdapter component in Delphi for .Net Tool Palette, follow + these steps: + - Open Delphi for .Net and go to the "Tool Palette" window; + - Add "SDAC" category using popup menu; + - Select "Installed .NET Components..." from popup menu; + - Go to the "Installed .NET Components" tab within opened dialog; + - Press "Select an Assembly" and choose CoreLab.Sdac.AdoNet.dll + - Check MSDataAdapter component; + - Press the OK button. + 6) To compile SDAC based applications, add CoreLab.Dac and CoreLab.Sdac to + Tools->Options->Environment Options->Delphi Options->Library-> + Namespace prefixes + +If you need SDAC 1.30 source code for Delphi 4 or C++Builder 4 +please contact us. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Readme.html b/internal/4.10.0.10/1/Readme.html new file mode 100644 index 0000000..f71c66c --- /dev/null +++ b/internal/4.10.0.10/1/Readme.html @@ -0,0 +1,304 @@ + + + + SQL Server Data Access Components Readme + + + + + + + + + + +

+ + + + + + + + + +
SQL Server Data Access Componentssdac@crlab.com
Readme 
+
+ +
+ + +

Product Description

+ +

+SQL Server Data Access Components (SDAC) is a library of components that provides access to the Microsoft SQL Server databases. SDAC connects to SQL Server directly through OLE DB, which is a native SQL Server interface. The SDAC library is designed to help programmers develop faster and cleaner SQL Server database applications. SDAC is a complete replacement for standard SQL Server connectivity solutions and presents an efficient alternative to the Borland Database Engine for access to SQL Server. +

+ +

Requirements

+ +

+In most cases the only OLE DB is reqired to be installed on the workstation. In the current versions of Microsoft Windows, as Windows 2000, OLE DB is already included as a standard package. But it is highly recommended to download the latest version (newer than 2.5) of Microsoft Data Access Components (MDAC) that include OLE DB at http://www.microsoft.com/data. +

+ +

Installation

+ +

+Compiled versions of SDAC are installed automatically by the SDAC Installer for all supported IDEs. Versions of SDAC with Source Code must be installed manually. For more information, see the Installation topic of the SDAC Help documentation. +

+ +

+It is important to know that ODAC, SDAC, MyDAC, and IBDAC components use the +common base packages, so product compatibility is provided for the current build only. +In the other words, if you upgrade one of the installed products, it +may conflict with older builds of other products. In order to continue using +the products simultaneously, you should upgrade all of them at the same time. +

+ +

Documentation and informational resources

+ +

+ +SDAC comes with full documentation, which includes a detailed reference for all the SDAC components and classes and set of articles +that highlight SDAC advanced functionality. +The SDAC documentation is integrated into your IDE at install time. +It can be invoked from the SQL Server menu added to the Menu Bar, or by pressing F1 in an object inspector or on a selected code segment. + +

+ +

+If you have a question regarding SDAC, look at the list of +Frequently Asked Questions or visit the SDAC forum online at +http://crlab.com/forums/viewforum.php?f=6. +

+ +

+If your problem is not covered in the documentation, FAQ, or forum, refer to the Getting Support topic in SDAC help +for information on how to contact the SDAC support team. +

+ + + +

 

 


+

© 1997-2007 Core Lab. All rights reserved.

+ +
+ + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Sdac.GID b/internal/4.10.0.10/1/Sdac.GID new file mode 100644 index 0000000000000000000000000000000000000000..a6ef951cd76056b846a992009fb95ad452831c7f GIT binary patch literal 103667 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 O5@?n{vjmQu68L}r;GlE> literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Sdac.cnt b/internal/4.10.0.10/1/Sdac.cnt new file mode 100644 index 0000000..07df52d --- /dev/null +++ b/internal/4.10.0.10/1/Sdac.cnt @@ -0,0 +1,655 @@ +:TITLE SQL Server Data Access Components +:BASE Sdac.hlp +1 SQL Server Data Access Components +2 Overview=Overview_Sdac@Sdac.hlp>Main +2 Getting Started=Getting_started@Sdac.hlp>Main +2 Features=Key_Features@Sdac.hlp>Main +2 What's New=Whatsnew@Sdac.hlp>Main +2 Demo Projects=Demos_Sdac@Sdac.hlp>Main +2 Component List=Components_Sdac@Sdac.hlp>Main +2 Hierarchy Chart=Hierarchy_Chart@Sdac.hlp>Main +2 Requirements=Requirements@Sdac.hlp>Main +2 Compatibility=Compatibility_Sdac@Sdac.hlp>Main +2 Installation=Installation_Sdac@Sdac.hlp>Main +2 Deployment=Deployment@Sdac.hlp>Main +2 Licensing and Subscriptions=Ordering@Sdac.hlp>Main +2 Getting Support=Support@Sdac.hlp>Main +2 FAQ=FAQ@Sdac.hlp>Main +2 Using SDAC +3 Updating data with SDAC dataset components=Updating_Dataset@Sdac.hlp>Main +3 Working with master/detail relationships=Work_MD@Sdac.hlp>Main +3 Migration from BDE=MigrationfromBDE@Sdac.hlp>Main +3 Migration from ADO=MigrationfromADO@Sdac.hlp>Main +3 Working with SQL Server 2005 Compact Edition=SQL_Server_Compact@Sdac.hlp>Main +3 Performance of obtaining data=Performance_SDAC@Sdac.hlp>Main +3 Working in an unstable network=Unstable_Network@Sdac.hlp>Main +3 Working with Disconnected Mode=Work_DisconnectMode@Sdac.hlp>Main +3 Increasing performance=Increasing_performance@Sdac.hlp>Main +3 Using connection pooling=Work_Pooling@Sdac.hlp>Main +3 Working with macros=Work_Macros@Sdac.hlp>Main +3 Using several DAC products in one IDE=Several_DAC_products@Sdac.hlp>Main +3 Working with DataSet Manager=Work_DataSet_Manager@Sdac.hlp>Main +3 Using DBMonitor=Using_DBMonitor@Sdac.hlp>Main +3 Using Migration Wizard=Migration_Wizard@Sdac.hlp>Main +3 Writing GUI applications with SDAC=_Runtime_Packages_Division@Sdac.hlp>Main +2 SDAC Alphabetical Object and Component Listing +3 EDAError +4 Description=EDAError@Sdac.hlp>Main +4 Properties +5 ErrorCode=EDAError_ErrorCode@Sdac.hlp>Main +3 TBlob +4 Description=TBlob@Sdac.hlp>Main +4 Properties +5 AsString=TBlob_AsString@Sdac.hlp>Main +5 AsWideString=TBlob_AsWideString@Sdac.hlp>Main +5 IsUnicode=TBlob_IsUnicode@Sdac.hlp>Main +5 Size=TBlob_Size@Sdac.hlp>Main +4 Methods +5 Assign=TBlob_Assign@Sdac.hlp>Main +5 Clear=TBlob_Clear@Sdac.hlp>Main +5 LoadFromFile=TBlob_LoadFromFile@Sdac.hlp>Main +5 LoadFromSream=TBlob_LoadFromStream@Sdac.hlp>Main +5 Read=TBlob_Read@Sdac.hlp>Main +5 SaveToFile=TBlob_SaveToFile@Sdac.hlp>Main +5 SaveToStream=TBlob_SaveToStream@Sdac.hlp>Main +5 Truncate=TBlob_Truncate@Sdac.hlp>Main +5 Write=TBlob_Write@Sdac.hlp>Main +3 TCompressedBlob +4 Description=TCompressedBlob@Sdac.hlp>Main +4 Properties +5 Compressed=TCompressedBlob_Compressed@Sdac.hlp>Main +5 CompressedSize=TCompressedBlob_CompressedSize@Sdac.hlp>Main +3 TCRBatchMove +4 Description=TCRBatchMove@Sdac.hlp>Main +4 Properties +5 AbortOnKeyViol=TCRBatchMove_AbortOnKeyViol@Sdac.hlp>Main +5 AbortOnProblem=TCRBatchMove_AbortOnProblem@Sdac.hlp>Main +5 ChangedCount=TCRBatchMove_ChangedCount@Sdac.hlp>Main +5 CommitCount=TCRBatchMove_CommitCount@Sdac.hlp>Main +5 Destination=TCRBatchMove_Destination@Sdac.hlp>Main +5 KeyViolCount=TCRBatchMove_KeyViolCount@Sdac.hlp>Main +5 Mappings=TCRBatchMove_Mappings@Sdac.hlp>Main +5 Mode=TCRBatchMove_Mode@Sdac.hlp>Main +5 MovedCount=TCRBatchMove_MovedCount@Sdac.hlp>Main +5 ProblemCount=TCRBatchMove_ProblemCount@Sdac.hlp>Main +5 RecordCount=TCRBatchMove_RecordCount@Sdac.hlp>Main +5 Source=TCRBatchMove_Source@Sdac.hlp>Main +4 Methods +5 Execute=TCRBatchMove_Execute@Sdac.hlp>Main +4 Events +5 OnBatchMoveProgress=TCRBatchMove_OnBatchMoveProgress@Sdac.hlp>Main +3 TCRDataSource +4 Description=TCRDataSource@Sdac.hlp>Main +3 TCustomConnectDialog +4 Description=TCustomConnectDialog@Sdac.hlp>Main +4 Properties +5 CancelButton=TCustomConnectDialog_Cancel@Sdac.hlp>Main +5 Caption=TCustomConnectDialog_Caption@Sdac.hlp>Main +5 ConnectButton=TCustomConnectDialog_Connect@Sdac.hlp>Main +5 DialogClass=TCustomConnectDialog_DialogCla@Sdac.hlp>Main +5 LabelSet=TCustomConnectDialog_LabelSet@Sdac.hlp>Main +5 PasswordLabel=TCustomConnectDialog_Password@Sdac.hlp>Main +5 Retries=TCustomConnectDialog_Retries@Sdac.hlp>Main +5 SavePassword=TCustomConnectDialog_SavePassw@Sdac.hlp>Main +5 ServerLabel=TCustomConnectDialog_Server@Sdac.hlp>Main +5 StoreLogInfo=TCustomConnectDialog_StoreLogI@Sdac.hlp>Main +5 UsernameLabel=TCustomConnectDialog_User@Sdac.hlp>Main +4 Methods +5 Execute=TCustomConnectDialog_Execute@Sdac.hlp>Main +5 GetServerList=TCustomConnectDialog_GetServer@Sdac.hlp>Main +3 TCustomDAConnection +4 Description=TCustomDAConnection@Sdac.hlp>Main +4 Properties +5 ConnectDialog=TCustomDAConnection_ConnectDia@Sdac.hlp>Main +5 InTransaction=TCustomDAConnection_InTransact@Sdac.hlp>Main +5 Options=TCustomDAConnection_Options@Sdac.hlp>Main +5 Password=TCustomDAConnection_Password@Sdac.hlp>Main +5 Pooling=TCustomDAConnection_Pooling@Sdac.hlp>Main +5 PoolingOptions=TCustomDAConnection_PoolingOpt@Sdac.hlp>Main +5 Server=TCustomDAConnection_Server@Sdac.hlp>Main +5 Username=TCustomDAConnection_Username@Sdac.hlp>Main +4 Methods +5 ApplyUpdates=TCustomDAConnection_ApplyUpdat@Sdac.hlp>Main +5 Commit=TCustomDAConnection_Commit@Sdac.hlp>Main +5 Connect=TCustomDAConnection_Connect@Sdac.hlp>Main +5 CreateDataSet=TCustomDAConnection_CreateData@Sdac.hlp>Main +5 CreateSQL=TCustomDAConnection_CreateSQL@Sdac.hlp>Main +5 Disconnect=TCustomDAConnection_Disconnect@Sdac.hlp>Main +5 ExecSQL=TCustomDAConnection_ExecSQL@Sdac.hlp>Main +5 GetDatabaseNames=TCustomDAConnection_GetDbNames@Sdac.hlp>Main +5 GetTableNames=TCustomDAConnection_GetTNames@Sdac.hlp>Main +5 GetStoredProcNames=TCustomDAConnection_GetSPNames@Sdac.hlp>Main +5 MonitorMessage=TCustomDAConnection_MonitorMessage@Sdac.hlp>Main +5 RemoveFromPool=TCustomDAConnection_RemoveFromPool@Sdac.hlp>Main +5 Rollback=TCustomDAConnection_Rollback@Sdac.hlp>Main +5 StartTransaction=TCustomDAConnection_StartTrans@Sdac.hlp>Main +4 Events +5 OnError=TCustomDAConnection_OnError@Sdac.hlp>Main +5 OnConnectionLost=TCustomDAConnection_OnConnectionLost@Sdac.hlp>Main +3 DADataAdapter +4 Description=DADataAdapter@Sdac.hlp>Main +4 Properties +5 DataSet=DADataAdapter_DataSet@Sdac.hlp>Main +4 Methods +5 Fill=DADataAdapter_Fill@Sdac.hlp>Main +5 Update=DADataAdapter_Update@Sdac.hlp>Main +3 TCustomDADataSet +4 Description=TCustomDADataSet@Sdac.hlp>Main +4 Properties +5 AutoCommit=TCustomDADataSet_AutoCommit@Sdac.hlp>Main +5 BaseSQL=TCustomDADataSet_BaseSQL@Sdac.hlp>Main +5 Connection=TCustomDADataSet_Connection@Sdac.hlp>Main +5 Debug=TCustomDADataSet_Debug@Sdac.hlp>Main +5 DetailFields=TCustomDADataSet_DetailFields@Sdac.hlp>Main +5 FetchAll=TCustomDADataSet_FetchAll@Sdac.hlp>Main +5 FetchRows=TCustomDADataSet_FetchRows@Sdac.hlp>Main +5 FilterSQL=TCustomDADataSet_FilterSQL@Sdac.hlp>Main +5 FinalSQL=TCustomDADataSet_FinalSQL@Sdac.hlp>Main +5 IsQuery=TCustomDADataSet_IsQuery@Sdac.hlp>Main +5 MacroCount=TCustomDADataSet_MacroCount@Sdac.hlp>Main +5 Macros=TCustomDADataSet_Macros@Sdac.hlp>Main +5 MasterFields=TCustomDADataSet_MasterFields@Sdac.hlp>Main +5 MasterSource=TCustomDADataSet_MasterSource@Sdac.hlp>Main +5 Options=TCustomDADataSet_Options@Sdac.hlp>Main +5 ParamCheck=TCustomDADataSet_ParamCheck@Sdac.hlp>Main +5 ParamCount=TCustomDADataSet_ParamCount@Sdac.hlp>Main +5 Params=TCustomDADataSet_Params@Sdac.hlp>Main +5 ReadOnly=TCustomDADataSet_ReadOnly@Sdac.hlp>Main +5 RefreshOptions=TCustomDADataSet_RefreshOption@Sdac.hlp>Main +5 RowsAffected=TCustomDADataSet_RowsAffected@Sdac.hlp>Main +5 SQL=TCustomDADataSet_SQL@Sdac.hlp>Main +5 SQLDelete=TCustomDADataSet_SQLDelete@Sdac.hlp>Main +5 SQLInsert=TCustomDADataSet_SQLInsert@Sdac.hlp>Main +5 SQLRefresh=TCustomDADataSet_SQLRefresh@Sdac.hlp>Main +5 SQLUpdate=TCustomDADataSet_SQLUpdate@Sdac.hlp>Main +5 UniDirectional=TCustomDADataSet_UniDirectiona@Sdac.hlp>Main +5 UpdateObject=TCustomDADataSet_UpdateObject@Sdac.hlp>Main +4 Methods +5 AddWhere=TCustomDADataSet_AddWhere@Sdac.hlp>Main +5 DeleteWhere=TCustomDADataSet_DeleteWhere@Sdac.hlp>Main +5 Execute=TCustomDADataSet_Execute@Sdac.hlp>Main +5 Executing=TCustomDADataSet_Executing@Sdac.hlp>Main +5 Fetched=TCustomDADataSet_Fetched@Sdac.hlp>Main +5 Fetching=TCustomDADataSet_Fetching@Sdac.hlp>Main +5 FetchingAll=TCustomDADataSet_FetchingAll@Sdac.hlp>Main +5 FindKey=TCustomDADataSet_FindKey@Sdac.hlp>Main +5 FindMacro=TCustomDADataSet_FindMacro@Sdac.hlp>Main +5 FindNearest=TCustomDADataSet_FindNearest@Sdac.hlp>Main +5 FindParam=TCustomDADataSet_FindParam@Sdac.hlp>Main +5 GetDataType=TCustomDADataSet_GetDataType@Sdac.hlp>Main +5 GetFieldObject=TCustomDADataSet_GetFieldObjec@Sdac.hlp>Main +5 GetFieldPrecision=TCustomDADataSet_GetFieldPreci@Sdac.hlp>Main +5 GetFieldScale=TCustomDADataSet_GetFieldScale@Sdac.hlp>Main +5 GetOrderBy=TCustomDADataSet_GetOrderBy@Sdac.hlp>Main +5 GotoCurrent=TCustomDADataSet_GotoCurrent@Sdac.hlp>Main +5 MacroByName=TCustomDADataSet_MacroByName@Sdac.hlp>Main +5 ParamByName=TCustomDADataSet_ParamByName@Sdac.hlp>Main +5 Prepare=TCustomDADataSet_Prepare@Sdac.hlp>Main +5 RefreshRecord=TCustomDADataSet_RefreshRecord@Sdac.hlp>Main +5 RestoreSQL=TCustomDADataSet_RestoreSQL@Sdac.hlp>Main +5 SaveSQL=TCustomDADataSet_SaveSQL@Sdac.hlp>Main +5 SetOrderBy=TCustomDADataSet_SetOrderBy@Sdac.hlp>Main +5 SQLSaved=TCustomDADataSet_SQLSaved@Sdac.hlp>Main +4 Events +5 AfterExecute=TCustomDADataSet_AfterExecute@Sdac.hlp>Main +5 AfterFetch=TCustomDADataSet_AfterFetch@Sdac.hlp>Main +5 AfterUpdateExecute=TCustomDADataSet_AfterUpdateEx@Sdac.hlp>Main +5 BeforeFetch=TCustomDADataSet_BeforeFetch@Sdac.hlp>Main +5 BeforeUpdateExecute=TCustomDADataSet_BeforeUpdateE@Sdac.hlp>Main +3 TCustomDASQL +4 Description=TCustomDASQL@Sdac.hlp>Main +4 Properties +5 AutoCommit=TCustomDASQL_AutoCommit@Sdac.hlp>Main +5 Connection=TcustomDASQL_Connection@Sdac.hlp>Main +5 Debug=TCustomDASQL_Debug@Sdac.hlp>Main +5 FinalSQL=TCustomDASQL_FinalSQL@Sdac.hlp>Main +5 MacroCount=TCustomDASQL_MacroCount@Sdac.hlp>Main +5 Macros=TCustomDASQL_Macros@Sdac.hlp>Main +5 ParamCheck=TCustomDASQL_ParamCheck@Sdac.hlp>Main +5 ParamCount=TCustomDASQL_ParamCount@Sdac.hlp>Main +5 Params=TCustomDASQL_Params@Sdac.hlp>Main +5 ParamValues=TCustomDASQL_ParamValues@Sdac.hlp>Main +5 Prepared=TCustomDASQL_Prepared@Sdac.hlp>Main +5 RowsAffected=TCustomDASQL_RowsAffected@Sdac.hlp>Main +5 SQL=TCustomDASQL_SQL@Sdac.hlp>Main +4 Methods +5 Execute=TCustomDASQL_Execute@Sdac.hlp>Main +5 Executing=TCustomDASQL_Executing@Sdac.hlp>Main +5 FindMacro=TCustomDASQL_FindMacro@Sdac.hlp>Main +5 FindParam=TCustomDASQL_FindParam@Sdac.hlp>Main +5 MacroByName=TCustomDASQL_MacroByName@Sdac.hlp>Main +5 ParamByName=TCustomDASQL_ParamByName@Sdac.hlp>Main +5 Prepare=TCustomDASQL_Prepare@Sdac.hlp>Main +5 UnPrepare=TCustomDASQL_UnPrepare@Sdac.hlp>Main +5 WaitExecuting=TCustomDASQL_WaitExecuting@Sdac.hlp>Main +4 Events +5 AfterExecute=TCustomDASQL_AfterExecute@Sdac.hlp>Main +3 TCustomDASQLMonitor +4 Description=TCustomDASQLMonitor@Sdac.hlp>Main +4 Properties +5 Active=TCustomDASQLMonitor_Active@Sdac.hlp>Main +5 Options=TCustomDASQLMonitor_Options@Sdac.hlp>Main +5 TraceFlags=TCustomDASQLMonitor_TraceFlags@Sdac.hlp>Main +4 Events +5 OnSQL=TCustomDASQLMonitor_OnSQL@Sdac.hlp>Main +3 TCustomDAUpdateSQL +4 Description=TCustomDAUpdateSQL@Sdac.hlp>Main +4 Properties +5 Dataset=TCustomDAUpdateSQL_Dataset@Sdac.hlp>Main +5 DeleteObject=TCustomDAUpdateSQL_DeleteObject@Sdac.hlp>Main +5 DeleteSQL=TCustomDAUpdateSQL_DeleteSQL@Sdac.hlp>Main +5 InsertObject=TCustomDAUpdateSQL_InsertObject@Sdac.hlp>Main +5 InsertSQL=TCustomDAUpdateSQL_InsertSQL@Sdac.hlp>Main +5 ModifyObject=TCustomDAUpdateSQL_ModifyObject@Sdac.hlp>Main +5 ModifySQL=TCustomDAUpdateSQL_ModifySQL@Sdac.hlp>Main +5 RefreshObject=TCustomDAUpdateSQL_RefreshObject@Sdac.hlp>Main +5 RefreshSQL=TCustomDAUpdateSQL_RefreshSQL@Sdac.hlp>Main +5 SQL=TCustomDAUpdateSQL_SQL@Sdac.hlp>Main +4 Methods +5 Apply=TCustomDAUpdateSQL_Apply@Sdac.hlp>Main +5 ExecSQL=TCustomDAUpdateSQL_ExecSQL@Sdac.hlp>Main +3 TDAColumn +4 Description=TDAColumn@Sdac.hlp>Main +4 Properties +5 DataType=TDAColumn_DataType@Sdac.hlp>Main +5 FieldType=TDAColumn_FieldType@Sdac.hlp>Main +5 Name=TDAColumn_Name@Sdac.hlp>Main +3 TDAColumns +4 Description=TDAColumns@Sdac.hlp>Main +4 Properties +5 Items=TDAColumns_Items@Sdac.hlp>Main +3 TDADump +4 Description=TDADump@Sdac.hlp>Main +4 Properties +5 Connection=TDADump_Connection@Sdac.hlp>Main +5 Debug=TDADump_Debug@Sdac.hlp>Main +5 Options=TDADump_Options@Sdac.hlp>Main +5 SQL=TDADump_SQL@Sdac.hlp>Main +5 TableNames=TDADump_TableNames@Sdac.hlp>Main +4 Methods +5 Backup=TDADump_Backup@Sdac.hlp>Main +5 BackupQuery=TDADump_BackupQuery@Sdac.hlp>Main +5 BackupToFile=TDADump_BackupToFile@Sdac.hlp>Main +5 BackupToStream=TDADump_BackupToStream@Sdac.hlp>Main +5 Restore=TDADump_Restore@Sdac.hlp>Main +5 RestoreFromFile=TDADump_RestoreFromFile@Sdac.hlp>Main +5 RestoreFromStream=TDADump_RestoreFromStream@Sdac.hlp>Main +4 Events +5 OnBackupProgress=TDADump_OnBackupProgress@Sdac.hlp>Main +5 OnRestoreProgress=TDADump_OnRestoreProgress@Sdac.hlp>Main +3 TDALoader +4 Description=TDALoader@Sdac.hlp>Main +4 Properties +5 Columns=TDALoader_Columns@Sdac.hlp>Main +5 Connection=TDALoader_Connection@Sdac.hlp>Main +5 TableName=TDALoader_TableName@Sdac.hlp>Main +4 Methods +5 CreateColumns=TDALoader_CreateColumns@Sdac.hlp>Main +5 Load=TDALoader_Load@Sdac.hlp>Main +5 LoadFromDataSet=TDALoader_LoadFromDataSet@Sdac.hlp>Main +5 PutColumnData=TDALoader_PutColumnData@Sdac.hlp>Main +4 Events +5 OnGetColumnData=TDALoader_OnGetColumnData@Sdac.hlp>Main +5 OnPutData=TDALoader_OnPutData@Sdac.hlp>Main +3 TDAParam +4 Description=TDAParam@Sdac.hlp>Main +4 Properties +5 AsBlob=TDAParam_AsBlob@Sdac.hlp>Main +5 AsBlobRef=TDAParam_AsBlobRef@Sdac.hlp>Main +5 AsFloat=TDAParam_AsFloat@Sdac.hlp>Main +5 AsInteger=TDAParam_AsInteger@Sdac.hlp>Main +5 AsMemo=TDAParam_AsMemo@Sdac.hlp>Main +5 AsMemoRef=TDAParam_AsMemoRef@Sdac.hlp>Main +5 AsString=TDAParam_AsString@Sdac.hlp>Main +5 AsWideString=TDAParam_AsWideString@Sdac.hlp>Main +5 DataType=TDAParam_DataType@Sdac.hlp>Main +5 IsNull=TDAParam_IsNull@Sdac.hlp>Main +5 ParamType=TDAParam_ParamType@Sdac.hlp>Main +5 Size=TDAParam_Size@Sdac.hlp>Main +5 Value=TDAParam_Value@Sdac.hlp>Main +4 Methods +5 LoadFromFile=TDAParam_LoadFromFile@Sdac.hlp>Main +5 LoadFromStream=TDAParam_LoadFromStream@Sdac.hlp>Main +3 TDAParams +4 Description=TDAParams@Sdac.hlp>Main +4 Properties +5 Items=TDAParams_Items@Sdac.hlp>Main +4 Methods +5 FindParam=TDAParams_FindParam@Sdac.hlp>Main +5 ParamByName=TDAParams_ParamByName@Sdac.hlp>Main +3 TDAScript +4 Description=TDAScript@Sdac.hlp>Main +4 Properties +5 Debug=TDAScript_Debug@Sdac.hlp>Main +5 Delimiter=TDAScript_Delimiter@Sdac.hlp>Main +5 EndLine=TDAScript_EndLine@Sdac.hlp>Main +5 EndOffset=TDAScript_EndOffset@Sdac.hlp>Main +5 EndPos=TDAScript_EndPos@Sdac.hlp>Main +5 Macros=TDAScript_Macros@Sdac.hlp>Main +5 SQL=TDAScript_SQL@Sdac.hlp>Main +5 StartLine=TDAScript_StartLine@Sdac.hlp>Main +5 StartOffset=TDAScript_StartOffset@Sdac.hlp>Main +5 StartPos=TDAScript_StartPos@Sdac.hlp>Main +5 Statements=TDAScript_Statements@Sdac.hlp>Main +4 Methods +5 BreakExec=TDAScript_BreakExec@Sdac.hlp>Main +5 ErrorOffset=TDAScript_ErrorOffset@Sdac.hlp>Main +5 Execute=TDAScript_Execute@Sdac.hlp>Main +5 ExecuteFile=TDAScript_ExecuteFile@Sdac.hlp>Main +5 ExecuteNext=TDAScript_ExecuteNext@Sdac.hlp>Main +5 ExecuteStream=TDAScript_ExecuteStream@Sdac.hlp>Main +5 FindMacro=TDAScript_FindMacro@Sdac.hlp>Main +5 MacroByName=TDAScript_MacroByName@Sdac.hlp>Main +4 Events +5 AfterExecute=TDAScript_AfterExecute@Sdac.hlp>Main +5 BeforeExecute=TDAScript_BeforeExecute@Sdac.hlp>Main +5 OnError=TDAScript_OnError@Sdac.hlp>Main +3 TDAStatement +4 Description=TDAStatement@Sdac.hlp>Main +4 Properties +5 EndOffset=TDAStatement_EndOffset@Sdac.hlp>Main +5 EndPos=TDAStatement_EndPos@Sdac.hlp>Main +5 Omit=TDAStatement_Omit@Sdac.hlp>Main +5 Params=TDAStatement_Params@Sdac.hlp>Main +5 SQL=TDAStatement_SQL@Sdac.hlp>Main +5 StartOffset=TDAStatement_StartOffset@Sdac.hlp>Main +5 StartPos=TDAStatement_StartPos@Sdac.hlp>Main +4 Methods +5 Execute=TDAStatement_Execute@Sdac.hlp>Main +3 TDAStatements +4 Description=TDAStatements@Sdac.hlp>Main +4 Properties +5 Items=TDAStatements_Items@Sdac.hlp>Main +3 TMacro +4 Description=TMacro@Sdac.hlp>Main +4 Properties +5 Active=TMacro_Active@Sdac.hlp>Main +5 AsDateTime=TMacro_AsDateTime@Sdac.hlp>Main +5 AsFloat=TMacro_AsFloat@Sdac.hlp>Main +5 AsInteger=TMacro_AsInteger@Sdac.hlp>Main +5 AsString=TMacro_AsString@Sdac.hlp>Main +5 Name=TMacro_Name@Sdac.hlp>Main +5 Value=TMacro_Value@Sdac.hlp>Main +3 TMacros +4 Description=TMacros@Sdac.hlp>Main +4 Properties +5 Count=TMacros_Count@Sdac.hlp>Main +5 Items=TMacros_Items@Sdac.hlp>Main +4 Methods +5 FindMacro=TMacros_FindMacro@Sdac.hlp>Main +5 MacroByName=TMacros_MacroByName@Sdac.hlp>Main +3 TMemDataSet +4 Description=TMemDataSet@Sdac.hlp>Main +4 Properties +5 CachedUpdates=TMemDataSet_CachedUpdates@Sdac.hlp>Main +5 IndexFieldNames=TMemDataSet_IndexFieldNames@Sdac.hlp>Main +5 LocalConstraints=TMemDataSet_LocalConstraints@Sdac.hlp>Main +5 LocalUpdate=TMemDataSet_LocalUpdate@Sdac.hlp>Main +5 Prepared=TMemDataSet_Prepared@Sdac.hlp>Main +5 UpdateRecordTypes=TMemDataSet_UpdateRecordTypes@Sdac.hlp>Main +5 UpdatesPending=TMemDataSet_UpdatesPending@Sdac.hlp>Main +4 Methods +5 ApplyUpdates=TMemDataSet_ApplyUpdates@Sdac.hlp>Main +5 CancelUpdates=TMemDataSet_CancelUpdates@Sdac.hlp>Main +5 CommitUpdates=TMemDataSet_CommitUpdates@Sdac.hlp>Main +5 DeferredPost=TMemDataSet_DeferredPost@Sdac.hlp>Main +5 GetBlob=TMemDataSet_GetBlob@Sdac.hlp>Main +5 Locate=TMemDataSet_Locate@Sdac.hlp>Main +5 LocateEx=TMemDataSet_LocateEx@Sdac.hlp>Main +5 Prepare=TMemDataSet_Prepare@Sdac.hlp>Main +5 RestoreUpdates=TMemDataSet_RestoreUpdates@Sdac.hlp>Main +5 RevertRecord=TMemDataSet_RevertRecord@Sdac.hlp>Main +5 SaveToXML=TMemDataSet_SaveToXML@Sdac.hlp>Main +5 UnPrepare=TMemDataSet_UnPrepare@Sdac.hlp>Main +5 UpdateResult=TMemDataSet_UpdateResult@Sdac.hlp>Main +5 UpdateStatus=TMemDataSet_UpdateStatus@Sdac.hlp>Main +4 Events +5 OnUpdateError=TMemDataSet_OnUpdateError@Sdac.hlp>Main +5 OnUpdateRecord=TMemDataSet_OnUpdateRecord@Sdac.hlp>Main +3 TSharedObject +4 Description=TSharedObject@Sdac.hlp>Main +4 Properties +5 RefCount=TSharedObject_RefCount@Sdac.hlp>Main +4 Methods +5 AddRef=TSharedObject_AddRef@Sdac.hlp>Main +5 Release=TSharedObject_Release@Sdac.hlp>Main +3 TVirtualTable +4 Description=TVirtualTable@Sdac.hlp>Main +4 Properties +5 Options=TVirtualTable_Options@Sdac.hlp>Main +4 Methods +5 AddField=TVirtualTable_AddField@Sdac.hlp>Main +5 Assign=TVirtualTable_Assign@Sdac.hlp>Main +5 Clear=TVirtualTable_Clear@Sdac.hlp>Main +5 DeleteField=TVirtualTable_DeleteField@Sdac.hlp>Main +5 DeleteFields=TVirtualTable_DeleteFields@Sdac.hlp>Main +5 LoadFromFile=TVirtualTable_LoadFromFile@Sdac.hlp>Main +5 LoadFromStream=TVirtualTable_LoadFromStream@Sdac.hlp>Main +5 SaveToFile=TVirtualTable_SaveToFile@Sdac.hlp>Main +5 SaveToStream=TVirtualTable_SaveToStream@Sdac.hlp>Main +3 EMSError +4 Description=EMSError@Sdac.hlp>Main +4 Properties +5 ErrorCode=EMSError_ErrorCode@Sdac.hlp>Main +5 LastMessage=EMSError_LastMessage@Sdac.hlp>Main +5 LineNumber=EMSError_LineNumber@Sdac.hlp>Main +5 MSSQLErrorCode=EMSError_MSSQLErrorCode@Sdac.hlp>Main +5 ProcName=EMSError_ProcName@Sdac.hlp>Main +5 ServerName=EMSError_ServerName@Sdac.hlp>Main +5 SeverityClass=EMSError_SeverityClass@Sdac.hlp>Main +5 State=EMSError_State@Sdac.hlp>Main +3 EOLEDBError +4 Description=EOLEDBError@Sdac.hlp>Main +4 Properties +5 ErrorCode=EOLEDBError_ErrorCode@Sdac.hlp>Main +5 ErrorCount=EOLEDBError_ErrorCount@Sdac.hlp>Main +5 Errors=EOLEDBError_Errors@Sdac.hlp>Main +5 MessageWide=EOLEDBError_MessageWide@Sdac.hlp>Main +5 OLEDBErrorCode=EOLEDBError_OLEDBErrorCode@Sdac.hlp>Main +3 TCustomMSDataSet +4 Description=TCustomMSDataSet@Sdac.hlp>Main +4 Properties +5 CommandTimeout=TCustomMSDataSet_CommandTimeou@Sdac.hlp>Main +5 Connection=TCustomMSDataSet_Connection@Sdac.hlp>Main +5 CursorType=TCustomMSDataset_CursorType@Sdac.hlp>Main +5 Options=TCustomMSDataSet_Options@Sdac.hlp>Main +5 Params=TCustomMSDataSet_Params@Sdac.hlp>Main +5 PermitPrepare=TCustomMSDataSet_PermitPrepare@Sdac.hlp>Main +5 SQLDelete=TCustomMSDataSet_SQLDelete@Sdac.hlp>Main +5 SQLInsert=TCustomMSDataSet_SQLInsert@Sdac.hlp>Main +5 SQLRefresh=TCustomMSDataSet_SQLRefresh@Sdac.hlp>Main +5 SQLUpdate=TCustomMSDataSet_SQLUpdate@Sdac.hlp>Main +4 Methods +5 BreakExec=TCustomMSDataSet_BreakExec@Sdac.hlp>Main +5 FindParam=TCustomMSDataSet_FindParam@Sdac.hlp>Main +5 LockRecord=TCustomMSDataSet_LockRecord@Sdac.hlp>Main +5 LockTable=TCustomMSDataSet_LockTable@Sdac.hlp>Main +5 OpenNext=TCustomMSDataSet_OpenNext@Sdac.hlp>Main +5 ParamByName=TCustomMSDataSet_ParamByName@Sdac.hlp>Main +5 Prepare=TCustomMSDataSet_Prepare@Sdac.hlp>Main +5 RefreshQuick=TCustomMSDataSet_RefreshQuick@Sdac.hlp>Main +3 TCustomMSStoredProc +4 Description=TCustomMSStoredProc@Sdac.hlp>Main +4 Properties +5 StoredProcName=TCustomMSStoredProc_StoredProc@Sdac.hlp>Main +5 UpdatingTable=TCustomMSStoredProc_UpdatingTa@Sdac.hlp>Main +4 Methods +5 ExecProc=TCustomMSStoredProc_ExecProc@Sdac.hlp>Main +5 PrepareSQL=TCustomMSStoredProc_PrepareSQL@Sdac.hlp>Main +3 TCustomMSTable +4 Description=TCustomMSTable@Sdac.hlp>Main +4 Properties +5 OrderFields=TCustomMSTable_OrderFields@Sdac.hlp>Main +5 TableName=TCustomMSTable_TableName@Sdac.hlp>Main +4 Methods +5 PrepareSQL=TCustomMSTable_PrepareSQL@Sdac.hlp>Main +3 TMSColumn +4 Description=TMSColumn@Sdac.hlp>Main +4 Properties +5 Precision=TMSColumn_Precision@Sdac.hlp>Main +5 Scale=TMSColumn_Scale@Sdac.hlp>Main +5 Size=TMSColumn_Size@Sdac.hlp>Main +3 TMSConnectDialog +4 Description=TMSConnectDialog@Sdac.hlp>Main +4 Properties +5 Connection=TMSConnectDialog_Connection@Sdac.hlp>Main +4 Methods +5 GetServerList=TMSConnectDialog_GetServerList@Sdac.hlp>Main +3 TMSConnection +4 Description=TMSConnection@Sdac.hlp>Main +4 Properties +5 Authentication=TMSConnection_Authentication@Sdac.hlp>Main +5 ClientVersion=TMSConnection_ClientVersion@Sdac.hlp>Main +5 ConnectionTimeout=TMSConnection_ConnectionTimeou@Sdac.hlp>Main +5 ConnectString=TMSConnection_ConnectString@Sdac.hlp>Main +5 Database=TMSConnection_Database@Sdac.hlp>Main +5 IsolationLevel=TMSConnection_IsolationLevel@Sdac.hlp>Main +5 Options=TMSConnection_Options@Sdac.hlp>Main +5 QuotedIdentifier=TMSConnection_QuotedIdentifier@Sdac.hlp>Main +5 ServerVersion=TMSConnection_ServerVersion@Sdac.hlp>Main +4 Methods +5 CreateDataSet=TMSConnection_CreateDataSet@Sdac.hlp>Main +5 CreateSQL=TMSConnection_CreateSQL@Sdac.hlp>Main +5 ExecSQL=TMSConnection_ExecSQL@Sdac.hlp>Main +4 Events +5 OnInfoMessage=TMSConnection_OnInfoMessageE@Sdac.hlp>Main +3 TMSConnectionPoolManager +4 Description=TMSConnectionPoolManager@Sdac.hlp>Main +4 Methods +5 AsyncClear=TMSConnectionPoolManager_AsyncClear@Sdac.hlp>Main +5 Clear=TMSConnectionPoolManager_Clear@Sdac.hlp>Main +3 MSDataAdapter +4 Description=MSDataAdapter@Sdac.hlp>Main +3 TMSConversation +4 Description=TMSConversation@Sdac.hlp>Main +4 Properties +5 ContractName=TMSConversation_ContractName@Sdac.hlp>Main +5 FarService=TMSConversation_FarService@Sdac.hlp>Main +5 GroupId=TMSConversation_GroupId@Sdac.hlp>Main +5 Handle=TMSConversation_Handle@Sdac.hlp>Main +5 IsInitiator=TMSConversation_IsInitiator@Sdac.hlp>Main +5 ServiceBroker=TMSConversation_ServiceBroker@Sdac.hlp>Main +4 Methods +5 BeginTimer=TMSConversation_BeginTimer@Sdac.hlp>Main +5 EndConversation=TMSConversation__EndConversation@Sdac.hlp>Main +5 EndConversationWithError=TMSConversation_EndConvWError@Sdac.hlp>Main +5 GetTransmissionStatus=TMSConversation_GetTransmissionStatus@Sdac.hlp>Main +5 Send=TMSConversation_Send@Sdac.hlp>Main +5 SendEmpty=TMSConversation_SendEmpty@Sdac.hlp>Main +3 TMSDataSource +4 Description=TMSDataSource@Sdac.hlp>Main +3 TMSDump +4 Description=TMSDump@Sdac.hlp>Main +4 Properties +5 Connection=TMSDump_Connection@Sdac.hlp>Main +5 Options=TMSDump_Options@Sdac.hlp>Main +3 TMSMessage +4 Description=TMSMessage@Sdac.hlp>Main +4 Properties +5 AsBytes=TMSMessage_AsBytes@Sdac.hlp>Main +5 AsString=TMSMessage_AsString@Sdac.hlp>Main +5 AsWideString=TMSMessage_AsWideString@Sdac.hlp>Main +5 Conversation=TMSMessage_Conversation@Sdac.hlp>Main +5 IsEmpty=TMSMessage_IsEmpty@Sdac.hlp>Main +5 MessageId=TMSMessage_MessageId@Sdac.hlp>Main +5 MessageSequenceNumber=TMSMessage_MessageSequenceNumber@Sdac.hlp>Main +5 MessageType=TMSMessage_MessageType@Sdac.hlp>Main +5 QueuingOrder=TMSMessage_QueuingOrder@Sdac.hlp>Main +5 Validation=TMSMessage_Validation@Sdac.hlp>Main +3 TMSLoader +4 Description=TMSLoader@Sdac.hlp>Main +4 Properties +5 Connection=TMSLoader_Connection@Sdac.hlp>Main +5 KeepIdentity=TMSLoader_KeepIdentity@Sdac.hlp>Main +5 KeepNulls=TMSLoader_KeepNulls@Sdac.hlp>Main +5 Options=TMSLoader_Options@Sdac.hlp>Main +4 Events +5 OnGetColumnData=TMSLoader_OnGetColumnData@Sdac.hlp>Main +5 OnPutData=TMSLoader_OnPutData@Sdac.hlp>Main +3 TMSMetadata +4 Description=TMSMetadata@Sdac.hlp>Main +4 Properties +5 AssemblyID=TMSMetadata_AssemblyID@Sdac.hlp>Main +5 AssemblyName=TMSMetadata_AssemblyName@Sdac.hlp>Main +5 ColumnName=TMSMetadata_ColumnName@Sdac.hlp>Main +5 ConstraintName=TMSMetadata_ConstraintName@Sdac.hlp>Main +5 DatabaseName=TMSMetadata_DatabaseName@Sdac.hlp>Main +5 IndexName=TMSMetadata_IndexName@Sdac.hlp>Main +5 LinkedServer=TMSMetadata_LinkedServer@Sdac.hlp>Main +5 ObjectType=TMSMetadata_ObjectType@Sdac.hlp>Main +5 ReferencedAssemblyID=TMSMetadata_ReferencedAssemblyID@Sdac.hlp>Main +5 SchemaCollectionName=TMSMetadata_SchemaCollectionName@Sdac.hlp>Main +5 SchemaName=TMSMetadata_SchemaName@Sdac.hlp>Main +5 StoredProcName=TMSMetadata_StoredProcName@Sdac.hlp>Main +5 TableName=TMSMetadata_TableName@Sdac.hlp>Main +5 TargetNamespaceURI=TMSMetadata_TargetNamespaceURI@Sdac.hlp>Main +5 UDTName=TMSMetadata_UDTName@Sdac.hlp>Main +3 TMSParam +4 Description=TMSParam@Sdac.hlp>Main +4 Properties +5 Size=TMSParam_Size@Sdac.hlp>Main +3 TMSParams +4 Description=TMSParams@Sdac.hlp>Main +3 TMSServiceBroker +4 Description=TMSServiceBroker@Sdac.hlp>Main +4 Properties +5 AsyncNotification=TMSServiceBroker_AsyncNotification@Sdac.hlp>Main +5 Connection=TMSServiceBroker_Connection@Sdac.hlp>Main +5 ConversationCount=TMSServiceBroker_ConversationCount@Sdac.hlp>Main +5 Conversations=TMSServiceBroker_Conversations@Sdac.hlp>Main +5 CurrentMessage=TMSServiceBroker_CurrentMess@Sdac.hlp>Main +5 FetchRows=TMSServiceBroker_FetchRows@Sdac.hlp>Main +5 Queue=TMSServiceBroker_Queue@Sdac.hlp>Main +5 Service=TMSServiceBroker_Service@Sdac.hlp>Main +5 WaitTimeout=TMSServiceBroker_WaitTimeout@Sdac.hlp>Main +4 Methods +5 BeginDialog=TMSServiceBroker_BeginDialog@Sdac.hlp>Main +5 CreateServerObjects=TMSServiceBroker_CreateServerObjects@Sdac.hlp>Main +5 DropServerObjects=TMSServiceBroker_DropServerObjects@Sdac.hlp>Main +5 GetContractNames=TMSServiceBroker_GetContractNames@Sdac.hlp>Main +5 GetMessageTypeNames=TMSServiceBroker_GetMessageTypeNames@Sdac.hlp>Main +5 GetQueueNames=TMSServiceBroker_GetQueueNames@Sdac.hlp>Main +5 GetServiceNames=TMSServiceBroker_GetServiceNames@Sdac.hlp>Main +5 Receive=TMSServiceBroker_Receive@Sdac.hlp>Main +4 Events +5 OnBeginConversation=TMSServiceBroker_OnBeginConversation@Sdac.hlp>Main +5 OnEndConversation=TMSServiceBroker_OnEndConversation@Sdac.hlp>Main +5 OnMessage=TMSServiceBroker_OnMessage@Sdac.hlp>Main +3 TMSQuery +4 Description=TMSQuery@Sdac.hlp>Main +4 Properties +5 UpdatingTable=TMSQuery_UpdatingTable@Sdac.hlp>Main +3 TMSScript +4 Description=TMSScript@Sdac.hlp>Main +4 Properties +5 Connection=TMSScript_Connection@Sdac.hlp>Main +5 DataSet=TMSScript_DataSet@Sdac.hlp>Main +5 UseOptimisation=TMSScript_UseOptimization@Sdac.hlp>Main +3 TMSSQL +4 Description=TMSSQL@Sdac.hlp>Main +4 Properties +5 CommandTimeout=TMSSQL_CommandTimeout@Sdac.hlp>Main +5 Connection=TMSSQL_Connection@Sdac.hlp>Main +5 NonBlocking=TMSSQL_NonBlocking@Sdac.hlp>Main +5 Params=TMSSQL_Params@Sdac.hlp>Main +5 PermitPrepare=TMSSQL_PermitPrepare@Sdac.hlp>Main +4 Methods +5 BreakExec=TMSSQL_BreakExec@Sdac.hlp>Main +5 ExecuteForXML=TMSSQL_ExecuteForXML@Sdac.hlp>Main +5 FindParam=TMSSQL_FindParam@Sdac.hlp>Main +5 ParamByName=TMSSQL_ParamByName@Sdac.hlp>Main +5 Prepare=TMSSQL_Prepare@Sdac.hlp>Main +3 TMSSQLMonitor +4 Description=TMSSQLMonitor@Sdac.hlp>Main +3 TMSStoredProc +4 Description=TMSStoredProc@Sdac.hlp>Main +3 TMSTable +4 Description=TMSTable@Sdac.hlp>Main +3 TMSUpdateSQL +4 Description=TMSUpdateSQL@Sdac.hlp>Main +3 TMSXMLField +4 Description=TMSXMLField@Sdac.hlp>Main +4 Properties +5 SchemaCollection=TMSXMLField_SchemaCollection@Sdac.hlp>Main +5 Typed=TMSXMLField_Typed@Sdac.hlp>Main +5 XML=TMSXMLField_XML@Sdac.hlp>Main diff --git a/internal/4.10.0.10/1/Sdac.hlp b/internal/4.10.0.10/1/Sdac.hlp new file mode 100644 index 0000000000000000000000000000000000000000..8e167ceb38b842903bcc0d5704c7941084252ca9 GIT binary patch literal 1709689 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 z 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≠|6xfGVw->OV!rb2Dft2>RPc)=YE`K zkR64K@`WKQ-1XjbAwLXz9mBwYAjl;#TDilnj8+=*=otQAu=2O9!2s6Cq?|bH(KI7d z2Q7Bt;}C^xvJM{}!@uVi=Zlc4QbwjkKKL;qG&vc=2%$tvt-+sx{0W7^jtxJKqV3Sd z7ABSKvR9sq2XxqJT$kJeqc9Coh~vR9KQ&B;r&Zig=qfleidda5w;^@`i@_(v?_38@ z2cMwdgy%LTA*lUcj-cjcDC{M%p+Ve>=kUg&>*Wr33FaPu^zp|>yac8fYQ4RnX;E`q z*x1ZVT0>mZ%X=Sj5nX#5+H6EQ0ENA%c}!dGhe85y(Y<8b88~2v7*D)-KgzZz;P#ea z2b#3`Lc5A59z=auWYQ0QrY-n&95Hi9g9IsS!Kc6l$P`QdB_MRUMv4f@BJP&r0WnLS zCK}g@AO+iw``u=|c>H6|Nu%HLL-F1S3&4iZN#4>r%??L3qFS%JwfM*w1hxsej;+Tz z?X(eM7V+BO7L&)(g}f}lX-nxqZmyssHilWdLd=V*32W$;wTe$~GD5Nqj^Nr6y=vzt zz0h5`O5hxVwR1p&JX4pl_Tf7ARBw|Jcs}o*j4OGVEV!eDnyb$SFaF1Q8f%5 zoN(Si(c;#dK_gCbMfgZwE7xL(D?jOe#7~@S`=OAtwqv|yZOM2Bt}EYp=^4TEc;<^^ zo`e_iDFg(^;r638!?VaO{7CbsAD&ftg_(c~fGOO`c!vMLDF2r;A_eGsTJrJ(M z(jt{R9iMKp8#Tv#vH6DVe40Qq$)zIrl>rW$g`0IF2=CJ7sToFVuPO%ctWz0njvCyF zz5%NoQI>}_JXW6vQ_OrX;AUFBh%rRE2(XnMOVop?`=W3#zYih{OB6wQ3anc$J41GB z`J(A*IES8@NryB9uqgC4`lQ#QG6M!VLi|Q^#PAMDtT<4>OJRt1p!IXSB05Bc(G=mW zMI;s~;wg(t~(+f4OiB|JSiLr?|j5se+7#fh-Pp-)qVuJ}-dgO%S=qi4ZIqm)3s@#s; zs5ZaGEP^_J+yJBzh5Cx4_Fa%uhQ1#(rX=`gaAxoVp828!tEa2S)w0!iD@I>&IQUs9 zePzJ#yRy0~r468%!VD(@xo_eXArm>x47cw%GxXhZ)8{n@czmIv+qp1|GDDmK+4&(} z)9`{~0XTFAwC9)+1v|wP{s51FHgPuT#J&W6W_otUFmb@10O@4ln?X;`_pgpSGx!Of z`QqrR+Tir@GVqSwObio=&JXmE`!P(FRX`lGlmR{nNcI|irwmNL77f-Y#!q5q`4PK$4+;Ta3LS632;?&s1qS&fDNx=WvHM;|ni$Z3A!$NX{tl&dzqK?0nsVVJyLIU9wXz5g7Z$Hb z3>cOhkS1g$y|eY2w}qvaW4*ltl8!H#yFzgs8KRlBKU_p#C zeq7>e8^;q&foM%cBj|CEFeywW0R#; zG|JGexIpT=&}|-SCL!DQwA1y)QuMHW*MSAG?icc-V+A-R<;;pW9-S+L`__&MkxnCl z!;o@Q#v&pE8wZAMM4)S!g=6<_pj(<*v=}I$Z*(ZKZ~uluT@$tx*ChKlQCR!Vd*Ajm zSt=JNQgL>Ahav}fIH(3kF&ND3pWFgO47+q0JL^d17PO!cz2e@r=C041RE$Roi*4ID z>!sLf(q?i5V6sVg+QqlaXbs~kiBi2bggYNx;DQIeBc*h_C?~UUj ztzGR;TP^?ZclP`4y?O5@c`WVYGvU5vX3jEm&Y3f3&R{P?>_7l+aV}H?Eu2%_MnL3< zND#z^sk`Co$Ib+u05}_lfIt}(fp66qGBXH%@k$&%#i1zah#+G?EjW`9CnCH{%7x{O z7&8BUup{G$xe6m>Aqsg{+{aYd8XPfVh^cwt%02&viQbkQiFuB5UIqyfh^C@IOc4oPl{*6+{3-Qq-9wg40ft7=Fr5Y%XnGT#Gi-(OAWVaagyekMq547%Q&pYkorA_kp|JPw z+Xh8oreBVW1`~4oh#;FB|F9(8v+aUK86wPBaZ5+IkTlSx2}P7U^Q8;Y{HRpJdtKo~1VTin`e2Yt%XKpzzL{0G}e(5PY~LSyMhOq4fj zPeVBvMSxLiKp7ICvN5A{EBTLScd1sojO*|;ai+Y?&FX9!g1q5 zxAEpoDxEa-bPkp>6mp3eyoy38k+-g^CwwT!tUA+s7v>AUXqYt8dv?l590(M_E$)Pv zjygk82zWkzrdB;O$>}y$Js~Ywe~Rw1gDW5&Gvq>!VBLnIrg})e60riJ&(ZU~jtUGS zB+4h38>P7;FmmN82;(dfSltLBi99P<<{01UF!~;o4RD;xoz4?{f(0M@H;ISSs*+oC zjxHh|bpT7@5+X&^YL0`53nb$3y2WF8G#~kwjw>AdBXzLPhHaqH(FMkXbiyn)X9sFPzDW2Eziw z!4N zO~4+u{ah8R`RK~>z$8B*fs|nA@e~wdcFZ(`-K8DsRh%JJjz=BC%g&n7(PR{& z_f6Z`#*TMZinXDMFbhe}q$ zwHRGRO9%yTCF9bNroI_rn$o*vj(5PBQPGG{WH5pgkU?0)_bI@wgxmSSQ6s~5M7);{ zsvaeMA8A<7al%}{bSKc^!k9hL+#K{n+LS`BDQ4Up){ig@c(}e;FNZ{+sPNEbeW;qf z>-7>k)0&SsHrf6|25OqRAh7q?3fZd*_Cg8X5p}_tvL6Zo7&l9)i^1KY0al&q^~*cU zdk^Y@Uu;FW_j0NWB^jt_jzA#<&G=HOi3y~4o3^E@Z`Fftp0Fg^zeA@jN&?d>Wd=ao z7A3mmi`cOak*US|lhkJy<1;cAo|%h-14#=IX=EzAGHQ!(`NrPwvQUQ%8zn=|0yyw* zdIYUoive$TGGew0Itgh2hpR)`WJ z%7+M4bWiLhf0e-~x~CeTPgfXw*<>qR66Bcj<(airVjj|QEgMsq=G0R>Oka7?xkriC z6NP|1ZTspM+1ElIGLvcNx!xswgH{`)W=7UaDED<5Xg(+A0yIc!5s)w0Mi;ixXdFl8 z=g~AJFyZ~aZN6`0^T}EsiqiZeM8CDwLikrC9nN}n!afE;kgFjaHB#)h`b+>v9}j!E z02P(GX{V2;3@y>0LJ+7=RBPe8*EW3tJVwf~jJgy&Jn%?pevd+0c@~yd1wK;n*u1 z=RSH=ZrJTd{qN3{&JBC=j>-L1LfD^8e!59Leq-~B)$Pv>OYq-BQJf56y%G{yGZNy1 z*P03;nlX=K1!p^&Y-&sPFx^%P884!jV47|A^krKy8a%B>*vlifLRNa@9WdZ-6n6BT zD@N*Di_QwQin)BgeEYWkB8UghqgFp|LE_uP_IaNCt(J8rAj9H6rdB zU&-BRojHT~XzoNIaW1;jnEvx+9DLelB^lT#(%cI4hGHvQ9bv7gsm698O!Y-fUoyJ6 z9%rs_P(>X-#ZfEl%kc;dR|91;ri+hNQlaFAgVE zMq!)ZGO>_XGJy3UmpMyD4;l}niIiUQuow4xWC$TgQgyNhSF%)A$is)=4Os$?V5kdg zN2CK_lNIu}*o6@p3h>`TnaP*C*dn#6AUiE2(Wp98$kUWVXH73#U``gu-DKKV;y}G% z9>~6^ndkFyg0BiY;mF)bz{G5=XsG5&RGVLCOqn!i5>IoIRe*~f8ji{vC2-UdTdYY* zze&rJmCa2EfS2YRaF$!e>hu-g+tYsz-I%Yz6X(66+M&tE?w3J+_rxIh6~q{4_mvyW z3|F}kgEJia*>+?H<|1=Cgib$D4LkSx3OXYIk?^a!vbqVgKp*}POu~Gs!tpgAqF7Z? zUtc2*JXY4>KuIIAW{UxX_y?08m(vH*R83jVRrFcIENy7LDv48Yyuqh7A&3G-%@fHq z)wo;%N@%-=)8R2tBBOHCb`8n)H(Mb@PYLCwkEG$87U+El3VZqdM$=Ppn+VQU2vw;p zK#)3$^$VaaY-VEi+kz&PF;ft*-8grbt>1r?Jl_Fh#)m(En4y3nATQXKg1{IZW?aDT zbr951c7u-~9k$7UH6#?QRlodJPXm@wc!DozN(V0zrfS<%QD{?DR~&gvu&KG?DyrGo z*++Y4qYOqNSWnsZ%0k=gHTJZ>bV-ep7Silw17;`rt2AQ;ZL6~Nmr>Y2-rulTpkrq2b$tb4)lb7+%qU6TPrg z8ylOKNgD`KAs^#j`_qXG0G>F*@U=qg~l#qH*;4*`#}jdpbyx*NQ*DrxHzmV z47+A&yP@4GVc($=q`t`Y^C7T$5QP*ue5Kx@6V^)ALZs!`pzZ8o`eTB$iYY(98kk)Mxk z7AQc4c|Qk+(=0~msX5Pa?fB~w!>X}#)1v|!v0NCbx|Rq76_Hl}`+9&(l|*8GZ98@d z@r*k~eh>xr)-4AfChc!Crq7^>>dCbU!+RU+8j%0lKL*qyPYrTF?m~#58q|@ak)hWz zle`t3B>ct^AfWf5T`M<4C@-` zVICz+l+T$pLw?-o2zdhXX*R$hPSGnyAs|az4e~34zz92#^G3voV&%alq*@420{fY+ zMyC+mLj}~0L%~B$EW&oZ?Jk;FnyrNG6*16)| z5$kT%t+(ZFeejn^Hg zPJC%6a&^YIV`0AV&z(ehS83 zheF1F>qTRmj|&w;G{jb4b?+Eqn~SI)SbpqLM9-n*TW4Qr zObjbmzV*i8%nM4}Kr>#9B^>&JK(=hg$TuSdW0%e~DfLB99NGczu|onv`68gqNCNE> zBT79WkyV8dVPbq@#o}7BQqYRBp1n*%MP#bjBG|{26sjgJM8a?Tpy-xqmmyq5$juOs$hNmWtaUviT3#ChvHx$Q zWW=`$9SuhzI$gSs(q}*C1ZA!WNFi&~bK{hrk0i`V zfG6Wn(9(v$UuY`?g@#;r+Q^8kTyZ;zPh=kq{3A9f) z=AG^R0V084tmr<gbjbXNioh9^xFR;+$rw5FDG#7#gr;#3e#F z^d=?0Rb)hHk_9YUk?DCrEH1SbGS7oDpijpQd)b1b=0R|UPg!);gG*jAT6dD#owU%h z-d`Nfev zM|n5&LaU8Qy6u)#%S&mCQFjmuJ9`C1P0r&vGQyO#seZB8r?Hb%_tDWwN+4zd){K~Q zojL@Ch~0`p%(3j99vss;gw#&WG%UiBFc5}Uvw=g;OTuvQ{s!=@=H;Jj&WYH} z%==tnKz}X7A=9POOcsxNc>pB_KWe?Yc|gR41iGt}%ZsWyv`sgB#Uh6J&`$T%+?k1B zOcPKJTM0fGvB@X`e6S!x&ti>8-;7&N*TG=WGlL|q1F15O4_$$D<-pHafsCYG&emT? z5mV`H=r`)Nqf=*le+0Mq#kYHp^3E*w`CxQib~FHAtHCIwi{A&+&F6zTZMt>9=%(9p zz?^v8OV6ityxW1-l-{kpE}tyj@(1??&B=)e}XHUy)#c0W^XC-^N!&b;@R#HEYT*i^AO$PRTzpW55=+YMI zlfW2m&$E}mqbQR>Y|s0IGbOX!oVV$YPm{r{23+<$6hb2-xEeq9NGX%Cg7*Ki^{=A{ zxiz($C)EFtm1lcQ@yjm`E5VoLT&fGF2(O&LeLo!O15nu4%P7hMD547To9FQO`K!uw zNtBtod8PdYZ9~@U(wpI!=#+nkMC|=kz?c!^(@}|F5}_N26rQ2_#py{OV?rVq{1})6 zagIe!5MIg#3@u{_Lhn)ocUCf{1|TzdgdMH0buS51{ItkT;6lYRaV0LJ>cBrCahec4 zTHmBKHfAoqh88N_@V{d@z3FitEpLS{^qkbyaYWv)9$*p2oFP(P;wL4T&ov2Nnn zAV3sgj{GrTQAWXc!1VyrCO6l@wM>sELJSKNxK7C2fn={gx)mraM5^?D&_Q5yP}|E5%%L{Qu-uM(r6gi|F>+D(J*k@ za&g4|e{L%T7f05+pi<7Ci&_OJ?1r*M$;c@Ircg#+Q2UK{&9chpUT~a%N-UvG%t_&c zBt$i6TL`w>yLujtu_soY?Lke7FMf|ND^7KNklN=!kZwUyLM_DSAcUIs+F60d{@84X z1R8rjd~z0JfYRVt6!y3l6^ikkm=m^FFV-@orE%4ybY9CaA7q*X$_>yWU=L>loECEg z>~FS0R${INh;V?jqvk1w61N71huo@_l1FpHl{%ct=5uBKVAeK6RN+7M9Us%Ykd%Ap zqY&`kQ_c9?90q_PE0MR;apn2jLe3jI)vY*r7bGd*K!{=R70L_`hD|RQR{LxrYj$quw=c zTA~huejfdIMroO5WYn$d&JbC; zDUI_B8U4xQ9gP^l_2&90akyusG~kfmkw4(_HX+l#SFOPJSj_Xx)G)N?oK%w<57>y_ zc#jx%@)3I^jaYvtFbU~r<1E27BnmuOixmmpaWsnV3EX+w(1559n7bA@9fgdrr>f*~ zWBW=f%HJbgnFrQ{!WDKq$aXV`b0G@(a#hLHyu-R4((Ryqq~0$^ z@Ipl+Z@6Lz3T849AyJG^!9piaJE^QgWGhKY_>;(k=^z0-mx`bkJfK10<`5((Suqne z0I!}+gzHHQZ?u)H9SKC@AGSjFjs*5{3gn1Vap8`H7uPl*%HKK?1kfNWx5g=U*z;Q3 zh!8uzK}j=a(GPn3k7>j~8}&8X1mt0qj6y_LV5gLV87t@`6>NRzN+nmnhdl}E;FVp@ z@&1O%#V>A08G1S7DsMh-nvGkw5Q<0fa3~79s>BbJcrD~G3W`^^rj@d~@eWB@cK!>L zjQDbwy8wmg6s|J5c#0nQcCZI^u@CjIeF#FZ0F7pZLW@;G@GV;*E3rBP4EZxKU`N|l zkJ2Z6aR&s5?i*Yfm>gdNFWb3Yp77<_Go^|7gu|Mci;!j92xsybMun+!kd!vOJ_+ak zq$^RcV;3e7dCqk>=PIUjBd0Vbt%#En2M&E?64C)*%OGwZhhz?DQ&F|n+`ve+(2Bxd zFq@g$YEaJALNyNc-UA&Q>gXPLpeF+<{C7|)BU^L@l9gjUV+D>`96u7RSD*qL$Q#&= zU7zDUly{Ez5tzj<-b8tN9jp_WGfO97lagZPU=((99g3PcL&(Iy%rUj>tkI47XHDQ1 zhqj$~?D&8+S>QPpkPbj08fT&c@q`5{{Eq%1=gb;?BaeaJF+kYsx@>yZGljiwvlX(M zDO7Nj#O&yVwFb?r!X^q#gHn3e4X_;33&|~IsnUE^jwYWCLhrj6&iW=Gy(2+rZ?(Nf z?MUF%{4yLa;pQJs8X5Ix;gFkcyl|)jo_k&eYm8z&UWweRwyVrqk#HS&g`r4htyl&! za>>YE=Aoj}ioqo#1{C{Y+nM8FFn9VW69_D<- z^im(JB)oUXh&XHdq_UD(%}vPrjB9ss+8aCXC*hbuvUuj)sR-{)&YxF)y!gKs(alv! zH$OMQT4j3)nX94~nO%@xRf6;}ilX3!L9m3(HOD_8$*?u2g|Ck-!w}1hy?wA&r!gFU zf^)NYLi+4EXb55bdeiA8ozyAmA}?a|b!_`3qVIKnzh_|UBDCLYfa`fE#P#A0nCN)M zDV4{g@okH|=ptFM3^@|z!wCuh7{M1IBPWd#T8fYgcLAd4F|Wpn){q4MceX-S8d7)0 zjs|ROt25;~dn9m$;BC2dk*6=c-E@)FmHc?G7)K+9s;x zAtNljWwH#O;FDoDI0`|v?v>A)!wDnO;L?N514z8Q7zVP86X37rmC5+Q!ddu6C1VsP zk#K&23cC*Bt#ock#{vGQS4$j05QI_U3Pjec@sTJM8B_oZ z#IG6fk;Qf|!y#K@e;TL~F*}QF(SB^Y0V%bk>a7{q0?m=mDO<-zS zU8@`IkgjFN`C9@5A~*=R4@TUG#wJvtuEGsW3nN4)jXL2j;f9UQz=R4K`C;_*Oh_mx zJwa@FNOy{}Y#?BpvjI*EMFRGzt&o*aJQ4iqjlzzO-)dZnhlk2IAS2cd1`kelB*>tz z1Ba*>k7pc-Vj^?Qm>p{A5EFOAi-bIKLkteJ!UV~o*Vx)^#=4?8aWGP)MW6$&qM>pL zWPMjg3Zt&mxilw!DX1Bt!7gQ7%9up$TEUne~Ngx|#mH^1@H zvENach^mQpd+7+qd1xmi(pvbk(@k+Iuyu-zj6HDtlR9kuQxqYD@?iMW=)Y$5Io`(@ z;QZoC+edlRcc|?W>29U?;Px6jIu2heF(kIv0?ucK*MCG&xULV%6)}XQLmy(<&NIiCo{)}ntkJQlq~k)IpK>0c1I-XpBk{E9 zGsHMo!f=SKKZsmRS5D*_!7285v5zY!4@8cc%tbT(jW zF-Q=*wi>*$5`*_*gfyeDqx+vRe#ZAh#h^iu(p?Bd2P=w1ZW2J8&^!re6orl9QKj=E z!$GDJ6#QyiHd6Nb<)hh{a0Z6jW0515au$$@G$3*}!}gCoCz-R&*(*}J9pcV7%ONE; z3lrr)CAqu;S;Ug^dN`W~+#IzqyCqWeB2NZRBsHn7VCX5qEs)`U2!Ip~DM{8>PMAm;Vm-$MPci!QP@Ddh$9^2BO~+ygrr%GdAQ_FY^FJbn0?-!O}|>ev(L9}h2R*FgV@PL z;dxsDs*R;2`fc9q!KPWW2RHChs72WL^}k$O!^~aFwIAi z6-Qo%M$=Pat7A`>A@f!>B&Bw<;}>eTKT*AmG3HS1ZoGWGb0Wo#UgG`>;E-`Jz7NzM zC(`)w))x)ZE25D0`TBj?KjBK_y>CXF0ZeS7!95^$(d5Z^!(^HC9D8m^OI8QN9umHB z1(NA4Gs$Re!iL8B1yDl3xuK2;6PDC9BXj3MO&}-&8uRE~#luoNusuyzc@+c*aTd@# z7KL;f4$3InoF2j6d0^H2TGa|k!#bRM%AbL_-+IY>E-NHcEdyBLY}-k+*wrptw!X<$ zh;q>~>x1X51sX($J@oHlQ2BlYDrYdS821d36`~eL6F3TWj(I(}tU8xES|CJ2prW~{ zj)54Y>k5msn~k1uPqtu0Bdc``VNTf!K`9@lW7x|!ls0wDDMJsw*~oUqz$#EnD+ubthik7DIk*>U@a}QVNxGw9K#D3-~(((GgJ-o5~N4ki@ zjleP^&Ga-PNnWuPqNb5Qg*kgTpquF>WH^dtPB4Wzdzxq~Mh|?gm)OfCwnA{|h3KWv zBl_fD;5a*apnIVXaQG}T3H0l~Dcvdp9Ogs$z=;8wt(Z$SwM_Ckp#rr;1X)sSb8$-- zzSy~C#ieSU=qMUq3G8c%x(Gf%*y|V7G4u(-9KjRSjrBDZA_s6)a$z$LVA?pY3A$@) zJ>h_KbaGI85lnmleRWGCg>!$-DK$heM>^6Y6y&n&>xQl7mmv=y?F^4iVEj$W~KquhL2 zv>TR+6^J~)8%Plqej?VUizTe}`x^vb3(PXO>99mQOJ}|k;*R1+UDaTKpg)}ZYFLys zt5vfDLU$Ky;I`{JU&bOSP_-B4F41Kt8>m)VgVYHMGc z=hmPlX>{UxXbxDmxQj!?=TU|?G*`lrrj9z}mr@rBG*r-lb#J+=8)!=DhA{{O?#lr4 zX(*)TZGc;i=$j%aI!^`nIvi7)QKm*y{xA9hr_QvU%dBCJ7fsw};ds4Bve#_)(RK;U zJ+BOfu%6o6z0;84T{OD@q?pa)iIaWS@#B^g`GdXEeI*Q$h2*4U1tA=P@AP~KuIgvcwShk2mU z=Hh2BAE78cTogc&N;8XG{4+qVLr@4r$pNN4vGL(!726X@gy_zPpa>=nl71+92?^L* z+gP}lFzP@$S2x_oAvDk0MuMavL^9S>h22T33RTZW;o&2~Pz1HAh!i}0#3sxI1MG~y zrp6_L2+hT$%zW7Z>;1RwfY+6rl|LE75&iBV`_KTWg=_#@n(_ z?*6#uBV(WZX2P<$$|(8Y(|$QoJ^u2frlsw-PYC|dk}T+@?GuvYTw5VK`-DCGx2+T$ z)KUuvSE1}_yR8__e{G+zm%LJgPgeHH|6$IwqOhY+P*-KmygJHJs0q=!uh+7GuL!=)M%S|YA5jrGqHD$TqDX1$)ahjr8j9*X)A9X$j&^+j4FsEkQ4W zn9C?QwWK9Pl#3ZFXi3Y~zm38M^7=s1aw+(ORp)x2LDKSz8z&cfmrnCZ+7kTsAQX1= zYgHGLwt!6cOWJ*1Nh@y@prgdwg4)NR=nlS(=S0tzQ$-7TzCeXm+*&n#*!lBh?OEbb z_<|`o{>GS_6+=gk8SV*L+yaV9njtQ4RzKkwFwFxj+XUXI zU*bsSuhu3CfYo!qZ0I;R8DD=?&X(A`l zNbxKb1u~L0hU?tj+J;8Z~VAW(T6%TIq^8t+>Y47vaIenh1wyB}6 zsu^oQ34%e;=|yaDA#fL&Sa4&X*}D=uC0J)xBT|A<4B?s#LsXAia`*~xD&wft+J$U= z(pCr=fJVE>P5N^%N0@7oy$pi*;F0Xa5}9by&kQu35ebbo;h-qX zSV0R%w*Dvz8^{|Ew>VAECs&^<+~fRW>U3Z>(bMYT_|}ZS@2EAl=ld_Oe<*{Msc|PL7X#XixNA8@)b6tt zvXfKn;XPX^WSB(ADfV>Oj4Z&@a*Dmow-vIIQ#2`mjKYq{H4g5?#MGBVO-f3q#RH$* zN1oiY?9xI8liOH=^eU++_pwDqpGz!XR%4H-i;1t9EfV(5TTySlR?_8ygXv$yy`MBT z7d7F>g$X*pD(S_Sy;M{-@q2uQ3neRY=@zEBjDOcLI6^jf_<`rl|H6d4ONNJ`Nv;h* zTa4y!@8bzIe?Z=Uc{?Gy`NiS03cb~<3%$9JVaqB?>k#!ME;21c<)ctYvzJiRkQN8L zeEB{Mmgz0Xn+XYo?ni}%BtphGDSyQ9;zBoBxo#OP=n+jwrUT;W5v>kr=n+lyT5N@o z5iM@Cmxq$L$G~Mfdw3azy~4%`8jy%4#L*vUCY(!x^C*pUiIWnZTqnSZfF_vRnJ^4a z8Ni2;1U`|7CfOx_Lz0WOasL7wKl<1Z98x?IdN>Myxzx5MghqO6s)bUhJM4d@HN+E| z15w!B1Gb^@VPL6-B$jFIoPsv!D84sD2>C6BIw2N| zVrv!pqOfIOYf(XQXi*Su5dsR(m0DckCDPf1lR-h=IbJ^k^l+O%3ArZkrlIsFK!39p zvJy|)H_DC{tuzz}@r{bkOui25m!))Q6eG~x2URX`j_WERKycwl^RimZ8$Fc>>DO(K zAv9O$odroT9EIThX%*HcKs8aAnky{5*?D)hoOS8SySO#BY9;^e^f*Smd5+r>xvAtR z@XNadi-HLO+wbb6(XbwRv1!-1dwqCcUp&rBJJz1BD6a@1$@1Q zBH}_H-kQju-W9|o7Y>669zwznN-0iAnu45?Wt?TC{;BqdYL@YbX@(dDE#pktDuugX zSy4*GnW6&4?Z$^b+Guw)Nn6xl{2#Q0=;l$>ve7*-H1ppT$8JUsJ@lP)jx)~qe` zsMo5fR4L`y*I!YTvJg@(Tv>=}Rzv6(JFX$veJx;%)(~n~)AcY2g@`2?GFJgjWu3=OpoU&!1W@sW3gfIK1dpPK8E`q|pRk&C?%dgh zGXP(la0Pxi){G*aH`c-QkAN}mS25@DhHIvF6hC(DB zLQ$hXWQQ!MNCCTJldvY~#cqF>P1kzpv)g>oPr;hi(C7I#`uy1uX|L*D5;pW9I_Ie4 zryR$|g2wn>)KIZlSks7%@qLGcDA=sUrZE~OVtf(C%_w3Z48uUc7!a>K3h$9O>BN_7;A!DmB1c zGq?vTfKe-34->zir0=R)khzBRdQD=~3*FG-hO9ufoj$*p=gpG<0dn~=9qJD}e}nkA z4CP=HlHs2~ThM75hJ>Wj&YfL>0>4=M6?hgm7NUh>35<2K!R!*D+$7s^_?enOB9z;P zo$HFuT1W1LAByU_2Q`TbIV29uyK3bW>bk#F{rKQ6a8|Bc_0}gl9{(hz&Ohk}QQe!K z#P)p^9ypo%pb(B9qYTG$Vz6AyyKKbG0<{U-0=dl@MJyZF7m8b5^Lw<6?bd~j^+utD zSPNQsxQsX@Ml9k}Vd;1Ay7WnPPw@*r4@mXEb6$`25K=35<{?Tn)kl87H+@qF@{PBC zC62e^tA6qw-;7M5S){evaA$QHb)D8=y+@oL}BDe%GOWfkwM^SlS$!lB}tx#f)<;m|7#x zA3E~<8Q9esI-LF!KUJKc0)am$q)3vBFk*j3q%LeZE)*&7BPGZVGJ~;sc;h*YB{MZ+ zd*a#0Si#F4>&e&=slNQyTW{z6K=5BMd7%7;ZHW{07$*%_PQ zWWaOc!qhxA?G7)C^5LZ1s#P5NDHBBu)u2B_c7aN`_t6etvzr&zR5!x;D&Nv?-vsvs z-_w|&?}4DKLDyJWIE5erp=reeMbCVM2cNLs%5*-7|Jkoql$)cYt>^UE`yEEEYM=A!}|;QMWO zPMqCxZ-CToD<4KO5F^VGDxbrpvO+*YBQEZO8_K6g!s{rfekmN+xR)}#%1TPAH&1_J zdY&An8I;jH3jk>&Uh_-`^1a!{Nt7 zr{LHXk)p*_74pYQ8wT? z|M#gO-MVm#hIUAI{LhlX9vLa@5oK0*U+>meF-uq`)J*t_3ar1-Op+T?Z4JhkNPA^e zZ8?^P{6xHN!e6qAcwGffDELNn48FI{`Q$biz9Ul(dyG ze#;LyrcLuPmJ3E*W|r7yiQ%hrgp~4gAvcp%(F>E#5ZZ1ZKpU^1+~zuuW;5wE1N0FD zT{=(_k%Zh21mzdoQ3jNZ_U0j1`N9Qi4u1|cssBmYl_+WsCrDj8heZ_~^&^)uJyA)w zs^+fnn}tZ|AKhBBuaVHADbyX0LT4R2{RfJgv%-tvH#{JjRV6(ah{^S>oi!K!*xK^n z?Vbz8jg8fdYk`M+-H8ACp%9~!o-q&(>)334=d`AWTnLqEE2Rmit~*-`#CtniOKXsV zg+CFm+wqsmndE!N0tl16BjWD0^B#kDRfKm6aW^96h?9|c;{rHVyte>OM+&HN{4Y|&RG?oIPZ7pEqpIcG5b|n>mZsEg%yCWPgxaPLYUHGUYjDj16 zH!dYfW>>+@t++5bug=GBJuXSXFYho^?BKY(;>}B*bD@kiE+v#{+`buz&?qD&kAB|3 z38Szh)ZB8w>fgC=(jqX_EWjI=nnc2-CbAIM(p}9@#Y+nz(s7H0v4cWr+yR>&bzzJp zgwDVj6ANHDz~tm60eie)Wd8)AbbO0WpF3rqUma>~KosvpE1hE*J@x%>Rk&!zvW$wW zs^%mYNiN{;cTxJI5XTuW8VE;rY_Pn$=9wlJ!bHj$EF3xRV3AYN3b8rJxDPKUeB%hqc5vQ7_OYbn7vJm9$i}^x6&8D@FqC@@w(Z zD3Kgxc{xC-B#8qYNhAOf2f#WHr9itHBkw6Z4L~7>_U$^_y9>|xLt2Vrb7_g;lJqmG zje!M7x!BmqT+q?nDM&foq5gE|tu&hKyfy9dXX2$%AV;3f843(i=u8wu(1S+dX*>)> zAqTGRHrl%f&-o+h6pyJ)YYZ2L_~weB8oQjz2xix_?MMrXNTY0}a<#KW8ii?mkSzjO z`O;{R3uo?=D>QKU4er6tL_@Zyu`qLjoH)FDuI2<|0-}*9NIAU7YEG~{gTjk=IueCk z_&rd#AJ6$?TTYBUpqk8p8j&`jk`=Yh^;2cOfi@7~xG{rDu6XRAIv!uTqL)iFr&WF_ zUeDt%?Id#Jhx?B9zK7@hqL%oJpaz4^a34DAfanw))2T@|M6)Hlyqdo(mjR>i~e*YXGGCA2a6&tz@ zi*Sx2dOpNL#BI_bqD@0`V?nPRn1*hzlW+=zr5^+|Eu!R*1C?&PXl!B)H@8WRhnY9z%hoWe!M5!<9e7k?C4n^YkB3gXwVpjr*0_Z1NW~A z@Eo?OU5w8UL?NnY;df#qY$a-P6O6B(dC1g=FMf_PWU}4}vw;i8qcZIxc5*e!F?h!D zG#M=5tzVx?z;`0I&wK$3^r7`c(QQv)y)qd_9(Oy8{q9$4+)iz7hy4Kk(1}5OeuO$I zKmksSKKQgZ3OCqySt#Am`S-o1{F45lF;5@E0yNuExTGPDtI9@uci=gHFqbqTFdvxm zQgSMHC}ga!4jEIPul{Hh0c3Q8jZ6)YJus4_eC_q`g(CnA>@_`r_{S*pc#`VHlMEK{ zcFtrhxB6(#MKrct( zFe33!1q#FQjNsFlI|zCLkqG}n+07HE%UOS15{^4I6-tr3sR>wWX-KRo#G<4jr5|6! z>kRx(NW)9JSZTOFq#>muzr1!=xj{`RWDg^NSTzM|&?n1zp7WJTCl` zRc?3&4-Rswk|D?9r%EM_CsUm841Z-Cs4){&`=RKblx7kKjzTok#-cfA*+30{qiE$M z)fxeL2t`dg)0&MHb+<;+VmFBJnWw_)MPvEDPsQIP^2J%@B6fqQePSW(;I?TFVmC;> z8>bl(#&g*K_Qfb*bNeJD*$Yt<#iLJ zKMiQ2*pM=4W~B|-E9+1v`c4G-*piDl4)%OVi-C4ejN>3-&H{*vE$xcqAc_N58mC8A zOz|-y;PkN3A`5IBNA6-bNPx3}fFeTd*bO2-YE=$gzkwKwXtzl$Z+4(vOfC7+4tkQq zTb%=x0x=eygi@egjgi@>CWoE^N_%na2060k@?4?Nws)~0<#lf2Kh4n z%Dp&tgPiyb2;2)9wpYh)kP8oeWiO1~AoVX>p9>B+ffms=$cU7q^|(>!YQ6N6DGWZ* z8(jRQcs+x^3@L2ML?lvPNrY#r)j{Au^VDH$cwwNKeU&} zZjcY$=8D>_oQ8qOeJ-MU)K;}$HnY3kFYAr{GJf$W%B#-?_seV)M+utY)-b!Pz^~Po zncNz-Q5^o=EnhsxS*Xn@a^2qvcuth3PUNN=QYEcEy2}xH+-Ee~WvgVmBz4`2ZzB&? zZOWvR@rGVcg7q4=M%{;XcUy+wq*Ah)6Mpz^)X&7m04-rHdP()5WDsHbIkBj1gic zTx=lTAhwhOFgjd^*{uQrJEQ?MSCk6W0XxL9$8$;rzU~C<^nnUw=m@`jV8>|h1bjCS z*s{@5yjKA`dv+?T@Qhg^gHc^`LuE3MF)LH%#cYyYfk^Xg7kJ09*cFAOtO4nU;5lJZ z3N!zt%6>Z;Uoe1%^d-&5@rTEyM97N{isD#slXHcH1C^l~BTL!W|DlL*pgM=Q2Y|Qy z;>*vE_8xnI=FOZEo@JVWJLVTmx)2Bd8fk^_Fgd{(i=QdGCN1})TQQLo6>Y9I-Gd4P z8qC=e5(ZTD?&Fs@VL%oV^iC)kRZ0jRMp3g`-f!bOFD^_Nw=P4&2cr^z+xq}TjDu;;I5<$vaemns5ncoF z-F!63rulvwoBt0_SEp%1n#k03lRy;_=7vws0F?w;Z-M1Wamm*~AS=K45ask)MgHj} zBj+1WL?aB@BbmR7qUM*}Ja*O%c1YVeyK_*FT1xj(jAz_ZBE$4BE3V{{;jpfUbUSDt zN((c=eCr0=Flw7Lt9rr_q~Tpq*!193HWTi<_$eg@vEG5IYQl9eY+=XcU%u9zaEX*N z;RfT4JK-4o@1C|$_rmf+@hZh%5{{T1kY}(ngbNQTlxriAE)mz#qIv>_7`}rh9>R0} ziS0c53`4YpM!gStn3uR_qQ}rTd)NeDh$Jms^9(hX3jx?#r?MO>+ z*5IT$MDDx~oai*^?D59VXVt1qI-SKKw@ri1vv{I-6x`XjNGAY@pCBWU0Kkl}1=yuw zV8`r=rZ!H_$2!F2v}iDS4Npg-kS7~@6nQ_ybNTqLV3E@`du$Ks_iB2WG=M;OgXF2nMyvoT6*RU>5V9P;P+{c~gI%&l0IEX9q9 zCUJcC`gh2mMmsBk zLULSwfRV28Q^EzLtJ;v1v9dYH370ttmn@n$u_#9YhoK47NJ4hWg*q>75N@A>lrwuX zDZuDtYHa(^;#{G#O9FC9nm2($r|%f=+JIbg;g*tIp^?d+ie>K#!pIge%jN4S{71Wx zoLEwts{yr30&>ZP&zBk1ytgJ(qou*P0CJ=2B;!$ue=0HHQBhJ@<~`e`xzxy(t-$3@ z;I&ugQX?Zal$&K!e6ugGY*Nf{6Q4yJv9WAEw@J`jz8=AU+}R-)$|o1?eYw;~{R5`t zf&)(QY-e%6X;RVOGdZD1{nv7V2v+~QG?yB=ao5xwSiUYIyEYz|e7W@09HX>r<8jHM z$s?U3Io~8QO}mtIiM%?wS#VvKC|U!JE?upY}%Si=wiw^-0Na zk)23jHbC5Y$$KpaAdehwFh!V1N?dfQ?yo%@9}8y&YVrO{z8PQw(-@H?68HD#w;}1v zJ~?9DsPObrUh%@ZhNfAy(~>Jrudb`{WEwUiLEL+;Eb?x{bN-RsG!H@IK!F6ePImzo zM;tfdleV$ISX)?=Tn32gSQD%O8{PyK4-$(B*WNDb`MGPC*b%Zp7U!NxD|qQKOBGQ(6 zUh|v0etqL!$M3mKxQj6^zeOeBu4guR{p_Z_VrI{6T2Yf7zGhg6D!}$#6v}FH`SHy~ z9vxu$iy{tp897F}@Yh`bb48jHnO1LPT3~czrGP7cLqii7j*vdO?azVTdni=T#Np;A zi@cYJaRcw2+wJqY%FO4%>7jd(aSQ3V;+k@qBkcFUi`(Di)5a}D9_`=!riio3hO?Qt zIU?0FB|IZ3b4t(nO!~@iq|c-u-+1d&#%Dq;tb8Vm44&%xC^IY<%(|#H;ufqRqT;un z=e>r~4~5)Z^c1#Z@tl8V3letbj-zep;)Q119-Yp`c@^Pt{^_{kcfjFaD6}!iy(+l- zeoeeKGGMnOcxB1Kf|TN*@{F0Ym<}JC3?J1MZI+Lxmrlomr?=LJ1t}IvBoFoLiTjb5%3C zV>L=eGj7TfGdz7K55q>7J%Ol)E5UmJMeUV@EXpH?>*JWflyRg<-E)Y@$8+NGmalXn znvOhOwTkZYQx;xuljJc(to-QIMX68IJ_`BO%h!M0C+$}+-1ozkX&;4DoO9WL@oB&M zY{LcrO8Y3J;)U<_{6^%jV9wxGT2Wh>tSM=3YO1RhAMm4ko`uryr0DYfLdr1_Sg3wA zy<%aqW^Pgs+u68Y_#*gy#K-Cyp&t1w^#e8d*^>UG2^TLKOQ9N?eZS$@-6;FY~^A-acW%nJW%R0gNgRl z@N@H_c4DOen2Y@M&-4N~_&LDBhu_4InT`KB0x4Bb5}XkV@eD^H_Q&k!7Z>BJ8@i9t7F$`dve_UBRf>xeG)He289WTXR?09fbr;*> zw~lgk+cH@%=Ab36L3Q6sCl(3S8noOJ|7<=o-Ewo=MN5Q_wjg_d97TyjV+-2T>Q)o_ zo46abX_1l^OS+8FMp67Dw?3oj;&ES4x=O|m@U)UKipJxO@^FjrfeGTh^;68MwS1Uf z=h#Ks#w4cu=NVW#Xk&i5YR6EiF(s@CfMa0IWMj^%oz&1!*Fc2C>s0(b8ik~s4-geY zN;HctL(+7UYw-w8{4=ydR}>K))^&{cFrM=#w&QZ=mF5KG7_|UT>uZ5d*3b1ym_(9v z8If}6lIb{_+av&&uV3IlTB;;Wmu_Rc$MBqA-i||^R~VGWw}lce%&wHCOf*(SDF-Wg zsE$%e2DTiJFWqDj0xR1pzZ9>Z<1beh=8WYm$W0Nz-oio*a*bT$*Q)Q6>AmZ zYf~V^Kit)zWFV*R--q%ANKI+SVf-r%QlD!RDNERBcEu7T>ads@1wcT)p22@ytddt3 zLjgR1=ltVZ;tP`H1~qLDrO&NdwJ>I@YojrWDQ-k-5)1qtg3=X*{Glex$8#c(5{L?r zFQWPqicpCE1AB!YAifTTLgfGa@{}H9yjpxm>zhsTJ=YD17h2w?6f=t>&(Lxr#Pj(isv`vomhwGd3nj zC0~9&kXc;?ujZSM-&4|)`dlWPfB|I$KKrwY?O7ULPIgNzDGOC4mal;8s1Z6A%83_{v!A%G3QDZbTm zJDMZONRfd(jU^EOw2seex#-RJ&vPw-cp9(1zGj6yg>9D;HvvXQ2ocN2Eu8TWPy66p z{^wtgbm2TQ<>)ZV6W6*LBHml;3Ii39ar}*VX`6~vT(G~PWPDNRgYc!F{PPMI!dOC1 zS$`TraU(CaD+$=6mjSVZe!KjYWtX`i#?qLj4N2^&iVS|n0pfYL07%;Rq~kpn(D#}X_qKEayzHG6+t5ls6k_~DDb|U2&L7KI zg9GryBPZSQKZ^*9@lt#c+6t#l`lPyx_dIzLOqP>wx0lw`HHJs^h@HVfXv%Pp29e9X z0`cBXY0(ycB3@77@4+Y}#mX|U56}5UE%EQ%4dygUM`BievW=zSz?6dn5pr?h@N`EY zo8l+pMYDe(3VE;%C@7AG?1-hgo%DjrX00RzzBLKL3(fueWUVAoD$B?0^;s*)nK6^c zntWTv!Kv9!FeO)*sY=LHm+Bjm`=9AV?jFd6NBiG_`?O(G&*FXJyAW#r4x zri{^tzT%7iJuqt}xpU*x+>EzfpS6e$&V7l?ec5!+JV1xh>}OMW*I{~zC$!|5YbsH$&E#ujfE0F*dfY7k+F8gRaLy65txu#?1=0Ch~vqEwmmz%2jv)cI#2~>I`=_}O=mau(wEP2p=w3~Q+s0aU;G+!*gS zc+S6SkH|#4GNpp`Fq`DH#_4#g!20Y{^db2*;+~O=Kp*@5U!Y43MlN5n!*F_cjrxnV zB5u{UP)48}dH^5hB2aN&3R&uj&roP_kjE>YAEUD($vIdYYMd4lzIs7<~SCS!4*yG!%PLV*`-SEPgf9vd=B+yqW{*kzeI3Eh=l#{NfT>LfST_n%a4Vu5~@rNkNAuP?`phH+yHtC2KpemORx+moc zmbn6g>4Sh;A($Nrg0^Yc+pD5m2)=MzM zsal4boKd9c`v6x>$c%B-Gm^{9th@vD2cZz%uk|)4$KPA^q5S4QfAx14WlltcvK-xZ z95I5}9Y?cj6}rAeTzBF(+(IIvC-*Uc#t&2T0a`k|;9VC`!e#)K8;2H9&W12R<^3r9 zPP`~~xm7`OUIs`NTTE6sD<}PDHw{l(QJJ%aXih$0tPZ7!KU)H!6sijq-!0OHhOSP8 zD2+9pWMsE!5s=H*cKk<4N+KLKajf1OjxR}TObnQcy!GSJ_CezKlD3pYC&1LhY+T_Z z_dv)Q{^0-N2b97Ha_MZ&lqGAD5jQ-vlQXhKgU41paflMhTZ+f((-iR&n*>4+e4Lq7 zRUPgJ6j&6boVi9WxpGjdZYu|+sz!VKnRw}0LOv`j$r&#YSBDhHojFTniy95FU?4BZ zhcTr&<3-yi)eBN_dEq;*uE!Jk@KNq?n2qF-(VU2n1KR`TauK48+6W+yZ^5c26&_YfkrQhtoBowu2vOT2S+Yy!gVY zx#LIMYOo#r@aaK~1$nVEhgh_&2-|^0s3s&Io|%@rQI$!7v}067Xb|$^tJ8CV336Lk z)Kr#NCu^$0xBBCIrQ9aXOy7YguG7hn1vAF#oJR52>4BU^+B%t4D@CNpe;uvWX_%W8 zGMCG))gD~RJ8kl(;-$4AIWlx+F0>)Ccw?!M0h3tT&}mVlA+p}kB|(0C1U&A?Gm>S+ zcS!`!=v$tYSJyNp8>ELJnknRiVM=DVh1;mXMstN6`O&Q0a0Q{)nNW$z71Lq>4|3${ zRJ-sX`mD^C*|{Ulv}kY|hNo^Q1dRI!1$a&%7TQbULF8ZaUlT^) ze~%(IA~tui8xe=+$!C7KV&zzG6TZ6`O|VhE$Au|g;vX%avf;fYG4uc#bf)J_NIqzP z!fHl{f?vS$m}A^7*JNtSelmj9yXct5pJwXsp zJo*X)V+Uu=3m+^S;KCSd)@T@uYidYE@zUHT8Mj(6JIL+I^Iv|<1v4JEt81&KC0A$& zP4041v3i}MWCv%>fxTzl=z>^~iZN@LZE;2gyoLry&2G~0z$*=q9c1^+){6UFAmgzc zK+a57z(;Fc!&(B7jt^QeJ4nlK|NZ@r(Gtm8DwYLkNjjeUmCmB&UB7;^wcWJD!Ft*y z%*JBCyc17cG?9+o*Bdb7FPePP{LyQUKh6a+)`AFNiUoX{oyViB2^13Z0SjsTlvF-Q z3-eMwNV#M-OE0Wq$0te8-C)QX-#_33_LT8G zJ9HPSAnV-93UR?6QSn3~5N-;SqInw)pz$|_eSqG&al#!g|6{qpK-F0dRmp}DD?PPf zA}Q~%P8(b)338u+)O?9Qs4Gqa!E0{ExB;@Q(hL{}$v+>%AzLf8=z!U<$ zWQ8vUmj;uR?6tYGz?|}nUUluJrjVU!V2bg{KO`mL1J&(H}+Eu`b7B5fW$h(uJsAaFB@aTPQoY;CTJAx4XDd##(TIh@@qenLA~8qN9XV9KF?e zB4WkR-LBdoj<2GP&WUWjX7)D@bMcI|8&Vv0d6kwE#51+cz}Z1LG5B{6ZFJ#`B`4(7 z)#mxuDswYI0%RpL@GekNWw<1hUuB;cbK!VZeF$2Q*JyID7uIFk@g zS}p;^U(IMz@V}lhRO}$5yL|LxU+{V?MyFdVdI3lh?)$6(v4ac1Yv+vgX@yt|KxG6( z&2AF%J_~6FXLsEf);;VF$yl>{PVz!TBc_>E+C4#P&U?;Kw1e)6!+!l)y$feS%9%QH zs@R1pWvM%LsAT8WojGGVKNc?yBnkORrvZ83#Cz7X8_4-Mc<#5PwLB*kZ`@%h*+GtX zJNC}oTp(j{TnMu?$dCRkW-)UEI1GPXVP~mSv%n5+0|yIF_15A8_{)7T3!h_ zhvPXhIF)@U{IjS)^NdK&dm$GA9K0Rp!emMFBB;&i4fa^1aGM0|^7UiCNZ$I@tO77+SexF zlP^8K2zx`9aXA=Y(pHb2BeBMpY)k_$68G@vBB@@IH_rP$p7Y1I<0knF&FnbVKRZg7 zBrBJeG}K+xn4D2p)keNbhR+yY$PK#q!)aElMQt_i>bdDCEg@;6cTcpJ>N@fC~*@)IHuhU?F$c0R9xP9)&{sf1}$t zeJOnWYrF!tWEj|y=mw5BJt5l&0OU9_gGxrp*+C`G0NS%Ij3sfK1rGA{6a2?nLQX8% zCnvL{uC@tL{f$UWUa_#I(`JdkRfUb`X_-at4C$T|nI*1E?kt%l8Z*%A@kLI24Co)g zH~Gi4bmsUH9demGw+WBSqVb3~zS5cvU_@R#yKhb~YHnz(Yk+S85l^*?Bl4gLYb72= zY0Vmp^avw=uIQ1A5hjCbqB#>wE6T!OGzN zZm3%k4SuYpzG}_DujLgfKcHtW5w0c^r2A@aqbTA5e@l)W#eXaZ> z+i|JE`9>Qi{8mca$3+IF94#^kZ(Q#c9Y?Nd!lw9%cxn5cT)2M!aXGNxC)HA6fDuq1 z(QJrizq?IpL_``=T2`cgRj*uFR>G)~TZ7Sv#ImfM77ZR-@x-MuxiPHwxEvh8Ww?## zIU0+Clrx|*`E*QsfLgvZ4&=iJImDr%(~f;g9MGOdL8McqSC>4vx6e3zNmqQY?h-Sn z3;c7MeNL}v3x!xdU)@{)19G7LfLviPGr7Etv$wG^U~>ioJ&s8Ki4$`*7iKq9*R|o| zDM*>QKq?XruK)X|vY8j6ZG(?qHL;yf(N5>Dn#!x&oD z@zR=t_-`-Hg{I(bHG0VuEt+C!3b#p(h^Osya^M>!xv*x{9+nWYw5X!7iDk{EH)}A` zUIp^y{L)g1`o{{a%F5;jyR)Yr80RG<8sE=tikAIJS9-bmF|5GEn#|j3nuhf=0=vbC)s;I6}AGG0Yh#OMqZ`a`T8lDEDkV9_*r-$&Ie_~7gY)F?H z%{bbx84XU;t815vS=0trbiEmwHUV#3nKn_pw=ylHWmXU`E#b(g+skty;m|vd*d?pl zmI<*WoZF;E#CYY&orcLd!vtqrr&qUSzr@ExH5tH!{5Ww+E-`8QuF-a3;)`|Eql^6L zJ~bzpAP_XOkdB9m)1={v_MMO)TY*XE?^tC@D-g?fl9o_F^MO3rcxo>AAUn*YUt;mW zZPM^zGoI)LA`fOx%Y_$cYU3niZ0{^DkZR4qza3AE`Xm?nO&^zoG+wI_%4-VVq+-;s#=xcBK#H$fl?%HeV=lV{#-LHUa)ZKddrKv3 zm2P?(J1sFu_p;TwkeG<7TTxpXJ#J#j9N8G?EnnKFNy_)QJQqGqoVdueW-drM^v~qS zH0>!2U~%G!dlaPpj-22it|_cRlyx){3Q{p}Fzo?q`O2(eHv1n~B)-^ifw6diENikopHR~!riEI&fwMk0~@3n0D~&-sH|u#p%7 z@qq$js>WPhU^65&AZ5V6_r3r5Y7l&{q@qzBE2O07*d(bR`ijxD2z=iy!22$Uz3!`L z=;Kg+@|z11 zKF-DLe(?YNhlM%|L=b##N=QQl&~HKEyd?uZvsi@B+uY9r-$44;@7~d=YSOU~NnT`z zm!|;zKos&|^G3r5oT=aaeCT)I_a~{7B%v70L3lGj*C>zyt2XUfD17DTRTH965V;QJ zIcGhN$br)~8x(fUI3ms1DYdK0#6ewPt`c`7Yu9N9>7#K0j#SrH)JSZe1XE~8v*Er^ z8f!r4bC7+IU)XvS9@P*ZP4}dBq~IN9c#2{&nMjMIa!OQRpjVHv>HH$nxn}G*~5_xd!(*}n< zLMW}MJtxXu5`3Ug(t4Wo|AU2p*XZdCy1Dwd%kPR9M{|-DRkLbqsM=mZIU0r3f2wty z_aL70Cos$3)U&_CSuEu9@OT{wB3@}1iGt;H;PvhEo(uJ#CJ@$%ZG zw?^>=25d2o;#M{#tH1}Ysr#XjFXhmYDg z$-m!o2KYT$R~je>~=(Mp0GxN3*t!XBaM2K=Lb zPBaR3KSZ;EESUSe!C{XWN%JaxlZ?heI({*O89u?om}J4>FBlYXST1)`HrtuJ>5((0 zMW8Uhwz{mk0pbWQrivQCujMM)@c%3xdxTtltk?6ujKZV73Y#n@!DSgRp}UWqIOav; zoQ;+B>JikZzlv0N6K!0N=lmYL{UC&+Iq}erbUm~mwjOnMIP#?xl}nOUawO7Z;SLHF zJ`w+cH(o0hT%D=`Cp!Fw>;Jy^rE)XxVt3U+|6HxpailAJ#+KCJtQ8LLRaDnD5vy$| zgHQ%`gy-lsH zN-h^GT!wFB0SuH`d}=OP(H^sS zzX4Of5iz!KhqDlSGDMSEh{+nQiO7~)x*68&5t`_L*3tinKt{>0*+}ss6Q&mf7y1;* zoOgkT+F;8*x6bRT0TN-$KI6r5I{(a0-(nk)g50Fk-$?)>w4A?;2))8sga$mUZYr)b{_B^qfY$^fc4^U__ldlc?jrX3%bN&U) zFR@#A+hll~hAs0`2<8e$dsY+GUj=x5jFLbhhcD3pJtgZ!PiKjbj+p2z$;yM@Q+86F>%hHKrT>=;|O z2pIeZQ-W8m_46wXX?tbgzE-mAp# z(w3Z>sacNJdNW$nG>ry7&R|t1L0JVD{tbmON91VFKI6sM&A%kK@+eEJYYo;z)5fjH z>zBP?g1u{N09VRj>Q{34@4)$|c+PL)g}1qzpIPF($l#nGhI9By%Jf04@ugw>7Zln| z)K>#oX)R68K3=wWXlb4p zZ&Y#pSs{%GS*HrH)>53jy?4^yA;pP;46TTPvx&vfYX|c9*7Ch$?SL%(6-ekDV@(W3 z|9|q{1-^>vTpJ${5ET&>5s}g@J0c>b)Izu;Aqf!WqCnAFj~K`fL_>B=f`Z4|2_W78 zJw4jX*Q;&4)=R6lwrUj=6cn{pYpt!Vf9q*I_V#_PJ;&DD|9RG$wPwxCp1t=<_JjoI z_gl%#o|!f8vz~Q**ZZzzz5}NJf{dsQK2y5OidLgk~t^m_#6UGn%AuyOu0U6*V-lLuRq#uggu3xToF`r3>IK>0in zDF(^jPZxG)1{-0BT2wy?YY^d4V0#sT`Z%)py+z$uA14KlS^gqg!xEh^6H`4v@^+uw z`5qwCi1Bdz5BEHHlnr$cb}?1ee~a4(b5~-4;z9BUUKCl=#%hu!ZqInHC~8^z5Wa8l z$Ch*`0%iYdJMu8j)6L21T#LlLLbouXwcqE!2sXEiX_#!_<+H%lyB91s@SpsAeFNsE ziSz3A`Q1QEb*aWVE~urdX#!QSAM#Z!MUotS5oljUU}+}Hmu>96rCBIt8j38<>S5sG z+z)q3A-l^qO%UEp>1Et0B{@B0p7!QE-QI-OYK~n=ES!10^}$rmC1+<{-ZOIULaYxi z*RjLu0F{lkt;IF1juU+mjH($;vRbvd`_5`LIm7bV9 z_PMHO=!vCGiOtNH@dhxf{7YWn0OszRf2Gt#&vW>X1EbQQ2~Mx>85%S!Gm~k-4z@*= zR%T)OIM6D6IN98LP0!GWFTqAQt(l6JmfH2j)x(Zsz5>*$j(QRN-nXS^)KOesq*#j* z@hoswB5FNMdgg!=92YB&^xm>%^MJCcu)V`dBvqLf?08p~s&C1zNiF4OL)j*= zsk|!kOr~FL)kQwHLU~As*W4)5Ah1ar1bX9qE$MQc$#$r?LZBZ<^03I$bc0E>XWInl zS)8Yvk~Lz;(=4yk&GJ||WC(zi#1vnL>zBnVK=v*IjpxYbu4}<6(QfV*#&hfRU@0EC zu&XYPV@G2bF99bTZJINXtfeNLeBYlH9@m8hvg3W)&P+5Dld|0)Z0UjNo-!%a{(qZfi{wI;(42+p=q_Dnul=;jGof*|~QgYb_69+~IOAx}MaezUagTDY;v*YfUH=_}=Z}@opPp%H#dIg~L=o={3-@QkpZUO<*N|zcZCSZ` zJ!C}=k>ZGRaqWN3|4kP`{KTws00NWXSwJ3z^VD#+pCGz7%MWX3{5ThZH7L`CX~jvM zRJl9aOdC@Fn`Mv8?~Rv4hSkEQuvKMC8(yjQqT#nbgJ=XNzf1dtFa=I{<28gW3nvEh z{PG2vw$<6X*6E0Z6UCI{iwIsR97kEk=Pre7IDXU`lZG4sW2vKgwt6s6Q-;^>?>|P&o(FV`+O%%J7YZSYYxbTXuXlzG| zYroiqOWaL(nwsYlcy{Fh!I#MOZ}XxyL6RM+wO^ zJoxES3Hd+o&-zM-h2++9V#zEip&=ww@$Qldx$%uxIwz!9enty<3(nX)F%_3Rqf-)2 zaGjz1wuc^i%S=gTI!!lQ1(WXa;@YQMq@vtIk`IbQiOF<)uVi9g_Q93POI#EjD=|en zhQw6mn<@FtXLV|JvV7lj__jc^YE`~Hw`7%&y67+!&u}KHDyWm?d;KNuqYAzj9wE}cTD&6iqImyh}TmH#Cc@ziE7(0I7eAxjcgmH8~^1P z3Ub?G{X=dAiAWUU)`?P%3o}usi)%koBJuKZaqPxlPP#Kueg#x_<2*f%<`tHxnpJ00 zxdLkt3KjUsIgAo;nD;as*$%q8J1RMkz%dDa268hel9}5MnCRR?9202FWr^b=jpL+n zPtR+P>8hM&V;h~*WbNVSw5hmhu2vt8mUqRW7$Q5z^h<~# zU|Q6)IMbMc??kB>GUHTWgy|!zN3!!fp!puo)8pxGZ&`X;G((=-i_Z{t`lG?f>9uXE z?51i=SPb4#`eX&I1Y9!;s^#Hz$4hDvc8eBXe*33G$O~!>; zP0tk9e!Uirn9qyjar|Z1pX{{vpQyI!vhNx+XbheYjX+PV^ zZ0Kh@GfGG-k1G5l7P5250Nt4_xXPKSc-n#YX^hCU*o!#szrn<1^xzg}+odF#!e~suMvfobuQOC~e&HcsGSW z@V~|TR4k^;JCM!S=>+g5eB~FG3!SO-YF%5P$7q$uBk@9Tc_>Isj(Y|s0BLrnKHHKJ zgNc$tio~lB2^(29dt_+sVH2J2;ygX7-M-mdty%Is_dJ$_?Pu&{ofw*wxkfH6)aL2< zAgDYZ!#_eGBUQ7Kf)H!8YeHZOQUo>rAL14T$FuX5aGtVK(jC$7bXjG8q4pgQE9>_#Gx2q>d%;)1Oxb5;j(SVfDxs_ zAq>Ttm6-bd<|P0GqkrKSRbQL0lClC~MyY|QZX((EC4iK?=WBkox~Z)t_X0MeU|98h zBk@Kck(WDa5{9(2c14UuTjwB&cr_$dZphHuQxnK;HBGBwFx}QV2jY*WnNdc7 zke8XKB?6=Y1*cHsZVAMXG6IBb95_D_AQD8Z(}#UqqSD1%>P}+eqOqJSAsf#D$lW-{ zoR9rnNo3B)YfGd}NWoUoYN8|%r^JE3yAU{iMLxc`K&vtAr>`Pvi~yAUqbm-gbmPb_ zz1cX1=dL7o;$I`+rv^A#>%wPM!!e6gIr-7>e>DcmRB?c3~Uwq+w8_g(Y;m!TgC1~tn4E3 zJ7w*dh{bt&Q5m$DPZ#7yFt&j=Js_0@vf}8I<;GGk;^3nc76K66Qi4Apl}Tcy~Cu+Ql#SI zjom9twcT*?r(-bW+@O(sOxmO|bc?;v2D~uxkNGgPA}=WpnEvnh@+Z1jY#!gTK(T)J z&4#rx@O>TJmEE?Wso&KDSw8=ob0t!GV|c&Bp`t5j$(_ zcQXB}uF&!)S~nG&k2YWPTHI!W;##Hfjqy#$wOo_c$PgH9hx z9%`WcK`syF^&DO8Rgr54lw=*AnM4m@Ju#;xCN$~An3#9@JyC(-#St4N>Gf$ z^FDL~)n*~NXEDS5cP?kGyrRMFy9mc2kn5Yb^*FwTzj97hLmu4XC1Cyw0?kFq_4U{G zh?3n2C+FV-DeG#oym|XXwWCua9aE+zzahr|sMT4C=V^;0yF2MDN|SC__Qcvvgjx0< z2hukXsQIBZO*&m7DC1+X*`{GWel!ReGtef z6|iMEPYso>+_JkUyikSvCN;23p&Jo|Cf9W09tlk@Z&dG^=$!L-P?NhL+tkpOZSj1$ zXCoR8M)Qp4~dG8}asF1g6Jmq=)BeisE8vRT1zs{q?JrJH4TW zm?!dTGS=}!+z~FmCl`AWo~C8u+Mlvt)FcNVe9CbqARLH5cqHs&I4{<-TL8j4A{U(2 z%h%_pkqfBX--?^JJTcK3hI^kv#QXrSsU1k2-F_F-QM-?KE6;8h4oP8uYVA%9={w-- zjdyem+97*Ber1<{DfM@xj7Z9#pnf&j zIUe^))bzq7YK?NwUX0h-j;SwtQzUvr&X9YyE>dClY@Pr0nqCy>DTEFTabJW$DFi0L zjeC-@Qjd7e zAaHm^UVaHQKfrl`bNf>Bu4dgGCu3!l*@r1mD(5ff6s7Jw}k zhbdj;jYm#up56bv@yO1xPI*u9#v=t3mz{x-Avp)9>?iP%KjV@6SS#!oo_PfPNUvlN zg?#AZ>+SKb(F#c?FTWLDgRVr7BJpZS%JYZ}9d=-OPxj0sBhMuUAy#oL299N}(J+j{g{h_C*u`uZv?CjT z7Kd_UBLiRVUtW6CQT@p-@x~(y=N*(34B6$0FBw)Aup(hXohVf%$VB?!q{>8>c;k_U zzX8JckzT(-cjUZ!h3^O%x{ z%}yZenQn9?%6ev$I_s%2L|$G>28i!QS27@elo23gW{1o2!0fIO8ENwAzy5@OP#3|E5Z-p0&`fdedOvIvt zGJYD!JcX5oMaMmmX$S(-<&b&h&R21s?%$r5qg$#-v@Z)I?u$5n5vi)d-NMgs*o z1Z8(RkUZO^Lc}xuhK0Pbn`};RyjO6`&fpd(Zj+<@66GP_@! z`jgFLHsN_T&DixkY71KB%>VHxAz7xUg=MLpK$Tam1Y@KxyUN``Ok-UV!L2N1|x545LYTib29N+ZC zx98zM?Vnb&MYLpKbj<@tEp8@R{0Vd(c$+GhL=yiFf3^*zsK+_M3> z?z)i8_{P5HOzMRNa)Mjx>39(lNBtbHQk-`Yyey=R&~tlT7%|+4mj@#d{nxH2FOk#5 zSx0XSZ0}{|bWzdV+_)Yh$>ZDjM;!vu&AL(x*vb8gzR|ktDbp(?mY z>?U^mWah8HLA_Sb-$jRv{N$Qs&;)Gksn|Qnb-ECU3AFK6Tsz}KiF?45HWx7JuCFC zH}SPWnQPPrqi|t1!mKJxqdy%Ve-;Nvmz<^{GdFFwuxuw}zQBGRHwZSDdg*pM>QLB= zcUYjaKoqjDk7uf+cKb~F1&=1v=ZWlm6OYNN&l8DPW zlYujKCtz68wRZbtVd$QuV04+?KAHFxU?fu}y2NguEZqL2ZjF1o-9Fj4_$fV<>e+Vt zMRihPiv5{fw-Dm{DpVs%uC#PI4xd-b>Z| zYKd(1nc$R_<9~5Pz7c`PSKdz=Uf0^~GX_`SM)oBtLuQnk8&!tL%XPgI z0pc6kmkfv>WdsP>`1ApZ0O?x0eX>#3XVU&)w@*I)8&K{5Ti6)bek!Xw*zJ>x@AaM3 zQ|Tyxh0g>ztp6mndrud-0R(pJxp}6$CAwozRc%}Cl1v-KR5Oai`a6j0%_w50 z_kp+zw~r1j#5=}4*p+L>>s8^8MHUsS9ULL=@M5Stm>13#w~tzlZJ7LlOS1*`iWxur z-LqrN>9KD?rZLl&k>d!*5f+AAtBuKj-$5EvC$}>wJ*MinUs+H9leD~0B$1#i57vOX z9ZBz3jXypX5Zre&Eo~8!NYJMb(U`g&Ngv$h99jTVkR%fHu>l%TwXu$u2$ZDhCqOe8ffTJcY?AU!+gFQ;2OPUDJ!-;b zF({<)%0iA*+yvphE<{H>x`_RTS(8fX(M5?ECHr9RKv%TVY>UUJEdX8JWOw~WE);HK z#iS33cNb~+-0VpoO7AYR+*&!w`2|XO`ZBI9)S3R~P~G2TM^bb%2bo!0^f}SZjAm`4 zzuD}1mb<%0I~DUspSRSvLC|NN+Q@}mXRCS~-zD+xBG>;`-6KkNC%n7fLT+YDOqS1> zQ>xrul9o76?uJdX%|bl6^$i4?`IFr#b0_Wh{$1oXJ#W&7z`u)Zz5}E?!EXAj z_I=g+THy|Lg{|c7`j0o~o;Jz(2O^@{jFIyCK1MvbeKWOsre~K6 zE#>Z`C53YAvOK%ud~CW53Qu%gE>(d?Hu{b9F?jx1`TXgbmez*WwoFr7@$Xb-8yn@8 z&XIQlPG%5ysUAz=g4h1{br4Jblu@FJJ%S6}h`t41*0=^PjGulnZW z-*{VWb0hZT&`~0SDF}lQD8YP)>kU{^Dx#oYmGR~?c!^a%F%APp&qO@;j++>3xOmoq zqPo{eu_+&g)N#WUd6?TDPpDsM%A3DmmuD@JlU1F;rBEI#d+#bSVsk%%-eI_IsA_pbT|i(qQ8t4%dS^#AXfpZsZLmm|d`Ue$XWO~wVY73KLfWcPA| z&Q_W+hkG0OF+7TQ=zB=K$1a-W+=}ybD#o*Yh?f~yCxmUb$B1me4M%l%T`P}`Uj0y4 z_3E|qnC*n;%s$p-&)!=LXW^ww?vEL=J5+_!Dhty741s!Mq8{LCJxaIJcD>l=mXF54 z!M^D*qwxR%OXMIm1jj5#^KE87{`Qg&xRVP2m882GQ2y6GGbvtioAz01 z4O6M*?W|g=gz}>E;IhJG5_}$zMH>Bbq~8*ZLmKhMVVfp7Tl!6ASD2{~6G`%h$LE26 ziIapc%`Rzc$<(s0lE=64ZwLZYbK?~{MLX$2fA;jP<));}jXFg~;=&}Jxx$omai$g9 zTl$Gf)AA7rOvrIpY7y=2v;&Fx&=dE}HAQ6lX%QvKeqv6>%^V`mY00h$@O~$rN+B>M zf8~pcNzKmie%?P?7Mh|?a1Bu<&%UVBaWh8L5cO)}g=sqCDqWY^OuW2^Po)ru^({p4 zL!76lx7*{rOmt$A{<}XOZh#_72;@{@h#Jr;VIuKDc6sc^KQ2wcM0x0HZJK6p&(%$q zCLl9cUo&YxS(<>1oV6txG=XIV;`15X1YK9K7B;IhWmnC=0-QZI$UmF>HBOF^=;a~q5ziDrDeeV3@)Y$-@izIv_JJHd*>vQ=_* zEj>P5OT#Q)`kd*xzxd+ACQBC|*|hrY*G$|ri%&FS-WSK?_&XGV>@;oHw$LSAntFpD{~EKvd`^9lU+%_>!{-c26;S(f9&e;tFv}U-SGagr6AMrh)0t_v~QLs zAU|&aQ4)Qg$PxnaInJuj6N%T$cmC1@f}_VKsZEURM^@cvX#%qIHn4bu^bRdea39|P z@lI{iZ$D&@*!25zCCe*XIWZj1t<{KLMy3g!g)=HEnE?L;051`=zT4MJS7lnTz9keD3bcsv0}ktGC51St})LgYM# zGd6)_XvGtg5^}??X{yi0Ln(7D+C1T8&-fs;JQM^na{TV3Aau#n1Z3b(fIu}sdQ1np zijBI1HA;4{youkgU7CO_+`A_!7+tnB0hzey$)qw=mn=;{7OJ1pt+BnzE7BV443(*E zTHCDl2#YV=R%)@z#z3s9ggZ~;jOtLbal~Fdl(JWcMut)zoT^NH?b^n+d9_V-jhU8s zG*%kZV5Az%4xF)JB`?nd40XNfvUbekTaKpcbzx5j3VT&UYjbVe%GL2Os6o{Os4`rb z`Uk03_eU8jIzA+^Bk*yi^^K2oQgP zfsz67ql^F{8;ABu1W4DeSwJ>k0+71_F+Hw*vUSrRnHci=F$*$ntFwhy^|6|N2*jy5 z*@ZLCagmR&^_|?a*DN3xb+8mE`M7Ig=HkL#WGkx%BSy`|Xq@#yAP+QnDZ{y8iv^oM zX^X`P+anMN^;raAIrGnfzU9ovVOYQ$%MYCFoG{0?obfGar{Z;5qVO{Z;VI8}W{l(J zGM+K_6kO)Lsp7A|HS8zln^E&wZ9gNI6Og+UNShqIsI4c}7LN3w-3b^R(2-c5QAovifx)W?Y>ZJ}_mY80aP5G}rSt;scAmdX zqR$?RW&oJeP3sBLIE!Sh~; zxE2Io0kU@yjzb`u>jzH$PCGi60$5&SLh*DkxFJLC~nX^lk(@WB^NZbpU?4D9NdB67pCa)(}P5uyg0h7&M z)sy!-FJQ9w0dW16?a;RNu2}-8OpUoVkL>SaaI2SCp|_gny4I#^<1t~Qv}Kj^(Wj8Q zm7;nej$^(8q-tnRMmeG`!*98U=BMCy_Q04z^>|JU&EM$d56#CzdfxaO!fo^Xp?UR1 zaMEq%F!*o;e&VYL-mrWm$AD3vmW+4@vf>R6=2g6<9g&TMUW}^Gh9BA+ zKC5aC&Z-I-9o|7NRJa@SiXpOd-G*fHUe|jik)5+QPTmi^lE}%)nXoEDhvI94GS}!qjKYQ4gJ4x*I$7!X__H{k!(VzLk(nnipDb3X z+CMyz$jMhXCxd9;cp{OXmMfC!^F%y`;&YtUfHxAa%y#&@7lE^xJm>RvhXY*d>;iqeKHpyxAb=DUY=;ZwSr%k&N^QFb$xF zC^&O$s&^B_7c4DB0~D0 zDO{>o8XV+Uw4EQi49|Hc6H@(SF4`{N%(-a0`bGr>jbF4~TTKL=j%37mRl6N2D+=)WeqHXQ0AZ=t=SmC& zedE)5f)B&Ff%p~7c9Z=}kIi1E7Lbjg0UX1tih3s&NzzgGjCOv>P01ja_BJd#UE)=> zwB_YXV>r>yFA!asKah}H0HFis53eH{_T8BR*F3v_`@S%VF2^n$UE=$~#N@|Vd#N21 zJa<5P0D3m4UE~KtVcL65`B3`7kc73pr+ldVV951_2lP0;OXB-Nu9x@eqEge&3&+vUAyVLqj+3$T{$m{V3PWce{zL3rLfOIE%BKy-0cx3OL{!>1rzAt2y zgS)s&*i_u59vxDau?J64{qcgMLuDFHoWH<(o?nUmTv@<0{M;{nWtwSk zZDkt1s0k|G92VC%A=!o^5ZBb<1dRWx9juXqoRl7YofXvuX*LgUdJCOFK49wzQ8Om)a7Z#-dJ3iiaqHC;;ScF z8Adjs;bN53?-1Ij57TnS&u{B*gjU80$hmdL$!kqHsVUWRvOY59EEm^NIYYb8&|`84 z0#ox#kknIpj1`rBU?;8M`qUmF58&0o2n2cVtSM@i6`Sr_+9gD0S;YsIb173UBudd3 zKeKCK1&foh|Ekv^{tfQ9s>Tni1eRbdK61CZL=G*EAsPTg~EtYfpAn#A`kVI zrO!$DW_|=#ImwGnOFs)|?8)7V^uHO>chp3b$k$g*DgDZv5mU}^k>YmDvO2IbgO0?j zlSIw^Gdbp0Cjcp8%2^^vk$5#EWg<$34x2NjC!2_pk>?VFkbe@h%r)xlLcMBjuc=v3 zbC_h{%X6ocehyQAvZggYOIcNTMvM^{WZ}GdNx?uvg!LIp2}8!HVW=`eCek%Ym5DAf z5hV+M1BCAb+SbC0GC{zC_2!0of_gJp`X*tr0-7cVu%|e;_*Dp)} z2u2q*O>LQ$`r4I|0gK;1w8~0mlsYS^t|8f2wJ3qEq50LWH47y#bKHa>*_eegeJK#f z|5CHzkB_Ijq$Dst*8GcaXvUOjHDf!hJ%Oxe+H;nu7Bi!a0AZ56lnfBxp0i{?{3s(p z$i|Hu5@DokO+?8?<3?yF0kMa#Nl!jLu}N!UdZvjexp*5O?j#?j+zZSw=!`EQR>LbJ zMqNHm!dV{#@<28I2{=!UaQjm|>-64$HJ$ac^i}wUJsYB3g-6Adz+bQ^ikcFbged{u z_$R`~-cxBMDiwVGy7bfVJ{6(-)VC14SplgHHjPBZivb(aGrd>U7ra?Otw@fW7zo;k zig*!|HW5`51(as|X04JcG*NJmCk?T_hS$DIQ2pC;FY*oxG8gxAI+c}XY5Myf{^A*) z=00RcSAQsiAaFL530{AthJe}3 zf%uiPMn@oAfouq~&p{&5yUYgkpZ6^IK`ewhjoI2Z2&Fh+`k#1}2GA`yxaHho@5BON ze`i&u1rW9)P=(9%|8E~cC)d;O@XF+YMd&~F`gdYV0kYA8%$h9ZRunM#@3^{qQPA(R z?{AHzfbz>?@F-x=I-SYibd839_H*ACgXT-V@`qRmm>O(oS_R1!0unHOOZP(XL0&ka$PL|}781#*Gy_rhxS@N$xKJvvFG;nWeUAVTf5lDW9 zz}3yj#j{&A8tB40lcP$H=H_2qIVKj3Xxcq`_5uuRDN^&5Z5mJ~TZ+;H`dhDl&&2}r zrY|1>4)&Qy%-PrK!jikI(Z#La?uV|Q8zcX++QzjkDO^gG;**B|g!pNkr-rzq--a$x zZw#!l_l&tUwbw^`5)X3OV`6UDt~tblI5{$9XS-OGj2~ggH0Mr0=eqa=ts!=MUfM!R zZ0$X}vMSs^7qiyUepn@Y(7!=o<;@Sy-7&@4h4b{;?fa_ou5*XF64pr5#;Bro&Vr>m zkO}ox2pQT|`7n^YjKFfoq&)7?DWbJaFXN`EIXFu`ub!vTrGn_#Cl0d~gU#zczY0_| zf*@zT9-AVJBGTu?xP&E-tX?DYHkH-cF`MP?yv2f(PXpI$2()}6Yrg|NP9LVv?d-Ns z9q!ky*7(YT%vG*!!BpMK^wPJ_=-tJM#98 zUEP;Eio3L7O$1#`$y1LT2+3RfH2-P<5ROPf1`ut4_lFuLiqlyX)YF}@d{9>a!4MlcX!`%XpvL-sDX_9eRNOvMRsPk zrLIWs_$ZLQguqT5`TAcV;{YzbG)CQ(eCv0v&YgkI*lcV;Rva+#Brv>+z*e1X{o={) z+Nv+a0?HSm$mQPgKHMGCPXpKM2<(rMvj?A=;yjJ>^!Z$*wln>)l8l4SQNz^TBg`6R zX=Yud_RQJ(!B`!S0?%I%ICv$0x9!#bSKVRoTCXt%dTFP(WL7q`#;u7R=F@TX^Fa9) z0^13)`L(Cv2!ZqTCET2RpEKI1(T*}1UAT4)hIcEMtgLM;uH|tLU%57$A z+A?b#=M}uo+KXxO`Db-|lUoVZ*%5NiQSl{uRQxeXc~C^`4yhzAroHi>2B<$Huvjx` zu5qR+_ff2g)0vDOHy~m1@hcqv_uoPb-y_^3T;cd1T?XJ%odNW!_X;M7Szgu9+T2*X zzUT~LJP*LXLf||bMXK*L)!B{n^m$xZE(zcT!JewEe0tCM@nbKd;#1Ex9?aqkSgz({%hI?hvHYQL2c?-Td7W5XF_ zd3MG5sIZV=-d?bnO%A!X9c?rft&!(HaOO2+T54NXu3istX!7MEP~u!%pPp%HZD?(S z@vi?{pc;`sOTV^OT(H(X9D#{=QXems`;YWfc?wdQH|{`q=yHD+yEVKw6qCFT4;_!# zQp4Qn-cUj%)9Smn&BKE%!YcNue6h;aQ_Z0n?5FJ&Et&`5654^o@rKbWGTjG?t7G~?*o zE4MC(&8~nHu62D7BV7YT87@3a3$Xwv5t_z(Dmwlu4k|jC;mE>{{!>e6$m1~~H;X8M z!74)ht6-3WD-TKlhTO(2Ck!z@6NTRjh7qHNp~?lBIOE_1$^~p*1%~-(HNsiS z$6-}2%qTSwHETyM1|2e0ncLXAeAel5Vb0LBF0W~=zHn`AV;F;9EK;sfELcX&VnL$J zV&TQcAH|`HH97bh#4mZV1_`YhC==u5w<^{uIwikTg)`1)Fzt^TpeyKtTXLA42XZ(V zfeG*e;_&u5uy;OQtvU2&GyJbCUvzO(Cbwcol&ImZ!Qu#9m@JlwYu_?i#KlL%@gV*l zfk61z9;&lonRV41$%2OXs87Qb`o+kbTjX$Rh|3kLP2rh8%`AwR_=7m8{br@iR6l#* zROM@A-wTK=M{kHeJF}{x=~K;hIp$l$5XQbnGh&oD@Kg4ove(PBzjM}9WjGz`^%5HIvQytryoVg?xI7bI3N4!uS!dS(Q{7ZoC{vXoVvR@2 z@8gl(Fuzdi_$Z7x*htcbfI?qXF;%&)*&9$tT-OX3?3z=X5i`CQyijzFLpCWsj&ZnY z^5RFx-^HOa7gK)H?1VB`O;c;8CDPXWg~KXy$;g!ax|Jad{|*4&FrZ*7V-8zYA}|4_ zSC%pn{I7V!fpAUT!9qnL#=4rEBdY@qO{wBEjoDR5Nv)ct8~0w%{BNkEFMArPNIt(IGe#H(4R`7c`o zGW6X!x-|~921T?0kuIILJh|{;?~?7S$Vk)Nq#(p9uSLaQ<{A}$p$1I5^&{Qop$4mD zVB)+|4pvPT2%$^XCLjy%CI$mTo32@#fJ{76lT?Q4lC=rQ!nRZOc)@;2zQ}k%XDAre zt!+jt)K=S+&+T`-Ym|(WabXU5CW~voYsap(5i1`S2dC+|ycgN{%xSuV*R$6qATPt` zmr|ABal`4e+P0Oe;~NhvRf396Qh~opCq*Xy3jprIZ>9B&Z^$&(VffosYZH)#uP>OY z7E|jvYZEZ_S1n9}fi7N~fT=%zQ360rm;U(jV5{EL?(VuwJdd*!0@*msO`x}H0_lRa z2}lNUaQu%$!Q;=bB@NGJoq}?g;`xK@>EhaNQOsn^y*2?+ez!e=tYOaw^Ru1!ET`ft)Iww}Cw75R7?P&{>~y=pC@ z%kVlY{%%w8S<6bT=0~VAmKt7>i|a2>V0dM$BoL3nN+V;$s9}u8Ssw)QKue4=oaZu} zsmAY|rXkc`n>~|`Gx4Tcm|$ve_=Drd=>ZQ?q}bzC|6PHNk)h+B-G^vjvK zg{muOl^DY3=%)d090IBeVYIOmN^ubJxnbgQWDmaJ@PXl`2`+=qdmD#J5gRTtfdLB5p=@57+trXYEC z>ASVhJD(QzYrz#*WTbdiFTpYy7c>^4EcYQ4s`gY2x8fbv0>pXF7HukKzhYg$RIGl> zStppLVpd}%vCePxy3ES8!Z8oR;kXT9I0CWt1s_{+o_^D{?;Zu@?3-RtYsxv+H55;B z?u~io17QV4?YTJ@Cl%yjLBEY>=;g!2yww-f-ex5r=%(xL`h+QH$~6R~X2u-P$Vo(h zJhP~&x}_!C!iU76`UFfz=It{4nyXL1LcxPDdTsLxNm(zykWBXq3~#=L@OL~s3xSdH z`d*x;%G)=wM$u&uHu+4`-Ja2^*QLuAG;;L}V~zQ^!tV@I#Rmqwq18-l7xW+07t<9>t}XHVmTPF_XgZSp|he)hbWU|Brm)g)0twRq$^_W!b1$s=nDq#(%rND<()xnPs*j{|qfmeeEAu<9Yxe2#8N5tR0kKerV zYClI5C#d(Ri$R%d6oXN?FpB{TbD+GoWNI&9aplkAxCMXNFjDBVc4#5(CtU+V z&N+PKE>lRWKD;QYi|XrJGi_2v{8d#7)A1c&%uZG**ZpAi&rC6`s+4f8r&5xs_^n4v zm6BUNfAveIh;}I{TaY;ojTxPiN=&9=&10n!bII82J1yoy>4zsJRgE1}@^8MFoowvB z_w>Pmok^@3JCE?t#w4ngGcCWkQ>SMqOZn^rzZS@uWv)djr-jUd+LbNY2qb3B?M+=#B^+jm|hQV0vpfqc{X{e%<9&NK7J_#qCE5Qsm>2^ zo}Ny>MoT;L%e1ZK$HOgXRi?GACA(gKHDVa=+rwCy8${xT?DE)+f3(zMqI~oTtr@dd zC*?3WQ~d((>sVPU=fK0>P|J_dLm`*DVi%Uo{24gz!FhT@yM3v?NV9WNm>sW}R;+A` z^NbZxI#TpyoDno+Q*PHJTT2_E7}#a_yd}YALdr)+Ogs&5d?z zRC#O;=EoLh+ZyT{R>BuOn|pZ~K@X?AwMn2HcCgDVhappO)9luSqvc(3JcGZ?Z)E4+ zo=k`#U|Q6)7^bJSt+^eO?eiM}={O}6{CyIE)g#$C;VC_xZ(ob&u-8-!876JGsU$( zmW)Qs=fy!2Mt1qh&aSnAAwBd}>0m@?mi(MC7F5nPd=2 zZ>mxw3dO1biM0$;xFSENJey2EXGv{+rVz zru;SRRdEsfE6vMtX;fdRdtjxm^P?mc6kKRBnl!E|4;OEL2DiPAZ9$E^uj!Gi7E>e7 z=!f^3rlu52;6dSkB~knCSweU?rUSq^0N^EpwPiHHf4uj!{mC+#$m) z$JbL<9l}DE(PU$7|7ptgt!GNewfoTU)R#zziKplfJ; zwF@kx0YyO~FaI}bNL_0UO@@9vFoEo5nl6_pyO~jf6?yEzKaRY~%Z9@e0pgo3mkfv> zr3b_JvLPF1&PoJG9&2bO9ly%)zuw~8sxnZnVN1+S=V`7+JvO5sSuss5K43p@5}E(; zT6k%QQP6kDYMLPsr{-rD&N!9DRQdy;+<|i}1Ytjw)g3IO$;Dl;Xt|Rhdfu*Wqak)5 z1oA+`oHCr}vVy9{?}HHt_1Ma3(p2!>BYg{>nXvHTjk^&RU13`IL@lHFp)>K^@%-2@ zH)4lQ}7?R<(g8KgXaK=4#jv6j-x zWRQ!oP#)sFxe6m9oTpPU>md(uIe+b`twRfdj1e00-u<_@L!Hed`@2j>%yNktqd|BJ zcX%;WEh6gnQFCBJdDq#(39+$aO&rXYai^aDGv&Vy_9o@SwxZY{WyRW6kc2uKP9za> zL-jPZsMNl)h7D}K_5RBK7|ntvYnY;gs}gBChU3DcV_?HK*2mG|U`dww4NVyc`ZR)2e1na?bEg>->c7RyQ3K@_bJQ4DWG~0acp6Jw)>`w~URTFq0TgYr^#Z`KiYG6>1egbLo}Lq9 zRu3^C6{mU&7+aTcdDg(zR?EJ9>~G^xk)hMGsDPa92rTg==gaeSk=a)}(gcdkpu4t? zj6oo*Y$*TF5ZHqtALrNT^3uuG&Eu9qmbF$#%F8R`hn^UN#c{A(L`$1jVx9*WPEwML z8K-JMFjweIi77pxP2WD}zw-mq<%YIPtOUrOQ8K7$hmOb1wUeu6LBpyVHZ-G(!BLvXMrB7{~Jbxio@A-vbYv9YLo9nmmX68rrNrU`e` z^a|Q+<-nh>uan;^tjGqbN%eJhpAa_qz!a|>&EyHw&yaJT(BGCGVY~HwNn)551r#H7(=|?nTspmK5p?6u&Yu|g09)nBTD&_w)I8s zcA~R|cm-%xPAAKs+gPfcUSw}#sOz=5{(#jOA?3;4FdD{szkF^AdqUEE&_a*`-l*#KEmrrw^!+E-`v%7zm zgxknoMLy2>C5od!)e^)n0oh;#vU%d>Y0gd}J*$0R^}bf& z$FNV_FTIWBeE)7bY?sOh)7(?W1J1I-#CR0oMQTkkQfn4ci#KYnLbY+VRMV=Vj@p)F zIwD{d%G7%w!Bo?p=WN;Hrl9f?&Xej*e`k`@@ZRAF>Km8?;Q|&TnfmnK38`tn@T=RQ zc{!f*B+?yI#faCYAy9)y5jH_wZ{Sj0*Xe;V zs)gc)rbCep1iyx^bf{7&_yi*|U)}2s)~J2|?$?$o$JcPZZ)!+)LQuBf#QR4G?oEP~ zte>J$Us#zVXasKX9sZ5Dx3_Qe67Zid(9r?2Dd0(d&yY%M)~(+ zbCT3h?Sb$dkduG`sK30T&`G6d$p9?gxV1>$g$)cu2dWt1&RHpI<`xrrx;~giessW9j7XVnSc*70r6X4^jPhs zFmFEixIcPi>hijSqsKlN(Fo{AE1QmEu-H%j#d~tUQ+V{q_c~cIG5;cEW+NPqz{GeD z;6-ZvFGeY>wt37!YVpRuKQYazcp8wOh;Ze z{98t-_q@(gvZv+yVL74l>36;A1FR$6Hf?4zC*i6pP``@z*Ym#W1HaTiXV~ zA46c*js)EPq$Z(cUAxWzcyR7Vr^N!G>G~>RK=o6I&wRx6zvL-xKaqP{7wPC0HE{41 zkh<>E_H0KW3T@ApZ+akLo^!_+zj8|q9IRp3iq&|qVhM2UMPOHgbj;bS@pLjzl^)N~ z_b!XK2l3SVv<74OATLLvru_lV(^E^Q-Y*q5!(aHvlvr-W>ZK4|^@>Oen~manMTFgg zAX*`FATif#vw3sXGyXt=QSYB>%FHZ;a$=H$0NT%@LFow|M$laqLDOqo}Po(*u<)s zy>?nRv7vVQidnySFVs%6pInY`C;~rxHstdf>S1{rYP@z6-e8#^q5(kUX?0P)Ef;nQ zXmziecz4>%!D4Vw<{DbvQMho7Me@grYkvR`U1v++p>)iNYNa(|yw{i5ez}%_#C31% zJj;}LG=!q{q|if;5fY;B>6t!_4@oQt4K2E*=3*!|vr3tR0+eH4`AYoGJVPiWdQF#k z4r46cKdeEX4ug84|cGxg8Qyf;<+6}X1}S-u&a zSo_0?6Ry_Zm+!uicR zzxp4u!eK3_E1Yq-FssN3;@Ynw7kL}w23Oy`9q&-*OL#x^1-19S4hUL#V%hIaK`EOS zRMv!k%~&2I=;F-EY)c(vlLzY=wmMAC!~1D6#w%KVGO98y7@*aq>RYmFFd-?kmE-Kj z%fk=|^OuO=E}X-)*}f5otO%uYu2?I&lDmmTHu3h?A+%~Gj2I!UJgCg3O+ORi8wXBT z9#8geTa7|TN83hk#rq(R#%#Vt)Yu|xN{PwLdonNjc~8P%gnUjMiVZTcs()f^8FeFqm zHE! z^AqFK7@ou#6&mEAdcbt$BWu5QSj0y*P$m{<>ao9Go=pPT2iJ8J8%wi}I$2zY>L@Qt zJ}C}WGRVZChbC4s;LMn9ENPn|V^lE2dX;2^Z2ST^?#6j~9R0v7hitKo$YrPsHGWo% zm{DpZiV?E$je$up;(a!M^Ji6888K=cs*I40hQpF$q)-Fc0Y*YCpz4p1jcK!z=#R+s z%ijb>`XfwKio*efS?3@H;kfhMRME}Y7jfXO{hgw+%O@Y0+Ks{5#I47>?_LT z%iknMxGBs>piNXL$i;umP7X!>MzI4Za<+=(;WL%V<*GuBNe6OOOlv|ej;~4r$)YB# zcDho`9_RM05gkS=BxaPlr0>NU$LZwb{{hMOSU$#gU={SpI?k%6vZzT`mtxo*-}hzj zM0ZtW73GhRqeFQkPDm^d)iRQiA6F;QGGgl<3>yj{v1%EO7!?d*i9(eG`M6@vbhYxV zy-FgozManr_Tj+d1yaKhPYQX^q!d=5!P>(Ju<(y+ll$J zh@Fu4MI;%Hc@3GC+Lo28*QY91!>kj(R3RLRz_cE8sz*i@%uG1J#$!In;Efv)1|Bve zpilO8wwi|bsd^_jr{OVAp*)uSj5lUHv=-NQrZ^R^QKPKB(0PqA1$Y*rc#ZO{_&!H) zM0oLOTBB?~f(s~WKY#j{jxiOrRxN5pb93W*x!^V@2jrnN-$a+1ujTBd=6mEHez?t) zbF6FB%!QguIVg=2l!>{gWP-l3>%_Y|E@*ZQ%;Cd=D(0D*7cS5#+DYbbn)>`}rl3~L zS7qumEiD-?$l_~#zKsmP0>;D~yim(oz}bfrr1_kEj%wTe8&l4d$^1xMm}3dHa;CEn z7FL|ym|eji#qllt<*X-@@rS;M_6xTM3Q^<5iw`hG9N`+7lk%D(juO|t+G&0k`>*(F z@$cYa+RiWm&t9Yx5oWlSikg6g4{rPB`=*3UH{G!*!-Xj!bAp+OQo`zW{8b!^Xr|x* zSIgK*qI>=0;Vq_&Rz#oPl4-^cBT7R4XX;Tp*7vvLnq5l%_CsG{`z~c5Rll%!Y%fz{ ztM1}r>|B*?$;1_QN`7v;PTNiv_Ux3aeq>5&RoE9}x7e1p&}`gINKHKK4kaWL^45|GIcV0Mn>#Gz zr<%f9RaNgy#nU(HlvurZJTcR9$|l{#Dt?~$N#q^&v0Q45KAo+IXLr*B(zMkv)K#Q)V5pzOV5Tpbg;_Q?LM0;v)vDCnF4Y0QE{j| zMMjRgGKoA@Xb#CLPszxX@Xk+hHUfbx{1>FZ2j|%J(0=cP$gYQ~L{zTMth``$OZMW{ z%z|uPo?YmuPtsh-$wm{D?Dqm)r%Q&nlASIY z;)5I~%l(w&vlnYAU1iDU!mqNX;%1=A3PsDi;!udl#Rc0ELA17|HQNH^1oVeZt1@{S zL_0*GXcZux!^qEx*Cvs}3eDnM<*?BF{dVA>-iBNZ*e(al=`z|RTh_hxI)|l$dSq|= z;rNVYHP-iH)2SbGLLvx<<9}79@wZ>&x6(KJUR73^m32@&RI4g26st!10M4inC%!N2 zm@fPq(j(eOSyOhNrYsetEWfeEFxRLE*mRn$rBurKttF%46XH;vda`idqe*n?tDD%S zfC#iO@ibU<>dhz>5N$Nc^dJ3L5?wFR>yj=a@j$G)UPg=>$4;D4lS4NC1RQtZ9J@f+ zYjR=@Sm~T2z8sID%r!DpAw`dl50c75VIU9R+nF4OmXaAwN(_ikL2w?$88yG;pk>!| zwKJW)<~OoiqiX2+&H1(YAXw>zRdf*qWMIPMNg-I6S(nFh)fxe#(+E^PV*0-g1j&?z z(_0#{dGtPIu4P#e@o5ZdC`AVDdm@RU)SQOA<-lqvCF0VutJZ;Of7$LNS_f|DUU(d3 z)jF6_Y9y+YO9oEglSC)io7)l9OL$ShaUX zj2eexhOE2^9QWc*x||D)TXuJ22UPfK0RxQb2abJd+rbOd~et$=7GGN8&{pK|(&>N)$=# z^3wKmbb=Eg@z$vb<}UK_@Uw|9ZHC zZ7!Mgj4YD&O!w>iC6V?EvKM7$=c$6M(q2ZUrB`{L>Avv5B=UTI?TA&L4`@b|NNNw~{sh1!lh z&%OdveCEMP^c4zve_Qnx!j9jnmSnoW3;9bwX$7g?cn0J&WkkAXs3GevqG~Pr)y_3lX)f;BFGZZUtibIWM$j69*NsMKb z=_!}~i3ejfzBHp$K(zLPth|vR5^0=TQY0aJ*HOT900Q}->r)!%(N*E+;#bzk#QG^b zCEVHWpX_^3E$Hot8v|y|a6WtB%zy`#ziix0M8P2xKlGmn$KyOT%stt0rQ^=_ z-lhQj4o!8jbew!Ux^$dgnJch#oc7Pc%X;}ZoQDsJ$B$6dskq67y!hK3{B|PFQzQM| zaQwBSxG=iE7MbJx7*Eo3fH8f5@Kv0r`?u%b6JdzUbnpsR$f*S`hPcP=#r2A^1LY4~ zFR<8EiT|?uqi1{O(xJ7_D{EJ-&eX}gPGe{m)#DHdcTa_Gz&g3BRcTh5JN%tZ%IG_U z!r@@05tH|=Z7sD8a@W^gKrtMF$-iy3M$*aUaZ7{bxt0+Zl zY7o%T55%urgYyW4(r%Jo>^jR=A97W73<$ATr)cP@XJo#56oEAWnK-6O1Hpk~T2VMfoKOwN9BCqRDo#8x9PDtzE)bT zQI&-l%x5_hCQr@a0?Yp(uw;_4k1U*_c41GnV_IZxjqFYBGbp{?Y%;5tJbVRc-$EFH zKt>N=gozNGr!P&mJ}MG*lP;qtgcuh7qQzHC*hk2J1Nc}6vwbDY1Kb&Er)oGFC)aZ? z5_4pyYR$AjklQdPoT(LFj#6-tR>I`?|8KZv7mB~VkKcZd^YkTj``hQx8#UdbMVQ&> z=5Y~@qW50_I@Q%+3cTIkGrAgnH^ZV}2VVkm)r}<2FK_6+-AH(*!a=m5KKE2(m|p!f z5UR?HygswBXH;H>N~fsC7fa^{lt6C+H!Ey1`lC&->cM$>b+RQm&q%jLH^ZThRKP;B zD5QZmfJ!yUWcIGhdq#uI>bljN5h@Bamh>`S0cur4liP1@?in?-Xr!`hTUHj^WAbRUCTi}=25s$s@ld!spQCL)ivE$B`1VN0gSbv4(DC-1?1HKi@>QD zvN~bQ4Ce*r-gU{U9*fMq=j+@XQqL&}#SR+u^9EjWTDG+Z;VqhAFC+7L;HBD}K8NJi z**3%BR9pJ&WNW89y{bChs|xAO1xLjZDjx-o-y<;ZlE>cz8z)55b;-6fd9XEUY@uPj z5LoQcXaP_@4@8PVviIn<-I+lyxLj11Fe-w1|MWB5ZK^P8z<>sBXr5P`GQ3)1GnT8@uuzDEM zy@WuIC9*qj*9@^Sb$S^W+e>a-lc&8oPq#Orl|5p8(84@=o@FZMlCx7E?-@CFAr@Da z9+0prt!%7qEw*}!z6eIu+NUIv6O4sq}mVC8s~qjNGnY&VQ4aGqYljiUBR zE^gGhIHVn4B$lRM){wclsD{UX9C%clLoR#o=^1Sf%qkYRN9V)FPu zz}XWfxup4s%_Nuc1~9AqOI}}ovis&=DRt5F9RB0L_!k70QF6Nbsh*)hgM&h*1)H)K zRa%*a<>N$&zzJ%y`S9MJp$}hzx-+09mjkHXjL6Wes6xdXVg(NOfOay zE}jL>N(4?yliB|UPS5ghg5$!V946tuWp;2^-%2cAnQg)n8-9^zGClo_F7mk*%8A?l zHEG*FZ=A0sU5+!^4i#4j^y5e#7I_u|Ceee>&TyW^dAccCdxbom%XPY0_STXNfRw}( zUx(|Lm3sAEprf4}*?i2IiB0N(cC)3O9FvJJbNugZF;VQmzsLdNIz4cTPX%E>T^!$- z@$~YvcnO%xP?d6Wed7T$dqOE+(zZTk0pD=H)If_@jNDC@Z|Kuga<`n@t7)n)wm0s-0L(OF zpt_6fey;CKWrLO5PJK|Zw%lXfgI(!cG}PHVvcKD#{lg9PD;ne;A@A^Fs5_V!j&wmf zfOm(Q^d5*`yWHVrg>JDtWuA|2 zY3-__Drh_h$=^p{OHB4Y1wXmp;yk^rv(~*uGFYY<^jIDSmcu+oEV+H8%PQyN!ln=6 zn6CioXoNlpWRzZlWjIge**%XbbQgkfH|z@?sNAmYgAW!WkMf*1H}sz=W)^27GDgbl z&okn;+|BFVj|#ojxm@9o_{C(@pSN)yq=HuZb5Y$(u^5rVGOm(lXKCahCdLMJZQGE{Y z%Z>f+_(FDNFZX!ostq4FL22;bbc7=jD8yC-ud6;v#pQR^=|pMD<2c{KdrS%<{rJIn zALr>eUHhF#0^0>WcF$L8Jr^TU*Nt!uZ|xK=Je{#9BBR8$?{QvHR|ltmJ|hmbsTGku z=Syh6xKTjD-*4X2W=cq*^x{7wabZe0T3q`QF3w=@g;q9|@~FZ;j{BK_Lk`gdlt&2& zj+Oj;k1a^>K8Ya2Um%V+1l zfKG&Qg%Uv)Do2v)7DoT(N= zwqKMwvKX?*l9&{T?Zt^)TIL$;$l8Ogk8E(q;-<0nPYHamXh(}+Ak%7 z2N5IFoI^`{mBb*Oj%K_m&zeB?kYtPsg)Sci_|1x>G8f&9<7@FU*Wjh7 z^1=8t1gfxT(M=YzvuCPpzU{YSifr?(GgqdzX>Bu>GHk2GT6Xb3n1^%*I~f;d2AeFd z%?uWZl@E)99*xx1kd5h;Gu2M=_FGIwc9Qqtcy_e&YMbgBV=QSzaT(_tXk_v5t1a2c z_-KNW3LyN$UIH6g^70Y~f8STO>SKp0n38KI>v^Lkaty~>X3Oh%dlrmhHq{v#p zfZ;{Qr^LZ&OLmpW#N$;MgWw#ymD_Ks*raPNPo3)l5LR30LbhaL=9UE)lv9I{O@_~f z%xOLdGfIdnk00Y7JKbdAbJa7Qn{l2V-hrJy&ecFXYhMKf3!=xfK>dIQFdP>q3$p)e z06Z-=9AXBXS&6BC_}m15U?pE+FjHTfuadF?Vn(Tf zsBR+JcpX6Q#hsG&e9f;`V;`K{o=u`)SoM4(@kSt#m;2`>3~6cpy~;WaNyMumsd7Vx z+?oWkTTRpIOiM#s>ztPCn)rfmmEFuJBS6SY&8dk1X+Xg#)VNy$@uQ3YAsa`WmIx3D zBGwwfzAaJd;<-CZEL`|zI0D&t1wih`d3qczqAgqXX5E%}OMrN7iPTsXY!%rM>PCg# z6|+%cF){~MfjD_f9J}zB#)RbKTl2LV1A25zC=oSA080MR75lszhg9D9t-HkKH;xiV z&fyigXn^|fP5?@e;escYAmWBs3o{q1j1XVat;Qloj1X2HN+(PnsKqS9&$)EMHTa!l zdP02}L8wD(44v@lypomXU5zO40l9EE9xymjUlragMd+pyU{cv(OaD5SJP*ucRch zwp_1I|8;fl1)HEJRa5htY{*QG;>aesJc#RV1VQ#v5Uh0HXL#qld20Ji=UQZhOYj0C z<@HgxPW`L>U83&L1b~W|5vp0Sq9+4F69~iP1cE=4k}WvrFf?dOUGN2}-{pdbeV~4K zp=jbSzghOk{N65q`M}W=3`|#NsjR5Pxw!WAul{dZVE-rKgPLjce=t`&}=*}pE{(CE)&m{9_Tn#Z6JpMu2si)`@a@8Eq7jEVH02;Mw~{lGXd zOYoKDGp{sf39QDxXl}*G5mL$HTlh!1i0vyIwT$*E{(y|Tp84K1Q^pal(fFlsVK(BU z#I@h}$q4~IBaR#KcQ67|aQY@Kq5W>p0SQ-){PGt}2{~NV%`?R{B`g!yzJy{^YCa;4 zTkv-n0+a7|zJT^Eb3nk4-Sor%V+v^1^2$wHgG}EF5rvimB3^U3PDgt!M?lPb9=`Kk zQ%tKKv>~RibX9UPDL=WnRC0cON%?O&Ea&`eZ5>BI@JI4>7F2UlhsU&h#h24whZjuG zdDoq9%E_Lg&X?nHVdl%Qf=c$#w&D++V_70k`BB7i;GQ3S&X%$ zg*v!PYA?zx%?8p_@y@h7=}IkSC-djR=l}OTQ%bA+DWwdhW))JB<%lVng`8fCP;g?^ zY&sQI;yn7QQepl4>0dgg!&obtn;X~rD*^)`j@uA82qez!zMS@hz(CF!`G+5FGvyrX z8ab!X5D#nHtjsjV3ChH5xLPM@Ck1_F*NJy`T+r;AH4SZHK^5~%&BL$Jf_5^O-!%34 z*GxgJayiuc8EimU7uZfhSvW8;@AKvCq=my#ZMy@tFuMY}&X5{nc4pp;ZS^ zN?5&4C8DEPy~iK=tvAQN{wVM&e$O)2X6t%_i&yb-+@_?h~b9HQEIhaEZWkLhYqVg zb0AKQMdc|na?h?L@|5hW$Ma#8r(|SW`k&%#1Oi#u@Hi0QJUxMHJX+3&T%_lxP6}#a zD_3V$UNE~QdvR+9D>vk^d*HBK_hJj01O;P-)biMkf7Bw8iBq4@6NmO%q=*rU%2`5d zC3Hfiv!BbSP zRi0w{zX;hA$Ww54gSnq7knu&sE>8txjo={7Tq@! zbB$8YcF~+Xkm@#Hy~e2cggDg5i7dPf$?wLmu>L9G$f>%C4F-rn^AS&jRgc|_(!&8~ zHk`3v#q__+IYk-whWb^+$h#c>_Y?0z1K_wk6ZK-qh9b6)B|1a1*XK6{qGD55zC>u! z!i;BDzDA6^A&#B+%YiYaZs~Q3^2@SU-$V?WR5_p1&?F~{|F3!`VI$-%8aXd14$iFkamG+l31a_x? z6cQ5w8F=7;q!8raXWSY=V6SnNkC^_K^+_rp71;Z_%(cu%!Tqn*n28Kb?R!cBW2QL` zdCP&-m`TKiJR=X)QZViN^gAVimSPSJ?F$c>tXc{)N(DqLufYB}8F&#$Jd^hl_RqZ; zEK#MigvVE|R=wG9v>K6W`^d}J4~%R3I@8|q)A{z25?ynv_Rfe=<51%aveMi?A!Y(w zYm|-~PI2zTd3tgO9E&f}T9S_iwO2^Ts!UsLL!;M}68?@vAVb3sKE?SV&ePMm5R>Kj_A-s><1v`#H#A)!^-l3b zO?C}ba!BhBacAMC*~`+X{FwQGI8+Tso_-HprSA*l>okR_%U>s0)o^B%3W(mvoa}t> zki?K+?}OMS=I!T01QIXG2omyf$$%u0z?}qC8#f%@rGUI}%zCxTclWe5P)x zUY3jL#BXu@zW{s5pKzk%9z{cXQD1R%s~br6X3Pe1oVfNINI!BuCl1vQ<5xyiB+(D6 zXd`j0%RM^jS=)SAm0;&*>2z@Gm}3GZR{GJpWkNN}m-N=c>Ai zssHuaNz_f!u&P9LQ^<}?NzXJtr!pDovlpywE}8U{1|k^Y5r`Z~S{2B!YOrzU}6X-jQWYh&Ii`v0H2cY%|mDA&e2O9)AT zglh;FVaaR)BoR>&F(;V4Crd7i*$@zvu-Tm?n`~y*+1-$!2Re5WlAv%@IN&+TK@gCO zsHj{+2w{Pc$W=iRL_h`PkHX>OBJe#=RabR&&-85f&a^xG{pa_q-JY55n)i91y1w<+ zTahs6{4@r&21yQ{1%})3O>zB-q^~3FLY?Uh8js-O#HAoT?4(7|tPM18m=+9QuKZHG z)Vzj#Tr)k6d5!WhZAoYH3_c^xFU>3!5N*96D=BOoE&dEm{;c#u4W^|JNPLd1#{$z} zB=W&6uobw@w+WtTpGOjVX}|OZcQ0*InI*pX`phZT-1 zbNgz!xe5L&xStN36oS7+&)o9a&L(;U-uFcY)jMiezxdwHyWW!lLe0$a_>AO2_?zNl zG7=ZbDc3KM953I1P4V7bXrkxx6=hmHYl_+wj|~Tzh>{oc6TMr3&VWWnP4H5kU`;DHX&dLqDrnzNNvQ<{AP6*7#=x8JY zKgHHvbahU__p>cqHh>oW@yqbWX#mA){7~`!V_c8c5v>QSK-PHHDjT|q)Au|l6HK&6 z<32R8uThH>h!q4o>G%I&jq+vp5ovL1*6uxS`~k>y1QIhTTd7gyK2zdfi3&&_&m6fV zH#ZWAHz__I&F709c5P(9wz!XXk0?ui8=z zfq>l~$Lb^}4OC7W9)4rW@0|>&lId$P-NO6CnE?k`=5s_sG<93Fbhd8#M#vA?^o_Sg zJBS$mI>NaQ0?(EY(fzsAvekB`>OH=bbmdl*oFgHBvuMeCf#WYo?3}2W&#psbg6qVB zc#nb3)5dqGHonIRKjo~4I$L-0nB)BrB|^O+tP%s&VrA-E=ti3Jnp(` z;leyqKtEs(G=?$;$2l}RnFh8hCEv*>l6dcad%fb@`0pPo`-<) zbtF25kmX?;rdW^idU3yNobr-*|}6Lz5| zRuqNhjB2oZj?2Q`vSfC$xiv5*UUta_aQ7MDWk+=o68ZfNaB~!qn8R%={nF>2qd9g0 zu&NSWon8>CJ;r@N@B$LYLS*t67f-Ps#C77FfPN7D-CO+0ewnO?@+sJj;+%0&2v$+G08S`|u;ZSY}8WO?(JDe5dFIHdPG(^+RBc`@fU@c9e1 z!plMPKae+Xkh5v~)9;;qejSj}iweWNIkqiQImo+p4x^~PlO-?k5o-k5E5r?W5?3bbXJj{vo5 zt;y{t9~c;|wdkSJ-I;(G^8P9;F*k_^fLP5D$nn@617nWhoLv!V_Um~DxZgmc>7Fbf z_}~as_v4_zxE7_x*KtZkBGc&@HtlFXw^oO(dQp3RvTRu zt5x8PNdQ1)40I~bF3090D7VU1M~-(tTr68%QLGw)wmJnN?EFFB54>cVwn;Mlz$0*E zz;$9xp<|AaEQdLFG(YO7MDuWHkRmO5mJd2#+{M-N|rZou*1Y0n8jZ(|ScNFWfc7dJNZzOri6k zqF`>-Jx~_6?KsgfK+hn<6kIEv=8se?n!o1TKx^Ao6f%dmZ3{*(2j~-kp&Yn!nWdNP{ zW(|4z;B$2!T<+yKa9f|hC_9_=R5>Pti9H8KIi7_ewQ^G_Ty@1+ry(1w><7W9S_LJm zBZpL$>?){7_;3Rc?<2sWcn>&rE^qbKEvPiODS&GrPyb6m&dxyZA+dPidpw| z;88sgx%}N;1EU9m^TjN^XV0@w&tGjVOWX^bYUE5FcMq)`5UXX<$t22ZnehZLtMW@; ze>$vm%deC=^qPr#J20w#m7M-yc(MA`qRi<7$IRICk<2U$-LIbb$;B*`c zPqb{yIsyLm>-MRbWS7CY*{a2HoG3u$3ve7w`5fcOE>-2Jrfc`rRX(?IdX#XjHod8b z;FqwkKzLIR#WkF#3vnq-X_rFB4?s&g4_C4u3e{y{G0nLh;<3up-GeInj}d6jah*uT z>-dmoaJgJ}%M<0`(gU(1ox-v1;oETiurk&D6X=dcBAeeFiB6hm*Oi3B-Euv33PvtG zv%_&rlBK%DL%_*Sn=TM!`J0uxxr@yOg8Jp}aQ-hnXAiK2A;8Y|oHZN*vP{+*2#dLd z6t?Me9{_H}J>}X|HQ>09(gteWsxefxoP3;LJs@g%Q`d_2aBaSU7LR~wRnp0FswV!D zUYyb`mlYdQ3&M`Z-3Ne~hFu!J$nKf7mCBi`z%3d@F^Ob3b7{inHJ*os(U1+AxEBa% z4mk*k%$`tJsT}?L%dK?2?y(%xo{Mfy^TJTra3An|gv6eh>>XcUX+4kY#Fj$cghMhI zW`QZoRm(*>w`K<3L>Yrv<|9CQEYe^kGRke26}T?PRt(F=g$Njnks4myugMoRv>r+9 z-@JH`yMI%iamz3NIJMF`3*S+_%#`on!gcxWE1$OPNaxx*hr;^Kr9D&(QtFnsBs;p= z(y4iA<5=3VLePz4T}i(>Ee zG!MV}`+wdX42s4vfT%@c9U?nF0~n{{5>XI3%I?^7=9-)auR60&SG^dOvDz-I7o!Z! zgI&8_u=UH+qkaC)m-Y+NhuN&CYDiH|U#a;mxoUXR8%v%J!ecprx>H>scNY@5!T5Ka*j!~U`>U!cc zZ(6dw16xYElFR)e>kwGS+iw`RLY}`N5foLj4O1GHVEC)Yx{4jL{`ptPT(nLJ_1hvi zLG^(pGI#W>=Hz6L^S26on{Q4|g&e-lnFyXa$ejqzEtA*$vU+``bqv01LT1dA@1JDG z%UAx`U$|@>T-|esTnLcHh2E#iJ^eE$|2T$8_f)8blVhrF1JopJ9aj!<^?C;M$}f(- zsM5N43ntiZHJ<0rvA>8cSe2>i2a(3&8gpz>m5n*J`>bc0eU|gI`kg91J==LYdzvlH z5M!+k<}};Q8V~E4_9VR7ABi%Z4Ft}BWeiJ!cZH5KZ8HxwOd;+gHxxEZ!H*TVFjvsf zguvef1Sg8i{{ur45^~Q*jc9-mO~}o+F4kyb?Z-nl^q#3fABH9*=gXT0?$Bf!+6+!~ zNXrj^4>7faF4!OFIiIKU!uX{yzfI?j?+x-970ELQaL6`9VivbGRWB*sd zl8|T7fC{+_Npz&PF+e%f8KCgXL$+30jreW}GGnHE{}MC4eC6-iHR&P-=Mm(QZ-7EG z1a9#f>w6BD1Dey4nNDo7fkT65P?P(a!{jsWii^3@kn<5*eyvx2_uVqvS%_H0PyR6X z-Wl?f-UcjlT=@WAzD(yB=cC#xt{qghHh0Kv7x;KuTQbv}X;HeQ4i~K`$7!P(&S2}2 z=*`TpzY5g~F8*wA@nvwqFJ3{qYFni>v&r~{c{7t;i_)!~ryvJfZb;65A~|Ck87@q( z8+aZqUn(EP2m}uvfTVtf1CjDtyFv{-e4#f#H8}aUSUKPdlqX9(M>w=FQ;3Q8=|RjS zl~;h9kxy;kM-B%f5%W&uvKiNjSM70;&-t0CP5}_~e|PW!&U{atxj-)q9sKqPym97R zh*!3sJx08DCj{7$(at->>uUTZX+)UXrsabR`bd1rB>{{|!<_Qyk?+N`-@DF~??~H_ zuN-eo`NoO&u6#PmB5%WbAkttYYLBI6Jg&*ICuTu_X=+S_3*pW$h;LMe_WT#sc)o&G}C{m7J zAUWgdh(+uc#mrq{v@}}f~^9a@FCu@NaUWN zNmd1}b9Dn8I1n0PJ&Pn*e*&Li7A#(8gLQtf{DDgA(0!|{IW^s#UFoH=&f~Y{)h$DF z-8lt$9EQZ-Iuy4$q)XRAO}hW#au}aQ_=za^!g)Y!f_V0(Y8ZZde}M&sr0v=e#M7o zr5|q_m3|`Ln3euB;=Nnxs}`V_sau|G=@uq$-VA3xB+hRMcI1Ov&gh5Rcp9feFPWs4 zdPL*N_D46K$Ks7C=kembPtN*eSIZ*aCtf$>@6kxq4EoSud@jPOFXGNBS=JW9{OKc=0S97-s4anqV2g$iVV_!(c~16@ zRGo|*30=H);4fQJDq+RW${3CblfT-Y?#%7l*~gZ)h8ao-_^a3;6IGAK#zt+jJsGeo zLBNR4hRjjp*p4d}OER(NuF4pWB$wT3-t+D&Y@>d$4>X(TiQ>K6_UZh1n|LWM$it(+ zz+Nyhk&8eP8-e^aqqkEGqjTXq%207Z9=^3ZHZJm?{#0Q{<-&6Wl)^wBnh|jO$K>MJ zl|?+_UhuEZfufrDGaMzKd(6ahJ$nm94T+A&b1>AykYCsV@k0{^RmE_4iNMqA2}>Nf z=q^ZB3AYQ%IfC^cv!rSX)%6yT#8gX~S~BVOqV^v$NAMtDiV?DLcUc^a$U$Il9bqI! z%q$fU-G`8kwR^jf3N3q_@tn4~+PFLp3%b8wc-M6~ov> z>aQ+ucNl3F=w_J32f272C~m*Cv;KSD=Dn7`?4~N9Z zNB%Cc4}5s~M1_J}EZHkQ6sl9q-4XTyMb4g(JbZ3we5IK zKL(8$nnXfkW~poXPF!)GPCgzPR%PAFntlQ!TSlzu8C}zT(PbM`vWXN9f_~>7;Q=e4 za73bqC!8*uBlzs8ypbnw6)!bDAtRR!kE1tiOtIbV1xcjd(8y825Z;qCNsy1`y{oLB z;5zXco}&_xlP=AP@4Se{l#FC0Eeye=kOxgl?`8`#Q;kNkLPn0;CmvR2CC}>(N<>z4 zj#)U!$lqha!RE5KrAz0iaU6@Q!ARtSs|OXh&b17|We2{9^;Fy^mLc97O9XBpgB`fk9dH0Y4mv%#Yv{@#vNdkC}hy zg|{ATnvyGQqfO?J%P)hE30F<{v3MyViSOH0#S-$R3#(4=vyk;|sn*k) zGtEntjMg={;u0ve_=RdMBqC5p>;XNRyyD%-lT0DU*oG!6@W#|6hgPO0IUe^MvaZ&i zsKggs8Kc__Ju)70_A~1INii&n)NKhRR!yg2#>$TA>r35j zElZ@3_{)Z|9Eob|f}BqCP|5zy>j~`f<;z~OR>hlON7re<1s3nNz3#$h7U3>0icX~B zUDeup#v(*%1w8pu#hXCyb!9BDc(2`NU1G`@sd&pVzgJ9Eys5_d^;(q$7VljXez@H% zJCTaFf00_XxYXiaQ?-Z%b_;)6^WF?o#0uM}fxUGLQbc*ArKDTwkvhD=6|z7*o|^pl z3RB2PdK7EuB5be}QPmpiaMm=f#{z53A!A;7&J;0Htq~%cYE-p`D*Rtp#sX{2uGg22 zHf4-dYm|&thNGNfn`*qgL94Prwp-49@=jCCXl!E;Fg>|KQjNc=)=-P5oT^1Eu-5Fi zZ{rV45i9HnwT9!Anax<8&_XJ@sl%6CAq%8?R!{RSrjXI-hLE$8%^5_1)nY1LQjZ&^ z7fYAld*`*nbm<-QDP2;JC(O`77O2Y`pTDoC&$^tN?BXPfM;dEg-he9_XQ;<#T`{8@ zXFP+IJ1#x>BvZ^th8Kt_f>q1CXIj#ma8-^(Wv-v86^bJg3mHToUuJtGrD;x^h@>Zr zt-X#W<4beorzFJ)u%)dNp=kKEcwLXbv_n#*C(P2qMz=$H)H>zF;h#6v%IT37wl^cA z61J(OS;XrSa%wj|YV>JW&;s4~uH7<8Mb;2wH+JA!P&s~fwJHU7{TU!=W2QBksdigW zRhg*De{a<4EU+@|b?`4Yo9c|zFilP4MBeU92HvGollZH|q#{qSizQ~~cPeiUEhe?Y zpXU5uS~y+BipJhIpHd?8x!)8`(`OPn1`h+QBq$=-B`+Saf*P^7--;8>E$Q87}Du3QrCV1MWNL3#3 zfxF;liug3TE~zmcRoT8;tFu7H@0hx=?<4r8=4Bocl_IIc1J-B}3smIzjbHnW$#^71 z!iC)5cB**>m3X@=Wr6dI-(UFBAXCan^9=AzUAAhnYjGt^tB~(~B*zpH$wgP0U5N4O zwVI6r%`TUocKM+u&PZmLs*aBK71B!=yH1>!YA1+u`Z_IVf$hYYKi|H^lrvI0Aw7G7 z1f??HE}EdvJ#d_7HV{qF^wOnmU4B6o^VH^5>$OG;Wd4Vfo_NvJXe8!w$XgO)gI15j zfNIjH%qbUXISXvk4({stgDGdEP7Gr$93Veml}+nvTye`8)%ZtO!~(aRwVyY84^zY= zZDTk{c}?>w+dFfRJtN&BLoM-ROWV?^z_lB+5({k3?%eYIk4y<8HD^-7y5&+p{8dC# zgU4>vG8Rbmp#Qzcvo|IZ(f-kjn)gwKkGmokIPd$;?1`RUA=13h83Y8?ZYuKpi?uQf ztljA^Z1|-~c%<4rn-R^re8Vbbm7q3{+N9+y(86=*^B;DYa#q+z)sa=j*7H-grDoM( zCp#y7=1g}~rG%s+w--&w{VH!-*JmM5Px;HHYR{>~_RU(81u{N(!VR8%uaOv+g%TyS zyWO4cDLJXggSHe)&iy|~dX~)kASVNmce^7FE;Mr?m%2P1ayp}{@H=fD#={(*5#&*q z#Np{y)zXF2Aga3;pxX@g--)COGfT)WU-#f2`!}lLIUwO+EHQ?sdPOuMwQ64^-?@nx z^CbfgmlLLtNPVBoOp1=biU)G=)2%sqASiyt`9EGm#Iu7&*_O>K(Ny^M3I_VL${+8| z5h)rcLOH&Mb0-9&t&E~ycwZbod)4XmlBLa=B{-0?tu?rKvH8?iDt2Awu*C1P=gE_| zikB*1q~Mfoag?v#yznEHFPWJVUYy;?J+oK&n}k zY*|vBNuSr5#94cJwxiJ~q`8pWIoy8kWPEA%bG}^prFiw=FLwx%iKl?)W?UC{A5={{ z)+X{CtthH|B)g)KqrkvFcOe~wL{7f7y-J0-M)3WJyv*0U9PQ&J|Bi?wY=aG!FtcV< zi1)6U(Yr73aol?p67}Em02(J;Cr;u~HxXrDu4Q+QYEe#Y49|iEB2^)CA5$WTU^&u- zN>*sMP{}RE1`J=ekXycfjeo2qWa6_sVyPtvl88-1owaS9&GQ4!;}C$N)e>*64jP1t z#1;EQvh#P~DSn?=1GlYwn>M4hSt2tny((X1;{FF?DPQ6TIZbZr!sXK74kTLn@@1Qa zh+KTTCl*BAna*?uwh4p>N-YdH#jOuD#+R)|q)Hh1X?iG*5+;3Vf|-d_!enMz`mMO4 z%Ne;i@L~9q;5t#UGWu+Ofo{PP-qsgq%Amfl2o^umRNu)BQp%TVuc-MyLH^?R>P|bw z*sg50f^kG@uY9>GIMyAwI*dgnWcln-R)2Pf9laVMpj}_ zB^N7$fkYZv898bk+i}IIG1+(vIDU-l;_l9-myP)4U=$U$QJ{LW>FE3*seCC6X^oMP>-Th7#c4Q35&q08L5OGBhX>zb)ca?P`t`p-J|0?1ragnam72YqMkklgP`F+_m&j z_une3j$y}geI}`=Ou;28Qcq!KsgbDhIT>i#qdJE9pRgV979pZl}bh?G@< zyi6Ee9fMVYKkb;Tg26=U`-~hl4#f;v`4BjYKQqU#IxbSZSrMZ$botprYwbqnd;_CaOyDJ_jl{ zXFecaYAj5iI`@jBg@aD9gE!flzfFkL!kJkrAlfQVc1{@@8kLFL4sH;lBXP3K zLP9?F8WtxK?&&Hr63;dWAPw?|7Y)wbTm$kEHx*}c0xWb8ICpp-xPPns<)^m zk!&ZvcqNJla`5H7<0w(`2Yc&ZBJp5msd?CnD_Vib!J+$9$6y6&=&W1X(N!!fkdvF1 ze+RDU^+^_PmEs~-C40+_ao!H{YXP6oB3qxoZLq#3wt6*@w)rq2*&I_ju-FU z?!(QH_lcJpdy#?b_Kjog)zI0L{91PsF(31+6h<0*896E#+J;3YnnwT&zA3H^EB{E)B4w2d;pZA!Oo;rUnCh5~lx;u&{Ju}PFJ@tNFWlr4_ z6u%0;{vYVcFf$F0j6BUzBpzgD8i}&uQrzaMILd#1OG%{i@3D+1$*JVStK*P7f9$PD zl6#_VDaontr(%(u-mbwVKa%7g$5~~`p}xOW6Ne?I7fVzmOODqHwH0Na;|6N{OSN%~ z8+r|uS#BGhu3VsSO@Xo#b~{~vluXrPQtu<{a<(}@7h=sKu$_Td-HKF8aJh-p&dAIl zk$fpTCN=*Ar2jEKF0OqaJ1%;gGgsJ#{(G}y>ii@C{8bpJ{qNStfniRjIn~*ocZog{ z2A!YApw=MC!NRH4F|0vK4^7yGrkVH(DLx$;Z#Qu7+}@#$%C z%xjd#X-hhjXCNABUSnpdfN1LlS@|GFB+@4}n3g^u@wvGk3rvHN$Oq#%Rp2^TB(NFy zoZhTNo5p=2AkX(w&Cv9p~SPmhF%7k~0Vt2Mq*B$%ap_RtMAMJ~45W z&0L-Op( z^e#y57*60tJ_4Wai*x|edT@=yH1-pcb7m?|)+n?2spupH42q8Of$RLojE6lFc-_@M zSNkM z7?s)fWbWc*HFl5#I?-=M;@UI`IB=E*fVJuV2e9m>Yla5^5ZkCJ|AR=Z!c_jVuKc;H z@V~esSXb8_9VCA;gS~$4-jMqN;V>jp@V!P&17ZO5KMnhTy!WaA7})Eo{mB#rve0hF z0)d)g*6ffz7A7|^%4U~u!ZuI&;b;@DYMuC-C#=+PN}`3`bJ*^$1vBDKaug-h*;_7# zk|%ExuLV-01`nP}PU3POmAg>T|_qXQ<83S)IE%K)Dynr*(tMKYp#o0N>ag zMJ9d%CYl8F{PbhBG1`xzHaWk0A;jK+#OOy<|J$zk*ah4F;{W|`^Hr#)Z1L%WAk7Yt zej5_&EeW`NohBi7z5N%H@X?=NR`KZkC`2ST8OBYu!sKAZdX1nYTH%9kxvegsClLr{ zV>1(!uON_s$rqItgo~eQRgq$|NN8)v;f^x!iYiBB;3F48NtB~Krthydzh^^8HMdIy zYOX;7?%kkCD2chol?PvNK|ncb==@T5GP44uNc9O+|LTnzKuHX#9)D}gR|5cu$Wk@w zZV?M>D{!z=CIK}UYYZhZUwZhn*8TY~uqLZcf%+e|Ny}dnox%-|47)c_ejID=>_s$C zkb&JLhT^Krr>GD|{>nTPYt3kn(%qRB1}Rh(nml}Sv*w~CD)e`s>-s_f7q0O@RcKN$ zXNv|<5*7Nah8-&c00`rO*j5V?6b2G7`jXPZ@Yv+t`7!t!C35gv7eh%jN-I)l2aS=m z5l8jS)c>_xH3wOJGqLe|&j0!PS6epQ{V}{ygG$%R72_GiE;n~6yZD+BUbGX0Vc%=#f>~E+n z%P}IjbzOBF)PMCh%~45o98a!aa%~VV7{FE`@J35lvK2gVPJIv(dHL8yfo&7?kCv|H1n;1=wxg|H5DLt23qt2!DF2t+p*A&Hl~pkY5!g60mu@ z#!(VQ>CSx~eKrV3M=Ms5b>QAwAmI`WnRpB+oVBM&Vf}uE=Q%~E7B)Vh7oc)$A{L{R zX94Pso}LQW{kd8p2`VW0jBSFN%{zvk7=Ex<#IE5F7X2 z5M*L#NVO)H3ri3E+sTF+36P0vdNdnZBLUp{FYo=Q9CP3`0cx|N{LP{z!-)acUy#@#Q8B0PthOG(bz%XJGwhd!q(hm!{YTPDf%9yP z@Iy2o0Hzm_xZXOERjrChxC+wB6j>AIsHW|&b?~qx5Xj#Jfa#P#+ zx%bIslPsShn?%X^zwaeUXO54x zkR`W6m)v9h49ZZ8Q3|fJ)t!$3;oC@bS0bag?@=SlZsHs9woM^Xr!?wge5gg>((sKG z3>5AYz{>WReeE`|eD&ZO>v3Esx_Cf+zcal+WA+8Dk_d8d755ivg_ncme;{%EL~j3M z&l>9~Vm+ThCi@+0yT@?dV&7;Q;Vs)1rUJsm` zKK`<6J^-9=B5@UltUg^?V?BxM#B#sgks9E)od2&c!!1Qy0|;4?7weMjv(qU!VP_2b zeqd18iEc+#5cU$p8=7pVQ1gD^rTv^PbY$}C>Kd^EmpCilmMYH(t5uJ%dv196rF5w2-)>t zVoy36iJVqUtr5q8Bs$`?r-tlR=IdU?cW^~L{QGk6kM|P{yu26q$_80tqc*u6H?78c z4xc49uAET<7N~D%oX2}Dj14JJ1wVJ!#1fL^><5AN1tivBvOJ`rbZf9M%Cv>7!Rlt< z;u;T+v>>~G06uQcNX+FiPx09p^Yk(2>ORI7Xg)9uqQCGu!3|Z(C1)?3IxtG^EF5ki zgK#3WNlklmXSnXvva%lpi)!VPtnQp%Q?e_U9^u0w_C5lvoUd|rPNr|2QDf1CDKS6Z zRe?OExLucGpLJaN`^{}jo)@Z3a&HG7)#s4Q%V!RZJ_kM(vvS8c^jBLt3FBViRCZ$W zxM|kFuoFw)ktnNL#uLD-$}f5CXe{0GE2R#-&f(q;jLL#WP8Zw#Z$YD;DF^5OhF5!_ zH4X8yk{KMu9jfNCILq6CT-nC?i|4K!7`E{y92C}>tjc7XSA=Vm5jDej1gKSeMIBFD zH89#M#z_k6MI!D6PFP6AiZq$M7&sjlz!NRIm!JYTH7%V=awDLs{!~+XwXXiTjmx7% z03I{u&Jg^Pin%is*Fm9!LOKDav=g8+&*!mmLehD-l6_LRN}z9tc&z?((V&XHx~9h3 zjq5}zUT1|oUG#F@MLTEYc|c0I;oEcluy_Q>{)t3~IkNfXwKdl7h<05`ILs~A6Q^M0 z!k0Q6#|$SW)g>MRPIlmQTOi9b*Xic26x21Lzn>RJ(SSfqbkYM{jg>wfSGO# zGe?HU!3xD-p3S6LZrm=?xivHJCd#XZUQ{PA%yz9D&{a7!MB)0*``e!j~?`i zvP1Vcc<}yvaszJbMMsVuWRJBrtbXymop-&5Xi(U}Rny(sm0mit$;}>_%t$W8{uNv_ zFh?ZHHywzak!z*;g?0N>OtQ;R>EIfW!J+f5bP%ZKl?M{y&IglY5}ak zb<2}2-Cb<8 zubc6g#8Z<~FVRxM4Zjd6uQ=r17E_xi*@l!SH+~|%G($)?rX0ALOq#2w@^u6Lu_YzY+1s?B z*hN-|pf$%;ykZJU*|eatK)HgluH+I_+PC|&{t6UqmlG4YtuJE1OQ~M1$LBa9Q1o^ncXT#%6jcdjJN~g)3ML+?i6OGTz>)tb z=nC7YU+f{xwoi8EZri8x<89)lY6f}e-VqxYGGJ@YakVH?(YeqeU?mR4#ZBPh3lGM| zMgD_PD(t9Scuq%A7|6qi@nOh+L`rlFo^w(j1|94{$-#p?asZGxo(qN%>vo5(+rI5x zq73(X;7If_ts9UR;^U=i2AR0zq1b9hQwz>XFKVA5bCe+PS2031zWi_;jL2bOZ=GKx zM$9ZV62%DFIQo$|7;%0!fA<%utuk`dI20pf<2B&81>Y36j>uo_tpn@>BfcI`jYr7F zPj<#J9+61$cY%@Sg>Hsfe2|N;KN=q&y>)_p;KSDoDn7_X)voyX$lne2fe%kVs8EoL zy>`ckB7aBN2NXGbLh|q!P{dWsd+R{@P^toY5OQ&yRofd9g5_i7`8{P z^%GntKEn+r5jpA7ocO|dG^V7>v9vG*lR_ReDZQI5%uF>J#R?gD3}|j9nxf8g8&k8A z=k*39A}cz_EF5Iy3K-|(z`>@oxTQeE=>vg+BasT1+{?n3~PHfG=8c2v|4wKKgYdyXH%xJH-cdrj{ zC1JvdPkc@q`?AF5*Vmr6`&)zT!MRZJ>$N)`7^S~n#ZUe)_ud(0;(?E?X>G|&bEaj{ z3cL5){o}ROm;0ww|3I&i96d_j#lD!XMHQ^ zI5&3zs(h);z+K={zew|GaTmC%kt6MpLcpQ5${_n0mUr)YFXoAEuB?`I4W8!qGHT=@ z_dYw?#T z$3njJFfC(&t6DEyb#2l#kdLzs8QE5wGRonAYru0t7|KYqywzQ7q!xb(DWfem&TP_U z`-jMk=1fBU>TnGgfzAt|Wax#r9&Ey`unoAxZo=hI$fTq?lWbl>Uih(iDItlpZ0}+T z`O<||r}tUN`nFW72$HR2)P|Cq}B2wl{j-Bt;py` zcuxg9<(8sBuq#OXeT6w1Tz9R3xP?{eEHlx#H2 zLMiKHRvqL`;`Jl^W$RBZUcRr^WOS3KN0aAw%=x-0Vx$R=W6S(fcU#L6DJ1?jAeAFg zjemrk(HaV)cT{aR!LA*l0T)=j+xEJvU5*B%r&6T0yQ;PIj78Wx33&3QiZ_8y9I0h2 zuz0WCW?f>+7-?uNCvILbRq>`8ce`R1SiE;l_~CZ5>_jTwem?}&;!=xtrPgF{w?G`c zQH+ei28M>Kcy8$kdx%YPc+$~G#lyW4hw7>=G z^wi|XSC~RZ(y4HnNVZD(@K@C!s_8*j!~$#3A!A-qhd4y32NwlN@>o|N+z3aM%kwRpQL zVsH)OL%r6T{q}AAfvL#~J3_7Dm_?kJ#Geu`MK^W$)mp8`0_mRB(|n65WHh=V+vlvWprzsr!~Lh(vwdzDUW1HgP0=dg>SZh6QnFhqB5y#6R zf8JCpr%GB_IZbqh^;?aVuuUz^!q*0tobZOpVL zGu3YEsVWmy`Hm}Pft6{mgMYc%lrmDoG&PL_V7oIJvBym65-T3k#f*ylUV~OfXhO`Sw2y7fqkL_7eiBhAjiGj-YOG?fVNgDaX$sKtel(J@6t^0QWE7h)XQsBso( zcDeMl%MUeiMl!opb#%0^aE>z3SXDbgoWFGCEU=vz^XJ>Qm~uvHC#0)Zkf2oNQd=uD zvY-UX=Q;oPPV}F9;5g50AezwP#C5;Wsub`?4_>K-F0d5*aMBa%>~T>iBb5RKSWIGU z(CYC9QOz3_^GjFG0-LvkyL#05;?bw67;EvQ3SCgI#uXzLQH^J<(yBznqCy7Q?dQ$j z!z`#r+Qzt*9k4Ui6@zTHedZvW=Vuw)j8xM`1%Bj8SYXq3=a%n(WJ(yRX_FGxEvMY# zrHG~mf3R9>u|T2+{qH@Vtx!~)9{p2bQ;QtSnp*UaT-3aeDxAJXi&)^i?>n<6dU}XR z^FC)l5LCOV$hTZc3#{GgFKqawNqD5%JsaByGhMzRma_0ro0qTE8ZFQ&ap?0Oc9?Qj zfLBertSau5k8P<*Iy>As=`&}};K$;ngrp)*SywC}_p7{VU7v+KJ>@T(sy(L`Uv`Bo zknzD2Zn(}AG7{smP@;q))V0#3-kB*Bxn3)?KsopSAn92?>w}yO9?;E0F64`A|6J6i zE_XprXQUN=>(s+|m_xPAc=+;*dUgJ@Y}}jEcp2#MClCF~bGAkFF4)YH@`%?x_{;u{ zYM8qLwi#R}#xNpZ#Qv>SJD2%l(PI3E4Zy)pWs&+mnVFEBe-sbopnPL2JP7G~^CpW_ zBqau4W4RM(Xdfd7uLDW(9WT`ZMhJ!5mWPf=!%t71Bt*PanIa=MTpUN4>TO#^q%tKl zQ^Jers`ND?3+HdDwQj?8;zXXJ5wS)r(=}p(*NaS?-(H=;@y}&)kS>dkRDD%P}PJt9xYY0*?gvLzZhN)Y&a7t%pU;`^7xQcKdQF6;v9tZnOTo*xiDM*xaeOT4*CF!-z5EV8qBYw_DG>WKMr{@*pP z1}8< ze7Pz()*ZMy5Q$ujdZ1RUx+RWWIWBVVa<1mX7Y{rCR>Q+=qeo#cY00^cuwF?!jN36X zE8ZbqYWz+XUV!Ac;M3x6`m9T_^8gX(N`h&KG=4X;ba1#EqpANN?TBNPB?ee>;W8LV zq*0cUqsFlvSDYG?jrIp?V+h|sFB|d8!6+(hqd@g$)6w}sYWY$a$ioRe@nOhxa*N8u zbB~#L?#$-4)G^1&%_`DUv%-#y0r@!yaN;PgxD|jL`~w(n#C2jEPnwB1VqB!_wC}tw z>TO1IJ_wO)zAC#c1Z3c655Nfj6sdPGv(!k`n4Ap! zdS@IXSZCczG_0Hx2BV2ICiiEn5h<$zdAa=2IQl#Ov~vP=FqlaFospx)p_m~ni+9Du zjOX~$U@%dc@nowJJ&CJwB(n0w-DrDpoj94NlSk}1&euK1C%yJ7=&?50)!f$Z7$5Q& z8)#q9#)gyd#vB?>7Vq7mVOGApUA%sazhjWd&={-Ex*gYv$qaBE5z_@4)29M3&1g$4 z5w$1}Dw^Ijs!4cbqN)_{{iw(UCFlGfnsa}J4~v&-?Re+wxU=}J9rTMW+49Vn;8GZ= zwKKC+K(tj}Ff}MPB+2&Hz+?QxBr!S?C(A4({n-gYBfZkTj8OC%#}biU)G=IHWIrEtfx7)D-^ft=j5{5x>Pjm%`>%pr9#gpF+IWHX;^os&BZx~SQl z-RiD{qZzX+IbOVXyAn4;-X~sa97YDp_o|B_3`Ij{Q}S!wNd)oCvuYS=9A@OGU}zf_ znRpgB=#pJr8&>|gZX_EPv(l2Q_K4cQd}ti)k#wgD?y)1aM?UW{B|UXMcUU~qrYXl2hN+`@|tRJzRrJdnCy{&a%pqLw$b)$&0`K-HRnEk|oD$h1!ZT z&#?kEe$T#fj1_u~eOhiC9j#oHaF@Mh$Ln^q{;;R2m89OkF(Qt32A*^)QZ2#dCQ>^i zGlRb6OW850`O1-XG1&C680KV}Q=RR3m*pd2 z(D?}r)H~%?`~TG%BtL%vpWlYNitA-0Jv3n>k}KQ6Me79HV1_m*a|lXPhv^XF%avb> zmzviQ;|*1D%xjd#X-hhjXCNABeraZ@fN1LlS?NMps^ZVkfrfW+tKdMq#v zMj{^!uvLNUT%p|>@%fQRMEe?&2<^7t>29R1`DHkz247rOQ)m7A`ud!ax)3C)13utw z$XowF$z6sNy&+OZk_JXa!Zb1mp_6-egLBkZ%h~z zT?Q~2tr5J2wnV)Eva)n8QVV{AdGGITDrs z-+fzI~>Z~hpohVz0a1S|ZRV*X5app+v zlwHp^4Z@*`-X5i@8xd5*hHglAHxip;!hQo1UrULPpaWPAiR16r$C)FvoB#6Pmt~7@ zRX2A!p&?ZDp{j3d)J3l(s?Qado$+Eo_3;c!?uEi>v!e3<-PRc3<=htns0HT2NfBR+ z_g9?Za?ejcR@>dZ#R(B5lJmP4;>UI%F{TxTs9C9@U~h9@pdh0nivRb&&F=}ILpqsA z!xDaT8xrd<)wt&>jUsm)j=x5D<}4rm`DGPl&`*Mh&nJWPsTP?W^tcF0qD4OFmfPwA zcn}C?W4juZuON_si&twBN&>>gPqnI8z*!`;wc~_V8Cpk`BQh{^jfPMX+j zp)J+iE)l4?1_>CkRwF2hxyF?TUvNPHf`-m7btf|`P>NLlK=nWF0w{_8;qkY&d^G@o zh#gjw?oM&yy%mWaGzqwLohG5bI%rRG^zdh``}1L7O;()(^?&AiEq_UL3O775?A}26 zaomHm+tffo29CU_v`}1i`4knz%HJN%ga-lIqjYzsg?21ep~=JZE{c+<(BFNo>k9!~ zxW)rjp-I92Y|u26M1?-9VaJL90K#}6Hco>Cg@FVt+*n!|9-F*7KL%f;L=KL*SYs%O zMrlRr?4U7{HsYwhnfm{$D}PD!&24{Leq%s6nw@NJZA`VZYkL~$Xe4U?-c5DZ&vBiY zL|5hb#@gfU18lKCVCyq-4pYZo)8PP12Xe8%S;FUH!QXDYQU!DNH%>SbI=LW|>|Es5 zZ`E0lleL?5xhjdy;>q<(t_|V^gVw4A3t(tYwt@%FsSiRTFV$N#3WN}dkDIWo9=F{6 zyJG@S$Uz@H{TM@l>K}fI79KGK`d|16fWui`2p!cTV8i5W!V%%ZOAyF|`JXmKvg6qVBfDS2sYioyEf9Ua_ zd@sP|+3w@S1nVvTdGcY|Wp!i9NUEVDqWyMg9? zB=*o`vHKwmFNkneNz6#PY-dK&<2#X7EQK|A_$@^vH*naOMO!*$l9M823| zxB8_s?9$x&&@z;gKq_pDIb8z%1bZI=u6L2jk;w3uAE~o`i|d5FGS+ce$lfNSS@xX; z4G=9$ICpMpJ3nOmWO<$eM$Wf6rz5|g+F2*Y4T(7n3)e3kpQAZG%3FV{(+k28n_d7k zFCZO?L?%Z*S|^-a66XZ;Eb+I#i!>@<5RtqaKC{ZKvz;Hf-a%r`Bx8H-s%;}z zq#hq@AxmqAF0H=7pI;Bw`<14q_u%BeY zH%!>%;XVO;Y=haqlI4A@dh2mw?phhEWjG|}1sbz2{Fp?LI{<*cP%FF~80UGBZo=pM z{~x%ILo0sv5k7kg*NO83+=h!(xkIX?U8`iAw;0r*GtLu@I9n_313;&SAk@ISgX#yw z5QG5a@FPNn_dW#VYIsSWpDn8|+2JLE;35`n+k)I%9sTs`yMa(OYUFj-9`ysFQ8Nrb zp*m%Y{>p}_=vClmLrzA2Ik?{1iR;9ocx!MTLvluU&%ObcCqhgpq@E{$N_Es^_U1k7 z2Si8Bur!^{j8dJ@-(cxUw;;eXEr#z#oRz0fn+0z9_;Ruzt z0@Eu1ZS}wWYdVoCTBUh}Y~IvWJp5Lkd*E1>QBWgd{op zL7;sBiM5$5chp9$&3Mo_&MVFuEQ~U3A#1R@8Pak2hv#~c-D!38V&6t$F3n1|eh`e(pw6We zvU<|g`jTDL^avjgvG);Rf;AEpTpI^1M)O zl6yPws6K~WmNg8FJ_p_tvvLQu^jBN@660RrRCZ$W_zrLmgvBrEB@$)v%Xk8qRrw{a z&z@Skr^7{1@G-zXGS@5qP3yBXm{1 zctSWPFP%zqU!bb;RMVrgbd}F-P#z^BE16@-A^0UV8|1h$C?-@$pTLy%33TT9h%X=| z<%xl^9|~6q^z9IjRh~l-s_4$fdTTeX6RCLp81i(>%XPQx9E#`xDdC21!}Y`B5g_{~ z68-1M=KXfP^*f?n7tw!?YU0D3|3{qohnyfT*Au5;EeJR3aC~FM(^ihEM`(^Y-szW?}+(gteWsxefxoLv84 z^?<15O?Zh#(87xqo6=>{L%<|3Bgw1O_FZ|l4xEBa%4mk*k z%$~8XUU};GmzU^#-D5e%JQv-Z=7pgeXxs-pA0e?PCVQu^ueYAZbz)1QUcVt3tWXTD z8#B}{2t z7)A}CkKx)#Y9wpOal^M}DS!espj zdC=ZMJ+=K&C_RpQ)FCrV~X#QzxM3t*2k{p|dAP!~`908v%zW z;*I1=wgI0J@7>T?RSRJDty`XK>F#1PEnnB-AFa0p`?f158m>a*JoJ)Dn@l;!*@m3Q z;*BZi@#4KtP7x`G_leid_{)JKHF@<$txdS(7b4{qhuqs@N_moPNO>~em{NXGy!S~d zH$wS!dL16*+=u#XxL8YzjWC5s`}VT`y3CZ8YDBSM2QbQJK`^B~LA-aRtxhgTXOdo} z-hwB_AW@<3x?)B@3d~bPzq6uM?dTIllzP-+P7-3-T(J|~RHb0=kgqc5l@Vj?RW>^t5WLdgh$S2}UGYoiR%7L57 zq`5dMUpL?%X9xs($!0AmHZd0>Xw7jIub6^THZ7rBCM$j?UTl8ZmQ$U- zhNMo58Gh?u4<2T1AT{utMZV^<<3P{b0pSeG!LZ<6@c{6~9N*hXC=OJ;K| zyKc7~)cNr?@lv&f$nUu?HeO`d)||s;QM~f-62OHH1S@eUF37{GZLx8Y|InKXJ1Q5R zlW!CT@=$+&Y#8z%e-j;p=M0>OK?i$NaItuyQcBfcI`jZMhL`#^FNFeb*+8!KWD*sgm(-@3ijU;ZvI z(%8h!FpCdzvArigK6>i}`@n~<7gT(Zi;WM($4CBdun&BA`ay+)T%7iBd?@mFgndAf zvnM1EhdmNssp_o*=|ias=t0QEOR*qnO!eY3C+b|F~xSb z7bKB-LnB88L+o&(NrHUT@2a(N<>z4j#)U!$kQ?5U~^gA(xr3MIF7~DU?g(Eb%P3A=URY3m=fm> z&i}dmz!yI|1y70Ph)4HNQNiY$_u>iRnLog74=H!p|&Ql^kT*meo;q$EGva zR7}DO%qrT!dJd6(({f>DUV8pw1Ybn4JkGKYwl?sV)wW)kI~4aHF7H1rnd!tn9ISMN zc;+zqjJufA`_GK_x^wsXz-w3rnK0rLpOdD)EV23Zwdd{r)*yRuE>!$_?T!aV>91Gu zlRwP8cSf0b;A3lATQbv}X<4*Fa4|=!OI-8M99JFgXBw{ik=S*c>~cStnOvInSxt9m zS9+ z&9_uEZ)UPz{>eGNG0o27Ad2o(*#erK zs_bN4Q(H7~9GV()YM#CVXzUjh^ZW#2y9eUxd2b*v!Yy&Q_ zn{YY6FsnPl@4E-3M1@lrw(>9_aPoD?YJOBYt1-e)1}+fuC}(6o}#x&~L=a7ZnF zVTcwI(Xt~B4m_H?;@!#W7z#149Ag`rtiT&nlN@!Ln&ec)bJVt4mZK71aAl0X(BP5r zkh7mrkx`>tNQDxsS2#N|C_mzjB8@_#8dvY7Rf*Gb3Q^_ZcMkuG$#=PJsFHd$RVnLa zRvqL`;`Jl^rSXtjoG?_2Sm5IJ`5kkAmnz-_dao;EfyI06HtP~o z#z+HJIUVwfsfst%IDfcSWr4+e*MuK#H_J|>;_Y9*S1m5JxYyoV!~$E~KdpIhhACo& zZPdWtx&-i3Kfb~gGLjyJdx6;XDn(SahB}wdRm9 zuc*ThqIU{HL{p8b)=-82>&jSQt=aYZ($S_GBh?xuqde)#%Qn?``Mz3}1+v|8?vv`| z0-?%iY-12GJt@ch6jIe1YVnj2TEqft&3^kf{=n2^g&m>RaGWAe8lrsSrRb&(Uvh;k zknUMM&9|6BMxz@-&Pq1pln8h3qjX60hvLxlzV)(!Ya8y53;#T7Za4a+kGyyMc7 zPclW0WS@eVB2t8J*31=}awHrv~J6Ni7^R4b=ST39(vbcOZXVwGB(TAGDZ zI;6u(&2OpE7hORMoZnu%WzzMgppoXc5VSGVn#@$YEvc$lRON;mtkBCZ< zRN?{Cw1@>Na{R`xsnh(#urrb(5%|I1UaENpm3X@=Wr6dI-(UFBAhTRXnw^7Z>ax{o zDiIbFS2USWi|->jrie)1%gXFRj8`{kHVQPmTzcB&hnhGenO&+nI@(t_$AM_9s+}Ot z>8ENr3v4IG{Q34Rrks)53F-6{Bq){ncF_cV?t$Yxvw>)Wic`z|f-2^z&8wzsjTXrK z4<|kGqN&kH%p>|>661kZk1vI4(x}WSGqjuqHfaZU^{8{Xqfb*YzTycFx^P~ND~9u- z8vp2uh;TlI46NJFo4tpr$|G%KtjbQ;G_SI~GY8f@cgon3qna}+aP3U3!~&bMJGXrQ zBU8di&6$+2ZaL)^FGVypcsXprWQGVHMQs;t*E&kRrt6o zVu5qL@64X)=@lZ)^_)RKQ0=B7&u`SqEUR$g zRXmV`pRS382O)iLK3dUuFtXH0cH)ZmF>-L>+Nm+PGpZAH5I?pp4;^Se-L{oom)W8E zO=zAxd8>G-GDSvCSrTQEUq%tKlQ^Jcdq(|Z%S=e{|RO>ceCr;#X6A^2~GF>Ak zc)hX28R*p+9G9F#5Xn3{^=Plw{hZvZ?e=pg<4d#K@a4)c#j6K@xp|UIJOw;A9JmGkB)Cpgtc*UJU!Yqs-#KsymW2AA`$#N7L!_y`lN+RzFV$XA z^M8W;#qZUfb_!=#iDoO9hDhy|FINS}x&v1SG6Bo?E}3d^2`h2r%5jlS|;uvL#0hV023974Fp!7)x5bAc)5)zK6VE+n;<+=M+fv6kn?9tcW`!LY1M+ha zz&9UP^p++EYww?G-H7YNI3CXuam2Vt*Kgm!R@B>!=6nz$*?(1bSqR9$)a`L0p!;?( z36T+ayunpDqW<@OAg*$BTBa@E_QDD~VmT7|X%^J1i3~gl3^dUdch*$jmbV^6nl*{M zwCt*MC$L195oKb3|aXQIEp_r$FF+M`3wdVl^IXA8qt%uDn}wK zk3BTi`WdbhC-b!Lh&{*oy65<$*M0>=waKpLwsyz(kjL0S`+_z$oP;;#FmbYY@Al+b z`SN!0`YryBK_WxfKMWTRTqhN$W!MdakOyIDKj9&$|}$j2qS;;^0c7SJV< z?Zg+#Me#rmzPvk*5+#4IsH;?FmYRpHxS|z^9E`Q5#b5<$=&W1X(N&-oh)Sk-oc|-_ zuoU0PS-!#F9Z1~B%$r}s&BYIR)X>Q$KiN7bcf4>>%Q?H%T?t1sW><2&c<**4Zic*1 zywo_1aDO^zS`4c@4V_KNuXQI88Z*zTVWe@Gk)wj4?O9}EY1y{Tz%t}kH z+9qm$!XDFNSUHfcRl&V?q_)ZDNv5Qy&i@*d^ywwt9YvF#nPusodcSUP9J-&GUY4xR z(;P+8z06EYe+RB;!=>Jv_l%>==eLeTD)S!8h?1N-KYU0WlIIUg7D;kXKr$sc_5D;V zlGEEYxU@%-+~YW_EIHKoxAvMAgC(aIOH?FFj@Jsc6{Vcx25S6EL*p1X^cqF9+%`H| zxj^AAd&`d3?P&c0L{%$Ey^kCgM>_*gx)rIG;BphGospSA-}0sGnAH3ekp9Q`xVScb z?6~M{&Rk&|`tQxAuk(`t@K<4=_P;wk4h(ZL&8g1zyi4?vFzEa=2DJuB4i@e`ErvBn z>6Hn)kX+dgE>0)d1{<_HnZr(+H_R0lU#|R8ywtpge0+MJX)$;~DlgNPbSBT>Gt&Ih z%u)f-)(f)oL5xVGA8IfyeL&)KZ9N{C1|yLV2B#X2>+%YDN{bF&hW)$ptd>*pE$2YQ z+=;tItgBh4yRoholwm0lU+h0(n)SlU27j!p(=zD}IDxk%JLyt;1QLJqXGmjljq_UM zkt;#rt~&JNZp16~Ys|3d5w9rOEI@G_e#1q)`UNDRvoCe9=g4W+Rk%(J4LBEflx^Ag z-Z-#&ht+1n#izfUwWHgt z5}V#+JB$zRM>-6NczYnW&WifR5#W(Xyy-W{)S)x?$$IhAIs3C`kIAhH1i)L`oNArZ zwltaU?t;YIkysE3?aC_6D7FFgKcnle{<+%p;wzOn+c1?vR74pKKw+Tf=T(;$hV9$- zQ`;P~Fo-VI2^4W3I2esY4$5mZ25fTae;!6?{@;`{gDoo{HSE~ugU4{R}O`COf-O)kvCo@aiy4=k@ zs)Z&6i|aIul4zm#|9J0J0Wh#}SvvYl@Pe=V2= zcb2MXAO%00T3R$*`ReC_T2+)JIUGk_R((Aw_z)1BAzH6}eO9>F+mIQ@wA8~b)23Nh z;5t#pgA8&sZn5<5F!2ib4=Ln4bwyjn#2+G^~xb} z{LR@obEJ0jU;g{DZ1Jt?=1wOHgsMJN^$DlyqE`~t=ZeeDP`lT&I&^bTaxaum^Awf; z|G608+}tk&c!tV7KmAzkZ1-cRP0sIL2(h`6#gJ80|Iepu3b2j2|Hc3N-{z}WUD@K( zheXd;wgCa_EeSYphDMRQ-o{@GJS2Sd=a*GLK|cx+iciMjQ>`#Lm^4!(D2e|3pj&RM z3+PD%g4x)O2IVUVB;dmmgK+Uvtt!-S7713F^5<6(-yWdKUr@uOAPt)}9XRZ75VPLIR z9Rzjqv@3r}bPzW@GVI9tK9i2^jQr%Rs;YL#sjfO8YCzT zB;e%|!|>ST-T5*28YOb@!?l`+l4z7xq|Oc+FKHu=>Zhsyh3mBZCDBi}{b~7)0p)0R zvbnV})y{72X{4i(sQpvcW9*IV#3Xtp$2aaCZy#Wb&dk=w${dExP$Il7eG7Cq=d9Lq z#o%u@Ua4X@`x__Aa*POW{Z^d?IoabP%}Yr%vrn#Ha%~VV7{FF7SO7zFvK2gVPJIv( zdD-fsK(v7PxCy)Zam(GmJ0<{y901a(kKqES{);wf3J@-!|AoKgS7%HQ5dQR3TWwoL zn);jDA-^h0Bw*G?jiV%r(w+M}`fL!6j#jt<=xEEeK*D7gGI1$TIF_kMaT$Mw=Q%~E z7N%dU7oBozA{L{RXASXmotO$^NfYk7tftlA8}pAkkLRhX9})iB$a0 zW=#h+_w+xAjeBnhGBGryT9eC#rH3oKWJC4-WFomm11X8#f66fjUK7BEvv|WE<{6|4 zB+~H3OLXslYMfN`rS~5;y5aHwG?rz0!*F$z)TrKvv>dQiQ&SSX&&Zxny&nL^X|qm4 zurbm>$vOX*CwWu>7nf}LO%uPtHI6(BAMx$?P6o{OQ}<01Gl;~QMPF4Iube<~4DV>T zaE5oSHphB!rs(kpTN7d9ayl6Kn@CH>g9EO=AhC0zVh-6h&3Xjai3L2ivtJsO4z>Q! zbF6odo)kFGE*C#U^8sLb5s4l#HNIwlL*^JFy3zQdFO zqGbu^&P{FS=Z<*iFV~jkc?K9c-{zc-{NA)7{^)bG3+YS3k zCVaz$8tOg)d~Ac+zmnyaho@PO6LVL9qim5%a!AYzG-hAaF^M4eUVnd~R(Lr`{s$7r zOyu_TN3fTOSkGsa(0(t~?HcPiFTXYDW%EQ7&W7tg0CZ|>L1r6w4vet{0myMhgqrMq z2*}mAkvxC;(b63^B9JZO$+j)XyYHxPPYhL-7cc9n$! zjq`K#Bczi+Isb2`twy!h{9=zm4FjUJ7QuDIs&NGTdYM_x5vYa_fOsIx5pZ5iGmaC8 zG!gVX1E$|VqOqPV|Fx{adIHypWh-N~@`fCPEYkh5Z)A;FrELpS$xK+Do!f!zC8SYE zWcblN8mwJJ+a9myXh^i@XtciBQC-N{k!9gd;8As#Y~DL~VAS1+GknW(9{^%yk0Ybk z?b%SW_BbIlDqvtlCjXGbd;mD#MB<7JS^e&i2J1;&Czi)+cMMs27wgjNv&|_8VP_2b zegiK#UBA}=!W)`kry%ow;HAx+Zgb?eWoUy~flHhfZ|jt2gw?7?SU#h<;3yoS@>XDa z1&L*sJT?q#5bLCg)_D7wJlIkin{Q4p1jdmc-N^_5<^4dX7$kdRhnF&g^#2XjeQQYoW8tIgE-G6(GjmbHDs?cU-v4$lSk^|)0aEIfuCUD<-NdHHpmjY?8)t)_ieDA z!)J+&D`%8|1?n3b=kZ<(R6`0>!Oz__v4kW!`$3?60f{x3EI&A+bZf9M%Cv>7!Rlt< zVvXh5Tx9pZM>dGf8Hu?(n=3vWW1c?dT;0d`P6`N&W9cuv&bEG4a>?0El`)iDDvKEl z|Nm7o9y{#K3|qiAA!}=3DV~LsDr7`e#Hp!iZ|)4&wZi)=>p`%qRxT;@6;+tW;j>a) zx%3Dh4zc$U;NpChvvZR3@6`dA3x!XxaG#2w`h}M>>_{ z=08>CsiqSebd}F-P#$G7XKWNige^u(8etC+?|YB_6w>i8r5*pAdA^pECjiQRC|o7b zw?kZ3dAev&MMs|6VC}|rA{DQ*LY{7Ux$c&oLk>M4B{AXKaQ(1&1jzo0L?=12dD!#@ z>vu%Et|Xk~mg|XAFmmBb9gbtHcsk`+JOrHVwCT1$mPgFc&0Q(DEo3?4XyL`-mZCa_ zZSM4=bk$INlk4F#2OQr~+C7b1HGrySlk0bZeE`(#rmhtMr+xazq6S(#Vw7&O{Q9hc zQo7~xUqfm^*b%t<05H>yf#xo<`*dT2a=I#TBgJ@oxGm<(w%%rVIJz_uvi<=14d0Bm zohXI&;2fI}vz)FpVe=Z#3%}ke?gc`cLk>bBvv=4H$^}1%`zQ6lJH-5-`-RynGs=Ek z!42o@9?LQ8xk%?UFAUXK<33>f2#Gy05&UvxgY`VF6I%*(?G4Fhg<^Bvn4xwVM^4!r zOS9a#U8HksX5dYfF^FY80;IvBZRbO%*3Y$?N(@aCFjKy#2Tb_|D}Tm}byUn}r35lBJ%2HF zG=f6sbU)m(+N~6a;{L0F_uDwl;y<>4*ewZycu)48%eNUG!l}}q% zBkrdiTK(1}K3{8(C%p{Ay7A~ipC~(YkAnyAzbBQpbMD7&gY2i7LBw`&3Lq^8=MPq{{u6EbDqa%9U55Ubn8n+KlVOt2QQNBXPxewnOlrNwoIN z)yg>`o2bqLqtNd^a=?$AS|vKUiFk}X2HuRak9YGB8|_aN@7(~EI1#If_J@qK@QokD zYbH_!5-~mjK^>fk>C?;Pv%9k^z0|`bb{QfgDvgMjfolhK^z)ZJsQ3Ky)SsKE%ORRZ zJqB+a%?Z@UiuW$+y5-51?kqof8L8iGkc;!>UcpZg1 zduWT1qFN*xtpjc7q3vjXtHMYfhBv4xY&%}rYe-O(P77YvEy?!k?yjyhyH?J>NF>$K zc5#CW8B$>IoRH(Y{G;`W_7N_mQy19(%*`-_uW1&MgmLvC5=kK;Cv0l4*fuA|^qUX0 zCotBo5qB>OfZ&u;%?h1F34@I6v01Z{yKIG?O%$J%C$D;UL;xhXKa0VHSdIjgUn8-3 zB`Z(3kaC+X`w`NvTYeD~XBhU#=K0BXtg!+I_t%sok)9uI(G(T9=dt({ef-V;OWwD@ zM^#p8Yg_xi_TQJat^e=a`|N%8IWuQ6J2MB8dVas1oOzr* z>s#M`uD$l!r&L8!v;a%Rm*Xf4feT<%Ye0f7zfpr4a;-u0hbEpL3932OlfeNHfb%@k zJCMlFd0RA`B6s=?f+OmZ0&qN#J%tT4bpP0N=|3Z(wIo-i6lcJ-9f>1PW`FeKy0t5^ zPEFLN7IrjZ@QM1Ux}iK~@<40%i)Y71;qZp0tV3>WLZwm}uOc15mtJUQ(6F3H*zx&CVZu&CK3Si2(2w?9>?(mja5Q+B_c zXJyu3iYjQ41G5yddClv$>4w4$B4qc&J7F1N|CH&AH5P7x{dSw04XX%Cx*jhs*xeNl zpXkqlNv+Y5*DIcWE3DCx&E{SC*62iFZW`!@)w&$nTkyzph1pJy0OVK-bndli<@x@RH-HVyo_H<3J(?#WRm zT|8Nl5>GnLMR<<35A_?KEmsHZ46Rq3fBaW}Al55#+H$2SQyX$A*WpN%=@XFOvuREd za=}g>S&N8+BfN89j=T)DXK7nLfSte8Antz0yv*%UXXy1SFh*iy-hw)q4S z0d9n#9>_V_AcN=bsk3-YEAU;&heiPcu65?Ag$vl$idn9?;@xMe>8=2MnrkdvoKBhf zTP!^Iz+A+bAzu577)@zk*an>3%x{ZJEx0hRU-)ttx#05mb-My&Rk()S11-2TrDta{ zom^;@*F5|?7Ku<#Et{uksxFKsA2*h4kPB-JfsQDj=X?|QiCOf^w^IMO5ci2{ zPUYI~B(@S{YSV~$&Lg-_%;oBiC8!M=)O+%R z@)a9RSFllWA(C827IcLh5{b*tmfsc^jV=?A$kn;%?Y@Hh#2J0|4asT^O*w~#>sC`5 zHnH|}G$PC9M&u?y@Xr*a{gB8HyKVLm6%*V8ye3wx*!#{SgnBoU=>30G=J);`=>56A z%MZ^xaGrA~KDz-~F-yLF2VPfR32@yp|te`1%6?SR$`IWFtN7wL#BvU zfIqd&F&NmELzVoA?9vprLDU@CFuAzDQH z(QTmSJo^0`zi5hRHC%P$h7V|I{&M=Mdu_e10qv-+Rc%gSFve3h^S`+1Wu9;<^QYX-cF%AMho` zL21S4^k!16 z?KXB}B&jBO@Qr{W;)2pFFjt7Y2^g-ARS7{t4h1v181Mtk1&OD{ms^<^nDWTx+ zZX}{1BX`e@2hE)JberZVniwlIfjl*u=W$2VCwb|so2MM|?3?~8H8)<=EiM1zIhj;y zerHen()QM5etN9Bh;X(VlVXVMG|h{NAz*4sH>WyM7{iu|Au~^nW+(30Jd&NG>U9f` z-4~XvKz0kS+ct~|ITBou>{%X-g|j2ws>v~h->S)RoZm|sIcg+7z#Y48a`GCGd;|B1 zv$(y~5{awJ+9~070KbbfUa^L&i(fP#+hKDkV~uME?j|CUoo_VAL4RTz9Z4*4r8Tas z_!@JQ-SX$7;Z(W?KLgFTb$*arUeDnlm#oOl^^GuB;XW~a5KC59XcX@Zvs0Ibn`t4` zusG?m##X@`O~@IJU)Dmo^2_2^W#AzNBsp9HY-G-TooV@<*EX&$j_-w@r-j? zl1o#Fkk~PMb!$rOw23ZpR^yzkd^M_FxTBGj9F1}HK-}I)nmrKLEu1uX4m3PqtEP(` zdsnmA$ztdiJ2OjuQ(Yv6FgX9O#hZl2_ZHwiZ)~eq419-;pf7{DclvQWFKn}T{?NX8 z4rgnLsSLzu*}Pn;E2bA#+W(csRo#pNA5Ar9C0a8yN12+Djg7AvnHj$$u37lYDKHhV z5CA+SNN<{e*Gf zdLI8Okf@Ho0+QF*+C$1}Y&}SNpii(6yc7gda@EywLEum;nvF`=76SA0 z0LV>|94?Z9+1Fr-g8RgYJZ93ewdl|+c;P8c7Wk8Od1k;?V@1J(%rOfFSs1fEE*Jw1 zsqA6M95oD8pvc4?z=)?#@a)`D7AWSYA?(2&$Ax6!bJyzL+1`~Yt9RA~DwRz4c3~9P z!|lq^K&*yPHJF(hxoS8ZY|zF{HZHwR8&&LW+*w8y4~{$&W^OXw))5gDUbIwJwq@^} z881_fg(CxYtfb|n>*36T`$Q#=IIyhiOLblM4yaRD+Pk}wJ*{~rg;s`Vte=VOG=QgY z$Ker)_#*(^LjcnT;rW*}bMgR)0|=_x+A{DljV@SL!#*=h4TNrRG{cgGyEn{pZX=MR z2VsW2STo@T=}|yn8;AyAWqhUGL<_DMp!QeY5C;SJwSlX)9Ro&|SwN`$_ic;;2rLUC z4*b$&zBbAVh?%7ZqDH%9KQ>E)?RdrvnP6r<5t6*n`>EFk3N@*86T(vFHVP~UC|#LqGd z2-#@Z5(^LsA~LYGs4^$I)FK7o{NEVL4`fbII`WS2mAIb9KQ1;f&m$k#qZNC9h^Wzu zbc-CYhqPL02;?bo;4hb3xtc}Q{1{L?GlumudP=AT?yEoJ!`Y7h)L!`T(N z_~O2j>0I@?;l3hI5IDNsngOyd@}5_}RmJB^ z?0LHga{UJB1m->2Eof8KL-;NyN5p^Iws|TvR_=(#6I{o|cXNh=%OB&Q(9l@7K7QLL zJeP}5xZ0}Tp5<5-@mAm<1UGV2AQABgx9f$!BBNH6WXEqHYQ>MQ+%zjUBnV&A(GF1O zGWMl#5qSacu`H8{MLRU8dBvSsQ+iOBra$@fXi(Y}eo_0%RA+Aw04cV})Co^&U_*|r zi`V{X`9Q#05V0rCxRc*TVxvH&UiU$va~q3y4@No+i7^#zw(FLjt&MGE2q}34LrR8f z6$Dd$jJW+C(y>S+XivW;sdlL0IcUVD$cS-HU3X`PSfy{khSm4+;@b0BciSMPuK`4IqQ z;3U6oYXAocBy#XY!0@`ML2XN*xq?P8s^g-kb+-j0SdN+(f4BAUO{*fhEziYXhpJUv zQUQrwLyODt-=DoEg3G#e(3Np3bkDIcb^kLTMv-CD^M{Nov`)FlKfEvkh7pZSwF)HR zwr4aEL!wnko_N8RqY%I~S9U)AP(K}?sQ&bB4FHZ$IjX>3ZWWHXf8xjT1Mpk7Ex{<)iU}U5jbS)2Dw#LAO~ZddeyxQiK=kmW5;igkYB}11A_2H7Kns% z9a;c5B;b4J;ytg?9)!2@uaOG}OU${dtX>@~ntQM`_$Ir+Xlhrwp2@jidHaR;o_Z~J zp{HW$uLB~wUQsovuvz8x&dYe6_;9g70`s?y1qS9>>mKb2n@(he0dLD=;ZfG)5Rzv( z;%HTl^?!-P&VekSu%BjnU)6{!+=(7!<<1qR+Jl^Xfh9a*R$m6de;{%4Opd3Fs8`2L z#M%TG$g`_?Rvw07&|-Hw3>+)Fcs#?jOOBs*Nn;Yb-@Stxa?BKrCjhzziIyZX+z#+w z%V6X6{t6yvlR(`y?qB~e9bl0v`nLn>hrdzH2G5Fba((=$VaGQ%X%&1ZqQ)&A0`}h_ zaR5%Pj~G2HYIX?%ERy9>2bHRHm&DeUr*!-A5)16({0G47t4N%hklojS`B~imD+gF4 zuRj`7{}wm|jck79;Cg2p89kp{Cilr?v*ZV#k-ht|jP(+6y=4wQI|XR>MdQlVLykT6zANh`fWZ2u&S!NWF~2^KrbPRs}m@vgbWNyc~({Mx4THpr?I{+>EB&>zZ6p26Dk0jy){kF`PstZ!_gYH@N&bz8ZYn9xy-Iz=x4q-+e zTs0S&(cnsnkH$0Jnx!dP`ure&n?c}Et8hN_S|d-?&?Qy%Dq4;G5`7?2 z#8I2RrIt^Ghr|@u@QUD4wzncG0-Mn-(%cf)!R7#mS1I+ubvY`f zkq-Y@pye6iO#PC z`H|ULRQnhN0a0%`{rF#)qE2!RQCU09W`l0XX0y?f5(l60O$7KxIv$B?oIOX&H{aS# zIw0SOx38UI%2(|g^3~#nDc?Nt+Fw5osq(z`p5?*ls<+~CuDVj6zw%|a-%}cpx$!g4 z-DS#L39>hk0&@_O9qLl`GK9n?((Gk8lvvM$EIDeUIo+v8VoS;VUPclv zZo~e5i`$JBmmj!w_0Ff~XScY%FIP3PVXMg>os4gLjjn7pBO6`Qn@hF3>i6PlcPZPq zknGys2Y_q>67|qEuU>g{A)r@|DbC>6Sqk;&a_|1jRIiwYEa`GH2qb+RiA@Euo?5S0 z(1yfP?593GPDRQNiSL}9>BOd=HVCd3^{MW^`T&N6gT?{3AAMGC{X1O3Y;R3fXF6Ai z)@B=^&>T+=9%;}#6nUOn{$;B|7xkyO?>{>N#++ovLju{iBOQ%I8u}VFhTN-+<6Os; zjox1Im3cjpx;z3yU3VSAgtaFTDGb8zKw<+$63#|bb_ed^v6S1pWiNwx|IV)CB0ykl z)ssQAD{nie>IF!{N}$N!3lJxp?fks}TYX;4Zx@p21r9~aug2Xy-aSA3ri&J^44bp? z0JENp*9YKr#gF@bOyad^ps<-c`l1pXT|S8D$leL*V&So~H`AIb?4(i-W6Gbw zPi-(|>;1)}0;FXDCi)#%-MWFOw- z?0-BGf0U%Xn_oP`oobR4j_d40(kFg%GQ~cQzx5X+Q8@kp!d2nuMd9EF>-y@Q+I3=x zP}{q*%R4jU3_N-$5+!&izTpiECR2)2%wYka(WhmcizhfqQu$Wl9#b$qNeZ2o@#4mH zWjRjEV3v4LPrYX01?QKP;|U~h2ryv8f!ZpW(_MJ>9Y{plxmFJu?V}mYIcjxpSCG{Tq}hw7zSy-vV3?t@DG+uc>!_c3=aydx#c5?v&|%FP=RN zi3FUAuXs&BB}vF`0#>GamUp(HAkV=gV~|wNo>6q7c#Nl?9~(IRT(<$vcV{53>@eM|b{X)OxcX9pf7Hr~)s{dNf76_UpW?@%)as zzJ$M=!x5cxt(MR}v_n9`oj+^{*fD64)iwP@yf7s^MZ6A6xUe^s@vQ>4;|Y#~sl?lT zG3~?o1jM}TjK5uLDw2|EF{P=()iH0`vYHK&ROF)0Iqe-Oej=_r@t4Cys4;?pbhY@I!tP^ zaf24M$PV+8KV{~d+O+C04N*hX*Fd|h^VI2wA*|P`*|>>)506(M5$n<$>i@-pqf#j+ zZ>%5o!BNS~-+|)+Fg5&xqmq%Go8mze2xOYmFGaK!>=Sfz##Y#D&g5v@Z_WaF@~h%{ z9)CFvATOWWT>mc>9F^>J+!zx>2+*;2gQJq2>Mivu{I&g%sD!~$sa49tQSbzJpb-?7 z0%-7I=v7(h@b?Eu$09MONsnVVi~E12K&jNu%fNLHaShu*sbuDXt@SE)pZ!oLD|Vlr zuPsIlfPD}sm7HAtL_CN>Ax)#(ZH|$3yDbOu{(yNpJ~RjRpQzV)`zd=?ND<$fvR5LbQUNOfpirBIjCdkXPOX3<3I41n;ggAb zobG5pl^HsbQNIHSghX{5+8+a?tN^CbrQE98X5|YI@_GXQxIjyWo(Ck(m4|6yR5J33 zr{aQ;KXy;0Yjh0KROWXK(gNfU=ygm{=vrP}W#&wp3|zdkez*rlB@4$r9T$wf78sRG zyb2ic)QPs=&6*w zIW%i3<-rLCF^xuJWibtAs=+*tJ1z#0m)X1F9E$tIaEy#fCdTg3QziSM-cX5*N*103 zklV<_aEgpd?SBSa7QD&ozzh&2AK?7|%`&HKtb2e9(BeLl4I`v!bj`3Dbu-MX3MI#% z7uQqx%NYb^OqE%HDinwrF|$NK%q%4e{8ht5DtdZ(L+MAp=CAJED5>P-p#5Tow0EPV zlA-4Tso*+PXmK+`nwF@znOW-Mrs@rO`Rs^TfcPOzO9sTxG7AXVSh{~KKnjbJYK-Lv zTD?`RSkB0(WaHEW8r1sFaE^>hKK=|ScY!S&@M7;qpJm3_2a!?9#iMWy;VNrM&z&&h zm_}C+E9V6xM_oUr;%)>Id7y_&CGK-MC~;kut}cW+btH-)?#m|~>buIUE_cKS-^7P4 zb-t^N??*oakI>syw?oasM*uJ@mcxE zjqXHe{p67@^!GOWm{`jjCqLnfiSA*1;cRs2{V4VfPLyx(#WdI3CPZhd$1l6%^WKtt z*!dh`7}DvKI$4%ST+lQ?)P18H)H)xAdSme}bwaB5eIUv`f7u=tPYb8&iNm_!PUXx( z;^c>PJPtU8S{0S|DhT-U$S^5%DKacwN#b1u!VCZ5{Xcv)5>Cs)2Ebqo$2k*O`Pf)pu!?LQO0%zH=@+hi zGD7^oq4mm*h*W$Z7`!II#*OF|PYqPT!-q8dOGlfcioQ0hVQ|r=s2o1betoT+$gpRV z27p1+zS?CshlSDpY2i~f_2OL#B2Q8H`>Pt>l98uK+O5^7AmHk)5_yVT|98!>E? zVQ6d8nZN$iyK`($l$jzMy+N@WFBoZwvMhzn-gsO@#L~eVgsmlbByw$)%1dpyAmT%T zcoT9<{K~aoeGcqi`L|s&mU#0CVR*4xS#C;W(WIucqjzPR8(ATcyl%xm`o9q9*L_io zjAb%q`PhJ{m9Ak@o`M&inMs(4q>0&g4{1s-=cJOGFmDr{knBB*x*_oPC~91Uz>3cwUkoYjEB+mLng&;5 z9NDBRzWu^SpyFS2>(Q z&y4KTVi(E(S-*YbUQ?}B{G%<+(d;Xm6LnD!LA|1GV{`f*P*)%k=do+id*D7Xa}fTm zSBb?1T2I~;ww@qlZBM3ijW(j>4&*F)Lo0vKtb8H6y!!EvZ2*<>OQ5}7t~u(Y4;8?CF+GgtclNX|^-dLx z26UQhlr+{Nv!sP1U4*mcx5cH(8`(L2eM}7P^{s1U=QW_Y4;T}t^zGBFYsGC>BPUN? zi?)DB&g#SAgbXIZWzz%jpGhpXameKHA6f!-by-uVZs@XxnT7O8)=gY=X*&ZypvNxL z{a+I^fwRPGzg^4D7{bYG2mW#1LUwMvPW#H(&s(y*{xpcibCcZz`C3=H1{}88X60d1 zVQz@h`SERWJ%_)?Ad#8m^$q_*+ttX)yEnvxD73LGy0BS|=|Z_mg78<3bI8xA8{!$~ zWNj;p#$+|l$;wxw+J!qVoRXvO0@eMvAMV@L$j(t4^00!8Vy_qT^8g?g8t&M0lab~vaY2aKu11~lM>+rZ{MRa7TR2`2 zNMOLFwyrVfqaKgJw^HwxtIIR{V*tIr0N>DHv4F%dx>2XgFmL zL*}SZ=)y%NzPL56!nIenu91bz6S`-%H+>DQt!rfCecSX@YItv5BQMVOhT*$)jZ8cR z0QaEgAj-$U8>b50^f9MB)zMbf)|NpS%;+wJEtGDqz1_`sdGPC3-;(8E& zX}~56Yj-pZzpZQ3e*KeiFktL0D-{DqmO}gd^Ar+i5Y+zo{uqFmySz#S#LSWy#PuEg ztw16hzW|Vuk9^Hv-Mib>$jd`d#SCfhZdW5i>vqOa+|0dYB`R)amZGTfkE%E1rQzvV zfcSgMN(RKwG7AXVIAT{UK=$r-HL~$CfOu;@_N#VTYd(QJUIX@uR!a+V(cH^ZbFv+G zT)rY7w?3oI7{hbB8oB7$9mAB$*jyG}L9FH?Mvj_`skj?~L>}nyP>K6o4pg)8{&*xp zeE~^$PP})V?>TWLtn~a~QhOk^OOq42#U@IB9YLYjZf4Qukr z3UkYva->qfQAI(UU2QrVtRvNQA?4NqM?zD68^m-8r7!5+yKV8Y?U}C-7A|87iE5UWds7fHw>aHHy!H#4}dTT zH=S3I4X0_;!1wlV{FmMuMip&4pmA_p!}ji`krHeNBb!?eY@2P4a09ohJn+73pp z?;ADj_%6wIFmnC5(Zix>S-$C@QkCwKj6q`G4n}sb7}NMKza5OcwjJE~7T69( zHfN4SkBrer;`~0G0ba~>XV9Com$(yMF|zAFHtb%!D4E*>H$0ug_kiJ_NOapIdowT% ze`{_BBcn7zR6-NEtQoXk@S=u3iX^NVFK) zh#wKqYYz0GUj^v=;LNHQ_8dj(j+KD~!}l)~V?}PQ5AaOk@m`l#nO`@x7Tyg^&sv`|d^3mZP({1rO0MMa&bb z8`WMo1RJ4g$ie|NuqEdAzhBwq&7Xw#|76!#P^`oY)Bl01jpl-4RW}auf%iS%6&I(r zoFfs~w|p7xS49IdZocr+z_uN$MbE14^V-`|AvwPY87DA7#$=7wWszr1UAE{uUp94F z;TpQ6VohDrDjL*f^_rd(4Jh(bs-zl6)oKxoRONwxeRPK@qLnHUiD*?S)1BK0QdNmMy~`J~$f|VX@4lEZ#k8tQb=|X9b_wIE6!A9vqX~~%Y(86S z(ta%`pvh5Vs()mPIK?%nm$locKD^QB++;_4Td*SC3JKX=QHg)?rL=d%4@kMWwY|oa zveJ~2BAac}H1XQsHsJ9s&M)UT9dSJGe)vx{z8xKJ0{0aYyyJQugtHT8^`4A(M<5Xf zyXO=6tx9*K;~MJ~s21YO!ZvppzQO!9BZ=PrNT`B?8(tqmZ_f`V*J0ke#p~^RlF(n$ z+xb2Nk8{AlAL~c*y87%WgIMen&*{DI7vL$D4VAyw&ujB;XvyZOW&g7_$KH39Ei%#_ zeH~s@AW@zbklgF&X9bjyWA}SaFHV(Ri7<75*TOB4swW`)!{_PZTVzjg-#It`!z>t9 zJwesdo>XS`>QrlQkKYogYDTaR`f?Uo&5pWp#zs?4t7<0XoRjKlT@E7Tbr1d>i$qN> ztJm7J-^UZEW;Y-CSgR?e)$SZ2r93|-tW(tqP@iKPw6sNb0)JffxsRICT6F@_r#h%q zF7!`EqCy|_#jGuEZ2IvvZMT?WPIrwKR&J>CTi99n(Cl2Ln7OrDi*ItwLXDO+>Z&>5 zK8MDXzft)PJkNDI!o3rDc%domeH{Yj=*2gF^k)+?TV(CuH_#6CrnCn)lj-yaK6gS$ z9(h2Zi{@)V?fpgrg4Uc+`EyfH%BBT91ux8gg|)%tMhV)SYVFLl@iTF;?PU*0b^a$L z^;%3l=kljU!JQYnrR>MU95NB+2bvm{Q>J}w$=b{2{lsEXRcn$Mt#y>h;laoelFMrc z{;^Y{65i!DI(Oq9VTSEn(hj}XaEdh91aWk9cBi6Ya|s83 z6*GM7FL;ctFx+KJ%}i~oBh`}!l2t<|V8|Rbj%~PO5he78`!M1qj;Ve2gS4zD)&XW_ zx3%{~6I1CLb&V{Ub&V~CS=R&#=Et|irMMsu>(<7`g*@Fa8ihR*v~(u4i@G|THR zP$!yGOW_N@Jemso5v-S`Mxts4nfUBAvDJ*0)=XzdN&63(qsE~aAsfrq$H9mkT@BO` zS}|f~sgWo~$i};_je`;IXY+T3R&AA$qsE~aAsep)N9pT`{MCUvz(Ft)>H*c*gls%^ zT^wT*i6nm)n0IUv9*_7LX7NETuD?D$J_hOp2f;_E7gT(Zi>3|n@sYn990VVMeo&zx z7f0L>ABy}P;UG}t>^zeiOb3H?rO_XoFU@!`E)E>x_ zABju#hGgX5H^(@fp>s)4m`Z^C2W})oL1xP{={W zTeVu5>RH~|1}6cvY^8pIrc>-RD&evf1)97~8)0V&p#uIXK_jeGsG+x8Arj3qRKSzS zXcO)cyV>4U7O*>y{Lpd;%lZ z{M2gS2&5LOsKjshGTIw>18g68;R|0eWwh$!gc7UQ1cJ;cZw0FHf+w{qi}Y4_+ry(T zGR3Tbw)CiidNox^45lgP)iU-U&RvRnAyt6y(0MXYp<8aPn5AVoC&7?mEW!@j3WrN?=xH*YqDw9=zka8I?N z!pTe38tU-4U0TEH5ml|B7RT?_A{JR|#vR=B-=>I_u0^fk zIHfU(r3@{kqMJH=*cY-$y65*N13}yE=!THhY32rPAeR|NQIXbQv7; zDP2;Jhdc8fZ}eQGF2DTJ1UWCTUl%%vam49@FBXO-i^BoBm%g!Oe+_01P;NwgLS1px!es%N}HY@1xgnf zOqo4j;F(w^?j$0ey^$4X^=+?JCJo! z3ER?|?C=M!w?R;Ptx%&6`hwbftpo(UZS#yfOhMV1Ye89l&9Su<-1kI*pu!8h+HXl! z#iA-N*-xvp$clB~5#QWoN@-WII(s^6dNUcsgdiMoDKV+Y14oof%6HjC`xKQragEvA@OJ$!iDr>Z%%_%~m~BCGkP zpWXBwQ$(w3?oInbUV5sUQ;(lNK#F1K&Mb0yR z{GnIMOewAA8Q__^Z1b8**jaH$lL@u>EM)Xd5mx@Z%IvZU&#xJ!aTaNIxoN>Ck1}yu znO&;7x;oZKmtKEgm})18bMj~{XOZp1Z74y_)_d!~tMKXWujPLx^)TkBnwW*~kj0f5R-UX^jqcSIq(Q+2qq#e=I z|Dq|URVRk=Rdq+_5?v9$fIIHPp&GyGi)bJGKQILBxV(8kQ^aFjV+crj%^@J$J9A*& z(AkP(+xVWiZoyyL(y73U4%SL6vN?Nr^XLC*N@&%bNeO4KmIC6hBAOa})0eSGqRamD zt-wYaE26`r6*bqR3hx-J)mY?Q@8iwW0=MAdF8a^WFb(jsej=b6`k(adet)OkK4{AXWO zCB@|YUy085?k}0><7VBx-c)g=Ya#kM>2QfvtvrQ(f0fp6k>y~-Nq2t96w<03$fAmJ z+uPw!{FIzjWLb5oK%V@nxKx=UBgf2%qf8Ctyl+*eWM)cu=i9hD28k^E z4$?n>dmNf+fAq#GT_a8k)`*(rsn!+Mna<0*Q;nT%dA5AfsZVnuPeky0yy^JR?D0am z@%VBnuekj5jClg!-tDikRqN?97d zmuOzRSWwFGvL^pVilbeF4VEyoW>kvTzV%k*#jl9#Is9eRDC)nqZoWEQ!2Yn$)mrvx zp)!So7_n5ODr6qFWR@dcsAPrq3zgiNY`_R*E70(dswHG%{JdCdNoN|z{&sZNws$9& zbd;=?1asARRGUS1o&%oJ_k;2b?&yZsuFVn$dTZ%b`63gy)W=f3#1C@9jBrG$!idqvG}n;%De<+W1? zG$op?XdG6(dMH-~$9V{M^x-8JS2fLdxR{kVrf-UMZ+MC3qaw&h{!MI?T%#9Z&uDgr zG$ENolfV{kHD)IZi`+QI?6cGCFhB&lk6biRU;Jgx|D}VS)%e}ao;by&Mp?}J=)O2c zSz>@CmoRgIl0d9RSw@ZuhTfP?{k#kucj1%L1__|=jriqg6qT+~xCXNH==`!UkcV5= z#)lzOvW@8y1M<@tw&ISqUUIN>-F$V%r@gIrxvt-p!TQbLY)IyVU}Xtb*<~Rh15>Y# z3jrOuqYIKXf`DK6HejKdi2DBx5X4g#7G&DE$f2F4^qoZ&6>!-?bpOHYns!Z zw;ou{nnYeobZyOx$XR8sZ{*Jtixh{_Wjz8_0tfIkK^>;>&8i!(rth@*uU%@9h@w$XFbNs63AT^K` z(UzG&wi?m%xT`=SD-T>h-}x%;6VvbCc#LPbX7;RT+Oz(=o)X<(@A!<<`R5ZP5 zRMKSPn^0!qLv!$}QTaLZ3*u5^Ve+)-hB#U{{5m%NrrPqi305tfnWX}v+iJ3N%*NP| z;9S{;_IzU&dn8_#SxCsotFa=9IG)@)l6+7|0vpCu=^`HwY>I^wcz+JuNZTPXvecX? z+X?yT+8l@NWT0RtR<@H+m=nbVIhb){96ZP$9H@V>;=#;P^RNYXv;vWXFLR?%h1s)Y)9mMQ6}^KZu_edmhau98X5%(8S(y>H$Yhwd9Y;ft}R zMAFO5wDii7OTEwC9!HtaZzHiP^8x#alAJm(-w}u8`2%-ZNgfE$Su?5mhn|YVnu#441I?T(U1Oj#kY!)zmxY1aziMY3 z7#3xc>Fy4AT}P8(g+b@1F{qVDaxnktI94L1Zzilma(z1*$tflqv_6@`P8vB(J4Ps1 zekd+AyCEMFcf~QgQNE@OxE>A0YIb90seou323h%Oj7X$6YDtlV99*XY(+DK;!2nK` zxX%?j>}CP$ zBrl?qdG5T5A{98U>;ms;3c%l?cW!CoLCru;hayp?#BS~9JK1rKvs}b6ChEL08LP@a zeV+3C0#DwKTyX9+_6Ur{-N8tQA#u00I4PPLdUYohL$37aUVr3+pPJ^mZHJF2bgH_$ zQ!AHrtf{MoI5Y&)>5Rx9-ZOv5o;ZKm6}yg)0;CanhAo=wxlf;*-0UGRiI`u3@j_~c3D9=h)V*|A6zu(M2~gPGd`-CjVn zYtrcF^B_uh_hgdo=^hW2Du+~gO}R#e1&N`BD*f5HYPWt?#d2srUy|%jd6=FBOGhJ- zrSbb|Ou5^KsB*X$n7VuHIfq3uRhMo{tqzeyf?o9j4LOo-pL^BkA^}N5TT3c~JxU-) zH5Mf3p%I!SyT)QKkko$aGs_||$?zZEv2{NNs^gK!(8u@Jh!zaBs&v(LkEkGm*;NVC zDugG)F*I#~?n+@JQ<(#XF19}``JZTPEv?H_E0bu{I}q^{kx;zarAi_>t36O-8*(M_ z!}D%i99a@2HV={Ns>sx&ks8sE>#Dj=x*nnQ700LWRQgFsB4Fl22 z_Aw3ADFx#EA5GMuZytnmadQq45Uoe=gHdq!^y@0=HUY*!QIhG<^D3?}=(*QIe$18R}PkJt=q!5bXMTBl`3M$c%PZ z>fwVmO)zSquP^6Wn>lJ&EPeeHv#La7Gsp>;j{~f~LLE$I!u)rMZ-plRs%^y8ag>1^| z+|2>XW008^e=7gs*%|}(@$GvI{a<-gg>wpHs7)>DT?Vn~u0{JV)!#Qqi(ljftu$kk z*M7T11*pvypYGCfaTL;TMPj`r0X1i96uIl|UM@)g{Kd~y6zwny5r0|+pH{6fIXGah zMld8=;qmuAFgv0r5eS+Qcmc{+5J2`1BE1T@_J|>be*9rZQ_#id3IK^^dF90ER@L z@ZA5~{DBAnA|7r{XRnCby9GGdDU*P2`xy3BryQ7g?|irOL_Q3x$*NPJ{y*NJIT#Y1 z!ktf#dMr}@Zk+O_I|YS;3|!PWv`~EJlkZc3S;LjN5niyVOiO2PrZojFRD~uFZ=bJG z42cT;iJ$bG8Nr2bJWv&y6#S15U`SNx3+i^Pi2xvs2O7^C{xX;WLs0ZgWa53?xEU7t<~1{BA0vekGoHFJqBETR^TLc z1i>Ve4bLT&=H}mi`P1s)l5j)iIGz!~uj{JGB`14;%A3#)iH_s>YggPB#R~?oRR|2& z+9Tpfb51=TiM(uFr%@m<*1n(8-TUZ|qI`Sg0FXOZ=%hsTFS=R_kNvm%UicdyJg+{2 zf^*XCwe1;c_D^;|epQr6z@%$5jv-N$9v<_|52J8&wZYd_A2Cu3Bs36`iHm{4vrJh9 zBYzOjbBaza9JyXEK;_m%EJmro0@UyN-*G{1@HI&+*0)Kk9EXu~WIYy%!2bt=d#yqB zP$-IrzHzmRff{btxRs{^i%_1^6_IR5IvR=UzwKI$1aa2)eWiLXbIgj|d^iG$wvs*t z02N52qVqZpqDYUV{9Vprs>|_KHKRKH4F_ExWnvIcRbo)jm0hx-dVex;>h&7Pkm&v2 zcl_bEM6ls4s9N?NVzF{ZoS>D5Su7HgSg`nhyZePm#FZO8y?))FcXb;*!37Ws|*B<2){ebJ?;y z+k~<}s&50?-;mftlf|!WZW8TMVlBgf#MiGC*beo$-Ylg5#1L98ez`4`A|Ml*gwkZ}NNUBS6?OZyeMw~>X*IKr=+&j2sy z+nm!;)HRPci7`ZCQQy9r(_O6jen$vv=hDJR?pz8qFC!g=MCHGKYm;zvNn9M!%f#Oj zFW0C-q4DyDGzpWZz6@M{Mq(``V@*$>x50hlDu!N)ua*{ATDx><4fQ%oe4E1Rh2`QS zK=?-_x+{^?W>^w{0pAby}l7K2&bS!3u>pQmCQ+6Tr&$n0+l-e%E#k9&w-O ziPsgNK+H=u=1_oLi6D1at8k%KcsWS^0}{tiNYQP@!E8u1eO-6t8RFkudtS*nY2Im<)W^}(B z8aV|58Ww~!@B~n)9+=ENyK{K-z}#Bc?S)P#2s93jG#&wJ)k2foC!QW2Ei@s>Rbvax zdYM_x5yz{`O_*h-0k6O*P84_jMq91!)2j8Q!$J$=OY`9r1dL7Krv@ zjW#qRnqAXIC?(d<7c1O9de zjhPVm8D9mCmyu|9BYV&8zhKDP-K4+~M=@o$utX<3VAN=kyghZmg3?=zV;Buete!7Y zL3FakA!Ofwi9P8=ByxKHfeRdl7E5%+Yfmk(S6QNamCzx3bKu{XJBnABVBqC&y66+{(+%F6??FH6m$5CGgTCVu;P+D@mX7mEFRU>gO52cOIj-IE-xkUFkp(C>B z;ZYE)-X?!lj>+H$4;mijczz20-QxHFgk!AfNOl+2xjIhvgJ4vxW0KWnV-^hAbkmfHg!{yjc-IK>l;RFuibJ+?>HT+Zd+PFn%Ci4;;88sgxqSE7 z;n4%Z!(x8!SnSz7koYceDyuPhJpPac!(xp~dXm_zaT!klvns#j^~hO6xBN<}3tshT zPLV(Y;{2a6MZI-Q)yMMV{i{mV$ChN25!uHg#xJ9t6*{0&UkAI&Qcgv@0kp$mt-1wA z9CxRxGMVI>!rEj^T8&4H_KN)eZ}sqKuNd34uwe$^^1HxUgT(b|GCQSafpX+N-EqT_ zPeb8^aNcugI>l{)s`^t+qic2b&uwa+;4)`KA}GUDDHH-Ve;}a(T>{hECD5Do*CVZw zWR`1=7M?|0!YH)4^B(|K#W%TrzM;9+w(u z@rY5n$?}f6;ZnNgN?%=iX`!QW{{dj8Qv;1(WcR*#U>Wyt!76fFMM+E|SuR+bu*FT6 z7rqiIz6(?|hm1!ev)9!xP|o@L${BQt?xj4_o{w%(a#=wQG`k8~XFD<-+q z$lNLBISS&zz#$6fd5@}JsN$o|-lOFkH*Pq#?Cs@8?RUh8L-(h`_FS8(DRV2G>(~AC z^<9s=PQCGL2ZgX9wG4ZUki~nEXmh1BOCb0O%yzPSw2%ndt{)@I(wk0Qy28)kK75TW z7O@`VE>J;8bGKN7pF0#9g!IjG{*pGfQV|HHqMD7%GXqd_>{s}$#rT#7dEmWNs(d_v zhsh#;;?O<~K6i+%_`!emTc22HfQMk}s_N$63%pXHkO=pANbGHc+gCe>0s&xd$Q=6V z+~VVG2+EIL{ebW|5?Q0d|8uQ|FeKuRy#7Gr*CHXz>F7+d{ZJfG|L3pM0EPqyU%GhG z8<7CGUbRdtGj9P5IzdqX6R*|~N)fW7=rA4ceC3viT7Y8Im|EFsP(bzn$d`XeP;kJ1 z{4*+yw3J^~gROwUm42%Kv)5<}iX0T@w_)ZnXas6<*A<`sMPw;z>B-2gtO@}MSiF8{ zA-MVeOQHfo(4EzbpS;`Sfck&uwF}f4HANPq0*AE|)vy+$q3i)|;9Q!&{ra&_MDT$a zrQP#;J34?wopeGj{^_I19nN8#%Yi}mi937Y5RKcuf8B|ZXvDb2qleD#Y^6xe&g(Qi zMfMb>r{@o42Rs)E$Q!G08z_4{67z}cHI^c)d+D+CKk~7&Be4hF*g#j3t1%2*inj0ZD` zb!tkn_iywh>TR4^t@S5WxnGN!AI3K|wZMh_z}<5i7x^!|VH@Aa_Pvf&GVOg!Zii@< zQ=h7CG)lA%@q4^wsD1Bc%gSU&2YPPxa$y5Mgz;=;m-m+O<@2ycCf=>~{Bf|jpX>n- zXtc%qi&CpaP8Agh8qwO`jX3OlzoKG(?@AEX+R~a7W-7h|mkGE&)4C*c5*I zX!k4<=9GK$(=glNS=tr&E@xS!yb2SlI^0(*ahKS#E_Cf@j$AOCYwzyrNUrhxHqabO z9z1I@rv&>UQS?jk%bxfL_~LUJ1Yb~Jq<9}K*(yB1T=|-N+bXv8{V|}Wy=e{bEC{~Bi?9Sd{o363$#%spwIzT` z<|P{$?t>K9BF_xqy^(DPn1!z$f<*m)7Wx(hy?_o!5wsoz@q?3YgrnjC3pwo;!9*9& zUIlYXH)q_3A(5-+k&eSXYyg$yD_{c<4^^bZLymJEzQ)E=_55GdDP%=SdLS?hH0J-agfxNqf3Rh)>Fw_6TxoGi23m~Z7SN5pq_fvV$Kj^`NegXcpVlqw^nN*Dr*-tI^hXj zO|9a#-GS$iMk3tDkcU@8vEE+{cA zY)a(b$P|WD{dkzQg)lSQu}*;d#59KVv4omdt!95{(}ZYHus^yr)sb`MMwC;l>SW{y zY2~#8|JagJ3Db8haPG!^;zX|1S>ou>I6_X0@>e@LyK{TW46>!IVTKX{{wg-eg!5!< zY{(O5O38*k!$v~chJP%UWMUg|+=ctZ)IQ9BE!ntKvk}@lCfJzW*3PA*X_p*7?UF{E z2YbA?s3gx4t8|U}#Xit%qGi|Zw|zQ4eob783-YkBKQ=Dp(K*p5>}!TTj7Q>7T#$za zPsPSXQ&%b-jiS=E<%0Q10QjpgkcaU*W5ckZv%93_iTP;^J8{PzlpMSW4EN$baWb8? zE$c*=t`ng^JE9DGA&8@?;9x~}JF*)1-Hsl?nxj@POUNrPRWr!MZBNHmGg?|RIOQ}N zh<(kFIVu=pn;{t?8(q8NU_=i52I~B*7%{WdNE9PvWBN03Fyj4e{_f9;5hF*9L)8(o zQNBAqMh5Bt2f;|F2UOz`ve6GDr5}$-{pIfht!93HhFN@&i<|bu$HzdO;2`)2^@55I za?$22jExW34N_P970&;oh9`sICeSA;MEtE2%i=?nzf&9pik!V7we?4!D1EOei}gUA z$skHtL~lYazEvIvlBV3oNJg4RER11(+mvP-JOC1_p3%rr z!4QFIXp$fw75guA?#F%NG=}%E#CYPrAkKr=g+A^72_Q48tkDklHTl&=?It*Bzv+Ej4ibZ;&WO_J`VzMt*D9;p+9 z`|byPfbNecjeYxjq_Gc^t853;+b-YpkusO=q&YvnX2a$)Z(}?T1fZ=TK0?qP2T+1nd*E@F{+yE z8k(%c3saLEa+#XsIDNk7vA|CpwI)R+e#4j1-pU@3@yH8bP)D}d8_|Ult9}0iiupw( zF7Z;07aXir3BTfERQa}tM_**}UEvz4q+U%`vP(8q=^ysa_Z{bUB-(7K#qzOQM0+b* zK$BN=E&8A-qSYAMGmkCoZEsyc5ygcj&Z$768tWmaw=h#+Lt!jytKv)jUTMhsw}bwwO;bPI#N-n z(vEEm2X)M^ontTp2fZu)Oila;PTt>KtO9EVK##HHw_4xjXeERyc| z{mFYxA?@gfkn>Z?41zH!DYY)C$Bx;h(&cCW{OjU$865v9T~d#S&(T5_smm|F^mzZE zb$NEGhw~!O9bBsOPW+<*hkAU}7t`K=6BxKWbkp=ROfjvDGZ0fmv$K@+)E^8EutR>EUy=u=cjf zfLh;o`snwXYUNZ(3pYthN=oV8< zt6n`k?YjfSvzk+jfAd8wvYK!D*-hUuMYO8s-n1{|kart|q#qjf`1uB{%Ob1!xzLy6R7o7QA4?r1Wh7N3QT zo+-l0byt~PHsSd-O&VvBW|x~5eDWw0rd%}XMQb1@Q z>eJdSvJ~7p<2ye!wQE%haAHCVV}rJUQ-NyUsLaW0wVXvZZ%6d>zi7&7)uCamrT5ga zw0;4J0f?!_ZN7*IKwQiqyW{fa{Y(*$agE_1d30%&!pIvnpKA#?xN1~8~x#n5|WDiQptoIH|y^8gBJ3fbhvD) z_MBR5x>jqlNXAE;bmx~$A*~pfg%Twc=U7q4;!<)_k$)+foQJ-V3M`)uLQcj4?A1Fr z9WF9+QJ1=$ew`j^6}}s1Cm!ZdjUdafkHd#dp6H$D;7Tz;w^D_fC1jV^xA2es8`ZD{ zNH{P{OlE+6%l@rR`zwVGn!)%F5u~F1l&tzbnVA$Fe-#hpV8e!3co5PLdIFo~OZ-~Q}PaW@zAPenz=wOqnEmQ2S%%MowmoJbfzbYVM{Evq%+-vjYZuEz>!=M5e`=Xva2P5T*(Ec=lnmVpgF4j;-}B!)6(~eHE`jI zh~zFH*|lFHGcCO;Ys7Wi!o`|D_NxzzCW~@q>%uGwa1$T5mBNu;$^mpPuQQ2od zn_sG1v(N$c2=9!#pZiE}L4(y)-^&eB%1gCf)clTZakO1tn}xHtMH3cHgH_uV%2mN} z9>N`cZ^?zb9rIY+CywcxV%@u3qWP!@j#%>VUYq0^JqmkCvty*;$Q-6HE50KxHGU@x z^LE5BexIFY=K&(nl|<8EHGVgz%e`HLO}QJ=z?U8Am9zI z$`SSdQy_?^E-c8j=i6IX=~~tWk)LKk&6>!-=bnyZ)-5;Z0#12dk9V+8B1TZx91bHZpeR%7yTwi=PLDv+1*-Es7H z{OQil6)TgO713a<`a2^>jYBa*R-Olr($CECtDalbKvqOsW&+u2M9<@{0*S2LzGtEH zRoo}0_u0DzUZH!AcLqm;KvbLRNw#-*#)mw{2HF?2vEdB7Fo%XS#cSW#kd-gLF0LQo z?_?x0w9#pHzK;9EOrBR|*&AM^F};hJs2}FX`Tr$qr`=*LM?-shg{V<^5Yh~%5lZuk zZ%&zo56!`Ej-2@gajDjhGM!u29K#NK{5p2|$|GE(tCUr1XJ)B@XsbLmTTvbxl2k`q z15O?(B@!>oEF|RPSFs|AJV01XckMX=5*@OZa8&6cA79-s7Ea**IdFq*hs4NIbE0e~ zrEjpWS&(+t8ti-qk^GrSY)DhWOEEQto(Cb zD;pNG(vqw8h}th76-Rp{-KnDcIji<4xfmE4_HQ&l^i!maRKB*-|5^{5$3QQxA$OmIKRpLHZw6I#d&-G)X zormv<;7{i+@`FEJUycPqeDGtWH`llL!Jo1ZEamT9gLE8!E7yUg^01PwOlKE7#@kcf zMhGbH7wDZ^f)G&eMK)uRD9z!u&1ySUB@}bVyr8)C({TIHbc7lY6 zbl{zk#$n6ytSp6rnm_OCp@m`F)^TbdU={|^&v=m(9)~6;B9ViMb2SF+{Mh$AOvr3~ zK6i0)n!3mVS|n!+5?9|zzz=)?Sbg9309M_7%jgIIV$(R~e-epRn9BdJI!!?CD!i8~ zg7byh$41GY%3wF6zx(A0K$wI?3YN^%Fc9Tn-_vmDn+L6pfPtO8+G9>ZAPdLU4<`uP zaIIP-GVn_u!jNcH_aC+AvS=3kX`G^g6x`J?v}pMBuig{Ys-h&xF)Av7>fcGhp8(+m zyf>%=*dD-xG<;JJUutZ2ZpMA0oJa8Fs8th0FKKp+2e|mY*D(%qgfqoOw(NQtf%V^a zztmEOW9NfCN>wkSiHOb3__0Tk*c=mf+x%t`b0BdvouP6_9Dj2*#hvJjf6uG`_0eqc zo$6$_7bZbfAF6t4lP-EgqWawY(eu=n?x6ae;GpC&D4+HlDu0ZtF~H+@pAZl@OuGLo zZ>sIyVGOmYCB4facH~7qh=;Qlt_N}8&-b45G3Fll$6v?-7+?GC5*6ht8zVh2r1b^T zZ$)C|CaRD1X{K^l?!AoSpTGE-3dI*jA%fV+2zIKeCI{!O)d+?}r$7GQ2WCffHv&O3 z_H;q{3IYk3v~FlYxZ%5PDqwCF3GE#?`%(sXQRRpX{Md&uB+Ai#^@pl`|Je}I$qtD? zO+rY(XRp>I42em|r;oVms)%w_*R76TRUHS_pS(r`7!n=FbN_Gi2OL z1*cuF0St)>eL>xhH4y-WRYB}71_=rS3Hb96!|?3PJ^3+&8YOb@^$nVbA<-zUNnaQ> zM$*5erhMc+d@7Kz%Qzp>f*8txM_=+7J9 zeBwm+Fqh|?Y;-3&>nD$N%V}Hk;+S$(9-r`Z@M*5M&ds^$Z@>I$74bOSI601IUGVF- zYG%pF_)VIZA<@h}f9;CfqIkiewQA{7SfE8PI!?C7BaxS9eH7SdA0Ib|DQ-MIXdcjf z7?bULAN|qs5h&!KkM3~XXixRuyjfF#jrRLq_!}QQuRcQfbJFd#?HRcSknDi`swk0w z#W!jkL!u}>Jm#4nM&amc!=ky4Q(OxqT#q3WUjz!zWMvi6@IgG!X*sp9e2ZR<%B=}o zYZZlJrkww~VzJI-S6pH1cZ(Oay zD}~!Q`U-YnbqbrYacXl9k!(jg8i`u_i;o0>8~1$$doFX#irjoS0*N-IJ_P_3NTg!R zR!s-C$n1L%8xFcY%EVBYZcD8egL=C5lMOWzAQNk!&_IU7NZ@_PAAU;&8{P^}8xXvJ zREb0yF5IR^0`uaeVlX3tQ4{Mv8G*)Iicd+GdoF>J8r2h#mc({V&5-Dc4(Wf_-y*}5bD%-Yc`W)O+ZDcmeNGLjl_y^6%niHe!}WV7=$?h{KRoJHcdwsxt7iT?13 z;{sfsJt1L;5}|wmn0|`Hg;?@8y1!Wz?!+a1`^qMJsm6I+aA#uGvSoSv5VJt4Zv)xi zkk~_$#Su?6i*_loc1X-fden@hKXekPSR+ezv|2!RoZv%1{2L?=naS(_0r@kyPh85_ zRQsee?9tqY&@$eTKq_pDIsN9s1P31huD>ExAd%r$cfz*=_X)Qz)^S*Yy-h~596Ey+ zAX-;&?%dLTMS<;;6LY3z3*?nR89wof>|SabZ2VEwJ`Tv`~holAk> zWhAb3k;%{PY8GBEiHjq8miSxWBx4_YrrG&E?h{vW zCwF|T6oN|0-w?VcwtZ#H!Q0U%Z54E}OQ zSw>q8TO!G0XJJ~GCFNUi?a*&iRJOu<~-KojP8R&qo_cvl!A~3o&YM<8-k1Sey1l(w1%Y-P^AVs{tu?tFf55(NtqX0TMOYfKYHWd7FEgt-0y!RYV9T(W zBj9wEBm(hUO#}nafa%{M(O6HG{|4OO!F^&?U#ynh0>>cBbzdABStGJ%`?7Q@Qz*~g z*MaO6qzOo5_{EVe&TgXZh}WgGK(rTYw4vG2>;h*;j)QLkkE*+5^V_3_N8PoY;X981 z01zvC92x!Q=$0XCj}tQYMO|-?^&*Z_D*4RRGdLb|l%jiv60F>VcI>jK_JL8a{ z%piS!3+g`+I}Tq3wwIA;cO!d~XSEDjyPFg^B5aXpVaW^;i1|Mdd6#++FV$#}-<(u6 zJVt|3e9tebAZpqAkX+xFi9P8=BxKieOnyRFn~CmtzJOC6H_5~OE?|R;9QO+YO?$qY z4PgGIzK(ae;=}W<$o0gyUXW)D)uBsq$W|^r0ncquU0zTN<$oP`R1ZWhubw+RdLTGV z%+DR{FSbHjinwQ+c~Q4A7Qs2_>=E^yW$3I8uJy8<{pC&1Gk*U2AS2*<~Drc>Ms zsH!~G)HGjL`P}B^34@M0P@o%NTDt*yvwp-HkdpEwJ=qTxRtfaip(0j!I&4ry|K8N% z?7@8^9k1&`o^E-y?v}m70s|l=+``*%{jhRc_&d-Yi$peOyDiR-h<5#uaG6`Jr%utx z=}k?NC_3l=s|({Bff2ltBHXconH@MC8kpIceY)w}Ck_pv2~?Jwjuu`V7%8e|p-rED zlujIqdn)feYlj{8Hf^BBtr|mB%gJ?O-LROX-#i zgLUbpg^tGk2Y{JQ4K#j{-Lh+1lsi_D+bT+863KGM(u6H;y1ej}Q1M+Lq&Z|f5}ADg zNVgI7`TNW9EbagN$wQ>&?(Nw zjcx_3dJGpTpQ=cSryS>ee2?o}DsKvcke?@u=MbxM!?9&=FF$I(BSsv$Keyp-|LO12 zW$tm#_3M86`mRS_N3bZz&lHa~q?Td73T~>AxH3Um4!cf|Q%_U*t{+o5!!4&wwW$oY zd$d(7&2+A;SX5gj1;mOQo~C7mh#x`@n{c1_l?zWy%aewtsgs5XVCly5)xK2`2=qi( zMxMlr3GOt!kgP}p=xO4$9}uf*Da^gISEpKgd)Oe$>kjd_fIq? zy^TRaPKrkJr;zhxyfEcFUA*??tWGWM%%sACei6^m(Spi607b}CsQqEF0fk=u;d@Rs z1+9QATF}WtFtn8eJtRaN%9%LwHfedSblFG z@y7e5x+y5%dGXxG8p_=fkn2rnZhI<|%(O0F18}IAQhsqSUiiw-Dl!yc6KD< zczns@c`C`s)mp8Tk3kqbG!{waJ_Gj^wXO~&9MxQf+bPvN@yG8+@}|)i&C{*;WsXdU z@!Uiw%-U4x8ntN(UYONhHdlUas>ZS1D_HCKHF13je`zfs#DDlg zVz*c^Le4pK@^({5)@ohl*`S(2o+4iRLW&CCv~($)A^Amdsg{X){QPFE%OYE*4}Wd> zv!<98t|8_?EmOGhRGOp~&%RNMSfnO5-n8KdrigZ$lpPV)i&LH+9dTF>38xmvY$=tP zEz>?$w3vZYOSHWDhB~FdY!OtC%J;tJgDA2`z3-XPy{4|MdQ`7CwDh2gt<*xRHh_X( z@VM4?k!?Wrfu9YO+e+6cw*$2SJp5P0{nA3Jl1ojNZPh{+S#tmLj-HR2+O#UULO^+d zwidGncPzQoV=crSgkkf0c)S9MC?`G9qRytoE-lN}E_62KC5v+klBQCA3RL&vK5;VrKP*vosd2E{ldM4~RM=;p zb7m*tu;ghtav;Ych#V=)5os12xp5r=g6j(L7(Py5pL)?|KqIPKCUP0nrnk~RY$n#Z7ov*oAaQVfxuiYH@Y z2$-7E&8dzQHg}YYAu~?}M)+p3c_cf(0-F19pE!m4{w*2GXokFfIX*);LY6)(3z9v{ zqp?^u^hS;v$q#UMED|}{+TY@QgGkPzLC6w`tC5@%ZU^wYh|z|5m zY^Ki=ul;r{J7a!dTs!cW69Tex-BT^<{73u2Kw9I!C!@l zoJ@N<9z@Nll{lTS)QCd4YD8+BLw?G4#WT)nNiI#ntFdGD>eiGvj3b&Qt8q?Nz8cjo z+|k}gj&=jp{kTt@Mo%islGmf_j~BN>^RigR)EQ`az$vUQc5;&K7du%D{bFZk35n%Z zi+{vIb`E<+4`v4pw`Lk>9>??akEAZXgFNoSJHkcAgwgE7!>${vQyQNvILicEZFzqkq%W8Fo!;+3v#o$!tilPLD! zAIF4bVa13=s%N$z6K3_yxE14k;Chlc-8>qI)qt=Dvoa%Bi3NY3L86xs*_gin zA~lsl98=4FC2K0>!TJB>eFjU9{TGs&%Q>t=6ioh^V-Cv8`=w_3LL_YuA4lzuH>;|9*Go-nldH z&C8p-3TKGht zO0_l8sL-1DnAU`|>RbVVVIa6@46_U^49AJ71$(x`?Wxgd!YAZUX@Jr%?;C{%@U_m% zb~p_fNh%z2?FF+ErGMmM5dgvHUoPBQU6ZMj3I)VWQUg)lL~7%80J$G`y0zzPesy}H zIhj7fjw~3VdcG;?ra+=z?ms+YNOB|A;G)uHNNR&u8ZHbbL6LZhT z!sxY}E1@=i3LxLWG3I>2&y}Ri`8aKf?T686s~Bpc#FM6t1OGk=;`9~u@x}fa;Nci% zjPTP}DP{~0l*}WlP;*x{jLLz@mb(aIOc$*0K|`wf@rzYP2rlWN#v(?FVAlSP z!=FMB^+3NIx?2?$+un%U2MTj~wvW|x+#LiW;8#G>&1WDwo7f;y{&wZVZ51~*O+(jh ztLf(B?nXWp39x_4&lTahlW+{bMB4~t_$4wO-sf}5N73Axe5sR;`d$gs=>|W=$w-Gi zWq$h}&}bfyv`!EfJdr$mbyp;cwELvJ`wmMeu{W1gN^iwjQ9#_6!4{KqI%INB>)!I5 zds>f?y}k6yvj^ZQ+_9Hu59EotJbQ?J!QLvx>Hg6nY)0&<`<$tHzfZY$FUgmLZ73k_ zveHU5>z8A!%Pd`UGp{%I?EP}vJqGa5milbhJILIe~FwV1)Ne4D^O}^C15!@G=!_#V|bfokU}}GT<2Ao==$U8k)VN~ zZ79t!y&c%R`uTHy9khiu9E0sWLuo;wJ&WLf3HEQtacty43wiF@x$eE6eMGqv`^y?O zo`xFjI4!EAQTlgH*I6^ilGZINP(3BBfBlz&_U%GvBvCiFKEZJ#EhrplQ5%=cs5D$T z(qt%9VwOELmANY)CuU99SDv#b9H;_Sw6Ve)VD-lxr}oQoE#X+ps0P=6GH*vvF#{Cs zg7`AnVfmt7=FhAYkKi~qBi9xDSymg_EKu-hsQRnNy%vOu8d})c1pfDcSmLRi{#``gjfeJN_u?w;IYigLQv-`Nf1GqXV#Dg>p08rJWMP z5j{<)RK|T38c?L6{j*$x?#W&qUtRgT%z$*c;Vd*O0qW<9*}B~1sH3RLO1Yz$Pr+h#u_*r1y>FRW4aXYb(omZ*iv0&t! zMt_<5I#{Fy;j>@Pct~ArkfL4OP7w{8U-@6MxSiS@yrA+>T-=`Xf_7?ouvMudU4H-< zv{SQ0$nn1&4}rDWyPy#u-W}L_$mw3z%xUd8{=ou+xjVrOl-k z+P~d4mm|hkeQmrn*|;vAyue>-x#vU=TU`Ey(Gjk5$RLPMwau+?&v~c(n*b z8C-HjrC=i;d(eVU=V79^G(qO!3Mq{#a*Wm6;tdXm3jZ-djl9t}A8bvMcPzaiX{tQe z9uEr=rSUcO2{?Oh#2Rg7T4iG5Qy>bAXpVqd9G1}XgkOAVVTK)tO2Ji5iQvsSS5}HexR*e} z`~c72;76`&{S`l==cG`?_>msGF5fOkPIQ2X*5xC3hqp9ARB4vySKum}TT1xTkf>C_ zX}w$(Tn!cQ#+f@S#mSGSsfe8A_S29EEj(1q%OIyFvc1@YYa-`uY!r@nS+dl(N^p!h zJGUxY(=AmISxW*+$g1c{a6>Us3jYB)Rpn-`tHBn%HYuNbU4~$845_aA8?S%BWN3m#z^qViuXDrs!HUMm;JX#pvnQ8?vSX#s`T+3O#xv`l_F(HZ!0s%iS@vWKl%+65f! zIZ!;`cUgk%GNgzmzSDY}$sO~W279~k1&GDCj( z80#8V{m$p)1i9Pl&-!%VubGUEbDxwE%jwx=v}ll(Q)7DMv<=S;0`Z%Fb6JCpG%ahv z?A-VCS67+roM0hULr%r=T+0bTY2yfW#Ao=M2x9X}*sO-LXTrGn!4R}s-U%%)ib~SAjqlS?dmzWdUq3WYk2j=h-!FpR|!BNYj{{i-KEa>uKex5zZ@bEOXCxoAxz7K%y^G| z`u{pihKenuYGgdS!0L>L3M_#LMpzTi$M{pCp;*K|%}IFC-2deF`kS0|A{w*5tD=`m zhE&}}vFvgg3SW2q``iCnXEM}D-DNVQE7ILyiKUE^Iqpd<9Zc7U)YH4W<{xh|)5&5& zXQM-3H(ZSeD3+UDZo-cTwr)P{FD5sgj0a}K;r73%@nS8OEs)4SiUv%KeoBj_IJ8*q znR#=w$;dDZsT$e0NS^ELD;pO+!Jn$UDT#YrCc;(|E{TbdOs<8V+2qBL0LkHK+~G051IZNNVXtzF$hxwv}@3U$Q%1B#oTA?7UcZ7PME>7@a6yzzw;`{X)}u0MtTEx zoj+HbB&zTN+gp{Y(@NOUzEWchzR|q3B%Mj(d^UdC5HTGm>|cE=R)iWEPplXa}U&UVxZJ;kanHV+YJ<{6J0>qc*!Y@s8Z>mOZPg>e*4 z%!bD|R2Qic^%RptHSdM)V)D-6$N!|uOfsYo7M&V#$-V|q90*d1e|MP-zXI4J$<+_^ zRer0|9pV(rkR#KNUFo<&e+>2V4IfnfkcKQ2HnX)VbC%X3S zq{|}~CgU3rI0j7FKb8izGL+)0V6jWBjKWEbm%r3qINun&v8~HE{oxH&wkF02XbZZh z>^-yb_cKfui!DPH-m*uz@WZUE1~`Fu-P~idYeo}O4D-DobsNKPzc=lMEE!H^GBxy` zVv@iv$?Gnuw!is{+?Y&XSx|~2@->q=Ru;EE`sm+HNrtK{(!~cNHAnU4fQnj&<67NALFZD08aQRIa2H2NY@+b8KffUvh09Q<53VdTPpNy>1&iF(wKQy;3V8TG80nQj+h2oE9RC&*G2q zdJ%{?f6%My0~WWELiv2}Dz%0&{KCJKHH@w=iW4>SfW)n&X4dwpG8Q|8?3VVZxRun% zq`uLh@x+)+>lh{bkD&^mCry+U`}Z>boCu;`4nM3)trPe_#I2-uUIC{2fUmpbq%!`) zfsI>9?c8*Dl?t{JzITxlY{jhwFwMjHodXoNk~+EMh^h}<+)8R^TE8k4fF*o)ASD2c zt05g{GPpJn>8#RiMQ4 zIHC=iI@)?vm5PoPK7dh5bS$_0m_a6k0fn+Nn@MUcjhXWkLlI;Bi>^TAn9mA5)?kK71{zyJ4u_lAFN2vUs zlCI7pKg3ZHh~oHUX#|i`Voi1vq?B|uq$hAh%QH1Jt*ol6F)T$7h+9dG6qH8=f!(ZN zZ4_HZh1yvYu0uXT?)L9#{NYHN8h92E?!s}m23gUcJRor^sfABXj|v8CPgwC8tcy_g zHYpf8MOzj4SCt8BqH;!58R~$-wiymv0VrlAE*H%$YghEz(`UlK*z15^q-s)0T38S z4rts;YU8@O5p)erAO|*XCH1myUc`_NY}`s}XyW_`vYQ!XvYX0{nPf`2pfzqh9#L? z)v8Sz;is}v%orXhnMYR~P-$}&yZ5HMjXihiI!xFuU`&wD$)6ftQOcv+A{dt#5hsHS zOQ>;)k)lE&PQg(jhu2(@@Cr9Zv{#Aa zp4ZNEZs^K$@b(}Ozw$ijBpeqFv%UCId|k~|5z60HrC!1p7dbC>)!$XQ)RB{FuF>rj`azfE~GC@`q>&7o61t34J0Dxhea<{w6Y{X33c_6lT59LMq*i#d%fBB>5W zSu9jeIeM+JeL)_!E%#zCX=!d`bx_|7?o>5E$Ug_iJ*gV_@LB)oV%(Kl9X+CDY5vR^%K|V+pGdW2ZV$5)i2C@Gi=jtU%Kcs*`TI;5 zSSc$VQ2zJr>{&W^_pSPt0RCm8Qnof;yUxHs`ET6SvoJLMGMO1eV@rb7>mCsE5p^(W zx5m&T^3fyxFYA>_56nlZhei4S+vPvfx+&Wp*48V3_0dfHSJyPO$hG^bf~5kUyQ=3_ zu>bn!t5}!E5GTGC8;Vd1C+cwc6o~T_RLB?h=uDM4Ff4)dVGgzqP#5?&f1MsM8WCLe zTC#dI)=bBV=s6Hua5A~}ajl_9i%D0Sz+287njy%oT$!cZl_~2x0mbP@hH+PZ1Cn5e zfReasZ`B7n#41Jf$tSA*OG2zto16Ecrw#4Kwzif>*+b1Te{ZseTXMj#-`Ts>b&AqQ z6^Xid&LLK*<@Ha(%ZJ!=4m_E8ke(&>41p&#_Vhb&`up-mcu_W+?}A2vsO$Qt4mo{y zOITIvddbs=M9J=ku&UJZoc-OEyAO@9s?_e8&s2Tj!>UrR$3KguL#(-)1FSh&+ZDP+ zx2tun?QABh>#GYET$~8l6E(HclFtIwE1*FjYV#jJ%Hd;dY3soXYQM^IjKTXyh?2Rd zTv+L%tE^d*cJ9NE4bK6?dmt`fq4xgvT-ASBSXDKXLyd9*rWle)H%-x;wwmpf}$LLjkKIa+$bg?*FbpIOuqVhnGv97fGXMC5@E1) z0@!qBjAQ_|VtMWk5EmqDqZ^+RdhU)usi+{0Q^Wib#JPA*YJ97q@y|iyoX6wMYhS7o zRk-(Yyud_x{sxW_MD$HcQ3c$vdVTT&3~v8k#Gm0H zYUKA3q46xR?ItvyG#xCMNyd@v^#I9Zh1KGlIFC(f{Xi_*rFM4piYC7u_(i+a&XV5M z%G3N1UbIV{jPFzZfm^go?fe6{?q(Sp%dJB~cJ)$xpWU&HUSu0w8x&j8HfQ$*N8!Zm z3vzwG5sX*p^mtkRIAW!51~v0^-|7$0qFw6b`op3@EQ zzEt_J{HcBp_0xEGH2s{E#kIkhLM>uUNmqf=i*~7_4*U;%(5gwP9h34ZaB)gPpVx)jH#{t-Y*Sx_6C%R?30lys3X?Vnnd zNDciCknY6g*r+Zvdu!$Hj_^aK3^oqWkrlyL->c(Iw#grmU5bKfar~dE5q|!FEZQX-GfKJ#QYwrCwrH1< zJghXT%ymE(?NSS`0D{vpAL@&Csf}C8^ib;1UbIWStS+xUbQkSX6XU1rVbh_zXqQ@e z6F_c7%Mu&jIx6(|?_;_lJke8M(by2&1`e}~HjoY)=E!2CJa;>-Oo~s)-!u4^omEQz z-WgG7z*u1$3?Njmn*b^j_6j;11^!h)DE&)jMgYWI>)K5~%p^6CAL6J8L~YEQ6+t)A z{OW;Sv`f7dRYVNwz%JUQhJFV~j=`t-Ts`NL#iCu`BEg=sP?!2R0yC0dhqhv;&?P3MS+plC)TJ(d z01(|C2gz7g8(cuTZJ{ppz}ewq=pvnaM+L5Pf|yXt=2zR(%&%c#o;}I@{`=Qsnwd9V z1I^y)pJsN~>rO)=>{{?+?ReIiX}0ZP?o6|1cG+CEtK2-)w@Q#!(IQLR(YnLUgM6L3 zK%1w!yHAs8x; z#z+F>wHI*hb{u2vFD5toc@qJBs#OE%5lhTI{^E$U z0#JR)v0qS+e4h$-Q`GdVsfZ9Ca%IXi?LIG-T zIEFy4QG>f%OLOZHXIVOntwEOT|2t!ZVQLh>j=vKhr`e(vnDeP)Y%{X!22ou$7bo`o zYTDsuYAH2e0n%}xLJ&2|0bu6cFQ?;4dcjjpSAnG4awEnQYCQRQjB|M7?AxDv+%RX!$^+ zpq+61vDGA>a&u%pCx5iYjsQ`T4OeMtqI`z5J9)Ug{@BNAO)e){2A8(~mdoY2xM_OZ zNiJ=FA;+nh_vP0r-$3WZ~Wr5CbyvsNTrk-d0~NzuSRL~3iumf zcO;09z38%x70S5?__LeqZZ=t_Om#Mxf)g_vOq1vCw3h9ql3v2)c$20mA{zL(E~eU) z6y%aMFTP%vP+C2Pg9!H#q~Vm%@Mc+$mVWu~pTBKFrpK9vZ0B@0Ptj|~%u@>z4%}q2 zG09uE!oI16qy%r_Ip3zz-`|&bM4q+yq&^G_@B`3x0*7?K*_Pz@>iQ0HW+Qw2=tD%aP zks>&^e^22LYgGzi;y!I+4qvM_=;`B8cDwJz(a_kGVHP=jty{(f9SlM!ZBP^M0tIVf zI6-%}Hp=4-@#YLL!fV4$QRCQ$BW6o#V$YL$)*`$!cgn1VM;p`Y>N9K@P;43Hi<&XZ z7i$T#e91h;^mtkRlrE@;E1rr>7np{RCo`Z3uM0ax1w)P)s0-?0?$eR!V!?)ZBDj1P zTVZv<^inWT4+Hi`hGAi2QwB|h$H4S7hG%ia7L+>p88EN|5F6J82kn$eNl%$r6knZ; zH?0j;Mfe`9lcYwXN(MD?(=(BkjK#Id#)fWfGwc*K4y6%lqv6>oG-CIt$~tNMLTSWI zQX^3sp*AKy7llTg&t`7^Le*79iW-N~2(|GZaCCnevA^0`1K0(P_*y{KAE7q(Js(AX z#72_22@KUAaT83@2X(Rgh3NFrStHm5efU~Ir4Q<&^2O-%k+~V{f<8R$ph7`i40|a$ z6qy^sE}%%;5>gNS#FEHLd1nns7jl)a1ng8bR7SydX3k990}qDiL#o8TDcug z`T$zttygA}8sGCc;uxODZpvGt7Se_v!>8~ek_l|)VB;YUB8I+J((J7|jphosb zgoD*;_vS90qQ-FwjtY4O44hmj#$h_IH_l4%N30`yEwN`QuE}?2DQ<9%d9$t05-|wp z_u~a7dKS)W@{sV=Z7q4iI%Hzp>>uJa5;d;62q9KcKt>CTab;n7Y`3&8+E6_gb2o8`qbYq&#fT)682Ocw@0SEi@154F;(^ayE{O&b7vRvP7ClLU=4V z+z&I?evq6uyJ(J^BX2|wocY83zzI_WaYOv9 z1Y;cZtFO>rTNLbp8EWQiF4BsD$kbgR$M&102d2rd5H}+oIu1}0=O4C2ndT7>IG5Ro z2fqKEJ57uCNXuv*ig9AL+3by(7CFxGaQ>24NQ8DfLj5%oa%M}y z+fY4l`(A#}F(%w%u%%mUVmINkk7cT)G#Rg1N4@Z}{3#}hbjK0h#pD~8msE9`Nrvc= zVeJ)|NjI(FUgnV-3y;KfsK@x-1CmDT-j532U%r}~y?c5`eZ{L0;NU~^(QI#Ny@NJjJ981uPe^@`n6l16oqv5he~=J)tNb3F}t|7roq*}8sAc)KXDn&aeRC0?kTsMjD{ND zg3$%Zx_GkGtvyv?q9`w`(BjOoF!ed+p`Cjo4qYC7F!N9l&g@D>f;}lV*1p zn@yjcc2Aetloh;hJf+yAB%kj#HfQ~`Ut^cq%rxwyBpc^wY3A6f-#F?!drUS%wd(Fh zqPD_SF{c!V%+)OBSj>0*`kEh_EQTuP&alttvZ;zW<@jBf(Hx8U#Vb$s)JLI;`64vw za8NeQSgIdKQP#}U;>=Ow56|4u^*D^e>(q?HLV(s@$*w3L6^x8CAJ}z`xL{rJG|exMj)@e`QKHR4yow zua2W{Q0H+$QPmrTIjv3enPc^KO!NL)Z) z-Ei@u0+YoPEF*K0U(?jey3e%#&uy%&X?8oTH{&MFCKTY-b}hsltF}jWfB8L=!%$V5 z&EfP-82n*u|*3r$I{(+&i02)g@-ELi{cyMKJV*dDXRpfS+rI2nWKeg=xhJkVDedP z8AZn~DwbYi$GX%kI&5$&8<)^3F`OuK7qmzk_e`17W!&ndzj&f9*jp`B+h-?cvyOk29;k!cc0{5F$$e*TYT@)?B&m@+k0aX0 zsDtJ!qwwe~ZERe(z9zX2`-9hKPzS5btW9X1G&L5Lr>K!Lc1Dq>I$O&TDo@#oY3{#= zqZ2^XLjJBLYKy1vfuc9+5^<`xM3k+K*RCr~VlVLcyvDi=D*)-csdZuR+2FQqlX25* z+kC0=ru^;4zg$~NO*{)ccjLHwJvqx7FdxyG({m_WqLHG+z<(YE4FXXoTX&4u{?MEA-pR}85xCJQ&Ij)uUevZfe61f z)h5lmvu(BJy>a~pObV$2nZf&<`ABCf+eO>WRQBR@1BNeIV6cCxlu#2B_e4@k8WYV} zde&54-&C`zp{u2Y(k6c#|EH7~?-vv_q3SQb`&Yc%{cU0yT(~kV{S8-t$;34GDz6ds zzQ-fUYx08}CNFNr;rier6E3g$l1)KGU3_+LB#2s)O^r#|Cd$^_pB`I6O$ zR1TwlDxZiVhuMBL!I}w`!|cQ~_j_kmJgU#)91XFF$An<1PQ%KqkH z_CpQzozyh{s_vrX-vIyj;ZAH~Yd5y=PMuZeR4~CfLbdR|R5hN5ar7Y&b@9a~mk3U0 z#ZKr#(EbaxK8n0OmdxuLhgn98!dB937-={%yD6U4{i^>?Ev$ViivIib1RD=10!>M< z8bbBo%_NCU{!}lE@}KZ@6um6j!LlbVgMozVWf>_d7&=Y?weff0_&V+&(sg*FO<>Fj zdfCV?2csyqj11M8O-HAff`NK?Xn%AVlHC@kz{Y^|G={x6qE(kVxa1j3THzQwQiZqb zrtCR5hrZcQc#p=`b?xfBG{z|?1>LO}QJ;EWU+fyWzsAF$9&MEQ&7qRK}Lll7Ta zSQc9$%YsY~T-!f2YN7@n1%~b)HO;8cSPnvsnq*pvb#2|D?6*E2MeD#FSk#ayI2VO# z9n2&(64fWC29~}MMGw}Qw~`erOL#DvP(4_GvKocXbcfg^K#)p3jJ%!(LRGoEBMqL*=0L;{+pUV@`Pj$@Ns!@C7u zqI-jTvuHjU9?iw3X(&gjw_X_?U38IGX5KF~_ zIF3zi%_2-6CBQd0{`YMwa+$_AJ^kK zpXv*fMA=TLkE;upMqr)mEDla6+lem% zj?x2lu)J3kIm-TEXKhU=J(x*qJ?y~|tw7Ylu-;1}umV*yO<%vExx1`DPHLL}r*OoD z%+$i`;GgdFu`ylP)2TtXBfeOb6-}(><8_r8cKzk(RyQB)&6o}3IC<_ikZyu}PX1Is zj2gJD&(a8HcPg3|$3NZ@N9529X3-HL`Dm;ZewbUgO4iX@)8& zlj8aZZ^J=oba&nIpJ`;@lIvO>s_nKN|_>^l%N% z?V&jLILj(a4&}Y|NYwVoN8LOB-H9bClqJV&h1vsN*;k;%XY`Mvuh410)lf4={#dK3 zmZaPZkBXw6fhXPOL~U@s302S7i9z1>PuVdk`TgL&`)&GIanad0x!5u~I-S|{b$Sj0 zq30zi{p+S>kAZmkJjefS@B1tOfpZktu`bcnka3DW6ds+P#-rvS$=}+Nr4h_Q+8&y) z5!o}_!C7m9sTta!%r2sO222wh*uhp#Md99F(m zlx$n(i_n$2Qz}1p7w9B@aF}JUVDjvg>IUgbw^OSA7T@pYI9=qc3OF2}-x-7DO>z2dlLlM-gj1$`6;Su@lzPYF>VG;;-6{JYxey%F(9>Y+1Q6x% z25>lzPH=?ikE=(5273 zR<({9TgX8uwMp{g_r|68-Q0@4@Z16&ZqP18pN@gGlO z9jCkQ=LtX=2BHcsnWJGKzQe&+!_n^_(G~y$YnrvMpn^axd}QvS1VNkZRgFXq#&zT9;^j-0ISqM73^~{^oX2v!&_$s)vCxzcJCa8K(+5w!IAUBw(mxazWb0E zP5zX_V@T+F9LMszu)}?q+xJnH(Y}A=#n%?+ZFkN4;0C{v7Q|7J%ery$9T2Ny!oGCD zQgJJeW5ekNc2MepQDzVA?l-@5Z7Tbsw5G`k5TS|>MLpL#IK_uTrusx-5H#;bgLHM*{G0h`dH6Hjq9~5PHy370Te_t(n_hTrJuWDHXwmIR&70wjL z_g(g}!ujB{|Ns8DN`>)CWuLAlws{HM?**|8QvuhuX(b@u$iYYP-fw@cVh#FH$S8ew zh(1*#QwP=U8bOb!kq3R_zUcw2ibSvoi`F1~1%V0}+R?KhT=}Cq6%jZ^33B@cJHU?0 zN7TU2T?joQ9~I0wS_L*pg^;Leuo0-S1{HAQ7OjLHG1j=@n9D8;$VU}T=eNX@n~{rD z`#|wuxK#t_5#6gF{B8F~0|3YfVr7jjGS1l^;9vty1r%-57!Fng?P(L9JySf92?I;A zY7{8{-?;quh(_U#=MH-;kpCuZgrXY-g@PLR`W0FWJp#pz*PW+AS@{d|JopjBlZzW$ zlC_NIq6#$iuztHn(IX1Pwk1_$npp;G0)!J@kl5X>(#lP#;Mfaa7w(`Cq(K^WP)d=KBBLq;}Kr z7w1Lsnz{vv1~zR!28{qw`tx={3pkEVp~G@?z0@(vvTo_EZic}CUqI76-4687$C=2d zmHm%*-k?G{`_TyD7!lm^t*Tk-2v&V!QLBo8tRdLFZ?VB(}p^D2Cid+jyTtbaK4raXkT*UMetWSa?=g40q+5SnRTaYOHCX`qTasm!}6`R#Uq+ zUT0hA*p1}$KkGXJKYg!OXZjh@18jCb`rjQYew4qCqcda!CZVv}yrw?UOe9Z&hJz^n zw_PNNOnLAN*bkB?tV^#CA(3c{scJx}iie)i>gW*-=y@l9=;i7Rm%K~%w~ z_UQ(6c9d%9N&|Y>kc#U9&|qF&))2NUJ|_s7zf=WIwJdv5tENX(;79Er|E~ZrPElWo zP+sdOp@W#Y>tgbb^87xy>m!%U$vFaXe9og5) z=k%J>H=-rj=^NF_juNKd_xppGVUl`d`WQ6+Iz`xV)_~?s5NmUar|#*c;yE10R=1|F z&7-drHz?!%{!_f`-E4+4tQhe_G+zKFYLb(c)Z&c&@G&IL3j;J6J&u-qR#Tm~m6|WKD?$#N()kb5qqm1sbAE!KKq?1hFophfmwj2i$f5tUB z_05*ksoy`whncfUnfE0219zsN^h?0{2M~Lm)b1J2E)_4}ICc?N$sUwOu~}=_hn6vk zq>80^F0F5!AFcNl;QA-12t+-Pd2XqA1;;U~HPWt3mMu?GYk9O+%K%Zkj>FHz^_OH> zO9{_Az{nx%AQ1H{o?j{_T4I%quXa#${4uTL6Ma}4S7)c##??UcI%p_}ntUCo=pPdM zSiqET^mWr(jjGs>%8t&MB{chCV0jzFl1YvI_=Tn7Cpe5<#?{`@X)Vj#x zmLGfxt9XgIxiwPbYL=K+Ys|hlUN(aCtLOa{vBJwv@?SyhIZ?L{h-KnO#Cl19BWA`@ zOGz;Wj{o~huS~c#cj}~?CGG}|+qd$QEpCR`y{XXM7l8C%pb;SQes|t7ITnhw^$6o( zU_Zm{V}vNx-j{$_^(3jWtMixj*q$Up#v*cS{p$1!1O4jNPXnQw?M3|snJB?GVwf)V{5xonzJv#84RvT-3I%5QJ#1zSt0ej0aU6rre^DU zEjuJyV|u?gIqSEw0*#$&j8}kK)z;K)b?;ni>+JQLYYi=Z{^i7L2+Vq>R*ey;}J z0a5h*RW%{oj|15opur$&xahED;zgouh}QWsOSB);Xnmuj=~<4Bgus))qslI|Iq>j9 zqwIzp;bSOYkH9{vAFZr%)abu}xTjj>B-1E>fiaH!dDnaan*9ri6B*R%TSqJtFXK42 zDO&4embv#LoqK&2It3xy5rcl-z)PL}tluGoH){nu8JW)m@2enso>8|C9=S|TT*a10 zTRUawRn_TUmCtl8b(Eb#?MH#>Hz4L+>hZ?@%hcRJr0q-wYzd9cH>Q^iV?&LWcnE;@ z^FXIGNbPMpswZo(0d8tp^^*`^4vzxc>mb_QsJ*&r%MO~|jdJDpIsSJhc>-;4HuC{t zj#6t|B9#s$syE1Qtt>e-dV@Ar$F(Ob)w1>>WY-;tE$I*t zRl0@o?eQ@KE^_I^2ly2XynGgz@-h3vrR>!0jIw3o7sR=vb#4!^v0kcij`La@D-uu@ zT*X}zOO{GbeGzC?zn@y3SZ?a#4( z@CKtj2af~CDtmtg&8CstUb?Z~))p20VNPkv#miw!GObzy* zacJb@`Pd1L=VG6&+;*U=u8&`wRSo4n4m_#_qAs7Bb!fCe@UxhoJ|LvO z*wOF)17n7 zb~U<|Cd(dFV7rRoV(}#QEzhd7G7H;}1Ff=-Q=4sb4-M=1V(hBc6fa38Yc^+B4+~+w z0@SLGqJA%$cWBg63?!AUABlVxILknspQdK-0#3&vaH6m}39y7M<{A@muBKB(o?`mc zd|l+z5Bmpq+5LHp?FcS*TH5a_oikuUI|DkSeyqy3IlTZ!b~}_^A<&OQJS_5b*r13m zU$9KPgyUEuTGxdP&GIJQEIS(tdO+H6v#-PT%gWgLF3@o*o7&uFEfYT{+N}q0Dw`ta zhdKWD`F$GhbDQ)qDp(2?iMsfv?DUQKPba6ymw=fKI2{_u&L>)R)fZ`4nk*~&6gM5s zJhQo-1G269+!ugV>7L@hxa}b5J~w@bsRK1`RT-*MPF=^_4~bH~xOsEHE}Q;-seu-+ z7`dBTUeqY;5U4a|~UjTP(-4=c22uS(8--jpu;pJrG-BYH#SaWy+~L zM@Qc*HP|JmZWn2F*<752>4OOK6`(!^R0yI*8Pl^E$3<8+#_pQErmXFK9!&$$z()zS zf@E;eVaWOKJHIbtEd_5Jb;UAq&r32ms0_?_!Ss#j)HR)rcWE5tHy#4fkXkg%D&}`4 zm@z@+OGR<{k`PPq80X$q$|Zblku_GnmcMi7juCms=MOD7rts)qT*vzIp3?F>>m;$g z{a5ci|L8jisw5btR7HrK8()KkD@dY($$-eoQZVdvQm3h8xArTZg2f?ty*!@8ijTUY z)yc;7MU`bOP0fw#jZjjzArV?vh+1r4CU)UC_Lc>2ObUyZ(BAk4mzAaV%O1-ga z_Xxtcr|SCuI16xO+{`g}jS)9-GT0jHrXh`>XUKCmd{oJ5n0%*iir2O@vr@Kyx8e`y zVF>nCmrqnvx$rskswpZ!iR5#XW$<|lP8_U~&vEkH$ES=Y!{_AhZv4w`A|+Y5LrW7y zF&8ecKlZU&Q<{@3gUiV{F}XZfp8L48S3UV<`Zc`Bkq+hgZf#cY4Y69W_qcXgH@I&O7u@)*D0Ez*3aIK_lJWB_j5ZnWDFp4(abOZ{qwg? z&9ES9$ad~_Ay33jbIY#<2?uU6*_h-l`MU%Eay&qwCA&1ESQ?fKqh+Iue`7LA-ZZ0j zmT?(nX-LPYZJ^>k`D4Y)eh$Ui22LHdWWUaDKVD{OAHr>Jr4!x6J3HF4XXWr2Gd5F_ui`@tXD(crc? za6bTvDf1@S#g0L&X9*}3pePt(7)1AcFQ|!47;Ea zUu&rPCe+5)pN^t$V#_ac6Bud~=q8w=59(s${^<14StHm5efU~Ir4Q<2>NC;lBXcv@ z1$}thL4|_4$bU9E6qy^sE}%%;5>gM(14UG&yt4+R3%M$w1)(lJ`&<-A79=|H7nGg% zP)N)qbxD67M;xb9AFG~+-4MsI30y}MvgS?dn%B3MZ$ZMYBByiM9o*k#$6Sw)Ib1e- z?Wsd~BTYUkf2uX4M#j7lMQgYq!Fsn7B%xYEBSi&6u5O}9g8KL;aNLXI*cn_e5>hA4 zS|`5f919Y*2eEBo2v!R9pq0|O*}_azqfuI+M)tfIjaKHzFYXLVNUi7;Q*cltSG*Jr z4px`lo4a(18pkO(Dg;p%oFyp6ak}XSPA~9Btp5X&(+yuLaHku-ly4vNW<~yTaTLz) z#tTgJ-Mre`bi+$+y!NIB#%j|KrcH z4Sy+Y^Y*P5zx1g*t1ulZ-rn-mlY=wdZvWX0*mj3+zb|Ih$CEY5+O?ahBT;F~P9Dp1 zS2pf7jorN@7vIL4-3#;L>r<|!Ou0CZJ99Df76-iH&ic&58=ON@S%p(kMd#XcNE`B< z+<=@w8T_*PvAOvUNIa%-7L~27Ns?3AK?i`CnRX!G$&7inRYM8nFt%je41t=Y`y)KI}@hTCL`T26E+jca8W*4xezQn zcHOCx9Zaxgo(a=Jz7NmZAboKc^sli{5ekK$$=arq*p_>tb4NyMnm zMUvP5bE?|>L3UL~T81Qxabil6{a90y9Q=5;xmFW>6yh5$kKv8w9&I1H;-@MeX?R<> z6k_RSXGI737vifR)^il&wmw>v*q0_3Q6Bfm;VVsj7g>fVDOXdJ?B|%Gbayi2bs;ya zra6*Q9N$;77~a(4k>n*CDnDVe7;0eR*cs1nsjpopdE`H;qM#TzfzNOih2bBdvNypF zKTHG8F?-kdd9=Z4io<8`lDfJjYq4ZegH_p^K%a1V%rSd!*(_L+GnRQC3J1gIL9Qas`a&0>x4>MHM8Ljz#g%lH}UYZO|f#Qq?x6R%`U6ox~rI7Tw5cZ+W9nm{6HMv zQlh_c8O?Egd+Y8gx0{TH8sCD^1!QON|T(Hbb@W{$bzkP&$h_rFilT&0>zleAln9`Ju^TsABF6`+Q!Gs+d!b zFSv~6Sj;b8d8(&A3RTRpaJCsfy`~vU_24PW4KuYkbJY05Gk0{o2fw&xqlZN$ND6WA zEX`t$f*iBs<7y8**~EtuBmzhH>q|Axpb#H+xy*5#@#^JoGFXDG8v$%YLLo1NW6 zBu@UL>IvdpFkADPV?8nQw-4?%`3zN0*ltuoj8d5Y>^4S!@#JXFXdoP;a<6bdqe}CX z=9lMaiRP&JTc-R_?UXIcVJOWbmSG(IfjWg25q{`$ML}LzV7DSh<&M z_I0b2g@@7{Z)rYrwD1gl?LQk#K8vAOt#rGn=rJj!!!L9E@2sG62mEYsD;t;2o6CG5 ze~Mwg_Hwr|JYd>gTeD?2g~_UfKcA|)owzP-)l$t-`-P|8@imjlP};XMC~_+zOe?{ z7}`5-W!O?8d~<9j3Eu7Bckzd99mViRAYsQWHj<(5Lbi2v+6l}T4i^1CEX56W{tDF& z+KJh$<6or*>fl=)k?28k-bvtLT{?_fBH5oU}&W$fs-ju)n_*X8+geHCpJa^-~ zdlvwfHDGSS4&@wN%tP4{jTCJV`1euJAP{x(nJbpd#wJ$8s1zafvP$d47b;dRoD4=V z+%mMm9AH&q)9{#A7rwet_)>Hc=G3~pNiG1erEaCMeUOmnaD7d7$pm67Bx`9Tho z7dPW@eQ+@em%n_;rXZp&uHP96qLyS+V-mIrID9771cW#2LW%Jus}ZRjM*S?=6-5rS zeQAO<6Do(MLKW3XXUfM|3WxF1~Wrayio$JE3({=oaNd ztq)(Y>C8+2hFL}{!j{o&3~f7%+ZZw_J|Taq&rU5|yr=Xu*<@i6|e8Kbt8xJT2 zO-ZmyLiOLxBo!#VXqlfs@9`*lS+av=Ph18A3DwIoQq(y1;fOZzZ{IB*fKJg&%TplF45_cCHYersE4N`#E@*_@{zF@o;>!#c{TNklbwYm4Bj-r zDz-vnKzcR+{JR%KZ)xga`xDE>oj8t-;$|-)dyH#!`Sxv-MY+wb$pj&k{Z}OiKJA}E zKn={<7Zn1!ZwD(OGy;z|xXMSA|4~myRTdT|>oYA_EVe@CBblC~19#L!4Lk=7G$nTL zsA)!h#&Qs9)Fji=ysMUivj5Ce-QH55b(oQi>mgHcE(+B;m`Q3Rs((%mta&<$-mEi+ zB`a2r34_su>Yw|Q)rgc;fqEIgKZ^E_pLRBZ4h9pdy)#nOIFx3nmAq#n(u`-<&|olO zHRDNEBYGJ}MIdVBM?mxdj$@O#L3qfP;}YF+oaVJ(L5}6|=9>Bj$M}%J*g*S&Ha1Mc ziP=q@D$m_+VoJJvT>f6czav4^&|S|i7Z2h%HkDDOLt?s2V;UcTX>NUDoh(HeP|@_J zQBA>#iE5fWPlL)$nJ>tns^O@oi=T_4hJ#G8T-x4HB{=7Ws^QEe6%cKSr*=x7j|>U6 zbqw4+PjUK|*~T@j{eH0=M(&Iug$^F_pWhj~_*Y1U{dgSJL5hVkD_`qHHJB z$F(m;VLRz8L`*2#i7z;e(gSty(U+pgQT7MBb(YFZQtM$4j%Wp<4n~U=5m^Mya-h3*gUSkc5PKVDavKHj)2c^ z_d5%tko~;Ijq%b9)ln$f+lguJAI1@FxRiUmR}^_Zvvnj?p7&Tr6z7!riM^xXJaeG4 zP@H>0oGH#J@1I7(IlWzjb9*SxJ&v<#{+sgtOrI4ISaLeCM1`{Cc&$)-kjvR`pv0^C zM$vERG%jh8Wi+(*1cf{8Z8yAbL+cMos%lBf{X>UEQP04WZgZkGINyY-XY9lvZ~Le0 zn3Via!2Q>8Id)2Gc&E(3aLHJ4(b<@}*fQkLUXR()87t3S`RnxfnEWXWl>QBeM}eU- zS(9jL$T&q`Y=yv})3X8KUo{6w9jrTIMFew@wpS+XLiWsdaCVwtBB9;M)P~=)$d@V~ zmOnMFp+3&)w;}>BNabZ(+nCJI`3yC_G?P?7wDp2oc|SrVwjXM+TDpM5=h`|Bm5AOUMzW53Z`epz zPl6k+1Se-l9iXD#5OVAXo&e(G|AWVG#Br=Iy*$&%C6jWogA(|la;Y^bivIQm zo(xnwPdX6@2Jx2IX)6@TDp4#tbH&K?qChmg^)-pQ%KG*3#ukn`_krkpPLQ{hXpLeq zKpM`Gz3h)*dn8QP=i@{ed6cZ9up_^Ak4CrN^v%5VFt9^nB7t~|c1!?;fs(H;?O7Q1 z?H!;NJNnC(-LN|0A|8k2hJdJpF=ZM9dQ}Hs4}+6?Uk=d2f(_I`6ByqEqKg3)@Rkbz zE(Ql5z{b07MhHrV<;13A;L-TWmGR{NX%LGrg@13kRzUh9e1HprxM})`ApYaY_4Uo} z5+7AVQw7b_HH;onLm&PA5p4l5uzXp&2r3BF!r3zpB?#J5uWBS};NLEU9#O0II_#y7 z2W!C{t12~61>c?7v(#|ITW1B;s>n%pryONjwe?g%pIM!?_5SwV2*-CH5~FpWa`-k9 zx*o@|{8oe|NK?5*(!P(fjQ0H_FTS=oFQqaoX+g*oxtbf?eFwzqn6NiitdN0dV#De2 zm4@T!tFuvNPwnnEzjSRX`=Yd_$%zG_iVsCSWwy?GJ)-zrf9(>rhTY$mcseDILHHcV zQ26h-7~tZ3P!!=6n{1D-{1@bF>PunEBwd|Ns8DN=58S zWuKlTdc3k12v}~ZfY!MhMf!3ZeJSuL;l1DfT7?z#qmTjl>}Y(d7N!o$=V=5zqCFq< zjr*ntv?LP2BCJV+@D&6qpwIlC1>wpc)v18LDN3ksz=o)H{2Y~!sDWo(2t6Vn70fwW z#V|;Pkf>>}5vcJ66|iH0Rzi;$U)*raWtRoyql%{UTjI&h$VIA6p!kd!~3I z69$%Q)j&`>ue<#Bhz8=0=MH-;kbmsG;4CjSP*4N6wrMT&2oyJ7cbrRk*2wQ#&+(hzoai1$ueKQ=0<-NaKNA zDGenk3{=3Mdl-iAPkkvf24AH_9eiVp)f)KYW{mfJ6-?3 zo9+zAM~mV$bqf*=Z03Fp8Udp8XKq^|zKP@56#6Dd*Y6&qrwa6jHN(`L0jCLcGw00N z)7t*WJ8w{toc)!P5RMVSE#IoKpiYjwLhGeRRI@K{TX$=aUeJLpS-l#DW*JzIW9mU5 z>g8D%1!4w7r<-hNKfdvupPw9n!tMalwU0pqDE@1sqo9U4cE$V!j&d*Nq6I5yP589>KeE(a1$yHFE10);cF7%DpBxA8uQ z=#)a$m3q=Cy(A(rN{uy*Qh(Zi;_~$1%W7)Z#_MdW9J`L3>1Q2B;3w|XDlF{@S@Gz9 zcc}1C{(6nRjt#K!U|~7dXEqZFCv}H|DE>EGBnUit@C(%sk|(T7uMZ)SXe;S608j*? zD(>2))qy2G2Oq?aBen;b7%CEV@lDdw!3Rl4<`9i=L|()u4Zq~f{&G$;(Rs12g^Qtk;ZwFcST~!nl%}G zDpNqJr-AHWAhy=j;(vgUbyTdaM~q0CEoVfs-?vq)oC>RHs0{%bTQqY1Ouqz_e*m$| zOuhbY-wN>pkzd3(TL&c%H*4Mc&@zsaL@I5IY5f8H3iiGNT>k_WfvDmCd2)q#1;;U~ zHPSv=mMu?GYuUF+GeFd?gWc%9-n*4!GYWjIUBt2Jg{>@gcb z`W65FOs(*;ll)f@`%KjB1<$PzKO)vk0=!7OsnlkPwLxPY<<&16%nWgbQ{lQV0G;Yv zP_xUPKQ#IlZWkd$N%p=34M1 zwlb_cS+%x;j>v{R=q=!84NZ*>eQAYw9>=k@(U#y07UHCCcYQr4Ppp@$kb2$#D%Ap0 zv&V^*heQj^05eU_+On)bqZ0)s5+29@=IfAvs;&9Rk$Ec*iP~C**paiwS>ktJ0Ae*p zpg?-%uRJ8i2-r2I2Ac|m8VGvc0q#G6XsoA}{|4MY#Bpq6You1*EZgO^x?T45tP!!a zeoZ2t%vR6N<3RQXXfTKx{z<_~@gmVSMC&=4CEAZ^w7${N^ejh5Lf}c@QDv9fe5UZw zD7zs?_(HfZ0I{;iQKR?vTG?amagu2iz`(dn{w|040&xBX#2FcC^((zsikER5+Z3(c zG0WV0k-(;hGjOrx(bi5G zdRTQ9E$CQ*=r@{69c8Cb`%z%}4TyP{dR%ly~15j!Rj^p11-p1t=V^0bj#J>Sf)Qf&dE9xw1ItnX`rdkvNQ{! z9tT>^@^HT{>iSzpt&~eOV%6NQD>^%Rh8E{S-QxIm4+xBH>Cei}B7c>Sslg|w<&cjl z6ehs&e_nsNI6s>e?pc=Iz&t%4yI0szRuQ|Vtf8hUyM|VX)EA*$HIGR!_m-^evGbT7 z=CecWeFa!KdgWN1O8ZPHMt3-lt%`QOAVZFB&^g*?H@7_jtLx(zXH{Fdj{}ctji}2{ zmK_?c5j-sBrw?4|FT!*m#{?o}F@+IJ8qfI9UYI)RLUEM_* zM<>h5J;gOgGcPy1l*KXI>Q28(#|@=#>U!k7Lr&je>OGBHRe-8wQ`ZCL9}*>dar5SY z9YFnkQ3EYrF>*JxT)5y+$=&v3U`1kewmoq71z@IA1C3wQZa-_Ka>2@RSw**)L{eO^ zw8Ab}aB=ptpYmBCO#M;E#LV$OjU|IXy!HmJ?ZYwL^$(V-=qlZYIfg$Mdu7duK=$EbckO>`UHD9z@d7^Fqv9|rw27N)} zs*A8X66$vL3&bPsmbNku#q-D6&o7K8n=prlE@u|+INk)Vpwo-E5FzzaKj;|m0dlE-HY#wS@rQ`O|o|FW=c;~+V9F^dG11RuW1(DOY+0&bS4hy&OlKg*5T;lw~qX& zgRkP4H$DZLxlIP8T{>^B&Ac0z_FN>vnH_3pCZ42~yl9wp1~oLnj7zKDEiyyX&c@RN zK2k6)bbwphG* z{i?=>w72BNC0NtPb$#s4r~A!YT(lSw-HR5-llAl<^8cLg`!DNrM%-;8cSVaD5rJ1< zR|f^di54P5%|8f-_{;x!h#wF8>O=W}eYMbi09PSI`K%aXrhpXftAh&EVZQrX-T*h< zf%>qw`vB6Fmu+_Pgk_OQaF!?b?Ac=<_I3^n+}G?w^(;7$hc@e$#>Usd)PMr!B6-LZ zQ0w8UWYT%S{h9;*ecW)s^AJ~iIVtpUdB9afO_ra?qezf4&+Nm??bj$0i&t&=%BzM* zKG)B#@~PD4-zA=qu~(lYWPat5J}(7A0kM<>Xuj;8ZLB=zU!K3yc8a6|v_hobV!Wisdwm$v87_&( z-|2Oxq?@cW1?jcIg_6E6&Jm;w^3D!iX_y?y9U7mO5@TSkZ{@~22zRyb6U z3b%b&(y(4bk>*hGa={Quv#h~lVcvX!MqZf5m$%Orqzl^?NqV#ObU_+nVP{-eG)X*u zyKT6n!+H%7qz52LQd!|h@j%D1lD2O-R*>~2kq6O ztYfseJHJc}&YLaH5=A1}u|SM!TP`*gOpxd5KF|3MpW`!3gYWa%KW{ls+}kl*QcTQ2 zcYTg%?pP$Lz?u(z%@@_J3nk6nQY}aqZnf$3)^h}@K%5~d-g}<7cI$9SJl@%{MAGcM z(l44>pcvvjXYd=kVtKdZOl|10ZU!L>Wvc`)` z3SbU){+`@xg7{mn|#qs5Q&iX`z^UB9MasvvzDIwQr~Y%1UdM~^);ux1V7xr$U!K2&XFq41B#Nz5h1fns)E5pDt9pYE=UCn2bG&|U$0SJ) z=C2T>cehNEG-TT(L3*j}B=McrQ}y4UBY%*__dQzNUsxn*SNlnVw5G$RK^PR0&T1_Z zm*y|ge_8gv**0EMQ{jn%^pmzCNe^R4SkX}=iO2uK`=rC$&k;Abohr)n&K6%N7$r%a z^Ik=-Q8rnK_|S2x_<8Fni~?uC^ZG1#%xmhr0?&|#QN5;0`sB7Hf^@8Pyre7IM+wsZ zb=Y+7)=`4=t~goJjaMuYq@(jsmh?lh6u#_B#emjfVp{%e{r8EyrHKExRE%yvUeXP% z#|u)g`~{Ng3QiWJ+gs;LI*$it&U-mCblgUq_JD( zOFF*SMAYLGMMvQrNmp+v5~RI(gC)iD&k|o~oh;62I|pMe`#wH0a z6yK{uzR_A9dz$J0^+&?bAHR-|Uzs2DA+p z&0BHL`O9mUZkZy9JWw}S`y*+UHC2$7Z?owS?K1@Felb%LpZ!wd$zn^#IpVS{r;69} z&z9%vnAdN~8zbuSMo8juOa2(KA#akHnmstY9AsuD-2Q((3%lg7neC(?4jb8)}@lF+D;IpliHU` zdZO)YQDU7SiN^xN??GG6*MBc>pNDpBp7`CCrIIiWD{kF#h9n;E>T|lJ5!PvF-%dl@ zdak5V;yjep^TekMXG)s7ZH^eWrA$m{ogjH9=B;8Ha4!_Y`+c)YG- zxp)?T{{@+~6;2mlEQm?sHJKH1CI(V`7bo5SE=)dRp zIZlw6S4bDPRY}x=-kSEol15uGL3%rXsU)!#`5n~I zdY+{Jv{eey?_0-7daX4kNV~Vpl=M2rs-$i0<0Sn8eO%Jp;si5^0*E>Up0 zARU>1ilmy>j|fRyhKd>x-+8U=BQ`nTpCGBJ*Qw&6!Kt zN%3Cuup8t&F|2Tjq}bN^n2MY)`TkkKDS~uSM~S3O9TnpE{AzJV`$X}r{K1lVtgdgo zVu&DZ*)mSt*!xtmqn-WUV)3!U$zpo}`w7MJI`8uyukqgazSG4w^NJ<$`1aQ6VrN0I zBp#PoNJGrff0q}`5Y_F)l6Wi%kv8bpNb5HICGohb*Cg@jUhd!93QiEDi!rJpjp#i| z(vrei;#1g%O8p(3KTMFQyGMFeiNCg=E=CnpNa8WC4cjt7630L3=$y7Hv`1Bf{rcLi z$B0qZv0~)bV?|{i`o8%?#o2Ac#4&9rih-@8Wxuyy$5`>(*3;0xDV2Q>_9c(ZpCumM zI!hGy9xuM%F(wQISp zE1uvu-+2O7=v58z^|;tK<)Z(!etbd(Yyt}d^a&noX=-j8V=smH^pmPn&VK% zRNtj^3Cs$7hQToN1Z|gQvSTYDnA&9h27Y~^x+#O$;{s=9aY+ii5 zEB8&j-Ne{HVB%7JLg~m5ySQrUtG3cR%yaX>E9@Jao8wJ*ZKr#NoVIvgys4>X4YR`4 z@&;Il(?W_1pY~jEv*mU2`izFgnr7g=(LFOidb4?1W$4@FMSA^-Va%s2PwtF~13ndjz%`{j+M`1(~1n=8tZ-t(RdwrrYf>abEB zH@|1xl%DN*ay?^7lbrxB`QCWNegjK?0rXXUGPcrD>Kn!-Us--r-dfz8WOTbi=`>!_ zWS{ES-!+~wVS!g<9QCjge4+QMq4mD<&XW4NxbwXN(a(2De{)F64L3IqPq}C2ts;3B z8{w8U#A{gH6?-mFbZ+Tb*x1-GuO@+9$tO=yPtI>_u3ueWTO+rcLq(SEIupXYz{dL8 zcxke6olIZ?A8ct}i|JPP?TINDy*%K;Mn3sss^@}RuH8~w9`J-+Szzb5q(0;_+$?X}+Xv-|P3~Dbd0ooe<1(>(05hiz-fIujlkC7YW;|(6#xUDPJbsI*VoBM*VHG}y^<~$ zepx-j%9Z*0X3qsD_icn{fXd*v@d4;%9VLR+_Uq=k;>+FnGEY3@eZY{_qux6xBeLz? zgUe-%2<$G{LLS(suIf0!s2ly)z^~a{eNWy`)W#c1Tbi326TtVf?~>x!Dd$>tujuDg z8=5Cx^5BX~NzVc2zs-$ZAf=Ge&^I!8O4WI+~L}NqC`h?R24f0&z z^Yh}m$r_?>ve_T*p0OCsZLF!2*|11n_iRO)FN#wxD#4ohZETvSRMwi{+^d(JNPVJ` zDKBxWdoVXyKcKWT)qBOSoN4;Dn`z4Z*L;~~mVJLi5MyZ(aJ;6A7e z+XnwN^|DVP&F*u|oQI1|o(t|dtl??Kja@8Vj}Zve*sG$f#uXfB)5C5)C94{>KGjQrIx z9;~TNHu58MPAEgO+#I*7VqWX#zvii8>5O2%p-M}>bUN@{bBmOxW~48Q?>U{x?PjA$ zKS2>;sl4<;BvvETLFNeB8A_fcfzd@uTujHz zH2bNh#-!YlIZu>(E+}@)%7Ydjdy~+Tx|$6zQULy3Uc=~ZRZSD?`Gv+Qzv>ZlrE$~A z^-F!1_>R%Ku5@l=RWNeQh3?r{KOYUoJ#G83n=QL;++aR{oUW`N&CYcxg?!A-+jw}& z{AFi9AhUcol!2gw*X1UXh2jcztfXgiN$&H+b*VRP&Te#X=<4{(<~7ah&GIVZi^A5l zuo3ZL@?ihv=iN&XpxI^oy1d;GZ;mVb);-=UDJHH5y!V;KAM#yFdFN66fVP0`@m+Ey zVk%|d|7Y**!=ozBKH%ApgrGsAMhzG=Vt^n)0t5&cF+hM|14IZPA{9cikZ4F^Hc_;w zyPFLJ4Hgj<6)U!&sHmuDX~hVry^w$!3UMSbtz%$cvVXML{skN5rK zxw6+a$(i4M&zy7S%=g?Mic1v5ZZqzkWRGHzyK8%GL?@FS0rlg8rH))j^IE&#j9Uwy z1Dq0WscVocgo8Fh*;_N%L!1mRoK#YWRU}`yEF`MfZS~2BOsv=efjM+^VkZ(UrizGUQL^~8V zV!h=uNkcn`sE8}iI0&>vr?Y`-;_EP?vi?%1jy;qbho#eDLC+Fkt94BByXyOTFAlS_ z+F&xchPI6k4O{l9bYLeQmSS`>tGn1~k@y*fySeU4WHHB)-CktTeeN+y#?HiE7jD#~ zeVXKKJngp;>suW#XpPN~iT1IBZj3j2K2txWNmD~hQSA@gh?V&fO>?%&sH=2iR*GYa zialIEJ8s7HXV&8YooMk|)JpyPV$C2*FG$3RRn5*Em>xFG0z7(*bTEYI42zgE#_?&@bgP_Gcu`h3mkD#eN(y;(-G}8mGvk|XnSnsfiiEawpV8*=?Z1ZLi553)sXf7^x*bL5@2gZb* zHiash*aiSxU)ADRpC`uMgiH#xI2%ZNbc~v=IVs*NDAez&1vu`r&jaRtnQLESzu=Rr z9;{@L{D23ni^=Ka#cJ}PW_23EAsf-@bdPaZu<#b8rrAdlK(C}n4K6wtsjhQ2Lyvjk zUKt!W7-v*h@l%fzgt>nKwvkFAfUm%xlk<9I2=N1Aau%&91X+whZ;IE4NE58nnrV}D z9GYRe1$f;zLvYYBPpi6PrW^CRSC(KBvtDkS)6cTqn7pHVM9)oRRPzV5iI%6C=wMA2 zM}8ve^>_sio0TP?2Ef(hf3%VmFo~ZHdFzOj<)r>cXgDP?>K<(dqXnREIw@HUcXBC)MOsmpCd-(Rx#=!)WQOeeLvtPb#nCoE}dK||}*G4Vcf$8j|$OeT4ox+)=Zv(`pD zig_L9nA*w*`}Hb<>44m1*}&08>h0;N%R|?NFvZ%K06LjF$3(=knX|}4-7Pw%-%?ki zt(;5_SgXaE#Wpjp&ZM>jrDa^01xeuAxz<4An{kWt2&Zt7Ex9*))CEzw zS<9JYL@%#e7^)Y0T*r;5EMj+Oc!KkUW#3Ov#JV99h2$H%13{2zK|Zy0$wIz!lV$-X zYr3FZ6RHuNG-aIOg7CIR+sg!*j_8Op%elmdR3(?~fH;-c)g&howNm98biSktusj!} zDpO$sLD%`B1e)u3v)Ev87EA$Fk^rikm3xr%?J7K|t{YZzmTKE6EFH>uz*N#^k2p`V zOr(9XY1G|QkuQ*#*eNTeGgZEaRwHrI+Yx82jkxlzcc`@Trir+UxVTyrVZu`4TWUmI zoXZ4>9IaJ1HluDtEI?LkbM6{w93_l@Wwyx20m&8*;*Ts z*_c}a8LAvP8$y2f761A(ujC&_3C6*XV>({U3X~|-q9DCfjR@jl0J-Ez%j~I?*!9)H32k7&03=J4u@oF zol8BLq1S9tAnzauSqg*?$I~I|L&!2h#0PL{Qp5s8MN$$oaZaSp9vea(h^T#RzIRQt z%LLF>xmJUL&T=S&waz6TT1~15UkAKFi2c!q@M6f85WL<4Mp8#!VS__<#L|s~8@(y+ zud-RNg=o8rzPGuq+2Tz>;W#^vN|tgfXVvwkTpaan^MI37ukD;Q@mOVt7w+{4I|U;@ zqak569ZPbq4ag;Muw6-{peawto4}8L=7>~-jqe@N}lAcD@ z3VPv2rA*^=(NU$#YyBOpP9%fVMOPDtUp()hhZ0zS6 zQTc4<6e*9>v3v_tIpph@WOi*uRCsadNqD6f*(!-Si5%wh%rnWV{Vy<4SDmS`X-XOv5cfv+T;>0t_6W+O6*IXzsRj78L?wccd2 zl-9XfjBVNVZkpVf-5?3$YeUu7P#fQ90bWnKB?*Uk(5;HfC5C85Y5`su?nuHRGTbSt zVV1&nsfbrb`#q>4lLHA9v*ZpMRC{DPWKd+09hR6gfF3d9=nCXU$Wcjf+{@5h(?;|= zh^IWx$>H$zVl8vRh-y}=ZzMTHs%jzyU)ocD8FXVZt&>u1Vy1yH)Vv5bf2uJzNEZMN z)>0s!)U@1~%*`yotVAYRTG=4cyjh%v<>;8q$JLkQY7Xh*gft!!z$B^j!Dwun7npG| zvOrjv-nCFrn&^;)>Q#}B>6~>BR_;X>->f2$WR^^&Nw#|OITpn^Cz+?g8fuISjHrGt zapPKxW@TNkN#OOfCJT@`(I-+{&{QHzlQ79{Z5gL?Z9h5djkqAn*;>ZM1-;tYTkSBS z=DfBOc&j|hd-C}OqJI3(C;>R+qYhlkymE(CLdc*J1i8W1SvqY0o+tQ+<*&2@Qe9Swj! zcH9NYWM->Ap?TCKjGc_{x(F{IFqzQ&VnNL$T5*~M=p^R*rE?xqya=OeXXseMXUOEV zC8VT_ZBTT(lpres)VHw)lWfI^nJ<46N}j{fYg_9`T1U-+ayiJ=pok?;$Be0PzD5mI zse(k*NKB^IDxSbzFb%^?aKwWcfqq-tu;zsorT=^^sAT%lv~ z7Vbf|Qn0i(H>ksfIUJ((W{avk^IVYYt_z6V+{o2@CpX~yi5|5^W8(P~i&(Bs{fa*TixnS2+e!U_)^~%pSxFD6)<^+N(vn`52NLFn% zqlJ+T%@O zGeYEEjgGv)PnY7ktnH9}4oRLU?lb&5d~! zRyyZ#oIqn@;0*p50_QUnE-;a40kTlc(Ity>P_ffVqZB*Nc4KC-2E7rm}Kz<@HuIZj$IvYTd9oWY$X} z6^~FGZqkSn(Qh#@L(FoifJp+JMDeNjTV}?+o-ppkV9pmh1cTFelgm6a?v>+OF9tKm zb%H?-(`0nO0=)9v=*eMbx>;~I!wDH9FymfXZu4R=bKDMwma66!M^Jl*8OQjozQs;S zQNr50Y{cT;<3TgN;9f}7JyT{KqraageOv(6*(+H8JD zB`Adpj#+^9sK+@;icIqk&(BUIfbvmXYr9|%d*>a(&jbW{+EtDKq zWSWd9^9@G?YSqc34kiZaVSK$Qp1@J%w?CeR7BU=YzI?aD%~naV6s-_il|wk^8}(_Xh$N-C zghZhQ$bORsP4g(ah%?oZDUzjh98IRJ=uwI}*4j`_I!qKTF`{aIR|;?jowSNCTE?Tc zWvp_JneSKuM807qBIf(e0pMCE%_D4PX{9qmU!Y^Iey;|UhPqPPX5iwEWKf^hvk9Os z1liQD_krNzi48D-t(~=7@xJC{%4=b-Ez^F#73N zD;}{MfKvt3+_hdf6`I+C*BLzF)_QCUtam}K6dM#dTtSOHu`9nZ0d%F>tQeG-@D>;3 zO0iXv=?2m|*8feXrqa6ayYFUK)wKu{L!ve? zGRbdY@-2DCLy3b9gErcbW+S}lU0rHASZHC&w=m_k>Wnf82{p@d?pps-DR-^^tAw0# z4Hh|6`_G&)T(bgloV>A6`6 zmK(HjASWNCPFxoyb<|}JD5u3;>wjU%w`=`RdPiOB|E~2vttZ9WGmj?VG}rH1|9cET zHB>fT>wl8Y>01AHt^c{e=>OO2|5c~LC;)9;s6ARw>wo`?c>uqM{y;#;6a?*U1QIpq z`gN5+R|#~LKvxNLl|WYsbd^9?33Qb}R|#~LKvxNLl|WYs{Qq16p|cp9M}h74W%2MU ze-=X+#|E(v;zjEJfBYp3A(dQ`B3zKtmj}3>oF2<(kEM)cuSN5$>n~$@3?aY<@Q_N* z3=v*RAs57vZ1w-elwl0vrx6j}4^}XQH`yp2#zcp)`Myy+;Cg?I+)q**0oS+1McCOs zj3I3DPv@a`%5-wuJe`dSoW*KWO4R>S^50kEA4QJ($bEB41#`!L>no(^t6-lK9YMy) zj0Tm|RF)Yd7nKwOk;`}((l&r?Z99(#Tn|`Yz{43U3K#+-N45wbIN|s4^B4kLQ|^n5 zfn@lZi7kkg_itSoXC|BpDXZ)v-XhXt|e4B>Ee2oL8+=CZrkcydK7{(lk6 zW(eI=vUu1=CCEekY_^TU%61X%jb}3i7U{{ur)|9$!jt~-?B_9ZWg45y&SP^~b9@>( z5zS#|`7R?f{sr6(DR9uo#|Ll>{E`pp!TVO*EbdbC>G);jTKzJ10s8?DE%E6LArP6$ z!>nipLnv>b#lwQ-vlzmV=qMfnY$(;sp)8a-h26P4TmA2h&t?eMbeqC1^Y!Kd*Nc6# zd4OwFgvWg6v7ZNon{`~nh3G*44|uqM&7fzRL2g6ma-K`u2C4tRZVVK%NMtY%xc*Ok zI6Kfjfc@E*!}_Nb@PIgQU~2-!JglYfhY*U1kQ*Pw5PC9le@)@e)V@6YqJ20+=tC~X z5#V|ob>%gG4i7KWw?TNw-_Ecn};U?W7)ew?T#F7vw^`aGTipU9q;wjGyJ4u zDi35ngdvPrF`S3bxL3>(ROd%9Tt7_z@AK*Z7yHP?Y;YV)PZ`Hx(wk)m2CM(T?uqneb-`Y2VQLY}jSOULWfr-%9l>$L zaSb|f@H`zK!Nc?ZD;dIx_7OZ}tr)=&-iY;OFGeYy^ZzeY#}MGE`q^L(53AbxGK9r( z5i-efE5b7WY&JZaqyFPNJQo|xLpUhv&)cyahA=sv!+yywRjO18s6jKOWu=&^L%pWPgeFV`cGyY;xpE1`Pit20EUhUrI3#H?5e>5YCSD z=AomlA4B+WT!b;p`!R$Qm2VB46o5RC^ zw%!ck{-_8k{%H*1(dbkjhQ+5cgli(BdAQL(gCTtByNHL?fr}WzC-Gi96viqTLVo*H z9(t2YafEpA2Ry89&tV8J`>3C%5b_Tv&#ndRfoKuAMjpij;=qBS4ZP&PoQI5*%gI9c zH5~-3?5$f4P^-L_(jNQD`6kU3)yb!UvZ89h(8xEVJ*uG zSw`$EevSW#FKZvogLKG9 z#zxNN0oN=tlx4PGuKwTBHigE)DeUjNbRj^CN?3OdLexFI-5E zq1JgR4{L*ycpWNU@dI+rJ)Xg>GZ{7D->4v3z_PntuF6N!!3!L8ydSYtn-~#r0ieD3- z%VNO^>?@__44f|J=h@iHE8ePcX} z2aG`o>A|5qpv)!(X7lhZ)kTD#b(He}+Tymeco-15fFXS0pTh%NPGcg4`sk%Rd=sl= z2%knT;^F=11q|W#_DMV(B=6A(E7~sN;XRrIBYZ)17ytvD6cv&E)^- zzOz}oe=HBU9udEUhZAj+8Nv(gl{}2`&1499foVJ(Or6FMw)(SqxZ2l?Az++G2&GKn zp;vG=L%3l1R37l$?*{UCz^hW{Ce+v5C~CbD8`$NFGY-Wo7zd3L&xo0|;&uuWjIX`s-53_@1?2f=pCjSrc z_hJYrgMI-j+mxB?v$i2T$at^z0_p<_7}iH#VN`4;jXyK_8lZalnS5=6^$6A*n3H3? z;$sJm51^wS<9p-VqHN*r9`51!7#`8{?|yXMXZhJ`Er+>3=IeY8NOK*GXXxkAKcn9T zFZxTgFSG}IpGqIqOA4R*#d-p32+ZX%U&NdVV>-q{(9tiT9;05O-k@CI@_uBD=2o=E z!+HU00nGm~$Hsgbb56|JFyD~#0gUMw50DOhHTr4vh3I=^--33Ac7eKz?{rcyo1Gau zkFP_q_LOT)ti|M73hN8ZpD{1S+!ymg%;7L+lXEr9(J()g^DoS|Ft5U#3Ueko7m{-z zIq$*T0^=^mR*a_@Gci`;nNT;-SEFA>AB_GLeI5EBv~Tn!=nv4g(T-5(QO8lQQI}D7 zd$YdeF{&>+JvxA|tFgAkx(Mq6%waJf#at0{Ld^9r{>$+lX)s1$Ou#sRJ|2BK`eXF7 z=u6NBQzQB89~9E#`BdWv@&6dxFfLaG2eFT%G|thQ9qSjl&cIw7b27}uFt%e%2Os)Q z^p9xEZ?w@|p2iBSbFogvIuh$QteY_Z#5@M`7x1C~$9Rab3}X_;7mN|;d(r06&e68f zrhE9sydVEDKA=s0no`DgEEfUeCdLc2!`xJ{zQSA^a|y)Xj1Q(6UjhF=%%|7sa(#|< zDAr$~VLpK|A7eB6b=jYz&qCWC8WHPctWmL!l=DB}m|I}ZfN=_a!*Be0k3;TZVBZ4! z71)2k9s|~an7?A4h&dtBU@S)e`4)xuXtj*FJm#yo#`ynHbU5F8!9D`^1h8Jjx({nH ztiQ1K!nz6T9jtM%uEBZ+YX-~_F$Y8*m=E#3*XbwGFQWf@t$ie4!(sh~brRy3Z(;s` z{u_NM`cW1s;&W*H$G!%_i?JfUhlG6`?B8I&2Kz3U(}DI&`adTk*5X*xU`~$tE3i9# zqxt?2_BODefqe$7fw4BgTv^VIF((GEoQGkqf%yZ*S&XX~2d7d`vdMQbt;NT%p23UR z#=sc%WMncAn5$rX#JF{o0`?cMcENQ~K8BNjI}H>jfd6IX?!09 z|1m!dFuhK}HJ``QTorT4Lw>P;hP^H9V_^>j>mu3$sk zui$$>*aN}!?f$v!{1maDhW#$=?O?wK`!v{t!JZ5DC9sCZ8Wn3#tTVBuL^?Ug$DAGW zK+NwjPdO)LHai%gxvuX@nyb&{drDZ>V;u|}b7stUF^|PubPb!w1Ny9zz&svsjprX0 zna9KD(RmDETbl@S4-fq$0{VQ6%Lu6dkECA8_e${}^GwVaW!u32$J;LDd#c!*#J-%| z*TH%b>qOA8hQJ&Tb32qX0>%Xd^xdf22)M@n69S$C;|2oiy{!AP{>wIic7Sh!{!{+P z_dvkdih!{k0rPs)6$G?f^hfePo)H1#2m;C;0rL}t!K)eTM}b{Dz|UC5#G$mkYW=#g zG}1xq&iw3wATh8PDCT2h7dDcUjRtbqG^?%=nxOdE;C!;m+C-+1;NpT(N-CiX>q9VF zO}1TKpqYe}ir84vG$qq%WaLmqG>e~MwmP;(7`>wWa*XJFGM!M{2ulLF0wqNpieN0K z6co`6`2v#;Fbj;RWzHOD z+o&9#+|UwQOs0*g~GuR(DXuJ^ehlYPIS)h%wIcR8RU`hy+fnDBc*ZS05<)%gTzUl7F%OY;tEfTdH5 zH6hJT#y~jjhKB0#WYP}W>bVvmZ%?gB;!_)2>K4^iOJ(1DFI?Y&41s{5wWSt5S5&IP z1kg-UB&dxr5khv;{H)jlG%Gm(C5o_BPS0MhBKo;26ejhCDs4ow&QS!%wiz`@7o?dN z7!+k0uO}Vg<>zIBWvIqybbOOCg3$8+o$V!av9+tW>)iW$p6xsVkY{a}t zT#>A9hHl#7O;NY$(a*5PPj2M zKWa`SXAbKsPOlWS0FyOMQP8ia>zK)u!C`L8N9v%H|M&z@Cn5K54wc(P%vBNjQqRoPwrd7wWTK|(#>@me1u;ynChHow`6epST?wF>WVfJFifWl)j|(!{ z_X?U)xuE>_xge8$zl$d8<^eC+?Zr1HxvPxJM1cknuQ4!-UoP7WKuGepc%Na>r68)*{BBqEc_H| zV;i{%p!v#qf~pNmQ>$FR^TP9P|2G9?Kl(fd%U zQjoN1U?SMA3wT=T0+jGVW3YxenZIBl;2c2m)ER5#F!%nsGDFeVh;`@7Qu;yx&Gl z<^!AruWk9lg&P&aL4}d2%POp+4=F@VcMiKCGt(oWasN)z+UQXmF`18XQn*@-33RjL z1h{`Ev0o5GbL=|Fs0-$Vl|iV+aX*E{e<^JRxciNu7p`+lBeLPUFx`mGH$5_Cm;}S| zA-zDRMKT>9W|S*4U5ufey)j&mvowLo=u@%)3E!RZxLY|gPynm zU<1toway=*g^8#xr=mpS?7Eg(>93~vd&oMI62avd0WH-rvx1ZfSlRz9H{+Vo&ng8$ z*!G;KA|^`>Q0=RVUb5astZ&@pO%sD*ix&~S$Wj-<8C4vQYs*|z^_?Sbg4?5391L*g z#64`0y+bo@zT|365Rbaf0yHaG1(Ot~bbV}tjp%Q+Q4;Wun^nZjZ3|FZI-!;l(^ey@ z^V#O0=otfSyN*c~@-OIstyDQv*_3cW1dV&7Q4DFsS8cIc8k4`B@&p6RVohq=kX$0t+w;ybzQS zIXa`#E|S+{#eBhtnn_9|&KDe|Iwl{043|hy*!?OuqME6~K*b#^ZNy>4@G(bHrZ--X zt-yI^TtA$j)qqeJs;>!8Yp$cUJ*BOekmFUS$&Bl?v`fJW{N0y2m-=a!34}&YF(60G zxS30w6B?@O!AEV(h-x-6G%xTP+K8rST&H96oAmDUdIuKP*n(_>8JEu%WLq70D(!la zUopyWr;SKfT5>o9Ve&17?Kb0*ErolrCtHy%<66m7e>2+aQDP*8?Qz0d>@gjaiD=jr zAdLZP&4QFCJYb!OnkVv=Q%np%NEGydb)qy)bv|mkjcC>kLEv>l^^}#I=6!))6}~$&EDjY zyqwUtB%|r%OTnVt$S>0|-F|&6La_25A6F5RrGwB!$MKzssF`TBB;!4)A*?myCgVCz z2%9eB*SjE-eS@Nj{%fNdHyJl`0$GbS+{15iV`hS_AS$2m+jPui+RkCqBm52(+l*)amW zUAG6j35wymJ;Oy+!$%=Jov1(>Xbf?_&qFLFU9dogIjOM8iPsatHRgV-+G%MwwYq}(7n{@E*B zkYuLmhMS@`7s*?WL38GC0moN)RSh0UfI735gaqb$F5}c{w|Di32W%#bOS<7&y+dLy z*Xo@TSDQSmZN$uYtwZ9gymcxfUxyX|3Y!3z>KlxxX4)uF?M;2N1!%@C4lYgJZ8hVX zZ5xM8&*|F<;nO7LIeiBq`gb~ek)AGK^2qFhY>!MVc0uXP(gJjO_#Kzw+zxtx9g%Ed z%@Sb8IjX#o2h;FmBC6R)ih$$rM6R8Wrz=ctlVrFcGmA_`Q!Y`mT#(70&1t5y@f;v@ zc2KoA#GQ@jnsGB}o+c!?8qZHgGczdAOwN?8&_+z=B297@y~Q?SGM9j4`4}%H#PBg* z#-pZ>@p2>)KE^AYOEbqxkwE$vpCedI|KjspkePacqKT2V#*CYcwL~y|iPv*RmoM?A z1W;C6;gx$yBi%)tk6+5!4fo;8EWo^d1QeI+@VFbBujb4hoJ2R%I|#x@x4jEx-eEN* z;nNsDchHSXO(t0gkS!PD8wn9Nbn3`v3($$lMIxs-{=>H-;@<7pmH?XRw}UF2hwpGM zP4Z4)F2~{O8|n(jD_o3(&ce z%MV3y94+s)0FzbwMP@1Npky;f!xZhA*lE&fGENy?#d zmJv1CvJG6?fX{JbW`bN0P0z)70!&Dn^qPe^YgQH9Jd_! zZg4?5U*QwiIEUCQSoyJp$+iW!%X#lsHzprKxWDDAJ8GKpGfP^L>K8fSAdb7fgGSWM^bp6T zkKV&NrgJ(XK(hTQ3*@McnE4&!B;}R&xDhqkP6*t~Aul7}4WYl`aAbKIC_&($O`sN`9I`55_}LefrQenO^W zI=4a&y4>m(C4f3Xv7(utbW1qu@}yhJ!7w)4s8*Nhn9i+SgN7sBibPZ=skDje)MAbo zu9MBvWKnDjEI>2XXk1G`)h2*CK|QBQzqw61W`2qm0h_*ZmvV@XHnp$ZWiCkHBtjIo zo7}j@)Iz$0W0srTPGqXxS`E&<3=;@*M zU=os<{E*^tc1#Zw0KcR5`agx;Ljzcl9tC%@mm)rP1epkLwMU&x{RYPzL^`QGZpJm+ z2@X5HX<0flM8tg7phD$jB+W)l=5$4JUQGCHL7wi%&s40lloQ%4H)iIY?GVNBV2+NN zOt~6XerNOCn3*7-6B8ZI76@FPSdd(R1?VCy;yAsaA#PCY#>_jGfGFI|mO7W39AuTi zq?5uL711o@2n;AqZcpg4VtpY1W@CgVO33|FWJ%(!MGu^dTIk`RY%L^J!@5lIr#5XX$D$#z2G_KAUT z3qtN$4Oo9?;S)qij-->53;6!B)&dz4l>SRIEkHj2Iicqi(*Y@!YIXvsllWP#q-vKW z`7TJa3-6!Q`I&A=3yEEwM$xWfkr~%%1FX~};9#@D0yL|SRf1yq5}l(EDeX!b%yU33 z@wdQ1@AC&7Hs7I0XOM3-_z91Sm%*Yn4c2SCyQp|dgr zLP3)3f{(=w(9rN8xqU^DY8;&knH<(fGpiMfa{*)ivNnO>jAnGsu1IR~xn4oegnWYn zFrF&yiH$B;<+)iC&=b*ctANU8JeX8r?B+zv-|HS1G~ZU1qucIH!a++sM`3QCo5Q6tus?y$m1X3j z<$#-9N}E7hIPsvHtd&d-xk--RpUnBNn=Uu%>9vj|(8P}M(L~(XZ$0LwsHXdePV)5Wo0)_(e|(jt zjFOd{PpXwPDH|4zdT=aD#z*clx#LTjVYy~> zIlZj#rp)IWpn9QKnS{+zo+Cl9qzqC`W#0F5D5aAH$@sV?f*xIKzL!rdW^0r1Xklae zDD_F0P%}j~O-VRB%X5v@8@nv!Z@9@cdrX! z!h(Hby647ZjC$K(a}pNOVNo7ik}+UmV1K@?NmylTrrfrfEV?ah_kibi7hI1u(qUL&0#XC!0L0=IB8?3srUw54UL7lYHWJ11k=Nmy*z)tv9+G7pGyzmHMw z$mJzrl6y6NmhZ(eIV=~OgA`(M@@jsym-`5 zRPIStLq~-d**trt1${o*X2;KbAzwt6O;QvDAx)I%Qe=XiDPALHl(y3rRw9 zcI#+|Aqj)COGi5mNf_kr98Efsa5$TCKDOG6A;H_=T2HQ~8rt3ZYBZ_dn3z~14 zZy{N`1iCr&ZFEzuv1zlLD#xWQZh{_6wtAC9PruDgoJcElt_0y@+dXKicirJdl-=e| zH_`4|c6pLzx3b%liiWhuO;Mj=ubX1G@qM0T*}nICQ=PVbz>|u{Ip|4IauA0S$g0U7 zPC|kKp(Ab@##5v99d*-1tvlw1XExBV;&d^`-Ne~dbuFTXh-z@c#h^vgU<*kNk#sAE zGT*V4L^>Zy7}U2(OUB^H_oOGIt6n@K2?tG(t3#ylvKU_@(_|7YU6f3gCqb-XDP6WV zSx=vHk}!lY=~Hi+`+Z#ELGrv=@Ert0zBhyD`P7{XzK=^}ROrn@!jq;rWYPC=iHwT9 zS=6(Xc+;J(Sh1CUFPpeknKzFhmTRIAeuVV9pH+Ck^T*N2y+}33lT14W!q5wi+g=RV zwWw;S(RL*kcyk%M`!${%t_J*i*_nC2Sfx}tI?Y9Vgjp9%aSQIDUgBGa1%^?#; zy+3RL^M&>i4f8gv(jOIgY3q_EN_&Z4%$4)(J~2s-q`WngHVM z^mL@mqN@*3Zo>_~-VH_{Baq1=2IL6KunSf9}i8{80Lb$n{$H(chr2>GgS(PfH z7yEMz%rvAs&%|Y4zQ6=^PhMlfs$;Izs58N;*NA$9CXLBnuSG#9m!&#JBeXDsv&_KE zrV}x6*$2iA%x+8_21PwjCkI2u@Vwea+(+eWUF7kwCu&#@U6(+IY=&4@;QiLS>0IPS z(>J*2E(>ZKUF1YV2b*0Sv;=i)HE;1^QA?k#9#q~lZu2B?_2ca>k}BUFZbE~&kL;Uv zCZVex?_Dkiy(hNYn}RL4JuZ?n_td4lH-UkqU$sQ~J{MU?qzQTJ{VtlhO?SXe<9p5G zT`(Cy1vr?5C)`?(zVVPJIb1FvtTMzrQmej zqR0cQ6E-R&?${aVZRlQn!mLC*f*vrnWn)&I=EdQb14{Q|QWY!1qQXQe4K;2Ii&EQY zbXEe(_3=t)n$V}3e|c+yE>~GXu0qB_ zOV*dWIUvR{rK*9H=wTbW;(N%noH5LkSAHL-6n>raeN3vf<|!`fKf=;%Q? z7U~b4wZ?;i8c2&_bGFulg{DcwW!|a&f9Eod`!#v6TNcY&JQ%25azU0QbtG8a*r0lv zrCz++evb!L8SaUA5GRLCGc|D!4pr(M9z;itq%#RgDv_-Aq;rF9O4(wq;NcBbN^Guk zW4bF{?~ufX&juZ{`@D??LA}Xl6I88ei$K-B#a1&uAJ%OQ8#db#h|*%sc8j9!xx#)~NP~GJ|H^o}n@3*P0R&cGZG!WF z+~md~Pf~)Bjl-U7&cgnPO;ja()W)F+OJg@bU8lx>%%;*bxUNR_9LFWCrHZgB;yz&` zknY!>BUmOMfXR0WXIDgL0v>dc#iYO?rX>&?!qfq2Gui1b2DAqZKTi4#7n#pQ9a^S~ zM(cOe;82!}tO_pMli-wgj*Ce9La#yazi0VG4)I^;vr7{D< zOt9RH>!cL|7CX)XR%t{v(*hIa(`Mrwp+*qZo>8qCw>!Ohi^O|WI`^Z^Knqvjzr}({ zFcRW1OX_Zv&10!U7Zx^EhrP@L7DK+v(MZILk&n!3@*4MIu_mt_NjTKFESIgF{~IH| z(rQm8K2sDEAW=AAUF*r}wt&9Qi_6QN@_H{uE`sO?0B-PN;M>xArh@0%n1s*iZqa;E zx52tO2`jot#k3^}6UxJ|dAQY!O;x3Bp40~Zv8~~Q)Nj36^>DV+i-A8fz0xi(A}#qs z@I>WfyS>QHn-F=A7a77Gda1G3Vd2tO`&4AUc6dS?of=L!{XSsQj78W%jSESV&_rov z_mC!;yUvF-tjhU_#_XNtqb>qI|1kq|9ULDwNb0!wgaQqDmNWU7M~fsW$)cVm=#W%z zO%euaZcKM_8G^+7ZW2BaGGO=zcd4;Lvo|sBGrnKS8jHp%%EeAS-%#n#z zbOn!6`cRE3*-AGC@pExdGbe$hQq4;sQ4-lZF7O~qqYX8jravQ{HUSY|iq4o2F~3L? zfLV3TEv;4clBvaw;gRKMS(-?cT9eBXNODOSNuUUk1et04`{=0t9SIEXW2dAHG*1py z!3o~#1Qu1?YZFOoioPy^W@%ZjPeN9=-9QX_j|h z_PQYRVfHDSy_2`!3pW!UFc_Tey@M`DKk6YxF*o}XKr{a%imDdnM_rK4|CpqxnVg>; zcVjwt^6YXJ6>h>5EG-e$iO8CiAanIJ`X(7h)MU#vaH++X<;Khe*+g_!N*GmhbX0U& zxfWoi%oCJWxP{D@*P4MWM-g~kBUzsc*O6>{1GkAywYm16vbnK=&UbUTliiov(^y$usJW`Sy7q<~ zh|9FF0)KaMq{97q2<^pRlZ!2+Bl*LHb@gN&p9RUa7TK9-sj4S8%{Y2~q5Da6v!?pS z8@O^~Gdb@mCn2?lFrJpIkmSs0T^Q!twZt7}vrj%wP|6c4PB3;O2}=s$iRKa1BWV*VX4Vhr|u5hUb#(PCHHbZ)zsXE7hT##zi@e3*jYBz6#sluCuIbppwaHMKO}4>YRp9%k}gg z?25qY_Fc6d*HBFkcN~~QDu0t3s!0}xmv0kXMu}Teg*k)76>z_5rLU9Im^m(m*nLv(@7K#QFW`T&p}}~H8<9@QoYHc2c;^LGnq>2PyS3h2S;!#M{1yi{bxE^ zX_tpPQzWL#em04-HrKG8ZD;Z`e?0J{nUizKQ)PW!HUB(e{oUCa?PpT;QWc23L~*V= zHy&28tC!o!QTT5|un|19CdVN?K#xXt*o$XQHCJME?` zYjZLqrhyq;7HM(YS;Co8e|9$af#R5|nC_ENM|$XS|JfwN<_Mup44m!AI`oU2ZN1vI z_}RR%QHu^!3t!o8M!DoppXGLn{k|;bGK>Bzzk(bC-fUkWi&=)xyQdIfSUT^MnuP~Z zrpbj0B=@o;m z%wmqrCDq%W+~uL$BzdK;r&TCImpq_ZQv@#07)6)D2({wN2z*rE`V9?-@S z+s+U5_v~D%Zp(H9pHvkThVtIdCqVeAt$V$41Vj3MUkBXU1^tyc!iHcW?Qa z?>y^k{5(K$dS;mH3J1?)WDKF6ofkPzir$?Wv-!8SoyQDoK);Wl$HtM~2uff$%aH|% z!Sm0)9J{+mp~iQ<@IovEP>cOeG|avY;?l5d`q!ug93!Tc?dPkyb_KgYI8qeW2Ve2a zC|6ehNx+GQ*?`Ceynp0YK;MrdVwwEx-%gNe8gTOR3%F05=X|;N@7TNQ4Dgs^+-huu z$DFL#tTrBXWFUL9zV7pk69Ixui*{I($UsWwhgZD z^WQj+bJ%8e43vl(wb>afTE3LoJwd)um^+vMMZGDcRmp7 zFFvRfpWIGyM+E&K%afl?bmgpvA4nLz9V&E6AdmNrxPBMc+KTGi5sF@34msNz_F6QL zS!P7Pj5z?W)g*pCK+wgKX5Qk_9naF8jUe}05W+$!eB(Lq-FOWP<; zeJIW0S#BIO!}w%Rc98?18hz=z2ulpIN8r@^)d2~Be0|DAn15(HkUb+30QuACMY6^^ z$yc-~1Ptx%7x6+*WrM|d$Fc*1)ex1NI@o&dNQC0_+`LUb7aL4pBUE3*V_&ol7H+2B zjN54nSOF8}IEMKOtlX9c3e0-gKLupe!-8mmD$`rr3it!|YA;~ssJOgUB!ZaY39vtd& z&-$yBq4Ye|2a5FgTZ0@hHGi| z<+eCt+-ld(c6o^;rL2$$&YI)5K17T)$BltPU4MF~6w+|a&2POxm%JJCsx-8%Q2LYW zB)O3Qdy4?xg|Ls~h4wv@$k=Y5lI$HoA*pyy^|a9ot7w$JI4AQgxzT#kpastQ9Kmlvb&4 zq|v7y^pCW9(Z^Co+CAaE$Vg`hlDB*%Hj?U=m_WYPKGG`s&sY%(#CgU0d_0C1T;wkj zj^Dqc3;sF6wBb?2%jrY>H>@eGO>yE#xG(CgVav}OAI7yHIp&oMYS&UlXW6cs}Yx+&sB!!!nsW6slIAYpZ}aco-o zgwk>Pk=|&tv%ZUs=XKPu`uwCHkQ#DpgA~>FoO`v8SD!5woFF@-*Hh`zQcNA3HUV9f z_-O3WD33X7v8&ib(5Q;gw4j#F4e+R_bW{T;8a?=k*hFI-I?^@~ZA4mzewIz*Q9jvW zYlD;M(LxQp_fC&YvPP`m#whO0X>V_zgzAcW3)9Ix{AE^w&kmN+r?6afewtDyS`JOF z#qH*{mGSNsUzoiUFO%70s<>mho#FGo$&9b6cFKzct5nsxfc-$;%NYv>`hUPDF$>WH#DhPeNsMJssd&W?RBifMM>$I{ zZxl+I;J-;5(ly;Af}$TBnWE<8x3o>6u4{6`qDI+hN4HP0-j-1ZX_z>w z@J)3(oPW}lS&o6AD;^mj-8|+o94!}t)dkFG<;zX!$Wz2X>_lK8g?*M zTnN)XEHce{)74Qs-W;DMzbbZ~dMux&KG`9Eg_ZREUYqZIj*OpgE-A6onfL(4q z?pojF=9|6bznpfj4HH2bDFP5?fwH?@u3kK|ovvLA2lARum|QqK>YHxeYmp~+`FOA(Hl3aYiyj_ri6d&+m7y&z)s{HVjs6*8#=~Q`24`S6($-=kkr_-ZWO?Cy z6RSk0muUFqh4xBEdYJBSntB=In`wv@vpWJ5wL8TZQf3<6*r*s{2_{?Kjn7mH&=EGv zDwW>;S)vQ857>nBQ|x$VY!($CnIg07lDyS6%lv@l?L4X~m6(q#SZy+4B8u(Y=bo z53`Epvst1Uk(*Y`Mmsh8kT6@{!9nM#@ZIoj!|ac24wzB79pn`sM{p-)+2afU9Qwq< ze#WNg9IB0pMmzep0eAN(e{TmW3nSBih4qzEBUiY_zM<_l$9Zh7`5_+i&E-`U``)+v z=i;b9*rRbeu!8}j8)tLpN08j|J<%^_<@oEixom1<15K2xacs-3iO-c&k0I_7=EMmt$kJ|BV zZFc;n_`HO+#!mJBkl|C;u+QlVllEBPhm5^SeSXXK9fKsWzX8inlL*jO8K?YpGvGn9JPWl8yUIE zL5y5Z5XeGNqTnza8#|#ID^){eege%%|5$WBV_7lqXvfX-CtOF(G0bixoPG;zqI}G6 zqAr4w?bVSg#$KX7j#dM;tOk-{5RFs4(d1|n29*=5Zc{99o*-w!@(DA23mIEZf0S~C z!6P4ZM5Nl2uI>_Mhggkf!PXPC7I}{#3o#a>Kk6QmLEhj9eeVRKk^9q;I!&i}k<9tb zXdPn>^hYHIQRezl^lF=6!`H zVqIW9=I>a87um=qFWSJ^HS|aMzX+QR;YE{T60%t%W7YVxiT+6c5AyL3u_lEXH+v+a zVW%{DN1GU%Pk$&2$NGTGWPbEo12wYg?rSy(PDaZJWPcPC-b<-(wULFvEAq#mR@{>*_e9+kBW+%c(lT1Y zS+;moxz$H+c2SJ9Pe&q*Wk(}y!ju^agT-zZrPFU;lughZ0cM#^@)Mm!qO^5^9!8EC z@}a{C6ywJGiRd&^<(Wzr;uc?wu~L65kwIq7qVYtck^3#a6`HQ+o$>~^u@1&A@pX9e z$a~C*-0Dd;Zu16PrCIpGUfzMR+ZlU?{-}2pWSM!pZ?&6bN76 zx6NVL30B$EM~L%T`Xk;+O|})ov(ZGFai>RPl>TgX57Kj&JWg+O4?*l(1DDVJ9b2b( zjeNRCIqY<lIV5e87?Haef=(G@hQrw&RtXQM&=Um5=o zbW5R84AOr-E(74_CjkMz9}r}i6@cFL>nee+66h*{t`g`ffvytxzf=N)gQPA2{Rf`|CX2t(&`G4%a;)k79{II!-ANEo4!_Fyw z*eJyh+oJekBNRVudE$p1PW-Tui63?<@x!(xeprg&hrLJqu+NAe_7(BN{vm$YEfl|- z_&@9b;)g97{IG$7A2v+z!zKxS*cHJKdm#8>*8@N7IN*n+W7n^%1P13(cR@jF7bkQV z0g@*A?zQD}?AL4m z8^@vksYQ3TV{1Bh%_Hqll6>r&?#l;|82kRaW-o^fSVqYcBsepMRlHHYA{a?$g=dSqWkMB{%tQrA~|ex@_OAkkEdr&!F3|gLloIw{FAM z`e#EA+y;e*&eraoPoG@M0zWvd6M9rVe>}PqdMY2^GOP1Y$2sh8w_n`}X~2iaL^`3+ z;QRbnosjD+%>8HQ)Rm>I`o*SI*n#VI=Jr+4x>@wl>#HD(o%zMvs~|s-degV7AUxjZ zC4{A=?XNK)U~fA^Z> zq`!ODqb+wr-uc*dKe-c{HBTOX@J?u_o%?jwT4)M>+VbUE?3xW6@$FiiffqhM`7Ve< z{A+jgE@;WJ&fnaHW8X8E`tE+UTRPj*e$(Ah<^22)EAGbWM9+6S?;hLUhb``N@7)mk zoc@O$cmFD_oV~E-x_dq)mBvpWzUiLHxBA%|=XBnK)BQ~^J$w%Y)xP@l*Y`j+o_+L} zd!T%G-A5;_gHC1ltjX&j%6n19hIKegy=Zm6d!cpv&d2@lh5GIB(J-O}hd-p?!Ci1tw>oFu8f8?h1ID((? z)vxIPee4e>pYZ^O%8qZQ{sdwno6Bzg2?TN$ZA*I)@&$8(KY0*>5Y^xO=Rs(}EGhZw zL7Z2=bnT-XAYYZyW75oNL_iZN(-Gv6CYUH$kj?@=0x*E)Vo!`&L}@FtqC`uQ~EC1nJ7wrab~llMk0I ze&oFFC$la0-2VuKy@LZEdjzt?A6)t6BhY93>JO)HhG=0pd-3L>tNO6QFQc0wv-0^% zFK_k*slMGl`cWvCH9S!EDCC&lnl$544E1T>L>`6WfBWJSk3ycd>cY8?LkqR;f0jND zEx`R(z3?~`s<*xQ;^UCF9Jc3`$D#jyZRH;yhp^f76DMz}yRDREtQo%r8^i?*9@+w1 z1XI?(wFOdcD+c}a2`DY6{yO+1RLZx%vEa$#cptXvqZ^*Y@zpQ>eczMUvvH&@a^gv- z+`RXj0Z&0}d+P40r=WHB)Z4#!3Zkn$-g*5gXeE#N$Jb9mjU;?`$yR8?4T~J!3RTkg ze>L@K$k7EhE`AzHpOLK%PhaUTW#3%#!P8K0{zdCa&p=q}uBUUJsc7rNCSLIBGmx1% z?d#C95Wzn9x9GE&3Y_+J{8rz8gzqxcHP9+VKCwMtrO3M94&D#moIYF8a%@ z9i^;$`nbP9i0`}X^AD`(PBN}HL=ViNapH!CE8l~{=#^9Uz6YJ3Z$JLfTRgjQA@g!_REl{a47^?|$~Xzy8^m!x}FPyuWXGDVz1PbKZw0%9*1J z--j^c%`-N=53R7f|MJ-TP|(=cr{CXhPb+2j-Z}dNXy9%d{l^a=#6Rna4?hU9Q`p^S z^#7j;?WOEA|CmFNM$8=1|3irHPOaAU|tw>_Qx{f8s}1rgcV!yAu6 zLj8Al#*RWNKH__WP8S30lULt53X>o!USIxiNJpj*z5Fv+u=wInYyNZB$$i+i_doa# zL?14BVEi#mkp~Au#~?}j=#Cx7pmn(Ac>U)%^my~E4PW%_)`R`^>%V*fjf2N#%sLLC z>kY3ycpOS`b;C{^$3bK75u?9^VS+FB?D!ILPX}tx{0c@*PTf8DD=1~WHu2Q2A$b4D zRlUB3*45q%fAlr1A=FN-IRW+G%N9jWK)e5$Up;Xm6f0p{XWsh_6iP37cl|e5GOQ?h z`x_{yO#S13zkxcy$8VnUEp+tnyFcSwNbue`Y}B{V^nT)3_yQk;-pv&>s&Nd(9ZI}P_IUnTi58QId2kqAfCO+gZBYEicpZ(DfD-8A5PY*yp zL2t9@T37-XV-aGESD^s94_`)eS zr$E_saj%zBAY`_#|8G+vBJ<+I_1$0!;_HG=RR%e4z>F3Z+_ApXQ?+mRd^E4 z_g>w3=SgpND`#!*-hUEg+pl|K<4KVI&l~>hlc1jz+4=jE#-#RO_l^4SB?)EDEWY~%}vGN9Ek{m{TehAFJ%aW9_MF-1FK1)+OgalErR}f&<}9c{47%^9XTxaB6W14KL417I z^Ru!bzw!E!C0WqR?*G{CEExUR^>Ri}C_vo*$?%@gQdm>5t|v5qZY=ns=c&|Ry_DD9 z3rn^~ir6_2Kk;8P;~X3&Haedk4Q z>%pGha{qb%pmzJ`;3MZjx3tfo8*~14ayeUe?z1`2Xl6g1a6VKrMjz-rALqT(hh5nR zsva3nuIdAIyZGTA7wlTugRLC?)CEwys_8hlFO(p@EiLE^E!uzmu)goYThrMUzi;Xr zh)iX*H{a41OW7Uo{kShAFMj`Sc|Yiq27AY7(_tFh`f+Z52-|=A?j`-90r=5p6Z%7G zc~R$_{?Ln?bjKt8A>?`OmdE)9 zt{HIsp}~+$+BB?Z0d%wfx@F2{B)&9rZz8sdxvf1=ovI=2<7ea`1%In7pp*}M3l-|RkLU--! z=MRVGb?)W|hC|%wmurefz+S*b{>TUz3CIoIHUgG?<`%CS0lnXI8dr~i3U04nZ;kjT zt+OsIJZU7%23$XH;7I86Z=N+{H1?tSbIEw8=yOzR=Md0n9Z3x`PCa>KI6^eH*SF4j3-v!bR!h&Z)~dk z5ww|pJZHo*SZbO!tZms>C#AERk9I7B&7aEVcb7qD`j$IK+ytvvuMfZZrpwy=Y}uKG zH$$EM<(=W1p}~LunK$1IlONBVcKglH{$JJYo}2slCa?=)rMJLr%i(ST>U{?Org2-4 z&jEbwH?MEK7+BY@s|31ApsNJBN}#I*x=P^xY6&dx{gL_T1OTHx^z*+?4HiRPa>vQz zilMRd=G^m>PQC#Zg>@iSrT{Ha3F<*4_VefByWXy&@fc@d$ zWtYPC$Xy*zUy7r(F}rtNilf2<%T|>@+xW7fYfGSS`S;7;ErERG!t>4@JEyykeRyro zSlDU%Zgs&}nBL1D*fbUfEDp6S9}A_juZ|xW3(HAAUU1Dg=xUAn*I&oM*u;i+dyR*% z>h0BaN4E8am;)?;LjP z$tx$oz(k+erU|g5nfcT+6JSg2l=8DC-XASz7tZfBaSfZtmX*wzcqZ$?es|rc6Jd|3 zU*w8OPz>I^W9_83Xdmt1=({Gtw8w)Zo}L679y@;f%%uN^z4w4?Ds8vLSF)23N@5~} z8YQ3tf&~=CI)WmiA|Q%w6ahg+7(`JJL0~6z5Wxb1fLO4AW5F&(K#C1J_JX}D=-A`r z|87QRoH<`P-}%nH|8wu}#^3VYJ9{T2A-wPNtYQW(vhj?Cp#J9& z55{24@L;wFZ=rwNRdb?BKp6Bu*5CufIDWLiCcwq7xju@iaNsbwPL zvhX0r!ISCqSKsdK$r!psCzX3L4XbZ_?|L%*sY!x9lbFWllmQDSF{S5q={F}a&Hv&I z`DDg3X5XH^Q8g zZGG=Y#vR3|Ok+CZEKvSyx9LoY_rlxs8H`b)6^vzO1lmKhEtKTqs2 z-HT~p55N7~3$apUG-k|X?2c~s+BlPuN@tAOGLvb$9bo)^CewPr?J~}Xv5`4ey3U93 z)d+vQ&4)*L1stjNVJuwIm!0upwD@Log`~djfx)K-`7*u9v6H6ziplS%LQ4BG-aVxa zn|zt>(DXe|d>Ie3%{vCoVoLryvgXfX%sh^KTr!Js{LxsHIg62G=ja`s#TctSZ>gKb zxKTu@t@Dc@e1q1M9ezw{{O{#s&3Rk=87qXnJpXnz#%whWH+Vivko5ndz zpK^P?HgL$GxlAj>C}xGSM$zKUHrot zD}w)O{uyz$&r+uOrace!8NF{QBQdzGIWdxvBK)t;OUF1~i(aqc@_T;zf9tyYKjnSt zv&+d#VYM*;jH8INcIH0DZ6P2pXCKqZ&V4*;KVww;sdU_a#tH4=_(ca8OXTO5(he|^ zlV5IqJupn&5g`*a4l*{fu2B;XG6s2PKhzxr+%bP(@*&2^=*05EL-z<@JLPQAAx8QW z@zWHdSMi2L${aEpV0QAx!;F#hz1kOt*RrJO+hN5K#uvG648N>ep@quI*5Jtl7Ju{HEL#2YRwA80pd6nR6=`hnM10>PHz< zQ$?ER(T-ZC*tR?9DAUaTc2N0IrsX`(tfGo>x%_IYRo#@(5jNc?RWnkeO+~M&C9$Rm z84yszID@Yr7Er?&ho9_=V~k(w_THV2FKa;N$@<1^~5@#;9!7TW!l-3i9l zpx$xD2|yvIronlCp=~YGw_pjDLADqy< z#xxCx|UwjM0hfjHIo-PCE1i>ju+@`1k6in}&GbWEw61t94VY zp(}1P78vdI)BRuG-DaA|{?$6_%y3>aBf-0DQrXN%=>FBZYVM)a510n?;v=0OGFBk% zb=GSGZa!oh^!{1Bb@}V-j~HoRd)+lsJN7XnJ^Wu)f8C$q^Nf)^KB+wLjIlClugAuZ z8Tg#(H*BxVCSH2|obiPCYkhXTe$)%5kMgf|+Ki&2mrUp9r@)$*Opo04p8{Sn63$+8 z*S}&Ue*@+fzG5Vif34?Qr{8(abdo1T^lV|QPPPQkZebcO|61q$pR(Tkzt{0U>l64& zBwW7`Ajq8sJ{idzj#xXkXgIf+aUEwDb|XFLoZntFi%sqz;PH6S)Y5{UfdQn(ozdCE z7{;b1FzMPAT`haSqE}y7_8EX){RhEj;2`uHJO~2_jWGC!A25V~83zv=h9M62aCRLB z_bHR$={*CJXU~G~f&k15n~w#{!ii-_6rxh15t}K8JTn1`%yiJJ^AVF>1bN;jByGsU z@~yd8vx6)My9=;k|3+**unoogcVPSeo!GR0Kk^S9!MYoll*l{x2^%i`f~{9yV8^XT*n7Vjho0U<^_xqm zdw&iMpU&WfvJt0#J&n`<0H=OEMb7yRCzL11;~H@6`7u;ARpDseQ5-#blmtbUZ6mW? zRaJ$WW5-b6(0~&sPvT@_BTinth?Dp3;pDq_IH^?P))$rC(&{1^`(KE(a|_i^{`T{Jg0w~fs9J@R@UJb2J{oH>tq?DOZ(@$%(M zyn6MDBvh}_N`CI!w{P)|yzck!-{ZrF5BT`;Bffn3f?vt&{(t!Y=QGfXA#Dbf%uJ;S zRxaw*q1m{lLv!yIx0abLYV%uST2{1}sOTID{zSoIBoq_zCr27*}9 z@#SW`!PeTUv;deHh}jTI4A9BkyQ^oKw>gXrBti;eJsp{UUz@po!S$j!^1#0KLRCt- z84QFF=yfumDeLQ*Y~EQ58sxknUz=IIsx(!J2$X7Y^*UJ)v(&`yoelUrL+%uN?5c86$S~?&(BHF4YT!v^g?eLD$?5)5dp#l4b##A#F?jy8IVDXtgpLk) z5^47UbzgD3eNng{4kgr8KTD}?a8c$z8> z1$tW6n`dpK~2`vet5#;krHzGb;lIv;7tcSJ^6%SFxr$dh?UENm| z*WFquv~n8gy$v!w-)VcnUEO<0>k{!GsN!??G%`?)AL&IZ-qb0!^}dm`Y*ntP$W~ zm!V^72MN#IuBD4t-O+rwFI#A2ADqE1?Gp@B-QbpKrv0`6lGP(sa$~(=n>>7+ zSvi!~O?24YG9ttD70XXjFlrdfFyV)O8C=RqZo|FaLe-l-WCaQfMyuq9OjFf2iafMFKSXa>y%C#k~#X#UmcjkzA zv;kpdB@_?w0$wLiPcF}ymT<370*X)m^gNS0^8`FyPmw3jf^(LVa6FMD5eRq|o)#T> zY2TP)JxLIVDexHwZ!eKLJmoxH%5%A{zQoge zCX7Wq3(DPdg*VSwq$@|K;k?BmavguyE|j`-^`HT*!L5rS*VP5bGs95eX(-t+gw@$o zVsKH!AIIScIPNT-r=fu2c*ZBoD9@x$x({>>-@=@dai6)5qhier+*NWbNob4Oz1D1A z5m%t=Dd?on^-MSd2bRz?UalJpaCmW&n=(;?z}(zG#8X&s-5fYGVPUG02iTkORC4to zIok-jB9&YtkgGZ;50v$&<4H~NbOfsh0*$+>X;B8ffuy2bu}er zOC+LueG+)-9L~5=NSDZV$^6uILD*5ct5D#X$JXua-F-Wo*V&EL+08`V6Y&N-NhcqU z=kS8VY;&HEXF1G0bg!`tbkDN9`*kFZA-d+?TAoRr?e$bDD-K~y<3#2Z$7C%eR#vPX zTn!Z+sHu{JpDt7-7f=O!l`60+dZ?28K~aV(mA{S_LglV5{7~A(o(h#qUCjh=ZPp4+ z>ZM~LI|~aDPhx>mD#?bcQXNm{;VhEKi;f}6RzEd5h(l6Vp_C5LqUiuOmm;Q5@}MAt zOx?W-3*K$SciS&gvtjcnoe|wA&yD7$K1nPIPq2a|F|ZIAN`&xkU>geLf_k=(L|0&b z&zd6fgecjZ0%3MkDk?`y#pQ$6r&P2t(GtartyC&wa!*d6v98LPFOC)SEmSIgpdQOX z6Z-tXK)xTFUuD!mm89d(6RSC}!DspFXoS*TI2?Y4dMIr`9vo*794g`Rx$;me4nHAO zDq)jFD>Q{4+M6GW&|Z937mk3Q?xJCC;w&<^fd$LoTg%jm%bmjE+S66~JT9$oI@n|o ziyG|EU6jrh(sBbxxO9r1#7_+pp_&0rbA|l%0kj)SDxqnaftpb0$0Y-3T2DY;Lhlp7jP1dX9m0TsG} z8e>CLSJKc>14*++Xk0Iyak8-vE-cnq@oKKMlasY3U&qObZ>{O%qz_FCr#KsKI&Z~s zxH?3zT*Zn2wPZH-t6BNMm`;b96)hB|)5fNf@g_prOiLuB{nRX+SVCG&RLYj@(4%!k zkAjgv>S352tDsrBnr>CMbUx&kSHIbWBlsyz2LmfdN704aQ zS{KDO7IRebwqoOPCh_CMUaSnU++vlfzJ7`-Wt@$DoUTmlFZAZ8^L2+h@U2s1y25MfV`M#aIC70K zGQKc0!IdM>pT_2fCb;lMew#;A56>5ei_u{^RBwL#o8qe>|UH>-WnT|f63MEmEpm%7n<^=XC znGV0}NPEr`4$b9E*GwqXmYQ^9>5D*5)af#jP3dVQx|KFBK19IR?_$DEpq$vQ z`}i&=7Ge}vpBrDJy}Qf3}_-@=J`R7wmPBH$O+avF;OHUS$Y{qTV^Icp<^HnG9jH5 zL07HR0>;;L)|a$!2amE~3kx*)T0tZDGV_o9?ARZ><;j+58}TRVrW>-1j&|iwQ%jfW z>Wlq#TlrS{u>w_+#7br8E(-WEQa$I3M3KPh!|riBIJC=PwS+ErCB4TZ%S1oaMBhLl z74&d4@4>QV38b2Hf-J^}K6>)f9rbqFYL*&CjNlr6=qA@Uq4?qtua5=y;89I22k{KO5A7z>5c&LXSU z9^yFzELkd*&TM}x6R93QrQ4_;CVbW?fw;RWiONxF3&rlv>N!)?)kD)fT=q(W`6^xg zB5v;l{xhEXs1Bj>-m%oyx!p&x?45b(_7a>AJ|f=EU_H-S9w2<6 zVaPVOWFKpUarXp$zCcJF7gY)P1`@u3jmDKZyX8^||AMvVU_(tKH9w8>(C$uiDNXro z?pHQnl*oQDlR>YN3Y`q(kXeGoOS6DYU|Qf>(WOzk@enB%TWKYW&lS$=dhJ# zXq=0bFLmKX@ueoNoQzPpOYl~{OYm7#1-p=yu=g3+UaeX~ookwbob+o}chzTU@kF|G zA6_-JW{61&zn9i(Q&~E<<6+8F$54|_56EH#q*otq;i~9@E);lzZH6-UG8wNUdg|f} zmUR_%6WjM4*56&(}Po4jedkS^=M&{yOB9a7<)qV8{k|1cLk9a3+ zcCb;=xGXefOT1KCo+&<^^q>VTCLQg|IxFm~PZBg;Bev!94xRPvR0=<+o7*$VhY_d1 z-Yr(nx1K?My1sOmN}Z&qu?FgGsj52cJL{`)_03}hq=9UJDvrrXRt{Y!3K%{%L#jU( z9L<0)DxPP8r5>p_8?C|HRz{%u^zL@*8oeJk zbF_t8YUt$iTV`v)HJVwX)j5eBp95o_Ub?L+zQ9|?(+eD_Ju958XK(VOlU&DYY(^?e zm*gX6>N*x4@J#a2=XUn=i>&`57MNjZazH8=)VW4iL)UAD0)_Yw^W+jhOWmW`*AqDv3W^hAo|oA6klZ6u#= z*MY4!QkAq6_H2pND$q~^{(NHtUIyG%bbxHUKb_NWMJFSVDiV?CX|2wpoJ-kiKT{Gt zXVvlo!c|B#prI>;pTB<~36WQmFezDPsKe&O>KK`&$EaqQvS7g1w;tydXS!CGFPlka zY&6z=N5M$XRh1anT?&bgjs^z`AzOzw;7~eohBEjU#HjpK@j);mVVAR3f~Gae6U}na zRO+WA9>g(_O{Ka1IWbU$5?aOCpLPrw^r5Oi(ES6v-TA8t7bEhVTCK_m6!=UthNOqF zwZ^0siX>x^DqW*n@st594VnGq-3rAp4K~%n))ksh^o+aOT_XI9*`g_3s`d!rFXngh zcJ+)eoN271VU=P%ZFCh|jpPcHPA4Dd4HX?pX75*OJ$*qHG*k(G280cfnGg3&wCGLg zbvNq8x+U_;t(vMHC>1*tv5d?IcqUEc2;3nw^jEX-t*;WxRH=dHhCLuOfT4MJOV3mv z^Q2A&I@T~S3m9m_p8c^(SCtazZww=`2Dm~Y6>AV@Y;JC;L;Bdv&CMu-6dhr#26$ov zsozk0c3}VNPK40$_lL1msw)=r)mYsH93jnBLmW6_v4n6UejNY6T{a6z_Qo#s63d0^ z!8W}fvG^Q+dagr^imL)0IMbg_*Hl3fyr|bXA<#hZC-VD+DO>c6{TumBBwxRi-~SHj z_>~Z^Ngwv>iD!m6OOg>+6bE_(jhOYZSe6%!$ebudWG%&#)k_hcL6Ab#=yzd36A4NV))qM80I_-gGQ3#heJQu+S{Vf z4}D-g*cv?t^hEc*mgv^Y3?|*XpmR4F3}r-NsV{+0+yNSzZ4}_ks&k zbZN&>Qh51c_;5Ik8U;re7dVY4*TR@G1>?QF;T0TAoDs-pl9YsmRjZJ`emz!|lwj?_ zgIHHlf%Ubu*hIby+sXH1H~G#SB;To{gs^WQ-{n}L|Ivq0WkXWvXQG(%w^NQUF2u$a=d`Q$51 zrE{X_r9$}9^Epw=Q_?x<+1eCz<~2!Pv8kU(TYxl&@|e~S;~LtB_l+4ifwt!_WVr5&-cCFSDEaE zdC}Z$9MIB(EY{EkC!YhLHlq%r>lV>DhX;#kf=JofZ}Ow_MyoDHpkU@RdKaly1=w zDQPb?CGBCz(53@g>o*9Lw0$5ai;gDzKq{!L_{^*jGFNl6=v1y!?#0Pus8VHeU=}j7 z5|zpR%=(emNLsX-yJ*LGCeUI9(K4!7 zE_Y8%Rl1GFHDhGKi&Cy|%gS;)u2d!lAtY-idFkXy6B9Ygj7U+YGBWiu0+p%k=&d5Y zQXZJeVF_7T%E(Mg8LyZCFHurRVq#*3l-vlQsE_DwfLNk4RNj)P=!S)h5a0K!p<)$G5`M@xB>>92O+m4I0(K~`%rF*9y zEakT0JWF{QXVTE|3ZXLDH}OGMRs*uULQsYUENCc`J)$$SGLyWNfya>@9X+1KS1LWy zM83+bx%x`wHFFSj?GF9@!%*6^w=4`Ssuz{_$JO`=|m?^Ww~t^d*vs>_nMY6 zDTo$`1Vc9D$0Dg>J#r!hf{H^Onn2g|Z%V2vCC6+x<;Nk(F-Me}C=js3aV|x$9L%wd zD-O4`chIt=9T@siW+@*$*kIU3h1Y|uYgMed*L2wNtln&T=<%;-%`M@o22@-4C&ji$^a z0@Rh;=T|m0l^l`c5VmMF#Z{HsZt5@;HTK6)BP%N=Esh5!6?FBk&LHHL>>SSWE-I&7;#Xp#IGz)!CfQu4l&tnEv1TFy3B8lP*VhLodmk{oT;OH$y(8dapJWyip3Uo zq_=QO=yD#{O-w?cnx>L1_Ed>{ONG{YQK2N6wPg^>b444rcaU19@YyZmaSoA|#k!H> z#Dd{O7^!fvba$XE)5g)0#)${p3Et@Oce5k5vtBOPT7GQ(xfF0}==wq##YWwh+NP2N z)REKjEsLlKD*-qZQJrf zZNL0Yw!<9@5Erg+xI^X29Fii7i|r^y7e&S@I$FxZi?xSRE-oe~u1(O0SXb7qfSOOjq|_r@4je9dQBvb$>tTAx zqvIIULENguk}V}ATS~>V`|m5yz1uB!0q%0e1uTBPL&s;P;YlJ(-}n*ir0~uT*L$i( zn9_TBlZy2BnhBa@adqWKs+3fHtv#=aS3}pX<<_%$uW8wer5hj+G*K}b!(EB&e*C>Reo_v zQ&%R=h+17XX_*FmO*P(piB03p5b)!(SI-`|A}4W-Q}~`r z?ck)as6wT3&g#^7K~lV6N{~`XD~EX{SRq=zd?mS#T;lR;+m+(HpTeRO^8|5oR*Jt5g>x zYEPqOIq3^#3}4zIC?z&0siJp`z`9`Dc>1v z-K-A2zH_Ol6r`sY#|m2>-xh9nnu5+pk~qC6~&E-hWjLq5GqJ)K8ZuT7<;NmQ7^ zk?k1UVT3^LkmDuVDc`>3kf;ZVJBO${#t0^o4TqVIw5=uyOi{%J4ify4&yrddQE`a| z5M?nV<}xEEwTro!BP4L6ZyP_M(Wz5WoONY5R%=(c1p(ZdMX9UBkx{&yZ z(BUU7XfEPIErJV96p@ZZlh+?ZtS@88dm+I0h$U~CfEUYxW-J@xSc(ML9CV7|LPpRv zhKFthW&{>7YUm!rhgFO^dd6s>H|ePFLyOQ)t^+%{9tJCnU>`4oQ@k0*kS;1$;)pOI z(gxE)`@{REL6|$+9>Ly@Sm-qhp);HjI^7wI+Atc6r!yFXuo+{q#A_TPW)k-qZ#P8x zxMP{G2cl<9M6ACj=-HDYpECt<0n>;(#*au0nt|ltnMe)s#qx!ISh09EGQ;L#<&prb zUK)tikwI7!6@;v1#8rh}fb95%$Vpy=+_W&PT@i-tm0?)DCLAl*ER@@UYCXvpJZK+9uDV--Q{Z;&fu5tl?`d1f5e<)&a${&MWzunLEY z)}nG-9_n^(#F>L7xK_O%cN)rY|8x}|ovp>wizo2n+Bvk`y^dcV-^KeEkMZfvYbZZ` zz*iDi|3e;y@Fc&IbG{OuMEUs>KE8j4U*5J59^?_>EN^5Ppr-Z^s*fE&Rn0zB9xX*B;TS3j*YFz-;Aqtmf(n94RJHRJRqeb55!4<14pn5k zsv4EmH3Y{{R&@+}DvqI;L_0-?Yq0T1EjE@P$HwYLY-+fGO=qrS!{z%}fAxH3vyAC zn}M?2BwWai!sGl!c##u?XITMwlsOB{X1Us?Zc8%DALluS8bfSSlM)+n~C{iqN-`(gcvBcol5j*Kmea33)uZN%6K=R({^ zIH%f$I22boFLQN?n(uyI)=22AbEmyW*Nb+!x*R-aedhKx+4Xx*o}YdiyK@|S{~ha= zJ6EpXd%XEcD>u`9uaWyzqvnOKckEkk+cp0LqpB5Hk)FPs=>EcFVT%`qE;Opzycyfp z<>su-UbD)1<;wZmdXM($^CT)uqy=H0c8^%)b~JrEkY$pq({ z&TQUTeCZ_W>)(bgTJY06``Nx;(fkCnPj0&&u-<;ar_W!MD)L?I`s<7vHhbN_ zjDP#V@}m@AjYM7_Z1%f&?9?B={Jm79l!|<4?LG%xTzA!vvFm7&{{DlfyI=3&Q7+D| z%bX{4T=9N@?2G8D>eo3(eNvrA1RB|Ux(D1CKbFT%?U)g0Br35E{BS;FJjd(ET4gxJ#8=o zCK7lI!90RMg5U{5v3SxCpr;Q*;*4QP_4)xBUPG~F<`9zK4na0S4nZzK9zlWk57<1* z0lNZ7r)u$=pUn!pvOv zJ=*8MZ(|iX_AjIQDB*!CaqL(HnTN}9=3EV#pHJiNy{mZs;vs(dr3IhAd;-IL|HC=| z9|?NDlJ!FQg{%jk3CMGO{)n&4I>O-NdniA?gYpA|U!Z*d_BXtH1LeC`eEFpvEo7VE z?Q48_^Aew1p5ycDr}*^h3BhB0B(L?u^ZWSll&n=x?%>_y+xX?-4ZOL36|HwK`_x04GQd0; zO+CwOBx~*Y3m2Q7HJu%=hHEz-_9M<>vML;Vc8dEf_0qGdi)Z@xKYztQ*3TQqPdA=9 zcj4kQ?+cCn`=2wi?q^-WuY6Y54;P-DZ$}P!YdaX?~mOOTUk?QCu&CH>8+vtM_#?lcHQ89`0%p|&NHMvI(4&t z>*+>WX#db=x2v&)l&-F;KUKG=f4KLl)64oh8Hui1@8%ajJJMfNx7ohG_o7Ai{g;gw zb?`ZivWlu>_4PM5V`2aPBbPPab>UOlIsL77KRbK`6=bQeZ>~FLU)OM|@xo;vRvN2R z{Qmui4iMBl!!wY5dRe*MtDe}CB7*}-ne2=pKB zivFXfp}&hC`nw0ic5*EG%vb@NS$XI^XB(^nkHGAw(=eTX1IF_oKpOlUMnAoRVbE(b z5&=MP3p&qlMdt+sp#+P_epm}Sg}1;clAII$ni!1%eYml78_Hq*A%dtEw7X>@_qolkJ`;MJL*~yEj zId>JuFWGH;VV2z>ndD_(v1ipw9AIPmH-)<6A-b&o$_&7%)k zMdIH~692Bb`v&W7zQpFskFf3BUF>MQiPBS-aPY)g9BydDk@{0OQg;I7HFYFzCw0ZP z_?wBrtJ<1cn8ud>PPEr5|M!jG(i`}{S2`#^RAE2a#dN#S)X=$lz)dz^^b;qjKDoXbxEt|Yh ziabTEG=$}5k`}Xb&$3CAO_whaMTG57EliE6*+t^(C1Gxv?ujPy6r|L~X_)gU7kBn}ZQuNL2M^^O+`KMtkm>$WMxwAyt<~FPVPRq6 zOTt)l-WJkMzgFWj`S-IusExOAr|o ziDfZSh$i86Oe}+#-|-to5lg6w-$2tek`m&Ok(z{@mCLa)XC<~5tii60Yf-v67yGxY z!y(cqc!Z#gpkiANstAs4&p};r4vz02M(?}xaBhDgE*{>5i)CAIfrM-4{|4H_x{D;d zW5T>k6~$<(AO)3*9k^WiGcJ?yV&zUWR_;T?(Zi@cT8?TGW;3+Ie>dvu>p}A0wjR1) ze)*+MR>H_k{`GL1gy`Rg+Jt)fE!1ugx8MH}ZnuTpB;0NfxkG&`vmv!k%ZkJpETnG3B5m%(EG!qTlnzsCf+}| zf%o^X<2^|y-jOi;{jGEOaHSp}Pwv5|qlNf%I18WlXW;$rRJ{8+39ZEmc)cYSuQx{G zb^b!MwuQ^{@O-6zTe$o-doCC({0Fz{qQ84vNRF||QFak&fc?u^e;jK&;ZH|@J4PNw z9{M*Q$2?)%GymyfMQx9Zii%<{TSk81G7>y}yOGnFW3d;q6SIH2wT)}Z&9?nmMn=Z9 z>o;#V-+!3#?8VEML|OF5u`?GkE|cRK84og^wvFE%Bm0-HT)T1W&b^GsPo6Um{Nr&a zPiI_gJO3_uBy;=j7}>kfbmi*xTemarKYYUc$n4)=OT+PuGi~SJ%DC4yes_%QpC-x0 z)oV91n(sY${Pg*E$Li`cPPUzYJ>z!U`23IOB>N{$p1as|je-ESu zmE-}RK9N5yrE*H!ZSt6JpY?kp<9hR!Nd?+Y`TUu1O8=>2-=6c!-+0bHe-r-LV}9>{ z@Ai+65xv&myY(aaNRL0|B!pucPW{0-iT(%VBn;6RY ze>fjnp;{2n7ehZlAD#U=qub1G=ryGm`b{7anClN1F?Iw-j~e^BaCdiy+oT`i;ui+z`KcHcwiY8J3NSKqBOIeP5p4bs7!|bJt_~= zm#rp(o-{0pANWD-Tym1OAmg>xp`GBhK&NhQ@Kwu=FT=a+2F4%01?Pje zG5o+C{ILHH2JgFr0ekPjj$pvvW(?lnjG+ha!v5f0j5vG`PG$Enrs6)v69aKfrzFTh`Rg|F;`zge*F~^ZoWqH?G~ioX~pv9H&}7+ z4KnY)#p(yYkQ&1;So`Q5a!Ji${nPi@@!~zIT0Y_OyDxb1Nr_J+KV$N=e?1`h+mC_N zk5(CG$o-(AGH4qrLoTz)plpO4LTH;l96g!ZbR%>XCEJ*0u#k~qqmRVtvYVIAo;YFX zo@k?Kgw7zA+YfJCJY%KrJw>GG3(A|EQuz46wF_rltwqBjyZ89smGi=oEBE=2?_TcY zPEDsh7 z8|JtV#T@q^FlYP^nCszyfJsgW`q7mXEy?~d=M5q7ZHm>5ET)Q=w(rD6HD6! z!%Q-N!S953JMsN(q)Eiikm8EyD8xrcB5~Ogq(&`9Mq~(bmdwG%#a<|0I0?Ig$Dty4 z6!y=x$07g0IP5n76(lP;NV1c?KK-%ByFYdk?3ihX?F1XV`eUs(QQpiNiu8G-kT!n; zmWNJ5MwmA#iq68C$T`S~3Bo%0eB>(@V0~OD3KJG%bMg{wTONfSnX%ZpN`c*L60j#b z38m}OP@12Cy&G0z-{!U0UzCf3TNn^BoxxT@s597BK*;q%9Ne)9hjwnkkPrrM9A z73G9n|JNp&_VfQb*;Esf{@Bqn94A>rW5v%nN3x3ZB)d3IvWzyAe;eEPzm4tL$Uhs~ zGnMvig~?K`ke~Ahc9QL#xJojYYe#qEIw7`i)a=D=;^KDyR5_lUKZX}g$MO2=DYRZc zgSR)&;VmJ>f4O}T@9tc}yXGbmrC(`_*5BX1))u{gct|4oMQ-k6O5;;1MoVBT*Xp4n7(Y75I-1~ z6B0lr$RSFgz!3FlBkB{{hKH;$%SR;Pe5xu9L@a^N z#k&_CJ$-d%c%BZ+-?zG|pD4$qpY`RuOLr#V=_`4j4XeKHSas!07CUXX_#=tOKYziO zuiRg`qZFe#W5-T+_(=Uiy^|%q|M2m%6iUt#mHbzO7K7L^En{SI3?{z%P*&-1mdp81LBVScM$ zej(G&7c%8AQ{87$qx{U&C|eo4z$a3x{MhmgAIKER=xBa<_5dx9?%~Ouo4C<*0p}Y} zp`pI+zm*^Voogpc8?!9cS02Ra%3Wj`D#k^!3|%6m7=sICTXBY<@yHgOKC~I9i22ru z(gHM)8ujrVIXGRCh4aO$aIH84_jaV?$&NHUElI(n?MZmFB@T}^(|EKo22VCb;%Q+7 z(XE8xVQwfMW(VW`>OkCHF&nqid~qXb2CfrF-fKj^ay7;SSC+Zsa+E7BFLgmv#28!( z8-tK zNTx}cLI_5AEYUy_wCkV#Iu7~rh5S*p>17i4RPOn<4I|OO&S)99XW&3JQTGg^5RSFV zsO1knetye@ki?MYtt|%`aa%W|-729-8e&)2!P=;0l>I=G4-T8qGJW^_mhcd_*1mgA zxnkP5sjhBQr@4xzO`GawRF#@ogOzL6=C5DBVFPF5G`p&rs_I0hB66&*x^|;0YeH3G zYF*6gthH6S>(&=;n5wp5zKm0Q%uZB$tnSz`t-^8r9PC1B6Ju7zuFlF?m%n~0*M@Qz zYj-?ZQ&*K*9a~jZeXOQBKh@g6E+jS44g*AMa@VouSDin9@zSMhw_{>Rw(S8%y%1dNElSJl*w*T8Vc9JQ!=uguu ziH_%fM=`L!kCw><{6ATi`0tiI2Mid1fddC((4avWOxm=D3>ku%zVGB{82U~^hzwDX=3@{ z$xR?i^np>@Mi{3bhAh1rCM%A$!IX?$h=*=B0<%nlmGv-N)c^|ut5x;ry`}-S*(Wey z?MV#EJ&hsj8u3G3BOLM@NolnaBMZ)8kR+UBvKhO|UPy3j19* zFk;_rj3Vj#xFdHlzTzGxR^7*x>Iaxw^8lW;PvPG18g9p1;nvWC3H2{Awc#1O>Yu>3 z;R)uQdV<-t4>7yy9_CauV@}y^%sqS)0SB)m@W3?$@4JEp`z|AtU=cz1{>z9tbQ#HI zmyt;*gxu=O9xKx~7Zs^*jz>&l;_75hBk3u+ z)!2As`F2edCvI0H=H$eSDyYT;ZPB500df))2|2mRhl!1TH_=gU8l9pZ8y}y%E;s4Q zA&^J%8|hT7bsReNN10lq;>eoV0zMsAP>}PJHPjmAnS~k~|&uSsEB}wSSTu}NJmsG?2u3-D0glw$MgQ@obTRqzVE-!bF-ew-Xsx1%${qmF~=B7 z?$g?`D}e{hCq9KC^*U-j#j*Q*+#TYYu2M^Jw9rzx=W;7L8tuBG4haqQ;{+u>dD5A; zCrSsthBODCIC<OVTW=324i)12yQCPX_Z#1IIV`a#K8Bfk@84zXzZAu<|164s zVH^Jl*Vu}w{8uM+Et0U;>Ov=vPT;T^JAZ**!zW>HjOo|6!s6 zRfthnd)rlySATNmLx_Kz57+Zv!lf6baPCzVM7((q$4WoJ;nFW~psW`5mXQb&D#5?B z4iqIS@P4C$?Qhf|FHu8qxf%({^>Ffi1DyZZ2-m+f;Wo)%Azl3yo-{T?!B-6wH@Cps zmT&L{uk3of!ZrT^cu0}G>+99<=~E3@cj3mZWVn`)2p6K`AmYk( zIC4G;_Mf>7drn`5knqb8a4HIXPeg&@_+{LM`x25RFMu3fUu6eQBZ2Zb$U^oZp)wSt zegPm=_<$5Uz`wh}Sj17qoG)${5v=eAf7uQQ#@Wk%`v&ma;sL%JSA(x)8ThPS2mu}< z2=Z72yCfpmzg`5#H!gs4o9E;9p>rW|+ibYI-3`*WPlpHFrozK*F7O!R$#xecP`g0h zj;WB3#VAFpej%eQ#a)qPJp*3)xWOyGSxCB`4MhR7;Z5LNC<&SerNQ%|EMx%^vKK%_ z=t7J|P`O(KReKi0+pr~VWbJqR#PELqGQYPQ!T0_84Uk^H3+t{wfQ2zR;1XX1P6%Av$5ld4BpcaYtpM)j z3TSt!5_B(Afff?eS!XMOd8Pt}okdp0kD}OXOv;$wMKO;+k_timNmBVc68U^3zwWSV zo@=y3pj4+WUE9$5b$1B=ax|z`xvy>b-go6*Me76(C^tExF5sK9Rg(~wnZW&+I)^YMQ8V~nUMN)jar<@Bj9FRvuQKzoKkMi}GqM+E;$PgB^;lmcuZ38N zEv_Zl;+l&sE>{LHCo+LOk`3DZv_Y@49vE~o0FEi=e@x!<@7B>n90uX02ZLek$RQvc z?Fb7eJHnDFj<6VEhIzsvSO*V;k+XZl;Q8IbVWAxi6m^BctA@f*3D&Ed=Ypfx8W@U8 zzQKOMFeKy{3=X>ljtAmk=;37CJUAU}PCN$gseCYwCU~JQn+A9OLXZ0~JN%j@{>AYpN_`LQJJNFVAmi0*$SSXdr!^lTU)=yjh@`#IwBV-Q z-=G4s|GS?vK*N8K{o5cB3hqGKHU)2dB|kwUqP-0WVW_LiKvh+Y6zew_6xI4iC@YFU zS@HTupnQlde+6XOkEktuiBxQ?UrP(%O9>S(;7jofq-MW>Pj8;L#m6_#kfxmvHLvra z=2aeic$xb%a^U^T9C$}X;ZvwCcmmZg9>ZIdDpfvBhw|(@Q1&1h$}*FnH1p<h1;uT#u z2v5(4!K?EjPZxD`vsV zozoHCa6xEeJUrWg(8l^vkc;rfW6#lWfBi&A+%yADZC?qykSFDbvmC{LlF6_gj5Fa* z{}AvFIRL|2T7G5bQ(IED{4FyBW@c1j{4;rv|9XDwq{-{4%)EYi>e|&JSC{o|nR)WE zHLFFlXS6Q9z$a`DO`$Rt2s@}eR2k(*7@}-tk@+gjonky(M za3OH744w^CR})ZO$rU=Jl67ha(djxL1v{mVD;V#2in>AD*Iy^MG3&?utITitXXeLb z|L@)?B}S!Q7bQ@oULz$~rCu-fx+zgBa;Mt<9_nxU zXE*9GI_l%KSWGa~)rOAk456E)DGce!gNY8^VfygiFlQ7W=8x_Ni^lc`(YOJyc>DlZ z@=s$RK87)25C(PpTP(%%Um>1^A|(XFSGkP=_xV#{!%7isk*tR8o7aQ)_O1W0|4Q{- zc-f(jJD!8?I24rs-2TvtVm?4}XAG5`?O=IE3)=5yfV=98Cv)~P8m6DJpP#U@n z%EMMd#r`!=ac~{HKO%vuqX@Vj+XQbb=H+-N#*)wu@ch(2qpYw%Jmjd9^ z|g$hAHB(_Hs)j-gA#j?FR%ys;%*E)PmP6Vsd12(8V^tJ zCPFqcDl@T9ntm5`9|%tW?xVH|m?&8Ee=pL}!0PdXbaTJCuWZk2 zy|?q;@61nfqjg$o90q?h&^g?&PCP6)IW0Om4#0#FJcnFYQD=^}L#})FFiy5kc6LWP zVu%D>5MGt>uLM~6({OD_pYuC8K6H!r7AE3IbysWq=s!&ky;u-2Hxe`*VHmb%7 zqN3hJ8N6ikxH1R$RP!G9fha49di|>4#i-{FVRg!=FAlsi-67z>i}nbs{rvI0>|IrP zRB_R(^&D%iM6HS9%&HJjTvf?+dd|wuDWsMC{br*Qus-w!U z^9np7>gs6ZU~DW@m6yEXynb02qYL`Bw@@@k^qzT>^*N(fV;L0w1Ie*PqkdRJ9p zNxVV}cwSUPeVx(`qTb7@tIA5>6un%7&ZUPA?ccj6Gz5YI{C$0V6mlLCtGvCr!t>{~ z&L2ETz`+AyVej_@2NMv8>l1|bOZ;5RPS=Ik-KuM)-e)wS{&D-`qyh8x=YN&E_x&Yz z|CxU&QNE5g8;lIFfoN<9*5)SAgVz!4yLJM{Ue++GUl$lZs2jKp?b(*6W(xYkTxa{X zT(z(*SM`U*f0wWRaW0~Al6c}E5KkHm%Uy=T3aqGqG0p!^kIP*hK|C89gY$=g2>BZG zkzqc2bw8Lc=?yNMy2H3_w&3Jt1;f0}Ven2<7$`M?eo~`0(S1*;9(0rGf-MR>t!3I^ zA=iQqauygOVyukcsihP&ARj@f=9c=gA1m1G5e~E;*q2h=s{K-OZJI5Vr zy!>~-)*v*H+vNotc6)&*n#_6Z+Xm|nYz21|;IBdRxm8DYz{;cEu>7bL#K(MK(XmjN zf9xR4Id&Xo9*cyTh;z(35d*@L2{8WTEf^M_0evHL!S>uMu(((T9j{b_W%LKIP51=- zTVG(v-7nyR$n^YN6|5?#2hUdxZAhx3tPz4M8)5I;COGoG3Bo^qg|nZ(!g&ul)#LYilr1{t#p~;R>M%c_BYUnN`q;T#-iPj5NNd#F=F%&P0JGa!TrvCEkGi zl7_cGnBw)w6jxWg0%cht)Z)tE6RrY2y?lz>6lTHuv};gtF&Ih?t%uh^i{TY+_g5&N z358NuD4;6s9oSH$FdXR&crKp>Pj{_?2Zy~OBO(OuT-Xn{FCK2YB?;1SUZUot-z&2}jRmN43dR59z62x|UcH6J0?Fxc z;${X6TZzl^A9zZHDn<1>ck?D<)jo0Jud3alY#>@o-rvuB_(<@ib@#!rU{_Hb#NS9xzMGycfH_&251+IiKF&FDe1EHlAT}-$SEsW_ zj1&mm@JD6mH(_sq_I|2Ub#z=@qMKmk+!VpgjP>w{_vC3#4xcN$9t&~tBj2arot0&N z&jKFq0j?}MCJtR-Z{50^o|chmkY&Mf;1{D^hCZ6ffnv(g7BA!e`;m{h!idjs^;&fN&6Ko!ut>f&Q;;@iWT0EtBP^>wf5yV^bH2q5 zH-TUzZ^Z1!nGYRA5vSqG_1GJ?@+}hK&RjwE{fvzJ=2;%12nV4R@#*$m&b_pZ`wo(b zh|^_PugB$ESP`3?G<-^GQ9w07Q(wIdUDzuLVHVNFz;#tmVHdYW?)C?GK>q|$00?-wG;3cbHRSCIrQ7q0qnin z0e>e4Gpu1-mhCOmLkYcZo83td?Ai4|>yz#~+0bn#6YMa$dNY1fP*8S{a(qgLZ-YU} z^E)9e#0;qeVR960H@yiN;EoFd-To)`A#?Z~j3hAP!(kc9`_B9a)qli zEO#3VE9bbts)aLP?b7+MZsk(&T)PT3NY=ropS{#=+qV5(KlN8n_0Rt4?{jMAz;*gg zU(_@CZwK$dZQvce1$OM&06UOcz2h)4E~z7aPu=g0jK!V!9O}7J{5Mhs(z}0Zoqipu zH9r*!lyv&|_<*mUFZc%dKxlv$oD9HqssBp2;VXg+#TBAUXOV+=x2_Nr^|%Y9JgkvC>aNW??$gMed;uOKR#3JW^Tl*6(Wl&rZ$n>K!xY ze|(O11gY3rxR;KR@gveRQ{jHrJ$Uf&9%N;w!9%o+dHf^;@^Y~knx74C5C^J2jOg9# zeE3lG3_c;QRErpt>Rmagan@<5L2Ce{-850N6V6mW7>dYFq^kE{>_mzsh!mc-s=cjZ z|D#%`W=Jaj3mk1&P|(jz&uh(1L7qk13;_S76^osn)FEO6Pa@<-T&BuVq0<=$@`F%j zH^G&Rwh+yA_9(OL%OAp#g+z=4bFQVObMAgS!T#Lb7`w3-!kl>A3AvV|<`d?2Jekbg zE+#$9;yThidU0}JPO!5Z;cU(+B}>VR$~E@a78)$1UKO`2Hnyy6DxM*~rtUJ{>=b)0QBdOWv-#wS@g6ySA0qZIyKd zX4b=hmtC=jj{JjBQvDxh*Z)6_uKtRL^zG9N2H5w3!TtF#!oeP#9s9xf5&dDZ(*T(2 zJP@Xj83;4R4uqMAG0aAcVGh>q^CvmL(kTu|v>OWU(;UEa`XJckItaGR90*(H4uY)< z@IF+3x-S|Es~4e?bRi<lvWHv;C)9SO5%3t*PpC~%uL8fM^LL(`{Bgy~Z! z!!+R(m^N)1OrJizjb$=p#td+CbHnG)2JDx>qD6~f$&w|o44t_t*2(JCtHIsf9V8M- z8}kI!yg+5kKba@LGb3Ud|DET*vg42Ak9vJ4lDoVS@kiHP+);81ZeO$xmMRv3tHK4G z6pqkKVF#9Sb7(I&0t1{CbD#PtRp*AxVn_j75*)tW)LQ|^A z$aE3h`wRnbe}rxcAD|N&Qkh0o0p~&mv_Dq@ozK36A(2mEYUF)b8kqv?&fJ2{XKsS` z*+lR?p8$I<#=-GRSK-P9G@(JGu=F##;pu5VcoDu6XB2lR*@eB%11sSZ_Afu3l)$Hm zE%4#&PI!007pkuAhLSiG6eXR87q`wK*$`273`&WcPx0S>MlSN=pR~;~$-ifnU$e&@ zs!yJg1vfJv!Oi=R(0KeImRVl%WblQKG{UNPMh-9>#2j;BQ5*3JbqCL$g=1QFF+fhl0%ekMo|j=<^F@*%_IS^YUKl zNA!8ApW2;t5af3k-Oto|l9xY*ANo4;9`9ay)}ta1Xf6SL#}m!X-|pSxA>}UZn-TA3 zGSnu-#$3OKe&<)B9O=#UZ-=zLf4g*o(_B)k24%8RtyGdq0eQtyw|TFCa~p1|6XRoJ zqNBTAyLz=99G<};YY96}otjkEUUif;Up{-{$RTD&zAX7Bc{?#at}np#YmUv$mrfmH z9RXq` z|A3o$Rx>MuoW_nl$%{C5srj<0pv{v0J^h_u^;>>brIYR=UQd1%8!C129mcmAev` zD8s)tgDF(&6I-!^DWL&l84C2=SfDdX2Ml@{{I@9b|1=`}YkvMeH9Gm9VEp}6RQQkb z^URqu+ZcgVo}M#j4lEGOgGDF`T)cG_ERngPt@3nOylZM3CbD?13oP9~6_y>C1}pc? zgw|I7!)o#jc1t5tGa=$$ zHbkU7g~$vv>bw68&SyS{sE02g`cWaoJ}!iWCxwvwv=CCz0Of9OA*5p5!$|uX>3F=K zR|uK;RJ?@y&tAfV=dU6Anrn0m6{im#&Sb!x@Ov=x#9f$rA`K=SzYk-MKY&pu9>R!YS;)l9f&pk0-Va%seU3bW z?nj=0?V-nDdoUYp4?F~0WNzB-&BVBm%uXsYz!qcJx^+J*Uf#`ZDcgRYV}YrM#A>~5 zdV0Tz)rLQb)xxNwhu#nV{QjaVU&t9Cd;dz5^Sre26B?h0YEob1yeKXG9KyR4c50&o zhs$%|-w$Ifbp=`hm)s`8AI?Z6w!JURE%Xq669NHCw=qQ9w(;J*$jL8pO=WDL4~4G8 zk*ALyJXM;fUy&^~D4yDoSAkUZLY3HGUAU)M67@k*XB=Edm#Zb059fqptBNOQ~Dqbd!4T5gPh&`{RV_JzoA-`CRXheBK?g+ip@FutWUT z7LkQcXs+5GS-}QUI@V5@ud#lj1SWJu6X@G9He+CCeFcFfFZ(I(hVl8z*vLlp7{7?L^HfFcJ_ivatsBA4~FmG!o{x- zxcK*hX?}>0OYLFC7JHbv#vW!bMRVD?_OM_^KM+m9e&ZzUH%`Qu@L$E>@O`T9_^a3W z&yLF`qj@bN9&6@If^~~ru?M*bdys3|dXH`T&tLU9gNz<7?4;EjyJ2pIr%M2LJ_s= zjUt#I{~V369>TWE$qX&jb1>P7pysx&mD&3^FJc#!XdbM@etg=9%Uj1b)>#e zx`3GO#baPr?rY3oaVETRku zQJjRm$xp>-NJz0?D6G32Suu!v*CK1C7FjeTGHOU<)+iAhSH3L)WpydkQSq+qM<9+~ z_rBt1RD$wDCDeX+3!iJM;mgPOp#1y+R9|Y^q8<^C1}Z4#4)!gZa2@g$dzH=9I)uXe zDQ)G?e&nA_p<$ag{mSR9Nh6Ye=X3O9tQub z>-J)4p@Zm@1E?b5V|97)>sN)5%z>OdR}mr0jI3X30ka`5vS1+Rg1`lfQi7NeiHMCV z@_l>7*-FdrG5aNu$F78~JqO4&`>PjX!GyRUK&{Mx@0?IWB7u8^}gGc$Dpktu@- zToFg^X^ztrPD-uf6DXuKWJ0l-=R~ zB1F>3h6~nx(JNpm7rHu|L-$GM&~v&u^qOT3z2|pC@Y)>uFEfWhtGO_EodpayVhWVLaq-odS8@Ga$!L1lgDZGY@*fz3?Eob8a8Dj4;ihC+n@~b8Y&I%H>O15&=)%&D+QYTNtl`~OgR+*VSzfvvy%Vt*M}{q%~()+7a;{0Q`m zrA(~;^p5?l!9+7F1a`k-x@-LW9_kSQu6tMBmP%_ewSGnt;wK~=eni6IZ=xYZHpKYw z3dx34AeH1pArcM?p2GVVPvG4%jQqz?^)w4g9^65n*cdbji-PE%$UybuUg=lr1Rv<#|Fc|qmztx$e=1C%3RUv|I)%Jw6% za6eXqd)Gj5*cx~lwicf4SqD#cd%(?5PdE{X9x=XN=mm+yK@2H+6A%0L?N`b^z5M&~ z-zl5yDM79VO3s##XThjcSI(~SuW@sC-pt{{vGap?uxuD-`OL~UIp1^e-vC$S${!fU z6?j0W4ZPQQCd?GhJY6Y^OSpp#wfkIBFtf7qN@XPhm2?LZ9UZR3C8nky%5bI59fVUR zJCK6Yr?12(-s7U^_2Z{6waWU2Y2SqdVJhAes0@&gKF!Uo9KE*(^zYu?L1G~PU}VwS ziz~xT0FC>%_NP0988|%~vV8fh7PFS+GpX-N2ljo_zr~F2ATzKpaDa5wU*eDAl0Hbc zPOS^KIY`i{#@*?*8{k(R9!?M#e}gWtv~5nIaYoUakb3~MWQV^s?*92wjspJC!yc!| z=9U(~u4r3O=fC#=Y;Fb=vHy-nJV&?Lwm`orsBdThG(!hvT^%Tu%C^822q4%FYVr%H zYd?b;r|UZWjFLF5f5KMyN2DiJV=KI}q8L{fB~VgPic5fUcvx8tw<~Jk3X+VEm(;<& z;(7>vQ;+hH23Y;N3Fcu;c+mi}UpB)0mkl6(sRqeQCCCdu!;Qic$SHgYx&Jf@@v%Rn z0G<^-gBLIJaX-O4D8dFyFerHyujm+`<}t`XU`xH z<7wVAK%*~sh>?ZyAm?8P^_;A~KIcg;Hh&&L*265wx}Oe@Gwwic+D&+tmH;o)W1!-} z6?mU@5k6&|gU^{~;Pd@R_>>U=AJR@ib?ONu{T_qz+ee@z=^zv*?uR1uYJL^F5511U zpx_$r$95$IUSm_N0Cmkd=l$R*(&nDvwV8d=3!dP93t30ELiVAJaR0zYNZ+>}()LQ= zUYG~m!)x+x=vuhDYYp5DUIi(E%i(T-7}9Yb$wPX=OYbT0YTI~twb>b7ZghgjsBKQd zCg+(2j&O`Jb(}Q>4kFFw;2iWW#|Gz7^mID0WHg)(=H3tR(H`*y;m@WXKFJi6>(y3`hD&z*;p;Sq2IX(44Bo54!6ZgFd|@u;~^+qwC|=)Ck)~Lu&=As85QJ1L<%zAtiWL1+e9)I5#9}ES72+mu zhE{w(BTfpz=je+=h?Equ5uKNk!mtc$C#Hj@lUS~iis!i5M$nzZI`F{4mN&PTICz4j zv%r4^Ps})=p^pOw8x&$aK~Fl*Ohh;1v$Xhh&3GTNxE};)SfF_=w&M9y5I1{}XcEty zDdhWec^82#4k~&gIxh%N@a5n;h2zEljxr`cNvM!V#sQtzPjqK+wEqb>Aaar|1|{gqbK%vi0tGUPkh&y(xR19jd?UH8g1`&W$}1pzb=C7_de4!`=@*M zQ(l{O>B?z7k=iSrrEA58F1&-!+D+s!tnJ*!3A9}4a?yTf`VvkrvEt=Y z!2q*ho?H_=v=pFB{9mTnoZ? zCAm_#Yd|3`VSJfP7E7wt0knKsEGDx(!SEMb=lZZXrc&UVaeYlWEGEr_M-sjquAL)D zr?;Q(@8W2u$K`Y;M{`W=)=DAHEY5eWohgexnhXH0V_c#%N!B6BFEP%MYePceLPA<- zRp`e{ikr^W>O?Li(&U|qPAUF{JaUA&S_nOrSULUP935gq7*4b1dC{45p)Jv(KU3!SEH#Q zv|txXxlm=x274Zlu5k%eURN>+6S;=Yp|gQO_*CN3jYB6w$8%iy(;=B*Etp)Sq}BD} zu%-)&BKWR?-L7FP`NCdxLUMsn;#&d{f>=(-SsDH7Z4SYVB+u1FhABD4!d79lzGpqz zR5v~P7;(zT-`YFG8m+k_jgBd=sE+OBEI3815~@1XbuiX@L>PU`A!f-{7jfj^Xi&8_ zs1~a`sRPxc)oa>D>pt~9brOy;9FywV^{VytJ>z!7_o;Wov7^3qNBtQby&AIX2R10{ z9UEHB8q69-;#iI&v>|x38C$byPeWpXwxh2oAvq;c_fA7q0|8>TV_;mujTBK@Qc|M! zCtJT|KHL|!t^Jp=8haPA9D^Y)Het1uRky^gNr_q$Wupf$1xMS9>8_2FNuRjbu5?G4 zUqW(XQWD#bIVf<|7?+5ZCmS;gnU1JQjGIn(^p6!KC3H(loJekFDGW5LnFq;9q~or* zc>Gv6#@>i^v}#F9IV6bjs}WU^i<+kJAdc(ko)G8g*kqNGJSA-1K%Rk@@=_B~#qnS5 zZnrkhT|jsAS$!j+uaQE3?x4+gn{Fz7*Sg15tVOUhA>pRcP}1isp;|mE&fSj7oi2%w zjnnG$)$Oaq*bio{b&pM;$7u&F`s)8R$7Xe0+}fPF*7&dSUxzmreI46OYo6TPy}7k} zvk=D?9H(&DXZ-$V$EVrAP%FJ>y8XZfg&-{*wM5rv!}k6&Y)yX zc@f>wH#@a!*F+=734KYU7QeonfW90@$83XSox4o)$aY-~uj+X8cskcNy}u=+q{j~J zH|AC53{8K!u;l@%$j)Xs%5P`uiv_(VPS~Uu;n!iz4U-7{xrUN{4_nALIvYSlccf>r zw}?j1^Osg_-<-Q)=q7R#ne{EvlL3x_*^Z7`>v=D|vRK|_;Y`M)X|YROu% z?A!OnbT6{>D`yjr;Xt#fCt2HxgL@lSDNlXh8q1hUQkiX7*IZQqcrS@xJZsl)k~@k0$uU_0 zS?k$^d&~7n3FYI?i|wcEO&hdqrm2fkt-diks0W*fOG=rvKp|8Ljhu&#vj|wjF&w&} zcb&N2gG`#_vGzs}8o!RO;0)?E+F{&G)q`QmVF;z)*UFyP&iRnlhzZm9&JAzs&8$0{ z5D*u0Jt>);$Q{!{o+|WNU}U4vo#~;f=!^!y3hn9h+K1 z8V#Fb8wWKlR6-LpRn-%#G&+u2*(^sRKIYz4+ZqmOt zaBLXJ3T~p)1dW{r#P$*#axiG@*>XVW*x>EBImBU@gcCoAnL2gs;Qc!r^XutZA3L(j zH-yy=Yw#quL>D^_scoF7UfQ1FmGw!#oUu_+ewX^dzr#4$JR?4Eld$na?zqgkN_y;x zIZ7wZdQvy{bkGTQ*M4-3A8}V@(Py7a;?TNHt=@XR&W2HEV|To4*Q%?#%fEp#45#uKn$h%{uWRb)S-6p^PHr~Sv6r8ot3@-bn5KQzkh#$}d-dwl{?NU}zr~)M z_bFp(Ss16)zoiH1-=Z_TEBU;IidGj=(~?QreEUpJ_-3M%d~0>YPjSjODjbw=zeOtp z^u8A=7oC!?)lZyd5wPTYys{4`QD0a7MoXkaur(eIb&E(JNYuSa&+*aKtsBaOBwbVO z$KNgM!VJMbQCBxUXDB^Y*MDeEyzXGmuG=1+O*YSeq+`yQ@u04jlnWB+x&b*kdm!g_ z4n3PE{j_`j=ng>}hjqH9Gqa1zMY#Z02PCCF%}L71iC++%JEPNl3A=IfZ1TL)F*sS! zv18Y650Z=t#>iP@yezcSEV4kgWnxG+#Odmq+C-PEZpn$CovZG$(nv?iSFd;r!P#-9 zx}Ca>B}<;>FtwGHYco9c^mo(KmGR_UNz&8!xzSV8?rmIo66C-9}4Tm6;9cirr@%w$DUavxTRYF~YVB%9VNJKJtx%ZB;~-2$j@ z^xqvJ&(`CKK{}aJPitu%-*8y%(cnTJYS_|pr{OqhXsJwUxQaoDJJgtlvkR4#nZE6a z8WWcmpPHUzPjV#DlMHQ~MJ`He^dWu7w~f~$80LDLt=cself~r7CT%CC3-flCj=uH% zgY!BQz5JJU(bLQhZkkcfa0$qgb?fHt@0Fn~l$GMHuUy(NQ&zd|+|s5?Lr9Qf5Onil*(m+0(O)IV=W5ql)yqM^Imsz1|3@ky=DW-S%!K`icUECPFygJ1ZFSRD;lwcHH0CgX-G#DtVD=86>~$tWwim@g$P z2n#Z&t5mFIDVA?03vp#&LYTHEiS}el;Ubb~?V};E9_@n4c!vq(Jkq`F_)aoR#3^Ly z#gNVh(wdGn3Q-@zAVtn2d7M6H=hZAUbgZe>)}L!+J%*f0FtZG;oNF%12^JlU*)T{K zrqE|``ja%fDa3g<9Uy%A)YLEu9afF5Asc*ZY6va23BaHW=%y&G6EM*g&k4W5vJ#FZ$A(Sk)YRB2i%y7m{#wBV$#aVC$I`KXjlQ=N#zDFh+0lK9`Wu(3}zy+Sf-g6`hp9OX@v=L?1# z>CwV&@(fdjmXgur_!t&0piZ&Q)qSu}Ip4>i4>Ow9pu5_}xgXu1wz*##BXk+8>;${W~occ$$_cIr;F%f zwuZi6J8acJYa$&CveC5@UBevOA$q&IYYw?&7bHSX;%C1z~v*hCDPtlO-erkZCzAu6$5 z2ez>}n{UbP#c2G}79gf6Zw#-9W^*VK|SPA&(ipx3p~U zioW>&89m&phfz~fLqpLt`U9t+3-|iiD6D!aH6MEqGuXSZ-;oIXEXrorwU!TwIPYvZ zx8HZeyEO5LeWWsFnp|UcPGC=ZlXhP<0S$u)jIuM!fF4iJWkyHLBBka%%n5`n3@c+Lw}MEv>`d^i1CMa~k6nLB#j2uV`PogX~ye zdHiF$c}h(Op~rznt@=4J4(+Bezg^W_=#;B$HEg)Ts#I5!m89g6i|NR^*1PIt<+E@7 zHBq)XvZ|UeWRU;O8n&-Lj4w)Nj7_ zCWF*x=8#X+JqYbVI!jGS_7Ocon+|)D)3b8WLas=qs;^g}v@qPXb_iYb$ncpKBSYi6 zq@$GRvydDs0-xmG_RRjQJPWx>AewELi5Hi@eaa9i(fc$RBnn7|UVZrX_5+#yTYU05 z_Vqp{=&{|%pM1;VD^dvNWwy%oX3y7sCJGc2gkQV)?&fdnW+o;2_EC0N9F*9zrk69H z;S4X@8S7g=C+9sU7w!#4Q#Ap77v!)PV#$0?NyroFJ->ul5>`gL44;nac*^{M)mACd zuTj}Z3=}>P^w;a3HITe;V<;hyKf>%86b&nJW2?T<_fC%<+?C|05q--0u;OKk#CTSs zlsKUl3?%~Md-a@5#N+F58$t36^$2DsF3jwy>Zyt|up{;a+GX3(!lZ<#3pu7s*|4si zq=XH-%G9WbwPAKoTNf!|UD=uJv%xObjwbNqJvARWu4B6^HYRlbna17tD9b#ETo#s` zoSmGkSr*pWl&*DWvQYb*w)-lQ$cYY)&5m=Axt@AGJ2sY?y_~GIdl1KWEULUBB|6Sl z9_&v$a(`{I7mw@ixz)ck`8m!fn?mDyg&OV=jUO;vc}AY>Wy9U*Az3M7T$nOk8Pu|y z9d!Gma>VIuFZbyl693Dk*(01>xr5qkYHO{}3>W9FVC{ChtzVauTGKfPt`FX8)@8A| z#cLa9VcqL~dy+k@4T#;Hw(RZjku`!`U8%_S3S?&cyb&-pCK-k^*+zD$`<}jA!%cR` zmSxAd$NBqbzjLC8Z|E-RM(oaZ;SHW;>z|>T68%6oTiQabTwON)u&j)yzKqez%XpE? zQ%}h?Q@4!+-x+ePS;_*5iMnl^m8N;eZfL*PP`z1gs6Ouy(8vo}Kw26fKXBYYU8&}8 zI%yCecxuKPvg`6>FQ&Scsb;E2b@|MAyllal&-sM9l28+Bx+aJa_fe+FG)<}mu{^+e zr82;|QPp^+q{FmTT6N8;W@ocVJUsT#-ZrLLl~UNOvQq0#ux(ax=Jjn)$fJ4e5-G8* zBS{3xqHQNncK7hGB#CK;?TDc0l4x593_f_!gI&_m?Y3pVdzKvY!N#k~7{qX077-lX zKiV2>Y;7mHmoOwd6yAf$!6d1-u;(zIjK=fiOfI3@`b=!{E@AbzV(>bdnHje4bp5>5 zWvli)bDnRnPRwZfw}!rSja7zOf0dX+a`kdR>3L1 z-aW?Cc&vyHec3yRi>A4@5dzsD3~v9I!=wXf1wxsz1XDf$WI5>~IEl5fCkv9{I-V%ncJn@jUaTWd4i zu?Kr+Mc{O4T~i&QbyE_^*}z*b+N0B{T;A!Fj`n^>lZ9L3v{4Yme2iiMLCj+88PnfWh$tDcjYl-*N6&8Bq2Hi}K3D3rsF;TjTuPgRVNbZ%A zI1iloY%%DUXi3H0j>&?enJjr1S{}l6HojIS#3V?Gi}Pl=y9*>*5)W_NNdg4F+aRp8 zq`;&^`cz3kG{=v}VjgTiJ31tqg8SHcdA)mgv!>H*&hmUyx^?qrny~!Oay<0xwZx$) z;`;$`g(W45#TSITqkEdLhceae=j6(x=>#hxPu`nu-OTfI3 zvCmrHxakWZHaVf&4X|GTbd6TBP)L|snl`py*FHH_)0 zDV#m+HWFj$US4C`1qUA`M4~vZ81XeRM~wK|7Ec*L%w?Wua&METX;OcK?q;k!zf5M5 zkf8`Aw|2JUtD3g zI7MNXQ4}7x))j7dO>l+bogdToK=2(KXEA$~l1&8WJq9+7lVPMNOw&&BWfa;8MZpwU zCquL@K0eNj>zwM%AcB}$XFI$jrZwm45PoJv=i{6@ffngsR8)6Dh<~u(tdoF9UPpIv zf4Z7cZ^BeF*2XbC490Zi7%{3qQ7*VlUoAm=kGo)0W5)Mb#YDOZ)6b*}J$O8?@TE?Q zyu1BATlPvcu3q-#46BzLc`Jb>TT+$xzV9UyISY1b`=XMwJUVW z^~($)oOzlV$vDG=v&?h&zFlC!MXgI(mzn5ec$Im8v7dnw_`Qrhj8Mg{UBC=s1+fFz z{=o2K__BPMa$rfB-t-+zFHmgXPT$7d%1qtD++?)D_mcmQ5Eaa;yfasM(Htul?>dhqnqoZ) zB7M(TC6M-Y_I0kx1nk2E2B##70uzPw>Rq?MFHshj$j4n-s}jl9M3Nfs>!^We5d(eo zs@u_g)>s=FE2^B#j4N4$Z^d%!kl93exyY$~THw-YEUON6`&873r}+?Kk%le~)+{v; zE2|%l=~NxSUBal+p*^6P?=m;8xX$Tlqaez&5YO*OW0pl2#t5{S;d>YEjf^A+@(hEZ zk5f})Rr>a@c7|w%98WG;{6z2VsJ9GG6@&22HD*;*mg!Yg;7-sF45Q(uqO6R;+ehER zpnLXzk1K`S#%C{*q?%M0Z&VT6v=Yau3`=h5o#SYt_%@PuqyX$J#P|98Z=PDtM0Ja*T2>Ld_cpG;imrD@UbWp*(;}F%ZYhXXh+*0C<*;()$~IXl)upARp_D|FI{!!Ei?+Uda3|~I zn-{|w4_7$5b_ztUnh4>`#=*&@W8n0%v2bxleyIG&zT2$zQIhZ}kZ zFb(+K?Kpa#A>rLeclV_8x_4)AMeV?oPV3|;r%7jc&bE%A4;OXl1Qtftyg8o1&Jwz3 z;OT_|PX>+dMD_URD?IfCzk2*m*yN}AczR-wKcB_|n&;0R|6FYHGo}jWf{z_AjIaRp z3`!HxJ%cpf!X4l{fwP(43o}EYu#`t$YisgjkN+_25wV?Qs|5X`rJgL$fcgbaj3Y8e zsO&IlZ*)~sdqa4L%n2)|+WSh5ZrHcIeD+>ZkG=i*a~AI=caslxlck=!NxG-s5NoB8 zr}b$qPk(8@-O)(|t<{v4@UzX&+#9c4&rff)kH5$8RM3vo)*3$uCnoSZP1E-D8(ZPQ zm)_?4tPc=A7iRAJY?Eu_FC8p=5Lxbd(AbBwi2vAF=ZdFK?=rA`RJPpszNf4ps$)w3=`QV~s9-U)qqIlG<#|$$WPp+m7HD>hc zU@HT6`osezW-NvqgF{-&f~-Z?Oa^!C9$+tsRmW~L5AP8)Gc{y|#PqpIhj7bXdVFKV zUIz<@hVLk=wqg!@kB4^Yt3AaH{48Alo(X}77o%lv95aCRbRWr-r7 zSiqQO-F0uS9J=d<2V2iyy0vWHggz$L&v~PxXA+x(EbQkK%tO|*m4N~i`|Jog&Abn} zLAa+&=Dcs5Td8tdhZO5&Bq63LtmiYWecC-b%V{(+BME7EE;*lrzHSTVEtovPnm*TQ zcZFm4ZtJa8W?NMgqU$=!^~0H@wKRN&v8qdYo`9}u?W&^VIAG6Kd7NRZ*s9iRP7Y~T zg}N$TRd7GYQPK*Ho=Pu0;BKA1%E(z?rLV#klFtF(QB(1B8iu~AQ2*H>RbYgPe!5wx zQtq0v2k&&QG;XTYPVZQ)l+G4utEkcWxwh>G^&z&X9&Lwoe?OZ^9FqkS1lO;o98^ zIg_bl>dOlcA819IVvjSNagNzjTe8rvi>WObf{!izY9lk)aJtf%u4g;gi9GEj`lwiF z%4IRs?UR|ar-xWB(`?$>!6BGDI$q+pFjz8wOzP$xQZyEQCeY zfFOo7tZ_jIyNC+75Enoei@Sn4Zm1y%J1F38wGFt{y|^!J1*_K9YOAeUTWi6sYOOkx zeS>)q?dSXbec$VPfB(RHz24VJ;)Dz&nVIvP`?>Gu@o*uOUA1pqC@Av`Lo$YVS*nWm zV*kqU>Hlc%)e$;%rw1!cBMk<$pQyurBs{!N&{F}8Nw3kmyVF#<^5fR>o^PY!*S_|? zH3XMl@w;leVSR0V{cX04AAy)CwpU+1LcU~{$uEt%De8O1yDhx#`7q|9+@%}u7M#0l zMXcf}@I8`LK)*U$TEDx1L0sx5hugZ?`FgUlbDC`klZhF&jm~%dWQkMjEP=RJ zHQ!lcJEkRv?#|(r&PwNpv2$%zPI3)(u5GSuone*pUyzFo^KJ8O0mLt*>ztEn*BvL3 zfyFk{g2lEUu2tHGKvvqqj4R>(H##%TwipfEhs|eoDSN%G!?xb$k9)d2UvD#s5$dM< zV`+*7{+q{LvaPnYO+<8?SFWu}^jGOpthO$zb!OY5ah(VJ70TZ<3vG#)TOI25!sO)j z_F&tB(aF6tlHVtNY5&NU99=gjqI~q6(T-$deNFA0nUj(iJSzK&tsHvMwj z6y^PP%!q}!OEw72CMU`6o9>&AQdM+y^3>klg3og+`%ODQhOTkp)?nMkFIdrd;I5~p z&dR6fHs#95c?uo=p}REWz3Fwyz31t~hxDr!Q+|z>wmCaGAOD@u0rQgF!H^$_(W!00 z$+kW@E?l$X$JW?zy_9P1HxU=v@D!(-C*s$rR5Mv_Sl>I(Foba1kCovz^6dU_TevNm zwcme^;ao|$%@J-p>RP9e3P$m-McF1l|8T4DXQaw(qs}yqD(}NLb$*cjT9i<1ygMa0(qMC6y6Ul|KkhrvK_c2PG1?Gk z8@`2S%%^5J|k%AAZEUci_}Fe#|{2b{Zvn;1}^;A zOpRK{n_RV-u>{{gmme@kz_`m)>qOAVHct?PGv1n8w%!b8qB@ir@Rg(DxBveAzE}f-Ghf zw+o}2?#O6gN$MIYY8|Z#aZ+hi{dz(ol$#5l3& z@_>KI<$=pZtz?dTVS&}T{>~TgMh}c0_-cS$J5YoFQF&!x2q^=#{hy*&252zzePw`3 zy)wz-7&mrs?B?1Ymn#u_`AdnOhTIX!SH=Ym+w{Zb6XNqk2;A#Hq+Kn&{LW2Rqb_2I zRk}6qcR_8DX-zpYOHJ{{U3E=G;vzHbq@qyFVu*)L$Gl_Kc?(oyg>@HD%E`#OqB%u& z3j$11;Ka_4v{6{m)48A{GU$+Kir}dk$B(cT~OYM|9gr9A+xi8ZcYKoK+9wC>j>=T681SsCf+2`b(4=#u+r zPJI!$ilB0-Z@)_Sz^^5>Mdcw;d3bmaGyT$^o=Yl9-}?c3RFXvdox z1eui&*@+{o_Ek;FYbfg1N@%Tal!BV(BAxE>?|#6qq(qO{wU#DjhtE8RK&X(V?Pmp8Xnk)u7>VcUut*QPj;@MA8$+$PU~(QxtzkLb#Pde=*FVQ zeF-(s6mmI|pzWYhW_F^w7C%4z(@;I1;+U4N4<++7!1d`7@-<1pt$ zZ!Vg3JSo<(B=|ym;iud=K*|{E$EQ4mTnn@>RU@*`u=*1KUcq)f90s{hFATrSM>f)y8+M&(3O7upS&= z(V9~bgdykCb4$Kt)jtPq2N-L>_fZ(Wf|fCzCO;^CX$%1-FFgE)yL4=ws!B4nw5xAQ zM3?|!ao9`_oeStZrVEqL6ac1BAQHvVVgWsd5lxpNqX2U>Z47NJEfLVip-J>)x&qKr zXsOIJBmC{}B z4&kwOvs_#bu=yGtAEgPZ*#aR=*VHf6=|mz#a1k<{cjMw{x@`hl5m7`SMZ~sBwT>zM z)Pu6KU8iHQ;JmnljVKr#j*P?M3OEXG1COWEL6S4n#fwAVFYDS5=gvXlK5#IPUYS5S zAQ|t?&^Ivj4E>RIMwL!_wBL2V>}W~5?x=*z7C^w?NLhg=bqFuYAem~wxIKe2sQ9DALNHWk(I z*5%oL@DpgKpgT=FP1SgYejtOoIpg$x6Wu(7!^VL@*VcvjQu7d4=7S$uS-O@V@gMQa z#6xqHx#yud!4gG85eb%rSM`&}ak}Kk8?{O8^qMmOVlo*>2D2c(3C0!8B3 zfB8x1+DL(8s94nOS+oBs5LGg#7?dh=!NN(SK&4^?SONLZA;-oL=eapI7VMZg7JO0y zned8CaD4FuaAHM1_rOpeA8lZsICgM)vSSOhxK5n81@ja zxdC=TuUw}BOV+Bu(&`$px<(7?V5`;U<`&S_-T}7k+6y}N?gx81VXgTC`=R4yKR9<_ z2e{E$3vNRP-JQLwz@yFu;Mu_i;N{^ppznASc=q{b@bv6f@ciOV@TTWe@cx@F@c!mL z@aD#T@T3=ZH~-=U=(&6zT)K1-T)1!noI86CT)uo6eD&2=0G7Q6y;rWnGI%%toI&-g#^k+&d^c<=s0(D&pCc=fCwym|fy`0M2}*opErfc-&$K@W>W|F_wCh*SKp z@&7o)|10^<|C9?HYSZ@LZb9e{w83G8&5NzjC1`_V=>C5Wo7DpB|7m8dHyOb*gBje{ zTfq0QHQP1V6~6m#JNV?49kljaf$BH&KlelbAKLykeEvJw4Cy7*1o`|DV382{D|&44}lb@ zlpB>Tm{c05{DJ^Bxc8WkHgKdy&dODzs>B4^zoDV_UF6d$!A~@G58|qRV>Z@IOXi-fko+dnB*_&t4 z;g8z?9O5_akl*}7IJoxXl0@R;nw6zH@gY37SM9_RWnE4HSEN&0*D32S#oQ-iQtng6 zipaaf3Q;`vNN#Y)$37Mc^Dru;ChxQv+|QS% zsgxXLo$7}8p>e3OlDu<7`~n&`Njl~35|h@nd-{@(cvxiZF8nOc+s-q(u`p-7(iiu| z$3o1+SL5Vrd^^M${2s)RGlJw1VG!96^N2bKazC-3xJvXv3_y76$mW|SMJLy#+sD~uh+&mrzWyfu<6 z6U!6=kzp!_P@71#NoV>B;xUBH7E(z^d}&OUtq{ zM~S19ukqLTG)nEFXw7`VCjX74^}?Yju_z^Ke96E{FlJ??)#dAeB4TBGLA2jyb;m0F zK2cmM8lTmx%o;U9EGkY(6J4o06A&Uw5LMz8)Xfj0qbl(}{Ta=3Q2M-6jV5_!lyU^2 z!`tUqHA>{4$~RJ$Z5)Yh7R@f5?NdA|(O8TZ3wRg}7pbsW`v!Xl{}}AdBfE|I!9R>o z)4Pq3aiDY?=N04Q;tw0?*kR-GbkyyzQGEeL4sWAjD!q^*PzbI4`;0@lv+qFN`Jgdw zDlBg9Yqar&N=gwVN!6<={|M0;MJAn5m)>wBBf~9aQRhFGNs1uxHM~r|Xy3DM+96|` z>Fpt-XoQCE))-t+jaTCX-=;)$8HZqv|Ae-!f_!;qIlg3nmobsrWvuL;L*3ZaHFrpy z_^h(in4GW9^-n)cT*52hi$uT#PrzL zoUe^>?RCM!m<*+wM24J<@YK(N!trIe3jcg7z8}AU-|VHgKjZ1nAyEcvdLE{hbHtu1 zEc}7tPrWn_0}b-0#f62%#iP&+bv({7&H=S@Q1Sjf8dCedcyq=)e4KHfqE(J1fQw~i zr3v^-X-jnz$*++|^!r`7<5H9+Yz+)S8>iCC>!h$MlgapMxl2Kf7b>Fb-0 zCt6zY7FlbW2qdMYrKTj08)rol)e|MpecrMWNweP3tlx_JdbcN7&xLlY z#S*UKVzG29?YSn_M8lmLQ*1`p)#k^v*;v3(djss>R4QH<@N^QO{z; zs;|sSAUaGPrg^sWr(L$2`nqi4FSnb1wk^V4cAH%6pYJy9#&X>@h>$K?T`+qcb}N-% zV4r6@n0CN~y>FI_sWLB)REeLopD>Xprcdt7cR7e(GR?Fuv2L)E9o8=EIqMDUuhuu# z0V~f2uXvYC5HxjwVeCC&3~@8c8F}H_K|0ntsq!ZOx>S?sp~3{!&Q{03Efbx_bT51E zzg+*F^PY*kmyv^C(Yp=It$$>49bS>zw?w~iV7Ynu`I1=lA~T-Qof-f;pPAkaJTsYM ze?34hcC3MBz`c&+j$X%I#|sB(bTDDnhH&R%$1~G2(@F=q(ov%?>V9UbC7+qrIL?y; z@I9}05afCX>|TRp@d-_!3Uf=sQ%F_z#vQlu z`ek?zJOrNW$qP8+45|Ov@tN_0NnqMVkRLlPm^ko7>rJSB=*9E;tQSl~B#JG=K6jel%&N$V`51_&V+9m-Fr#qSgy6x$`TnYU#>qbEWah+d23g3HeiAqJLqp z-NeBQOi}nc6FC+C)U+D^+O!A%)6|38^``h~TkWRzcdEOHl$6?eZRtdYV_`y{gO1Ui zyeFl;w9h8Y!pAbJ)>ucH$&uzcda|@!R8N-NVA*WEq>6Vkc$^v zDlFb7&B7-2N%O=2ZDL|gI-01$hGDEcKQESI;;Hq{)|5mf-H9Z&2Cx*Z6jw>>so%_7 zw>aA*nTfeTUECpo*|j__=EBp8`NJeHu68@`Z(%CyGG`Yolg?J&Z zwOX9Rv%E#h&x2ZzcvJIK7`(zh<6py*z9deja#4vYH$AtgTZAYt(oj^Xe`h+ANiUQ!5alA= zYrj^?!`L-aHLAeWxkz4P5mr0s%RrGI^dF4dZ<#l?Z=6ZHm%I*NCm3X)#rxQ=FbhE8(Pc`yf-D}=@A&q)S_1Y8rILOmp**-G&48)Yl*P^qTuFj zW=QuHg<8q;W$%6Y| zs#y&q($#sIX*`dB;zF#W4xzLg@q|c#CghzosM;Hr3$drM*p9jll)9>sTZI^U47@`@ zeY8v#v!$+gEBL~k((VaEg7EB@0qXmxXeU*+hw3-M=(2p-3ie~pcEWGp$k>?IB066l z_@~I5IPuG5tRY-cSeP|R5w-)M8`*V~6O2ftCa_CT5`+GZLU&ZFV3P!qN|-V5n^2F& zN9XMm`G%T$_D%@v?7 z3x_wW7Q#TXL#SZj0W(}1%3DYzaGhj(xkt>h=rla75n~OY$WDry93@tD3E$BWzc{FI#1!YWR6MoD zLM%II2_D&F{DElwA^Mw2&dm)d#=2TULtDPcm!u643F>Q=ISDb6TdCj0W#SHf$Cs`? zudIu$z_g$GrK77Mc2juq`%kHoomG~DygkvX6)m&!w-G+dUm1f<+hgm4BR$e__pZ%` zL>prVv4i+%xF$S<7XG?H999&_xq+vo9u*oc&Ye}JMwh_+bkyBsW3o14iC`l^H$l+a z!a;a&X66`4c$gmZMA*O*SDXKlcyPJnOS~rDee?Wi{0hF+vDKS#+48CRQ+h>3u_QcY z1rK(R1B}}&&WD2)Egq*54n6cVvi37Z;;QZDUdJzbO7FJ8M@lvq7(wa-#)Jo!gAUTL zP%z|%KQhxa({#Ffv?<$E^pdO^{KmGKaOn6kgUr;-NzobhjK4~}#^9N=%)%yf$4-W+ zK6AwBBkhr)pUh!al-IrsKck_g0OxcceKUbNxR_Pz`#MuIcu_jK3L&Zi5H0bbGozlE}1s z24>ogW#kGXy_ciUc_I6<+4r#D2*e^<4YhzfMic z!n4}PJ$4m5HaxHV$bMbxrTjgIH{FvMSnwPBPkkLm{?@(3-r~OGxAFM!r{5bM<4COK zV2YPgjb%&C>OXqd-eNt#XRn$Pmat5fwrImF77^RuYTQdykKax>8#0 z2)Xd(5BLxLZRo)aIIPchBPIs=dC6sJm=<>^n388ps<)E426hkQi zp(Ugj7LLEb&ijH*COrCz((T|8eYTgT8}4O}%&qqgopoBKGBpN~A2apaA}#72_OfeI zrB#jkUBma=cNlGY+ZNRfDBFE$ndE>=TCp#R0#vC*m5>SnwMr!l*$(fHCPIbD*3!{} z_j)2NAsj=L$8vY9o_%EsKR{MzdY#r@fbQ=g2?50Z16rYroP{PH+*&i zJ|b7zW_%%!s(0pYjQ2T`l=ySS-vX&+f0yPWs-(qIy9k=2iMHq=_ik>c2TEpcb*x1f zk~9a+k&2J+6hMbI#MQP}@jFtShKzDLsyU@s4P1>p=0A*?pFWCCGz(i*5srwr$v8sj zgHyNj(@@8_Nh9~fW=&)~sfzZQQf1OrJt#C5#?_iaV|Geqj^q_Ho9E+qDKci>ieEJ- ziJ?*O)#LLr4CAhUJ|@dx8h?lNazpNRTlMxP?il)@BvPOEeSV(or=IS~jy@1I*^xp_ zC=K!-8GM+j?5)d$lYKElB%8b!-+3~&ZjFR3EW+B=nYW8!$e!uRBYGBC+Z+>ppZjN> zSt3Km1(T)0Uvrxs%?@#XGQKaq@Z1~JC6jg;FbfiX%LJCq>bxb65lK^vvCZ^T=W+xd zM>!!}{n$9o=X+GUrkQXPezZkG^yB@NjLnI^OAcN<-;FU6&kD#-9LbwLaZt@SGLeSu zj&K}KBYTObXkubI+Jj#yR(%~Txr)Px)SGd};(z9sI`5z4I!mfvsZMM}(vgpdBCKt3 zk8*@$KA~}78crf$r5n&UMp|a#VsI)|Ol;Big~%QeQDOIPZ68YuO!xJl^x*Qg4?kza z+|n)w(&K9G&)(&j=$tih9#=Iw+TtkLPW50Ke*&gnP58!g7gGi)gF8qV>!_v?69-2) zx7y6yobFY_T;ed+UGDTx2VK~;QsObgM;hqs?8GlEoX(+3Q4RtcqN2k2fX`zi3^fyN zW;A)w{6->ZU1?@nZ2?>#OMJ-IF$fvO+9wEgMP#wg>X~>*Z!rI3!ht&!NAolhCKOnZ zSTq7w$MrZ|(w5*BQg4&1Fn`BQ@@PBnNqxLC{`WASdJjIL7_<};g{4}V&DzVdXd@!n zpTlZHAEL%6yMBB#D_VFAf9Lpfwj*XF;#+jjmi9RV)_Dt)b(N4Vm`3^qcT?YjvoZG9 z0?n(uL(2aAUtl#=m_~c-}m}!{yE3*=$F^Vz`g*s z69N}{CipXuk)hAf;~JJy%VQWtE@mo!_M(X0RgPyZpRGK-ePDEMwsfCS&C`PV7>C_v zvob0znppmM!w{H2S(gwhh|1%U<@)@=c&@8gdD^Hm%Zyp$TrZf`Y>Rc&Q><3HZ!Zv0 ze0I2g@KRwxNRJ^*BV;IR!}wNy9(v2rYwvBoJVs6UdypQvtIVw*wW6^O6E6t+r1gE@i&n+kR z_Y&p87?*@{;mjRFd>-xD9?`QfO>8_fwgin)VTxU**V6@EGShXfu3&jSsDyxr>EoEKDomg`EZr9(`q1!YpD2;nyfF7g=(9o$32 zrf$YTwSO}((YuHyiLjupDB&bz^-cyP`_p%@TGv&q-ja#PnupcPk_RbXCA3f8vN#Ic z_q_$tys!eozkmp1za$pxZ}mc2@9(InTkYOSt)I$oR~{SZ*Af!t8^x~J4bKt&2A5m) zg*+ZEe z73T8L=+f|m>o#LpA#6@BZYekf&Pc-{kg@A!=X z#6@1CQHr?9YEekR#+X|rcy%$iZ@j+x?{hK87sef5Lsk)ziWecPxFa=EZ1F`!L6+jM z+x@S3P4igCQ@Pt2w`I&kwdY;LSM6slh^?P{7oW4y@7J-P-Sf2Qu9oV$ z)YnnZc`%yvI*Ly#qti*c$0%tkBe||KJR~?Yc)v1k{}dIY`n+gyP{Q;L#0^V)McehL ztnpt%YBGs`IM2o1d#RF8UX9_3)YY%bKX=fpCcCc4hmI3W@h@X3PNg|fF)b z``TNUd6KjJy%{3h@$m9LBSQQg~Jwxpo+0Uw1rY~N5~#VC{3EjlvwdcV@5EV zlhGRWK>*i!R-Cf0q*-psdS6!hy0o}(U+1S+;=YNeN}kg@y@oR|D4U8@&}$e9*-1P< zMk__Jq-0v>Ti$HnZQN5i6c=h^p}4f9xcIB-rR}Hhror_6NyVmbI-!nr*Ng5C zl?D4UXP&}2r)oa&t@XL2VJdSN+`$!8!6mshv!X)s^!@uXaV@1d^Q+-gHrJd|(eLF| zr*zDF3SYjhniy_?2Cy!dE8J{p;Qc4dHJLW1XJ&m_E#+4c9qlBe%i{I%`jK1W^{WD3 z=;N1PL5g##*cx82UzDH!CNvSn)`q!6e98}yAj;}nZns=KC9<%Hgi5~>Uj{-fA)oD6 zXVUFWgW@ZcG^9W6fxG{(DV!JAs^^AH3uE*>e>1h;pgmZBp--^KXM}ILH1m7|@xB z`l)>{y7FGR54wGJYJNzq{y1?w0O>qlW!K#G*RD!!h&@Gl6n!ds)5)}!{V9YHQ8rJJ zd7mX7xT5bIYY#UhrGeDcl$2z2oVGVH(N~3ibQNE!SHYXFd-3J^9{iK8pXg}BUKiR4 z=jbD}Px2AJ)n9hjpQj(Fql=%V%?m?Gw(;wBPVm?um$M!UZNMzl65J_Txj;-W28Zm2 z>>gqLDolm3vh?4++!vg4t@C!BS`Fu%2Q)1?A^eQnojS2>740*=gBwukxN9=INaUGg z-3hmwv&#Z%q$-|@$L5`}D^FOXEmQgaxg#2S)BR{8T5HdF59Lm|d!==3TOq#Lg8BIe z^FL53h9_;bvxhRN8-;#8CAJrq>G%%n46y{6hEJ;;qO1}VYsVH}uyG;7*2$Te8Nr)5 z1(k}00?(Xt___AjOdd8Qf#WKpzA8y)WzrJW++x;uV-X1#Qx|8r3L+M}6k#p_vdncJ z;?nxKgvt)cAC}NTqI#@~H;kv=F?Jqc0WTJyCr%P@dZK5B1eBhlDFwv=6ZkL>z&Iyx zRgO|K+-G*~i@ihp4;Kd|d91ua$i*FGJlxbUWu8RZyhsAna=w_OY?T8nGb^(+OD>;Q zEMFxPuL5p&aW#O19g?V04qL`5c|&!T1PVudly|4SP9cZ6h1o2F4~&o6m^@wA_YfTTNxiEjhW3{F8iG=Z{>++364~0GZWWus#@0gZA) zC_KJP>4>NAOsX^|C##|o$!vHL?{c407Qh0^#+NpEqx(vxihs+RNLP^l$fY^DuPpIA-#AVr%nbb9}M-ZsDBR)mN3)031lb4=a-fi z#e) zibU<+4@FIPDZ>OKlM(*N)p^+oWu3}N@j1%XAnK=5a)sdiXl3N9vUSQ|i-zKC5>|=A zbMbO~1#~g++5QwdiW(~Vh3FQ#_VMRk=fJMsaVq!~93P1K-%e%#dh{7FT5=?Rl! zx%n~izFpp%D>lab#nu0$QYNncskhK*6^Wicb}119wUkv@m%}SWAv2Ixn>Q&Z@99qN zocK89`1rB>Pk~>vOY#Jta=g5ofi>O|ok5?L$ariGe@-Q6o}E3ZsH|*uWkN!ZXHnjd zV~_EQksiFKI}4_KDk{+T#a=WPv!2baWfomju$2vYeDrQkPWCWSJdzYW(YwW!aP6SY z6C#N;jN_e2ccExFDHXK*?3|?By*@L(X>&nNq~{eRk);RQb7tcRg;#=Nb?z&{)jyrpB9R`w*n9$a(5R3SnHbY zjz%o(X8CmTe0hG{xizA>f-?HtcE|*mRvr#z1F1O5R|Yv#04uJ@c+oyFKpf{8uStO2 zW)p&PYO`~)a{xEHc2f4FY+mmqP3|Pu+`W>`B|sAq4i|^v7Th9=2;Y3yhC_71Wvhgz zNlzEZc=hS&op@&+Ery9IT@L_{_}T;zpAhev5S*itWaqeKYxW6ha|M%fCy5Sp(%f4W z;SrYDi12-Yy9S`)pPq^(AcU-%bT#H8)$mYox0aWl&H)W{kV!1a%xA`2=ZbQO95q9f zyMddVd$hAz6#hPf3Jd!xDPh_ATq0Y4FITO`cvv`Z73-W}6i?a65X^~bN|MqfN<^xT z61zl2P5PJ@#R5D5A{*f%)5y;9WNIZ{wurYpS_qn=A@?mwcZpdM#YQFCm~NL2qC-uW z<*G4eH050<>JGNVCU8Zu5fQ)=9vi_2aEm*J(cDq2_9|0=xHn^%P~avY=2J0@af!G@ zywhJ2jzX0582&AnT|5?=&`{&gySI}UjZ{WOr691K7ZTOTQA9})S)EdOj75`~9#iNZ z0bK$~@33L{BPkXa%1~7Ukf{KSBLagA~LYY=JcYnM0zqEtpkq)dTp ztTV4xw{qSn0Q8>ajJf1Y%t*%O_2!E87}j+ z!Rp`K79n2R*;I5ztcEG0D>Ygwmo95j$~=V*pMb?@8uO-vf+a9{Ib-FwT1@%ar5Sxi zEja+_?(N|go88iyZ&`)-5{P@duexW$@TvMc<~wHX{aigQh_V9>A|?cCI}kK#5%Q}V zVMOu3CuqyC(hO0rMkzy;9czbEK=k@@GU%ui84vMDomm0=Td5E5MLlw23i|Ou^bF@Xb zfj>pfl|%=DlWxcW6a=4&??d*+c?#cJc5Gu5aKDfF>=47fEnEb`!$q-{SOD1E^V1vR zQ)!sm-Hx25A?-$iRbWljC+ZI-{xkRAT$9*sTC;KDYPxi)dH~!Ky#k|$tO%z&L=C)zT_mUcDa06T# zFxpf`o6&XwPq(EyQXS@BSr0MR+FGgmYD&Wi`f-4>QJ~)cTdFhFX|?rPZPOiPL>ZCq zK0RKvg~r=?+_ zVc_|I^7)-L0}v;WX@i7L{bDF0$c4QsdXLFw^HHwxAJ!YDg+4(c#(rc z!SevKd_~}+5LZwf6?Nj2xuEHd+rz`{P zu9yhwp+|q^!jE7x)Ky?P2EC@$E&pg%hjgn$LtO)l%|Nq8Lwy5ifz>ZIx3$AYdOM(I z^<%JeuMX%sJBPXwfUbS}!2bRF!J$Kkz_DY;KzDaHID7UixOm|r?3@mJw!@})*KXeW zKUT>9Z|&)j1{M0^zr7AyB40cXzB#!U^d4*n*E;LKjlCPe&5zfDZ=iSo+O`#-XY&$p zv34#vtC|D-{>9+jhC*;*!))-qwg~*(QUQK}ohAPGcopc^RfDGowcrm}{r<`EX7GFW zCh*7UHt_6h2Y3mq<-h%6CwK?F{P@*R!G~*|;QbBQqUYv;f2!@jy7?J+_RUeyck?9p zc1HLM==H?^7<%|v56ng*uv=jlkbjyN!8XmXL&LuV zddmOP$msuOJ?Z~@Z~y;#X`muiFq5?B;MYT7njwJ0(6F4jYvpF3BTVTkHyn)B|ZrYR{}Z0lGp7Nc$ZZcSJoYtq{uV~vZhMjkdits6?!%RN>tDm)vN>2#XQxf1hQz2^j zJH=N}DgUEh9s7nz>UcvzW>H@fsx6{&>WP%y_=}F8^IxPeW+$E69nF{|*(75AAzbd1 z*EQ&We;T8>8yMpHyQptho`=lqOv><};ZR8Howj<-6j@+o4H8EwuUt*VoO10c<2mCE zY5r6O+SM&c9)O1it=utE^f!lnLneP;Sx2n<^nG1Gn~h2$tk2ri(tB9>etR>@~j<(ii-g!P__6=Rl6gdA3|5oX9tDXUcda*n)?oJcP- zOYk4H<`n$uLkWZHU3%BUGDw~?Uo}54zl4QpSQcMPa)c$tk{@!`TlknI3>v3zUzT6aGC!_5d_UZNo_Oh z1KDmk1Mv{TW;jpWb&&lIBP?U;=^W`ybWU_GF_2#v|A3&FD5jqrL9p>9nPplC@v&u- zsoS)~5M&~^4(uPeFmQ9=@xa>wa)3Wb2AP(dw?kZncnm=fng`7RmUM`D5b!0b21kMA-v&L_YkBomCokmh%lEA)ElLx9GLJZpm$P4hj z{sys?7#NTYN(RX?<9TALx!k-O79-kYK4vC+%s-kh47|Wc!jCH4ywF7EnwOFt5a)@r ztJ|T5RoEYSq9uy_9?bzk8BFkO7uJd=fDqj;+K5Lkp|}_3yV# z*<$_9_N(okjU2EE?E&_9_ysR9?9uPhBUkk3wGgsxiN}&Em=GbSydh%n`1Zsa5}v*) zQXHVCNVj^BEN=$MS9pYx@FajL%IBFO``org-mk!H}uQzW+_(5BoYtFd&#Qyr|bowwNSREvO{nYAzNxe zi()f?B4mFrN~~ZV{tjPP(;VsnA|u1n(mcXK|E76BEl*7oB>+TM2@cc9M%R4WHVWtb z3UamMr1OgNC+9P#*-0Pp8b}KrnDVCwsqy{>>_SOzib67O#pfG{H6CW*p7t0wwpX5* z?9TV#raD9m>nc*U(94VA0@uxbO)(h$y}9z|cVNXk!94Xw&uLJcObnl7APhMmaa>Nn z``}U+v@+SpM8=uzBp?6(W&%bv9%p7m^GKS9%1O@p!SWEgKBf{$=8@J9Rpum! zuL%yk!GGKFB*9EiFhkU%74Sh1n_ve-n)e#_kBBrQ()7VPSIIWP7YA26zwih)FU1{8 zWx?i#gsddD5$0R^S$gt4{D4G;efk8$H~JCgKh9j)BPj?npSLue3Oe67d4|Q~seK?x zD)BITm>1(dqsT8AU(L@q-89~eBCH(`DtfqxAM&g0~_eyA1Th&t?e@I_#qM2!I z+79=xvd@_G51(s1m}UdZ^N8UC)66uVH9m22haNahB-ad8=jL?tH1mA(8uJVrLvWL6 z{$+rhN2-%bID8cuJ~&YFOB^6IN!7?Qq|_5BQAgu5@Y+*TNe2t<>O5kT-LtvS4a|?qp=5I$QFC;4FtkBno{qo+fB6`Br4)CgQF= z25v`F@Gi>21r;R~UMeycx+_m>dc79V7HJlQcEi2|xE(mejv&V<$9PAfW3dCl?VK`g zOjs}yglmJtVg_-8(O{hBw9T91LRyS79eJ3=*n$tt#Yu+|GZvq7tUN1@5gn;^@vfV| zC)cL(pW?5w4cV@A6WRR0l`1>W9`v4uD@}Y8KRBmzG+&34-ljLs4FkM^u7T)*8w1k^ z$TtJ)^+T@6jDXScTZA_J=3aApY48m?**c-JpL^X~Q|7KB1=scArZ?dxjrW66#^Je< z`dAYgdoTlEsXsC?ps z8XJfvvE6*lH|wl*o~eJ)$cDeqc8nSnFEwY`vp$9brn}#hXN}}_I8D5U(*zgJ5;9X_ zuw|$tO5QqVT=ZC?#Sm#CBd4dAG<*L*Y&TA`Ph&UZU~YV2bse@dZ|BdB8QoZ?L!!F-Z55L2qU@O;%2&J8EtxE`S%I(sdEas-gx$G0g0K1 zHjzsPhM8uOfsSJP58?M${*lyH!<^%>b{63SrI}M5wv!>AWU-Jn$6GjXhV8l>pIze{)^%22mrW~!{5ScuITwUCW zOjZ|1G89pKg{MlM+qv(O9i~pd*v8%NL)((Q1g~OLZTjRWe+i&10pScq1YcoQ$tUCZ zANC3Qclnb=41(exn*EF~XG{(sKtKcoEV%2mpVUJt7YBTK?c{{;pf|K6qqCNHI8EQ zw5JmQoKId=Bi0>-owTCt#je)I72{et^@Xx>^h$P`;mD@lx^t~k3pZC?A=fW%Rxj_fl0 zVE*CHuL`o31zm}P`eTy5%b>+4PcF!bOj#wl2r{Ct6dW`x2!3f^QS%hER+gMuad-4$ zRDNVCEVz3nV80KILv2FH&(mnX>U-Yk2Vga&02m%!Xx#cu!Flg*&2yrgwg#1tgDPdq zyy()a$Egnn!d4K$kWIBRwxk=JZD(`Bx#}F-0cH+7a2kwF z<~2VvXPCX2Gnjd_Z1YU>67vQ#*2O*#k zr3RuPh)7lJAcCSnKl7abIw}lpYwfQ>rO$$K-hcV*YEn3$j!9_71ITD3g&Rs?gj_3LfJ9_hwU0c z%-WVp*EuMPiz8#R9ijm8&f<4uuPsKWc_!k0;e%)#i!B?;&9MhIcfuU)Ph-eGRNyFk zmxLcQai|=6V^kp+K4uDAo@4{Ny*w8uWL)o$JRaTPkXunnmrZeny84&wKFjA`jYcTp z(Bmmsk=?bUKCH_!xSO()9Fovi=6K8O?I0Jp@{|3U&dHpmh~#YPLLfg2egbZ;j*J&a z$J31tx#e_QX*RFW>7+z(lAum@t-hajLDm`mzVex@mk^#H(ql~Dlrx$TIZNIF!7( zm6eXoQ+yF=&yRBO|Cv=En{gvFo^XqA!*#gF823yOiZnjvDt?RavU0GxyxJ=CLg^ab zI_^&2GYSl8I+aF0OuRI5`IN?ap%R<;-$o@6P2uZ)a&qp10<5N^iZbX-AaCT!E)p&J z<^v98D{2^tb!8S!>F4Xqo0`+B$rl;4MZ=Ea7nge$h({Ba?VI$Qqz%^zq>kKLu64-8 z9O?{0hXfDa1;Rf*(RoG@shp)joDLGfM4Tbc)AYBeEw4;eZMI=a)S@v42C{LjgG20$ zJY`Fwg9AOl> ztS&x}cB6x7C7nsrbLgdX6J0Pc-)u15H)ojlpE6gN-L^#0vxLb$KR%kBWxWd?EDCmb>#GEYC`iz=BB#Nix~W`O>rm3I+a%)E^b z-#DZ!8Pt4}yWI@yMgpD)}J& zQ1?OC3(pcR`jFijW;z4DEGd~~UJ;yS&Z-|xs3*RMiZfk|`J~;?A@n4SPM7SH?9nL9 ziucY*iA3C!LA;%I)1TSqd)m`s<>mQPO((hn&4FfmEHOw#IzG}bnRtp{#6os3Ug{-J zxI>1wr5Btz8E@)6b3PKoyO+XH4B6Q-q}t$QcG`^4jvkF0ItbU0j!KthBZ(74m{??JF!h`{rkqj_>A2q-N{MOpgOOCYh5*py5PP zq#r%JC({heVM5L{mv_U)vj*2|mvVA5&C;OECr~xE^wL2>t`QgT+sM?@bhTZ3+OJ_d ziJi9N&6`-`Z(NThwi9EY%n@r6^uzkyq9L}P*Po!@cx029CK;vh$W-Q7xQPp&bg4hY za?-3`#+xrLjwMczOX=JFVK;uU>mWCEEt@#pyuj*CFu1h;H)4g{myQ`AbtbR(_r;mV zYu;K}GVY62o^%^mVm^RNp2QLyNjEowq&c5iH>O4niJ&F!jGW8FMJ;ijl)idv5*v>C zW305;XC`k&AaU40P(PaBJMhFUq^Cl0VyUYP?rM6*V4ZRd(aI5>r3KiH;D<%<7xHE-adwiLRzd$t*tdd_E6BHLPbS+U;EDDYK}VX3K`=>l19% zv_!noLr!RDC;8Xh$=xlo>1jagRD>2Hp4c)cXy%mb#d5_y_|%r&i&oQaL(-y?E!98* zlT$f`RZc6NcsZpr(*BA(-gdJ@NZSlQFNt9u)ScJe)(t@#6NWI2HtDaVR_rKTQ*?Na zblzVQ?Z>o}!PV07@-M+^+I{<73%Rq#;UnlH`!u!Ed6IcWbLX-r0|84&poIH3_r)>nRB6z@sAQRRb153Vyb* z#tZlccm-fysFb6o72^pSm)CY%^4#R|0m(RGw*sK^v_)QOI+2}XOk-`7RLR{fF^PSH zr6rv5ImoZtbGO2e(Z(JNqnnd42sYC)J=Mvlp$`D?3Q*Hy6G7BQBvJ-wDSomhF6F$%s)8z>B%m#XH|*7J4y z(yEuc$~)~b%NjJ`EWcDYJyW8I^qvHJIMz~Z^-P&J%mB%*8uUuRGFiOgdfn3wzWr08 zw!1zCsAA&hp-d-fwze9_hW* zJ85uc{9*5gNi*hJxrS&+&9SJ#t`apZV8FhwLGDgN8y59)^>S3LrC&&|=&f{C>soMh zdAya*XT;!$9SIJ6daq6^@3!Y>Yiv^ud>udji(QD1b&g}Mebr%3vHH|1x62&c9X~tx z>a`M1N=>)5b+UExL&IS`VzVOju+-sI3F$I}s0d#RtOgPh# z;#%Yfcz3vIg_`abPu&8K1VYMVBuvkb|r%FPWRGP-~@-4G*; zDH{(`#*NEm3mxf=y_TUUj&pG}ZNjWu2+?ws-fmYNQwU-fLTlVSA$od-HVQ^15u-ab znA4@PpfRQ}y1Wrj0ug0NfVBpP+ylE>`nx=vMfWf>_3Z8$v#E%g*JrVy!Khg zK4RL_BQi|hT04P$5ZoGko6mr!Coc%OCh2ERhd8q)|Kjlj!!{q79u10eSJ4#}E6Ov3 z9~fmbDl^u+g)t!}uaT{-zq~@|4KK;q^fwj!5OP#pv(C4?W(NERxiiq*x*6BjS>^g7 zETpY&Ruk0S`Zei(SQyaJq&rL?ZKL#>2j!Yv*1QH`CgVx@!jgmdZE4jRzat3!=*mUu z?^2oF-S2LFoG}+t%-urz9^K zUb|oSq`X^`HhBqq;u4?Al$2yOT|n3ZGA33u#8@*wTdxGAi1cnE-CIHdo{ zgQFo_oJ-8&;FuiG8!3$D3E#0N;FDOWoviKZ#zSWMg85hTYqQSG>b2|j?~Q0++$q(> z2!%ZPYBY-GU<;$7qRZw*Kb6@$1-3kr*IwNjQ&J2;w=L**4uB(XWbye?v~1O?isdr< zu?n8NyV_48_H^J(kX_++#t4LJxzlAbF9ffTp;tw+?8_0x5;;e{RvZ`@1ym zQD|9IMF>}3AL!jF6^q^7y$r&sY0Ii(R;-i7`xOw^^IFgt`XI2k&(BvOyX`LEHR9sp zDB2fYReKREEKqRdpgG9jTV7sXEb)?h$>o>R*2MHYw<~|fDv88z6EijMS-JL_d}N`A zd%k3qFOpYR;vP9Wttt@sFF@q=-fmtgQuhMz2OHrAhSY+XRjaJa$05n=m;554r~{>& z?Cm>M6)O9MM_nAxd4>U1MRle_Rd;81m757CNG2j;01oDdm`EeG? zYMCrhwwt}c!P{GI8qp$%LTT5A@2od*O7$alvFUm%`$aG#WtxOnq|W`j&le$i@O>)0Y@&^ z9`FEc0eg&K9x<=8d0s9pmk8Wz zfz;hyDs^|1f@)7V-Gm|-;Dvj0d{IAZ;ExA51agKsbO!N*?PS$S5#Pw*#?lD^RZfLO zA>yR@rqhNTDuzuS3g0H}v}qEYzjoTRL346g!`Q{ZkP zJ7po0^_*<6n9Hyk>I8>s<-; zyi8}*eHZ#lE{7JDa=DuuqA&<0wJmbFM3Tys)Np{`cU(!;1TIVHzFY1ppUR!-C`xB_ zc}k(-x7MDtFJsH=At9h0aP8(9@COph37BXcp})a@OE9jp04}gg6Iq8uShN z9fkn%bAYHezM9_gG3X1Cicu^8^$57WGKT?gt#)cKF-#;#?3^krZCZL=`870mVA6@ zlib}(Wal28`+dDC(;wvN$IPyxLzeL5jmRIu@f%p&$`&}Rm{%B5X#JO?roejj*mbP2 zOxw6O#*1%^Z;bAw;xfvuMm8_hJ4S|LZZnak2wPHBRtgcUrbX7vtc#`EZn--uZ&g8N zT}i$JCT)exI@A-DFJav=7J0SYvtj`0t2Lt@v5Mw2pwf_!LM}?s829V>_Y18X4N5rd zF-7X8RI#R5V{)B*VIjK776lSX6R+8Z70dyfF#+42p%F8*?(?14tGy5@8`%MvG`k7%`;yoAG3un=n4k7RRDORh1x?!pExxG5}YpL zd`gRL?rrXkF^3z%e`qyf@(7DpIBzxE7GW#p*iY^m9L!qk?r^c!+Muz1i*jLzkfj}( zQFxbI%_lqre^g@XWaES04}E{>ihUREADyuA;%H-g^517JlaZ##Ey!<@x4`lg69c;5 zIB1G;=Q0uYKB9MOztnwdf6u`zE-hSMa{%LRVANeX$2tdikaX8^bIAZbWM~fhSQem9 zO}b5s*Y9*0SQ>JUe@+r=1MF4(>~jO&lxVw<*6@XI>8e>gAw9SM=D-3{d2`@f1;%9o zD`yA#3H5~fTla)|YWsvz3<}7ZKT~k0J~&lzYi8}OSas!6^-`;)+69i4%$j$wp@bu3 zx>mDW=z))4TC>15?H}^YT)Ns9K;BGUFaWFI`Y*)0@}wc+oiFwyJkkNPW8!}j?_wd5 zZfK2$WV&cY{6CNX<6}ejQBhIA)6)~6C_{FCHl&Ax z4Ot_>#wpQYTb>f^C`bV9Feqn_YCJelmI1z9G8Bw66`ZQf1!t=B!C4rJb78d#bgnG{ z7h4yCv+I_DJ?pALYfCezShEonH*5lB_3MGUrXHxPYJeJ&0M(VSYZ_Y6)bjtmmakY2 zDk_$P%}q9Qb;!uF4Scz=8~lA^5BP9>A9#NCFt~I11o-I^BoSV^3_7n} z2bXW&23POg1E=o)4!(W#1`_f5z|-f?z%#gBJbMCO|Na2H`|S?+_~a(|^!PgX{P-I9`|(xq z<tO|MUhhJi7@D&u@XA=eI%6i#wp_3@DM zL-%}`u?Pugj;Kb(S1X4e+AFJ2nTk@YhMw4}2C9`XmW2p~G`TEz>y||p6)Qd z3ZNq;&bSumC^Qdn+wyd=du4S5C<6B!$B>lUSV>(0Jk|BN980&IDOm}$GEBj1xz^ZO z9fu>T`VgSPi^COm%^gr*=ZTvn4u>C;t%}+NnQKc6%g^0qLn&6zK=4LF1$hgtG7r3( zh`@iBX$hOMeV|K)<8D^1?5{Pez)@_sX#J%Q5eDURZn8+^lAElWK@OFL>P5pkMqcZV z5PL0_7T-XAWuL+NMo~*T=p1yIJF*h5{li@yzg@RoS7n9I{6^=f_(u1QcB+SD>pIsa zEy8PM60;Bq2&v0Xuan?WeI3anEI%@}i7`ZQNPnaH?-ka!NlZDv=;{Va+ zRP#);hV#He)xM1J-6V^{>_a(!uiCcMPI7GQSJ`#;L_%pUqEb^4n1lf+ek7I3a_iJ6 z)vDT&++304C{+#R-OaG%s3~s>N42#oL0Tp*r)pJ!geH;`MQLz0#brBCIKq;kG6b)8 zpeX1dDh3Eu#jt>UrxBD!Wf|P!HyQd|PR3agTM`knvF&< zocih%;J+Pp0b0mF6Yeg`i2sDo&Xwm9*9bS#t?cep0;OvF+_Ce-N|IW63G-msiZGd& z9IC&bl26OfvvIZTkawJycfY9fy4}N=I(wFeROkv?4rp+ju}prMq*`wEanubFI*E(j zBAax{#Kq*U5B5y%Wb%=2a=PtP<{`la56v1-OBIt7)7mDebQ3R;$5`54r-= zI@5bEXWJK6kO+56_t-R7-==$O64l4)-OO}~`8oWyCz}@$i^&LchT(Ce{#SGV>G8jE zCe70GdLu{nM#*x1F(mdb>P4f+gmP=%jYV-yI=9NC^L64x`X!k3ZN0a9+eW>-;c#O1 z=q=MFBmEMpdg$KY1N%J3*1=;SH|dyRO5e-6K6Q@3H{$1$vgB~%@jm)x-*JmI5xFAy zz0<2?E|UdasH@@Wj82bNV;*pPv(8N9jlO9O$2OMpSD^ zEH!=V-xH7GR<)zY(e=iVff)l|Og^Uh1GR>_9y(=Uwt2g$dq6-fG>NIP6#bi7WX`5a zd&-RARBCUn`O8h}CKcOzdRXcrv&&%e;Aa=tMp^HXuTssuiw4^Vd*G4k{_}YE-kXD_ z!JDox=W&mYwfb;~aHCZzG$TZf^nOd^m|f_l-x0n&X80CNNbS!cOms%&tl52k#zU@N z{K9I)Wd&t|p zzxM4U4^w{*`BvV25Jio3TPC;jc`>n=JOEwWyK-vBWR;FwrI`Rm4~{eR=pZd5IGg6{ z5_N=r2eE^AGuWk*lj?26Na~G_*B6oQi|+89H1m+Y(lE?0DfzcRww^PY9i?BYJj}?- z+UB!On|g{nr(jNWK}gsF?^;6+k;0vlY?zc*Ws!Of_$(LBffJ1j(G!VE-F82C+Um~w z797czvF>^{N1`MB(JvNj5nLUV%APCuP`J^>O0KGLTp|l|nN=5S4t;^lG5q&>jlb>IPnLK{X zsLnRl+v)6HueJT^n8H2jJ($@xBh$)OH;cTWUo$IjW5>>&+f!_GHka83>|DEtDzi4l z`i2eDajnq1f2Pz{(YQbvI_nV8Xu51*99A4Un74oLx?Q=u*0=B6d6=-ghxg2v`tmJ# z_Y_*xYG|H#{=Ivm z&j2-WXkdzh`vQ&Nyhbxl!&HFnloI_I!wbjZ@@?-|N|7J%nxkViYXjG`Tvy{A{P8TcblJ!s28Z{YCX3y7md-x?H*0o%sd-x|ww~BR zG!D{fMviVPv6bNUZY72^d2?py9=AWpkQdHVjZeO+sYCq=B!9QjU}sSBCORpt@i^af?gD6i*1Bci8% zs~E3$SQs&&d>8zNNsj_y>!oTC)^$({6h~!O%>m5Gg={skpFbye0d5`jBvZmsJ z&!?H=&+0cr8S1!7G!V~TZ$J~FWgim-sD=r>`nWQ3YoMAcTh{ZcpS&>^&uzBI*PtBn zbgNSK`5tU=4bhA@=PSF>r2Kr?+e;5%F{k$0{~E@PLGy>(k3>HC|EQ*RiG$2R=4O+R zZ%^XO%9&sb+*xS1q-or~f5vgR`6Ish{b4o5q+`uPl|k<{rI5!vv{$h^P4Yv2^#l`>qUa=WfJ6Y`Q*i*fS*h8Sk=)dD#uG{BbH|?1vVkc;l zo+E&>b@`l}TjN=eFO9apI7n_N96VNPes0)iGx{OtUEWjE(@EM$2_|tKPhR9skPSbd zoIlkk>;=DCW=rq0a!{-^)1hPfD%U&{f4+`*^m;6B%vUz&HMSEf{$;A!O8b|IvPc`%e{)v4Sw2q}eW_$& z2GvJRsg0~u=0`;2BN0};{c_#=mx~gcQVo2Wlu-=;LE9HKi9RF-o5hHnzxTgiCg=l ze)-@5#Y7Q2M_^VTu}dk9*g`Cc9Ibx3^ab`8?-~0~8<5Qkj!V3|fJGQK^lnXKeIP&F zjWUfT$G$qk#f}?KlEX*MY+P$Q{FB8gmnV)09&=Ma^Y#>`!yMvyuS&`pGhxC-j&62- zf89kQtZ$h=_nQeX(iR$iG!+{~p3!L*r1fCCXAEVc&UE17fq7*sA?u1 zH(fS2b*K_$e)T^1mqg;Wv4wbmv+F^W0~t1}_QfQ)F<3fs5yy+BB&)3h@m0QV;d$Z5 zr5k+vqwMx@SPzLWraUrVaoYR(w!&v@kObSmS-zHBvs&f3E>~(3Na#;J1i|4loKr&n zR2*~Bh-cCHJ>Rx`MSRsFb&M)ISh^|aV)SyQqmNw_xr;bx%yKd>-A$yvvd!~;dFcpi z0w4Rrli|J&f+gNaP-GX<}=x;E#vpR!7W3o6Iv8OVFl z+xBG__HEytBP%5|_^DE2mVTCX;YsuA4NkwboyKs>>%y=NIA)hP#*DRfm&A2cxfN@@d^Q0%}K{IfzcvSLV3vGC1J8;6mJFCK*p_pyzj8iuqxj22TA<`$yR7qd<9fX zxC*4y5pPI4F1ye$Lh&1}kYJ*3)0)!L&YLB5uCj>Shyw%fs zEH8gv(|4siif({=oj&PZ-G4q-+#$*b@F~j%ceEaDdwHF> zPHbym%-m_kDvB@G)Why_t_M8rY$U&IbiYb;4|GqP+Cc*M`gG-2b1BFtam;id(m$D7jCWF3&f5cF3?eA5&*l8lloq`%||IDqyEmC@xm_JY- za%rt;Bbj141#2Gh*#vZJ=Mf%eLOX_qYoU&QQpP|xp&&GQ?CL}I=qIY`d-i$zNliW9 z2pRZM#UZO9CtQ}rnCxo3DW0e$;#(%-#%iMP`{fR_hIp>MN^nRG!6Ju>W|7rIGx@KA zj1(P>kvGX2LqFNj|B)P~>(Q%c=w|3X_5VV)=*IP2iXQ`1nn*5FttxH3rc#YXE%O*0NRjE<_EfGaN`tQ! zUKO5#>43qiwrXi=d+I?~R1Bs-3-czQ*kQrQ_dzIox{wxBfa(HfH1ltcog~U_1dgVG z{g#u1*Pv079=AAn;Te8h|6Ykk50f^m;O?9H&h-mrji5TqE8_UErfY;*$V4!O1`krz zN^?`EPj64XY+)2uM}LfMYLNB19hD$0jw+zZXBX8JFbjT&W`5&_j7ZDDvB0)9wOz6a zxv$_gYecKze9W}9+Nk=dXK7e&jaafIeo5cKGK+j+R>-TgVa-e{^ji9B1*U4~u7vqt z=S42h0H;V3*$pokA&HVKpASqIG)mAJ? z7tuv@3trUkN>2g%(z_IKb^~`n-cbqGu1Wosn1%%O?6>C3vu1ZP7KTF?H_p8kdo->gUl zYPQD1JP*&}qmC+04KwKx;GWbli^p2CC8z@zPZ?b}qSoZ+88Lg76d!J=)MZQkJl#57 z@{wPrcL7zK2fdFyS23%_s8(A?ojss4U-?B_>n*qlhS?ssG|~ z;%1_g^D^Rkf6BC)-J>^MO#8lNi-2O_kyIWvGx$|8T4671_24KIqDBpP~?mY{}ln`?c(HZOa5L@~}h(`pp)Ff{a^m}~- zl!H1Mt`p&dy~GZZ-be(HUF7eB<3hjos8f3Q()nUH-5c`5Ag7UOvFl0>K`+zAL(##c zfNz$6N8HhEq5Hq+9J;g){rrHwX}>&z%FEGJePvW!O!M-6nOp&M4GiEBuOQ6NxOw9|0cu%u_A z`9RNso_h1so`9!4M}lH<=Aa(FIV|mlSR29EiHMC)8f7pUMwCNEFeq^yS}#;9bY{x z1VqelYKn+J#~G@c%4F!onCYqXhHm0S)vm~Hl-oMG;&^?LV#GM^qck+k|5hsWC#k#B zhIN|rh$LN@=8EFHPb@2h3?Z2VGY~|Yo|U4KrWZ)#G*?=Y0leYOFiiJUkN@n{I<@q} zBLQwvmdEMp?HJg*OTAa-YS$u4BFYR=$gXwv-cVf};8Y9gA7&@gMCS%-%s!?hu~ zA;>Vy_pScYo>cZ3fyFr&&u}ECCaW?lBP|U})x;Bvg{L#}*cr`-H}EvV@GdP(-h*&` z6_NJj3wzOR(fG+(W0FhyOZrm@`fSygXX(VH{x*WYD0X?0OJ8;>c5C9$5f09BJ85t)#H{20kT zTxBQ!HfC?Mg)hb9RA{Yd=03-$#(a<;QLtxEb428#NLH6$4esy$J1d4;*FfbGxt&${ z`OVdg(g+0-=@OYsstC=iW zoev`RQB;0pK4spMpqwm;8U6zcMiYh#ZAqgUQi$>VeN=vBL_S6BQ7Rl+v0vwmoIl`v zhums7(N$X@$!{*m&u`%uM1G3EjLbK+&hhkH1Fhg-6gnDjj)-7Q7)@M(W8TrSx>7S^ zAF;0#$)99}+BFg-J#~%8TA8sx6M^KXk9y%3NgVF^NwJVsAWv)5m;6?g>lzXIR)kVx zE2dK_JR!{R%vyepDBrRAOL}fzP@Ko|HHnReETXY?P?1KY5qn{!5k{hoaO)uw$pdcV zE&ZezwN^;v#)J{wzQQ5AA>8E?o-l=2@Wtjr z@E?x52>V3YF3=f@BDoNKDYMFglN9HyU2Z1ZdE#!}s|$EJw3Ua*i!+rlA~UaIjR#6K zRW#3DYty(hyk&!$_@otmHJCi1g$xT>URpj6hT76z<>@?L>0%Lz`*~D-g3H$;qnd5Xp&4Z@tq1>sJ>T!zHFqmxP8m@~^cvYy`fk#1O7q}3YaJNE zIt!5bnvVr+c*; zvl&^VuK%$kId<%B4IXuqG7gtQ|NKv*KDNa8zgE2@zABMXB@%^I3308*{}3)bnY@5V zCByxO&`J7kkCM!a{$oOMVExSEz?=}oP4fM#e;^Ol69{=!4DM-Nf44R@?Q^r+nu_Md z{AieOMIbtB2g~)A_>_hR7*z`rp#6735|*%1iyk1x>yn71+)?}_Vh9BJLTu2r5G|Ge zfFKY9NdhA<)j?F13&*JlUivQtWGiX{SeB}aC&8Q{r3@fpfuPv~;J(0Lg8Q(Skz0C% z?fD55)m#eOk%U!>(eSXV?p4D%XD`1_A(nKDd^)ZT$7{7RMAg(JTQ8xKac`b3&?q8B z8e37LqO5fY0BPy|0r#uK6o1f5-IwvYH_b1fc)M zKunqZz2vtHwiWYhk8`1uGswJ91h2ir_(5_b^e#hqjrqkYSof&Jn$pIA7$k{<_)=PI zV8ld~`5#2AvUvy*%f}SD>GwSFYw=$31}jblV#&UmF-EU#i{wUYlbjL%gX6V?7Kh;2 zX{vdTwq@d#B5U4wiv)_sUL$LsMJW3am4y!j+3&HJc|@JXx*ESjh8~g#cA~66f894_)lqXJ^E+Yx z5gm48Om@vpBt8s&*AdAosyiY{CO&)v$GH%u;g3YO8JW6(OuAix zTgOOZ3w5%RtwNhtd!>x5eKQ2uaPbi;e6cTYGqL3lZ|ZahUc`WrXkMigM!$+Kw?U63 zo|4;oH%Jgwc>NzaxlR^=@s^T)_u2qhN)ya2rXl_(%? zRnBAFOyiqK^SfLzrSY}+Cuzb>nHWZf!Pb19LhI`t$~__wi+cqKWI|pQQ#@QN7E|!q zdqiB11Ih+mA+NaivD2ArlRY@e+kG=&z8NE9ojp}IVpw2crEj1&hpH}uk+q08o{vas zsdX?BZC4evn-jxG^d?)`&?C(L}OaI95$nY^eG(;9+9x)>DW853r zN!Fau@7O)nOtzZYv@CR`)nk1^&+detHyN@J?r)_WMDd!R$7G8&TMcbJZ9N|jWR9>n zx{y0fan@=!&YlL=Ty;#8QyO&QcL)fla|>FB+f*Z>UEPVdj64{orGlIhJfc>qGXD01 zMkSy^+lEl1Kr`lz8tsg}Uq?-#>XFGr@9#gl;%HrfrG|L>4vzYj8AM{rkCO#SQEJN3 z>eBe=Uww*R5hEo1kzqu-@+L(7=h~C1nt9;6`BSfATP@HuPN2og)t8)iDc=boy!15> zNd@0x%Kb15h9%)t+sHQ5Q7*VLgrikT!O^M!uohErP#BV(0x>7~5au*Yf=lXbT}E_Iy5tBXaKy0*yBn6guy zrIMjk_GsDpG!{GW%ef9RZ8;fcU3V5AJMA1nksjCu*RPH(Z~H35+bYOPKRKklRZHbC zWge%A(}ZbJUNm!Ih|6dFDMh`?!p&IylgsH!G{+)O7_JMy+{X=tNSx@aW98|3D}M{R zG;e`b$-+S0gHK0!cYi!XP{-X^#J#o5^|H;<7HPY6#SGDw-8BoXtEHQV`@UvVkCC;T zrRlQ!)@}M92-oR{i^%O)_)REpEjsLg?%KE3R;~)QQu0&J8s}KW^ebu$LordD_E4{( zjtXEi*jeOaIb#7D5PW!r;dG{TF=kVS*(Z5E?_1>bi0CP+7$yOx+eY=cuX~N&^ycUr z#?F`JuJSk6j4Ljvm7~&ai%hr1_Xj{r?yt)1?FoA*1wQ6;ykMhRO%YsicVJl1`C>`= zkjx@o_R7h16miNG%GBdHtd<}Iujw1Mbn6TOXtu;!i5qFht7n|b3?}{*s>5hai=e@g;^kHbc=}g9Q7#_^hxJw>~x8)kvWV!|khj|lqhWWb;=ND;y9KGoAgZMFvt+$4)0o3fkT(wGi z_gENTHG5ux=hd*~*%0@({ZA&BTLI*8)m5J1y>PM-V*nc3vR$E{EwFauNi5uLJpfN? z>nZZm`T;MopM}3&fE@_r4YLg51=|9dZHQ&4XgCjy;D-sq1#&Aek~3bEDw-ewX@Yb- zgPq9-S^RAFMD`>Lki(nIp2D8W&Ygx#kDXzI%$2c#SmTUDLy~rOsf1OE+mu$~rMUCX zQsUpGh(?@wUGN5bOYq(jZwaJ)=w>=^h6DxL88dLSdB%*m&uL6T+7MUQaB& z#sM!5Xz@GkM^Q+w1$e>tgY!_#-$57;xcZ^m zk%y>04twI}l4Hs3x3?i9tU6c8_ zZZ#C;#>QQU|rQbCp|$U+bJAiZ7@l5bV@S>e7} zK`swP;>a>4EB9esTvJ?LU?o!{|8cx_m!3l)uK=KA@uD0HcA>8{3$VP!}3r;G{4;bhryjO1}pRqK)O^A4sW zK)z-#^Wgqnd%}0g^6ac!wj#$7wrlwY%WG(}TcCTf$3biDElT1h3};~OA;_)KzL-br z(e={XHYi2!SLPsv9*3-btb)ls!z&S&_cs2x@R0scCQ3Eak8KL$uQA_4mfm~QY~8LZ zo&*0Ym$f06kV7p8FYgZ#?cK9$*Q{Nim|IYZtE)9LSj2LpnbOB-ABIvI8Kmn6xuX(W z)@U|j3`40^wSMlt>1(Ti-GJ8zFOAF(p=vPiJ};D-!RpJVF#%MmLC?a#^UI{QKY42O z8(`2fPow9J*Ihu@^q=75wH)%XcRw-0Xv=lUM_I1EwQjBoEB^azgmQwv{G4Nc*S*-D zye8YwJO+Ndbpc%Z^&vR->mzXL z*T>*!*K=_A?hDY-^$eVa&#&Ks#P@&J{r}cw_c|oN|KGa)i$n1LVIu$kSHJczcOQUX z?>zur_aA`!4<3R?4~K*0co z2_`5^=rw`=9bv-%Q*7`*db<*^CeC#|VJ16CCJ9?aFbN>wQW6%$m7s`K>LG%tJ+=yU zZxs-QibtE3&8?t4+H;S+#bRq+L8;YNJ%Vdb9oOnn>w;@JxZppNgpdIL+&`$Tz4t!% zKKFUfbMwwWGa>L~5@z22pZ|Nm_w$MGUp0S|s8@t9vQYk}xLy%{oK2*opo!`g;ZxoA zxK~5Bc%KNr1P$IwkO=?NhHNThkmy$tK3qN_?lloUWsUn^MEH~ie@%o>5%}*!__&pt zj70c2#lvtBX1glDd=mVZ3jC>7jc&p#0e;3Obr6>tE>akxf$EMS?QHWcJO}=Fq#AI1@Ewac)1*94auO zOfhTf+Zw=XP>#k}G#fG()c~nLX9toEodpv58Hl50^kftmVzcRNx)@lPyE`9Sw1gaS8P;I2VvM7WCJcC*7eRh=_BN1#IL z?{=De*ow-jpFnto!1qvpkCd5k4k^WhKaT>{$j=#~=`EOgjEx1cz~adUNausF9k6Ke zTmq;dB7#ry#jf&Z(xttqqwDA{FME!5_d>&Hn9{BcMu{?OFHeByWJ*Y!#Ki*A1p8W; zU5q;k+wQl^Ph9Vp09u$R9h&+iAQ!j6uOTjI^+OX9_)1KN!wTHz4UNNZ%Z0`e(yH(o zL@xvdA9gRy%|XR3c$4wPM*IpaTa3XnZ1rM8p>b8I4ox+28*YOKj-`dfN@zbt`XaIm zF&>9&g6a}dsC$dfa^{13xm5*YHTOUVHbc&x#97R-LR@Hk)A(2CWV&A7kF!g&o_jd8 z06UOMz>Sk@*fPV1cbMhX9aPs1@O_6U z7Gwjd+Xpt;y&Zk&m%v)L58t|3RGgP4&_J<6c7{s8mhoR4t4IO`9dMW_BJKSqy|Ur?*+9sDQ|g@Q0j z3dadEBDg9Fr~Gt3Apbt04!6m%xAj5dU}x$a#aRwc+4t$y)Eay|Dtc2UA#e7@_8KKK zot1NfP}Swauok`iGv{b?8Hv2q9+;{>!ElPZ5^!lQ=WqNY;H3HpDzu8r`4c!RtV85w z0(m-(aIep~>v_sbS7EaSXUM?-3BhnYcpA_;(j4;~Y?`AIZFZtHw&(hEtH$2;yvPC=Tf$e$m~QyhQ+426Z}^YhXUs;>%3uJBbX}e#tCEX zjBP)X9|Vj}4AbpVC(SRr^s<1C3=LXFW)p*J+<-4)3RJa{J zMv7>wHNd{RFsC|H?cRYt|5Sr5N4<3%(Y)tkD?ukS_cT116SkK=5zt9cmD}aPLmKGS zOoFzAFAin(5?s4Y|7CFT=Xu@&2G#2ZKi?OLinO;QCDd7Nu`W1d#ZTU3Tc>}VWw>J& z%2TqSJSDacZBBLCx>`H`)Ft!`^soaxZC!K0B+pz><0 zP49Z&^@jFrrcK_>^ohsP=V4K+-d>>`<+5*5JssZN<9@SncM`5E|HH7DoY7aq4bKe7 zrnV=$miRs=3p^9HBo{v~t%aEl`-fSjL!RrT)&|w!aoGceh>#DN;9^GH4kumYh4z<} z1R<|T;bcB#ic2=dE%ukCu;{)7hvj?w_ZOcIsHUrtH~6-6C~*0k`O3KmMiK+Bb^o}v zUFiGllkNxkyYfML51Zbzpl3f=-E+BTcTWX4-^1Pkphp1}i0KpIR0MW8Tn_&YKBSL8 zg1rL~kz*{$XxTJ`c?gv(T6Q8(Y>=a!9g7n9_)pMvGR8r{P|9?_mls1498u=AGOv#p z-RK(iAsevSV4uTBi#}XJVB?%GXfcY;MA+j*SE!E`>(F(2jvnZ8(5y_Gt80NmVuoy!` zS>q4!0RkZL@#H#0k85A?B%;Z4uXqxw{bR#=(#Udsn5uAO_;}qc5Nu2_k&7I4;HIv{ zxZQ}uV$c_6OIL3<>@+s&Z0_bTZtaD_HN(_Dt7CKR9Ftd<5Aqw{*MARY(sxM06si9X zd0qlGQZG>v{j{n zs$pe`V1$d;eR=u#o+_?U($U|8c|JiFG*dk2e?7&s&GV5*;r-fk8TEneWsla|?Wsm} z$Bn2DGb;9Ff=x=OlOQTORCqi0!nR<{O> zMyDFRgzo6pwmt6dkig&%_;ulnW?Ijl@ zDjwBc*!;YaHyG5r?`jYc-*Bfn*kS}NB4ITDf`~Y!2Yrq_bm@%+@y>aUDNeB`#W$#$ z3#K^Ff`&ceR3FI&Lr^yKk+8V9fe7e3hhu@+=97dl<&BUy@QE|daC_8y0zNgX5LIc8 znetTmNJ)qyZO?nOl}pvw(7+s$y>I>}@f5yUS8O`v+|18+HhPY+9dYHO(s=GDmFbqlD3Fd2ms`4U=!^T{U;?P`*pUjmM&FiZL#FpPdo$ zVUfhKRe2}KQwVlYU8v&QTAaeQbv_ z-7Y*eT{qK61y)s59nJ{o=`+9E`4@Y)le>u1;~-x4LcUH2Y%^`0=<9-fJu4*>DKuAVWBW%&YS;EvwS-*62)VtG{3lm#S!Uppx#>V!)+&>@d!@H{^QZ&28o-DZ)qS2%NM)hZZJ`r~jb$M~< z_Y3?c(wvEMEfH&riR^ow56iEUUoNSd$eAJ^HFYxY=Y|8W@u)B{p*7kfBg4K;6-4@# zKhIOgXhmd{wyc7zZw_bb!Wny!Rx8}D*DhD|TUhkBoa6CHgWDNPq=+t_Y=L3lDMl0- zz*z?kwFC@bQGNQ+DsaTXE^r)iq_ESkOmi+oX|vOv{Z2cfBe`=Ad%?s_u&Tvko*-m} z)E_1t6v}MUf&|dFxGWA6B_yT`6D;De1awDWKsV7%>4|)GI*}lN3?Ei3!{HJk6k|~Y zGFZ7vVtkaFjH}D;2{hzTWK5*~TsZX%$h{~?&$T5ahy_mraCPPLblq43-}pqxoiAgE zGTqfEvu&Wde3dRInbwqW?9znv^h9C0b$LPpe^T`nLxC~FK(wG3hq+#N7Zfza7c`93 zn9?=vq+XvX&j&3R-Rf!lAcieDE=$DIEs5`oaEv!lv*t~Gw1xYpo1kdl+U1%g!&`Lz zU4Ct%C7wvg*R8&lOGmti^zB!hqQAIRKl0^)Q_LO}3lIZ!wi zp>^^RiiJ9dY9BA%){vMOj~mph`;rFmWQpUCHQYaPWP*sLN(0#keGBt;IyP>F+{8{3 zeB*-S=S~_WFei34Z%je=o}#3temR{>zDY5~4c%D~ex)kew31r&B8WF0?B6zbE!1C0 zEWv`(O0WyW$_FI~ch{1um#i#hpoD(nUTsJ^Y(@4j&rD$JY8|eufp{)=;vY z*H3+#h#{#fg1+R`u&*ix=??aVWH(QJ5Ip!ok`PW%H46+gj1x(?PCsdp+B4{@kN$o1 zw$ZbsY~COCk)sWt%1|zB?e1{ZFmJ`^-1SA(=gCA>>8Qn^E7Ek26zVnW`%QX-%$p%S zYT)o2>GIlhnO8E`c+9I-=((Q36<~MDgoz)?V9#EX7;ltl(sE;}Q<;F87L#!um`+?P zSX21%xVS^9Yz5LKY^?t4a5cT*?rdGD=Gk&>#WF+1@sG`8?C~+Wg32P4i(X^W2xd99 zkC9(JE{s1d6#pm`E~5A4!L_oQMRZ5eIzbkgqc`K1E9JBC@|*;GfjEP4?3;Z|h7bO0 z?XmcCgY?dpC@{^rB=V->YcjahxzU-hF^v(y+&#{dTq&iMW!&|&qUTA4 zlU%3L!6o=10&Gbb;CerE%6VsLGvPl#(LGY9e@8skt>Zbp=Tb z-)2o-Wflh&W89BG#RU2b`Xe+;!h43LT$kLBx`PqiRPwPnG@RDT3eH4 zLM7{ zLjPbqWP>aOMe6X715y=)DwPfm4pjm*vb=)f@=~UhIYsB7yGh=e4#7!YrI4b8CxdSR z`7O=kwzk`Hyls>4mKwtJI0b}?vp6a9yFquFpTtCC=@5U0lF{0jaz8yT{|fV?efXTz_%>3xT&~*Sckf6a0;88Y zmpU^eB;6pwFMQchoZ5JEfAUl8>60f!I{vuwP+QyZF2i?zw-q+rublWvaW|d^Z2=wf zLu+6FiWic1E>|)}d;r$s#|tK4c`yv_pgZWN%skgT7XzMKq+E~aW6|FmhquSzSoHd* zvi7HspIm?3W_XhNR)FHB%;C42ue>R{fUf}xWh<#~Q&?fZ2}uve4UAt6iin^ievfJ( zd`4rUNAx4j#z*(E{HAvto8Ga_^^iUoDG_Z8{rJc?1_S=Qy8S6bKE3|r@ngn#Uqdtn z5Lm5Ji8|PON}d1@_iF<}UEllE^O(f3Dv8ueP zRzgKFtsMq8#oV}be0|*kfuZL4ef1Ungfo!>#TK4Oxs@kyH)OZSYPqtXqpQ=x$x}fq z15~ZbG{?;aJHz{5J#496W$Zv_r1v}4gU3AWRrZP?`9Xpx}X&eMNE_rm~RzA zSw!nln9GjZZ?P`l6U zw}+ZiU-*1c7}l+F6Ue*0}%g2OvJ&fW6kZ*na@AA)^-n literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder5/Make.bat b/internal/4.10.0.10/1/Source/CBuilder5/Make.bat new file mode 100644 index 0000000..d9e6825 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/Make.bat @@ -0,0 +1,10 @@ +@echo off +rem ********************************************************************** +rem * +rem * Sdac for CBuilder 5 +rem * +rem ********************************************************************** + +set IdeDir="D:\Program Files\Borland\CBuilder5 +del /Q/S SDAC\*.* +call ..\Make.bat CBuilder 5 diff --git a/internal/4.10.0.10/1/Source/CBuilder5/dac50.bpk b/internal/4.10.0.10/1/Source/CBuilder5/dac50.bpk new file mode 100644 index 0000000..bb0de70 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/dac50.bpk @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= + + + + + + + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=. + +[HistoryLists\hIBPIOutputDir] +Count=1 +Item0=. + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder5/dac50.cpp b/internal/4.10.0.10/1/Source/CBuilder5/dac50.cpp new file mode 100644 index 0000000..6e259d8 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/dac50.cpp @@ -0,0 +1,42 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("dac50.res"); +USEPACKAGE("vcl50.bpi"); +USEUNIT("..\DBAccess.pas"); +USEUNIT("..\CRAccess.pas"); +USEUNIT("..\DALoader.pas"); +USEUNIT("..\DADump.pas"); +USEUNIT("..\CRParser.pas"); +USEUNIT("..\DAConsts.pas"); +USEUNIT("..\DBMonitorIntf.pas"); +USEUNIT("..\DBMonitorClient.pas"); +USEUNIT("..\DASQLMonitor.pas"); +USEUNIT("..\MemData.pas"); +USEUNIT("..\MemDS.pas"); +USEUNIT("..\VirtualTable.pas"); +USEUNIT("..\DacVcl.pas"); +USEUNIT("..\DAVersionInfo.pas"); +USEUNIT("..\CLRClasses.pas"); +USEUNIT("..\MemUtils.pas"); +USEUNIT("..\DAScript.pas"); +USEUNIT("..\CRBatchMove.pas"); +USEUNIT("..\Win32Timer.pas"); +USEUNIT("..\CRConnectionPool.pas"); +USEUNIT("..\CRXml.pas"); +USEPACKAGE("Vcldb50.bpi"); +USEPACKAGE("VCLBDE50.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Source/CBuilder5/dac50.res b/internal/4.10.0.10/1/Source/CBuilder5/dac50.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder5/dcldac50.bpk b/internal/4.10.0.10/1/Source/CBuilder5/dcldac50.bpk new file mode 100644 index 0000000..92441bd --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/dcldac50.bpk @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= + + + + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=. + +[HistoryLists\hIBPIOutputDir] +Count=1 +Item0=. + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 + +[Language] +ActiveLang= +RootDir= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder5/dcldac50.cpp b/internal/4.10.0.10/1/Source/CBuilder5/dcldac50.cpp new file mode 100644 index 0000000..81eb534 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/dcldac50.cpp @@ -0,0 +1,27 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("dcldac50.res"); +USEPACKAGE("vcl50.bpi"); +USEUNIT("..\Design\DacReg.pas"); +USEUNIT("..\Design\DAMenu.pas"); +USEUNIT("..\Design\Download.pas"); +USEPACKAGE("dac50.bpi"); +USEPACKAGE("Vcldb50.bpi"); +USEPACKAGE("vclbde50.bpi"); +USEUNIT("..\Design\DADesign.pas"); +USEUNIT("..\Design\VTDesign.pas"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Source/CBuilder5/dcldac50.res b/internal/4.10.0.10/1/Source/CBuilder5/dcldac50.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.bpk b/internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.bpk new file mode 100644 index 0000000..c12629b --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.bpk @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=Sdac +ProductVersion=4.10.0.10 +Comments= + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.cpp b/internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.cpp new file mode 100644 index 0000000..09f4b2e --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.cpp @@ -0,0 +1,31 @@ + +////////////////////////////////////////////////// +// SQLServer Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for C++ Builder 5 +////////////////////////////////////////////////// + +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEPACKAGE("dcldb50.bpi"); +USEUNIT("..\Design\MSReg.pas"); +USEUNIT("..\Design\MSDesign.pas"); +USERES("dclsdac50.res"); +USEPACKAGE("sdac50.bpi"); +USEPACKAGE("VCL50.bpi"); +USEPACKAGE("VCLDB50.bpi"); +USEPACKAGE("dcldac50.bpi"); +USEPACKAGE("DAC50.bpi"); +USEPACKAGE("VclJpg50.bpi"); +USEUNIT("..\Design\MSMenu.pas"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.res b/internal/4.10.0.10/1/Source/CBuilder5/dclsdac50.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder5/default.bpr b/internal/4.10.0.10/1/Source/CBuilder5/default.bpr new file mode 100644 index 0000000..51631cb --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/default.bpr @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/CBuilder5/sdac50.bpk b/internal/4.10.0.10/1/Source/CBuilder5/sdac50.bpk new file mode 100644 index 0000000..3012d93 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/sdac50.bpk @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder5/sdac50.cpp b/internal/4.10.0.10/1/Source/CBuilder5/sdac50.cpp new file mode 100644 index 0000000..a25a8bf --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder5/sdac50.cpp @@ -0,0 +1,35 @@ + +////////////////////////////////////////////////// +// SQLServer Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// sdac Package for C++ Builder 5 +////////////////////////////////////////////////// + +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USERES("sdac50.res"); + +USEUNIT("..\SdacVcl.pas"); +USEUNIT("..\OLEDBAccess.pas"); +USEUNIT("..\MSAccess.pas"); +USEUNIT("..\OLEDBC.pas"); +USEUNIT("..\MSSQLMonitor.pas"); +USEUNIT("..\MSParser.pas"); +USEUNIT("..\OLEDBIntf.pas"); +USEUNIT("..\MSConsts.pas"); +USEUNIT("..\MSScript.pas"); + +USEPACKAGE("dac50.bpi"); +USEPACKAGE("VCL50.bpi"); +USEPACKAGE("VCLDB50.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Source/CBuilder5/sdac50.res b/internal/4.10.0.10/1/Source/CBuilder5/sdac50.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder6/Make.bat b/internal/4.10.0.10/1/Source/CBuilder6/Make.bat new file mode 100644 index 0000000..3d6aa11 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/Make.bat @@ -0,0 +1,10 @@ +@echo off +rem ********************************************************************** +rem * +rem * Sdac for CBuilder 6 +rem * +rem ********************************************************************** + +set IdeDir="D:\Program Files\Borland\CBuilder6 +del /Q/S SDAC\*.* +call ..\Make.bat CBuilder 6 diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dac60.bpk b/internal/4.10.0.10/1/Source/CBuilder6/dac60.bpk new file mode 100644 index 0000000..8afd56f --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/dac60.bpk @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= + + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dac60.cpp b/internal/4.10.0.10/1/Source/CBuilder6/dac60.cpp new file mode 100644 index 0000000..f9d8a01 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/dac60.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dac60.res b/internal/4.10.0.10/1/Source/CBuilder6/dac60.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.bpk b/internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.bpk new file mode 100644 index 0000000..dec8018 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.bpk @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= + + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.cpp b/internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.cpp new file mode 100644 index 0000000..de90459 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.cpp @@ -0,0 +1,19 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + + + diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.res b/internal/4.10.0.10/1/Source/CBuilder6/dacvcl60.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dcldac60.bpk b/internal/4.10.0.10/1/Source/CBuilder6/dcldac60.bpk new file mode 100644 index 0000000..e82a4cf --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/dcldac60.bpk @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 + + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\Design;..;$(BCB)\include;$(BCB)\include\vcl;$(BCB)\source\toolsapi +Item1=..\Design;..\;..;$(BCB)\include;$(BCB)\include\vcl;$(BCB)\source\toolsapi + +[HistoryLists\hlLibraryPath] +Count=2 +Item0=..\Design;..;d:\program files\borland\cbuilder6\lib\release;$(BCB)\projects\lib;$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\source\toolsapi +Item1=..\Design;..\;..;d:\program files\borland\cbuilder6\lib\release;$(BCB)\projects\lib;$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\source\toolsapi + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=. + +[HistoryLists\hIBPIOutputDir] +Count=1 +Item0=. + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dcldac60.cpp b/internal/4.10.0.10/1/Source/CBuilder6/dcldac60.cpp new file mode 100644 index 0000000..bcffbe9 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/dcldac60.cpp @@ -0,0 +1,16 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dcldac60.res b/internal/4.10.0.10/1/Source/CBuilder6/dcldac60.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.bpk b/internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.bpk new file mode 100644 index 0000000..c276dea --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.bpk @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=Sdac +ProductVersion=4.10.0.10 + + +[HistoryLists\hlIncludePath] +Count=8 +Item0=..\;..\Design;..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;..\..\..\Dac\Source\Design;$(BCB)\source\toolsapi +Item1=..\Design;..\;..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;..\..\..\Dac\Source\Design;$(BCB)\source\toolsapi +Item2=..\Design;..\;..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;$(BCB)\source\toolsapi +Item3=..\;..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source;$(BCB)\source\toolsapi +Item4=..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source +Item5=..\;..\..\Source;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source +Item6=..\;..;..\..\..\Dac\Source;..\Net;$(BCB)\include;$(BCB)\include\vcl;$(BCB)\source\toolsapi +Item7=..\;D:\Program Files\Borland\CBuilder6\Projects;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=11 +Item0=..\;..\Design;..;$(BCB)\Projects\Lib;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;..\..\..\Dac\Source\Design;$(BCB)\source\toolsapi +Item1=..\;..\Design;..;$(BCB)\Projects\Lib;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;$(BCB)\source\toolsapi +Item2=..\Design;..\;..;$(BCB)\Projects\Lib;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;$(BCB)\source\toolsapi +Item3=..\;$(BCB)\Projects\Lib;..;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;$(BCB)\source\toolsapi +Item4=$(BCB)\Projects\Lib;..\;..;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;$(BCB)\source\toolsapi +Item5=..;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source +Item6=..\;..\..\Source;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source +Item7=..\;..;..\..\..\Dac\source\cbuilder6;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\Net;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\source\toolsapi;$(BCB)\projects\lib +Item8=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;..\;..\..\..\Dac\source\cbuilder6;;;;..;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\Net;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\source\toolsapi;$(BCB)\projects\lib +Item9=..\;..;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\Net;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\source\toolsapi;$(BCB)\projects\lib +Item10=..\;D:\Program Files\Borland\CBuilder6\Projects;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=3 +Item0=SDAC +Item1=ODAC +Item2=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=. + +[HistoryLists\hIBPIOutputDir] +Count=1 +Item0=. + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.cpp b/internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.cpp new file mode 100644 index 0000000..e1c47bb --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.cpp @@ -0,0 +1,16 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.res b/internal/4.10.0.10/1/Source/CBuilder6/dclsdac60.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder6/default.bpr b/internal/4.10.0.10/1/Source/CBuilder6/default.bpr new file mode 100644 index 0000000..3a5d950 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/default.bpr @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + diff --git a/internal/4.10.0.10/1/Source/CBuilder6/sdac60.bpk b/internal/4.10.0.10/1/Source/CBuilder6/sdac60.bpk new file mode 100644 index 0000000..e17be84 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/sdac60.bpk @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= + +[HistoryLists\hlIncludePath] +Count=6 +Item0=..\;..;..\..\..\Dac\Source;$(BCB)\include;$(BCB)\include\vcl +Item1=..\;..;..\Net;$(BCB)\include;$(BCB)\include\vcl +Item2=..;..\Net;$(BCB)\include;$(BCB)\include\vcl +Item3=..\;..;$(BCB)\include;$(BCB)\include\vcl;..\..\..\Dac\Source +Item4=..\;..;..\..\..\Dac\Source;..\Net;$(BCB)\include;$(BCB)\include\vcl +Item5=..\;D:\Program Files\Borland\CBuilder6\Projects;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=10 +Item0=..\;..;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\projects\lib +Item1=..;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\projects\lib +Item2=$(BCB)\Projects\Lib;..\;..\..\..\Dac\source\cbuilder6;..;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source +Item3=..\..\..\Dac\source\cbuilder6;..\;..;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source; ..\..\..\Dac\Source\CBuilder6 +Item4=..\..\..\Dac\source\cbuilder6;..\;..;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6 +Item5=..\;..;$(BCB)\lib\obj;$(BCB)\lib;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6 +Item6=..\;..;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\Net;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\projects\lib +Item7=;;;;;;;;;;;..\;..;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\Net;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\projects\lib +Item8=..\;..;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;..\Net;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\projects\lib;..\..\..\Dac\Source\CBuilder6 +Item9=..\;D:\Program Files\Borland\CBuilder6\Projects;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=SDAC +Item1=ODAC + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=. + +[HistoryLists\hIBPIOutputDir] +Count=1 +Item0=. + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder6/sdac60.cpp b/internal/4.10.0.10/1/Source/CBuilder6/sdac60.cpp new file mode 100644 index 0000000..bcffbe9 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/sdac60.cpp @@ -0,0 +1,16 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/4.10.0.10/1/Source/CBuilder6/sdac60.res b/internal/4.10.0.10/1/Source/CBuilder6/sdac60.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.bpk b/internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.bpk new file mode 100644 index 0000000..a467ffd --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.bpk @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= + + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\;..;..\..\..\Dac\Source;..\Net;$(BCB)\include;$(BCB)\include\vcl +Item1=..\;D:\Program Files\Borland\CBuilder6\Projects;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=..\;..;..\Net\cb6;..\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\CBuilder6;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\projects\lib +Item1=..\;$(BCB)\Projects\Lib;..;D:\Program Files\Borland\CBuilder6\Projects;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\;D:\Program Files\Borland\CBuilder6\Projects;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=SDAC +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=. + +[HistoryLists\hIBPIOutputDir] +Count=1 +Item0=. + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + diff --git a/internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.cpp b/internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.cpp new file mode 100644 index 0000000..f8b49e2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.res b/internal/4.10.0.10/1/Source/CBuilder6/sdacvcl60.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/CLRClasses.pas b/internal/4.10.0.10/1/Source/CLRClasses.pas new file mode 100644 index 0000000..52e7f5c --- /dev/null +++ b/internal/4.10.0.10/1/Source/CLRClasses.pas @@ -0,0 +1,1172 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// CLRClasses +////////////////////////////////////////////////// + +unit CLRClasses; + +interface + +{$I Dac.inc} + +uses + Classes, SysUtils; + +type + Int = Integer; + Int16 = SmallInt; + Int32 = Integer; + UInt16 = Word; + UInt32 = LongWord; + sbyte = ShortInt; + + IntPtr = pointer; + MulticastDelegate = pointer; +{$IFNDEF VER11} + TBytes = array of byte; +{$ENDIF} + + BitConverter = class + public + class function GetBytes(value: word): TBytes; overload; + class function GetBytes(value: cardinal): TBytes; overload; + class function GetBytes(value: int64): TBytes; overload; + class function GetBytes(value: double): TBytes; overload; + class function GetBytes(value: single): TBytes; overload; + class function Int64BitsToDouble(Value: int64): double; + class function DoubleToInt64Bits(Value: double): int64; + class function ToDouble(const value: TBytes; startIndex: integer): Double; overload; + class function ToDouble(value: PChar; startIndex: integer): Double; overload; + class function ToSingle(const value: TBytes; startIndex: integer): Single; + class function ToInt64(const value: TBytes; startIndex: integer): Int64; overload; + class function ToInt64(value: PChar; startIndex: integer): Int64; overload; + class function ToInt32(const value: TBytes; startIndex: integer): integer; overload; + class function ToInt32(value: PChar; startIndex: integer): integer; overload; + class function ToInt16(const value: TBytes; startIndex: integer): smallint; + class function ToUInt32(const value: TBytes; startIndex: integer): UInt32; + class function ToUInt16(const value: TBytes; startIndex: integer): UInt16; overload; + class function ToUInt16(value: PChar; startIndex: integer): UInt16; overload; + end; + + Marshal = class + public + class function AllocHGlobal(cb: integer): pointer; + class function ReallocHGlobal(pv: pointer; cb: pointer): pointer; + class procedure FreeHGlobal(hglobal: pointer); + class procedure FreeCoTaskMem(ptr: pointer); + + class function ReadByte(ptr: pointer; ofs: integer = 0): byte; + class procedure WriteByte(ptr: pointer; val: byte); overload; + class procedure WriteByte(ptr: pointer; ofs: integer; val: byte); overload; + + class function ReadInt16(ptr: pointer; ofs: integer = 0): smallint; + class procedure WriteInt16(ptr: pointer; val: smallint); overload; + class procedure WriteInt16(ptr: pointer; ofs: integer; val: smallint); overload; + + class function ReadInt32(ptr: pointer; ofs: integer = 0): integer; + class procedure WriteInt32(ptr: pointer; val: integer); overload; + class procedure WriteInt32(ptr: pointer; ofs, val: integer); overload; + + class function ReadInt64(ptr: pointer; ofs: integer = 0): int64; + class procedure WriteInt64(ptr: pointer; val: int64); overload; + class procedure WriteInt64(ptr: pointer; val: double); overload; + class procedure WriteInt64(ptr: pointer; ofs: integer; val: int64); overload; + + class function ReadIntPtr(ptr: pointer; ofs: integer = 0): pointer; + class procedure WriteIntPtr(ptr: pointer; val: pointer); overload; + class procedure WriteIntPtr(ptr: pointer; ofs: integer; val: pointer); overload; + + class function PtrToStringAnsi(ptr: pointer; len: integer = 0): string; + class function PtrToStringUni(ptr: pointer; len: integer = 0): WideString; + class function StringToHGlobalAnsi(const s: string): pointer; + class function StringToHGlobalUni(const s: WideString): pointer; + + class procedure Copy(const source: TBytes; startIndex: integer; destination: pointer; length: integer); overload; + class procedure Copy(source: pointer; var destination: TBytes; startIndex: integer; length: integer); overload; + + class function GetIUnknownForObject(o: TInterfacedObject): IntPtr; + class function AddRef(pUnk: IntPtr): integer; + class function Release(pUnk: IntPtr): integer; + end; + + EncodingClass = class of Encoding; + Encoding = class + public + class function Default: EncodingClass; + class function Unicode: EncodingClass; + class function UTF8: EncodingClass; + + class function GetBytes(const chars: string): TBytes; overload; virtual; + class function GetBytes(const chars: string; charIndex, charCount: int; var bytes: TBytes; byteIndex: int): int; overload; virtual; + class function {$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(const chars: WideString): TBytes; overload; virtual; + class function {$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(const chars: WideString; charIndex, charCount: int; var bytes: TBytes; byteIndex: int): int; overload; virtual; + + class function GetString(const bytes: TBytes): string; overload; virtual; + class function GetString(const bytes: TBytes; index: integer; count: integer): string; overload; virtual; + class function GetWideString(const bytes: TBytes): WideString; overload; virtual; + class function GetWideString(const bytes: TBytes; index: integer; count: integer): WideString; overload; virtual; + end; + + UnicodeEncoding = class(Encoding) + public + class function GetString(const bytes: TBytes): string; overload; override; + class function GetString(const bytes: TBytes; index: integer; count: integer): string; overload; override; + class function GetWideString(const bytes: TBytes): WideString; overload; override; + class function GetWideString(const bytes: TBytes; index: integer; count: integer): WideString; overload; override; + end; + + UTF8Encoding = class(Encoding) + public + {$IFDEF BCB} + {Added to avoid C++ Builder 6 bug} + class function GetBytes(const chars: string; charIndex, charCount: int; var bytes: TBytes; byteIndex: int): int; overload; override; + class function {$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(const chars: WideString; charIndex, charCount: int; var bytes: TBytes; byteIndex: int): int; overload; override; + class function GetString(const bytes: TBytes): string; overload; override; + {$ENDIF} + class function GetBytes(const chars: string): TBytes; override; + class function {$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(const chars: WideString): TBytes; override; + + class function GetString(const bytes: TBytes; index: integer; count: integer): string; overload; override; + class function GetWideString(const bytes: TBytes): WideString; overload; override; + class function GetWideString(const bytes: TBytes; index: integer; count: integer): WideString; overload; override; + end; + + StringBuilder = class + protected + FString: string; + FActualLength: integer; + + procedure SetActualLength(Value: integer); + public + constructor Create(capacity: integer); overload; + constructor Create(const value: string; capacity: integer); overload; + procedure Append(const value: string); overload; + procedure Append(const value: string; const startIndex: integer; const count: integer); overload; + procedure Append(const value: char); overload; + procedure Append(const value: char; repeatCount: integer); overload; + procedure Append(value: StringBuilder); overload; + procedure Insert(index: integer; const value: string); overload; + procedure Replace(const OldValue: string; const NewValue: string); + function ToString: string; + + property Length: integer read FActualLength write SetActualLength; + end; + + Buffer = class + public + class procedure BlockCopy(const src: TBytes; srcOffset: integer; const dst: TBytes; dstOffset: integer; count: integer); + end; + +{ MemoryStream } + + MemoryStream = class + private + FData: TBytes; + FPosition: Integer; + FLength: Integer; + + protected + procedure SetPosition(const Pos: Integer); + + public + constructor Create(capacity: int); + function Seek(Offset: Longint; Origin: Word): Longint; + function Read(var Buffer: TBytes; Offset: int; Count: int): int; overload; + function Read(Buffer: PChar; Offset: int; Count: int): int; overload; + procedure Write(const Buffer: TBytes; Offset: int; Count: int); overload; + procedure Write(Buffer: PChar; Offset: int; Count: int); overload; + procedure WriteByte(value: Byte); + function ReadByte: Byte; + function GetBuffer: PChar; + + procedure Close; + procedure SetLength(Value: Integer); + + property Length: Integer read FLength write SetLength; + property Position: integer read FPosition write SetPosition; + end; + + ArgumentException = class(Exception) + public + constructor Create; overload; + constructor Create(const Msg: string); overload; + end; + + NotSupportedException = class(Exception) + public + constructor Create; overload; + constructor Create(const Msg: string); overload; + end; + +{$IFDEF UTF8} +type + UTF8String = type string; + +function UnicodeToUtf8(Dest: PChar; Source: PWideChar; MaxBytes: Integer): Integer; overload; +function UnicodeToUtf8(Dest: PChar; MaxDestBytes: Cardinal; Source: PWideChar; SourceChars: Cardinal): Cardinal; overload; +function Utf8ToUnicode(Dest: PWideChar; Source: PChar; MaxChars: Integer): Integer; overload; +function Utf8ToUnicode(Dest: PWideChar; MaxDestChars: Cardinal; Source: PChar; SourceBytes: Cardinal): Cardinal; overload; +function Utf8Encode(const WS: WideString): UTF8String; +function Utf8Decode(const S: UTF8String): WideString; +function AnsiToUtf8(const S: string): UTF8String; +function Utf8ToAnsi(const S: UTF8String): string; +{$ENDIF} + +implementation +uses +{$IFDEF VER7P} + StrUtils, +{$ELSE} + CRParser, +{$ENDIF} + Math; + +{ BitConverter } + +class function BitConverter.GetBytes(value: word): TBytes; +begin + SetLength(Result, SizeOf(Word)); + Word(Pointer(Result)^) := value; +end; + +class function BitConverter.GetBytes(value: cardinal): TBytes; +begin + SetLength(Result, SizeOf(Cardinal)); + Cardinal(Pointer(Result)^) := value; +end; + +class function BitConverter.GetBytes(value: int64): TBytes; +begin + SetLength(Result, SizeOf(int64)); + Int64(Pointer(Result)^) := value; +end; + +class function BitConverter.GetBytes(value: double): TBytes; +begin + SetLength(Result, SizeOf(Double)); + Double(Pointer(Result)^) := value; +end; + +class function BitConverter.GetBytes(value: Single): TBytes; +begin + SetLength(Result, SizeOf(Single)); + Single(Pointer(Result)^) := value; +end; + +class function BitConverter.Int64BitsToDouble(value: int64): double; +begin + Result := Double(Pointer(@value)^); +end; + +class function BitConverter.DoubleToInt64Bits(value: double): int64; +begin + Result := PInt64(@value)^; +end; + +class function BitConverter.ToDouble(const value: TBytes; startIndex: integer): Double; +begin + Result := Double(Pointer(PChar(value) + startIndex)^); +end; + +class function BitConverter.ToDouble(value: PChar; startIndex: integer): Double; +begin + Result := Double(Pointer(PChar(value) + startIndex)^); +end; + +class function BitConverter.ToSingle(const value: TBytes; startIndex: integer): Single; +begin + Result := Single(Pointer(PChar(value) + startIndex)^); +end; + +class function BitConverter.ToInt64(const value: TBytes; startIndex: integer): Int64; +begin + Result := Int64(Pointer(PChar(value) + startIndex)^); +end; + +class function BitConverter.ToInt64(value: PChar; startIndex: integer): Int64; +begin + Result := Int64(Pointer(value + startIndex)^); +end; + +class function BitConverter.ToInt32(const value: TBytes; startIndex: integer): integer; +begin + Result := Integer(Pointer(PChar(value) + startIndex)^); +end; + +class function BitConverter.ToInt32(value: PChar; startIndex: integer): integer; +begin + Result := Integer(Pointer(PChar(value) + startIndex)^); +end; + +class function BitConverter.ToInt16(const value: TBytes; startIndex: integer): smallint; +begin + Result := SmallInt(Pointer(PChar(value) + startIndex)^); +end; + +class function BitConverter.ToUInt32(const value: TBytes; startIndex: integer): UInt32; +begin + Result := UInt32(Pointer(PChar(value) + startIndex)^); +end; + +class function BitConverter.ToUInt16(const value: TBytes; startIndex: integer): UInt16; +begin + Result := UInt16(Pointer(PChar(value) + startIndex)^); +end; + +class function BitConverter.ToUInt16(value: PChar; startIndex: integer): UInt16; +begin + Result := UInt16(Pointer(PChar(value) + startIndex)^); +end; + + +{ Marshal } + +class function Marshal.AllocHGlobal(cb: integer): pointer; +begin + GetMem(Result, cb); +end; + +class function Marshal.ReallocHGlobal(pv: pointer; cb: pointer): pointer; +begin + Result := pv; + ReallocMem(Result, Integer(cb)); +end; + +class procedure Marshal.FreeHGlobal(hglobal: pointer); +begin + FreeMem(hglobal); +end; + +class procedure Marshal.FreeCoTaskMem(ptr: pointer); +begin +end; + +class function Marshal.ReadByte(ptr: pointer; ofs: integer): byte; +begin + Result := Byte(Pointer(Integer(ptr) + ofs)^); +end; + +class procedure Marshal.WriteByte(ptr: pointer; val: byte); +begin + Byte(ptr^) := val; +end; + +class procedure Marshal.WriteByte(ptr: pointer; ofs: integer; val: byte); +begin + Byte(Pointer(Integer(ptr) + ofs)^) := val; +end; + +class function Marshal.ReadInt16(ptr: pointer; ofs: integer): smallint; +begin + Result := SmallInt(Pointer(Integer(ptr) + ofs)^); +end; + +class procedure Marshal.WriteInt16(ptr: pointer; val: smallint); +begin + SmallInt(ptr^) := val; +end; + +class procedure Marshal.WriteInt16(ptr: pointer; ofs: integer; val: smallint); +begin + SmallInt(Pointer(Integer(ptr) + ofs)^) := val; +end; + +class function Marshal.ReadInt32(ptr: pointer; ofs: integer): integer; +begin + Result := Integer(Pointer(Integer(ptr) + ofs)^); +end; + +class procedure Marshal.WriteInt32(ptr: pointer; val: integer); +begin + Integer(ptr^) := val; +end; + +class procedure Marshal.WriteInt32(ptr: pointer; ofs, val: integer); +begin + Integer(Pointer(Integer(ptr) + ofs)^) := val; +end; + +class function Marshal.ReadInt64(ptr: pointer; ofs: integer): int64; +begin + Result := Int64(Pointer(Integer(ptr) + ofs)^); +end; + +class procedure Marshal.WriteInt64(ptr: pointer; val: int64); +begin + Int64(ptr^) := val; +end; + +class procedure Marshal.WriteInt64(ptr: pointer; val: double); +begin + Double(ptr^) := val; +end; + +class procedure Marshal.WriteInt64(ptr: pointer; ofs: integer; val: int64); +begin + Int64(Pointer(Integer(ptr) + ofs)^) := val; +end; + +class function Marshal.ReadIntPtr(ptr: pointer; ofs: integer): pointer; +begin + Result := Pointer(Pointer(Integer(ptr) + ofs)^); +end; + +class procedure Marshal.WriteIntPtr(ptr, val: pointer); +begin + Pointer(ptr^) := val; +end; + +class procedure Marshal.WriteIntPtr(ptr: pointer; ofs: integer; val: pointer); +begin + Pointer(Pointer(Integer(ptr) + ofs)^) := val; +end; + +class function Marshal.PtrToStringAnsi(ptr: pointer; len: integer = 0): string; +begin + if len > 0 then begin + SetLength(Result, len); + Move(ptr^, PChar(Result)^, len); + end + else + Result := PChar(ptr); +end; + +class function Marshal.PtrToStringUni(ptr: pointer; len: integer = 0): WideString; +begin + if len > 0 then begin + SetLength(Result, len); + Move(ptr^, PWideChar(Result)^, len shl 1); + end + else + Result := PWideChar(ptr); +end; + +class function Marshal.StringToHGlobalAnsi(const s: string): pointer; +begin + Result := PChar(s); +end; + +class function Marshal.StringToHGlobalUni(const s: WideString): pointer; +begin + Result := PWideChar(s); +end; + +class procedure Marshal.Copy(const source: TBytes; startIndex: integer; + destination: pointer; length: integer); +begin + if length = 0 then + Exit; + Move(Source[StartIndex], destination^, length); +end; + +class procedure Marshal.Copy(Source: pointer; var destination: TBytes; + startIndex, length: integer); +begin + if length = 0 then + Exit; + Move(source^, destination[startIndex], length); +end; + +class function Marshal.GetIUnknownForObject(o: TInterfacedObject): IntPtr; +var + iu: IUnknown; +begin + iu := IUnknown(o); + iu._AddRef; + Result := IntPtr(iu); +end; + +class function Marshal.AddRef(pUnk: IntPtr): integer; +begin + Result := IUnknown(pUnk)._AddRef; +end; + +class function Marshal.Release(pUnk: IntPtr): integer; +begin + Result := IUnknown(pUnk)._Release; +end; + +{ Encoding } + +class function Encoding.Default: EncodingClass; +begin + Result := Encoding; +end; + +class function Encoding.Unicode: EncodingClass; +begin + Result := UnicodeEncoding; +end; + +class function Encoding.UTF8: EncodingClass; +begin + Result := UTF8Encoding; +end; + +class function Encoding.GetBytes(const chars: string): TBytes; +begin + SetLength(Result, Length(chars)); + Move(PChar(chars)^, Pointer(Result)^, Length(chars)); +end; + +class function Encoding.GetBytes(const chars: string; charIndex, charCount: int; var bytes: TBytes; byteIndex: int): int; +begin + if charCount > 0 then + Move((PChar(chars) + charIndex)^, bytes[byteIndex], charCount); + Result := charCount; +end; + +class function Encoding.{$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(const chars: WideString): TBytes; +begin + SetLength(Result, Length(chars) shl 1); + Move(PWideChar(chars)^, Pointer(Result)^, Length(chars) shl 1); +end; + +class function Encoding.{$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(const chars: WideString; charIndex, charCount: int; var bytes: TBytes; byteIndex: int): int; +begin + Move((PWideChar(chars) + charIndex)^, bytes[byteIndex], charCount shl 1); + Result := charCount shl 1; +end; + +class function Encoding.GetString(const bytes: TBytes): string; +begin + Result := GetString(bytes, 0, Length(bytes)); +end; + +class function Encoding.GetString(const bytes: TBytes; index: integer; count: integer): string; +begin + if count = 0 then begin + Result := ''; + Exit; + end; + SetLength(Result, count); + Move(Pointer(@Bytes[index])^, PChar(Result)^, Length(Result)); +end; + +class function Encoding.GetWideString(const bytes: TBytes): WideString; +begin + Result := GetString(bytes); +end; + +class function Encoding.GetWideString(const bytes: TBytes; index: integer; count: integer): WideString; +begin + Result := GetString(bytes, index, count); +end; + +{ UnicodeEncoding } + +class function UnicodeEncoding.GetString(const bytes: TBytes): string; +begin + Result := GetWideString(bytes); +end; + +class function UnicodeEncoding.GetString(const bytes: TBytes; index: integer; count: integer): string; +begin + Result := GetWideString(bytes, index, count); +end; + +class function UnicodeEncoding.GetWideString(const bytes: TBytes): WideString; +begin + Result := GetWideString(bytes, 0, Length(bytes)); +end; + +class function UnicodeEncoding.GetWideString(const bytes: TBytes; index: integer; count: integer): WideString; +begin + if count = 0 then begin + Result := ''; + Exit; + end; + SetLength(Result, count shr 1); + Move(Pointer(@bytes[index])^, PWideChar(Result)^, count); +end; + +{ UTF8Encoding } + +{$IFDEF UTF8} + +// UnicodeToUTF8(3): +// Scans the source data to find the null terminator, up to MaxBytes +// Dest must have MaxBytes available in Dest. + +function UnicodeToUtf8(Dest: PChar; Source: PWideChar; MaxBytes: Integer): Integer; +var + len: Cardinal; +begin + len := 0; + if Source <> nil then + while Source[len] <> #0 do + Inc(len); + Result := CLRClasses.UnicodeToUtf8(Dest, MaxBytes, Source, len); +end; + +// UnicodeToUtf8(4): +// MaxDestBytes includes the null terminator (last char in the buffer will be set to null) +// Function result includes the null terminator. +// Nulls in the source data are not considered terminators - SourceChars must be accurate + +function UnicodeToUtf8(Dest: PChar; MaxDestBytes: Cardinal; Source: PWideChar; SourceChars: Cardinal): Cardinal; +var + i, count: Cardinal; + c: Cardinal; +begin + Result := 0; + if Source = nil then Exit; + count := 0; + i := 0; + if Dest <> nil then + begin + while (i < SourceChars) and (count < MaxDestBytes) do + begin + c := Cardinal(Source[i]); + Inc(i); + if c <= $7F then + begin + Dest[count] := Char(c); + Inc(count); + end + else if c > $7FF then + begin + if count + 3 > MaxDestBytes then + break; + Dest[count] := Char($E0 or (c shr 12)); + Dest[count+1] := Char($80 or ((c shr 6) and $3F)); + Dest[count+2] := Char($80 or (c and $3F)); + Inc(count,3); + end + else // $7F < Source[i] <= $7FF + begin + if count + 2 > MaxDestBytes then + break; + Dest[count] := Char($C0 or (c shr 6)); + Dest[count+1] := Char($80 or (c and $3F)); + Inc(count,2); + end; + end; + if count >= MaxDestBytes then count := MaxDestBytes-1; + Dest[count] := #0; + end + else + begin + while i < SourceChars do + begin + c := Integer(Source[i]); + Inc(i); + if c > $7F then + begin + if c > $7FF then + Inc(count); + Inc(count); + end; + Inc(count); + end; + end; + Result := count+1; // convert zero based index to byte count +end; + +function Utf8ToUnicode(Dest: PWideChar; Source: PChar; MaxChars: Integer): Integer; +var + len: Cardinal; +begin + len := 0; + if Source <> nil then + while Source[len] <> #0 do + Inc(len); + Result := CLRClasses.Utf8ToUnicode(Dest, MaxChars, Source, len); +end; + +function Utf8ToUnicode(Dest: PWideChar; MaxDestChars: Cardinal; Source: PChar; SourceBytes: Cardinal): Cardinal; +var + i, count: Cardinal; + c: Byte; + wc: Cardinal; +begin + if Source = nil then + begin + Result := 0; + Exit; + end; + Result := Cardinal(-1); + count := 0; + i := 0; + if Dest <> nil then + begin + while (i < SourceBytes) and (count < MaxDestChars) do + begin + wc := Cardinal(Source[i]); + Inc(i); + if (wc and $80) <> 0 then + begin + if i >= SourceBytes then Exit; // incomplete multibyte char + wc := wc and $3F; + if (wc and $20) <> 0 then + begin + c := Byte(Source[i]); + Inc(i); + if (c and $C0) <> $80 then Exit; // malformed trail byte or out of range char + if i >= SourceBytes then Exit; // incomplete multibyte char + wc := (wc shl 6) or (c and $3F); + end; + c := Byte(Source[i]); + Inc(i); + if (c and $C0) <> $80 then Exit; // malformed trail byte + + Dest[count] := WideChar((wc shl 6) or (c and $3F)); + end + else + Dest[count] := WideChar(wc); + Inc(count); + end; + if count >= MaxDestChars then count := MaxDestChars-1; + Dest[count] := #0; + end + else + begin + while (i < SourceBytes) do + begin + c := Byte(Source[i]); + Inc(i); + if (c and $80) <> 0 then + begin + if i >= SourceBytes then Exit; // incomplete multibyte char + c := c and $3F; + if (c and $20) <> 0 then + begin + c := Byte(Source[i]); + Inc(i); + if (c and $C0) <> $80 then Exit; // malformed trail byte or out of range char + if i >= SourceBytes then Exit; // incomplete multibyte char + end; + c := Byte(Source[i]); + Inc(i); + if (c and $C0) <> $80 then Exit; // malformed trail byte + end; + Inc(count); + end; + end; + Result := count+1; +end; + +function Utf8Encode(const WS: WideString): UTF8String; +var + L: Integer; + Temp: UTF8String; +begin + Result := ''; + if WS = '' then Exit; + SetLength(Temp, Length(WS) * 3); // SetLength includes space for null terminator + + L := CLRClasses.UnicodeToUtf8(PChar(Temp), Length(Temp)+1, PWideChar(WS), Length(WS)); + if L > 0 then + SetLength(Temp, L-1) + else + Temp := ''; + Result := Temp; +end; + +function Utf8Decode(const S: UTF8String): WideString; +var + L: Integer; + Temp: WideString; +begin + Result := ''; + if S = '' then Exit; + SetLength(Temp, Length(S)); + + L := CLRClasses.Utf8ToUnicode(PWideChar(Temp), Length(Temp)+1, PChar(S), Length(S)); + if L > 0 then + SetLength(Temp, L-1) + else + Temp := ''; + Result := Temp; +end; + +function AnsiToUtf8(const S: string): UTF8String; +begin + Result := Utf8Encode(S); +end; + +function Utf8ToAnsi(const S: UTF8String): string; +begin + Result := Utf8Decode(S); +end; + +{$ENDIF} + +class function UTF8Encoding.GetBytes(const chars: string): TBytes; +var + UTF8: UTF8String; +begin + UTF8 := AnsiToUtf8(chars); + SetLength(Result, Length(UTF8)); + Move(PChar(UTF8)^, Pointer(Result)^, Length(UTF8)); +end; + +class function UTF8Encoding.{$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(const chars: WideString): TBytes; +var + UTF8: UTF8String; +begin + UTF8 := UTF8Encode(chars); + SetLength(Result, Length(UTF8)); + Move(PChar(UTF8)^, Pointer(Result)^, Length(UTF8)); +end; + +class function UTF8Encoding.GetString(const bytes: TBytes; index: integer; count: integer): string; +var + UTF8: UTF8String; +begin + if count = 0 then begin + Result := ''; + Exit; + end; + SetLength(UTF8, count); + + Move(Pointer(@bytes[index])^, PChar(UTF8)^, Length(UTF8)); + Result := Utf8ToAnsi(UTF8); +end; + +class function UTF8Encoding.GetWideString(const bytes: TBytes): WideString; +begin + Result := GetWideString(bytes, 0, Length(bytes)); +end; + +class function UTF8Encoding.GetWideString(const bytes: TBytes; index: integer; count: integer): WideString; +var + UTF8: UTF8String; +begin + if count = 0 then begin + Result := ''; + Exit; + end; + SetLength(UTF8, count); + + Move(Pointer(@bytes[index])^, PChar(UTF8)^, Length(UTF8)); + Result := UTF8Decode(UTF8); +end; + +{$IFDEF BCB} +{Added to avoid C++ Builder 6 bug} + +class function UTF8Encoding.GetBytes(const chars: string; charIndex, charCount: int; var bytes: TBytes; byteIndex: int): int; +begin + Result := inherited GetBytes(chars, charIndex, charCount, bytes, byteIndex); +end; + +class function UTF8Encoding.{$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(const chars: WideString; charIndex, charCount: int; var bytes: TBytes; byteIndex: int): int; +begin + Result := inherited GetBytes(chars, charIndex, charCount, bytes, byteIndex); +end; + +class function UTF8Encoding.GetString(const bytes: TBytes): string; +begin + Result := inherited GetString(bytes); +end; + +{$ENDIF} + + +{ StringBuilder } + +constructor StringBuilder.Create(capacity: integer); +begin + FActualLength := 0; + SetLength(FString, capacity); +end; + +constructor StringBuilder.Create(const value: string; capacity: integer); +begin + Create(capacity); + Append(value); +end; + +procedure StringBuilder.SetActualLength(Value: integer); +var + l: integer; +begin + l := System.Length(FString); + if l - FActualLength < Value then + SetLength(FString, FActualLength + Value + l shr 1); + FActualLength := Value; +end; + +procedure StringBuilder.Append(const value: string); +var + l, ls: integer; + +begin + ls := System.Length(value); + if ls = 0 then + Exit; + + l := System.Length(FString); + if l - FActualLength < ls then + SetLength(FString, FActualLength + ls + l shr 1); + Move(PChar(value)^, PChar(@FString[FActualLength + 1])^, ls); + Inc(FActualLength, ls); +end; + +procedure StringBuilder.Append(const value: string; const startIndex: integer; const count: integer); +var + l: integer; + +begin + if count = 0 then + Exit; + + l := System.Length(FString); + if l - FActualLength < count then + SetLength(FString, FActualLength + count + l shr 1); + Move((PChar(value) + startIndex)^, PChar(@FString[FActualLength + 1])^, count); + Inc(FActualLength, count); +end; + +procedure StringBuilder.Append(const value: char); +var + l: integer; + +begin + l := System.Length(FString); + if l - FActualLength < 1 then + SetLength(FString, FActualLength + 1 + l shr 1); + FString[FActualLength + 1] := value; + Inc(FActualLength); +end; + +procedure StringBuilder.Append(const value: char; repeatCount: integer); +var + s: string; +begin + s := StringOfChar(value, repeatCount); + Append(s); +end; + +procedure StringBuilder.Append(value: StringBuilder); +var + l: integer; + +begin + if (value = nil) or (value.Length = 0) then + Exit; + + l := System.Length(FString); + if l - FActualLength < value.Length then + SetLength(FString, FActualLength + value.Length + l shr 1); + Move(PChar(value.FString)^, PChar(@FString[FActualLength + 1])^, value.Length); + Inc(FActualLength, value.Length); +end; + +procedure StringBuilder.Insert(index: integer; const value: string); +var + l, ls: integer; + +begin + l := System.Length(FString); + ls := System.Length(value); + if l - FActualLength < ls then + SetLength(FString, FActualLength + ls + l shr 1); + + Move(PChar(@FString[Index + 1])^, PChar(@FString[Index + ls + 1])^, FActualLength - Index); + Move(PChar(value)^, PChar(@FString[Index + 1])^, ls); + + Inc(FActualLength, ls); +end; + +procedure StringBuilder.Replace(const OldValue: string; const NewValue: string); + + function PosEx(const SubStr, S: string; Offset, Len: integer): Integer; + var + I,X: Integer; + LenSubStr: Integer; + begin + I := Offset; + LenSubStr := System.Length(SubStr); + Len := Len - LenSubStr + 1; + while I <= Len do begin + if S[I] = SubStr[1] then begin + X := 1; + while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do + Inc(X); + if (X = LenSubStr) then + begin + Result := I; + exit; + end; + end; + Inc(I); + end; + Result := 0; + end; + + procedure Insert(index: integer; const value: string; offset: integer); + var + l, ls: integer; + begin + l := System.Length(FString); + ls := System.Length(value) - offset + 1; + if l - FActualLength < ls then + SetLength(FString, FActualLength + ls + l shr 1); + + if FActualLength > Index then + Move(PChar(@FString[Index + 1])^, PChar(@FString[Index + ls + 1])^, FActualLength - Index); + Move(PChar(@value[offset])^, PChar(@FString[Index + 1])^, ls); + end; + +var + lOld, lNew: integer; + Index: integer; + +begin + lOld := System.Length(OldValue); + lNew := System.Length(NewValue); + Index := PosEx(OldValue, FString, 1, FActualLength); + + while Index > 0 do begin + if lOld > lNew then begin + Move(PChar(NewValue)^, PChar(@FString[Index])^, lNew); + Move(PChar(@FString[Index + lOld])^, PChar(@FString[Index + lNew])^, FActualLength - Index - lOld + 1); + end else + if lOld < lNew then begin + Move(PChar(NewValue)^, PChar(@FString[Index])^, lOld); + Insert(Index + lOld - 1, NewValue, lOld + 1); + end else + Move(PChar(NewValue)^, PChar(@FString[Index])^, lNew); + + Inc(FActualLength, lNew - lOld); + Index := PosEx(OldValue, FString, Index + lNew, FActualLength); + end; +end; + +function StringBuilder.ToString: string; +begin + Result := Copy(FString, 1, FActualLength); +end; + +{ Buffer } + +class procedure Buffer.BlockCopy(const src: TBytes; srcOffset: integer; const dst: TBytes; dstOffset: integer; count: integer); +begin + Move((PChar(src) + srcOffset)^, (PChar(dst) + dstOffset)^, count); +end; + +{ MemoryStream } +constructor MemoryStream.Create(capacity: int); +begin + inherited Create; + System.SetLength(FData, capacity); +end; + +procedure MemoryStream.Close; +begin + System.SetLength(FData, 0); +end; + +procedure MemoryStream.SetLength(Value: Integer); +const + MinCapacity = $FFFF; +var + l: integer; +begin + l := System.Length(FData); // Performance opt + if (Value > l) or (l > MinCapacity) then + System.SetLength(FData, Value); + + FLength := Value; +end; + +procedure MemoryStream.SetPosition(const Pos: Integer); +begin + if Pos > Length then + Length := Pos; + FPosition := Pos; +end; + +function MemoryStream.Read(var Buffer: TBytes; Offset: int; Count: int): int; +begin + Result := Read(PChar(@Buffer[0]), Offset, Count); +end; + +function MemoryStream.Read(Buffer: PChar; Offset: int; Count: int): int; +begin + Result := System.Length(FData) - FPosition; + if Result > Count then + Result := Count; + Move(PChar(@FData[FPosition])^, Buffer[Offset], Result); + Inc(FPosition, Result); +end; + +function MemoryStream.ReadByte: Byte; +begin + Result := FData[FPosition]; + Inc(FPosition); +end; + +function MemoryStream.GetBuffer: PChar; +begin + Result := @FData[0]; +end; + +procedure MemoryStream.Write(const Buffer: TBytes; Offset: int; Count: int); +begin + Write(PChar(@Buffer[0]), Offset, Count); +end; + +procedure MemoryStream.Write(Buffer: PChar; Offset: int; Count: int); +var + l: integer; +begin + l := FPosition + Count; + if l > Length then + Length := l; + Move(Buffer[Offset], PChar(@FData[FPosition])^, Count); + Inc(FPosition, Count); +end; + +procedure MemoryStream.WriteByte(value: Byte); +var + l: integer; +begin + l := FPosition + 1; + if l > Length then + Length := l; + FData[FPosition] := Value; + Inc(FPosition); +end; + +function MemoryStream.Seek(Offset: Longint; Origin: Word): Longint; +begin + case Origin of + soFromBeginning: FPosition := Offset; + soFromCurrent: FPosition := FPosition + Offset; + soFromEnd: FPosition := System.Length(FData) - Offset; + end; + if FPosition > System.Length(FData) then + FPosition := System.Length(FData) + else if FPosition < 0 then FPosition := 0; + Result := FPosition; +end; + +{ ArgumentException } +constructor ArgumentException.Create; +begin + inherited Create(''); +end; + +constructor ArgumentException.Create(const Msg: string); +begin + inherited Create(Msg); +end; + +constructor NotSupportedException.Create; +begin + inherited Create(''); +end; + +constructor NotSupportedException.Create(const Msg: string); +begin + inherited Create(Msg); +end; + +initialization + +end. diff --git a/internal/4.10.0.10/1/Source/CRAccess.pas b/internal/4.10.0.10/1/Source/CRAccess.pas new file mode 100644 index 0000000..4c62071 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CRAccess.pas @@ -0,0 +1,1696 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Core Access +// Created: 01.07.00 +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CRAccess; +{$ENDIF} +interface +uses +{$IFDEF VER6P} + Variants, +{$ENDIF} +{$IFDEF CLR} + System.Runtime.InteropServices, Borland.Vcl.TypInfo, +{$ELSE} + CLRClasses, +{$ENDIF} + SysUtils, Classes, MemData, MemUtils; + +const +// Props + prUsername = 1; // char* + prPassword = 2; // char* + prServer = 4; // char* + prAutoCommit = 5; // bool + prSQL = 10; // char* + prScanParams = 11; // bool + prSQLType = 12; // integer + prRowsProcessed = 13; // integer + + prUniDirectional = 20; // bool + prFetchRows = 21; // integer + prFetchAll = 22; // bool + prRowsFetched = 23; // integer + prExecuting = 24; // bool + prLongStrings = 25; // bool + +/// if False then PutField set Null for string fields with empty value ('') + prEnableEmptyStrings = 26; // bool + + prFlatBuffers = 27; // bool + prConvertEOL = 28; // bool + prIndexFieldNames = 29; // char* +{$IFDEF HAVE_COMPRESS} + prCompressBlobMode = 30; // TCompressBlobMode +{$ENDIF} + prDisconnectedMode = 31; + prDisableParamScan = 32; // Used for ODAC + +// Sub data types +const + dtSingle = 1; + dtUInt8 = 2; + +type + TCRConnection = class; + TCRCommand = class; + TCRRecordSet = class; + TParamDesc = class; + TParamDescs = class; + + TParamDescClass = class of TParamDesc; + + TCommandType = (ctUnknown, ctStatement, ctCursor); + + TCursorState = ( + csInactive, // default state (TCRRecordSet.InternalOpen, TCustomDASQL.SQLChanged) + csOpen, // ODAC only: OCI73 TOCICommand.InternalOpen + csParsed, // ODAC only: OCI73 - statement parsed + csPrepared, // statement prepared + csBound, // ODAC only: parameters bound + csExecuteFetchAll, // ODAC only: + csExecuting, // ODAC only(?): statement is executing (TCRCommand.Execute) + csExecuted, // statement successfully executed + csFetching, // setted on first TCRRecordSet.Fetch + csFetchingAll, // ODAC, IbDAC specific. Setted on the FetchAll start + csFetched // fetch finished or canceled + ); + + TErrorProc = procedure (E: Exception; var Fail, Reconnect: boolean {$IFNDEF LITE}; var Reexecute: boolean; ReconnectAttempt: integer; + var ConnLostCause: TConnLostCause{$ENDIF}) of object; + TReconnectProc = procedure of object; + TBoolProc = procedure (Value: boolean) of object; + TBeforeFetchProc = procedure (out Cancel: boolean) of object; + TAfterFetchProc = procedure of object; + TDataChangeProc = procedure of object; + + EFailOver = class(Exception) + public + FConnLostCause: TConnLostCause; + + constructor Create(ConnLostCause: TConnLostCause); + end; + +{ TCRConnection } + + TCRConnection = class + private + FOnError: TErrorProc; + FOnReconnectError: TReconnectProc; + FOnReconnectSuccess: TReconnectProc; + FConnectionTime: Longword; + + protected + FConnected: boolean; + FUsername: string; + FPassword: string; + FServer: string; + FAutoCommit: boolean; + FConvertEOL: boolean; + FIsValid: boolean; + FPool: TObject; + FPoolVersion: integer; + FComponent: TObject; + FDisconnectedMode: boolean; + + FInProcessError: boolean; + FReconnected: boolean; + procedure DoError(E: Exception; var Fail: boolean); virtual; + + property AutoCommit: boolean read FAutoCommit write FAutoCommit; + + public + constructor Create; virtual; + destructor Destroy; override; + + procedure Connect(const ConnectString: string); virtual; + procedure Disconnect; virtual; abstract; + + procedure StartTransaction; virtual; abstract; + procedure Commit; virtual; abstract; + procedure Rollback; virtual; abstract; + + function GetConnected: boolean; + procedure SetConnected(Value: boolean); + + procedure SetUsername(const Value: string); virtual; + procedure SetPassword(const Value: string); virtual; + procedure SetServer(const Value: string); + + function CheckIsValid: boolean; virtual; abstract; + {$IFNDEF LITE} + procedure ReturnToPool; virtual; + {$ENDIF} + + function SetProp(Prop: integer; const Value: variant): boolean; virtual; + function GetProp(Prop: integer; var Value: variant): boolean; virtual; + + property OnError: TErrorProc read FOnError write FOnError; + property OnReconnectError: TReconnectProc read FOnReconnectError write FOnReconnectError; + property OnReconnectSuccess: TReconnectProc read FOnReconnectSuccess write FOnReconnectSuccess; + + property ConnectionTime: Longword read FConnectionTime; + property IsValid: boolean read FIsValid write FIsValid; + property Pool: TObject read FPool write FPool; + property PoolVersion: integer read FPoolVersion write FPoolVersion; + property Component: TObject read FComponent write FComponent; // Is needed for failover + property DisconnectedMode: boolean read FDisconnectedMode write FDisconnectedMode; + end; + +{ TCRCommand } + + TCRCommand = class + private + protected + FComponent: TObject; + FConnection: TCRConnection; + FSQL: string; + FParams: TParamDescs; + FAutoCommit: boolean; + FAfterExecute: TBoolProc; + FExecuting: boolean; + {$IFDEF HAVE_COMPRESS} + FCompressBlob: TCompressBlobMode; + {$ENDIF} + + property Params: TParamDescs read FParams write FParams; + property Executing: boolean read FExecuting write FExecuting; + + public + constructor Create; virtual; + destructor Destroy; override; + + procedure Prepare; virtual; + procedure Unprepare; virtual; + function GetPrepared: boolean; virtual; abstract; + + procedure Execute(Iters: integer = 1); virtual; abstract; + + procedure SetConnection(Value: TCRConnection); virtual; + procedure SetSQL(const Value: string); virtual; + function GetCursorState: TCursorState; virtual; abstract; + procedure SetCursorState(Value: TCursorState); virtual; abstract; + + { Params } + function GetParamDescType: TParamDescClass; virtual; + procedure ClearParams; + function AddParam: TParamDesc; virtual; + procedure DeleteParam(Index: integer); + function GetParamCount: integer; + function GetParam(Index: integer): TParamDesc; + function FindParam(Name: string): TParamDesc; + + function SetProp(Prop: integer; const Value: variant): boolean; virtual; + function GetProp(Prop: integer; var Value: variant): boolean; virtual; + + property SQL: string read FSQL write SetSQL; + property Component: TObject read FComponent write FComponent; // Is needed for failover + property AfterExecute: TBoolProc read FAfterExecute write FAfterExecute; + end; + +{ $IFNDEF LITE} +{ TCRTableInfo } + + TCRTablesInfo = class; + + TCRTableInfo = class(TObject) + protected + FOwner: TCRTablesInfo; + FIndex: Integer; + FTableName: string; + FTableAlias: string; + FIsView: boolean; + procedure SetTableName(Value: string); + procedure SetTableAlias(Value: string); + function GetTableNameFull: string; virtual; + procedure SetTableNameFull(Value: string); virtual; + public + constructor Create(Owner: TCRTablesInfo); virtual; + + class function NormalizeName(Value: string; const QuoteNames: boolean = False): string; overload; virtual; + class function NormalizeName(Value: string; const LeftQ: char; const RightQ: char; const QuoteNames: boolean = False): string; overload; virtual; + + class function LeftQuote: Char; virtual; + class function RightQuote: Char; virtual; + + class function Quote(const Value: string; const LeftQ: char; const RightQ: char): string; + class function UnQuote(const Value: string): string; + class function IsQuoted(const Value: string): boolean; virtual; + class function QuotesNeeded(Value: string): boolean; virtual; + + property TableName: string read FTableName write SetTableName; + property TableAlias: string read FTableAlias write SetTableAlias; + property TableNameFull: string read GetTableNameFull write SetTableNameFull; + property IsView: boolean read FIsView write FIsView; + property Index: Integer read FIndex write FIndex; + end; + + TTableInfoClass = class of TCRTableInfo; + + TCRTablesInfo = class + private + function GetItem(Index: Integer): TCRTableInfo; + procedure SetItem(Index: Integer; const Value: TCRTableInfo); + protected + FList: array of TCRTableInfo; + FUpdateCount: Integer; + FTableInfoClass: TTableInfoClass; + FTableNameList: TStringList; + FTableAliasList: TStringList; + FIsNormalized: Boolean; + procedure InternalAdd(TableInfo: TCRTableInfo); + procedure Changed; + procedure TableNameChanged; + procedure TableAliasChanged; + function GetCount: Integer; + public + constructor Create(TableInfoClass: TTableInfoClass); + destructor Destroy; override; + function Add: TCRTableInfo; + procedure Clear; + procedure BeginUpdate; virtual; + procedure EndUpdate; virtual; + procedure Normalize; + function FindByName(TableName: string): TCRTableInfo; + function IndexOf(TableInfo: TCRTableInfo): Integer; + function IndexByName(TableName: string): Integer; + function IndexByAlias(TableAlias: string): Integer; + property Items[Index: Integer]: TCRTableInfo read GetItem write SetItem; default; + property Count: Integer read GetCount; + property TableInfoClass: TTableInfoClass read FTableInfoClass; + end; +{ $ENDIF} + +{ TCRFieldDesc} + + TCRFieldDesc = class (TFieldDesc) + { $IFNDEF LITE} + protected + FTableInfo: TCRTableInfo; + FActualNameQuoted: array[boolean] of string; // cache for [QuoteNames] + public + function ActualNameQuoted(RecordSet: TCRRecordSet; const QuoteNames: boolean): string; virtual; + + property TableInfo: TCRTableInfo read FTableInfo write FTableInfo; + { $ENDIF} + end; + +{ TCRRecordSet } + + TCRRecordSet = class (TMemData) + private + protected + FCommand: TCRCommand; + FUniDirectional: boolean; + FFetchRows: integer; + FFetchAll: boolean; + FLongStrings: boolean; + FFlatBuffers: boolean; + + FAfterExecFetch: TBoolProc; + FAfterFetchAll: TBoolProc; + FOnBeforeFetch: TBeforeFetchProc; + FOnAfterFetch: TAfterFetchProc; + FOnDataChanged: TDataChangeProc; + FWaitForFetchBreak: boolean; + FCommandType: TCommandType; + + { $IFNDEF LITE} + FTablesInfo: TCRTablesInfo; + { $ENDIF} + + procedure CreateCommand; virtual; abstract; + procedure FreeCommand; + procedure SetCommand(Value: TCRCommand); virtual; + + function CanFetchBack: boolean; virtual; // Return True, if BlockMan is store only one block of records + + { Open/Close } + procedure InternalPrepare; override; + procedure InternalUnPrepare; override; + procedure InternalOpen; override; + + function NeedInitFields: boolean; virtual; + procedure ExecFetch; virtual; + procedure DoBeforeFetch(out Cancel: boolean); virtual; + procedure DoAfterFetch; virtual; + + { Items/Data } + // procedure PrepareData; override; + + { Fields } + function NeedConvertEOL: boolean; override; + + { TablesInfo } + class function GetTableInfoClass: TTableInfoClass; virtual; + + function GetComponent: TObject; + procedure SetComponent(Value: TObject); + public + constructor Create; virtual; + destructor Destroy; override; + + { Fields} + function GetFieldDescType: TFieldDescClass; override; + + { Open/Close } + procedure Prepare; override; + procedure UnPrepare; override; + procedure Disconnect; virtual; + + procedure Open; override; + procedure Close; override; + procedure ExecCommand; virtual; // Execute command + + { Records } + procedure GetNextRecord(RecBuf: IntPtr); override; + procedure GetPriorRecord(RecBuf: IntPtr); override; + + { Fetch } + procedure FetchAll; virtual; + procedure BreakFetch; virtual;// Breaks fetch. Can be called from other thread or in non-blocking mode + function CanDisconnect: boolean; virtual; + + function RowsReturn: boolean; virtual; + + function GetCommand: TCRCommand; + procedure SetConnection(Value: TCRConnection); virtual; + procedure SetSQL(const Value: string); virtual; + + function SetProp(Prop: integer; const Value: variant): boolean; virtual; + function GetProp(Prop: integer; var Value: variant): boolean; virtual; + + { Filter } + procedure FilterUpdated; override; + + property CommandType: TCommandType read FCommandType write FCommandType; + property AfterExecFetch: TBoolProc read FAfterExecFetch write FAfterExecFetch; + property AfterFetchAll: TBoolProc read FAfterFetchAll write FAfterFetchAll; + property OnBeforeFetch: TBeforeFetchProc read FOnBeforeFetch write FOnBeforeFetch; + property OnAfterFetch: TAfterFetchProc read FOnAfterFetch write FOnAfterFetch; + property OnDataChanged: TDataChangeProc read FOnDataChanged write FOnDataChanged; + + { Sorting } + procedure SortItems; override; + + { $IFNDEF LITE} + { TablesInfo } + property TablesInfo: TCRTablesInfo read FTablesInfo; + { $ENDIF} + property Component: TObject read GetComponent write SetComponent; + end; + +{ TParamDesc } + + TParamDirection = (pdUnknown, pdInput, pdOutput, pdInputOutput, pdResult); + + TParamDesc = class + private + protected + FName: string; + FDataType: word; + FParamType: TParamDirection; + + FSize: integer; + FData: variant; // pointer; + FIsNull: boolean; + FConvertEOL: boolean; + + property Name: string read FName write FName; + property DataType: word read FDataType write FDataType; + property ParamType: TParamDirection read FParamType write FParamType; + property Size: integer read FSize write FSize; + + public + constructor Create; virtual; + destructor Destroy; override; + + procedure Clear; + + function GetName: string; + procedure SetName(Value: string); + + function GetDataType: word; + procedure SetDataType(Value: word); virtual; + + function GetParamType: TParamDirection; + procedure SetParamType(Value: TParamDirection); + + function GetSize: integer; + procedure SetSize(Value: integer); virtual; + + function GetValue: variant; virtual; + procedure SetValue(const Value: variant); virtual; + + function GetObject: TSharedObject; virtual; + procedure SetObject(Value: TSharedObject); virtual; + + function GetNull: boolean; virtual; + procedure SetNull(const Value: boolean); virtual; + + procedure SetConvertEOL(const Value: boolean); + + property Value: variant read FData write SetValue; + end; + +{ TParamDescs } + + TParamDescs = class (TDAList) + private + function GetItems(Index: integer): TParamDesc; + + public + destructor Destroy; override; + + procedure Clear; override; + + function FindParam(Name: string): TParamDesc; + function ParamByName(Name: string): TParamDesc; + + property Items[Index: integer]: TParamDesc read GetItems; default; + end; + +{$IFDEF LINUX} +function GetTickCount: Cardinal; +{$ENDIF} +function GenerateTableName(const FieldDesc: TFieldDesc): string; + + +implementation + +uses +{$IFNDEF LITE} + CRConnectionPool, +{$ENDIF} +{$IFDEF VER6P} + RTLConsts, +{$ELSE} + Consts, +{$ENDIF} +{$IFDEF LINUX} + Libc; +{$ELSE} + Windows; +{$ENDIF} + +{ TCRAccess } + +{$IFDEF LINUX} +function GetTickCount: Cardinal; +var + tv: timeval; +begin + gettimeofday(tv, nil); + {$RANGECHECKS OFF} + Result := int64(tv.tv_sec) * 1000 + tv.tv_usec div 1000; +end; +{$ENDIF} + +function GenerateTableName(const FieldDesc: TFieldDesc): string; +begin + if TCRFieldDesc(FieldDesc).TableInfo <> nil then + Result := TCRFieldDesc(FieldDesc).TableInfo.TableName + else + Result := ''; +end; + +{ EFailOver } + +constructor EFailOver.Create(ConnLostCause: TConnLostCause); +begin + FConnLostCause := ConnLostCause; + inherited Create(''); +end; + +{ TCRConnection } + +constructor TCRConnection.Create; +begin + inherited; + + FConnected:= False; + FIsValid := True; +end; + +destructor TCRConnection.Destroy; +begin + Disconnect; + inherited; +end; + +procedure TCRConnection.Connect(const ConnectString: string); +begin + FConnectionTime := GetTickCount; + FIsValid := True; +end; + +procedure TCRConnection.DoError(E: Exception; var Fail: boolean); +var + Reconnect: boolean; + Attempt: Integer; +{$IFNDEF LITE} + Reexecute: boolean; + ConnLostCause: TConnLostCause; +{$ENDIF} +begin + Attempt := 0; + while not FInProcessError do begin + Reconnect := Attempt > 0; + {$IFNDEF LITE} + Reexecute := False; + {$ENDIF} + if Assigned(OnError) then begin + FInProcessError := True; + try + OnError(E, Fail, Reconnect{$IFNDEF LITE}, Reexecute, Attempt, ConnLostCause{$ENDIF}); + finally + FInProcessError := False; + end; + end; + + if Reconnect then begin + FReconnected := False; + try + FInProcessError := True; + if Attempt = 0 then + Disconnect; + except // don't raise exception + end; + try + Connect(''); + FReconnected := True; + OnReconnectSuccess; + except // don't raise exception + end; + FInProcessError := False; + + {$IFNDEF LITE} + if FReconnected and Reexecute then + raise EFailOver.Create(ConnLostCause); //Failover + {$ENDIF} + + inc(Attempt); + end; + + if not Reconnect and (Attempt > 0) then + if not FReconnected and Assigned(OnReconnectError) then begin + FInProcessError := True; + FConnected := True; // to bypass "Value <> GetConnected" check in TCustomDAConnection.SetConnected + try + OnReconnectError; + except // don't raise exception + end; + FConnected := False; + FInProcessError := False; + end; + + if not Reconnect or FReconnected then + break; + end; +end; + +function TCRConnection.GetConnected: boolean; +begin + Result := FConnected; +end; + +procedure TCRConnection.SetConnected(Value: boolean); +begin + if Value then + Connect('') + else + Disconnect; +end; + +procedure TCRConnection.SetUsername(const Value: string); +begin + FUsername := Value; +end; + +procedure TCRConnection.SetPassword(const Value: string); +begin + FPassword := Value; +end; + +procedure TCRConnection.SetServer(const Value: string); +begin + FServer := Value; +end; + +{$IFNDEF LITE} +procedure TCRConnection.ReturnToPool; +begin + Assert(FPool <> nil); + FOnError := nil; + Component := nil; + TCRConnectionPool(FPool).PutConnection(Self); +end; +{$ENDIF} + +function TCRConnection.SetProp(Prop: integer; const Value: variant): boolean; +begin + Result := True; + case Prop of + prAutoCommit: + FAutoCommit := Value; + prConvertEOL: + FConvertEOL := Value; + prDisconnectedMode: + FDisconnectedMode := Boolean(Value); + else + Assert(False, IntToStr(Prop)); + Result := False; + end; +end; + +function TCRConnection.GetProp(Prop: integer; var Value: variant): boolean; +begin + Result := True; + case Prop of + prUsername: // used in Oracle dbExpress driver (TOraSQLMetaData.getProcedureParams) + // to detect if schema name need to be included in procedure name + Value := FUsername; + else + Assert(False, IntToStr(Prop)); + Result := False; + end; +end; + +{ TCRCommand } + +constructor TCRCommand.Create; +begin + inherited; + + FParams:= TParamDescs.Create; +end; + +destructor TCRCommand.Destroy; +begin + FParams.Free; +end; + +procedure TCRCommand.Prepare; +begin + SetCursorState(csPrepared); +end; + +procedure TCRCommand.Unprepare; +begin + SetCursorState(csInactive); +end; + +procedure TCRCommand.SetConnection(Value: TCRConnection); +begin + FConnection := Value; +end; + +procedure TCRCommand.SetSQL(const Value: string); +begin + FSQL := Value; +end; + +{function TCRCommand.GetSQL: PChar; +begin + Result := PChar(FSQL); +end;} + +{ Params } + +function TCRCommand.GetParamDescType: TParamDescClass; +begin + Result := TParamDesc; +end; + +procedure TCRCommand.ClearParams; +begin + FParams.Clear; +end; + +function TCRCommand.AddParam: TParamDesc; +begin + Result := TParamDesc.Create; + FParams.Add(Result); +end; + +procedure TCRCommand.DeleteParam(Index: integer); +begin + TParamDesc(FParams[Index]).Free; + FParams.Delete(Index); +end; + +function TCRCommand.GetParamCount: integer; +begin + Result := FParams.Count; +end; + +function TCRCommand.GetParam(Index: integer): TParamDesc; +begin + Result := FParams[Index]; +end; + +function TCRCommand.FindParam(Name: string): TParamDesc; +begin + Result := FParams.FindParam(Name); +end; + +function TCRCommand.SetProp(Prop: integer; const Value: variant): boolean; +begin + Result := True; + case Prop of + prAutoCommit: + FAutoCommit := Value; + prDisableParamScan:; // Used for ODAC + else + Assert(False, IntToStr(Prop)); + Result := False; + end; +end; + +function TCRCommand.GetProp(Prop: integer; var Value: variant): boolean; +begin + Result := True; + case Prop of + prScanParams: + Value := False; + prExecuting: + Value := FExecuting; + else + Assert(False, IntToStr(Prop)); + Result := False; + end; +end; + +{ $IFNDEF LITE} +{ TCRTableInfo } + +constructor TCRTableInfo.Create(Owner: TCRTablesInfo); +begin + inherited Create; + FOwner := Owner; + FIndex := -1; +end; + +procedure TCRTableInfo.SetTableName(Value: string); +begin + FTableName := Value; + if FOwner <> nil then + FOwner.TableNameChanged; +end; + +procedure TCRTableInfo.SetTableAlias(Value: string); +begin + FTableAlias := Value; + if FOwner <> nil then + FOwner.TableAliasChanged; +end; + +function TCRTableInfo.GetTableNameFull: string; +begin + Result := FTableName; +end; + +procedure TCRTableInfo.SetTableNameFull(Value: string); +begin +end; + +class function TCRTableInfo.IsQuoted(const Value: string): boolean; +var + l: integer; +begin + l := Length(Value); + if (l <= 1) then + Result := False + else + Result := (Value[1] = LeftQuote) and (Value[l] = RightQuote); +end; + +class function TCRTableInfo.Quote(const Value: string; const LeftQ: char; const RightQ: char): string; +begin + if not IsQuoted(Value) then + Result := LeftQ + Value + RightQ + else + Result := Value; +end; + +class function TCRTableInfo.UnQuote(const Value: string): string; +begin + if IsQuoted(Value) then + Result := Copy(Value, 2, length(Value) - 2) + else + Result := Value; +end; + +class function TCRTableInfo.QuotesNeeded(Value: string): boolean; +var + i: integer; +begin + Value := UnQuote(Value); + Result := False; + for i := 1 to Length(Value) do + case Value[i] of + 'a'..'z', 'A'..'Z', '_', '0'..'9':; + else + begin + Result := True; + Exit; + end; + end; +end; + +class function TCRTableInfo.LeftQuote: Char; +begin + Result := Char('"'); +end; + +class function TCRTableInfo.RightQuote: Char; +begin + Result := Char('"'); +end; + +class function TCRTableInfo.NormalizeName(Value: string; const QuoteNames: boolean = False): string; +begin + Result := NormalizeName(Value, LeftQuote, RightQuote, QuoteNames); +end; + +class function TCRTableInfo.NormalizeName(Value: string; const LeftQ: char; const RightQ: char; const QuoteNames: boolean = False): string; +var + i: integer; +begin + if Value = '' then begin + Result := ''; + Exit; + end; + + i := Pos('.', Value); + if i <> 0 then + Result := NormalizeName(Copy(Value, 1, i - 1), QuoteNames) + '.' + NormalizeName(Copy(Value, i + 1, Length(Value) - i), QuoteNames) + else + if QuoteNames or QuotesNeeded(Value) then + Result := Quote(Value, LeftQ, RightQ) + else + Result := UnQuote(Value); +end; + +{ TCRTablesInfo } + +constructor TCRTablesInfo.Create(TableInfoClass: TTableInfoClass); +begin + inherited Create; + FTableInfoClass := TableInfoClass; + FTableNameList := TStringList.Create; + FTableAliasList := TStringList.Create; +{$IFDEF VER6P} + // Just in case + FTableNameList.CaseSensitive := False; + FTableAliasList.CaseSensitive := False; +{$ENDIF} + FUpdateCount := 0; +end; + +destructor TCRTablesInfo.Destroy; +begin + Clear; + FTableNameList.Free; + FTableAliasList.Free; + inherited Destroy; +end; + +procedure TCRTablesInfo.InternalAdd(TableInfo: TCRTableInfo); +var + c: integer; +begin + c := Count; + SetLength(FList, c + 1); + FList[c] := TableInfo; + TableInfo.Index := c; +end; + +function TCRTablesInfo.Add: TCRTableInfo; +begin + Result := FTableInfoClass.Create(Self); + InternalAdd(Result); +end; + +procedure TCRTablesInfo.Clear; +var + i: Integer; +begin + if Count > 0 then begin + for i := 0 to Count - 1 do + FList[i].Free; + SetLength(FList, 0); + Changed; + FIsNormalized := False; + end; +end; + +procedure TCRTablesInfo.Changed; +begin + TableNameChanged; + TableAliasChanged; +end; + +procedure TCRTablesInfo.TableNameChanged; +var + i: Integer; +begin + if FUpdateCount = 0 then begin + FTableNameList.Clear; + for i := 0 to Count - 1 do + FTableNameList.AddObject(FList[i].TableName, FList[i]); + FTableNameList.Sort; + end; +end; + +procedure TCRTablesInfo.TableAliasChanged; +var + i: Integer; +begin + if FUpdateCount = 0 then begin + FTableAliasList.Clear; + for i := 0 to Count - 1 do + FTableAliasList.AddObject(FList[i].TableAlias, FList[i]); + FTableAliasList.Sort; + end; +end; + +function TCRTablesInfo.GetCount: Integer; +begin + Result := Length(FList); +end; + +procedure TCRTablesInfo.BeginUpdate; +begin + Inc(FUpdateCount); +end; + +procedure TCRTablesInfo.EndUpdate; +begin + Dec(FUpdateCount); + Changed; +end; + +procedure TCRTablesInfo.Normalize; +var + i: integer; +begin + BeginUpdate; + try + for i := 0 to Count - 1 do begin + FList[i].TableName := TableInfoClass.NormalizeName(FList[i].TableName); + FList[i].TableAlias := TableInfoClass.NormalizeName(FList[i].TableAlias); + FList[i].TableNameFull := TableInfoClass.NormalizeName(FList[i].TableNameFull); + end; + FIsNormalized := True; + finally + EndUpdate; + end; +end; + +function TCRTablesInfo.FindByName(TableName: string): TCRTableInfo; +var + Index: integer; +begin + Index := IndexByName(TableName); + if Index = -1 then + Result := nil + else + Result := FList[Index]; +end; + +function TCRTablesInfo.IndexOf(TableInfo: TCRTableInfo): Integer; +begin + Result := 0; + while (Result < Count) and (FList[Result] <> TableInfo) do + Inc(Result); + if Result = Count then + Result := -1; +end; + +function TCRTablesInfo.IndexByName(TableName: string): Integer; +var + i: integer; +begin + if FIsNormalized then + TableName := TableInfoClass.NormalizeName(TableName); + if FUpdateCount = 0 then begin + Result := FTableNameList.IndexOf(TableName); + if Result <> -1 then + Result := TCRTableInfo(FTableNameList.Objects[Result]).Index; + end + else + begin + Result := -1; + for i := 0 to Count - 1 do + if AnsiSameText(FList[i].TableName, TableName) then begin + Result := i; + Break; + end; + end; +end; + +function TCRTablesInfo.IndexByAlias(TableAlias: string): Integer; +var + i: integer; +begin + if FIsNormalized then + TableAlias := TableInfoClass.NormalizeName(TableAlias); + if FUpdateCount = 0 then begin + Result := FTableAliasList.IndexOf(TableAlias); + if Result <> -1 then + Result := TCRTableInfo(FTableAliasList.Objects[Result]).Index; + end + else + begin + Result := -1; + for i := 0 to Count - 1 do + if AnsiSameText(FList[i].TableAlias, TableAlias) then begin + Result := i; + Break; + end; + end; +end; + +function TCRTablesInfo.GetItem(Index: Integer): TCRTableInfo; +begin + if (Index < 0) or (Index >= Count) then + raise Exception.CreateFmt(SListIndexError, [Index]); + + Result := FList[Index]; +end; + +procedure TCRTablesInfo.SetItem(Index: Integer; const Value: TCRTableInfo); +begin + if (Index >= 0) and (Index < Count) then + if Value <> FList[Index] then + FList[Index] := Value; +end; + +{ TCRFieldDesc } + +function TCRFieldDesc.ActualNameQuoted(RecordSet: TCRRecordSet; const QuoteNames: boolean): string; +begin + if FActualNameQuoted[QuoteNames] <> '' then + Result := FActualNameQuoted[QuoteNames] + else + begin + if FTableInfo <> nil then begin + Result := FTableInfo.NormalizeName(ActualName, QuoteNames); + FActualNameQuoted[QuoteNames] := Result; + end + else begin + Result := RecordSet.GetTableInfoClass.NormalizeName(ActualName, QuoteNames); + FActualNameQuoted[QuoteNames] := Result; + end; + end; +end; +{ $ENDIF} + +{ TCRRecordSet } + +constructor TCRRecordSet.Create; +begin + inherited; + + FAfterExecFetch := nil; + FAfterFetchAll := nil; + + FTablesInfo := TCRTablesInfo.Create(GetTableInfoClass); + CreateCommand; + + FLongStrings := True; + FFlatBuffers := True; +end; + +destructor TCRRecordSet.Destroy; +begin + FreeCommand; + +{ $IFNDEF LITE} + FTablesInfo.Free; +{ $ENDIF} + + inherited; +end; + +{procedure TCRRecordSet.CreateCommand; +begin + SetCommand(nil); +end;} + +procedure TCRRecordSet.FreeCommand; +begin + FCommand.Free; + SetCommand(nil); +end; + +procedure TCRRecordSet.SetCommand(Value: TCRCommand); +begin + FCommand := Value; +end; + +function TCRRecordSet.CanFetchBack: boolean; +begin + Result := False; +end; + +{ Open/Close } + +procedure TCRRecordSet.InternalPrepare; +begin + FCommand.Prepare; +end; + +procedure TCRRecordSet.InternalUnPrepare; +begin + FCommand.UnPrepare; +end; + +procedure TCRRecordSet.InternalOpen; +begin + try + inherited; + + FEOF := False; + + ExecFetch; + except + if not Prepared then + InternalUnprepare; + + if FCommand.GetCursorState = csExecuted then + FCommand.SetCursorState(csInactive); + + raise; + end +end; + +procedure TCRRecordSet.Prepare; +begin + if not Prepared then begin + + inherited; + + if CommandType = ctCursor then + try + InitFields; + Prepared := True; + except + Prepared := False; + InternalUnPrepare; + raise; + end; + end; +end; + +procedure TCRRecordSet.Unprepare; +begin + try + inherited; + finally + { $IFNDEF LITE} + FTablesInfo.Clear; + { $ENDIF} + end; +end; + +procedure TCRRecordSet.Disconnect; +begin + InternalUnprepare; //Remove all links to DB but not close Data + Prepared := False; //Set recordset unprepared in case of disconnect mode and + //explicit disconnection this will prevent from wrong Prepare state +end; + +procedure TCRRecordSet.Open; +begin + inherited; +end; + +procedure TCRRecordSet.Close; +begin + inherited; +end; + +procedure TCRRecordSet.ExecCommand; +begin + FCommand.Execute; + FWaitForFetchBreak := False; +end; + +function TCRRecordSet.NeedInitFields: boolean; +begin + Result := False; +end; + +procedure TCRRecordSet.ExecFetch; +var + OldCommandType: TCommandType; +begin + OldCommandType := CommandType; + + ExecCommand; + + if (OldCommandType <> ctCursor) or NeedInitFields then + InitFields; + + if FFetchAll then + FetchAll + else + Fetch; +end; + +procedure TCRRecordSet.BreakFetch; // Breaks fetch. Can be called from other thread or in non-blocking mode +begin + FWaitForFetchBreak := True; +end; + +procedure TCRRecordSet.DoBeforeFetch(out Cancel: boolean); +begin + Cancel := FWaitForFetchBreak; + + if Assigned(FOnBeforeFetch) then + FOnBeforeFetch(Cancel); + + if Cancel then begin + // reset cursor state for FetchAll + if (FCommand.GetCursorState = csFetchingAll) then + FCommand.SetCursorState(csFetching); + end; +end; + +procedure TCRRecordSet.DoAfterFetch; +begin + if Assigned(FOnAfterFetch) then + FOnAfterFetch; +end; + +procedure TCRRecordSet.SortItems; +begin + if IndexFields.Count = 0 then + Exit; + FetchAll; + + inherited SortItems; +end; + +{ Fields } +function TCRRecordSet.GetFieldDescType: TFieldDescClass; +begin + Result := TCRFieldDesc; +end; + +function TCRRecordSet.NeedConvertEOL: boolean; +begin + if (FCommand = nil) or (FCommand.FConnection = nil) then + Result := False + else + Result := FCommand.FConnection.FConvertEOL; +end; + +{ Records } + +procedure TCRRecordSet.GetNextRecord(RecBuf: IntPtr); +var + Found: boolean; + Item: PItemHeader; +begin + if not EOF then begin + if IntPtr(FirstItem) = nil then begin + if not Fetch then begin + FEOF := True; + Exit; + end + else + CurrentItem := FirstItem; + end + else + if IntPtr(CurrentItem) = nil then + CurrentItem := FirstItem + else + CurrentItem := CurrentItem.Next; + + repeat + if IntPtr(CurrentItem) = nil then begin + Item := LastItem; + + if not Fetch then begin + FEOF := True; + Exit; + end + else begin + if FUniDirectional or CanFetchBack then begin + FirstItem.Prev := nil; // remove cycle link + LastItem.Next := nil; + end; + if (IntPtr(Item.Next) = nil) or FUniDirectional then + CurrentItem := FirstItem + else + CurrentItem := Item.Next; + end + end; + + Found := not OmitRecord(CurrentItem); + if not Found then + CurrentItem := CurrentItem.Next; + until Found; + + FBOF := False; + FEOF := False; + if RecBuf <> nil then + GetRecord(RecBuf); + end; +end; + +procedure TCRRecordSet.GetPriorRecord(RecBuf: IntPtr); +var + Found: boolean; + Item: PItemHeader; +begin + if FUniDirectional then begin + FBOF := True; + CurrentItem := nil; + end + else + if not CanFetchBack then + inherited + else + if not BOF then begin + if IntPtr(LastItem) = nil then begin + if not Fetch(True){FetchBack!} then begin + FBOF := True; + Exit; + end + else + CurrentItem := LastItem; + end + else + if IntPtr(CurrentItem) = nil then + CurrentItem := LastItem + else + CurrentItem := CurrentItem.Prev; + + repeat + if IntPtr(CurrentItem) = nil then begin + Item := FirstItem; + + if not Fetch(True){FetchBack!} then begin + FBOF := True; + Exit; + end + else begin + FirstItem.Prev := nil; // remove cycle link + LastItem.Next := nil; + if IntPtr(Item.Prev) = nil then + CurrentItem := LastItem + else + CurrentItem := Item.Prev; + end; + end; + + Found := not OmitRecord(CurrentItem); + if not Found then + CurrentItem := CurrentItem.Prev; + until Found; + + FBOF := False; + FEOF := False; + if RecBuf <> nil then + GetRecord(RecBuf); + end; +end; + +{ Fetch } + +procedure TCRRecordSet.FetchAll; +begin + while Fetch do; +end; + +function TCRRecordSet.CanDisconnect: boolean; +var + CursorState: TCursorState; +begin + Assert(FCommand <> nil); + CursorState := FCommand.GetCursorState; + Result := (CursorState = csInactive) or (CursorState = csFetched); +end; + +function TCRRecordSet.RowsReturn: boolean; +begin + Result := (CommandType = ctCursor); +end; + +function TCRRecordSet.GetCommand: TCRCommand; +begin + Result := FCommand; +end; + +procedure TCRRecordSet.SetConnection(Value: TCRConnection); +begin + FCommand.SetConnection(Value); +end; + +procedure TCRRecordSet.SetSQL(const Value: string); +begin + FCommand.SetSQL(Value); +end; + +function TCRRecordSet.SetProp(Prop: integer; const Value: variant): boolean; +begin + Result := True; + case Prop of + prUniDirectional: + FUniDirectional := Value; + prFetchRows: + FFetchRows := Value; + prFetchAll: + FFetchAll := Value; + prLongStrings: + FLongStrings := Value; + prFlatBuffers: + FFlatBuffers := Value; + prEnableEmptyStrings: + EnableEmptyStrings := Value; + prIndexFieldNames: + SetIndexFieldNames(Value); + {$IFDEF HAVE_COMPRESS} + prCompressBlobMode: + FCommand.FCompressBlob := TCompressBlobMode(Integer(Value)); + {$ENDIF} + else + Assert(False, IntToStr(Prop)); + Result := False; + end; +end; + +procedure TCRRecordSet.SetComponent(Value: TObject); +begin + FCommand.Component := Value; +end; + +function TCRRecordSet.GetComponent: TObject; +begin + Result := FCommand.Component; +end; + +function TCRRecordSet.GetProp(Prop: integer; var Value: variant): boolean; +begin + Result := True; + case Prop of + prFetchAll: + Value := FFetchAll; + else + Assert(False, IntToStr(Prop)); + Result := False; + end; +end; + +procedure TCRRecordSet.FilterUpdated; +var + NotFetched: boolean; +begin + NotFetched := (RecordCount = 0) and not FEOF; + inherited FilterUpdated; + FEOF := FEOF and not NotFetched; +end; + +class function TCRRecordSet.GetTableInfoClass: TTableInfoClass; +begin + Result := TCRTableInfo; +end; + +{ TParamDesc } + +constructor TParamDesc.Create; +begin + inherited; + + FDataType := dtUnknown; +end; + +destructor TParamDesc.Destroy; +begin +end; + +procedure TParamDesc.Clear; +begin + FDataType := dtUnknown; +end; + +function TParamDesc.GetName: string; +begin + Result := FName; +end; + +procedure TParamDesc.SetName(Value: string); +begin + FName := Value; +end; + +function TParamDesc.GetDataType: word; +begin + Result := FDataType; +end; + +procedure TParamDesc.SetDataType(Value: word); +begin + FDataType := Value; +end; + +function TParamDesc.GetParamType: TParamDirection; +begin + Result := FParamType; +end; + +procedure TParamDesc.SetParamType(Value: TParamDirection); +begin + FParamType := Value; +end; + +function TParamDesc.GetSize: integer; +begin + Result := FSize; +end; + +procedure TParamDesc.SetSize(Value: integer); +begin + FSize := Value; +end; + +function TParamDesc.GetValue: variant; +begin + Result := FData; +end; + +procedure TParamDesc.SetValue(const Value: variant); +begin +{$IFNDEF VER6P} + if TVarData(Value).VType = varByRef then + SetObject(TVarData(Value).VPointer) + else +{$ENDIF} + FData := Value; + FIsNull := VarIsEmpty(FData) or VarIsNull(FData); +end; + +function TParamDesc.GetNull: boolean; +begin + Result := FIsNull; +end; + +function TParamDesc.GetObject: TSharedObject; +begin + if VarIsEmpty(FData) or VarIsNull(FData) then + Result := nil + else + begin + {$IFDEF CLR} + Assert(FData is TSharedObject); + Result := TSharedObject(FData); + {$ELSE} + Assert(TVarData(FData).VType = varByRef); + Result := TVarData(FData).VPointer; + {$ENDIF} + end; +end; + +procedure TParamDesc.SetObject(Value: TSharedObject); +begin +{$IFDEF CLR} + FData := Variant(Value); +{$ELSE} + FData := Unassigned; + TVarData(FData).VType := varByRef; + TVarData(FData).VPointer := Value; +{$ENDIF} +end; + +procedure TParamDesc.SetNull(const Value: boolean); +begin + FIsNull := Value; + FData := Unassigned; +end; + +procedure TParamDesc.SetConvertEOL(const Value: boolean); +begin + FConvertEOL := Value; +end; + +{ TParamDescs } + +destructor TParamDescs.Destroy; +begin + Clear; + + inherited; +end; + +procedure TParamDescs.Clear; +var + i:integer; +begin + for i:= 0 to Count - 1 do + if Items[i] <> nil then + TParamDesc(Items[i]).Free; + + inherited Clear; +end; + +function TParamDescs.FindParam(Name: string): TParamDesc; +var + i: integer; +begin + Result := nil; + + for i := 0 to Count - 1 do + if (Items[i] <> nil) then + if AnsiCompareText(TParamDesc(Items[i]).FName, Name) = 0 then begin + Result := Items[i]; + break; + end; +end; + +function TParamDescs.ParamByName(Name: string): TParamDesc; +begin + Result := FindParam(Name); + + if Result = nil then + Assert(False); + //raise Exception.Create(Format(SParamNotFound, [Name])); +end; + +function TParamDescs.GetItems(Index: integer): TParamDesc; +begin + Result := TParamDesc(inherited Items[Index]); +end; + +end. diff --git a/internal/4.10.0.10/1/Source/CRBatchMove.pas b/internal/4.10.0.10/1/Source/CRBatchMove.pas new file mode 100644 index 0000000..7054b96 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CRBatchMove.pas @@ -0,0 +1,695 @@ +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// DB Access +////////////////////////////////////////////////// +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CRBatchMove; +{$ENDIF} + +interface + +uses +{$IFDEF VER6P} + Variants, +{$ENDIF} + Classes, DB, DBAccess, SysUtils; + +type + TCRBatchMode = (bmAppend, bmUpdate, bmAppendUpdate, bmDelete); + + TCRBatchMoveProgressEvent = procedure (Sender: TObject; Percent: integer) of object; + TDALocate = function: boolean of object; + + TCRFieldMappingMode = (mmFieldIndex, mmFieldName); + + TCRBatchMove = class(TComponent) + private + FFldDestKeys: TFieldArray; + FStrDestKeys: string; + FSrcKeyFields: array of TField; + FDestKeyFields: array of boolean; + FKeyValues: array of Variant; + FFieldMap: array of word; + FPSDestination: IProviderSupport; + Locate: TDALocate; + procedure SetMappings(Value: TStrings); + procedure SetSource(Value: TDataSet); + procedure SetDestination(Value: TDataSet); + function GetProviderSupport(DataSet: TDataSet): IProviderSupport; + function LocateForCustomDaDataSet: boolean; + function LocateForDataSet: boolean; + + protected + FDestination: TDataSet; + FSource: TDataSet; + FMode: TCRBatchMode; + FAbortOnKeyViol: boolean; + FAbortOnProblem: boolean; + FRecordCount: Longint; + FMovedCount: Longint; + FKeyViolCount: Longint; + FProblemCount: Longint; + FChangedCount: Longint; + FMappings: TStrings; + FFieldMappingMode: TCRFieldMappingMode; + FCommitCount: integer; + FOnBatchMoveProgress: TCRBatchMoveProgressEvent; + FTransactionNeeds: boolean; + FAppliedCount: Longint; + FDestCountKeys: word; + + procedure DoBatchMoveProgress(Percent: integer); + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + function GetKeyValues: Variant; + procedure SetFieldsValues(SetKeyFields: boolean); + procedure Append; + procedure Update; + procedure AppendUpdate; + procedure Delete; + + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + procedure Execute; + + property ChangedCount: Longint read FChangedCount; + property KeyViolCount: Longint read FKeyViolCount; + property MovedCount: Longint read FMovedCount; + property ProblemCount: Longint read FProblemCount; + published + property AbortOnKeyViol: boolean read FAbortOnKeyViol write FAbortOnKeyViol default True; + property AbortOnProblem: boolean read FAbortOnProblem write FAbortOnProblem default True; + property CommitCount: integer read FCommitCount write FCommitCount default 0; + property Destination: TDataSet read FDestination write SetDestination; + property Mappings: TStrings read FMappings write SetMappings; + property FieldMappingMode: TCRFieldMappingMode read FFieldMappingMode write FFieldMappingMode default mmFieldIndex; + property Mode: TCRBatchMode read FMode write FMode default bmAppend; + property RecordCount: Longint read FRecordCount write FRecordCount default 0; + property Source: TDataSet read FSource write SetSource; + property OnBatchMoveProgress: TCRBatchMoveProgressEvent read FOnBatchMoveProgress write FOnBatchMoveProgress; + end; + +implementation + +uses +{$IFDEF VER6P} + StrUtils, +{$ENDIF} +{$IFDEF CLR} + System.Xml, System.Runtime.InteropServices, +{$ELSE} + CLRClasses, +{$ENDIF} + CRParser, DAConsts, MemData, MemDS; + +{ TCRBatchMove } + +constructor TCRBatchMove.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + + FAbortOnKeyViol := True; + FAbortOnProblem := True; + FCommitCount := 0; + FMode := bmAppend; + FMappings := TStringList.Create; + FFieldMappingMode := mmFieldIndex; +end; + +destructor TCRBatchMove.Destroy; +begin + Source := nil; + Destination := nil; + FMappings.Free; + + inherited; +end; + +procedure TCRBatchMove.SetSource(Value: TDataSet); +begin + if FSource <> Value then begin + if FSource <> nil then + FSource.RemoveFreeNotification(Self); + FSource := Value; + if FSource <> nil then + FSource.FreeNotification(Self); + end; +end; + +procedure TCRBatchMove.SetDestination(Value: TDataSet); +begin + if FDestination <> Value then begin + if FDestination <> nil then + FDestination.RemoveFreeNotification(Self); + FDestination := Value; + if FDestination <> nil then + FDestination.FreeNotification(Self); + end; +end; + +procedure TCRBatchMove.SetMappings(Value: TStrings); +begin + FMappings.Assign(Value); +end; + +procedure TCRBatchMove.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited Notification(AComponent, Operation); + + if Operation = opRemove then + begin + if Destination = AComponent then + Destination := nil; + if Source = AComponent then + Source := nil; + end; +end; + +procedure TCRBatchMove.DoBatchMoveProgress(Percent: integer); +begin + if Assigned(FOnBatchMoveProgress) then + FOnBatchMoveProgress(Self, Percent); +end; + +function TCRBatchMove.GetProviderSupport(DataSet: TDataSet): IProviderSupport; +begin + Result := nil; + if DataSet <> nil then + Result := IProviderSupport(DataSet); +end; + +function TCRBatchMove.GetKeyValues: Variant; +var + i: integer; +begin + for i := 0 to FDestCountKeys - 1 do begin + if FSrcKeyFields[i] <> nil then + FKeyValues[i] := FSrcKeyFields[i].AsVariant + else + FKeyValues[i] := '' + end; + + if FDestCountKeys > 1 then + Result := VarArrayOf(FKeyValues) + else + if FDestCountKeys > 0 then + Result := FKeyValues[0] + else + Result := Null; +end; + +procedure TCRBatchMove.SetFieldsValues(SetKeyFields: boolean); +var + fn: integer; + SrcField, DestField: TField; + SrcFieldDesc, DestFieldDesc: TFieldDesc; + SrcBlob, DestBlob: TBlob; + SkipNulls: boolean; + bs: TStringStream; + SrcStream, DestStream: TStream; + SrcPtr: IntPtr; + Optimization: Boolean; +{$IFDEF CLR} + Data: TBytes; +{$ENDIF} +begin + SkipNulls := (Mode = bmAppend) or (Mode = bmAppend) and SetKeyFields; + for fn := 0 to Destination.FieldCount - 1 do begin + if (FFieldMap[fn] = 0) or (not Destination.Fields[fn].CanModify) or + (FDestKeyFields[fn] and (not SetkeyFields)) or + Source.Fields[FFieldMap[fn] - 1].IsNull and SkipNulls then + Continue; + + SrcField := Source.Fields[FFieldMap[fn] - 1]; + Assert(SrcField <> nil); + DestField := Destination.Fields[fn]; + Assert(DestField <> nil); + + try + if SrcField.IsNull then + DestField.Clear + else + case DestField.DataType of + ftString, ftFixedChar: + case SrcField.DataType of + ftMemo, ftFmtMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}: begin + Assert(SrcField is TBlobField); + bs := TStringStream.Create(''); + try + TBlobField(SrcField).SaveToStream(bs); + DestField.AsString := bs.DataString; + finally + bs.Free; + end; + end; + else + DestField.AsString := SrcField.AsString; + end; + ftWideString{$IFDEF VER10P}, ftFixedWideChar{$ENDIF}: + case SrcField.DataType of + ftMemo, ftFmtMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}: begin + Assert(SrcField is TBlobField); + bs := TStringStream.Create(''); + try + TBlobField(SrcField).SaveToStream(bs); + Assert(DestField is TWideStringField); + TWideStringField(DestField).Value := bs.DataString; + finally + bs.Free; + end; + end; + ftWideString{$IFDEF VER10P}, ftFixedWideChar{$ENDIF}: begin + Assert(SrcField is TWideStringField); + Assert(DestField is TWideStringField); + TWideStringField(DestField).Value := TWideStringField(SrcField).Value; + end + else + DestField.AsString := SrcField.AsString; + end; + ftSmallint, ftInteger, ftWord, ftAutoInc: + DestField.AsInteger := SrcField.AsInteger; + ftLargeint: begin + Assert(DestField is TLargeIntField); + case SrcField.DataType of + ftLargeInt: + TLargeIntField(DestField).AsLargeInt := TLargeIntField(SrcField).AsLargeInt; + else + {$IFDEF VER6P} + TLargeIntField(DestField).AsLargeInt := SrcField.AsVariant; + {$ELSE} + DestField.AsString := SrcField.AsString; + {$ENDIF} + end; + end; + ftBoolean: + DestField.AsBoolean := SrcField.AsBoolean; + ftFloat: + DestField.AsFloat := SrcField.AsFloat; + ftCurrency, ftBCD: + DestField.AsCurrency := SrcField.AsCurrency; + {$IFDEF VER6P} + ftTimeStamp: + DestField.AsSQLTimeStamp := SrcField.AsSQLTimeStamp; + ftFMTBCD: + DestField.AsCurrency := SrcField.AsCurrency; + {$ENDIF} + ftDate, ftTime, ftDateTime: + DestField.AsDateTime := SrcField.AsDateTime; + ftBytes, ftVarBytes: + DestField.AsVariant := SrcField.AsVariant; + ftBlob, ftOraBlob, ftOraClob: begin + DestStream := nil; + try + if SrcField is TBlobField then begin + Optimization := False; + if (SrcField.DataSet is TMemDataSet) and (DestField.DataSet is TMemDataSet) then begin + // TCustomDADataSet optimization + SrcFieldDesc := TMemDataSet(SrcField.DataSet).GetFieldDesc(SrcField); + DestFieldDesc := TMemDataSet(SrcField.DataSet).GetFieldDesc(SrcField); + if SrcFieldDesc.DataType = DestFieldDesc.DataType then begin + SrcBlob := TMemDataSet(SrcField.DataSet).GetBlob(SrcField); + DestBlob := TMemDataSet(DestField.DataSet).GetBlob(DestField); + if SrcBlob.ClassType = DestBlob.ClassType then begin + {$IFDEF HAVE_COMPRESS} + if (SrcField.DataSet is TCustomDADataSet) and (DestField.DataSet is TCustomDADataSet) then + Optimization := TCustomDADataSet(SrcField.DataSet).Options.CompressBlobMode = TCustomDADataSet(DestField.DataSet).Options.CompressBlobMode + else + Optimization := True; + {$ENDIF} + if Optimization then begin + TBlobUtils.SetModified(SrcBlob, True); + TMemDSUtils.SetBlob(TMemDataSet(DestField.DataSet), DestField, SrcBlob); + end; + end; + end; + end; + if not Optimization then begin + DestStream := DestField.DataSet.CreateBlobStream(DestField, bmWrite); + SrcStream := SrcField.DataSet.CreateBlobStream(SrcField, bmRead); + try + DestStream.CopyFrom(SrcStream, 0); + finally + SrcStream.Free; + end; + end; + end + else + if SrcField.DataSize > 0 then begin + DestStream := DestField.DataSet.CreateBlobStream(DestField, bmWrite); + SrcPtr := Marshal.AllocHGlobal(SrcField.DataSize); + try + SrcField.GetData(SrcPtr); + {$IFDEF CLR} + SetLength(Data, SrcField.DataSize); + Marshal.Copy(SrcPtr, Data, 0, SrcField.DataSize); + DestStream.ReadBuffer(Data, SrcField.DataSize); + {$ELSE} + DestStream.ReadBuffer(SrcPtr^, SrcField.DataSize); + {$ENDIF} + finally + Marshal.FreeHGlobal(SrcPtr); + end; + end + else + DestField.AsVariant := SrcField.AsVariant; + finally + DestStream.Free; + end; + end; + ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}: + DestField.AsString := SrcField.AsString; + else + DestField.AsVariant := SrcField.AsVariant; + end; + except + on Exception do begin + Inc(FProblemCount); + if FAbortOnProblem then + raise; + end; + end; + + end; +end; + +function TCRBatchMove.LocateForCustomDaDataSet: boolean; +begin + Result := TCustomDADataSet(Destination).Locate(FFldDestKeys, GetKeyValues, []); +end; + +function TCRBatchMove.LocateForDataSet: boolean; +begin + Result := Destination.Locate(FStrDestKeys, GetKeyValues, []); +end; + +procedure TCRBatchMove.Append; +begin + if FTransactionNeeds and ((FAppliedCount mod FCommitCount) = 0) then + FPSDestination.PSStartTransaction; + + Destination.Append; + SetFieldsValues(True); + Destination.Post; + + Inc(FAppliedCount); + if FTransactionNeeds and ((FAppliedCount mod FCommitCount) = 0) then + FPSDestination.PSEndTransaction(True); +end; + +procedure TCRBatchMove.Update; +begin + if Locate then begin + if FTransactionNeeds and ((FAppliedCount mod FCommitCount) = 0) then + FPSDestination.PSStartTransaction; + + Destination.Edit; + SetFieldsValues(False); + Destination.Post; + Inc(FChangedCount); + + Inc(FAppliedCount); + if FTransactionNeeds and ((FAppliedCount mod FCommitCount) = 0) then + FPSDestination.PSEndTransaction(True); + end; +end; + +procedure TCRBatchMove.AppendUpdate; +begin + if FTransactionNeeds and ((FAppliedCount mod FCommitCount) = 0) then + FPSDestination.PSStartTransaction; + + if Locate then begin + Destination.Edit; + SetFieldsValues(False); + Destination.Post; + Inc(FChangedCount); + end + else begin + Destination.Append; + SetFieldsValues(True); + Destination.Post; + end; + + Inc(FAppliedCount); + if FTransactionNeeds and ((FAppliedCount mod FCommitCount) = 0) then + FPSDestination.PSEndTransaction(True); +end; + +procedure TCRBatchMove.Delete; +begin + if Locate then begin + if FTransactionNeeds and ((FAppliedCount mod FCommitCount) = 0) then + FPSDestination.PSStartTransaction; + + Destination.Delete; + Inc(FChangedCount); + + Inc(FAppliedCount); + if FTransactionNeeds and ((FAppliedCount mod FCommitCount) = 0) then + FPSDestination.PSEndTransaction(True); + end; +end; + +procedure TCRBatchMove.Execute; +type + TAction = procedure of object; +var + OldSourceActive, OldDestinationActive: Boolean; + bookmark: TBookmarkStr; + DestName, SourceName: string; + SrcRecCount: integer; + DestFieldCount: word; + Action: TAction; + row: Integer; + + procedure GetKeyFields; + var + i, p1, p2: integer; + fieldNo: integer; + KeyFields: TKeyAndDataFields; + + procedure SetKeyField; + begin + FDestKeyFields[fieldNo - 1] := True; + if FFieldMap[fieldNo - 1] > 0 then + FSrcKeyFields[FDestCountKeys] := Source.Fields[FFieldMap[fieldNo - 1] - 1] + else + FSrcKeyFields[FDestCountKeys] := nil; + end; + + begin + DestFieldCount := Destination.FieldCount; + SetLength(FSrcKeyFields, DestFieldCount); + SetLength(FDestKeyFields, DestFieldCount); + for i := 0 to DestFieldCount - 1 do + FDestKeyFields[i] := False; + + FDestCountKeys := 0; + if Destination is TCustomDADataSet then begin + TDBAccessUtils.GetKeyAndDataFields(TCustomDADataSet(Destination), KeyFields, True); + + SetLength(FFldDestKeys, Length(KeyFields.KeyFieldDescs)); + for i := 0 to Length(FFldDestKeys) - 1 do begin + FFldDestKeys[i] := TCustomDADataSet(Destination).GetField(KeyFields.KeyFieldDescs[i]); + fieldNo := KeyFields.KeyFieldDescs[i].FieldNo; + SetKeyField; + Inc(FDestCountKeys); + end; + end + else begin + FStrDestKeys := FPSDestination.PSGetKeyFields; + p1 := 1; + p2 := Pos(';', FStrDestKeys); + while p2 > 0 do begin + fieldNo := Destination.FieldByName(Copy(FStrDestKeys, p1, p2 - 1)).FieldNo; + SetKeyField; + Inc(FDestCountKeys); + p1 := p2 + 1; + p2 := PosEx(';', FStrDestKeys, p1); + end; + + if Length(FStrDestKeys) > 0 then begin + fieldNo := Destination.FieldByName(Copy(FStrDestKeys, p1, Length(FStrDestKeys))).FieldNo; + SetKeyField; + Inc(FDestCountKeys); + end; + end; + + SetLength(FSrcKeyFields, FDestCountKeys); + SetLength(FKeyValues, FDestCountKeys); + end; + + procedure GetMappingNames(num: integer); + var + p: Integer; + Mapping: string; + begin + Mapping := FMappings[num]; + p := Pos('=', Mapping); + if p > 0 then begin + DestName := Copy(Mapping, 1, p - 1); + SourceName := Copy(Mapping, p + 1, 255); + end + else begin + DestName := Mapping; + SourceName := Mapping; + end; + end; + + procedure SetMapping; + var + i: integer; + SrcField, DestField: TField; + begin + DestFieldCount := Destination.FieldCount; + SetLength(FFieldMap, DestFieldCount); + // SetLength(FFieldComp, DestFieldCount); + + if FMappings.Count <> 0 then + begin + for i := 0 to DestFieldCount - 1 do + FFieldMap[i] := 0; + + for i := 0 to FMappings.Count - 1 do begin + GetMappingNames(i); + SrcField := Source.FindField(SourceName); + if SrcField = nil then + raise Exception.Create(SCannotFindField + ' ' + SourceName); + DestField := Destination.FindField(DestName); + if DestField = nil then + raise Exception.Create(SCannotFindField + ' ' + DestName); + FFieldMap[DestField.Index] := SrcField.Index + 1; + end; + end + else + case FFieldMappingMode of + mmFieldIndex: + for i := 0 to DestFieldCount - 1 do + if i < Source.FieldCount then + FFieldMap[i] := i + 1 + else + FFieldMap[i] := 0; + mmFieldName: + for i := 0 to DestFieldCount - 1 do begin + SrcField := Source.FindField(Destination.Fields[i].FieldName); + if SrcField <> nil then + FFieldMap[i] := SrcField.Index + 1 + else + FFieldMap[i] := 0; + end; + end; + end; + +var + IsKeyViolation: boolean; + +begin + if (Destination = nil) or (Source = nil) or (Destination = Source) then + DatabaseError(SInvalidBatchMove, Self); + OldSourceActive := Source.Active; + OldDestinationActive := Destination.Active; + try + Source.DisableControls; + Destination.DisableControls; + Source.Open; + Source.CheckBrowseMode; + Source.UpdateCursorPos; + Destination.Open; + Destination.CheckBrowseMode; + Source.CursorPosChanged; + FChangedCount := 0; + FKeyViolCount := 0; + FProblemCount := 0; + FMovedCount := 0; + FAppliedCount := 0; + + FPSDestination := GetProviderSupport(Destination); + if Destination is TCustomDADataSet then + Locate := LocateForCustomDaDataSet + else + Locate := LocateForDataSet; + + SetMapping; + GetKeyFields; + SrcRecCount := Source.RecordCount; + + FTransactionNeeds := (not FPSDestination.PSInTransaction) and (FCommitCount > 0); + if FRecordCount = 0 then begin + bookmark := Source.Bookmark; + Source.First; + end; + + Action := nil; + case FMode of + bmAppend: + Action := Append; + bmUpdate: + Action := Update; + bmAppendUpdate: + Action := AppendUpdate; + bmDelete: + Action := Delete; + else + Assert(False); + end; + + try + for row := 0 to SrcRecCount - 1 do begin + try + if (FRecordCount >= FAppliedCount) and (FRecordCount > 0) then + Exit; + Inc(FMovedCount); + + Action; + except + on E: EDatabaseError do begin + Destination.Cancel; + + if not (Destination is TCustomDADataSet) then + IsKeyViolation := True + else + if E is EDAError then + IsKeyViolation := TDBAccessUtils.IsKeyViolation(TCustomDADataSet(Destination).Connection, EDAError(E)) + else + IsKeyViolation := False; + + if IsKeyViolation then begin + Inc(FKeyViolCount); + if FAbortOnKeyViol or (FMode = bmDelete) then begin + if FTransactionNeeds then + FPSDestination.PSEndTransaction(False); + raise; + end; + end + else + raise; + end; + end; + + DoBatchMoveProgress(Round((row * 100) / SrcRecCount)); + Source.Next; + end; + + finally + if FTransactionNeeds and FPSDestination.PSInTransaction then + FPSDestination.PSEndTransaction(True); + end; + + finally + if FRecordCount = 0 then + Source.Bookmark := bookmark; + if OldDestinationActive then + Destination.First; + Destination.Active := OldDestinationActive; + Source.Active := OldSourceActive; + Destination.EnableControls; + Source.EnableControls; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/CRConnectionPool.pas b/internal/4.10.0.10/1/Source/CRConnectionPool.pas new file mode 100644 index 0000000..589f8be --- /dev/null +++ b/internal/4.10.0.10/1/Source/CRConnectionPool.pas @@ -0,0 +1,725 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Connection Pooling supports +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CRConnectionPool; +{$ENDIF} + +interface + +uses +{$IFDEF CLR} + ExtCtrls, +{$ELSE} + CLRClasses, +{$ENDIF} + Classes, CRAccess, SyncObjs, MemUtils; + +const + StatisticsCount = 8; + +type + TCRConnectionParametersClass = class of TCRConnectionParameters; + + TCRConnectionPool = class; + TCRConnectionPoolManager = class; + + { TCRConnectionParameters } + + TCRConnectionParameters = class(TPersistent) + protected + procedure AssignTo(Dest: TPersistent); override; + + public + MinPoolSize: integer; + MaxPoolSize: integer; + Username: string; + Server: string; + Password: string; + ConnectionLifeTime: integer; + Validate: boolean; + + constructor Create; virtual; + function Equals(ConnectionParameters: TCRConnectionParameters): boolean; virtual; + end; + + { TCRConnectionPool } + + TCRConnectionPool = class + private + FConnectionParameters: TCRConnectionParameters; + FManager: TCRConnectionPoolManager; + protected + FTakenConnectionsCount: integer; + + procedure Validate; virtual; + procedure Clear; virtual; + procedure AsyncClear; virtual; + function GetTotalConnectionsCount: integer; virtual; + procedure InternalPutConnection(CRConnection: TCRConnection); virtual; abstract; + + property ConnectionParameters: TCRConnectionParameters read FConnectionParameters; + public + constructor Create(Manager: TCRConnectionPoolManager; ConnectionParameters: TCRConnectionParameters); virtual; + destructor Destroy; override; + + function GetConnection: TCRConnection; virtual; abstract; + procedure PutConnection(CRConnection: TCRConnection); + procedure Invalidate; virtual; + + property TotalConnectionsCount: integer read GetTotalConnectionsCount; + end; + + TCRConnectionsArray = array of TCRConnection; + TIntegerArray = array of integer; + TStatisticsArray = array [0..StatisticsCount-1] of integer; + + { TCRLocalConnectionPool } + + TCRLocalConnectionPool = class(TCRConnectionPool) + private + //private ConnectMode connectMode = ConnectMode.Default; + FPooledConnections: TCRConnectionsArray; + FPooledConnectionsCount, FHead, FTail: integer; + FVersions: TIntegerArray; + FVersion: integer; + FStatistics: TStatisticsArray; + FDoomedConnectionsCount: integer; + FInvalidateVersion, FClearVersion: integer; + + hBusy: TEvent; + FLockPooled, FLockTaken, FLockVersion, FLockGet: TCriticalSection; + + function IsLive(CRConnection: TCRConnection): boolean; + function CheckIsValid(Connection: TCRConnection): boolean; + procedure ReserveConnection; + function InternalGetConnection(var Connection: TCRConnection; var Version: integer; + Reserve: boolean = True): boolean; + procedure InternalReturnConnection(Connection: TCRConnection; Version: integer); + procedure InternalFreeConnection(Connection: TCRConnection; Reserved: boolean = False); + + protected + function CreateNewConnector: TCRConnection; virtual; abstract; + + procedure Validate; override; + procedure Clear; override; + procedure AsyncClear; override; + function GetTotalConnectionsCount: integer; override; + procedure InternalPutConnection(CRConnection: TCRConnection); override; + public + // TODO: Add transaction context parameter + constructor Create(Manager: TCRConnectionPoolManager; ConnectionParameters: TCRConnectionParameters); override; + destructor Destroy; override; + + function GetConnection: TCRConnection; override; + procedure Invalidate; override; + end; + + { TValidateThread } + + TValidateThread = class(TThread) + private + FManager: TCRConnectionPoolManager; + {$IFNDEF LINUX} + FEvent: TEvent; + {$ENDIF} + protected + procedure Execute; override; + public + constructor Create(Manager: TCRConnectionPoolManager); + {$IFNDEF LINUX} + destructor Destroy; override; + procedure Terminate; + {$ENDIF} + end; + + { TCRConnectionPoolManager } + + TCRConnectionPoolManager = class + private + FPools: TDAList; + FValidateThread: TValidateThread; + + protected + FLockGet, FLockList: TCriticalSection; + protected + function CreateCRConnectionPool(ConnectionParameters: TCRConnectionParameters): TCRConnectionPool; virtual; abstract; + procedure InternalClear; + procedure InternalAsyncClear; + function GetConnectionPool(ConnectionParameters: TCRConnectionParameters): TCRConnectionPool; + function InternalGetConnection(ConnectionParameters: TCRConnectionParameters): TCRConnection; virtual; + function InternalCheckConnection(Connection: TCRConnection): TCRConnection; virtual; + public + constructor Create; + destructor Destroy; override; + end; + +implementation + +uses +{$IFDEF MSWINDOWS} + Windows, +{$ENDIF} + SysUtils, DAConsts; + +{ TCRConnectionParameters } + +constructor TCRConnectionParameters.Create; +begin + inherited Create; + + MaxPoolSize := 100; +end; + +function TCRConnectionParameters.Equals(ConnectionParameters: TCRConnectionParameters): boolean; +begin + Result := False; + if ConnectionParameters <> nil then + Result := + (MinPoolSize = ConnectionParameters.MinPoolSize) and + (MaxPoolSize = ConnectionParameters.MaxPoolSize) and + (ConnectionLifeTime = ConnectionParameters.ConnectionLifeTime) and + (AnsiCompareText(Username, ConnectionParameters.Username) = 0) and + (AnsiCompareText(Server, ConnectionParameters.Server) = 0) and + (Password = ConnectionParameters.Password) and + (Validate = ConnectionParameters.Validate); +end; + +procedure TCRConnectionParameters.AssignTo(Dest: TPersistent); +begin + if Dest is TCRConnectionParameters then begin + TCRConnectionParameters(Dest).MinPoolSize := MinPoolSize; + TCRConnectionParameters(Dest).MaxPoolSize := MaxPoolSize; + TCRConnectionParameters(Dest).Username := Username; + TCRConnectionParameters(Dest).Password := Password; + TCRConnectionParameters(Dest).Server := Server; + TCRConnectionParameters(Dest).ConnectionLifeTime := ConnectionLifeTime; + TCRConnectionParameters(Dest).Validate := Validate; + end + else + inherited; +end; + +{ TCRConnectionPool } + +constructor TCRConnectionPool.Create(Manager: TCRConnectionPoolManager; ConnectionParameters: TCRConnectionParameters); +begin + inherited Create; + + FConnectionParameters := TCRConnectionParametersClass(ConnectionParameters.ClassType).Create; + FConnectionParameters.Assign(ConnectionParameters); + FManager := Manager; +end; + +destructor TCRConnectionPool.Destroy; +begin + FConnectionParameters.Free; + + inherited; +end; + +function TCRConnectionPool.GetTotalConnectionsCount: integer; +begin + Result := FTakenConnectionsCount; +end; + +procedure TCRConnectionPool.Invalidate; +begin +end; + +procedure TCRConnectionPool.Validate; +begin +end; + +procedure TCRConnectionPool.Clear; +begin +end; + +procedure TCRConnectionPool.AsyncClear; +begin +end; + +procedure TCRConnectionPool.PutConnection(CRConnection: TCRConnection); +begin + InternalPutConnection(FManager.InternalCheckConnection(CRConnection)); +end; + +{ TCRLocalConnectionPool } + +constructor TCRLocalConnectionPool.Create(Manager: TCRConnectionPoolManager; ConnectionParameters: TCRConnectionParameters); +begin + inherited; + + SetLength(FPooledConnections, Self.ConnectionParameters.MaxPoolSize); + SetLength(FVersions, Self.ConnectionParameters.MaxPoolSize); + hBusy := TEvent.Create(nil, True, True, ''); + FLockPooled := TCriticalSection.Create; + FLockTaken := TCriticalSection.Create; + FLockVersion := TCriticalSection.Create; + FLockGet := TCriticalSection.Create; +end; + +destructor TCRLocalConnectionPool.Destroy; +begin + Clear; + FLockPooled.Free; + FLockTaken.Free; + FLockVersion.Free; + FLockGet.Free; + hBusy.Free; + + inherited; +end; + +function TCRLocalConnectionPool.IsLive(CRConnection: TCRConnection): boolean; +var + CurrentTickCount, LifeTime: longword; +begin + Result := FConnectionParameters.ConnectionLifeTime = 0; + if Result then // If connector life time is zero then does not remove connector + Exit; + + CurrentTickCount := GetTickCount; + if CurrentTickCount >= CRConnection.ConnectionTime then + LifeTime := CurrentTickCount - CRConnection.ConnectionTime + else + LifeTime := longword($ffffffff) - CRConnection.ConnectionTime + CurrentTickCount + 1; + Result := LifeTime <= Longword(FConnectionParameters.ConnectionLifeTime); +end; + +function TCRLocalConnectionPool.CheckIsValid(Connection: TCRConnection): boolean; +begin + Result := Connection.CheckIsValid; + Connection.PoolVersion := FInvalidateVersion; +end; + +procedure TCRLocalConnectionPool.ReserveConnection; +begin + Inc(FTakenConnectionsCount); + if FTakenConnectionsCount >= ConnectionParameters.MaxPoolSize then + hBusy.ResetEvent; +end; + +function TCRLocalConnectionPool.InternalGetConnection(var Connection: TCRConnection; + var Version: integer; Reserve: boolean = True): boolean; +begin + if Reserve then begin + FLockGet.Enter; // must be first + FLockTaken.Enter; + end; + try + FLockPooled.Enter; + try + Result := False; + if not Reserve or (FTakenConnectionsCount < ConnectionParameters.MaxPoolSize) then + if FPooledConnectionsCount > 0 then begin + Connection := FPooledConnections[FHead]; + Version := FVersions[FHead]; + Inc(FHead); + if FHead = ConnectionParameters.MaxPoolSize then + FHead := 0; + Dec(FPooledConnectionsCount); + if Reserve then + ReserveConnection; + Result := True; + end; + finally + FLockPooled.Leave; + end; + finally + if Reserve then begin + FLockTaken.Leave; + FLockGet.Leave; + end; + end; +end; + +procedure TCRLocalConnectionPool.InternalReturnConnection(Connection: TCRConnection; + Version: integer); +begin + FLockPooled.Enter; + try + FPooledConnections[FTail] := Connection; + FVersions[FTail] := Version; + Inc(FTail); + if FTail = ConnectionParameters.MaxPoolSize then + FTail := 0; + Inc(FPooledConnectionsCount); + {if FDoomedConnectionsCount > FPooledConnectionsCount - ConnectionParameters.MinPoolSize then + FDoomedConnectionsCount := FPooledConnectionsCount - ConnectionParameters.MinPoolSize;} + + FLockTaken.Enter; + try + Dec(FTakenConnectionsCount); + hBusy.SetEvent; + finally + FLockTaken.Leave; + end; + finally + FLockPooled.Leave; + end; +end; + +procedure TCRLocalConnectionPool.InternalFreeConnection(Connection: TCRConnection; + Reserved: boolean = False); +begin + // TODO: May be this try-except unnecessary + try + Connection.Free; + except + end; + + if not Reserved then begin + FLockTaken.Enter; + try + Dec(FTakenConnectionsCount); + hBusy.SetEvent; + finally + FLockTaken.Leave; + end; + end; +end; + +function TCRLocalConnectionPool.GetConnection: TCRConnection; +const +{$IFDEF LINUX} + Timeout: Longword = $FFFFFFFF; +{$ELSE} + Timeout: Longword = 30000; +{$ENDIF} +var + Version: integer; +{$IFNDEF LINUX} + Ticks, BeginTickCount: cardinal; +{$ENDIF} +begin +{$IFNDEF LINUX} + BeginTickCount := GetTickCount; +{$ENDIF} + FLockGet.Enter; + try + {$IFNDEF LINUX} + Ticks := GetTickCount - BeginTickCount; + {$ENDIF} + if hBusy.WaitFor({$IFDEF LINUX}Timeout{$ELSE}Timeout - Ticks{$ENDIF}) = wrTimeout then + raise Exception.Create(SMaxConnectionsReached); + + FLockTaken.Enter; + try + if FTakenConnectionsCount < ConnectionParameters.MaxPoolSize then + ReserveConnection + else + raise Exception.Create(SMaxConnectionsReached); + finally + FLockTaken.Leave; + end; + + finally + FLockGet.Leave; + end; + + if InternalGetConnection(Result, Version, False) then begin + if (Result.PoolVersion < FClearVersion) or + (ConnectionParameters.Validate or (Result.PoolVersion < FInvalidateVersion)) + and not CheckIsValid(Result) + then begin + InternalFreeConnection(Result, True); + Result := nil; + end; + end + else + Result := nil; + + if Result = nil then + Result := CreateNewConnector; + Result.Pool := Self; + Result.PoolVersion := FInvalidateVersion; +end; + +procedure TCRLocalConnectionPool.InternalPutConnection(CRConnection: TCRConnection); +var + Version: integer; +begin + Assert(CRConnection.Pool = Self); + if not IsLive(CRConnection) or not CRConnection.IsValid or + (CRConnection.PoolVersion < FClearVersion) or + (CRConnection.PoolVersion < FInvalidateVersion) and not CheckIsValid(CRConnection) + then + InternalFreeConnection(CRConnection) + else begin + FLockVersion.Enter; + try + Inc(FVersion); + Version := FVersion; + finally + FLockVersion.Leave; + end; + CRConnection.Pool := nil; // protection from PutConnection call on already pooled connection + InternalReturnConnection(CRConnection, Version); + end; +end; + +procedure TCRLocalConnectionPool.Validate; +var + Connection: TCRConnection; + i, FirstVersion, LastVersion, Doomed, Removed, Version: integer; +begin + FirstVersion := FStatistics[0]; + LastVersion := FStatistics[StatisticsCount - 1]; + for i := StatisticsCount - 1 downto 1 do + FStatistics[i] := FStatistics[i - 1]; + FStatistics[0] := FVersion; + Doomed := (FDoomedConnectionsCount + StatisticsCount - 2) div StatisticsCount; + FDoomedConnectionsCount := FPooledConnectionsCount - ConnectionParameters.MinPoolSize - Doomed; + + i := FTail; + Removed := 0; + while (FHead <> i) and InternalGetConnection(Connection, Version) do begin + if (Version <= LastVersion) or not IsLive(Connection) or + (Connection.PoolVersion < FClearVersion) or + ((Version <= FirstVersion) or (Connection.PoolVersion < FInvalidateVersion)) + and not CheckIsValid(Connection) + then begin + InternalFreeConnection(Connection); + Inc(Removed); + end + else + InternalReturnConnection(Connection, Version); + end; + + if Removed < Doomed then begin + Doomed := Doomed - Removed; + for i := 0 to Doomed - 1 do + if InternalGetConnection(Connection, Version) then + InternalFreeConnection(Connection) + else + break; + end; +end; + +procedure TCRLocalConnectionPool.Invalidate; +begin + Inc(FInvalidateVersion); +end; + +procedure TCRLocalConnectionPool.Clear; +var + Connection: TCRConnection; + Version: integer; +begin + while InternalGetConnection(Connection, Version) do + InternalFreeConnection(Connection); +end; + +procedure TCRLocalConnectionPool.AsyncClear; +begin + Inc(FInvalidateVersion); + Inc(FClearVersion); +end; + +function TCRLocalConnectionPool.GetTotalConnectionsCount: integer; +begin + FLockPooled.Enter; + try + FLockTaken.Enter; + try + Result := FTakenConnectionsCount + FPooledConnectionsCount; + finally + FLockTaken.Leave; + end; + finally + FLockPooled.Leave; + end; +end; + +{ TCRConnectionPoolManager } + +constructor TCRConnectionPoolManager.Create; +begin + inherited; + + FPools := TDAList.Create; + FLockGet := TCriticalSection.Create; + FLockList := TCriticalSection.Create; + FValidateThread := TValidateThread.Create(Self); +end; + +destructor TCRConnectionPoolManager.Destroy; +begin + if FValidateThread <> nil then begin + FValidateThread.Terminate; + {$IFDEF WIN32} + // infinite wait can hang in DLL + WaitForSingleObject(FValidateThread.Handle, 5000); + {$ELSE} + FValidateThread.WaitFor; + {$ENDIF} + FValidateThread.Free; + end; + + if (FPools <> nil) and (FLockGet <> nil) and (FLockList <> nil) then + InternalClear; + FPools.Free; + FLockGet.Free; + FLockList.Free; + + inherited; +end; + +// Conn parameters used for creating new pool with initial parameters +function TCRConnectionPoolManager.GetConnectionPool(ConnectionParameters: TCRConnectionParameters): TCRConnectionPool; +var + i: integer; + Pool: TCRConnectionPool; +begin + Result := nil; + + // Search if pool with same connection string exist + for i := 0 to FPools.Count - 1 do begin + Pool := TCRConnectionPool(FPools.Items[i]); + if Pool.FConnectionParameters.Equals(ConnectionParameters) then begin + Result := Pool; + break; + end; + end; + + // Create new pool object if existing not found + if Result = nil then begin + Result := CreateCRConnectionPool(ConnectionParameters); + FPools.Add(Result); + end; +end; + +procedure TCRConnectionPoolManager.InternalClear; +begin + FLockList.Enter; + try + while FPools.Count <> 0 do begin + TCRConnectionPool(FPools.Items[0]).Free; + FPools.Delete(0); + end; + finally + FLockList.Leave; + end; +end; + +procedure TCRConnectionPoolManager.InternalAsyncClear; +var + i: integer; +begin + FLockList.Enter; + try + for i := 0 to FPools.Count - 1 do + TCRConnectionPool(FPools[i]).AsyncClear; + finally + FLockList.Leave; + end; +end; + +function TCRConnectionPoolManager.InternalGetConnection(ConnectionParameters: TCRConnectionParameters): TCRConnection; +begin + FLockGet.Enter; + try + Result := GetConnectionPool(ConnectionParameters).GetConnection; + finally + FLockGet.Leave; + end; +end; + +function TCRConnectionPoolManager.InternalCheckConnection( + Connection: TCRConnection): TCRConnection; +begin + Result := Connection; +end; + +{ TValidateThread } + +constructor TValidateThread.Create(Manager: TCRConnectionPoolManager); +begin + FManager := Manager; +{$IFNDEF LINUX} + FEvent := TEvent.Create(nil, True, False, ''); +{$ENDIF} +{$IFDEF CLR} + inherited Create(True); // to prevent Application hanging on + Handle.IsBackGround := True; // close + Resume; +{$ELSE} + inherited Create(False); +{$ENDIF} +end; + +{$IFNDEF LINUX} +destructor TValidateThread.Destroy; +begin + FEvent.Free; +end; + +procedure TValidateThread.Terminate; +begin + inherited; + FEvent.SetEvent; +end; +{$ENDIF} + +procedure TValidateThread.Execute; +const + Timeout = 30000; +var + i, Count: integer; + Pool: TCRConnectionPool; + Ticks, BeginTickCount: cardinal; +begin + Ticks := 0; + while True do begin + if Terminated then + Exit; + {$IFNDEF LINUX} + if (Ticks < Timeout) and (FEvent.WaitFor(Timeout - Ticks) = wrSignaled) then + Exit; + {$ELSE} + while Ticks < Timeout do begin + Sleep(200); + if Terminated then + Exit; + Ticks := Ticks + 200; + end; + {$ENDIF} + + BeginTickCount := GetTickCount; + + FManager.FLockList.Enter; + try + for i := FManager.FPools.Count - 1 downto 0 do begin + if Terminated then + Exit; + Pool := TCRConnectionPool(FManager.FPools[i]); + Pool.Validate; + + FManager.FLockGet.Enter; + try + Count := Pool.TotalConnectionsCount; + if Count = 0 then + FManager.FPools.Delete(i); + finally + FManager.FLockGet.Leave; + end; + if Count = 0 then + Pool.Free; + end; + finally + FManager.FLockList.Leave; + end; + + Ticks := GetTickCount - BeginTickCount; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/CRParser.pas b/internal/4.10.0.10/1/Source/CRParser.pas new file mode 100644 index 0000000..f9f1d46 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CRParser.pas @@ -0,0 +1,1054 @@ + +////////////////////////////////////////////////// +// Copyright © 1998-2007 Core Lab. All right reserved. +// CRParser +// Created: 27.03.98 +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CRParser; +{$ENDIF} +interface + +uses + Classes; + +const + lcEnd = 0; + lcLexem = -100; + lcSymbol = -102; + lcIdent = -103; // identificator + lcNumber = -105; + lcString = -106; + lcBlank = -107; + lcComment = -108; + + BlockSize = 64 * 1024; + +type + TParserClass = class of TParser; + TClausesArr = array of integer; + + TParser = class + protected + OldPos: integer; + OldOldPos: integer; + FOmitBlank: boolean; + FOmitComment: boolean; + FUppered: boolean; + FCurrLine: integer; + FPrevLine: integer; + FCurrBegLine: integer; + FPrevBegLine: integer; + FQuotedString: boolean; + FAdvancedStringParsing: boolean; + + FSavedPos: integer; // local var buf in previous version + FLexemPos: integer; // start Lexem pos in Text + FLexemLength: integer; // actual length of FLexemArray; + + FStream: TStream; + FStoredBlocks: TStringList; + FCurrentBlock: string; + FFirstBlockOffset: integer; + FBlockOffset: integer; + FBlockSize: integer; + FAlternativeQuoting: boolean; // supported in Oracle 10 + + procedure ReadNextBlock; + function GetChar(Index: integer): Char; + function GetStoredChar(Index: integer): Char; + protected + TextLength: integer; + Pos: integer; + + FSymbolLexems, FKeywordLexems: TStringList; + FClauses: TClausesArr; // lxWHERE, lxLIMIT, lxORDER etc. Must be filled on Create + FOmitKeywords: boolean; + FDesiredLexem: string; + FDesiredLexemFound: boolean; + FLexem: string; + + procedure InitParser; virtual; + + function IsBlank(Ch: char): boolean; virtual; + function IsSymbol(Ch: char): boolean; virtual; + function IsAlpha(Ch: char): boolean; virtual; + function IsNumber(Ch: char): boolean; virtual; + function IsStringQuote(Ch: char): boolean; virtual; + procedure ToRightQuoteP(RightQuote: Char); virtual; + {$IFNDEF CLR} + procedure ToRightQuoteA(RightQuote: Char); virtual; + {$ENDIF} + procedure ToRightQuote(RightQuote: Char); virtual; // Search right quote of quoted string value or quoted identifier + function IsIdentQuote(Ch: char): boolean; virtual; + function IsInlineComment(Pos: integer): boolean; virtual; + function FindLexemIndex(const LexemPos, LexemLength: integer; Lexems: TStringList): integer; + function InternalGetNext: integer; + + function CopyText(const Pos, Count: integer): string; + procedure AddToLexemArray(Index: integer; const Len: integer); + + property Text[Index: integer]: Char read GetChar; + property AlternativeQuoting: boolean read FAlternativeQuoting write FAlternativeQuoting; + + public + CommentBegin: string; + CommentEnd: string; + DecSeparator: string; + + constructor Create(const Text: string); overload; virtual; + constructor Create(const Stream: TStream); overload; virtual; + destructor Destroy; override; + + procedure SetText(const Text: string); + + procedure ToBegin; virtual; + procedure Back; + function GetNext(out Lexem: string): integer; virtual; + function GetNextCode: integer; + + function ToLexem(const Code: integer): integer; overload; + function ToLexem(const Lexem: string): boolean; overload; + //function ToSymbol(const Symbol: Char): integer; + function IsClauseLexem(Code: integer): boolean; // Is SELECT statement clause + function PosClauseLexem(Code: integer): integer; // Code position in list of SELECT statement clauses. -1 if not found + function IsMacroAllowed(Code: integer): boolean; virtual; + function IsNumericMacroNameAllowed: boolean; virtual; + function IsSemicolon(Code: integer): boolean; virtual; + + function CurrPos: integer; + function PrevPos: integer; + function PrevPrevPos: integer; + function CurrLine: integer; + function PrevLine: integer; + function CurrCol: integer; + function PrevCol: integer; + + property OmitBlank: boolean read FOmitBlank write FOmitBlank; + property OmitComment: boolean read FOmitComment write FOmitComment; + property Uppered: boolean read FUppered write FUppered; + property QuotedString: boolean read FQuotedString write FQuotedString; + property AdvancedStringParsing: boolean read FAdvancedStringParsing write FAdvancedStringParsing; + + property SymbolLexems: TStringList read FSymbolLexems; + property KeywordLexems: TStringList read FKeywordLexems; + end; + + function CRCmpStrings(List: TStringList; Index1, Index2: Integer): Integer; +{$IFNDEF VER7P} +function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; +{$ENDIF} + +implementation +uses +{$IFDEF VER7P} + StrUtils, +{$ENDIF} +{$IFDEF PERF_COUNTER} + Debug, +{$ENDIF} +{$IFDEF CLR} + System.Text, +{$ELSE} + CLRClasses, +{$ENDIF} + SysUtils, MemUtils; + +var + CommonSymbolLexems, CommonKeywordLexems: TStringList; + +{ TParser } + +constructor TParser.Create(const Text: string); +begin + inherited Create; + + Self.FCurrentBlock := Text; + TextLength := Length(Text); + FBlockSize := TextLength; + + InitParser; +end; + +constructor TParser.Create(const Stream: TStream); +begin + inherited Create; + + FStoredBlocks := TStringList.Create; + FStream := Stream; + TextLength := Stream.Size; + + InitParser; +end; + +destructor TParser.Destroy; +begin + FStoredBlocks.Free; + + inherited; +end; + +procedure TParser.InitParser; +begin + FSymbolLexems := CommonSymbolLexems; + FKeywordLexems := CommonKeywordLexems; + CommentBegin := '/*'; + CommentEnd := '*/'; + DecSeparator := DecimalSeparator; + + FOmitBlank := True; + FUppered := True; + FQuotedString := False; + ToBegin; +end; + + +procedure TParser.SetText(const Text: string); +begin + Self.FCurrentBlock := Text; + TextLength := Length(Text); + FBlockSize := TextLength; + + ToBegin; +end; + +function TParser.IsBlank(Ch: char): boolean; +begin + Result := False; + case Ch of + #9, #10, #13, #32: + Result := True; + end; +end; + +function TParser.IsSymbol(Ch: char): boolean; +begin + Result := False; + case Ch of + '!'..'/', ':'..'@', '['..'^', '`', '{'..'~': + Result := True; + end; +end; + +function TParser.IsAlpha(Ch: char): boolean; +begin + Result := False; + case Ch of + 'A'..'Z', 'a'..'z', #128..#255: + Result := True; + end; +end; + +function TParser.IsNumber(Ch: char): boolean; +begin + Result := False; + case Ch of + '0'..'9': + Result := True; + end; +end; + +function TParser.IsStringQuote(Ch: char): boolean; +begin + Result := False; + case Ch of + '''', '"': + Result := True; + end; +end; + +procedure TParser.ToRightQuote(RightQuote: Char); +begin + if FAdvancedStringParsing or (FStream <> nil) then + ToRightQuoteP(RightQuote) + else +{$IFDEF CLR} + while (Pos <= TextLength) and (Text[Pos] <> RightQuote) do + Inc(Pos); +{$ELSE} + ToRightQuoteA(RightQuote); +{$ENDIF} +end; + +procedure TParser.ToRightQuoteP(RightQuote: Char); +var + c: Char; +begin + while (Pos <= TextLength) do begin + c := Text[Pos]; + if (c = #13) or (c = #10) then begin + if (Pos < TextLength) and (Text[Pos + 1] = #10) then + inc(Pos); + Inc(FCurrLine); + FCurrBegLine := Pos + 1; + end + else + if c = RightQuote then + Break; + inc(Pos); + end; +end; + +{$IFNDEF CLR} +procedure TParser.ToRightQuoteA(RightQuote: Char); +var + i: integer; +begin + i := TextLength - Pos + 1 {Pos is counted from 1} + 1 {#0}; + asm + PUSHAD + + MOV EAX, Self + MOV EDI, EAX + + ADD EAX, Pos + MOV EAX, [EAX] // EAX := Pos + + ADD EDI, FCurrentBlock + MOV EDI, [EDI] + ADD EDI, EAX + DEC EDI // EDI := PChar(Text) + Pos {Pos is counted from 1}; + + MOV ECX, i + MOV AL, RightQuote + REPNE SCASB + MOV i, ECX + POPAD + end; + Pos := TextLength - i + 1; +end; +{$ENDIF} + +function TParser.IsIdentQuote(Ch: char): boolean; +begin + Result := False; +end; + +function TParser.IsInlineComment(Pos: integer): boolean; +begin + Result := (TextLength >= Pos + 2) and (Text[Pos] = '/') and (Text[Pos + 1] = '/'); +end; + +function TParser.IsMacroAllowed(Code: integer): boolean; +begin + Result := Code <> lcString; +end; + +function TParser.IsNumericMacroNameAllowed: boolean; +begin + Result := False; +end; + +function TParser.IsSemicolon(Code: integer): boolean; +begin + Result := False; +end; + +function TParser.FindLexemIndex(const LexemPos, LexemLength: integer; Lexems: TStringList): integer; + function CompareWithLexem(const S: string): integer; + var + i, l, ls: integer; + Ch: Char; + begin + Result := 0; + ls := Length(S); + if ls > LexemLength then + l := LexemLength + else + l := ls; + + for i := 1 to l do begin + Ch := Text[LexemPos + i - 1]; + if (Ch >= 'a') and (Ch <= 'z') then Dec(Ch, 32); + Result := integer(S[i]) - integer(Ch); + if Result <> 0 then + Exit; + end; + + if ls > LexemLength then + Result := 1 + else + if ls < LexemLength then + Result := -1; + end; + + +var + L, H, I, C: integer; +begin +{$IFDEF PERF_COUNTER} + PerfCounters[9].Start; +{$ENDIF} + Result := -1; + L := 0; + H := Lexems.Count - 1; + while L <= H do + begin + I := (L + H) shr 1; + C := CompareWithLexem(Lexems[I]); + + if C < 0 then + L := I + 1 + else begin + H := I - 1; + if C = 0 then + Result := I; + end; + end; + +{$IFDEF PERF_COUNTER} + PerfCounters[9].Stop; +{$ENDIF} +end; + +procedure TParser.ToBegin; +begin + Pos := 1; + OldPos := Pos; + OldOldPos := OldPos; + FCurrLine := 0; + FPrevLine := 0; + FCurrBegLine := Pos; + FPrevBegLine := Pos; + + FFirstBlockOffset := 1; + FBlockOffset := 1; +end; + +procedure TParser.Back; +begin + Pos := OldPos; +end; + +{$IFNDEF VER7P} +{ PosEx searches for SubStr in S and returns the index position of + SubStr if found and 0 otherwise. If Offset is not given then the result is + the same as calling Pos. If Offset is specified and > 1 then the search + starts at position Offset within S. If Offset is larger than Length(S) + then PosEx returns 0. By default, Offset equals 1. } + +function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; +var + I,X: Integer; + Len, LenSubStr: Integer; +begin + if Offset = 1 then + Result := Pos(SubStr, S) + else + begin + I := Offset; + LenSubStr := Length(SubStr); + Len := Length(S) - LenSubStr + 1; + while I <= Len do + begin + if S[I] = SubStr[1] then + begin + X := 1; + while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do + Inc(X); + if (X = LenSubStr) then + begin + Result := I; + exit; + end; + end; + Inc(I); + end; + Result := 0; + end; +end; +{$ENDIF} + +function TParser.InternalGetNext: integer; + function IsCommentBegin: boolean; + var + i, l: integer; + begin + l := Length(CommentBegin); + Result := Pos <= TextLength - l + 1; + if not Result then + Exit; + + for i := 1 to l do + if Text[Pos + i - 1] <> CommentBegin[i] then begin + Result := False; + Exit; + end; + end; + +var + j, CommentLen: integer; + IsComment: boolean; + Quote: Char; + c: Char; + DL: boolean; + i: integer; + St, StLength: integer; + SymbolPos: integer; + QuoteDelimiter: char; + QuoteDelimiterFound: boolean; +begin + DL := FDesiredLexem <> ''; + OldOldPos := OldPos; + OldPos := Pos; + FPrevLine := FCurrLine; + FPrevBegLine := FCurrBegLine; + + FSavedPos := -1; + FLexemPos := -1; + FLexemLength := 0; + + repeat + if Pos > TextLength then begin + Result := lcEnd; + Exit; + c := #0; // To Prevent compiler warning + end + else + if FStream = nil then // Performance optimization + c := FCurrentBlock[Pos] + else + c := Text[Pos]; + + // Blanks + while IsBlank(c) do begin + AddToLexemArray(Pos, 1); + if (c = #13) or (c = #10) then begin + if (c = #13) and (Text[Pos + 1] = #10) then begin + Inc(Pos); /// CR-M12015 + AddToLexemArray(Pos, 1); + end; + Inc(FCurrLine); + FCurrBegLine := Pos + 1; + end; + Inc(Pos); + c := Text[Pos]; + end; + + if not OmitBlank and (FLexemLength <> 0) then begin + Result := lcBlank; + Exit; + end; + + // End + if Pos > TextLength then begin + Result := lcEnd; + Exit; + end; + + // Comment + IsComment := False; + if IsInlineComment(Pos) then begin + IsComment := True; + FSavedPos := Pos; + while not((Pos > TextLength) or (c = #13) or (c = #10)) do begin + Inc(Pos); + c := Text[Pos]; + end; + // optimize expression StrLexem := StrLexem + Copy(Buf, 1, Pos - Buf); + AddToLexemArray(FSavedPos, Pos - FSavedPos); + end; + + if IsCommentBegin then begin + IsComment := True; + if Pos <= TextLength then begin + FSavedPos := Pos; + while Pos <= TextLength do begin + if (c = #13) or (c = #10) then begin + if (Pos < TextLength) and (Text[Pos + 1] = #10) then begin + inc(Pos); + end; + Inc(FCurrLine); + FCurrBegLine := Pos + 1; + end + else begin + j := 0; + CommentLen := Length(CommentEnd); + while (j < CommentLen) and (Text[Pos + j] = CommentEnd[j + 1]) do + inc(j); + if j = CommentLen then begin + Inc(Pos, CommentLen); + Break; + end; + end; + inc(Pos); + c := Text[Pos]; + end; + // optimize expression StrLexem := StrLexem + Copy(Buf, 1, Pos - Buf); + AddToLexemArray(FSavedPos, Pos - FSavedPos); + end; + end; + + if not OmitComment and IsComment then begin + Result := lcComment; + Exit; + end; + until not IsComment; + + FLexemPos := -1; + FLexemLength := 0; + if IsSymbol(c) then + if IsStringQuote(c) then begin + Result := lcString; + Quote := c; + if FQuotedString then + AddToLexemArray(Pos, 1); + Inc(Pos); + FSavedPos := Pos; + ToRightQuote(Quote); + // optimize expression StrLexem := StrLexem + Copy(Buf, 1, Pos - Buf); + if Pos > FSavedPos then + AddToLexemArray(FSavedPos, Pos - FSavedPos); + if Pos <= TextLength then begin + if FQuotedString then + AddToLexemArray(Pos, 1); + Inc(Pos); + end; + end + else + if IsIdentQuote(c) then begin + Result := lcIdent; + Quote := c; + AddToLexemArray(Pos, 1); + Inc(Pos); + FSavedPos := Pos; + ToRightQuote(Quote); + if Pos > FSavedPos then + AddToLexemArray(FSavedPos, Pos - FSavedPos); + if Pos <= TextLength then begin + AddToLexemArray(Pos, 1); + Inc(Pos); + end; + end + else begin + Result := lcSymbol; + SymbolPos := Pos + 1; // WAR + FLexemPos := Pos; + FLexemLength := 0; + St := Pos; + StLength := 1; + + repeat + AddToLexemArray(Pos, 1); + Inc(Pos); + c := Text[Pos]; + // Find + i := FindLexemIndex(FLexemPos, FLexemLength, FSymbolLexems); + if i <> - 1 then begin + FLexem := FSymbolLexems[i]; + + SymbolPos := Pos; + Result := integer(FSymbolLexems.Objects[i]); + Assert(Result > 0); + end + else + Dec(FLexemLength); + until not IsSymbol(c); + + if Result = lcSymbol then begin + FLexemPos := St; + FLexemLength := StLength; + if DL then begin + Assert(Length(FDesiredLexem) <= 1); + FDesiredLexemFound := (FDesiredLexem[1] = Text[FLexemPos]); + end; + end + else + if DL then + FDesiredLexemFound := (FDesiredLexem = FLexem); + + Pos := SymbolPos; + end + else + if IsAlpha(c) or (c = '_') then begin + Result := lcIdent; + FSavedPos := Pos; + QuoteDelimiter := c; + repeat + if DL then begin + if (c >= 'a') and (c <= 'z') then + Dec(c, 32); + DL := (Pos - FSavedPos + 1 <= Length(FDesiredLexem)) and (FDesiredLexem[Pos - FSavedPos + 1] = c); + end; + + Inc(Pos); + c := Text[Pos]; + until not IsAlpha(c) and not IsNumber(c) and (c <> '_'); + + if FAlternativeQuoting and (Pos - FSavedPos = 1) and + ((QuoteDelimiter = 'q') or (QuoteDelimiter = 'Q')) and IsStringQuote(c) + then begin + Result := lcString; + Quote := c; + Inc(Pos); + if Pos <= TextLength then begin + QuoteDelimiter := Text[Pos]; + case QuoteDelimiter of + '[': QuoteDelimiter := ']'; + '{': QuoteDelimiter := '}'; + '<': QuoteDelimiter := '>'; + '(': QuoteDelimiter := ')'; + end; + QuoteDelimiterFound := False; + Inc(Pos); + while Pos <= TextLength do begin + c := Text[Pos]; + Inc(Pos); + + if QuoteDelimiterFound and (c = Quote) then + break; + + QuoteDelimiterFound := (c = QuoteDelimiter); + end; + end; + if FQuotedString then + AddToLexemArray(FSavedPos, Pos - FSavedPos) + else + if Pos - FSavedPos > 5 then + AddToLexemArray(FSavedPos + 3, Pos - FSavedPos - 5) + end + else begin + FDesiredLexemFound := DL; + AddToLexemArray(FSavedPos, Pos - FSavedPos); + end; + end + else + if IsNumber(c) then begin + Result := lcNumber; + SymbolPos := Pos; + repeat + AddToLexemArray(Pos, 1); + if DL then + DL := (Pos - SymbolPos + 1 <= Length(FDesiredLexem)) and (FDesiredLexem[Pos - SymbolPos + 1] = c); + + Inc(Pos); + c := Text[Pos]; + until not IsNumber(c); + FDesiredLexemFound := DL; + if (c = DecSeparator) and (Pos + 1 <= TextLength) and IsNumber(Text[Pos + 1]) then begin + AddToLexemArray(Pos, 1); + Inc(Pos); + c := Text[Pos]; + while IsNumber(c) do begin + AddToLexemArray(Pos, 1); + Inc(Pos); + c := Text[Pos]; + end; + end; + end + else + raise Exception.Create('Parser: The unknown symbol ''' + Text[Pos] + ''' $' + IntToHex(Word(Text[Pos]), 4)); + + Assert(Result <> - MaxInt); +end; + +function TParser.GetNext(out Lexem: string): integer; +var + i: integer; +begin +{$IFDEF PERF_COUNTER} + PerfCounters[2].Start;//} + try +{$ENDIF} + Result := InternalGetNext; // Result is not in KeywordLexems + if Result > 0 then begin + Assert(FLexem <> ''); + Lexem := FLexem + end + else begin + if FLexemLength = 0 then + Lexem := '' + else + begin + Assert(FLexemPos > 0); + Lexem := CopyText(FLexemPos, FLexemLength); + end; + end; + + if not FOmitKeywords and (Result = lcIdent) then begin + Assert(FLexemPos > 0); + Assert(FLexemLength > 0); + i := FindLexemIndex(FLexemPos, FLexemLength, FKeywordLexems); + if i <> -1 then begin + Result := integer(FKeywordLexems.Objects[i]); + Assert(Result > 0); + if Uppered then + Lexem := AnsiUpperCase(Lexem); //WAR problem with macros as key words + end; + end; + + Assert(Result <> - MaxInt); +{$IFDEF PERF_COUNTER} + finally + PerfCounters[2].Stop; + end; +{$ENDIF} +end; + +function TParser.GetNextCode: integer; +var + St: string; +begin + Result := GetNext(St); +end; + +function TParser.ToLexem(const Code: integer): integer; +var + St: string; +begin + repeat + Result := GetNext(St); + until (Result = Code) or (Result = lcEnd); +end; + +function TParser.ToLexem(const Lexem: string): boolean; +begin + try + FDesiredLexem := UpperCase(Lexem); + FDesiredLexemFound := False; + + while (InternalGetNext <> lcEnd) and not FDesiredLexemFound do; + + Result := FDesiredLexemFound; + finally + FDesiredLexem := ''; + FDesiredLexemFound := False; + end; +end; + +{function TParser.ToSymbol(const Symbol: Char): integer; +var + St: string; +begin + FOmitKeywords := True; + try + repeat + Result := GetNext(St); + until (Result = lcEnd) or ((Length(St) = 1) and (St[1] = Symbol)); + finally + FOmitKeywords := False; + end; +end;} + +function TParser.IsClauseLexem(Code: integer): boolean; +begin + Result := PosClauseLexem(Code) <> -1; +end; + +function TParser.PosClauseLexem(Code: integer): integer; +var + i: integer; +begin + Assert(Length(FClauses) > 0); + Result := -1; + for i := Low(FClauses) to High(FClauses) do + if Code = FClauses[i] then begin + Result := i; + Exit; + end; +end; + +function TParser.CurrPos: integer; +begin + Result := Pos - 1; +end; + +function TParser.PrevPos: integer; +begin + Result := OldPos - 1; +end; + +function TParser.PrevPrevPos: integer; +begin + Result := OldOldPos - 1; +end; + +function TParser.CurrLine: integer; +begin + Result := FCurrLine; +end; + +function TParser.PrevLine: integer; +begin + Result := FPrevLine; +end; + +function TParser.CurrCol: integer; +begin + Result := Pos - FCurrBegLine; +end; + +function TParser.PrevCol: integer; +begin + Result := OldPos - FPrevBegLine; +end; + +function CRCmpStrings(List: TStringList; Index1, Index2: Integer): Integer; +begin +{$IFDEF CLR} + Result := System.String.CompareOrdinal(List[Index1], List[Index2]); +{$ELSE} + Result := CompareStr(List[Index1], + List[Index2]); +{$ENDIF} +end; + +procedure TParser.ReadNextBlock; +var + i: integer; + UsedBlocks: integer; + SavedPos: integer; +{$IFDEF CLR} + Buffer: TBytes; +{$ENDIF} +begin + if (FSavedPos > -1) and ((FSavedPos < FLexemPos) or (FLexemPos = -1)) then + SavedPos := FSavedPos + else + SavedPos := FLexemPos; + + if ((SavedPos > Pos) or (SavedPos = -1)) and not (FCurrentBlock = '') then + SavedPos := Pos; + + UsedBlocks := FStoredBlocks.Count; + for i := 0 to FStoredBlocks.Count - 1 do + if (SavedPos >= FFirstBlockOffset + i * BlockSize) or (SavedPos = -1) then + Dec(UsedBlocks); + + while FStoredBlocks.Count > UsedBlocks do + FStoredBlocks.Delete(0); + + if ((SavedPos > -1) and (SavedPos < FBlockOffset + BlockSize)) then + FStoredBlocks.Add(FCurrentBlock); + + if FCurrentBlock = '' then + SetLength(FCurrentBlock, BlockSize); + + if FStoredBlocks.Count = 0 then + FFirstBlockOffset := FStream.Position + 1 + else + if FStoredBlocks.Count = 1 then + FFirstBlockOffset := FBlockOffset; + + FBlockOffset := FStream.Position + 1; + +{$IFDEF CLR} + SetLength(Buffer, BlockSize); + FBlockSize := FStream.Read(Buffer, BlockSize); + FCurrentBlock := Encoding.Default.GetString(Buffer, 0, FBlockSize); +{$ELSE} + FBlockSize := FStream.Read(FCurrentBlock[1], BlockSize); +{$ENDIF} +end; + +function TParser.GetStoredChar(Index: integer): Char; +begin + if Index >= FFirstBlockOffset then + Result := FStoredBlocks[(Index - FFirstBlockOffset) div BlockSize][(Index - FFirstBlockOffset) mod BlockSize + 1] + else begin + Result := #0; + Assert(False); + end; +end; + +function TParser.GetChar(Index: integer): Char; +begin + if Index > TextLength then + Result := #0 + else begin + if Index >= FBlockOffset + FBlockSize then + ReadNextBlock; + + if Index >= FBlockOffset then + Result := FCurrentBlock[Index - FBlockOffset + 1] + else + Result := GetStoredChar(Index); + end; +end; + +procedure TParser.AddToLexemArray(Index: integer; const Len: integer); +begin + FSavedPos := -1; + if FLexemPos = -1 then + FLexemPos := Index; + Inc(FLexemLength, Len); +end; + +function TParser.CopyText(const Pos, Count: integer): string; +var + sb: StringBuilder; + i: integer; +begin + if Pos < FBlockOffset then begin + sb := StringBuilder.Create(Count); + try + for i := 0 to FStoredBlocks.Count - 1 do + if i = 0 then + sb.Append(Copy(FStoredBlocks[i], Pos - FFirstBlockOffset + 1, Count)) + else + sb.Append(FStoredBlocks[i]); + + sb.Append(Copy(FCurrentBlock, 1, Count - FBlockOffset + Pos)); + Result := sb.ToString; + finally + sb.Free; + end; + end + else + Result := Copy(FCurrentBlock, FLexemPos - FBlockOffset + 1, FLexemLength); +end; + +initialization + CommonSymbolLexems := TStringList.Create; + CommonKeywordLexems := TStringList.Create; + + CommonSymbolLexems.AddObject('!', TObject(integer(1))); + CommonSymbolLexems.AddObject('"', TObject(integer(2))); + CommonSymbolLexems.AddObject('#', TObject(integer(3))); + CommonSymbolLexems.AddObject('$', TObject(integer(4))); + CommonSymbolLexems.AddObject('%', TObject(integer(5))); + CommonSymbolLexems.AddObject('&', TObject(integer(6))); + CommonSymbolLexems.AddObject('''', TObject(integer(7))); + CommonSymbolLexems.AddObject('(', TObject(integer(8))); + CommonSymbolLexems.AddObject(')', TObject(integer(9))); + CommonSymbolLexems.AddObject('*', TObject(integer(10))); + CommonSymbolLexems.AddObject('+', TObject(integer(11))); + CommonSymbolLexems.AddObject(',', TObject(integer(12))); + CommonSymbolLexems.AddObject('-', TObject(integer(13))); + CommonSymbolLexems.AddObject('.', TObject(integer(14))); + CommonSymbolLexems.AddObject('/', TObject(integer(15))); + CommonSymbolLexems.AddObject(':', TObject(integer(16))); + CommonSymbolLexems.AddObject(';', TObject(integer(17))); + CommonSymbolLexems.AddObject('<', TObject(integer(18))); + CommonSymbolLexems.AddObject('=', TObject(integer(19))); + CommonSymbolLexems.AddObject('>', TObject(integer(20))); + CommonSymbolLexems.AddObject('?', TObject(integer(21))); + CommonSymbolLexems.AddObject('@', TObject(integer(22))); + CommonSymbolLexems.AddObject('[', TObject(integer(23))); + CommonSymbolLexems.AddObject('\', TObject(integer(24))); + CommonSymbolLexems.AddObject(']', TObject(integer(25))); + CommonSymbolLexems.AddObject('^', TObject(integer(26))); + CommonSymbolLexems.AddObject('_', TObject(integer(27))); + CommonSymbolLexems.AddObject('`', TObject(integer(28))); + CommonSymbolLexems.CustomSort(CRCmpStrings); + + CommonKeywordLexems.AddObject('AND', TObject(integer(29))); + CommonKeywordLexems.AddObject('NOT', TObject(integer(30))); + CommonKeywordLexems.AddObject('OR', TObject(integer(31))); + CommonKeywordLexems.CustomSort(CRCmpStrings); + +{$IFDEF PERF_COUNTER} + PerfCounters[2].Name := 'Parser.Next'; + PerfCounters[8].Name := 'Parser.Code'; + PerfCounters[9].Name := 'Parser.FindLexemIndex'; +{$ENDIF} + +finalization + CommonSymbolLexems.Free; + CommonKeywordLexems.Free; + +end. diff --git a/internal/4.10.0.10/1/Source/CRThread.pas b/internal/4.10.0.10/1/Source/CRThread.pas new file mode 100644 index 0000000..ab46ed6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CRThread.pas @@ -0,0 +1,371 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CRThread; +{$ENDIF} +interface +uses + Classes, SysUtils, SyncObjs, +{$IFDEF LINUX} +{$ELSE} + Windows, +{$ENDIF} +{$IFDEF CLR} + System.Runtime.InteropServices; +{$ELSE} + CLRClasses; +{$ENDIF} + +type + TCRThread = class; + TCRThreadWrapper = class; + + TCRThreadTerminateEvent = procedure(Sender: TObject) of object; + TCRThreadExceptionEvent = procedure(Sender: TObject; E: Exception; var Fail: boolean) of object; + TCRThreadEvent = procedure(Sender: TObject; Event: TObject) of object; + TCRThreadClass = class of TCRThread; + + TCRThread = class(TThread) + protected + FOwner: TCRThreadWrapper; + FStartEvent: TEvent; + + procedure InternalExecute; virtual; + procedure Execute; override; + public + procedure PostEvent(Event: TObject); + procedure SendEvent(Event: TObject); + + constructor Create(Owner: TCRThreadWrapper); virtual; + destructor Destroy; override; + end; + + TCRThreadWrapper = class + protected + FTimerID: UInt; + FThread: TCRThread; + + FOnPostEvent: TCRThreadEvent; + FOnSendEvent: TCRThreadEvent; + FOnException: TCRThreadExceptionEvent; + FOnTerminate: TCRThreadTerminateEvent; + + FEvents: TThreadList; + FException: Exception; + FTerminated: boolean; + FFreeOnTerminate: boolean; + FDoTimerProcessing, FLockDestroy: boolean; + FDestroyAfterTimer: boolean; + FSendEvent: TObject; + FSendEventProcessed: TEvent; + + procedure SetTimer; + procedure KillTimer; + procedure DoTimer; + + procedure DoPostEvent(Event: TObject); virtual; // In FThread context + procedure DoSendEvent(Event: TObject); virtual; // In FThread context + + procedure DoException(E: Exception); virtual; // In FThread context + procedure DoTerminate; // In FThread context + + public + constructor Create(ThreadClass: TCRThreadClass; CreateSuspended: Boolean); + destructor Destroy; override; + + procedure Resume; + procedure Suspend; + procedure Terminate; + + property Thread: TCRThread read FThread; + property FreeOnTerminate: boolean read FFreeOnTerminate write FFreeOnTerminate; + property Terminated: boolean read FTerminated; + + property OnPostEvent: TCRThreadEvent read FOnPostEvent write FOnPostEvent; + property OnSendEvent: TCRThreadEvent read FOnSendEvent write FOnSendEvent; + property OnException: TCRThreadExceptionEvent read FOnException write FOnException; + property OnTerminate: TCRThreadTerminateEvent read FOnTerminate write FOnTerminate; + end; + +implementation + +uses + MemData{$IFDEF VER6P}, StrUtils{$ENDIF}; + +var + ThreadList: TThreadList; + +{ TCRThread } + +constructor TCRThread.Create(Owner: TCRThreadWrapper); +begin + inherited Create(True); + Assert(Owner <> nil); + FOwner := Owner; + FStartEvent := TEvent.Create(nil, True, False, ''); +end; + +destructor TCRThread.Destroy; +begin + inherited; + FStartEvent.Free; +end; + +procedure TCRThread.InternalExecute; +begin + // Empty +end; + +procedure TCRThread.Execute; +begin + try + FStartEvent.SetEvent; + InternalExecute; + except + on E: Exception do + if not (E is EAbort) then + FOwner.DoException(E); + end; + FOwner.DoTerminate; +end; + +procedure TCRThread.PostEvent(Event: TObject); +begin + FOwner.DoPostEvent(Event); +end; + +procedure TCRThread.SendEvent(Event: TObject); +begin + if not Terminated then + FOwner.DoSendEvent(Event); +end; + +{ TCRThreadWrapper } + +procedure TimerCallBack(hWnd: HWND; Message: UInt; +{$IFDEF CLR} + {$IFDEF VER11P} + TimerID: UINT_PTR; + {$ELSE} + TimerID: UInt; + {$ENDIF} +{$ELSE} + TimerID: UInt; +{$ENDIF} + SysTime: DWORD); {$IFNDEF CLR} stdcall; {$ENDIF} +var + List: TList; + p: TCRThreadWrapper; + ThreadWrapper: TCRThreadWrapper; + i: integer; +begin + List := ThreadList.LockList; + try + ThreadWrapper := nil; + for i := 0 to List.Count - 1 do begin + p := TCRThreadWrapper(List[i]); + if TCRThreadWrapper(p).FTimerID = TimerID then begin + ThreadWrapper := TCRThreadWrapper(p); + Break; + end; + end; + finally + ThreadList.UnlockList; + end; + + if ThreadWrapper <> nil then + ThreadWrapper.DoTimer; + end; + +constructor TCRThreadWrapper.Create(ThreadClass: TCRThreadClass; CreateSuspended: Boolean); +begin + inherited Create; + + FEvents := TThreadList.Create; + FSendEventProcessed := TEvent.Create(nil, True, False, ''); + + SetTimer; + ThreadList.Add(Self); + + FThread := ThreadClass.Create(Self); + if not CreateSuspended then + FThread.Resume; +end; + +destructor TCRThreadWrapper.Destroy; +begin + if FLockDestroy then + Exit; + + if FDoTimerProcessing then begin + FDestroyAfterTimer := True; + Exit; + end; + + if not FFreeOnTerminate then begin + FLockDestroy := True; + Terminate; + end; + FThread.Free; + FEvents.Free; + + if FTimerID <> 0 then + KillTimer; + ThreadList.Remove(Self); + + inherited; + FSendEventProcessed.Free; +end; + +procedure TCRThreadWrapper.Resume; +begin + Thread.Resume; +end; + +procedure TCRThreadWrapper.Suspend; +begin + Thread.Suspend; +end; + +procedure TCRThreadWrapper.Terminate; +begin + WaitForSingleObject(Thread.FStartEvent.Handle, INFINITE); + Thread.Terminate; + FSendEventProcessed.SetEvent; +{$IFNDEF CLR} + WaitForSingleObject(Thread.Handle, INFINITE); +{$ELSE} + Thread.WaitFor; +{$ENDIF} + DoTimer; +end; + +procedure TCRThreadWrapper.DoPostEvent(Event: TObject); // In FThread context +begin + Assert(FEvents <> nil); + FEvents.Add(Event); +end; + +procedure TCRThreadWrapper.DoSendEvent(Event: TObject); // In FThread context +begin + FSendEvent := Event; + WaitForSingleObject(FSendEventProcessed.Handle, INFINITE); + FSendEventProcessed.ResetEvent; +end; + +procedure TCRThreadWrapper.DoException(E: Exception); // In FThread context +begin + Assert(FException = nil); + FException := Exception.Create(E.Message); +end; + +procedure TCRThreadWrapper.DoTerminate; // In FThread context +begin + Assert(not FTerminated); + FTerminated := True; +end; + +procedure TCRThreadWrapper.SetTimer; +const + USER_TIMER_MINIMUM = $A; +var + TimerFunc: TFNTimerProc; +begin + Assert(FTimerID = 0); + TimerFunc := {$IFNDEF CLR}@{$ENDIF}TimerCallBack; + FTimerID := Windows.SetTimer(0, 0, USER_TIMER_MINIMUM, TimerFunc); + Win32Check(FTimerID <> 0); +end; + +procedure TCRThreadWrapper.KillTimer; +begin + Assert(FTimerID <> 0); + Windows.KillTimer(0, FTimerID); + FTimerID := 0; +end; + +procedure TCRThreadWrapper.DoTimer; // In main thread context +var + Fail: boolean; + List: TList; + FreeThread: boolean; +begin + if FDoTimerProcessing then + Exit; // For example - on showing error message + FDoTimerProcessing := True; + + KillTimer; // To prevent multiple calls to DoTimer if any event handler call ProcessMessage + try + if (FSendEvent <> nil) then begin + if Assigned(FOnSendEvent) then + FOnSendEvent(Self, FSendEvent); + FSendEvent := nil; + FSendEventProcessed.SetEvent; + end; + + if FEvents <> nil then begin + List := FEvents.LockList; + try + while List.Count > 0 do begin + try + if Assigned(FOnPostEvent) then + FOnPostEvent(Self, TObject(List[0])); + finally + List.Delete(0); + end; + end; + finally + FEvents.UnlockList; + end; + end; + + if FException <> nil then begin + try + Fail := True; + if Assigned(FOnException) then + FOnException(Self, FException, Fail); + if Fail then begin + try + raise FException; + except + if Assigned(ApplicationHandleException) then + ApplicationHandleException(FException) + else + ShowException(FException, ExceptAddr); + end; + end + else + FException.Free; + finally + FException := nil; + end; + end; + + if FTerminated and Assigned(FOnTerminate) then + FOnTerminate(Self); + finally + FDoTimerProcessing := False; + FreeThread := (FTerminated and FFreeOnTerminate) or FDestroyAfterTimer; + if FreeThread then + Free + else begin + FTerminated := False; + SetTimer; + end; + end; +end; + +initialization + ThreadList := TThreadList.Create; + +finalization + ThreadList.Free; + +end. diff --git a/internal/4.10.0.10/1/Source/CRXml.pas b/internal/4.10.0.10/1/Source/CRXml.pas new file mode 100644 index 0000000..47c2a29 --- /dev/null +++ b/internal/4.10.0.10/1/Source/CRXml.pas @@ -0,0 +1,1018 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// CRXml +////////////////////////////////////////////////// + +unit CRXml; + +interface + +{$I Dac.inc} +uses + Classes, SysUtils, Contnrs, CLRClasses; + +type + + TChars = array of char; + + TextReader = class + end; + + StreamReader = class(TextReader) + private + FReader: TStream; + FCapacity: Integer; + FReleaseReader: Boolean; + function Eof: Boolean; + public + constructor Create(const path: string; detectEncodingFromByteOrderMarks: Boolean); overload; + constructor Create(input: TStream); overload; + destructor Destroy; override; + procedure Close; + function Read(buffer: TChars; Index, Count: Integer):Integer; + function ReadLine:string; + function ReadToEnd:string; + + property BaseStream: TStream read FReader; + end; + + StringReader = class(TextReader) + private + FText: string; + public + constructor Create(Text: string); + end; + + StreamWriter = class + private + FWriter: TStream; + FReleaseWriter: Boolean; + FEncodingClass: EncodingClass; + public + constructor Create(const path: string; Append: Boolean); overload; + constructor Create(output: TStream; Encoding: EncodingClass); overload; + destructor Destroy; override; + + procedure Close; + procedure Flush; + procedure Write(value: string); + procedure WriteLine(const value: string); + end; + + XmlException = class(Exception); + + XmlNodeType = (ntNone, ntElement, ntAttribute, ntEndElement, ntComment, ntDeclaration, ntDocumentType, ntText); + XmlReadState = (Initial, Interactive, Error, EndOfFile, Closed); + + XmlTextReader = class + private + FText: string; + FTextlc: string; + FPrefix: string; + FValue: string; + FName: string; + FNodeType: XmlNodeType; + FAttrNames: TStringList; + FAttrPrefix: TStringList; + FAttrValues: TStringList; + FOffset: Integer; + FTextLen: Integer; + FState: XmlReadState; + FCurrElementName: string; + FReader: StreamReader; + FEof: Boolean; + function GetHasAttributes: Boolean; + function GetDepth: integer; + function GetAttributeCount: integer; + procedure GetXMLNodeAttributes(const Node: string; AttrNames: TStrings; + AttrValues: TStrings); + procedure ReadFromStream; + procedure InitInstance; + function GetEof:Boolean; + protected + function ScanLine(Lexem: array of string; Offset: Integer = -1):Boolean; + public + constructor Create(Reader: TextReader); + destructor Destroy; override; + + procedure MoveToAttribute(i: integer); overload; + function MoveToAttribute(name: string):Boolean; overload; + function Read: boolean; + function MoveToElement: boolean; + function Items(const Index: Integer): string; overload; + function Items(const AttrName: string): string; overload; + + property Name: string read FName; + property Prefix: string read FPrefix; + property Value: string read FValue; + property NodeType: XmlNodeType read FNodeType; + property AttributeCount: integer read GetAttributeCount; + property Depth: integer read GetDepth; + property ReadState: XmlReadState read FState; + property Eof: Boolean read FEof; + property HasAttributes: Boolean read GetHasAttributes; + end; + + XmlFormatting = (fmtNone, fmtIndented); + XmlWriteState = (wsAttribute, wsClosed, wsContent, wsElement, wsStart); + + XmlTextWriter = class + private + FText: string; + FFormatting: XmlFormatting; + FIndentation: Integer; + FIndentChar: Char; + FQuoteChar: Char; + FWriteState: XmlWriteState; + FDepth: Integer; + FPrefix: TStringList; + FPosStack: TStack; + FTagStack: TStringList; + FWriter: StreamWriter; + function IndentStr: string; + function PopTagName: string; + procedure PushTagName(const TagName: string); + procedure InternalCloseStartTag; + protected + procedure InternalWriteStartElement(const Prefix, LocalName, ns: string); + procedure InternalWriteElementString(const LocalName, ns, Value: string); + procedure InternalWriteAttributeString(const Prefix, LocalName, ns, Value: string); + procedure InternalWriteEndElement; + procedure FlushData; + public + constructor Create(w: StreamWriter); + destructor Destroy; override; + + procedure WriteStartElement(const LocalName: string); overload; + procedure WriteStartElement(const Prefix, LocalName, ns: string); overload; + procedure WriteStartElement(const LocalName, ns: string); overload; + procedure WriteEndElement; + procedure WriteFullEndElement; + procedure WriteString(const Text: string); + procedure WriteElementString(const LocalName, ns, value: string); overload; + procedure WriteElementString(const LocalName, Value: string); overload; + + procedure WriteAttributeString(const LocalName, Value: string); overload; + procedure WriteAttributeString(const Prefix, LocalName, ns, Value: string); overload; + procedure Close; + + property Formatting: XmlFormatting read FFormatting write FFormatting; + property Indentation: Integer read FIndentation write FIndentation; + property IndentChar: Char read FIndentChar write FIndentChar; + property QuoteChar: Char read FQuoteChar write FQuoteChar; + property WriteState: XmlWriteState read FWriteState; + end; + +implementation +uses +{$IFDEF VER7P} + StrUtils, +{$ENDIF} + MemUtils, CRParser; + +const + LineSeparator = #13#10; + SInvalidXML = 'Invalid XML'; + SClassNotSupported = 'Class %s is not supported'; + + procedure DeleteInvisibleSymbol(var s: string); forward; + function XMLDecode(const AStr: String): String; forward; + function CompareLexem(const s, Substr: string; Index: Integer):Boolean; forward; + +type + TXmlParser = class(TParser) + public + constructor Create(const Text: string); override; + end; + +var + XmlSymbolLexems, XmlKeywordLexems: TStringList; + + { XmlTextReader } + +constructor XmlTextReader.Create(Reader: TextReader); +begin + inherited Create; + + + if Reader.InheritsFrom(StreamReader) then begin + FTextLen := -1; + FReader := StreamReader(Reader); + ReadFromStream; + end + else + if Reader.InheritsFrom(StringReader) then begin + FReader := nil; + FText := StringReader(Reader).FText; + FTextLen := Length(FText); + FTextlc := LowerCase(FText); + end + else + raise Exception.CreateFmt(SClassNotSupported, [Reader.ClassName]); + InitInstance; +end; + +destructor XmlTextReader.Destroy; +begin + FAttrNames.Free; + FAttrPrefix.Free; + FAttrValues.Free; + + inherited; +end; + +procedure XmlTextReader.ReadFromStream; +begin + if Assigned(FReader) then begin + if (FOffset >= FTextLen) then begin + if not FReader.Eof then begin + FText := ''; + repeat + FText := FText + ' ' + TrimRight(FReader.ReadLine); + until (Pos('>', FText) <> 0) or FReader.Eof; + FTextlc := LowerCase(FText); + FTextLen := Length(FText); + FOffset := 1; + end + else + FEof := True; + end; + end; +end; + +function XmlTextReader.MoveToElement: boolean; +begin + Result := False; +end; + +function XmlTextReader.ScanLine(Lexem: array of string; Offset: Integer = -1):Boolean; +var + i: Integer; + Str: string; +begin + ReadFromStream; + Result := False; // Make compiler happy; + if Offset <> -1 then + FOffset := Offset; + while (FOffset <= FTextLen) do begin + Result := False; + for i := Low(Lexem) to High(Lexem) do begin + Str := Copy(FTextlc, FOffset, Length(Lexem[i])); + if Str = Lexem[i] then begin + Result := True; + inc(FOffset, Length(Lexem[i])); + break; + end; + end; + if Result then + break; + inc(FOffset); + end; + + if (not Result) and (not GetEof) then + Result := ScanLine(Lexem); +end; + +function XmlTextReader.Read: boolean; +var + Node: string; + NextLexem: Integer; + OldOffset: Integer; + EndTagName: string; + ChildTag: Integer; + k: Integer; + IsTextFound: Boolean; +begin + Result := False; + ReadFromStream; + + if (FState in [Initial, Interactive]) then begin + IsTextFound := False; + if NodeType = ntElement then begin + k := FOffset; + while (FTextlc[k] <> '<') and (k <= Length(FTextlc)) do begin + if FTextlc[k] in ['a'..'z', '0'..'9', '.', ':'] then begin + IsTextFound := True; + break; + end; + inc(k); + end; + if IsTextFound then begin + FNodeType := ntText; + inc(FOffset); + end; + end; + + if not IsTextFound then begin + if not ScanLine(['<']) then begin + if Eof then + exit; + FState := Error; + XmlException.Create('Root element missing'); + end; + if FTextlc[FOffset] = '?' then + FNodeType := ntDeclaration + else if CompareLexem(FTextlc, '!--', FOffset) then + FNodeType := ntComment + else if CompareLexem(FTextlc, '!DOCTYPE', FOffset) then + FNodeType := ntDocumentType + else if FTextlc[FOffset] = '/' then begin + FNodeType := ntEndElement; + end + else if (FTextlc[FOffset-1] = '<') then + FNodeType := ntElement + else + Assert(False); + end; + FState := Interactive; + end; + + FName := ''; + FValue := ''; + FPrefix := ''; + + case FNodeType of + ntDeclaration: begin + inc(FOffset); + NextLexem := PosEx(' ', FTextlc, FOffset); + if NextLexem <> -1 then begin + FName := Trim(Copy(FText, FOffset, NextLexem-FOffset)); + inc(FOffset, NextLexem-FOffset); + end; + if ScanLine(['?>']) then + FValue := Trim(Copy(FText, NextLexem, FOffset-NextLexem-2)) + else begin + FState := Error; + raise XmlException.Create('Invalid declaration tag'); + end; + Result := True; + end; + + ntComment: begin + inc(FOffset, 3); + NextLexem := FOffset; + if ScanLine(['-->']) then + FValue := Trim(Copy(FText, NextLexem, FOffset - NextLexem - 3)) + else begin + FState := Error; + raise XmlException.Create('Invalid comment tag'); + end; + Result := True; + end; + + ntDocumentType: begin + inc(FOffset, 8); + NextLexem := FOffset; + if ScanLine(['[<']) then begin + FName := Trim(Copy(FText, NextLexem, FOffset - NextLexem - 2)); + NextLexem := PosEx('>]', FTextlc, FOffset); + FValue := Trim(Copy(FText, FOffset, NextLexem - FOffset)); + inc(FOffset, NextLexem - FOffset) + end + else begin + FState := Error; + raise XmlException.Create('Invalid Document type tag'); + end; + + Result := True; + end; + + ntEndElement: begin + inc(FOffset); + NextLexem := PosEx('>', FTextlc, FOffset); + FName := Trim(Copy(FText, FOffset, NextLexem - FOffset)); + FOffset := NextLexem; + Result := True; + end; + + ntElement: begin + if FTextlc[FOffset-1] = '<' then begin + NextLexem := PosEx('>', FTextlc, FOffset); + Node := Copy(FText, FOffset, NextLexem - FOffset+1); + + OldOffset := FOffset; + ScanLine([' ','>']); + FName := Trim(Copy(FText, OldOffset, FOffset - OldOffset - 1)); + Delete(Node, 1, Length(FName)); + GetXMLNodeAttributes(Node, FAttrNames, FAttrValues); + + FCurrElementName := FName; + if FName[Length(FName)] = '/'then + Delete(FName, Length(FName), 1); + + FOffset := NextLexem; + Result := True; + end; + end; + + ntText: begin + EndTagName := LowerCase(FCurrElementName); + DeleteInvisibleSymbol(EndTagName); + EndTagname := ''; + + if FCurrElementName[Length(FCurrElementName)] = '/' then + NextLexem := FOffset + Length(FCurrElementName) + else + NextLexem := PosEx(EndTagName, FTextlc, FOffset); + FValue := Trim(Copy(FText,FOffset, NextLexem - FOffset)); + ChildTag := PosEx('<', FValue); + if (ChildTag <> 0) and (not CompareLexem(FValue, '' + break; + lcIdent: begin + WithColon := False; + AttrName := Lexem; + AttrPrefix := ''; + Code := Parser.GetNext(Lexem); + if Code = lcIdent then begin + AttrName := Lexem; + Code := Parser.GetNext(Lexem); + end; + if Code in [16, 19] then begin + if Code = 16 then begin // ':' + Code := Parser.GetNext(Lexem); + if Code <> lcIdent then + raise XmlException.Create(SInvalidXML); + AttrPrefix := AttrName; + AttrName := AttrPrefix + ':' + Lexem; + Code := Parser.GetNext(Lexem); + WithColon := True; + end; + + if Code = 19 then begin // '=' + Code := Parser.GetNext(Lexem); + if (Code <> lcIdent) and (Code <> lcString) then + raise XmlException.Create(SInvalidXML); + AttrValue := XMLDecode({UTF8Decode}(Lexem)); + if WithColon and (LowerCase(AttrName) = 'name') then + AttrName := ':' + AttrName; + AttrNames.Add(AttrName); + AttrValues.Add(AttrValue); + FAttrPrefix.Add(AttrPrefix); + end; + end; + end; + end; + end; + finally + Parser.Free; + end; + Assert(AttrNames.Count = AttrValues.Count); +end; + +function XMLDecode(const AStr: String): String; +var + sb: StringBuilder; +begin + sb := StringBuilder.Create(AStr, Length(AStr)); + try + sb.Replace(''', ''''); + sb.Replace('"', '"'); + sb.Replace('<', '<'); + sb.Replace('>', '>'); + sb.Replace('&', '&'); + Result := sb.ToString; + finally + sb.Free; + end; +end; + + +function XmlTextReader.Items(const Index: Integer): string; +begin + Result := FAttrValues[Index]; +end; + +function XmlTextReader.Items(const AttrName: string): string; +begin + Result := Items(FAttrNames.IndexOf(AttrName)); +end; + +function XmlTextReader.GetAttributeCount: integer; +begin + Result := FAttrNames.Count; +end; + +procedure XmlTextReader.MoveToAttribute(i: integer); +begin + try + FName := FAttrNames[i]; + FValue := FAttrValues[i]; + FPrefix := FAttrPrefix[i]; + except + raise XmlException.Create(Format('Attribute not found (%d)', [i])); + end; +end; + +function XmlTextReader.MoveToAttribute(name: string):Boolean; +begin + try + MoveToAttribute(FAttrNames.IndexOf(name)); + Result := True; + except + Result := False; + end; +end; + +function XmlTextReader.GetDepth: integer; +begin + Result := 0; +end; + +function XmlTextReader.GetHasAttributes: Boolean; +begin + Result := FAttrNames.Count > 0; +end; + +procedure DeleteInvisibleSymbol(var s: string); +var + i: Integer; +begin + for i := Length(s) downto 1 do + if not ((s[i] in ['a'..'z']) or (s[i] <> '.') or (s[i] <> ':')) then + Delete(s, i, 1); +end; + +function CompareLexem(const s, Substr: string; Index: Integer):Boolean; +var + tmp: string; + Len: Integer; +begin + Len := Length(Substr); + tmp := Copy(s, Index, Len); + Result := CompareText(tmp, Substr) = 0; +end; + +procedure XmlTextReader.InitInstance; +begin + if FTextLen > 0 then + FEof := False + else + FEof := True; + FState := Initial; + FNodeType := ntNone; + FOffset := 1; + FAttrNames := TStringList.Create; + FAttrPrefix := TStringList.Create; + FAttrValues := TStringList.Create; + FCurrElementName := ''; +end; + +function XmlTextReader.GetEof: Boolean; +begin + if Assigned(FReader) then + Result := FReader.Eof + else begin + Result := FOffset >= FTextLen; + FEof := Result; + end; +end; + +{ XmlTextWriter } + +constructor XmlTextWriter.Create(w: StreamWriter); +begin + FFormatting := fmtNone; + FIndentation := 2; + FIndentChar := ' '; + FQuoteChar := '"'; + FWriteState := wsStart; + FDepth := 0; + FPrefix := TStringList.Create; + FPosStack := TStack.Create; + FTagStack := TStringList.Create; + FWriter := w; +end; + +destructor XmlTextWriter.Destroy; +begin + FPrefix.Free; + FPosStack.Free; + FTagStack.Free; + + inherited; +end; + +procedure XmlTextWriter.InternalWriteStartElement(const Prefix, LocalName, ns: string); +var + EndTagPos: Integer; +begin + InternalCloseStartTag; + if FWriteState = wsContent then + FlushData; + + if FDepth > 0 then + FText := FText + LineSeparator; + + if Prefix <> '' then + FText := FText + IndentStr + '<' + Prefix + ':' + LocalName + else + FText := FText + IndentStr + '<' + LocalName; + + if ns <> '' then + if Prefix <> '' then + FText := FText + ' ' + 'xmlns:' + Prefix + '=' + FQuoteChar + ns + FQuoteChar + else + FText := FText + ' ' + 'xmlns=' + FQuoteChar + ns + FQuoteChar; + + EndTagPos := Length(FText); + + inc(FDepth); + + FPosStack.Push(Pointer(EndTagPos)); + if Prefix <> '' then + PushTagName(Prefix + ':' + LocalName) + else + PushTagName(LocalName); + + FWriteState := wsElement; +end; + +procedure XmlTextWriter.InternalWriteElementString(const LocalName, ns, Value: string); +begin + InternalCloseStartTag; + if FWriteState = wsElement then + inc(FDepth); + FText := FText + LineSeparator; + FText := FText + IndentStr + '<' + LocalName; + + if ns <> '' then + FText := FText + ' xmlns=' + FQuoteChar + ns + FQuoteChar + '>' + else + FText := FText + '>'; + + if Value <> '' then + FText := FText + Value; + FText := FText + ''; + if FWriteState = wsElement then + dec(FDepth); + FlushData; + FWriteState := wsContent; +end; + +procedure XmlTextWriter.InternalWriteAttributeString(const Prefix, LocalName, ns, Value: string); +var + AttrPos: Integer; + AttrStr: string; +begin + if FWriteState in [wsElement, wsAttribute] then + AttrPos := Integer(FPosStack.Pop) + 1 + else + raise XmlException.Create('Token WriteAttributeString in state Content would result in an invalid XML document.'); + + if Prefix <> '' then + AttrStr := ' ' + Prefix + ':' + else + AttrStr := ' '; + AttrStr := AttrStr + LocalName + '=' + FQuoteChar + Value + FQuoteChar;// + ' '; + + Insert(AttrStr, FText, AttrPos); + + AttrPos := AttrPos + Length(AttrStr); + + if ns <> '' then begin + AttrStr := 'xmlns:' + Prefix + '=' + FQuoteChar + ns + FQuoteChar;// + ' '; + Insert(AttrStr, FText, AttrPos); + AttrPos := AttrPos + Length(AttrStr); + end; + + FPosStack.Push(Pointer(AttrPos-1)); + FWriteState := wsAttribute; +end; + +procedure XmlTextWriter.FlushData; +begin + FWriter.Write(FText); + FText := ''; +end; + +procedure XmlTextWriter.Close; +begin + FlushData; +end; + +procedure XmlTextWriter.WriteStartElement(const LocalName: string); +begin + InternalWriteStartElement('', LocalName, ''); +end; + +procedure XmlTextWriter.WriteStartElement(const Prefix, LocalName, ns: string); +begin + if (Prefix <> '') and (ns = '') then + raise XmlException.Create('Cannot use a prefix with an empty namespace.'); + + InternalWriteStartElement(Prefix, LocalName, ns); +end; + +procedure XmlTextWriter.WriteStartElement(const LocalName, ns: string); +begin + InternalWriteStartElement('', LocalName, ns); +end; + +procedure XmlTextWriter.WriteEndElement; +begin + dec(FDepth); + if (FWriteState = wsAttribute) then begin + FText := FText + ' />'; + PopTagName; + FWriteState := wsContent; + end + else + InternalWriteEndElement; + FlushData; +end; + +procedure XmlTextWriter.InternalWriteEndElement; +var + Len: Integer; +begin + InternalCloseStartTag; + Len := Length(FText); + if (FText = '') or ((Len >= 2) and (FText[Len] <> #10) and (FText[Len-1] <> #13)) then + FText := FText + LineSeparator + IndentStr + '' + else + FText := FText + ''; + FWriteState := wsContent; +end; + +procedure XmlTextWriter.WriteFullEndElement; +begin + dec(FDepth); + InternalWriteEndElement; + FlushData; +end; + +procedure XmlTextWriter.WriteString(const Text: string); +begin + InternalCloseStartTag; + FText := FText + Text; + FWriteState := wsContent; +end; + +procedure XmlTextWriter.WriteElementString(const LocalName, ns, value: string); +begin + InternalWriteElementString(LocalName, ns, Value); +end; + +procedure XmlTextWriter.WriteElementString(const LocalName, Value: string); +begin + InternalWriteElementString(LocalName, '', Value); +end; + +procedure XmlTextWriter.WriteAttributeString(const LocalName, Value: string); +begin + InternalWriteAttributeString('', LocalName, '', Value); +end; + +procedure XmlTextWriter.WriteAttributeString(const Prefix, LocalName, ns, Value: string); +begin + if (Prefix <> '') and (ns = '') then + raise XmlException.Create('Cannot use a prefix with an empty namespace.'); + + InternalWriteAttributeString(Prefix, LocalName, ns, Value); +end; + +function XmlTextWriter.IndentStr: string; +var + i: Integer; +begin + Result := ''; + if (FFormatting = fmtIndented) and (FDepth <> 0) then + for i := 1 to FDepth * FIndentation do + Result := Result + FIndentChar; +end; + +function XmlTextWriter.PopTagName: string; +begin + if FTagStack.Count = 0 then + raise XmlException.Create('There was no XML start tag open.'); + Result := FTagStack[FTagStack.Count-1]; + FTagStack.Delete(FTagStack.Count-1); +end; + +procedure XmlTextWriter.PushTagName(const TagName: string); +begin + FTagStack.Add(TagName); +end; + +procedure XmlTextWriter.InternalCloseStartTag; +begin + if FWriteState in [wsElement, wsAttribute] then begin + FPosStack.Pop; + FText := TrimRight(FText); + FText := FText + '>'; + end; +end; + +{ StreamWriter } + +constructor StreamWriter.Create(const path: string; Append: Boolean); +begin + inherited Create; + + if FileExists(path) and Append then begin + FWriter := TFileStream.Create(path, fmOpenReadWrite); + FWriter.Seek(0, soFromEnd); + end + else + FWriter := TFileStream.Create(path, fmCreate); + FReleaseWriter := True; +end; + +constructor StreamWriter.Create(output: TStream; Encoding: EncodingClass); +begin + inherited Create; + + FWriter := output; + FReleaseWriter := False; + FEncodingClass := Encoding; +end; + +destructor StreamWriter.Destroy; +begin + if FReleaseWriter then + FWriter.Free; + + inherited; +end; + +procedure StreamWriter.Close; +begin +end; + +procedure StreamWriter.Flush; +begin +end; + +procedure StreamWriter.Write(value: string); +var + Str: string; +begin + if FEncodingClass <> nil then begin + Str := FEncodingClass.GetString(TBytes(value)); + FWriter.Write(PChar(Str)^, Length(Str)); + end + else + FWriter.Write(PChar(value)^, Length(value)); +end; + +procedure StreamWriter.WriteLine(const value: string); +begin + Write(value + LineSeparator); +end; + + { StreamReader } + +constructor StreamReader.Create(const path: string; detectEncodingFromByteOrderMarks: Boolean); +begin + FCapacity := 512; + FReader := TFileStream.Create(path, fmOpenRead); + FReleaseReader := True; +end; + +constructor StreamReader.Create(input: TStream); +begin + FCapacity := 512; + FReader := input; + FReleaseReader := False; +end; + +destructor StreamReader.Destroy; +begin + if FReleaseReader then + FReader.Free; +end; + +function StreamReader.Eof: Boolean; +begin + Result := FReader.Position = FReader.Size; +end; + +procedure StreamReader.Close; +begin + +end; + +function StreamReader.ReadToEnd:string; +var + Len: Int64; +begin + Len := FReader.Size - FReader.Position; + SetLength(Result, Len); + Read(TChars(Result), 0, Len); +end; + +function StreamReader.Read(buffer: TChars; Index, Count: Integer):Integer; +begin + Result := FReader.Read((PChar(buffer) + Index)^, Count); +end; + +function StreamReader.ReadLine:string; +var + SeparatorPos: Integer; + Count, BeginPos: Integer; + Position, NextPosition: Int64; +begin + if Eof then begin + Result := ''; + exit; + end; + + SetLength(Result, FCapacity); + System.FillChar(Result[1], Length(Result), ' '); + Position := FReader.Position; + + Count := 1; + SeparatorPos := -1; + BeginPos := 1; + while True do begin + Count := FReader.Read(Result[BeginPos], Length(Result) - BeginPos + 1); + SeparatorPos := PosEx(LineSeparator, Result, BeginPos-1); + + if Eof or (SeparatorPos <> 0) then + break; + BeginPos := Length(Result)+1; + SetLength(Result, BeginPos + Round(BeginPos * 0.3)); + System.FillChar(Result[BeginPos], Length(Result) - BeginPos + 1, ' '); + end; + + if SeparatorPos <> 0 then + SetLength(Result, SeparatorPos + 1) + else + SetLength(Result, Count); + + FCapacity := Length(Result); + NextPosition := Position + FCapacity; + if (Count <> 0) and (NextPosition + 1 <> FReader.Size) then + FReader.Seek(Position - FReader.Position + FCapacity, soFromCurrent); +end; + +{ TXmlParser } + +constructor TXmlParser.Create(const Text: string); +begin + inherited; + + FSymbolLexems := XmlSymbolLexems; + FKeywordLexems := XmlKeywordLexems; +end; + +{ StringReader } + +constructor StringReader.Create(Text: string); +begin + FText := Text; +end; + +initialization + XmlSymbolLexems := TStringList.Create; + XmlKeywordLexems := TStringList.Create; + + XmlSymbolLexems.AddObject(':', TObject(integer(16))); + XmlSymbolLexems.AddObject('=', TObject(integer(19))); + XmlSymbolLexems.CustomSort(CRCmpStrings); + +finalization + XmlSymbolLexems.Free; + XmlKeywordLexems.Free; + +end. diff --git a/internal/4.10.0.10/1/Source/CoreLab.snk b/internal/4.10.0.10/1/Source/CoreLab.snk new file mode 100644 index 0000000000000000000000000000000000000000..a57bc467407973793ee7a190cbd511e0316fa2d8 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098WS12}^Vri-N`^e-H8W!1v1<_hKL*y#z zWs+>`?@Sl4<#}qsF}kWu(2WxIbBDuPa%Wm)!ds0u-7HQ02kl_bAoxF0)4}T0-Vo=0 zW*JR>psF-Vaw@NgO)}=)U%sb{b!TdKNj?RYx}b$sjIHy*99Icv{#?Csyg zWmcNDzx37Mjg)FDF-v+ykWH14BXK|4$Ox$KZvx-voRz@w0qRHTrxX<;|K>@@r69#Gf;_7$p`1q5)ZLhlr>peLXVE^JaR<^qeh?6W=SpzD89) z3D2bc*FIQ64B7W*x<7kNkJ*^CbsMZQWsvGL@djSae@f#6-(tIOe8V$+GwXJGJ|; zLb$_SiZ5%`{U$=>Cf=IB))a-g`RT&J>pFG-3<0(3pL=(^Oid*2tFX@sBTnb#A5?g9 i6n4$%54lpp9 FConnection then begin + if FConnection <> nil then + RemoveFreeNotification(FConnection); + + FConnection := Value; + + if FConnection <> nil then + FreeNotification(FConnection); + end; +end; + +procedure TDADump.BeginConnection; +begin + if FConnection = nil then + raise Exception.Create(SConnectionNotDefined); + TDBAccessUtils.InternalConnect(FConnection); +end; + +procedure TDADump.EndConnection; +begin + TDBAccessUtils.InternalDisconnect(FConnection); +end; + +procedure TDADump.SetSQL(Value: TStrings); +begin + if FSQL.Text <> Value.Text then begin + FSQL.BeginUpdate; + try + FSQL.Assign(Value); + finally + FSQL.EndUpdate; + end; + end; +end; + +procedure TDADump.SetOptions(Value: TDADumpOptions); +begin + FOptions.Assign(Value); +end; + +procedure TDADump.Loaded; +begin + inherited; + + FDesignCreate := False; +end; + +procedure TDADump.Backup; +begin + InternalBackup(''); +end; + +procedure TDADump.BackupToStream(Stream: TStream); +begin + FStream := Stream; + try + InternalBackup(''); + finally + FStream := nil; + end; +end; + +procedure TDADump.BackupToFile(const FileName: string); +var + Stream: TStream; +begin + Stream := TFileStream.Create(FileName, fmCreate); + try + BackupToStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TDADump.BackupQuery(Query: string); +var + OldTables: TStringList; +begin + if Trim(Query) = '' then + raise EDatabaseError.Create(SEmptySQLStatement); + + OldTables := TStringList.Create; + OldTables.Assign(FTables); + FTables.Clear; + try + InternalBackup(Query); + finally + FTables.Assign(OldTables); + OldTables.Free; + end; +end; + +procedure TDADump.Restore; +var + Script: TDAScript; + Len: integer; +begin + Script := CreateScript; + try + Script.Connection := Connection; + Script.Debug := Debug; + Script.SQL := SQL; + Len := Length(SQL.Text); + + while Script.ExecuteNext do + if Assigned(FOnRestoreProgress) and (Len > 0) then + FOnRestoreProgress(Self, Trunc((Script.StartPos / Len) * 100{"*" after "/" to prevent IntOverflow})); + finally + Script.Free; + end; +end; + +procedure TDADump.RestoreFromStream(Stream: TStream); +const + BlockSize = 64 * 1024; +var + Script: TDAScript; + TotalCount: Int64; +begin + Script := CreateScript; + try + TotalCount := Stream.Size; + Script.Connection := Connection; + Script.Debug := Debug; + TDAScriptUtils.Open(Script, Stream); + try + while Script.ExecuteNext do + if Assigned(FOnRestoreProgress) and (TotalCount > 0) then + FOnRestoreProgress(Self, Trunc((Script.StartPos / TotalCount) * 100{"*" after "/" to prevent IntOverflow})); + finally + TDAScriptUtils.Close(Script); + end; + finally + Script.Free; + end; +end; + +procedure TDADump.RestoreFromFile(const FileName: string); +var + FileStream: TFileStream; +begin + FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); + try + RestoreFromStream(FileStream); + finally + FileStream.Free; + end; +end; + +procedure TDADump.Add(const Line: string); // Line must be w/o #$D#$A +var + s: string; +begin + if FStream = nil then + FSQL.Add(Line) + else + begin + s := Line + #$D#$A; + FStream.WriteBuffer(s[1], Length(s)); + end; +end; + +procedure TDADump.Add(const sl: TStringList); +var + i: integer; +begin + for i := 0 to sl.Count - 1 do + Add(sl[i]); +end; + +procedure TDADump.AddLineToSQL(const Line: string); // Line may contains #$D#$A +var + sl: TStringList; +begin + sl := TStringList.Create; + try + sl.Text := Line; + Add(sl); + finally + sl.Free; + end; +end; + +procedure TDADump.AddLineToSQL(const Line: string; const Args: array of const); +begin + AddLineToSQL(Format(Line, Args)); +end; + +function TDADump.GetTableInfoClass: TTableInfoClass; +begin + Result := TCRTableInfo; +end; + +function TDADump.QuoteName(const AName: string): string; +begin + Result := GetTableInfoClass.NormalizeName(AName, FLeftQuote, FRightQuote, FOptions.QuoteNames); +end; + +{ TDADumpUtils } + +class procedure TDADumpUtils.SetDesignCreate(Obj: TDADump; Value: boolean); +begin + Obj.FDesignCreate := Value; +end; + +class function TDADumpUtils.GetDesignCreate(Obj: TDADump): boolean; +begin + Result := Obj.FDesignCreate; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/DALoader.pas b/internal/4.10.0.10/1/Source/DALoader.pas new file mode 100644 index 0000000..7262308 --- /dev/null +++ b/internal/4.10.0.10/1/Source/DALoader.pas @@ -0,0 +1,605 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// TDALoader +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DALoader; +{$ENDIF} + +interface + +uses +{$IFDEF CLR} + Variants, +{$ENDIF} + Classes, SysUtils, DBAccess, DB, MemData; + +type + TDAColumnDataType = (ctString, ctDate, ctInteger, ctUInteger, ctFloat); + + TDAColumnClass = class of TDAColumn; + + TDAColumn = class (TCollectionItem) + private + FName: string; + FFieldType: TFieldType; + + protected + function GetDataType: TDAColumnDataType; virtual; + procedure SetDataType(Value: TDAColumnDataType); virtual; + procedure SetFieldType(Value: TFieldType); virtual; + function GetDisplayName: string; override; + property DataType: TDAColumnDataType read GetDataType write SetDataType; + + public + constructor Create(Collection: TCollection); override; + + published + property Name: string read FName write FName; + property FieldType: TFieldType read FFieldType write SetFieldType default ftString; + end; + + TDAColumns = class (TOwnedCollection) + private + function GetColumn(Index: integer): TDAColumn; + procedure SetColumn(Index: integer; Value: TDAColumn); + + public + property Items[Index: integer]: TDAColumn read GetColumn write SetColumn; default; + end; + + TDALoader = class; + + TDAPutDataEvent = procedure (Sender: TDALoader) of object; + TGetColumnDataEvent = procedure (Sender: TObject; Column: TDAColumn; Row: integer; + var Value: variant; var IsEOF: boolean) of object; + + TDALoader = class (TComponent) + private + FTableName: string; + + FOnPutData: TDAPutDataEvent; + FOnGetColumnData: TGetColumnDataEvent; + + procedure SetConnection(Value: TCustomDAConnection); + procedure SetColumns(Value: TDAColumns); + + function IsColumnsStored: boolean; + procedure CreateColumnsByFields(Fields: TFields); + protected + FColumns: TDAColumns; + FConnection: TCustomDAConnection; + + FLastRow: integer; + FDesignCreate: boolean; + + FSkipReadOnlyFieldDescs: boolean; + + procedure Loaded; override; + + procedure Notification(Component: TComponent; Operation: TOperation); override; + procedure BeginConnection; virtual; + procedure EndConnection; virtual; + + procedure CheckTableName; + + procedure Prepare; virtual; + procedure Reset; virtual; + procedure InternalPutData; virtual; + procedure PutData; virtual; + procedure DoLoad; virtual; + procedure Finish; virtual; + procedure SetTableName(Value: string); virtual; + + class function DAColumnClass: TDAColumnClass; virtual; + + function UsedConnection: TCustomDAConnection; virtual; + + function ConvertDataTypeToColumnType( const DataType: word): TDAColumnDataType; virtual; + procedure FillColumn(Column: TDAColumn; FieldDesc: TFieldDesc); virtual; + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + + procedure PutColumnData(Col: integer; Row: integer; const Value: variant); overload; virtual; + procedure PutColumnData(const ColName: string; Row: integer; const Value: variant); overload; + + procedure Load; virtual; + + procedure CreateColumns; + procedure LoadFromDataSet(DataSet: TDataSet); + + property Connection: TCustomDAConnection read FConnection write SetConnection; + property TableName: string read FTableName write SetTableName; + property Columns: TDAColumns read FColumns write SetColumns stored IsColumnsStored; + + property OnPutData: TDAPutDataEvent read FOnPutData write FOnPutData; + property OnGetColumnData: TGetColumnDataEvent read FOnGetColumnData write FOnGetColumnData; + end; + + TDALoaderUtils = class + public + class procedure SetDesignCreate(Obj: TDALoader; Value: boolean); + class function GetDesignCreate(Obj: TDALoader): boolean; + class function UsedConnection(Obj: TDALoader): TCustomDAConnection; + end; + +implementation + +uses +{$IFDEF LINUX} +{$ELSE} + Windows, +{$ENDIF} + CRAccess, DAConsts {$IFNDEF CLR}{$IFDEF VER6P}, Variants{$ENDIF}{$ENDIF}, MemUtils; + +{ TDAColumn } + +constructor TDAColumn.Create(Collection: TCollection); +begin + inherited; + + FFieldType := ftString; +end; + +function TDAColumn.GetDataType: TDAColumnDataType; +begin + case FieldType of + ftString, ftMemo, ftFmtMemo, ftFixedChar, ftWideString, ftGuid {$IFDEF VER6P}, ftTimeStamp{$ENDIF}{$IFDEF VER10P}, ftWideMemo{$ENDIF}: + Result := ctString; + ftSmallint, ftInteger, ftWord, ftAutoInc: + Result := ctInteger; + ftLargeint: + Result := ctUInteger; + ftFloat, ftCurrency, ftBCD{$IFDEF VER6P}, ftFMTBcd{$ENDIF}: + Result := ctFloat; + ftDate, ftTime, ftDateTime: + Result := ctDate; + else + Result := ctString; + end; +end; + +procedure TDAColumn.SetDataType(Value: TDAColumnDataType); +begin + case Value of + ctString: + FieldType := ftString; + ctDate: + FieldType := ftDateTime; + ctInteger: + FieldType := ftInteger; + ctUInteger: + FieldType := ftLargeint; + ctFloat: + FieldType := ftFloat; + end; +end; + +procedure TDAColumn.SetFieldType(Value: TFieldType); +begin + FFieldType := Value; +end; + +function TDAColumn.GetDisplayName: string; +begin + Result := FName; +end; + +{ TDAColumns } + +function TDAColumns.GetColumn(Index: integer): TDAColumn; +begin + Result := TDAColumn(inherited Items[Index]); +end; + +procedure TDAColumns.SetColumn(Index: integer; Value: TDAColumn); +begin + Items[Index].Assign(Value); +end; + +{ TDALoader } + +constructor TDALoader.Create(Owner: TComponent); +begin + inherited Create(Owner); + + FColumns := TDAColumns.Create(Self, DAColumnClass); + + FDesignCreate := csDesigning in ComponentState; + FSkipReadOnlyFieldDescs := True; +end; + +destructor TDALoader.Destroy; +begin + FColumns.Free; + + inherited; +end; + +procedure TDALoader.Loaded; +begin + inherited; + + FDesignCreate := False; +end; + +procedure TDALoader.BeginConnection; +begin + if UsedConnection = nil then + raise Exception.Create(SConnectionNotDefined); + TDBAccessUtils.InternalConnect(UsedConnection); +end; + +procedure TDALoader.EndConnection; +begin + TDBAccessUtils.InternalDisconnect(UsedConnection); +end; + +procedure TDALoader.CheckTableName; +begin + if Trim(FTableName) = '' then + raise Exception.Create(STableNameNotDefined); +end; + +procedure TDALoader.Prepare; +begin + BeginConnection; + CheckTableName; + Reset; +end; + +procedure TDALoader.Finish; +begin + EndConnection; +end; + +procedure TDALoader.Reset; +begin + FLastRow := -1; +end; + +procedure TDALoader.PutColumnData(Col: integer; Row: integer; const Value: variant); +begin + if Col >= FColumns.Count then + DatabaseError('Invalid column number'); + + if (Row < FLastRow) or (Row < 1) then + DatabaseError('Invalid row number'); + + FLastRow := Row - 1; +end; + +procedure TDALoader.PutColumnData(const ColName: string; Row: integer; const Value: variant); +var + i: integer; +begin + for i := 0 to FColumns.Count - 1 do + if AnsiSameText(ColName, FColumns[i].Name) then begin + PutColumnData(i, Row, Value); + Exit; + end; + raise Exception.Create(Format(SColumnNotFound, [ColName])); +end; + +procedure TDALoader.InternalPutData; +var + Value: variant; + EOF: boolean; + i,Row: integer; +begin + if Assigned(FOnGetColumnData) then begin + Row := 1; + EOF := False; + while not EOF do begin + for i := 0 to FColumns.Count - 1 do begin + FOnGetColumnData(Self, FColumns[i], Row, Value, EOF); + if not EOF then + PutColumnData(i, Row, Value) + else begin + if i <> 0 then + FLastRow := -1; // to prevent insertion of incomplete row. If EOF is set to True on getting value 1..last field, all values of this record is ignored. + break; // stop loading immediately after getting EOF + end; + end; + if not EOF then + Inc(Row); + end; + end; +end; + +procedure TDALoader.PutData; +begin + if Assigned(FOnPutData) then + FOnPutData(Self) + else + InternalPutData; +end; + +procedure TDALoader.DoLoad; +begin +end; + +procedure TDALoader.Load; +begin + BeginConnection; + try + if Columns.Count = 0 then + CreateColumns; + try + Prepare; + StartWait; + PutData; + finally + Finish; + StopWait; + end; + finally + EndConnection; + end; +end; + +function TDALoader.ConvertDataTypeToColumnType(const DataType: word): TDAColumnDataType; +begin + Result := ctString; // To disable warning + + case DataType of + dtUnknown, dtString, dtBoolean, dtBlob, dtMemo, dtWideMemo, dtExtString, dtWideString, dtExtWideString: + Result := ctString; + dtInt8, dtInt16, dtInt32, dtInt64: + Result := ctInteger; + dtUInt16, dtUInt32: + Result := ctUInteger; + dtFloat, dtCurrency: + Result := ctFloat; + dtDate, dtTime, dtDateTime: + Result := ctDate; + else + //Assert(False, 'Unknown datatype (' + IntToStr(DataType) + ')'); + end; +end; + +procedure TDALoader.FillColumn(Column: TDAColumn; FieldDesc: TFieldDesc); +begin + Column.Name := FieldDesc.Name; + Column.DataType := ConvertDataTypeToColumnType(FieldDesc.DataType); + // Needs to override to fill ColumnType +end; + +procedure TDALoader.CreateColumns; +var + RecordSet: TCustomDADataSet; + FieldDesc: TFieldDesc; + i: integer; +begin + BeginConnection; + try + CheckTableName; + FColumns.Clear; + RecordSet := UsedConnection.CreateDataSet; + RecordSet.SQL.Text := 'SELECT * FROM ' + FTableName + ' WHERE 1=0'; // CR-M15322 + FColumns.BeginUpdate; + try + RecordSet.Execute; + for i := 0 to RecordSet.FieldCount - 1 do begin + FieldDesc := RecordSet.GetFieldDesc(RecordSet.Fields[i]); + if not (FieldDesc.ReadOnly and FSkipReadOnlyFieldDescs) then + FillColumn(TDAColumn(FColumns.Add), FieldDesc); + end; + finally + FColumns.EndUpdate; + RecordSet.Free; + end; + + finally + EndConnection; + end; +end; + +procedure TDALoader.CreateColumnsByFields(Fields: TFields); +var + i: word; + Field: TField; +begin + FColumns.Clear; + try + FColumns.BeginUpdate; + + for i := 0 to Fields.Count - 1 do begin + Field := Fields[i]; + if not Field.ReadOnly then + with TDAColumn(FColumns.Add) do begin + Name := Field.FieldName; + FieldType := Field.DataType; + end; + end; + + finally + FColumns.EndUpdate; + end; +end; + +procedure TDALoader.Notification(Component: TComponent; Operation: TOperation); +begin + if (Component = FConnection) and (Operation = opRemove) then + Connection := nil; + + inherited; +end; + +procedure TDALoader.SetConnection(Value: TCustomDAConnection); +begin + if Value <> FConnection then begin + if FConnection <> nil then + RemoveFreeNotification(FConnection); + + FConnection := Value; + + if FConnection <> nil then + FreeNotification(FConnection); + end; +end; + +procedure TDALoader.SetColumns(Value: TDAColumns); +begin + FColumns.Assign(Value); +end; + +function TDALoader.IsColumnsStored: boolean; +begin + Result := FColumns.Count > 0; +end; + +procedure TDALoader.SetTableName(Value: string); +begin + if Value <> FTableName then begin + FTableName := Value; + if not (csLoading in ComponentState) and (UsedConnection <> nil) and UsedConnection.Connected and (FColumns.Count = 0) then + CreateColumns; + end; +end; + +class function TDALoader.DAColumnClass: TDAColumnClass; +begin + Result := TDAColumn; +end; + +function TDALoader.UsedConnection: TCustomDAConnection; +begin + Result := FConnection; +end; + +procedure TDALoader.LoadFromDataSet(DataSet: TDataSet); +var + row, col: integer; + ColNo: array of integer; + OldActive: boolean; + + Field: TField; + FieldDesc: TFieldDesc; + RecordSet: TCRRecordSet; + ObjRef: TSharedObject; + IsBlank: boolean; + AValue: variant; + Bookmark: TBookmark; + + procedure FillColumsNumber; + var + i, j: integer; + fname: string; + begin + for i := 0 to DataSet.FieldCount - 1 do begin + ColNo[i] := -1; + fname := DataSet.Fields[i].FieldName; + + for j := 0 to FColumns.Count - 1 do + if AnsiSameText(fname, FColumns[j].Name) then begin + ColNo[i] := j; + break; + end; + end; + end; + +begin + if DataSet = nil then + raise Exception.Create(SDataSetNotDefined); + + OldActive := DataSet.Active; + Bookmark := nil; + try + DataSet.DisableControls; + Bookmark := DataSet.GetBookmark; + + DataSet.Open; + DataSet.First; + + SetLength(ColNo, DataSet.FieldCount); + + if Columns.Count = 0 then begin + CreateColumnsByFields(DataSet.Fields); + + for col := 0 to DataSet.FieldCount - 1 do + ColNo[col] := col; + end + else + FillColumsNumber; + + Prepare; + StartWait; + try + DataSet.First; + for row := 1 to DataSet.RecordCount do begin + for col := 0 to DataSet.FieldCount - 1 do + if ColNo[col] >= 0 then begin + Field := DataSet.Fields[col]; + if DataSet is TCustomDADataSet then + with TCustomDADataSet(DataSet) do begin + FieldDesc := GetFieldDesc(Field); + if FieldDesc <> nil then begin + RecordSet := TDBAccessUtils.GetIRecordSet(TCustomDADataSet(DataSet)); + if RecordSet.IsComplexFieldType(FieldDesc.DataType) + and not((FieldDesc.DataType = dtExtString) + or (FieldDesc.DataType = dtExtWideString) + or (FieldDesc.DataType = dtExtVarBytes) + {$IFDEF VER5P}or (FieldDesc.DataType = dtVariant){$ENDIF}) then begin + IsBlank := RecordSet.GetNull(FieldDesc.FieldNo, ActiveBuffer); + ObjRef := RecordSet.GetObject(FieldDesc.FieldNo, ActiveBuffer); + if IsBlank then + AValue := Null + else begin + {$IFDEF CLR} + AValue := Variant(ObjRef); + {$ELSE} + AValue := Unassigned; + TVarData(AValue).VType := varByRef; + TVarData(AValue).VPointer := ObjRef; + {$ENDIF} + end; + PutColumnData(ColNo[col], row, AValue); + Continue; + end; + end; + end; + // To avoid memory leak + AValue := Unassigned; + AValue := Field.Value; + PutColumnData(ColNo[col], row, AValue); + end; + DataSet.Next; + end; + DoLoad; + finally + Finish; + StopWait; + end; + finally + DataSet.Active := OldActive; + DataSet.GotoBookmark(Bookmark); + DataSet.EnableControls; + end; +end; + +{ TDALoaderUtils } + +class procedure TDALoaderUtils.SetDesignCreate(Obj: TDALoader; Value: boolean); +begin + Obj.FDesignCreate := Value; +end; + +class function TDALoaderUtils.GetDesignCreate(Obj: TDALoader): boolean; +begin + Result := Obj.FDesignCreate; +end; + +class function TDALoaderUtils.UsedConnection(Obj: TDALoader): TCustomDAConnection; +begin + Result := Obj.UsedConnection; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/DASQLMonitor.pas b/internal/4.10.0.10/1/Source/DASQLMonitor.pas new file mode 100644 index 0000000..8c7c076 --- /dev/null +++ b/internal/4.10.0.10/1/Source/DASQLMonitor.pas @@ -0,0 +1,1141 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SQLMonitor supports +// Created: 17.11.99 +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DASQLMonitor; +{$ENDIF} +interface +uses +{$IFDEF LINUX} + Types, +{$ELSE} +{$ENDIF} + SysUtils, Classes, DB, MemData, DBAccess, DBMonitorClient, DBMonitorIntf; + +const + teStart = 1; + teCommit = 2; + teRollback = 3; + +type + TDATraceFlag = (tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect, + tfTransact, tfBlob, tfService, tfMisc, tfParams); + TDATraceFlags = set of TDATraceFlag; + + TMonitorOption = (moDialog, moSQLMonitor, moDBMonitor, moCustom, moHandled); + TMonitorOptions = set of TMonitorOption; + + TOnSQLEvent = procedure (Sender: TObject; Text: string; Flag: TDATraceFlag) of object; + +{ TCustomDASQLMonitor } + + TDASQLMonitorClass = class of TCustomDASQLMonitor; + + TCustomDASQLMonitor = class(TComponent) + private + FActive: boolean; + FTraceFlags: TDATraceFlags; + FOptions: TMonitorOptions; + FStreamedActive: boolean; + {$IFDEF WIN32} + FRegistered: boolean; + FSMClient: IUnknown; + NeedUninitialize :boolean; + {$ENDIF} + {$IFNDEF LINUX} + FDBMonitor: IDBMonitor; + {$ENDIF} + + procedure SetActive(Value: boolean); + procedure SetOptions(Value: TMonitorOptions); + + protected + FOnSQLEvent: TOnSQLEvent; + + { component routines } + procedure Loaded; override; + procedure CheckActive; + { Borland's SQL Monitor support } + procedure RegisterClient; virtual; + procedure UnRegisterClient; virtual; + procedure AddStatement(const St: string); + procedure SMClientSignal(Sender: TObject; Data: Integer); + + { DBMonitor support } + procedure OnConnect(const Username, Server, St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); + procedure OnDisconnect(const Username, Server, St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); + procedure OnTransact(const St: string; Component: TComponent; TransactEvent: integer; ATracePoint: TTracePoint; var AMessageID: Cardinal); + procedure OnPrepare(const SQL: string; var Params: TSQLParams; const St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); + procedure OnUnprepare(const SQL: string; var Params: TSQLParams; const St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); + procedure OnExecute(const SQL: string; var Params: TSQLParams; const St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); + procedure OnError(ErrorStr: string); + procedure OnCustomMessage(const St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); + procedure PrepareExecuteMessage(const SQL: string; var Params: TSQLParams; const St: string; + Component: TComponent; ATracePoint: TTracePoint; EventType: TEventType; var AMessageID: Cardinal); + + function GetCompHandle(Comp: TComponent): string; + function GetParent(Component: TComponent; Index: integer): TComponent; virtual; + function GetParentCount(Component: TComponent): integer; virtual; + + procedure InternalSQLPrepare(Component: TComponent; const SQL: string; Params: TDAParams; ATracePoint: TTracePoint; var MessageID: Cardinal); + procedure InternalSQLUnprepare(Component: TComponent; const SQL: string; Params: TDAParams; ATracePoint: TTracePoint; var MessageID: Cardinal); + procedure InternalSQLExecute(Component: TComponent; const SQL: string; Params: TDAParams; const Caption: string; ATracePoint: TTracePoint; var MessageID: Cardinal); virtual; + procedure InternalDBConnect(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); + procedure InternalDBDisconnect(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); + procedure InternalTRStart(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); virtual; + procedure InternalTRCommit(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); virtual; + procedure InternalTRRollback(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); virtual; + procedure InternalDBError(Exception: EDAError); + procedure InternalCustomMessage(Connection: TCustomDAConnection; const Msg: string; var AMessageID: Cardinal); + + class function GetMonitor: TCustomDASQLMonitor; virtual; + + public + class procedure SQLPrepare(Component: TComponent; const SQL: string; Params: TDAParams; var MessageID: Cardinal; BeforeEvent: boolean); + class procedure SQLUnprepare(Component: TComponent; const SQL: string; Params: TDAParams; var MessageID: Cardinal; BeforeEvent: boolean); + class procedure SQLExecute(Component: TComponent; const SQL: string; Params: TDAParams; const Caption: string; var MessageID: Cardinal; BeforeEvent: boolean); + class procedure DBConnect(Connection: TCustomDAConnection; var MessageID: Cardinal; BeforeEvent: boolean); + class procedure DBDisconnect(Connection: TCustomDAConnection; var MessageID: Cardinal; BeforeEvent: boolean); + class procedure TRStart(Connection: TCustomDAConnection; var MessageID: Cardinal; BeforeEvent: boolean); virtual; + class procedure TRCommit(Connection: TCustomDAConnection; var MessageID: Cardinal; BeforeEvent: boolean); virtual; + class procedure TRRollback(Connection: TCustomDAConnection; var MessageID: Cardinal; BeforeEvent: boolean); virtual; + class procedure DBError(Exception: EDAError); + class procedure CustomMessage(Connection: TCustomDAConnection; const Msg: string; var MessageID: Cardinal); + class function HasMonitor: boolean; + + class function GetParamDataType(Param: TDAParam): string; virtual; + class function GetParamParamType(Param: TDAParam): string; virtual; + class function GetParamValue(Param: TDAParam): string; virtual; + class function GetParam(Param: TDAParam; var SQLParam: TSQLParam): string; + class function GetParams(Params: TDAParams; var SQLParams: TSQLParams): string; overload; + class function GetParams(Params: TDAParams): string; overload; + class function GetCaption: string; virtual; + class procedure ShowDebug(Component: TComponent; const SQL: string; Params: TDAParams; const Caption: string); + + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + property Active: boolean read FActive write SetActive default True; + property TraceFlags: TDATraceFlags read FTraceFlags write FTraceFlags default [tfQPrepare, tfQExecute, tfError, tfConnect, tfTransact, tfParams, tfMisc]; + property Options: TMonitorOptions read FOptions write SetOptions default [moDialog, moSQLMonitor, moDBMonitor, moCustom]; + + property OnSQL: TOnSQLEvent read FOnSQLEvent write FOnSQLEvent; + end; + +var + ShowDebugFormProc: procedure (DASQLMonitorClass: TDASQLMonitorClass; + Component: TComponent; SQL: string; Params: TDAParams; Caption: string); + + function GetComponentID(Component: TComponent): cardinal; + function GetComponentName(Component: TComponent): string; + +implementation + +uses + MemUtils +{$IFNDEF WIN32} + ; +{$ELSE} + , ActiveX; + +const + Class_SMClient: TGUID = '{CB9879E2-4395-11D0-9FFC-00A0248E4B9A}'; + +type + ISMClient = interface(IUnknown) + ['{CB9879E1-4395-11D0-9FFC-00A0248E4B9A}'] + function RegisterClient(ID: Integer; Name: PChar; + Instance, SignalProc: Pointer): WordBool; stdcall; + function AddStatement(Statement: PChar; Len: Integer): WordBool; stdcall; + end; +{$ENDIF} + + +function GetComponentID(Component: TComponent): cardinal; +begin +{$IFDEF CLR} + if Component = nil then + Result := 0 + else +{$ENDIF} + Result := Cardinal(Component{$IFDEF CLR}.GetHashCode{$ENDIF}); + + if Result <> 0 then + if (Component is TCustomDADataSet) then + Result := Result xor Reverse4(GetComponentID(TCustomDADataSet(Component).Connection)) + else + if (Component is TCustomDASQL) then + Result := Result xor Reverse4(GetComponentID(TCustomDASQL(Component).Connection)); +end; + +function GetComponentName(Component: TComponent): string; +begin + if Component.Name <> '' then + Result := Component.Name + else + Result := Component.ClassName + ' ($' + IntToHex(GetComponentID(Component), 8) + ')'; +end; + +{ TCustomDASQLMonitor } + +const + fmtConnectInfo = 'Username=%s'#13#10'Server=%s'; + +constructor TCustomDASQLMonitor.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + + FActive := False; + FOptions := [moDialog, moSQLMonitor, moDBMonitor, moCustom]; + FTraceFlags := [tfQPrepare, tfQExecute, tfError, tfConnect, tfTransact, tfParams, tfMisc]; + FStreamedActive := True; + if (csDesigning in ComponentState) or (AOwner = nil) or not (csReading in AOwner.ComponentState) then + Active := True +end; + +destructor TCustomDASQLMonitor.Destroy; +begin + Active := False; + {$IFDEF WIN32} + if NeedUninitialize then + CoUninitialize; + {$ENDIF} + + inherited; +end; + +class procedure TCustomDASQLMonitor.SQLPrepare(Component: TComponent; + const SQL: string; Params: TDAParams; var MessageID: Cardinal; + BeforeEvent: boolean); +var + Monitor: TCustomDASQLMonitor; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + if BeforeEvent then + Monitor.InternalSQLPrepare(Component, TrimRight(SQL), Params, tpBeforeEvent, MessageID) + else + Monitor.InternalSQLPrepare(Component, TrimRight(SQL), Params, tpAfterEvent, MessageID) + else + if BeforeEvent then + ShowDebug(Component, TrimRight(SQL), Params, 'Prepare'); +end; + +class procedure TCustomDASQLMonitor.SQLUnprepare(Component: TComponent; + const SQL: string; Params: TDAParams; var MessageID: Cardinal; + BeforeEvent: boolean); +var + Monitor: TCustomDASQLMonitor; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + if BeforeEvent then + Monitor.InternalSQLUnprepare(Component, TrimRight(SQL), Params, tpBeforeEvent, MessageID) + else + Monitor.InternalSQLUnprepare(Component, TrimRight(SQL), Params, tpAfterEvent, MessageID) + else + if BeforeEvent then + ShowDebug(Component, TrimRight(SQL), Params, 'Unprepare'); +end; + +class procedure TCustomDASQLMonitor.SQLExecute(Component: TComponent; + const SQL: string; Params: TDAParams; const Caption: string; + var MessageID: Cardinal; BeforeEvent: boolean); +var + Monitor: TCustomDASQLMonitor; + ACaption: string; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + if BeforeEvent then + Monitor.InternalSQLExecute(Component, SQL, Params, Caption, tpBeforeEvent, MessageID) + else + Monitor.InternalSQLExecute(Component, SQL, Params, Caption, tpAfterEvent, MessageID) + else + begin + if Caption = '' then + ACaption := 'Execute' + else + ACaption := Caption; + + if BeforeEvent then + ShowDebug(Component, SQL, Params, ACaption); + end; +end; + +class procedure TCustomDASQLMonitor.DBConnect(Connection: TCustomDAConnection; + var MessageID: Cardinal; BeforeEvent: boolean); +var + Monitor: TCustomDASQLMonitor; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + if BeforeEvent then + Monitor.InternalDBConnect(Connection, tpBeforeEvent, MessageID) + else + Monitor.InternalDBConnect(Connection, tpAfterEvent, MessageID) +end; + +class procedure TCustomDASQLMonitor.DBDisconnect(Connection: TCustomDAConnection; + var MessageID: Cardinal; BeforeEvent: boolean); +var + Monitor: TCustomDASQLMonitor; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + if BeforeEvent then + Monitor.InternalDBDisconnect(Connection, tpBeforeEvent, MessageId) + else + Monitor.InternalDBDisconnect(Connection, tpAfterEvent, MessageId); +end; + +class procedure TCustomDASQLMonitor.TRStart(Connection: TCustomDAConnection; + var MessageID: Cardinal; BeforeEvent: boolean); +var + Monitor: TCustomDASQLMonitor; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + if BeforeEvent then + Monitor.InternalTRStart(Connection, tpBeforeEvent, MessageID) + else + Monitor.InternalTRStart(Connection, tpAfterEvent, MessageID); +end; + +class procedure TCustomDASQLMonitor.TRCommit(Connection: TCustomDAConnection; + var MessageID: Cardinal; BeforeEvent: boolean); +var + Monitor: TCustomDASQLMonitor; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + if BeforeEvent then + Monitor.InternalTRCommit(Connection, tpBeforeEvent, MessageID) + else + Monitor.InternalTRCommit(Connection, tpAfterEvent, MessageID); +end; + +class procedure TCustomDASQLMonitor.TRRollback(Connection: TCustomDAConnection; + var MessageID: Cardinal; BeforeEvent: boolean); +var + Monitor: TCustomDASQLMonitor; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + if BeforeEvent then + Monitor.InternalTRRollback(Connection, tpBeforeEvent, MessageID) + else + Monitor.InternalTRRollback(Connection, tpAfterEvent, MessageID); +end; + +class procedure TCustomDASQLMonitor.DBError(Exception: EDAError); +var + Monitor: TCustomDASQLMonitor; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + Monitor.InternalDBError(Exception); +end; + +class procedure TCustomDASQLMonitor.CustomMessage(Connection: TCustomDAConnection; + const Msg: string; var MessageID: Cardinal); +var + Monitor: TCustomDASQLMonitor; +begin + Monitor := GetMonitor; + if Assigned(Monitor) then + Monitor.InternalCustomMessage(Connection, Msg, MessageID); +end; + +class function TCustomDASQLMonitor.GetParamDataType(Param: TDAParam): string; +begin + Result := FieldTypeNames[Param.DataType]; + if Param.DataType in [ftString,ftFixedChar,ftWideString] then + Result := Result + '[' + IntToStr(Length(Param.AsString)) + ']'; +end; + +class function TCustomDASQLMonitor.GetParamParamType(Param: TDAParam): string; +begin + case Param.ParamType of + ptInput: + Result := 'IN'; + ptOutput: + Result := 'OUT'; + ptInputOutput: + Result := 'IN/OUT'; + ptResult: + Result := 'RESULT'; + else + Result := ''; + end; +end; + +class function TCustomDASQLMonitor.GetParamValue(Param: TDAParam): string; +begin + Result := ''; + if Param.IsNull then + Result := '' + else + case Param.DataType of + ftDate: + Result := DateToStr(Param.AsDate); + ftDateTime: + Result := Param.AsString; + ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}: begin + Result := ''; + end; + ftCursor: + Result := ''; + ftString, ftFixedChar, ftWideString: + Result := '''' + Param.AsString + ''''; + ftBytes, ftVarBytes: + Result := '' + else + Result := Param.AsString; + end; +end; + +function ConcatWith(const Args: array of string; const AConcatWith: string): string; +var + i: integer; +begin + Result := ''; + for i := 0 to Length(Args)-1 do begin + if Args[i] <> '' then + if Result <> '' then + Result := Result + AConcatWith + Args[i] + else + Result := Args[i]; + end; +end; + +class function TCustomDASQLMonitor.GetParam(Param: TDAParam; var SQLParam: TSQLParam): string; +begin + SQLParam.Name := Param.Name; + SQLParam.DataType := GetParamDataType(Param); + SQLParam.ParamType := GetParamParamType(Param); + SQLParam.Value := GetParamValue(Param); + Result := ':' + Param.Name + '(' + ConcatWith([SQLParam.DataType, + SQLParam.ParamType],',') + ConcatWith([')', SQLParam.Value], '='); +end; + +class function TCustomDASQLMonitor.GetParams(Params: TDAParams; var SQLParams: TSQLParams): string; +var + i: integer; +begin + Result := ''; + if Params <> nil then begin + SetLength(SQLParams, Params.Count); + for i := 0 to Params.Count - 1 do + Result := Result + GetParam(Params[i], SQLParams[i]) + ' '#13#10; + end; +end; + +class function TCustomDASQLMonitor.GetParams(Params: TDAParams): string; +var + SQLParams: TSQLParams; +begin + Result := GetParams(Params, SQLParams); +end; + +class procedure TCustomDASQLMonitor.ShowDebug(Component: TComponent; + const SQL: string; Params: TDAParams; const Caption: string); +begin + if Assigned(ShowDebugFormProc) then + ShowDebugFormProc(Self, Component, SQL, Params, Caption); +end; + +class function TCustomDASQLMonitor.GetMonitor: TCustomDASQLMonitor; +begin + Result := nil; +end; + +class function TCustomDASQLMonitor.GetCaption: string; +begin + Result := 'DataAccess'; +end; + +function TCustomDASQLMonitor.GetCompHandle(Comp: TComponent): string; +var + Conn: TCustomDAConnection; +begin + if moHandled in Options then begin + Result := ' [' + Comp.Name + '$' + IntToHex(GetComponentID(Comp), 8); + + if Comp is TCustomDADataSet then + Conn := TCustomDADataSet(Comp).Connection + else + if Comp is TCustomDASQL then + Conn := TCustomDASQL(Comp).Connection + else + Conn := nil; + + if Conn <> nil then + Result := Result + '; ' + Conn.Name + '$' + IntToHex(GetComponentID(Conn), 8); + + Result := Result + '] '; + end + else + Result := ''; +end; + +function TCustomDASQLMonitor.GetParent(Component: TComponent; Index: integer): TComponent; +begin + if (Component is TCustomDASQL) then + Result := TCustomDASQL(Component).Connection + else + if (Component is TCustomDADataSet) then + Result := TCustomDADataSet(Component).Connection + else + Result := nil; +end; + +function TCustomDASQLMonitor.GetParentCount(Component: TComponent): integer; +begin + Result := 1; +end; + +procedure TCustomDASQLMonitor.InternalSQLPrepare(Component: TComponent; const SQL: string; Params: TDAParams; ATracePoint: TTracePoint; var MessageID: Cardinal); +var + ParamSt: string; + SQLParams: TSQLParams; + ASQL: string; +begin + CheckActive; + + if Active and (tfQPrepare in TraceFlags) then begin + if ((moDialog in Options) and (not((moCustom in Options) or (csDesigning in ComponentState)) or + ((Component is TCustomDADataSet) and TCustomDADataSet(Component).Debug or + (Component is TCustomDASQL) and TCustomDASQL(Component).Debug))) and + (ATracePoint = tpBeforeEvent) + then + ShowDebug(Component, SQL, Params, 'Prepare'); + + ParamSt := TrimRight(GetParams(Params, SQLParams)); + + if (moSQLMonitor in Options) and (ATracePoint <> tpAfterEvent) then begin + AddStatement('SQL Prepare' + GetCompHandle(Component) + ': ' + SQL); + if (ParamSt <> '') and (tfParams in TraceFlags) then + AddStatement(ParamSt); + end; + + OnPrepare(SQL, SQLParams, 'SQL Prepare' + GetCompHandle(Component) + ': ' + SQL + #13#10 + ParamSt, Component, ATracePoint, MessageID); + + if Assigned(FOnSQLEvent) and (ATracePoint <> tpAfterEvent) then begin + if ParamSt <> '' then + ASQL := SQL + #13#10 + ParamSt + else + ASQL := SQL; + FOnSQLEvent(Component, 'Prepare: ' + ASQL, tfQPrepare); + end; + end; +end; + +procedure TCustomDASQLMonitor.InternalSQLUnprepare(Component: TComponent; const SQL: string; Params: TDAParams; ATracePoint: TTracePoint; var MessageID: Cardinal); +var + ParamSt: string; + SQLParams: TSQLParams; + ASQL: string; +begin + CheckActive; + + if Active and (tfQPrepare in TraceFlags) then begin + if ((moDialog in Options) and (not ((moCustom in Options) or (csDesigning in ComponentState)) or + ((Component is TCustomDADataSet) and TCustomDADataSet(Component).Debug or + (Component is TCustomDASQL) and TCustomDASQL(Component).Debug))) and + (ATracePoint = tpBeforeEvent) + then + ShowDebug(Component, SQL, Params, 'Unprepare'); + + ParamSt := TrimRight(GetParams(Params, SQLParams)); + + if (moSQLMonitor in Options) then begin + AddStatement('SQL Unprepare' + GetCompHandle(Component) + ': ' + SQL); + if (ParamSt <> '') and (tfParams in TraceFlags) then + AddStatement(ParamSt); + end; + + OnUnprepare(SQL, SQLParams, 'SQL Unprepare' + GetCompHandle(Component) + ': ' + SQL + #13#10 + ParamSt, Component, ATracePoint, MessageID); + + if Assigned(FOnSQLEvent) and (ATracePoint <> tpAfterEvent) then begin + if ParamSt <> '' then + ASQL := SQL + #13#10 + ParamSt + else + ASQL := SQL; + FOnSQLEvent(Component, 'Unprepare: ' + ASQL, tfQPrepare); + end; + end; +end; + +procedure TCustomDASQLMonitor.InternalSQLExecute(Component:TComponent; const SQL: string; Params: TDAParams; const Caption: string; ATracePoint: TTracePoint; var MessageID: Cardinal); +var + ParamSt: string; + St: string; + SQLParams: TSQLParams; + ASQL: string; +begin + CheckActive; + + if Active and (tfQExecute in TraceFlags) then begin + if (moDialog in Options) and (not ((moCustom in Options) or (csDesigning in ComponentState)) or + ((Component is TCustomDADataSet) and TCustomDADataSet(Component).Debug or + (Component is TCustomDASQL) and TCustomDASQL(Component).Debug)) and + (ATracePoint = tpBeforeEvent) + then begin + if Caption = '' then + St := 'Execute' + else + St := Caption; + + ShowDebug(Component, SQL, Params, St); + end; + + ParamSt := TrimRight(GetParams(Params, SQLParams)); + + if (moSQLMonitor in Options) and (ATracePoint <> tpAfterEvent) then begin + St := 'SQL Execute'; + if Caption <> '' then + St := St + ' [' + Caption + ']'; + + AddStatement(St + GetCompHandle(Component) + ': '{#13#10} + SQL); + if (ParamSt <> '') and (tfParams in TraceFlags) then + AddStatement(ParamSt); + end; + + OnExecute(SQL, SQLParams, 'SQL Execute' + GetCompHandle(Component) + ': ' + SQL + #13#10 + ParamSt, Component, ATracePoint, MessageID); + + if Assigned(FOnSQLEvent) and (ATracePoint <> tpAfterEvent) then begin + if ParamSt <> '' then + ASQL := SQL + #13#10 + ParamSt + else + ASQL := SQL; + FOnSQLEvent(Component, ASQL, tfQExecute); + end; + end; +end; + +procedure TCustomDASQLMonitor.InternalDBConnect(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); +var + St: string; +begin + CheckActive; + + if Active and (tfConnect in TraceFlags) then begin + St := 'Connect: ' + Connection.Username + '@' + Connection.Server + GetCompHandle(Connection); + + if (moSQLMonitor in Options) and (ATracePoint <> tpAfterEvent) then + AddStatement(St); + + OnConnect(Connection.Username, Connection.Server, St, Connection, ATracePoint, MessageID); + + if Assigned(FOnSQLEvent) and (ATracePoint <> tpAfterEvent) then + FOnSQLEvent(Connection, St, tfConnect); + end; +end; + +procedure TCustomDASQLMonitor.InternalDBDisconnect(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); +var + St: string; +begin + CheckActive; + + if Active and (tfConnect in TraceFlags) then begin + St := 'Disconnect: ' + Connection.Username + '@' + Connection.Server + GetCompHandle(Connection); + + if (moSQLMonitor in Options) and (ATracePoint <> tpAfterEvent) then + AddStatement(St); + + OnDisconnect(Connection.Username, Connection.Server, St, Connection, ATracePoint, MessageID); + + if Assigned(FOnSQLEvent) and (ATracePoint <> tpAfterEvent) then + FOnSQLEvent(Connection, St, tfConnect); + end; +end; + +procedure TCustomDASQLMonitor.InternalTRStart(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); +var + St: string; +begin + CheckActive; + + if Active and (tfTransact in TraceFlags) then begin + St := 'Start: ' + Connection.Username + '@' + Connection.Server + GetCompHandle(Connection); + + if (moSQLMonitor in Options) and (ATracePoint <> tpAfterEvent) then + AddStatement(St); + + OnTransact(St, Connection, teStart, ATracePoint, MessageID); + + if Assigned(FOnSQLEvent) and (ATracePoint <> tpAfterEvent) then + FOnSQLEvent(Connection, St, tfTransact); + end; +end; + +procedure TCustomDASQLMonitor.InternalTRCommit(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); +var + St: string; +begin + CheckActive; + + if Active and (tfTransact in TraceFlags) then begin + St := 'Commit: ' + Connection.Username + '@' + Connection.Server + GetCompHandle(Connection); + + if (moSQLMonitor in Options) and (ATracePoint <> tpAfterEvent) then + AddStatement(St); + + OnTransact(St, Connection, teCommit, ATracePoint, MessageID); + + if Assigned(FOnSQLEvent) and (ATracePoint <> tpAfterEvent) then + FOnSQLEvent(Connection, St, tfTransact); + end; +end; + +procedure TCustomDASQLMonitor.InternalTRRollback(Connection: TCustomDAConnection; ATracePoint: TTracePoint; var MessageID: Cardinal); +var + St: string; +begin + CheckActive; + + if Active and (tfTransact in TraceFlags) then begin + St := 'Rollback: ' + Connection.Username + '@' + Connection.Server + GetCompHandle(Connection); + + if (moSQLMonitor in Options) and (ATracePoint <> tpAfterEvent) then + AddStatement(St); + + OnTransact(St, Connection, teRollback, ATracePoint, MessageID); + + if Assigned(FOnSQLEvent) and (ATracePoint <> tpAfterEvent) then + FOnSQLEvent(Connection, St, tfTransact); + end; +end; + +procedure TCustomDASQLMonitor.InternalDBError(Exception: EDAError); +var + St: string; +begin + CheckActive; + + if Active and (tfError in TraceFlags) then begin + St := 'Error: ' + Exception.Message; + + if (moSQLMonitor in Options) then + AddStatement(St); + + OnError(Exception.Message); + + if Assigned(FOnSQLEvent) then + FOnSQLEvent(Exception, St, tfError); + end; +end; + +procedure TCustomDASQLMonitor.InternalCustomMessage(Connection: TCustomDAConnection; + const Msg: string; var AMessageID: Cardinal); +begin + CheckActive; + + if Active and (tfMisc in TraceFlags) then begin + if (moSQLMonitor in Options) then + AddStatement(Msg); + + OnCustomMessage(Msg, Connection, tpBeforeEvent, AMessageID); + OnCustomMessage(Msg, Connection, tpAfterEvent, AMessageID); + + if Assigned(FOnSQLEvent) then + FOnSQLEvent(Connection, Msg, tfMisc); + end; +end; + +{ Borland's SQL Monitor support } + +procedure TCustomDASQLMonitor.RegisterClient; +{$IFDEF WIN32} +var + Title: string; +{$ENDIF} +begin +{$IFDEF WIN32} + if not FRegistered and (GetMonitor = Self) then + if Succeeded(CoInitialize(nil)) then begin + if not Succeeded(CoCreateInstance(Class_SMClient, nil, CLSCTX_INPROC_SERVER or + CLSCTX_LOCAL_SERVER, IUnknown, FSMClient)) + then begin + CoUninitialize; + Exit; + end; + + Title := ApplicationTitle; + if csDesigning in ComponentState then + Title := Title + ': ' + GetCaption; + try + (FSMClient as ISMClient).RegisterClient(Integer(Self), PChar(Title), Self, + @TCustomDASQLMonitor.SMClientSignal); + FRegistered := True; + except + end; + end; +{$ENDIF} +end; + +procedure TCustomDASQLMonitor.UnRegisterClient; +begin +{$IFDEF WIN32} + FSMClient := nil; + if FRegistered then begin + FRegistered := False; + CoUninitialize; + end; +{$ENDIF} +end; + +procedure TCustomDASQLMonitor.AddStatement(const St: string); +begin +{$IFDEF WIN32} + if Assigned(FSMClient) then + (FSMClient as ISMClient).AddStatement(PChar(St), Length(St)); +{$ENDIF} +end; + +{ 0 none + 1 Prepare + 2 Execute + 4 Error + 8 Statement + 16 Connect/Disconnect + 32 Transaction + 64 Blob + 128 Misc + 256 Vendor call + 512 Input params + 1024 Fetch} + +procedure TCustomDASQLMonitor.SMClientSignal(Sender: TObject; Data: Integer); +begin + FTraceFlags := TDATraceFlags(Word(Data)); +end; + +procedure TCustomDASQLMonitor.SetActive(Value: boolean); +begin + FStreamedActive := Value; + if not (csReading in ComponentState) and (Value <> FActive) then begin + FActive := Value; + + if moSQLMonitor in Options then + if FActive then + RegisterClient + else + UnRegisterClient; + {$IFDEF MSWINDOWS} + if moDBMonitor in Options then + if FActive then begin + {$IFDEF CLR} + FDBMonitor := GetDBMonitor; + if FDBMonitor <> nil then + FDBMonitor.SetCaption(GetCaption); + {$ELSE} + if not NeedUninitialize then + NeedUninitialize := Succeeded(CoInitialize(nil)); + FDBMonitor := GetDBMonitor; + if FDBMonitor <> nil then + FDBMonitor.SetCaption(PChar(GetCaption)); + {$ENDIF} + end + else begin + FDBMonitor := nil; + end; + {$ENDIF} + end; +end; + +procedure TCustomDASQLMonitor.SetOptions(Value: TMonitorOptions); +begin + FOptions := Value; + if FActive then begin + if moSQLMonitor in FOptions then + RegisterClient + else + UnRegisterClient; + +{$IFDEF WIN32} + if moDBMonitor in FOptions then begin + if not NeedUninitialize then + NeedUninitialize := Succeeded(CoInitialize(nil)); + FDBMonitor := GetDBMonitor; + if FDBMonitor <> nil then + FDBMonitor.SetCaption(PChar(GetCaption)); + end + else begin + FDBMonitor := nil; + end; +{$ENDIF} + end; +end; + +procedure TCustomDASQLMonitor.OnConnect(const Username, Server, St: string; + Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); +{$IFDEF MSWINDOWS} +var + Msg: TMonitorMessage; + ParamStr: string; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + if FDBMonitor <> nil then begin + with Msg do begin + MessageID := AMessageID; + EventType := Integer(etConnect); + TracePoint := Integer(ATracePoint); + ObjectID := GetComponentID(Component); + OwnerID := 0; + OwnerName := ''; + ParamStr := Format(fmtConnectInfo, [Username, Server]); + {$IFDEF CLR} + ObjectName := GetComponentName(Component); + Description := St; + FDBMonitor.OnEvent(Msg, ParamStr); + {$ELSE} + ObjectName := PChar(GetComponentName(Component)); + Description := PChar(St); + FDBMonitor.OnEvent(Msg, PChar(ParamStr)); + {$ENDIF} + end; + if ATracePoint = tpBeforeEvent then + AMessageID := Msg.MessageID; + end; +{$ENDIF} +end; + +procedure TCustomDASQLMonitor.OnDisconnect(const Username, Server, + St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); +{$IFDEF MSWINDOWS} +var + Msg: TMonitorMessage; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + if FDBMonitor <> nil then begin + with Msg do begin + MessageID := AMessageID; + EventType := Integer(etDisconnect); + TracePoint := Integer(ATracePoint); + ObjectID := GetComponentID(Component); + OwnerID := 0; + OwnerName := ''; + {$IFDEF CLR} + ObjectName := GetComponentName(Component); + Description := St; + FDBMonitor.OnEvent(Msg, ''); + {$ELSE} + ObjectName := PChar(GetComponentName(Component)); + Description := PChar(St); + FDBMonitor.OnEvent(Msg, nil); + {$ENDIF} + end; + if ATracePoint = tpBeforeEvent then + AMessageID := Msg.MessageID; + end; +{$ENDIF} +end; + +procedure TCustomDASQLMonitor.OnError(ErrorStr: string); +{$IFDEF MSWINDOWS} +var + Msg: TMonitorMessage; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + if FDBMonitor <> nil then begin + with Msg do begin + TracePoint := Integer(tpAfterEvent); + EventType := Integer(etError); + Description := ''; + end; + {$IFDEF CLR} + FDBMonitor.OnEvent(Msg, ErrorStr); + {$ELSE} + FDBMonitor.OnEvent(Msg, PChar(ErrorStr)); + {$ENDIF} + end; +{$ENDIF} +end; + +procedure TCustomDASQLMonitor.OnCustomMessage(const St: string; Component: TComponent; + ATracePoint: TTracePoint; var AMessageID: Cardinal); +{$IFDEF MSWINDOWS} +var + Msg: TMonitorMessage; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + if FDBMonitor <> nil then begin + with Msg do begin + MessageID := AMessageID; + EventType := Integer(etConnect); + TracePoint := Integer(ATracePoint); + ObjectID := GetComponentID(Component); + OwnerID := 0; + OwnerName := ''; + {$IFDEF CLR} + ObjectName := GetComponentName(Component); + Description := St; + FDBMonitor.OnEvent(Msg, ''); + {$ELSE} + ObjectName := PChar(GetComponentName(Component)); + Description := PChar(St); + FDBMonitor.OnEvent(Msg, nil); + {$ENDIF} + end; + if ATracePoint = tpBeforeEvent then + AMessageID := Msg.MessageID; + end; +{$ENDIF} +end; + +procedure TCustomDASQLMonitor.PrepareExecuteMessage(const SQL: string; var Params: TSQLParams; const St: string; + Component: TComponent; ATracePoint: TTracePoint; EventType: TEventType; var AMessageID: Cardinal); +{$IFDEF MSWINDOWS} +var + RowsAffected: integer; + Connection: TComponent; + Msg: TMonitorMessage; +{$IFNDEF CLR} + PParam: PSQLParam; +{$ENDIF} +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + if FDBMonitor <> nil then begin + RowsAffected := 0; + if (Component is TCustomDASQL) then + RowsAffected := TCustomDASQL(Component).RowsAffected + else + if (Component is TCustomDADataSet) then + RowsAffected := TCustomDADataSet(Component).RowsAffected; + Connection := GetParent(Component, 0); + with Msg do begin + MessageID := AMessageID; + EventType := Integer(etExecute); + TracePoint := Integer(ATracePoint); + ObjectID := GetComponentID(Component); + OwnerID := GetComponentID(Connection); + {$IFDEF CLR} + ObjectName := GetComponentName(Component); + if Connection <> nil then + OwnerName := GetComponentName(Connection) + else + OwnerName := ''; + Description := St; + FDBMonitor.OnExecute(Msg, SQL, Params, Length(Params), RowsAffected); + {$ELSE} + ObjectName := PChar(GetComponentName(Component)); + if Connection <> nil then + OwnerName := PChar(GetComponentName(Connection)) + else + OwnerName := ''; + Description := PChar(St); + PParam := nil; + if Length(Params) > 0 then + PParam := @Params[0]; + FDBMonitor.OnExecute(Msg, PChar(SQL), PParam, Length(Params), RowsAffected); + {$ENDIF} + end; + if ATracePoint = tpBeforeEvent then + AMessageID := Msg.MessageID; + end; +{$ENDIF} +end; + +procedure TCustomDASQLMonitor.OnExecute(const SQL: string; var Params: TSQLParams; + const St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); +begin + PrepareExecuteMessage(SQL, Params, St, Component, ATracePoint, etExecute, AMessageID); +end; + +procedure TCustomDASQLMonitor.OnPrepare(const SQL: string; var Params: TSQLParams; + const St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); +begin + PrepareExecuteMessage(SQL, Params, St, Component, ATracePoint, etPrepare, AMessageID); +end; + +procedure TCustomDASQLMonitor.OnUnprepare(const SQL: string; var Params: TSQLParams; const St: string; Component: TComponent; ATracePoint: TTracePoint; var AMessageID: Cardinal); +begin + PrepareExecuteMessage(SQL, Params, St, Component, ATracePoint, etPrepare, AMessageID); +end; + +procedure TCustomDASQLMonitor.OnTransact(const St: string; + Component: TComponent; TransactEvent: integer; ATracePoint: TTracePoint; var AMessageID: Cardinal); +{$IFDEF MSWINDOWS} +var + Msg: TMonitorMessage; + i: integer; + Parent: TComponent; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + if FDBMonitor <> nil then begin + with Msg do begin + MessageID := AMessageID; + case TransactEvent of + teCommit: + EventType := Integer(etCommit); + teRollback: + EventType := Integer(etRollback); + else + EventType := Integer(etMisc); + end; + TracePoint := Integer(ATracePoint); + ObjectID := GetComponentID(Component); + {$IFDEF CLR} + ObjectName := GetComponentName(Component); + Description := St; + {$ELSE} + ObjectName := PChar(GetComponentName(Component)); + Description := PChar(St); + {$ENDIF} + for i := 0 to GetParentCount(Component) - 1 do begin + Parent := GetParent(Component, i); + OwnerID := GetComponentID(Parent); + if Parent <> nil then + OwnerName := {$IFNDEF CLR}PChar{$ENDIF}(GetComponentName(Parent)) + else + OwnerName := ''; + {$IFDEF CLR} + FDBMonitor.OnEvent(Msg, ''); + {$ELSE} + FDBMonitor.OnEvent(Msg, nil) + {$ENDIF} + end; + end; + if ATracePoint = tpBeforeEvent then + AMessageID := Msg.MessageID; + end; +{$ENDIF} +end; + +class function TCustomDASQLMonitor.HasMonitor: boolean; +begin + Result := GetMonitor <> nil; +end; + +procedure TCustomDASQLMonitor.Loaded; +begin + inherited Loaded; + CheckActive; +end; + +procedure TCustomDASQLMonitor.CheckActive; +begin + Active := FStreamedActive; +end; + +initialization + ShowDebugFormProc := nil; +end. diff --git a/internal/4.10.0.10/1/Source/DAScript.pas b/internal/4.10.0.10/1/Source/DAScript.pas new file mode 100644 index 0000000..8121d2f --- /dev/null +++ b/internal/4.10.0.10/1/Source/DAScript.pas @@ -0,0 +1,961 @@ +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// DB Access +////////////////////////////////////////////////// +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DAScript; +{$ENDIF} + +interface + +uses + Classes, SysUtils, +{$IFDEF CLR} + System.Text, +{$ELSE} + CLRClasses, +{$ENDIF} + DB, CRParser, DBAccess; + +const + ST_UNKNOWN = 0; + ST_DELIMETER = 1; + ST_COMMENT = 2; + ST_SPECIFIC_SQL = $8000; + +type + TDAScript = class; + + TDAStatement = class(TCollectionItem) + protected + FOmit: boolean; + FStatementType: integer; + FStartPos: integer; + FEndPos: integer; + FStartLine: integer; + FEndLine: integer; + FStartOffset: integer; + FEndOffset: integer; + FParams: TDAParams; + + function GetSQL: string; + function GetScript: TDAScript; + function GetParams: TDAParams; + function CreateParams: TDAParams; + public + destructor Destroy; override; + property Script: TDAScript read GetScript; + property SQL: string read GetSQL; + property Omit: boolean read FOmit write FOmit; + + property StartPos: integer read FStartPos; + property EndPos: integer read FEndPos; + property StartLine: integer read FStartLine; + property EndLine: integer read FEndLine; + property StartOffset: integer read FStartOffset; + property EndOffset: integer read FEndOffset; + + property Params: TDAParams read GetParams; + + procedure Excecute; + end; + + TDAStatementClass = class of TDAStatement; + + TDAStatements = class(TCollection) + protected + FScript: TDAScript; + function GetItem(Index: Integer): TDAStatement; + function CreateStatement(StatementType: integer; Omit: boolean; StartPos, + EndPos, StartLine, EndLine, StartOffset, EndOffset: integer): TDAStatement; + public + constructor Create(ItemClass: TCollectionItemClass; Script: TDAScript); + property Items[Index: Integer]: TDAStatement read GetItem; default; + end; + + TDAStatementsClass = class of TDAStatements; + + TBeforeStatementExecuteEvent = procedure (Sender: TObject; var SQL: string; var Omit: boolean) of object; + TAfterStatementExecuteEvent = procedure (Sender: TObject; SQL: string) of object; + TErrorAction = (eaAbort, eaFail, eaException, eaContinue); + TOnErrorEvent = procedure (Sender: TObject; E: Exception; SQL: string; var Action: TErrorAction) of object; + + TDelimiterState = (dsNone, dsDelimiter, dsBlank, dsValue, dsSet); + + TDAScript = class (TComponent) + protected + FSQL: TStrings; + FSQLActual: boolean; + FStream: TStream; + FCommand: TCustomDASQL; + FMacros: TMacros; + FErrorOffset: integer; + FStartPos: integer; + FEndPos: integer; + FStartLine: integer; + FEndLine: integer; + FStartOffset: integer; + FEndOffset: integer; + FDataSource: TDataSource; + FBeforeExecute: TBeforeStatementExecuteEvent; + FAfterExecute: TAfterStatementExecuteEvent; + FOnError: TOnErrorEvent; + FParser: TParser; + FSQLParser: TParser; + FStmtOffset: integer; + FDesignCreate: boolean; + FCurrDelimiter: string; + FDelimiter: string; + FDelimiterState: TDelimiterState; + FSt: string; + FStatements: TDAStatements; + FCurrentStatementIdx: integer; + FStatementsPopulating: boolean; + + FUseOptimization: boolean; + FAllowOptimization: boolean; + FBuffer: StringBuilder; + + function GetConnection: TCustomDAConnection; + procedure SetConnection(Value: TCustomDAConnection); + procedure ValidateConnection(Value: TCustomDAConnection); virtual; + function GetParserClass: TParserClass; virtual; + function UsedConnection: TCustomDAConnection; virtual; + function GetSQLText(StartLine, EndLine, StartOffset, EndOffset, Length: integer): string; + procedure SetSQL(Value: TStrings); + procedure SQLChanged(Sender: TObject); + function GetDebug: boolean; + procedure SetDebug(Value: boolean); + procedure SetMacros(Value: TMacros); + function GetDataSet: TCustomDADataSet; + procedure SetDataSet(Value: TCustomDADataSet); + function GetParams: TDAParams; + procedure SetDelimiter(const Value: string); + function IsDelimiterStored: boolean; + function IsBlankEndsDelimeter: boolean; virtual; + procedure Loaded; override; + procedure DefineProperties(Filer: TFiler); override; + procedure ReadMacroData(Reader: TReader); + procedure WriteMacroData(Writer: TWriter); + procedure CheckLexem(Code: integer; var StatementType: integer; var Omit: boolean); virtual; + function GetReady(Code: integer): boolean; virtual; + procedure AssignTo(Dest: TPersistent); override; + function CreateParser(const Text: string): TParser; overload; virtual; + function CreateParser(Stream: TStream): TParser; overload; virtual; + function GetSQLParser(const Text: string): TParser; virtual; + function CreateCommand: TCustomDASQL; virtual; + procedure DoBeforeStatementExecute(var SQL: string; StatementType: integer; var Omit: boolean); virtual; + procedure DoAfterStatementExecute(var SQL: string; StatementType: integer); virtual; + procedure ExecuteStatement(SQL: string; StatementType: integer; var Omit: Boolean; out BreakExec: boolean; Params: TDAParams = nil); virtual; + procedure CreateStatement(StatementType: integer; Omit: boolean; StartPos, EndPos, + StartLine, EndLine, StartOffset, EndOffset: integer); virtual; + procedure CalculateErrorOffset(E: Exception); virtual; + + function CreateStatementsObject: TDAStatements; virtual; + function GetStatements: TDAStatements; + procedure Open(Stream: TStream); + procedure Close; + + function IsSpecificSQL(StatementType: integer): boolean; virtual; + function CanOptimize(const SQL: string; const StatementType: integer): boolean; virtual; // Must return True if statement may be concatenated with previous + procedure InternalExecute(const SQL: string; out BreakExec: boolean; Params: TDAParams = nil); // Sends SQL to server + procedure Flush(out BreakExec: boolean); + + property Params: TDAParams read GetParams; + property UseOptimization: boolean read FUseOptimization write FUseOptimization default False; + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + procedure Execute; virtual; + procedure ExecuteStream(Stream: TStream); + procedure ExecuteFile(const FileName: string); + function ExecuteNext: boolean; virtual; + procedure BreakExec; virtual; + function FindMacro(Name: string): TMacro; + function MacroByName(Name: string): TMacro; + function ErrorOffset: integer; + + property Connection: TCustomDAConnection read GetConnection write SetConnection; + property DataSet: TCustomDADataSet read GetDataSet write SetDataSet; + property StartPos: integer read FStartPos; + property EndPos: integer read FEndPos; + property StartLine: integer read FStartLine; + property EndLine: integer read FEndLine; + property StartOffset: integer read FStartOffset; + property EndOffset: integer read FEndOffset; + property Statements: TDAStatements read GetStatements; + published + property SQL: TStrings read FSQL write SetSQL; + property Debug: boolean read GetDebug write SetDebug default False; + property Delimiter: string read FDelimiter write FDelimiter stored IsDelimiterStored; + property Macros: TMacros read FMacros write SetMacros stored False; + property BeforeExecute: TBeforeStatementExecuteEvent read FBeforeExecute write FBeforeExecute; + property AfterExecute: TAfterStatementExecuteEvent read FAfterExecute write FAfterExecute; + property OnError: TOnErrorEvent read FOnError write FOnError; + end; + + TDAScriptUtils = class + public + class procedure SetDesignCreate(Obj: TDAScript; Value: boolean); + class function GetDesignCreate(Obj: TDAScript): boolean; + class procedure SetCommand(Obj: TDAScript; Command: TCustomDASQL); + class function GetCommand(Obj: TDAScript): TCustomDASQL; + class procedure Open(Obj: TDAScript; Stream: TStream); + class procedure Close(Obj: TDAScript); + class function UsedConnection(Obj: TDAScript): TCustomDAConnection; + end; + +implementation + +uses +{$IFNDEF VER6P} + MemData, +{$ENDIF} + DAConsts; + +{ TDAStatement } +destructor TDAStatement.Destroy; +begin + FParams.Free; + + inherited; +end; + +function TDAStatement.GetScript: TDAScript; +begin + Result := TDAStatements(Collection).FScript; +end; + +function TDAStatement.GetSQL: string; +begin + Result := Script.GetSQLText(FStartLine, FEndLine, FStartOffset, FEndOffset, FEndPos - FStartPos); +end; + +function TDAStatement.GetParams: TDAParams; +begin + if FParams = nil then begin + FParams := CreateParams; + TDBAccessUtils.ParseSQL(Script.FCommand, SQL, FParams); + end; + Result := FParams; +end; + +function TDAStatement.CreateParams: TDAParams; +begin + Result := TDBAccessUtils.CreateParamsObject(Script.FCommand); +end; + +procedure TDAStatement.Excecute; +var + BreakExec: boolean; +begin + Script.ExecuteStatement(GetSQL, FStatementType, FOmit, BreakExec, FParams); +end; + +{ TDAStatements } + +constructor TDAStatements.Create(ItemClass: TCollectionItemClass; Script: TDAScript); +begin + inherited Create(ItemClass); + + FScript := Script; +end; + +function TDAStatements.GetItem(Index: Integer): TDAStatement; +begin + Result := TDAStatement(inherited Items[Index]); +end; + +function TDAStatements.CreateStatement(StatementType: integer; Omit: boolean; StartPos, + EndPos, StartLine, EndLine, StartOffset, EndOffset: integer): TDAStatement; +begin + Result := Add as TDAStatement; + + Result.FOmit := Omit; + Result.FStartLine := StartLine; + Result.FEndLine := EndLine; + Result.FStartPos := StartPos; + Result.FEndPos := EndPos; + Result.FStartOffset := StartOffset; + Result.FEndOffset := EndOffset; + Result.FStatementType := StatementType; +end; + +{ TDAScript } + +constructor TDAScript.Create(Owner: TComponent); +begin + inherited Create(Owner); + FDataSource := TDataSource.Create(nil); + FSQL := TStringList.Create; + TStringList(FSQL).OnChange := SQLChanged; + FCommand := CreateCommand; + FMacros := TMacros.Create(nil); + FOnError := nil; + FErrorOffset := 0; + FDelimiter := ';'; + FCurrDelimiter := FDelimiter; + FCurrentStatementIdx := -1; + FSQLActual := True; + FBuffer := StringBuilder.Create; + FDesignCreate := csDesigning in ComponentState; +end; + +destructor TDAScript.Destroy; +begin + FParser.Free; + FMacros.Free; + FCommand.Free; + FSQL.Free; + FDataSource.Free; + FBuffer.Free; + FSQLParser.Free; + FStatements.Free; + + inherited; +end; + +procedure TDAScript.Loaded; +begin + inherited; + FDesignCreate := False; +end; + +procedure TDAScript.DefineProperties(Filer: TFiler); + function WriteMacros: boolean; + begin + if Filer.Ancestor <> nil then + Result := not FMacros.IsEqual(TDAScript(Filer.Ancestor).FMacros) + else + Result := FMacros.Count > 0; + end; +begin + inherited DefineProperties(Filer); + Filer.DefineProperty('MacroData', ReadMacroData, WriteMacroData, WriteMacros); +end; + +procedure TDAScript.ReadMacroData(Reader: TReader); +begin + Reader.ReadValue; + Reader.ReadCollection(FMacros); +end; + +procedure TDAScript.WriteMacroData(Writer: TWriter); +begin + Writer.WriteCollection(FMacros); +end; + +procedure TDAScript.Execute; +var + BreakExec: boolean; +begin + if not FStatementsPopulating then begin + if Assigned(DataSet) then begin + if TDBAccessUtils.UsedConnection(DataSet) = nil then + raise EDatabaseError.Create(SConnectionNotDefined); + DataSet.DisableControls; + TDBAccessUtils.InternalConnect(TDBAccessUtils.UsedConnection(DataSet)); + end + else begin + if TDBAccessUtils.UsedConnection(FCommand) = nil then + raise EDatabaseError.Create(SConnectionNotDefined); + TDBAccessUtils.InternalConnect(TDBAccessUtils.UsedConnection(FCommand)); + end; + end; + try + FAllowOptimization := True; + try + FCurrDelimiter := FDelimiter; + while ExecuteNext do; + Flush(BreakExec); + finally + FAllowOptimization := False; + end; + finally + if not FStatementsPopulating then begin + if Assigned(DataSet) then begin + DataSet.EnableControls; + TDBAccessUtils.InternalDisconnect(TDBAccessUtils.UsedConnection(DataSet)); + end + else + TDBAccessUtils.InternalDisconnect(TDBAccessUtils.UsedConnection(FCommand)); + end; + end; +end; + +procedure TDAScript.Open(Stream: TStream); +begin + Assert(FStream = nil); + FStream := Stream; +end; + +procedure TDAScript.Close; +begin + FStream := nil; +end; + +function TDAScript.CanOptimize(const SQL: string; const StatementType: integer): boolean; +begin + Result := FBuffer.Length + Length(SQL) < $FFFF; +end; + +function TDAScript.IsSpecificSQL(StatementType: integer): boolean; +begin + Result := StatementType = ST_SPECIFIC_SQL; +end; + +procedure TDAScript.InternalExecute(const SQL: string; out BreakExec: boolean; + Params: TDAParams = nil); // Sends SQL to server +var + i: Integer; + Action: TErrorAction; + MacrosDest: TMacros; + ParamsDest: TDAParams; +begin + if Assigned(DataSet) then begin + DataSet.SQL.Text := SQL; + ParamsDest := DataSet.Params; + MacrosDest := DataSet.Macros; + end + else begin + FCommand.SQL.Text := SQL; + ParamsDest := FCommand.Params; + MacrosDest := FCommand.Macros; + end; + + Assert(ParamsDest <> nil); + if Params <> nil then + ParamsDest.AssignValues(Params); + + Assert(MacrosDest <> nil); + for i := 0 to MacrosDest.Count - 1 do + MacrosDest[i].Assign(MacroByName(MacrosDest[i].Name)); + + try + if Assigned(DataSet) then + DataSet.Execute + else + FCommand.Execute; + + except + on EAbort do + raise; + on E: Exception do begin + CalculateErrorOffset(E); + Action := eaException; + if Assigned(FOnError) then + FOnError(Self, E, Trim(SQL), Action); + case Action of + eaAbort: + BreakExec := True; + eaFail: + raise; + eaException: + ApplicationHandleException(E); + end; + end; + end; +end; + +procedure TDAScript.Flush(out BreakExec: boolean); +begin + if FBuffer.Length <> 0 then // Flush + InternalExecute(FBuffer.ToString, BreakExec); + FBuffer.Length := 0; +end; + +procedure TDAScript.ExecuteStream(Stream: TStream); +begin + Open(Stream); + try + Execute; + finally + Close; + end; +end; + +procedure TDAScript.ExecuteFile(const FileName: string); +var + FileStream: TFileStream; +begin + FileStream := TFileStream.Create(FileName, fmOpenRead); + try + ExecuteStream(FileStream); + finally + FileStream.Free; + end; +end; + +function TDAScript.FindMacro(Name: string): TMacro; +begin + Result := FMacros.FindMacro(Name); +end; + +function TDAScript.MacroByName(Name: string): TMacro; +begin + Result := FMacros.MacroByName(Name); +end; + +function TDAScript.ErrorOffset: integer; +begin + Result := FErrorOffset; +end; + +function TDAScript.GetReady(Code: integer): boolean; +begin + Result := False; +end; + +procedure TDAScript.AssignTo(Dest: TPersistent); +begin + if Dest is TDAScript then begin + TDAScript(Dest).SetConnection(GetConnection); + TDAScript(Dest).SQL.Text := SQL.Text; + TDAScript(Dest).Debug := Debug; + TDAScript(Dest).Macros := Macros; + end + else + inherited; +end; + +function TDAScript.GetConnection: TCustomDAConnection; +begin + Result := FCommand.Connection; +end; + +procedure TDAScript.SetConnection(Value: TCustomDAConnection); +begin + FCommand.Connection := Value; + ValidateConnection(Value); +end; + +procedure TDAScript.ValidateConnection(Value: TCustomDAConnection); +begin +end; + +function TDAScript.UsedConnection: TCustomDAConnection; +begin + Result := TDBAccessUtils.UsedConnection(FCommand); +end; + +function TDAScript.GetSQLText(StartLine, EndLine, StartOffset, EndOffset, Length: integer): string; +var + SQL: StringBuilder; + i: integer; + SPos, EPos: integer; +begin + SQL := StringBuilder.Create(Length); + try + for i := StartLine to EndLine do begin + if i = StartLine then + SPos := StartOffset + 1 + else + SPos := 1; + if i = EndLine then + EPos := EndOffset + 1 + else + EPos := {$IFDEF CLR}Borland.Delphi.{$ENDIF}System.Length(FSQL[i]); + SQL.Append(Copy(FSQL[i], SPos, EPos - SPos + 1)); + if i <> EndLine then + SQL.Append(#$D#$A); + Result := SQL.ToString; + end; + finally + SQL.Free; + end; +end; + +procedure TDAScript.SetSQL(Value: TStrings); +begin + if FSQL.Text <> Value.Text then begin + FSQL.BeginUpdate; + try + FSQL.Assign(Value); + finally + FSQL.EndUpdate; + end; + end; +end; + +procedure TDAScript.SQLChanged(Sender: TObject); +begin + FMacros.Scan(FSQL.Text); + BreakExec; + FStatements.Free; + FStatements := nil; + FSQLActual := True; +end; + +function TDAScript.GetDebug: boolean; +begin + Result := FCommand.Debug; +end; + +procedure TDAScript.SetDebug(Value: boolean); +begin + FCommand.Debug := Value; +end; + +procedure TDAScript.SetMacros(Value: TMacros); +begin + FMacros.Assign(Value); +end; + +function TDAScript.GetDataSet: TCustomDADataSet; +begin + Result := FDataSource.DataSet as TCustomDADataSet; +end; + +procedure TDAScript.SetDataSet(Value: TCustomDADataSet); +begin + FDataSource.DataSet := Value; +end; + +procedure TDAScript.BreakExec; +begin + FParser.Free; + FParser := nil; + FStmtOffset := 0; + FStartPos := 0; + FStartLine := 0; + FEndPos := 0; + FEndLine := 0; +end; + +function TDAScript.CreateParser(const Text: string): TParser; +begin + Result := GetParserClass.Create(Text); +end; + +function TDAScript.CreateParser(Stream: TStream): TParser; +begin + Result := GetParserClass.Create(Stream); +end; + +function TDAScript.GetSQLParser(const Text: string): TParser; +begin + if FSQLParser = nil then begin + FSQLParser := TParser(CreateParser(Text)); + FSQLParser.OmitBlank := False; + FSQLParser.Uppered := False; + end + else + FSQLParser.SetText(Text); + Result := FSQLParser; +end; + +function TDAScript.CreateCommand: TCustomDASQL; +begin + Result := TCustomDASQL.Create(nil); +end; + +procedure TDAScript.CalculateErrorOffset(E: Exception); +begin + FErrorOffset := FStmtOffset; +end; + +function TDAScript.CreateStatementsObject: TDAStatements; +begin + Result := TDAStatements.Create(TDAStatement, Self); +end; + +function TDAScript.GetStatements: TDAStatements; +begin + if FStatements = nil then begin + FStatements := CreateStatementsObject; + FStatementsPopulating := True; + try + Execute; + finally + FStatementsPopulating := False; + end; + end; + Result := FStatements; +end; + +procedure TDAScript.DoBeforeStatementExecute(var SQL: string; StatementType: integer; var Omit: boolean); +begin +end; + +procedure TDAScript.DoAfterStatementExecute(var SQL: string; StatementType: integer); +begin +end; + +procedure TDAScript.CreateStatement(StatementType: integer; Omit: boolean; StartPos, + EndPos, StartLine, EndLine, StartOffset, EndOffset: integer); +begin + FStatements.CreateStatement(StatementType, Omit, StartPos, EndPos, + StartLine, EndLine, StartOffset, EndOffset); +end; + +procedure TDAScript.ExecuteStatement(SQL: string; StatementType: integer; + var Omit: Boolean; out BreakExec: boolean; Params: TDAParams = nil); +begin + BreakExec := False; + if FStatementsPopulating then + CreateStatement(StatementType, False, StartPos, EndPos, StartLine, + EndLine, StartOffset, EndOffset) + else + begin + if SQL = '' then + Exit; + if Assigned(FBeforeExecute) then + FBeforeExecute(Self, SQL, Omit); + DoBeforeStatementExecute(SQL, StatementType, Omit); + if not Omit then begin + try + if not (UseOptimization and FAllowOptimization) then + InternalExecute(SQL, BreakExec, Params) + else + begin + if not CanOptimize(SQL, StatementType) then + Flush(BreakExec); + if FBuffer.Length <> 0 then begin + FBuffer.Append(Delimiter); + FBuffer.Append(#$D#$A); + end; + FBuffer.Append(SQL); + end; + finally + DoAfterStatementExecute(SQL, StatementType); + end; + if Assigned(FAfterExecute) then + FAfterExecute(Self, SQL); + end; + end; +end; + +function TDAScript.ExecuteNext: boolean; +var + SQL: StringBuilder; + PrevSt, s: string; + Code: integer; + Ready: boolean; + NewDelimiter: string; + BreakExecution: boolean; + StatementType: integer; + Omit: boolean; + OldDebug: boolean; + CurrentStatement: TDAStatement; +begin + Result := False; + + if not FStatementsPopulating and (FStatements <> nil) and (FStream = nil) then begin + if (FStatements.Count > 0) then begin + if FCurrentStatementIdx = -1 then + FCurrentStatementIdx := 0; + if FCurrentStatementIdx <= FStatements.Count - 1 then begin + try + CurrentStatement := FStatements[FCurrentStatementIdx]; + Omit := CurrentStatement.Omit; + ExecuteStatement(CurrentStatement.SQL, CurrentStatement.FStatementType, Omit, BreakExecution, CurrentStatement.FParams); + Result := not BreakExecution; + finally + Inc(FCurrentStatementIdx); + end; + end + else + FCurrentStatementIdx := -1; + end; + end + else begin + if FParser = nil then begin + if FStream <> nil then + FParser := CreateParser(FStream) + else + FParser := CreateParser(TrimRight(FSQL.Text)); + + FParser.OmitBlank := False; + FParser.Uppered := False; + FParser.QuotedString := True; + FParser.AdvancedStringParsing := True; + end; + + SQL := nil; + StatementType := ST_UNKNOWN; + Omit := False; + FDelimiterState := dsNone; + NewDelimiter := ''; + PrevSt := ''; + FErrorOffset := 0; + Code := 0; + FStartPos := FParser.CurrPos; + FStartLine := FParser.CurrLine; + FStartOffset := FParser.CurrCol; + OldDebug := False; + if Assigned(DataSet) then begin + OldDebug := DataSet.Debug; + DataSet.Debug := Debug; + end; + try + SQL := StringBuilder.Create; + repeat + if (Code <> lcBlank) and (Code <> lcComment) then + PrevSt := FSt; + Code := FParser.GetNext(FSt); + if (FDelimiterState = dsBlank) and (Code <> lcBlank) then + FDelimiterState := dsValue; + if FDelimiterState = dsValue then begin + if (FSt <> FCurrDelimiter) then begin + if (Code <> lcBlank) and (Code <> lcEnd) then + NewDelimiter := NewDelimiter + FSt + else + if IsBlankEndsDelimeter then + FDelimiterState := dsSet; + end + else + FDelimiterState := dsSet; + end; + if (FDelimiterState = dsDelimiter) and (Code = lcBlank) then + FDelimiterState := dsBlank; + Ready := (FDelimiterState = dsSet) or (Code = lcEnd) or GetReady(Code); + if not Ready and (Code <> lcString) then + if FCurrDelimiter = FDelimiter{';'} {old mode} then + Ready := ((FSt = FDelimiter) and not IsSpecificSQL(StatementType)) or + ((FSt = '/') and (FParser.PrevCol = 0)) + else begin + Ready := (FSt = FCurrDelimiter) or ((FCurrDelimiter = '//') and (FSt = '/') and (PrevSt = '/')); + if not Ready and (Length(FCurrDelimiter) = 2) then + Ready := ((PrevSt = FCurrDelimiter[1]) and (FSt = FCurrDelimiter[2])); + end; + if Ready then begin + s := SQL.ToString; + if (Code <> lcEnd) and (Length(FCurrDelimiter) > 1) then + s := Copy(s, 1, Length(s) - Length(FCurrDelimiter) + 1); + + Ready := (Trim(s) <> '') or GetReady(Code); + end; + if Ready then begin + // Execution + Omit := (FDelimiterState = dsSet) or Omit; + if FDelimiterState = dsSet then begin + // DelimiterState := dsNone; + FCurrDelimiter := NewDelimiter; + end; + ExecuteStatement(s, StatementType, Omit, BreakExecution); + if not Omit and BreakExecution then + break; + FStmtOffset := FParser.CurrPos; + FStartPos := FParser.CurrPos; + FStartLine := FParser.CurrLine; + FStartOffset := FParser.CurrCol; + Result := True; + break; + end + else begin + CheckLexem(Code, StatementType, Omit); + if not ((FSt = '/') and (FParser.PrevCol = 0)) or (FCurrDelimiter <> FDelimiter{';'}) then + if (Code = lcString) or (Code <> lcBlank) or (SQL.Length <> 0) then begin + SQL.Append(FSt); + + FEndPos := FParser.CurrPos - 1; + FEndLine := FParser.CurrLine; + FEndOffset := FParser.CurrCol - 1; + end + else begin + Inc(FStmtOffset, Length(FSt)); + //to correct start position + FStartLine := FParser.CurrLine; + FStartPos := FParser.CurrPos; + FStartOffset := FParser.CurrCol; + end; + end; + until Code = lcEnd; + if not Result then begin + FParser.Free; + FParser := nil; + end; + finally + SQL.Free; + if Assigned(DataSet) then begin + DataSet.Debug := OldDebug; + end; + end; + end; +end; + +procedure TDAScript.SetDelimiter(const Value: string); +begin + FDelimiter := Value; + FCurrDelimiter := FDelimiter; + FDelimiterState := dsNone; +end; + +procedure TDAScript.CheckLexem(Code: integer; var StatementType: integer; var Omit: boolean); +begin + if (Code = lcComment) and (StatementType = ST_UNKNOWN) then + StatementType := ST_COMMENT + else + if (StatementType = ST_COMMENT) and (Code <> lcComment) and + (Code <> lcBlank) then + StatementType := ST_UNKNOWN; +end; + +function TDAScript.GetParams: TDAParams; +begin + if Assigned(DataSet) then + Result := DataSet.Params + else + Result := FCommand.Params; +end; + +function TDAScript.IsDelimiterStored: boolean; +begin + Result := FDelimiter <> ';'; +end; + +function TDAScript.IsBlankEndsDelimeter: boolean; +begin + //This function determine if lxBlank ends delimeter settings + Result := False; +end; + +function TDAScript.GetParserClass: TParserClass; +begin + Result := nil; + Assert(False, 'Should be overriden'); +end; + +{ TDAScriptUtils } + +class procedure TDAScriptUtils.SetDesignCreate(Obj: TDAScript; Value: boolean); +begin + Obj.FDesignCreate := Value; +end; + +class function TDAScriptUtils.GetDesignCreate(Obj: TDAScript): boolean; +begin + Result := Obj.FDesignCreate; +end; + +class procedure TDAScriptUtils.SetCommand(Obj: TDAScript; Command: TCustomDASQL); +begin + Obj.FCommand := Command; +end; + +class function TDAScriptUtils.GetCommand(Obj: TDAScript): TCustomDASQL; +begin + Result := Obj.FCommand; +end; + +class procedure TDAScriptUtils.Open(Obj: TDAScript; Stream: TStream); +begin + Obj.Open(Stream); +end; + +class procedure TDAScriptUtils.Close(Obj: TDAScript); +begin + Obj.Close; +end; + +class function TDAScriptUtils.UsedConnection(Obj: TDAScript): TCustomDAConnection; +begin + Result := Obj.UsedConnection; +end; + +end. + diff --git a/internal/4.10.0.10/1/Source/DAVersionInfo.pas b/internal/4.10.0.10/1/Source/DAVersionInfo.pas new file mode 100644 index 0000000..c176f8a --- /dev/null +++ b/internal/4.10.0.10/1/Source/DAVersionInfo.pas @@ -0,0 +1,44 @@ +unit DAVersionInfo; + +interface + +uses Windows; + +{$I DacVer.inc} + +type + custvalget = function ( Name: PChar; Value: PChar ): PChar; stdcall; + custvalset = procedure ( Name: PChar; Value: PChar ); stdcall; + + pscustparam = ^scustparam; + scustparam = packed record + valget: custvalget; // Function getting value of macros + valset: custvalset; // Function changing value of macros + hinst: THandle; // HINSTANCE setuo executable file + hwnd: THandle; // Handle of the current opened window + result: byte; // You must assign result value. See below + end; + +const + crCustomExit = 0; // Exit from setup + crCustomOK = 1; // Continue next command + crCustomNext = 2; // Next command or open next Dialog Window + crCustomPrev = 3; // Previous Dialog Window + + procedure GetVersion(Param: Pscustparam); stdcall; export; + +implementation + +procedure GetVersion(Param: Pscustparam); stdcall; export; +var + Version: string; +begin + Version := '[' + DACVersion + ']'; + Param.valset('#DACVERSION#', PChar(Version)); + Param.result := crCustomOK; +end; + +exports + GetVersion name 'GetVersion'; + +end. diff --git a/internal/4.10.0.10/1/Source/DBAccess.pas b/internal/4.10.0.10/1/Source/DBAccess.pas new file mode 100644 index 0000000..909be3f --- /dev/null +++ b/internal/4.10.0.10/1/Source/DBAccess.pas @@ -0,0 +1,11171 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// DB Access +// Created: 01.07.00 +////////////////////////////////////////////////// + +{$J+} +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DBAccess; +{$ENDIF} +interface +uses + SysUtils, Classes, DB, MemData, MemDS, CRAccess, CRParser, TypInfo, MemUtils, +{$IFDEF VER6P}Variants, SqlTimSt,{$ENDIF} +{$IFDEF MSWINDOWS} + Windows, Registry, +{$IFDEF CLR} + ExtCtrls, System.XML, +{$ELSE} + Win32Timer, +{$ENDIF} +{$ENDIF} +{$IFDEF CLR} + System.Runtime.InteropServices, System.Text, Contnrs, +{$ELSE} + CLRClasses, CRXml, +{$ENDIF} + SyncObjs; + +const + OperationsStackDelta = 50; + +type + TCustomDAConnection = class; + TCustomDASQL = class; + TCustomDADataSet = class; + TCustomDASQLClass = class of TCustomDASQL; + TCustomDADataSetClass = class of TCustomDADataSet; + TCustomDAUpdateSQL = class; + TMacro = class; + TMacros = class; + TCustomConnectDialog = class; + TConnectDialogClass = class of TCustomConnectDialog; + + TCRConnectionClass = class of TCRConnection; + TCRCommandClass = class of TCRCommand; + TCRRecordSetClass = class of TCRRecordSet; + +{ EDAError } + + EDAError = class (EDatabaseError) + protected + FErrorCode: integer; + FComponent: TObject; + public + constructor Create(ErrorCode: integer; Msg: string); + + property ErrorCode: integer read FErrorCode; + property Component: TObject read FComponent write FComponent; + end; + +{ TCustomDAConnection } + TRetryMode = (rmRaise, rmReconnect, rmReconnectExecute); + + TFailOverOperation = record + Operation: TConnLostCause; + AllowFailOver: boolean; + end; + TOperationsStack = array of TFailOverOperation;// executed operations stack used to track dowm connection lost cause + + TDAConnectionErrorEvent = procedure (Sender: TObject; E: EDAError; var Fail: boolean) of object; + TConnectionLostEvent = procedure (Sender: TObject; Component: TComponent; ConnLostCause: TConnLostCause; + var RetryMode: TRetryMode) of object; + + TDAConnectionOptions = class (TPersistent) + protected + FKeepDesignConnected: boolean; + FOwner: TCustomDAConnection; + FDisconnectedMode: boolean; + FLocalFailover: boolean; + + procedure SetDisconnectedMode(Value: boolean); virtual; + procedure AssignTo(Dest: TPersistent); override; + + public + constructor Create(Owner: TCustomDAConnection); + + property DisconnectedMode: boolean read FDisconnectedMode write SetDisconnectedMode default False; + property KeepDesignConnected: boolean read FKeepDesignConnected write FKeepDesignConnected default True; + property LocalFailover: boolean read FLocalFailover write FLocalFailover default False; + end; + + TPoolingOptions = class(TPersistent) + protected + FOwner: TCustomDAConnection; + FMaxPoolSize: integer; + FMinPoolSize: integer; + FConnectionLifetime: integer; + FValidate: boolean; + + procedure AssignTo(Dest: TPersistent); override; + + public + constructor Create(Owner: TCustomDAConnection); virtual; + + published + property MaxPoolSize: integer read FMaxPoolSize write FMaxPoolSize default 100; + property MinPoolSize: integer read FMinPoolSize write FMinPoolSize default 0; + property ConnectionLifetime: integer read FConnectionLifetime write FConnectionLifetime default 0; + property Validate: boolean read FValidate write FValidate default False; + end; + + TCustomDAConnection = class (TCustomConnection) + private + FUsername: string; + FAutoCommit: boolean; + FInProcessError: boolean; + FConnectDialog: TCustomConnectDialog; + + FOnError: TDAConnectionErrorEvent; + FConvertEOL: boolean; + + FOptions: TDAConnectionOptions; + FPoolingOptions: TPoolingOptions; + FPooling: boolean; + FOnConnectionLost: TConnectionLostEvent; + hRegisterClient: TCriticalSection; + + procedure ClearRefs; + + procedure SetUsername(const Value: string); + procedure SetPassword(const Value: string); + procedure SetAutoCommit(Value: boolean); + procedure SetConnectDialog(Value: TCustomConnectDialog); + procedure SetPooling(Value: boolean); + + procedure DoAfterConnect; + protected + FConnectCount: integer; + FSQLs: TDAList; + FIConnection: TCRConnection; + FStreamedConnected: boolean; + FServer: string; + FPassword: string; + FTransactionID: string; + FShouldShowPrompt: boolean; //Disconnect mode flag that allow to avoid unnecessary Login porompt showing + FOperationsStack: TOperationsStack ; //FailOver support + FOperationsStackLen: integer; + + function GetTransactionID: string; virtual; + + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + + function GetIConnectionClass: TCRConnectionClass; virtual; + function GetICommandClass: TCRCommandClass; virtual; + function GetIRecordSetClass: TCRRecordSetClass; virtual; + + procedure CreateIConnection; virtual; + function CreateICommand: TCRCommand; + function CreateIRecordSet: TCRRecordSet; + procedure FreeIConnection; + procedure SetIConnection(Value: TCRConnection); virtual; + + procedure Loaded; override; + + procedure RegisterClient(Client: TObject; Event: TConnectChangeEvent = nil); override; + procedure UnRegisterClient(Client: TObject); override; + + function SQLMonitorClass: TClass; virtual; // TDASQLMonitorClass + function ConnectDialogClass: TConnectDialogClass; virtual; + + procedure DoConnect; override; + procedure DoDisconnect; override; + function CommitOnDisconnect: boolean; virtual; + procedure InternalConnect; virtual; + procedure InternalDisconnect; virtual; + + function IsConnectedStored: boolean; virtual; + function NeedPrompt: boolean; virtual; + //Operations stack functionality + function PushOperation(Operation: TConnLostCause; AllowFailOver: boolean = true): integer; virtual; + function PopOperation: TConnLostCause; virtual; + + function IsFatalError(E: EDAError): boolean; virtual; + procedure ResetOnFatalError; virtual; + procedure RestoreAfterFailOver; virtual; + function DetectConnLostCause(Component: TObject): TConnLostCause; virtual; + procedure DoError(E: Exception; var Fail, Reconnect, Reexecute: boolean; ReconnectAttempt: integer; + var ConnLostCause: TConnLostCause); virtual; + function IsKeyViolation(E: EDAError): boolean; virtual; + + procedure AssignTo(Dest: TPersistent); override; + + function GetConnected: boolean; override; + procedure SetConnected(Value: boolean); override; + function GetConnectString: string; virtual; + procedure SetConnectString(Value: string); virtual; + procedure SetServer(const Value: string); virtual; + + procedure SuppressAutoCommit; + procedure RestoreAutoCommit; + function GetInTransaction: boolean; virtual; + procedure SetConvertEOL(Value: boolean); + + { Transaction control } + procedure InternalStartTransaction; virtual; + + function CreateOptions: TDAConnectionOptions; virtual; + procedure SetOptions(Value: TDAConnectionOptions); + function CreatePoolingOptions: TPoolingOptions; virtual; + procedure SetPoolingOptions(Value: TPoolingOptions); + + function IsCaseSensitive: boolean; virtual; + + property AutoCommit: boolean read FAutoCommit write SetAutoCommit default True; + property ConnectString: string read GetConnectString write SetConnectString stored False; + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + + procedure Connect; + procedure Disconnect; + procedure PerformConnect(Retry: boolean = False); + + function ExecSQL(Text: string; const Params: array of variant): variant; virtual; abstract; + + procedure GetTableNames(List: TStrings); virtual; + procedure GetDatabaseNames(List: TStrings); virtual; + procedure GetStoredProcNames(List: TStrings); virtual; + + { Transaction control } + procedure StartTransaction; virtual; + procedure Commit; virtual; + procedure Rollback; virtual; + + procedure ApplyUpdates; overload; virtual; + procedure ApplyUpdates(DataSets: array of TCustomDADataSet); overload; virtual; + + function CreateDataSet: TCustomDADataSet; virtual; + function CreateSQL: TCustomDASQL; virtual; + + procedure RemoveFromPool; + procedure MonitorMessage(const Msg: string); + + property Username: string read FUsername write SetUsername; + property Password: string read FPassword write SetPassword; + property Server: string read FServer write SetServer; + property InTransaction: boolean read GetInTransaction; + property ConnectDialog: TCustomConnectDialog read FConnectDialog write SetConnectDialog; + + property OnError: TDAConnectionErrorEvent read FOnError write FOnError; + property OnConnectionLost: TConnectionLostEvent read FOnConnectionLost write FOnConnectionLost; + + property LoginPrompt default True; + property ConvertEOL: boolean read FConvertEOL write SetConvertEOL default False; + + property Options: TDAConnectionOptions read FOptions write SetOptions; + property PoolingOptions: TPoolingOptions read FPoolingOptions write SetPoolingOptions; + property Pooling: boolean read FPooling write SetPooling default False; + + end; + +{ TDAParam } + TDAParams = class; + + TDAParamInfoClass = class of TDAParamInfo; + TDAParamInfo = class(TCollectionItem) + protected + FField: TField; + FOld: boolean; + FParamIndex: integer; + public + property Field: TField read FField write FField; + property Old: boolean read FOld write FOld; + property ParamIndex: integer read FParamIndex write FParamIndex; + end; + + TDAParamsInfo = class(TCollection) + protected + function GetItem(Index: Integer): TDAParamInfo; + procedure SetItem(Index: Integer; Value: TDAParamInfo); + public + property Items[Index: Integer]: TDAParamInfo read GetItem write SetItem; default; + end; + + TDAParam = class (TParam) + private + FSize: integer; + + function IsDataTypeStored: boolean; + function IsValueStored: boolean; + + procedure SetParamObject(Value: TSharedObject); + + protected + FParamObject: TSharedObject; + + function IsObjectDataType(DataType: TFieldType): boolean; overload; virtual; + function IsObjectDataType: boolean; overload; + function IsBlobDataType: boolean; virtual; + function GetDataType: TFieldType; virtual; + procedure SetDataType(Value: TFieldType); virtual; + + function GetSize: integer; virtual; + procedure SetSize(Value: integer); virtual; + + function GetAsString: string; virtual; + procedure SetAsString(Value: string); virtual; + + function GetAsWideString: WideString; virtual; + procedure SetAsWideString(Value: WideString); virtual; + + function GetAsInteger: integer; virtual; + procedure SetAsInteger(Value: integer); virtual; + + function GetAsFloat: double; virtual; + procedure SetAsFloat(Value: double); virtual; + + procedure SetAsBlob(Value: TBlobData); virtual; + + procedure SetAsMemo(Value: string); virtual; + + function GetAsBlobRef: TBlob; virtual; + procedure SetAsBlobRef(const Value: TBlob); virtual; + + function GetAsMemoRef: TBlob; virtual; + procedure SetAsMemoRef(const Value: TBlob); virtual; + + function GetAsVariant: variant; virtual; + procedure SetAsVariant(const Value: variant); virtual; + + {$IFDEF VER6P} + function GetAsSQLTimeStamp: TSQLTimeStamp; virtual; + procedure SetAsSQLTimeStamp(const Value: TSQLTimeStamp); virtual; + {$ENDIF} + + procedure SetText(const Value: string); virtual; + + function GetIsNull: boolean; virtual; + + procedure DefineProperties(Filer: TFiler); override; + procedure ReadExtDataType(Reader: TReader); + procedure WriteExtDataType(Writer: TWriter); + + procedure CreateObject; virtual; + procedure FreeObject; virtual; + + procedure AssignParam(Param: TParam); + procedure AssignTo(Dest: TPersistent); override; + + property ParamObject: TSharedObject read FParamObject write SetParamObject; + + public + destructor Destroy; override; + + procedure Clear; virtual; + + procedure Assign(Source: TPersistent); override; + procedure AssignField(Field: TField); + procedure AssignFieldValue(Field: TField; const Value: Variant); virtual; + + procedure LoadFromFile(const FileName: string; BlobType: TBlobType); + procedure LoadFromStream(Stream: TStream; BlobType: TBlobType); virtual; + procedure SetBlobData(Buffer: TBytes; Size: Integer); overload; + procedure SetBlobData(Buffer: TValueBuffer); overload; + + property AsString: TBlobData read GetAsString write SetAsString; + property AsWideString: WideString read GetAsWideString write SetAsWideString; + property AsInteger: integer read GetAsInteger write SetAsInteger; + property AsFloat: double read GetAsFloat write SetAsFloat; + property AsBlob: TBlobData read GetAsString write SetAsBlob; + property AsMemo: string read GetAsString write SetAsMemo; + property AsBlobRef: TBlob read GetAsBlobRef write SetAsBlobRef; + property AsMemoRef: TBlob read GetAsMemoRef write SetAsMemoRef; + {$IFDEF VER6P} + property AsSQLTimeStamp: TSQLTimeStamp read GetAsSQLTimeStamp write SetAsSQLTimeStamp; + {$ENDIF} + property IsNull: boolean read GetIsNull; + property Text: string read GetAsString write SetText; + + published + property DataType: TFieldType read GetDataType write SetDataType stored IsDataTypeStored; + property ParamType default DB.ptUnknown; + property Size: integer read GetSize write SetSize default 0; + property Value: variant read GetAsVariant write SetAsVariant stored IsValueStored; + end; + +{ TDAParams } + + TDAParams = class (TParams) + private + function GetItem(Index: integer): TDAParam; + procedure SetItem(Index: integer; Value: TDAParam); + + protected + FOwner: TPersistent; + FNeedsUpdateItem: boolean; + procedure Update(Item: TCollectionItem); override; + + public + constructor Create(Owner: TPersistent); overload; + + function ParamByName(const Value: string): TDAParam; + function FindParam(const Value: string): TDAParam; + function CreateParam(FldType: TFieldType; const ParamName: string; + ParamType: TParamType): TDAParam; + property Items[Index: integer]: TDAParam read GetItem write SetItem; default; + end; + +{ TDADetailDataLink } + + TDADetailDataLink = class (TDetailDataLink) + private + FDataSet: TCustomDADataSet; + + protected + procedure ActiveChanged; override; + procedure RecordChanged(Field: TField); override; + procedure CheckBrowseMode; override; + + function GetDetailDataSet: TDataSet; override; + + public + constructor Create(DataSet: TCustomDADataSet); + end; + +{ TDASQLGenerator } + + TFieldArray = array of TField; + TFieldDescArray = array of TCRFieldDesc; + TKeyAndDataFields = record + KeyFieldDescs: TFieldDescArray; + DataFieldDescs: TFieldDescArray; + end; + + TStatementType = (stQuery, stInsert, stUpdate, stDelete, stLock, stRefresh, + stCheck, stCustom, stRefreshQuick, stRefreshCheckDeleted, stBatchUpdate); + TStatementTypes = set of TStatementType; + + TDASQLGenerator = class + protected + FOwner: TCustomDADataSet; + + // stInsert stUpdate stDelete stRefresh + FHeaderSB, // INSERT INTO Tbl( UPDATE Tbl SET DELETE FROM Tbl WHERE SELECT + FFldSB, // f1, f2, f3, ... f1 = :p1, f2 = :p2, ... f1, f2, f3, ... + FMiddleSB, // ) VALUES ( WHERE FROM Tbl WHERE + FFldParamSB, // :p1, :p2, :p3, ... + FCondSB, // f0 = :p0 f0 = :p0 f0 = :p0 + FFooterSB: StringBuilder; // ) + FOldRecBuf, FNewRecBuf: IntPtr; + FParams: TDAParams; + FParamsInfo: TDAParamsInfo; + FTableInfo: TCRTableInfo; + + procedure Clear; virtual; + function AssembleSB(const StatementType: TStatementType): string; virtual; + function Data: TData; + function OldRecBuf: IntPtr; + function NewRecBuf: IntPtr; + + function IsBlobDataType(DataType: word): boolean; virtual; + function IsObjectDataType(DataType: word): boolean; virtual; + + function FieldIsNull(FieldDesc: TCRFieldDesc; OldValue: boolean; Data: TData; OldRecBuf, NewRecBuf: IntPtr): boolean; overload; virtual; + function FieldIsNull(FieldDesc: TCRFieldDesc; OldValue: boolean): boolean; overload; virtual; + + function FieldModified(FieldDesc: TCRFieldDesc; Data: TData; OldRecBuf, NewRecBuf: IntPtr): boolean; overload; virtual; + function FieldModified(FieldDesc: TCRFieldDesc): boolean; overload; virtual; + + function GetActualFieldNameEx(FieldDesc: TCRFieldDesc; TableInfo: TCRTableInfo): string; virtual; + function GetActualFieldName(FieldDesc: TCRFieldDesc; IsRefresh: boolean): string; virtual; + + function IndexedPrefix: string; + + function GenerateIndexName(Name: string): string; virtual; + function DecodeFieldIndex(FieldName: string): integer; virtual; + + function QuoteName(const AName: string): string; + function UnQuoteName(AName: string): string; + + function IsSubstituteParamName: boolean; virtual; + procedure AddParam(SB: StringBuilder; FieldDesc: TFieldDesc; + const StatementType: TStatementType; + const ParamType: TParamType; + Index: integer = -1; + Old: boolean = False); virtual; + + procedure AddFieldToInsertSQL(FieldDesc: TCRFieldDesc; const Index: integer = -1); virtual; + procedure AddFieldToUpdateSQL(FieldDesc: TCRFieldDesc; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); virtual; + procedure AddFieldToRefreshSQL(FieldDesc: TCRFieldDesc); virtual; + procedure AddFieldToCondition(SB: StringBuilder; + FieldDesc: TCRFieldDesc; + const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); virtual; + + procedure GenerateInsertSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); virtual; + procedure GenerateUpdateSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); virtual; + procedure GenerateDeleteSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); virtual; + procedure GenerateLockSQL( + const KeyAndDataFields: TKeyAndDataFields; + const Index: integer = -1); virtual; + procedure GenerateRefreshSQLSelectPart(const KeyAndDataFields: TKeyAndDataFields); virtual; + procedure GenerateRefreshSQLFromPart; virtual; + procedure GenerateRefreshSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean); virtual; + procedure GenerateRefreshQuickSQL(const KeyAndDataFields: TKeyAndDataFields); virtual; + procedure GenerateRefreshCheckDeletedSQL(const KeyAndDataFields: TKeyAndDataFields); virtual; + + procedure GenerateConditions(SB: StringBuilder; const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + const KeyAndDataFields: TKeyAndDataFields; + const Index: integer = -1); virtual;// Generate WHERE part for UPDATE, DELETE, REFRESH SQLs + + function GetParamInfoClass: TDAParamInfoClass; virtual; + public + constructor Create(Owner: TCustomDADataSet); + destructor Destroy; override; + + // Generate insert, update, delete or refresh SQL statements + function GenerateSQLforUpdTable(TableInfo: TCRTableInfo; + const KeyAndDataFields: TKeyAndDataFields; + const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + Params: TDAParams; + const Index: integer = -1): string; virtual; + + function GenerateSQL(const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + Params: TDAParams; + const Index: Integer = -1): string; virtual; + + property ParamsInfo: TDAParamsInfo read FParamsInfo; + end; + +{ TCustomDADataSet } + + TRefreshOption = (roAfterInsert, roAfterUpdate, roBeforeEdit); + TRefreshOptions = set of TRefreshOption; + + TAfterExecuteEvent = procedure (Sender: TObject; Result: boolean) of object; + TUpdateExecuteEvent = procedure (Sender: TDataSet; StatementTypes: TStatementTypes; + Params: TDAParams) of object; + TBeforeFetchEvent = procedure (DataSet: TCustomDADataSet; var Cancel: boolean) of object; + TAfterFetchEvent = procedure (DataSet: TCustomDADataSet) of object; + + TLocalMDLink = record + IsNull: boolean; + Buffer: IntPtr; + BufferType: integer; + NativeBuffer: boolean; + FieldNo: integer; + end; + + TLocalMDLinks = array of TLocalMDLink; + + TDADataSetOptions = class (TPersistent) + private + FSetFieldsReadOnly: boolean; + FRequiredFields: boolean; + FStrictUpdate: boolean; + FNumberRange: boolean; + FQueryRecCount: boolean; + FAutoPrepare: boolean; + FReturnParams: boolean; + FTrimFixedChar: boolean; + FTrimVarChar: boolean; + FLongStrings: boolean; + FRemoveOnRefresh: boolean; + FFlatBuffers: boolean; + FQuoteNames: boolean; + FDetailDelay: integer; + {$IFDEF HAVE_COMPRESS} + FCompressBlobMode: TCompressBlobMode; + {$ENDIF} + FFullRefresh: boolean; + FLocalMasterDetail: boolean; + FFieldsOrigin: boolean; + FUpdateBatchSize: integer; + FUpdateAllFields: boolean; + + procedure SetRequiredFields(Value: boolean); + procedure SetNumberRange(Value: boolean); + procedure SetTrimFixedChar(Value: boolean); + procedure SetTrimVarChar(Value: boolean); + procedure SetLongStrings(Value: boolean); + procedure SetAutoPrepare(Value: boolean); + procedure SetFlatBuffers(const Value: boolean); + procedure SetDetailDelay(Value: integer); + {$IFDEF HAVE_COMPRESS} + procedure SetCompressBlobMode(Value: TCompressBlobMode); + {$ENDIF} + procedure SetLocalMasterDetail(Value: boolean); + function GetCacheCalcFields: boolean; + procedure SetCacheCalcFields(Value: boolean); + protected + FOwner: TCustomDADataSet; + + procedure AssignTo(Dest: TPersistent); override; + + property FullRefresh: boolean read FFullRefresh write FFullRefresh default False; + property TrimVarChar: boolean read FTrimVarChar write SetTrimVarChar default False; + public + constructor Create(Owner: TCustomDADataSet); + + property SetFieldsReadOnly: boolean read FSetFieldsReadOnly write FSetFieldsReadOnly default False; + property RequiredFields: boolean read FRequiredFields write SetRequiredFields default True; + property StrictUpdate: boolean read FStrictUpdate write FStrictUpdate default True; + property NumberRange: boolean read FNumberRange write SetNumberRange default False; + property QueryRecCount: boolean read FQueryRecCount write FQueryRecCount default False; + property AutoPrepare: boolean read FAutoPrepare write SetAutoPrepare default False; + property ReturnParams: boolean read FReturnParams write FReturnParams default False; + property TrimFixedChar: boolean read FTrimFixedChar write SetTrimFixedChar default True; + property LongStrings: boolean read FLongStrings write SetLongStrings default True; + property FlatBuffers: boolean read FFlatBuffers write SetFlatBuffers default False; + property RemoveOnRefresh: boolean read FRemoveOnRefresh write FRemoveOnRefresh default True; + property QuoteNames: boolean read FQuoteNames write FQuoteNames default False; + property DetailDelay: integer read FDetailDelay write SetDetailDelay default 0; + {$IFDEF HAVE_COMPRESS} + property CompressBlobMode: TCompressBlobMode read FCompressBlobMode write SetCompressBlobMode default cbNone; + {$ENDIF} + property LocalMasterDetail: boolean read FLocalMasterDetail write SetLocalMasterDetail default False; + property CacheCalcFields: boolean read GetCacheCalcFields write SetCacheCalcFields default False; + property FieldsOrigin: boolean read FFieldsOrigin write FFieldsOrigin stored False default False; + property UpdateBatchSize: Integer read FUpdateBatchSize write FUpdateBatchSize default 1; + property UpdateAllFields: boolean read FUpdateAllFields write FUpdateAllFields default False; + end; + + TCustomDADataSet = class (TMemDataSet) + private + FConnection: TCustomDAConnection; + FParams: TDAParams; // for easy reference of FCommand.Params + FMacros: TMacros; // for easy reference of FCommand.Macros + FFetchRows: integer; + FDataLink: TDADetailDataLink; + FDebug: boolean; + FReadOnly: boolean; + FUniDirectional: boolean; + FAutoCommit: boolean; + FUpdateObject: TCustomDAUpdateSQL; + FRefreshOptions: TRefreshOptions; + FOptions: TDADataSetOptions; + FActiveRecRefresh: boolean; // ActiveBufLevelRecordRefresh + FBaseSQL: string; + {$IFDEF MSWINDOWS} + FDetailRefreshTimer: {$IFDEF CLR}TTimer{$ELSE}TWin32Timer{$ENDIF}; + {$ENDIF} + FLocalMDLinks: TLocalMDLinks; + FAfterExecute: TAfterExecuteEvent; + + FBeforeFetch: TBeforeFetchEvent; + FAfterFetch: TAfterFetchEvent; + FBeforeUpdateExecute: TUpdateExecuteEvent; + FAfterUpdateExecute: TUpdateExecuteEvent; + + FFindKeyOptions: TLocateExOptions; + + function GetSQL: TStrings; + procedure SetSQL(Value: TStrings); + procedure SetFetchRows(Value: integer); + procedure SetMasterSource(Value: TDataSource); + function GetParams: TDAParams; + procedure SetParams(Value: TDAParams); + function GetParamCount: word; + function GetParamCheck: boolean; + procedure SetParamCheck(Value: boolean); + function GetMacros: TMacros; + procedure SetMacros(Value: TMacros); + function GetMacroCount: word; + function GetRowsAffected: integer; + procedure SetUniDirectional(Value: boolean); + procedure SetAutoCommit(Value: boolean); + //procedure SetUpdateMode(const Value: TUpdateMode); + procedure SetUpdateObject(Value: TCustomDAUpdateSQL); + procedure SetOptions(Value: TDADataSetOptions); + procedure SetMasterFields(Value: string); + procedure SetForeignKeyFields(Value: string); + procedure SaveModifiedSQL(NewSQL: string); + function GetBaseSQL: string; + {$IFDEF MSWINDOWS} + procedure CheckRefreshDetailTimer; + {$ENDIF} + + {$IFDEF VER5P} + protected + { IProviderSupport } + FOldKeyFields: string; // To PSGetKeyFields after closing table (see SDAC 3034) + FOldTableName: string; // PSGetTableName must return right value even after DataSet.Close + procedure PSEndTransaction(Commit: Boolean); override; + procedure PSExecute; override; + function PSExecuteStatement(const ASQL: string; AParams: TParams; + {$IFDEF CLR}var ResultSet: TObject{$ELSE}ResultSet: Pointer = nil{$ENDIF}): Integer; override; + function PSGetParams: DB.TParams; override; + function PSGetQuoteChar: string; override; + function PSGetTableName: string; override; + function PSInTransaction: Boolean; override; + function PSIsSQLBased: Boolean; override; + function PSIsSQLSupported: Boolean; override; + procedure PSReset; override; + procedure PSSetParams(AParams: DB.TParams); override; + procedure PSSetCommandText(const CommandText: string); override; + procedure PSStartTransaction; override; + function PSUpdateRecord(UpdateKind: TUpdateKind; Delta: TDataSet): Boolean; override; + function PSGetDefaultOrder: TIndexDef; override; + function PreventPSKeyFields(var PSKeyFields: string): boolean; virtual; + function PSGetKeyFields: string; override; + {$ENDIF} + + protected + FRowsAffected: integer; + + FIRecordSet: TCRRecordSet; + FICommand: TCRCommand; // for perf + FCommand: TCustomDASQL; + + FFilterSQL: string; //CR ODAC (8387) vs (8751) + + FCachedKeyAndDataFields: array [boolean] of TKeyAndDataFields; + FSQLGenerator: TDASQLGenerator; + + FIdentityField: TField; + FUpdatingTableInfoIdx: integer; + FUpdatingTable: string;//Can not delete because FTablesInfo created only on ~open + + FMasterFields: string; + FDetailFields: string; + + FDesignCreate: boolean; + FNonBlocking: boolean; + FLockDebug: boolean; // locking trans debug info + FUpdateQuery: TComponent; + FUpdateComponents: array [TStatementType] of TComponent; + FUpdateSQL: array [TStatementType] of TStrings; // SQLInsert, SQLUpdate etc + + FRecordCount: integer; + + FFetchAll: boolean; + FFetchCanceled: boolean; + + FLeftQuote: char; + FRightQuote: char; + + FStreamedOpen: Boolean; + + FBatchSQLs: StringBuilder; + FBatchParams: TDAParams; + FBatchStatements: integer; + + function GetFieldObject(Field: TField): TSharedObject; overload; + function GetFieldObject(FieldDesc: TFieldDesc): TSharedObject; overload; + + function BatchUpdate: boolean; override; + function CanFlushBatch: boolean; override; + function PrepareBatch(SQL: string): string; virtual; + procedure FlushBatch; override; + procedure ClearBatch; + + function QuoteName(const AName: string): string; virtual; + function UnQuoteName(AName: string): string; virtual; + + procedure CheckInactive; override; + procedure CreateIRecordSet; override; + procedure FreeIRecordSet; + procedure SetIRecordSet(Value: TData{TRecordSet}); override; + procedure CheckIRecordSet; + + procedure CreateCommand; virtual; + procedure FreeCommand; + procedure SetCommand(Value: TCustomDASQL); + + function CreateOptions: TDADataSetOptions; virtual; + + procedure Loaded; override; + + procedure SetConnection(Value: TCustomDAConnection); + function UsedConnection: TCustomDAConnection; virtual; + procedure CheckConnection; virtual; + procedure BeginConnection(NoConnectCheck: boolean = True); virtual; + procedure EndConnection; virtual; + procedure Disconnect; virtual; + procedure ConnectChange(Sender: TObject; Connecting: boolean); virtual; + + { TablesInfo } + function GetTablesInfo: TCRTablesInfo; + procedure SetUpdatingTable(Value: string); virtual; + procedure InitUpdatingTable; + procedure DetectIdentityField; virtual; + function ReadOnlyFieldsEnabled: boolean; virtual; + + { Open/Close } + procedure SetActive(Value: Boolean); override; + procedure BeforeOpenCursor(InfoQuery: boolean); virtual; + procedure OpenCursor(InfoQuery: boolean); override; + procedure AfterOpenCursor(InfoQuery: boolean); virtual; + procedure CloseCursor; override; + function OpenCursorAllowFailOver: boolean; virtual; + + function GetActualFieldName(FieldDesc: TFieldDesc): string; overload; + function GetActualFieldName(Field: TField): string; overload; + procedure GetCurrentKeys(out KeyFields: TFieldArray; out Values: variant); + procedure DataReopen; override; + procedure InternalRefresh; override; + procedure InternalRefreshQuick(const CheckDeleted: boolean); virtual; + procedure InternalExecute; virtual; + procedure InternalClose; override; + + function GetRecCount: longint; virtual; + procedure SetRefreshOptions(Value: TRefreshOptions); virtual; + procedure SetFetchAll(Value: boolean); virtual; + + procedure BeforeExecute; virtual; + { Edit } + function IsNeedEditPreconnect: boolean; virtual; + function IsNeedInsertPreconnect: boolean; virtual; + + procedure SetReadOnly(Value: boolean); virtual; + + function IsPreconnected : boolean; virtual; + procedure InternalBeforeEdit; virtual; + procedure InternalEdit; override; + procedure InternalInsert; override; + procedure InternalCancel; override; + procedure InternalPost; override; + procedure InternalDeferredPost; override; + procedure InternalApplyUpdates(AllowFailOver: boolean); + + procedure CreateSQLGenerator; virtual; + procedure FreeSQLGenerator; + procedure SetSQLGenerator(Value: TDASQLGenerator); + + function GetUpdateStatement(const StatementType: TStatementType): string; virtual; + + function GetUpdateSQLStatementTypes: TStatementTypes; virtual; + function GetUpdateSQLIndex(Index: integer): TStrings; + procedure SetUpdateSQLIndex(Index: integer; Value: TStrings); + + procedure SetFilterSQL(Value: string); virtual; //CR ODAC (8387) vs (8751) + procedure SetFiltered(Value: boolean); override; + + function PerformAppend: boolean; override; + function PerformDelete: boolean; override; + function PerformUpdate: boolean; override; + procedure InternalRefreshRecord; virtual; + + procedure CheckUpdateQuery(const StatementType: TStatementType); virtual; + procedure UpdateExecute(const StatementTypes: TStatementTypes); virtual; + procedure CheckUpdateSQL(const SQL: string; const StatementTypes: TStatementTypes; out ParamsInfo: TDAParamsInfo); virtual; + function UseParamType: boolean; virtual; //This function indicates ParamType using in PerformSQL + function FieldByParamName(var ParamName: string; var Old: boolean; var AFieldNo: integer): TField; virtual; + function PerformSQL(const SQL: string; const StatementTypes: TStatementTypes): boolean; virtual; + function RefreshAfterInsertAllowed: boolean; virtual; + + { RefreshQuick } + function IsRefreshQuickField(FieldDesc: TFieldDesc): boolean; virtual; + procedure SaveMaxRefreshQuickValue(FieldDesc: TFieldDesc; const Value: variant); virtual; + + function IsAutoCommit: boolean; virtual; + function ShouldPrepareUpdateSQL: boolean; virtual; + function GetCanModify: boolean; override; + + procedure SetStateFieldValue(State: TDataSetState; Field: TField; const Value: Variant); override; // Need to support int64 fields on PerformSQL in RefreshRecord + function CanRefreshField(Field: TField): boolean; virtual; + function NeedReturnParams: boolean; virtual; + procedure AssignFieldValue(Param: TDAParam; Field: TField; Old: boolean); overload; virtual; + procedure AssignFieldValue(Param: TDAParam; FieldDesc: TFieldDesc; Old: boolean); overload; virtual; + procedure GetIdentityField; virtual; + procedure GetKeyAndDataFields(out KeyAndDataFields: TKeyAndDataFields; + const ForceUseAllKeyFields: boolean); virtual; + procedure ClearCachedKeyAndDataFields; + + { Master/Detail } + procedure RefreshParams; + function NeedDetailRefresh(Param: TDAParam; FieldValue: TSharedObject): boolean; virtual; + procedure RefreshDetail(Sender: TObject); + function SetMasterParams(AParams: TDAParams): boolean; + function IsConnectedToMaster: boolean; + procedure RefreshDetailSQL; + function LocalDetailFilter(RecBuf: IntPtr): boolean; + + procedure AssembleSQL; + procedure ScanMacros(Sender: TObject = nil); virtual; + + procedure DefineProperties(Filer: TFiler); override; + + procedure AssignTo(Dest: TPersistent); override; + + procedure DoAfterExecute(Result: boolean); virtual; + procedure DoAfterExecFetch(Result: boolean); + procedure DoAfterFetchAll(Result: boolean); + procedure DoAfterScroll; override; + procedure DoOnBeforeFetch(out Cancel: boolean); virtual; + procedure DoOnAfterFetch; virtual; + procedure DoOnDataChanged; + procedure DoOnNewRecord; override; + + function GetDataSource: TDataSource; override; + function GetRecordCount: integer; override; + function GetIsQuery: boolean; virtual; + + { Before / After UpdateExecute } + function AssignedBeforeUpdateExecute: boolean; virtual; + procedure DoBeforeUpdateExecute(Sender: TDataSet; StatementTypes: TStatementTypes; + Params: TDAParams); virtual; + function AssignedAfterUpdateExecute: boolean; virtual; + procedure DoAfterUpdateExecute(Sender: TDataSet; StatementTypes: TStatementTypes; + Params: TDAParams); virtual; + + { KeySequence } + procedure InternalOpen; override; + + { SQL Modifications } + function SQLAddWhere(SQLText, Condition: string): string; virtual; + function SQLDeleteWhere(SQLText: string): string; virtual; + function SQLGetWhere(SQLText: string): string; virtual; + function SQLSetOrderBy(SQLText: string; Fields: string): string; virtual; + function SQLGetOrderBy(SQLText: string): string; virtual; + + function GetFinalSQL: string; virtual; + + { TablesInfo } + property TablesInfo: TCRTablesInfo read GetTablesInfo; + property IdentityField: TField read FIdentityField; + property UpdatingTableInfoIdx: integer read FUpdatingTableInfoIdx; + property UpdatingTable: string read FUpdatingTable write SetUpdatingTable; // Does not need for public use + + { XML } + procedure WriteFieldXMLAttributeType(Field: TField; FieldDesc: TFieldDesc; const FieldAlias: string; + XMLWriter: XMLTextWriter); override; + + property AutoCommit: boolean read FAutoCommit write SetAutoCommit default True; + + property UpdateObject: TCustomDAUpdateSQL read FUpdateObject write SetUpdateObject; + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + + { Open/Close } + procedure Prepare; override; + procedure UnPrepare; override; + + procedure Execute; virtual; + function Executing: boolean; + function Fetching: boolean; + function FetchingAll: boolean; + function Fetched: boolean; virtual; + + procedure Resync(Mode: TResyncMode); override; + + procedure GetDetailLinkFields(MasterFields, DetailFields: {$IFDEF CLR}TObjectList{$ELSE}TList{$ENDIF}); override; + + {for BDE compatibility} + function FindKey(const KeyValues: array of const): Boolean; + procedure FindNearest(const KeyValues: array of const); + procedure GotoCurrent(DataSet: TCustomDADataSet); + + function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override; + + { Edit } + procedure ApplyUpdates; override; + + property SQLInsert: TStrings index stInsert read GetUpdateSQLIndex write SetUpdateSQLIndex; + property SQLDelete: TStrings index stDelete read GetUpdateSQLIndex write SetUpdateSQLIndex; + property SQLUpdate: TStrings index stUpdate read GetUpdateSQLIndex write SetUpdateSQLIndex; + property SQLRefresh: TStrings index stRefresh read GetUpdateSQLIndex write SetUpdateSQLIndex; + + procedure RefreshRecord; + //procedure Lock; + //procedure Unlock; + + function FindParam(const Value: string): TDAParam; + function ParamByName(const Value: string): TDAParam; + + function FindMacro(const Value: string): TMacro; + function MacroByName(const Value: string): TMacro; + + { SQL Modifications } + procedure SaveSQL; + procedure RestoreSQL; + function SQLSaved: boolean; + + procedure AddWhere(Condition: string); + procedure DeleteWhere; + procedure SetOrderBy(Fields: string); + function GetOrderBy: string; + + { Additional data types } + function GetField(FieldDesc: TFieldDesc): TField; + function GetDataType(const FieldName: string): integer; virtual; + function GetFieldDesc(const FieldName: string): TFieldDesc; overload; + function GetFieldDesc(const FieldNo: integer): TFieldDesc; overload; virtual; + function GetFieldPrecision(const FieldName: string): integer; + function GetFieldScale(const FieldName: string): integer; + function GetFieldObject(const FieldName: string): TSharedObject; overload; + + property Connection: TCustomDAConnection read FConnection write SetConnection; + property ParamCheck: boolean read GetParamCheck write SetParamCheck default True; // before SQL + property SQL: TStrings read GetSQL write SetSQL; + property FetchRows: integer read FFetchRows write SetFetchRows default 25; + property FetchAll: boolean read FFetchAll write SetFetchAll default False; + property Debug: boolean read FDebug write FDebug default False; + property MasterSource: TDataSource read GetDataSource write SetMasterSource; + property Params: TDAParams read GetParams write SetParams stored False; + property ParamCount: word read GetParamCount; + property Macros: TMacros read GetMacros write SetMacros stored False; + property MacroCount: word read GetMacroCount; + property UniDirectional: boolean read FUniDirectional write SetUniDirectional default False; + property ReadOnly: boolean read FReadOnly write SetReadOnly default False; + property RowsAffected: integer read GetRowsAffected; + property IsQuery: boolean read GetIsQuery; + property RefreshOptions: TRefreshOptions read FRefreshOptions write SetRefreshOptions default []; + property Options: TDADataSetOptions read FOptions write SetOptions; + property BaseSQL: string read GetBaseSQL; + property FinalSQL: string read GetFinalSQL; + property FilterSQL: string read FFilterSQL write SetFilterSQL; + property MasterFields: string read FMasterFields write SetMasterFields; + property DetailFields: string read FDetailFields write SetForeignKeyFields; // ForeignKeyFields + + property AfterExecute: TAfterExecuteEvent read FAfterExecute write FAfterExecute; + property BeforeUpdateExecute: TUpdateExecuteEvent read FBeforeUpdateExecute write FBeforeUpdateExecute; + property AfterUpdateExecute: TUpdateExecuteEvent read FAfterUpdateExecute write FAfterUpdateExecute; + property BeforeFetch: TBeforeFetchEvent read FBeforeFetch write FBeforeFetch; + property AfterFetch: TAfterFetchEvent read FAfterFetch write FAfterFetch; + end; + +{ TCustomDASQL } + + TCustomDASQL = class (TComponent) + private + FConnection: TCustomDAConnection; + FSQL: TStrings; + FParams: TDAParams; + FParamCheck: boolean; + FMacros: TMacros; + FDebug: boolean; + FChangeCursor: boolean; + + FAfterExecute: TAfterExecuteEvent; + {FOnDisconnect: TNotifyEvent; + FGetFinalSQL: TGetFinalSQLEvent; + FOnScanMacros: TNotifyEvent;} + + procedure SetSQL(Value: TStrings); + function GetPrepared: boolean; + procedure SetPrepared(Value: boolean); + procedure SetParams(Value: TDAParams); + function GetParamCount: word; + procedure SetParamCheck(Value: boolean); + function GetParamValues(ParamName: string): variant; + procedure SetParamValues(ParamName: string; Value: variant); + procedure SetMacros(Value: TMacros); + function GetMacroCount: word; + function GetRowsAffected: integer; + + protected + FAutoCommit: boolean; + FICommand: TCRCommand; + FDataSet: TCustomDADataSet; // dataset that owns + FDesignCreate: boolean; // for design-time only + FNonBlocking: boolean; + FLockDebug, FLockAssembleSQL, FLockMacros: boolean; // locking trans debug info + FNativeSQL: string; + + procedure CreateICommand; virtual; + procedure FreeICommand; + procedure SetICommand(Value: TCRCommand); virtual; + procedure CheckICommand; + + function CreateParamsObject: TDAParams; virtual; + + procedure Loaded; override; + + procedure SetAutoCommit(Value: boolean); + procedure SetConnection(Value: TCustomDAConnection); + function UsedConnection: TCustomDAConnection; virtual; + procedure CheckConnection; virtual; + procedure BeginConnection(NoConnectCheck: boolean = True); virtual; + procedure EndConnection; virtual; + procedure Disconnect; virtual; + procedure ConnectChange(Sender: TObject; Connecting: boolean); virtual; + + procedure InternalPrepare; virtual; + procedure InternalUnPrepare; virtual; + procedure InternalExecute(Iters: integer); virtual; + + procedure DoAfterExecute(Result: boolean); + + /// Parse SQL and replace ':ParamName' by '?' + /// Params may be nil + function ParseSQL(const SQL: string; Params: TDAParams; RenamePrefix: string = ''): string; overload; virtual; + function ParseSQL(Params: TDAParams): string; overload; + procedure ParseSQLParam(ParsedSQL: StringBuilder; Parser: TParser; Params: TDAParams; const LeftQuote, RightQuote: char; RenamePrefix: string); virtual; + function CreateParser(const Text: string): TParser; virtual; + + procedure SQLChanged(Sender: TObject); virtual; + procedure ScanMacros; virtual; + function GetFinalSQL: string; virtual; + procedure AssembleSQL; virtual; + + procedure CreateParams; virtual; + procedure WriteParams(WriteValue: boolean = True); virtual; + procedure ReadParams; virtual; + + procedure DefineProperties(Filer: TFiler); override; + procedure ReadParamData(Reader: TReader); + procedure WriteParamData(Writer: TWriter); + procedure ReadMacroData(Reader: TReader); + procedure WriteMacroData(Writer: TWriter); + + procedure AssignTo(Dest: TPersistent); override; + + property AutoCommit: boolean read FAutoCommit write SetAutoCommit default False; + + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + + procedure Prepare; virtual; + procedure UnPrepare; virtual; + + procedure Execute; overload; virtual; + procedure Execute(Iters: integer); overload; virtual; + + function Executing: boolean; + function WaitExecuting(TimeOut: integer = 0): boolean; + + function FindParam(const Value: string): TDAParam; + function ParamByName(const Value: string): TDAParam; + + function FindMacro(const Value: string): TMacro; + function MacroByName(const Value: string): TMacro; + + property Connection: TCustomDAConnection read FConnection write SetConnection; + property ParamCheck: boolean read FParamCheck write SetParamCheck default True; // before SQL + property SQL: TStrings read FSQL write SetSQL; + property Prepared: boolean read GetPrepared write SetPrepared; + property Params: TDAParams read FParams write SetParams stored False; + property ParamCount: word read GetParamCount; + property ParamValues[ParamName: string]: variant read GetParamValues write SetParamValues; default; + property Macros: TMacros read FMacros write SetMacros stored False; + property MacroCount: word read GetMacroCount; + property Debug: boolean read FDebug write FDebug default False; + property ChangeCursor: boolean read FChangeCursor write FChangeCursor; + property RowsAffected: integer read GetRowsAffected; + property FinalSQL: string read GetFinalSQL; + + property AfterExecute: TAfterExecuteEvent read FAfterExecute write FAfterExecute; + end; + +{ TCustomDAUpdateSQL } + + TCustomDAUpdateSQL = class (TComponent) + private + FDataSet: TCustomDADataSet; + FSQLText: array [TStatementType] of TStrings; + + FUpdateObject: array [TStatementType] of TComponent; + + protected + FDesignCreate: boolean; // for design-time only + + // get/set FSQLText by TStatementType + function GetSQLIndex(Index: integer): TStrings; + procedure SetSQLIndex(Index: integer; Value: TStrings); + + // get/set FSQLText by TUpdateKind + function GetSQL(UpdateKind: TUpdateKind): TStrings; virtual; + procedure SetSQL(UpdateKind: TUpdateKind; Value: TStrings); + + // get/set FUpdateObject by TStatementType + function GetObjectIndex(Index: integer): TComponent; + procedure SetObjectIndex(Index: integer; Value: TComponent); + + function GetDataSet: TCustomDADataSet; virtual; + procedure SetDataSet(DataSet: TCustomDADataSet); virtual; + procedure Loaded; override; + procedure AssignTo(Dest: TPersistent); override; + + function DataSetClass: TCustomDADataSetClass; virtual; + function SQLClass: TCustomDASQLClass; virtual; + procedure CheckUpdateComponent(Component: TComponent); overload; + procedure CheckUpdateComponent(Component: TComponent; NewDataset: TCustomDADataset); overload; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + procedure Apply(UpdateKind: TUpdateKind); virtual; + procedure ExecSQL(UpdateKind: TUpdateKind); + property DataSet: TCustomDADataSet read GetDataSet write SetDataSet; + property SQL[UpdateKind: TUpdateKind]: TStrings read GetSQL write SetSQL; + + published + property InsertSQL: TStrings index stInsert read GetSQLIndex write SetSQLIndex; + property DeleteSQL: TStrings index stDelete read GetSQLIndex write SetSQLIndex; + property ModifySQL: TStrings index stUpdate read GetSQLIndex write SetSQLIndex; + property RefreshSQL: TStrings index stRefresh read GetSQLIndex write SetSQLIndex; + + property InsertObject: TComponent index stInsert read GetObjectIndex write SetObjectIndex; + property DeleteObject: TComponent index stDelete read GetObjectIndex write SetObjectIndex; + property ModifyObject: TComponent index stUpdate read GetObjectIndex write SetObjectIndex; + property RefreshObject: TComponent index stRefresh read GetObjectIndex write SetObjectIndex; + end; + +{ TMacro } + + TMacro = class (TCollectionItem) + private + FName: string; + FValue: string; + FActive: boolean; + //FOwner: TComponent; + + procedure SetValue(Value: string); + procedure SetActive(Value: boolean); + + function GetAsDateTime: TDateTime; + procedure SetAsDateTime(Value: TDateTime); + function GetAsFloat: double; + procedure SetAsFloat(Value: double); + function GetAsInteger: integer; + procedure SetAsInteger(Value: integer); + function GetAsString: string; + procedure SetAsString(Value: string); + + protected + procedure AssignTo(Dest: TPersistent); override; + + function IsEqual(Value: TMacro): boolean; + + function GetDisplayName: string; override; + + public + constructor Create(Collection: TCollection); override; + + property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime; + property AsFloat: double read GetAsFloat write SetAsFloat; + property AsInteger: integer read GetAsInteger write SetAsInteger; + property AsString: string read GetAsString write SetAsString; + + published + property Name: string read FName write FName; + property Value: string read FValue write SetValue; + property Active: boolean read FActive write SetActive default True; + end; + +{ TMacros } + + TMacros = class (TCollection) + private + FOwner: TPersistent; + + procedure ReadBinaryData(Stream: TStream); + //procedure WriteBinaryData(Stream: TStream); + + function GetItem(Index: integer): TMacro; + procedure SetItem(Index: integer; Value: TMacro); + function GetUpdateCount: integer; + + protected + FParserClass: TParserClass; + + procedure AssignTo(Dest: TPersistent); override; + + procedure DefineProperties(Filer: TFiler); override; + + function GetOwner: TPersistent; override; + procedure Update(Item: TCollectionItem); override; + + function GetMacroValue(Macro: TMacro): string; virtual; + + property UpdateCount: integer read GetUpdateCount; + + public + constructor Create(Owner: TPersistent); + + procedure Scan(SQL: string); // ParseSQL + procedure AssignValues(Value: TMacros); + function IsEqual(Value: TMacros): boolean; + + function FindMacro(const Value: string): TMacro; + function MacroByName(const Value: string): TMacro; + + procedure Expand(var SQL: string); + + procedure SetParserClass(Value: TParserClass); + + property Items[Index: integer]: TMacro read GetItem write SetItem; default; + end; + +{ TCustomConnectDialog } + + TLabelSet = (lsCustom, lsEnglish, lsFrench, lsGerman, lsItalian, lsPolish, + lsPortuguese, lsRussian, lsSpanish); + + TCustomConnectDialog = class(TComponent) + private + FConnection: TCustomDAConnection; + FRetries: word; + FDialogClass: string; + FSavePassword: boolean; + FStoreLogInfo: boolean; + + FLabelSet: TLabelSet; + FCaption: string; + FUsernameLabel: string; + FPasswordLabel: string; + FServerLabel: string; + FConnectButton: string; + FCancelButton: string; + + procedure SetCaption(Value: string); + procedure SetUsernameLabel(Value: string); + procedure SetPasswordLabel(Value: string); + procedure SetServerLabel(Value: string); + procedure SetConnectButton(Value: string); + procedure SetCancelButton(Value: string); + + protected + {$IFDEF WIN32} + function GetString(Id: integer): string; + {$ENDIF} + procedure SetLabelSet(Value: TLabelSet); virtual; + + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + + function DefDialogClass: TClass; virtual; + function GetKeyPath: string; virtual; + function GetServerStoreName: string; virtual; + {$IFDEF MSWINDOWS} + procedure SaveInfoToRegistry(Registry: TRegistry); virtual; + procedure LoadInfoFromRegistry(Registry: TRegistry); virtual; + {$ENDIF} + //class function AcceptBlankPassword: boolean; virtual; + + public + constructor Create(Owner: TComponent); override; + + function Execute: boolean; virtual; + + procedure GetServerList(List: TStrings); virtual; + + property Connection: TCustomDAConnection read FConnection; + + property Retries: word read FRetries write FRetries default 3; + property SavePassword: boolean read FSavePassword write FSavePassword default False; + property StoreLogInfo: boolean read FStoreLogInfo write FStoreLogInfo default True; + + property DialogClass: string read FDialogClass write FDialogClass; + + property Caption: string read FCaption write SetCaption; + property UsernameLabel: string read FUsernameLabel write SetUsernameLabel; + property PasswordLabel: string read FPasswordLabel write SetPasswordLabel; + property ServerLabel: string read FServerLabel write SetServerLabel; + property ConnectButton: string read FConnectButton write SetConnectButton; + property CancelButton: string read FCancelButton write SetCancelButton; + + property LabelSet: TLabelSet read FLabelSet write SetLabelSet default lsEnglish; + end; + + TTableInfo = record + Name: string; + Alias: string; + end; + TTablesInfo = array of TTableInfo; + +{$IFDEF MSWINDOWS} + +{ TCRNetManager } + + TCRServiceStatus = (ssStopped, ssStartPending, ssStopPending, ssRunning, ssContinuePending, ssPausePending, ssPaused); // equal to TCurrentStatus from SvcMgr + + TCRServiceInfo = record + ServiceName, DisplayName: string; + Status: TCRServiceStatus; + end; + + TCRServicesInfo = array of TCRServiceInfo; + TCRServiceNamesThread = class; + TCRServicesThread = class(TThread) + private + FList: TStrings; + FKeywords: string; + protected + property Terminated; + procedure Execute; override; + public + constructor Create(List: TStrings; const Keywords: string); + end; + + TCRServiceNamesThread = class(TThread) + protected + FKeywords: string; + FServices: TCRServicesThread; + FServer: string; + FServiceNames: TCRServicesInfo; + procedure Execute; override; + public + constructor Create(const Server: string; Services: TCRServicesThread; const Keywords: string); + end; + + SC_HANDLE = THandle; + + TCRNetManager = class + protected + FServicesCS: TCriticalSection; + FCachedServerList: TStringList; + FLastTickCount: LongWord; + + class procedure ServiceManagerOpen(const Server: string; const ReadOnly: boolean; out sch: SC_HANDLE); + class procedure ServiceManagerClose(const sch: SC_HANDLE); + class procedure ServiceOpen(const Server: string; const ServiceName: string; const ReadOnly: boolean; out sch: SC_HANDLE; out sh: SC_HANDLE); + class procedure ServiceClose(const sch: SC_HANDLE; const sh: SC_HANDLE); + + procedure ClearCachedServerList; + procedure AddToCachedServerList(const Keywords: string; const Server: string); + public + constructor Create; + destructor Destroy; override; + + // Service Control + class function GetServiceNames(const Server: string): TCRServicesInfo; + class function GetServiceStatus(const Server: string; const ServiceName: string): TCRServiceStatus; + class procedure ServiceStart(const Server: string; const ServiceName: string; ParamStr: string = ''); + class procedure ServiceStop(const Server: string; const ServiceName: string); + + // Net control + class procedure GetServerList(List: TStrings); overload; + procedure GetServerList(List: TStrings; const Keywords: string; const Timeout: Longword = 1; const CacheTimeout: Longword = 120); overload; + end; + +var + CRNetManager: TCRNetManager; + +type +{$ENDIF} + + TDADataSetUtils = class + protected + FCount: integer; + FDataSet: TCustomDADataSet; + + FOldActive: boolean; + FOldDebug: boolean; + FOldFetchAll: boolean; + FOldFetchRows: integer; + + public + procedure QuickOpen(DataSet: TCustomDADataSet; Refresh: boolean = False); virtual; + procedure Restore(RestoreActive: boolean = True); virtual; + procedure QuickOpenAndRestore(DataSet: TCustomDADataSet; Refresh: boolean = False); + end; + +{ TCRDataSource } + + TCRDataSource = class (TDataSource) + protected + FDesignCreate: boolean; + + procedure Loaded; override; + procedure AssignTo(Dest: TPersistent); override; + + public + constructor Create(Owner: TComponent); override; + end; + + TDBAccessUtils = class + public + class function IsKeyViolation(Obj: TCustomDAConnection; E: EDAError): boolean; + class function IsObjectDataType(Obj: TDAParam; DataType: TFieldType): boolean; + + class procedure CheckConnection(Obj: TCustomDADataSet); overload; + class procedure CheckConnection(Obj: TCustomDASQL); overload; + class function UsedConnection(Obj: TCustomDADataSet): TCustomDAConnection; overload; + class function UsedConnection(Obj: TCustomDASQL): TCustomDAConnection; overload; + class procedure SetAutoCommit(Obj: TComponent; Value: boolean); + class function GetAutoCommit(Obj: TComponent): boolean; + class procedure SetDesignCreate(Obj: TCustomDADataSet; Value: boolean); overload; + class function GetDesignCreate(Obj: TCustomDADataSet): boolean; overload; + class procedure SetDesignCreate(Obj: TCustomDASQL; Value: boolean); overload; + class function GetDesignCreate(Obj: TCustomDASQL): boolean; overload; + class procedure SetDesignCreate(Obj: TCustomDAUpdateSQL; Value: boolean); overload; + class function GetDesignCreate(Obj: TCustomDAUpdateSQL): boolean; overload; + class procedure SetDesignCreate(Obj: TCRDataSource; Value: boolean); overload; + class function GetDesignCreate(Obj: TCRDataSource): boolean; overload; + class function CreateIRecordSet(Obj: TCustomDAConnection): TCRRecordSet; + class function GetIConnection(Obj: TCustomDAConnection): TCRConnection; + class function GetUpdateQuery(Obj: TCustomDADataSet): TComponent; + class function GetTablesInfo(Obj: TCustomDADataSet): TCRTablesInfo; + class function GetUpdatingTable(Obj: TCustomDADataSet): string; + class procedure SetUpdatingTable(Obj: TCustomDADataSet; Value: string); + class function GetUpdatingTableIdx(Obj: TCustomDADataSet): integer; + class procedure SetUpdatingTableIdx(Obj: TCustomDADataSet; Value: integer); + class procedure InternalConnect(Obj: TCustomDAConnection); + class procedure InternalDisconnect(Obj: TCustomDAConnection); + class procedure SuppressAutoCommit(Obj: TCustomDAConnection); + class procedure RestoreAutoCommit(Obj: TCustomDAConnection); + + class procedure Disconnect(Obj: TCustomDASQL); + + class function SQLGenerator(Obj: TCustomDADataSet): TDASQLGenerator; + class function GetSQLs(Obj: TCustomDAConnection): TDAList; + + class procedure GetKeyAndDataFields( + Obj: TCustomDADataSet; + out KeyAndDataFields: TKeyAndDataFields; + const ForceUseAllKeyFields: boolean); + + class function GetLockDebug(Obj: TComponent): boolean; + class procedure SetLockDebug(Obj: TComponent; Value: boolean); + class function FOwner(Obj: TDAConnectionOptions): TCustomDAConnection; overload; + class function FOwner(Obj: TDADataSetOptions): TCustomDADataSet; overload; + class function SQLMonitorClass(Obj: TCustomDAConnection): TClass; + + class function QuoteName(Obj: TCustomDADataSet; const AName: string): string; + class function UnQuoteName(Obj: TCustomDADataSet; AName: string): string; + + class procedure RegisterClient(Obj: TCustomDAConnection; Client: TObject; Event: TConnectChangeEvent = nil); + class procedure UnRegisterClient(Obj: TCustomDAConnection; Client: TObject); + + class function GetIdentityField(Obj: TCustomDADataSet): TField; + + class function GetSQL(Obj: TComponent): TStrings; + class procedure SetSQL(Obj: TComponent; Value: TStrings); + class procedure SetSQLText(Obj: TComponent; const SQLText: string; const LockAssembleSQL, LockMacros: boolean; const DisableScanParams: boolean = True); + + class function GetParams(Obj: TComponent): TDAParams; + class procedure Execute(Obj: TComponent); + class procedure Open(Obj: TComponent); + class function GetRowsAffected(Obj: TComponent): integer; + class function GetUpdateSQLStatementTypes(Obj: TCustomDADataSet): TStatementTypes; + class function GetUpdateSQLIndex(Obj: TCustomDADataSet; StatementType: TStatementType): TStrings; + class function ParseSQL(Obj: TCustomDASQL; const SQL: string; Params: TDAParams; RenamePrefix: string = ''): string; + class function CreateParamsObject(Obj: TCustomDASQL): TDAParams; + + class procedure SetDesigning(Obj: TComponent; Value: Boolean; SetChildren: Boolean = True); + class function GetIRecordSet(Obj: TCustomDADataSet): TCRRecordSet; + + class function GetDataSetClass(Obj: TCustomDAUpdateSQL): TCustomDADataSetClass; + class function GetSQLClass(Obj: TCustomDAUpdateSQL): TCustomDASQLClass; + + class function GetParserClass(Obj: TMacros): TParserClass; + end; + +const + crSQLArrow = -30; + + procedure SetCursor(Value: integer); + +var + ChangeCursor: boolean; + MacroChar: char; + SetCursorProc: procedure(Value: integer); + ShowConnectFormProc: function(ConnectDialog: TCustomConnectDialog): boolean; + BaseSQLOldBehavior: boolean; + SQLGeneratorCompatibility: boolean; + + function _AddWhere( + const SQL: string; Condition: string; + ParserClass: TParserClass; // TOraParser, TMSparser, TMyParser + OmitComment: boolean; + SelectCode, WhereCode: integer + ): string; + function _SetWhere( + const SQL: string; Condition: string; + ParserClass: TParserClass; // TOraParser, TMSparser, TMyParser + OmitComment: boolean; + SelectCode, WhereCode: integer + ): string; + function _GetWhere( + const SQL: string; + ParserClass: TParserClass; // TOraParser, TMSparser, TMyParser + OmitComment: boolean; + SelectCode, WhereCode: integer + ): string; + function _SetOrderBy( + const SQL: string; Fields: string; + ParserClass: TParserClass; // TOraParser, TMSparser, TMyParser + SelectCode, OrderCode, ByCode: Integer + ): string; + function _GetOrderBy( + const SQL: string; + ParserClass: TParserClass; // TOraParser, TMSparser, TMyParser + SelectCode, OrderCode, ByCode: Integer + ): string; + + + function UpdateKindToStatementType(const UpdateKind: TUpdateKind): TStatementType; + function StatementTypeToUpdateKind(const StatementType: TStatementType): TUpdateKind; + +implementation +uses +{$IFDEF PERF_COUNTER} + Debug, +{$ENDIF} +{$IFDEF CLR} + System.Security, +{$ENDIF} +{$IFNDEF LINUX} + Messages, +{$ENDIF} + DBCommon, DBConsts, DAConsts, DASQLMonitor, CRConnectionPool; + +{$IFDEF WIN32} +{$R *.res} +{$ENDIF} + +procedure SetCursor(Value: integer); +begin + if Assigned(SetCursorProc) then + SetCursorProc(Value); +end; + +function _AddWhere( + const SQL: string; Condition: string; + ParserClass: TParserClass; // TOraParser, TMSparser, TMyParser + OmitComment: boolean; + SelectCode, WhereCode: integer +): string; +var + Parser: TParser; + IsWhere: boolean; + Code: integer; + PrevCode: integer; + St: string; + StLex: string; + BracketCount: integer; + WherePos: integer; + NeedBracket: boolean; + Bracket: string; + IsMacro: boolean; + MacroSt: string; + +begin + Result := SQL; + + if Trim(Condition) = '' then + Exit; + + Parser := ParserClass.Create(PChar(SQL)); + Parser.OmitComment := OmitComment; + WherePos := 0; + IsMacro := False; + MacroSt := MacroChar; + + try + if Parser.ToLexem(SelectCode) <> lcEnd then begin + IsWhere := False; + NeedBracket := False; + Code := 0; + BracketCount := 0; + repeat + PrevCode := Code; + Code := Parser.GetNext(StLex); //+++ char instead of string + if (Code = WhereCode) and (not IsMacro) and (BracketCount = 0) then begin + IsWhere := True; + WherePos := Parser.CurrPos + 2; + NeedBracket := True; + end + else + if Code = lcSymbol then + if StLex = '(' then + Inc(BracketCount) + else + if StLex = ')' then + Dec(BracketCount); + + IsMacro := (Code <> lcString) and (StLex = MacroSt); + if (BracketCount = 0) and Parser.IsClauseLexem(Code) and (Code <> WhereCode) then + Break; + until Code = lcEnd; + + if NeedBracket then begin + if PrevCode = lcComment then + Bracket := LineSeparator + ')' + else + Bracket := ')'; + end; + + if not IsWhere then + St := LineSeparator + 'WHERE ' + Condition + ' ' + else + if (PrevCode = lcComment) and not NeedBracket then + St := LineSeparator +'AND ' + Condition + ' ' + else + St := ' AND ' + Condition + ' '; + + if Code = lcEnd then begin + if NeedBracket then begin + Insert('(', Result, WherePos); + Result := Trim(Result) + Bracket + St; + end + else + if not Parser.IsSemicolon(PrevCode) then + Result := Trim(Result) + St + else + Insert(St, Result, Parser.PrevPos); + end + else + if NeedBracket then begin + Insert(Bracket + St, Result, Parser.PrevPos + 1); + Insert('(', Result, WherePos); + end + else + Insert(St, Result, Parser.PrevPos + 1); + end; + finally + Parser.Free; + end; +end; + +//++ Must be merged with _AddWhere +function _SetWhere( + const SQL: string; Condition: string; + ParserClass: TParserClass; // TOraParser, TMSparser, TMyParser + OmitComment: boolean; + SelectCode, WhereCode: integer +): string; +var + Parser: TParser; + FirstPos: integer; + LastPos: integer; + Code: integer; + StLex: string; + BracketCount: integer; +begin + Result := SQL; + Parser := ParserClass.Create(PChar(SQL)); + Parser.OmitBlank := False; + Parser.OmitComment := True; + try + if Parser.ToLexem(SelectCode) <> lcEnd then begin + FirstPos := 0; + LastPos := 0; + BracketCount := 0; + Code := Parser.GetNext(StLex); //+++ char instead of string + repeat + if Code = lcBlank then begin + if LastPos = 0 then + LastPos := Parser.PrevPos; + end + else begin + LastPos := 0; + + if Code = WhereCode then begin + if BracketCount = 0 then begin + if Condition = '' then + FirstPos := Parser.PrevPrevPos + 1 + else begin + Parser.GetNext(StLex); // blank + FirstPos := Parser.CurrPos + 1; + end; + end; + end + else + if Code = lcSymbol then begin + if StLex = '(' then + Inc(BracketCount) + else + if StLex = ')' then + Dec(BracketCount); + end; + end; + + Code := Parser.GetNext(StLex); + until (Code = lcEnd) or (Parser.IsClauseLexem(Code) and (Code <> WhereCode)) and (BracketCount = 0); + + if LastPos = 0 then + LastPos := Length(Result); + + if FirstPos > 0 then + Delete(Result, FirstPos, LastPos - FirstPos + 1); + + if Condition <> '' then begin + if FirstPos = 0 then begin + FirstPos := LastPos + 1; + Condition := ' WHERE ' + Condition; + if Pos(#13, Copy(Result, 1, FirstPos)) > 0 then + Condition := LineSeparator + ' ' + Condition; + end; + Insert(Condition, Result, FirstPos); + end; + end; + finally + Parser.Free; + end; +end; + +function _GetWhere( + const SQL: string; + ParserClass: TParserClass; // TOraParser, TMSparser, TMyParser + OmitComment: boolean; + SelectCode, WhereCode: integer + ): string; +var + Parser: TParser; + IsWhere: boolean; + Code: integer; + StLex: string; + BracketCount: integer; + WherePos: integer; + IsMacro: boolean; + MacroSt: string; +begin + Result := ''; + Parser := ParserClass.Create(PChar(SQL)); + Parser.OmitComment := OmitComment; + WherePos := 0; + IsMacro := False; + MacroSt := MacroChar; + try + if Parser.ToLexem(SelectCode) <> lcEnd then begin + IsWhere := False; + BracketCount := 0; + repeat + Code := Parser.GetNext(StLex); //+++ char instead of string + if (Code = WhereCode) and (not IsMacro) and (BracketCount = 0) then begin + IsWhere := True; + WherePos := Parser.CurrPos + 2; + end + else + if Code = lcSymbol then + if StLex = '(' then + Inc(BracketCount) + else + if StLex = ')' then + Dec(BracketCount); + + IsMacro := (Code <> lcString) and (StLex = MacroSt); + if (BracketCount = 0) and Parser.IsClauseLexem(Code) and (Code <> WhereCode) then begin + Parser.Back; + Break; + end; + until Code = lcEnd; + + if IsWhere then + Result := Copy(SQL, WherePos, Parser.CurrPos - WherePos + 1); + end; + finally + Parser.Free; + end; +end; + +function _SetOrderBy( + const SQL: string; Fields: string; + ParserClass: TParserClass; + SelectCode, OrderCode, ByCode: Integer + ): string; +var + Parser: TParser; + FirstPos: integer; + LastPos: integer; + Code: integer; + i, p, pOrder: integer; +begin + for i := 1 to Length(Fields) do + if Fields[i] = ';' then + Fields[i] := ','; + + Result := SQL; + Parser := ParserClass.Create(PChar(Result)); + Parser.OmitBlank := False; + Parser.OmitComment := True; + try + if Parser.ToLexem(SelectCode) <> lcEnd then begin + FirstPos := 0; + LastPos := 0; + Code := Parser.GetNextCode; + pOrder := Parser.PosClauseLexem(OrderCode); + repeat + if Code = OrderCode then begin + if Fields = '' then + FirstPos := Parser.PrevPrevPos + 1; + Parser.GetNextCode; // blank + if Parser.GetNextCode = ByCode then begin + if Fields <> '' then begin + Parser.GetNextCode; // blank + FirstPos := Parser.CurrPos + 1; + end; + end + else + FirstPos := 0; + end; + + if (Code = lcBlank) or (Code = lcComment) then begin + if LastPos = 0 then + LastPos := Parser.PrevPos; + end + else + LastPos := 0; + + Code := Parser.GetNextCode; + p := Parser.PosClauseLexem(Code); + if p > pOrder then + Break; + until (Code = lcEnd); + + if LastPos = 0 then + LastPos := Length(Result); + + if FirstPos > 0 then + Delete(Result, FirstPos, LastPos - FirstPos + 1); + + if Fields <> '' then begin + if FirstPos = 0 then begin + FirstPos := LastPos + 1; + Fields := ' ORDER BY ' + Fields; + if Pos(#13, Copy(Result, 1, FirstPos)) > 0 then + Fields := LineSeparator + ' ' + Fields; + end; + Insert(Fields, Result, FirstPos); + end; + end; + finally + Parser.Free; + end; +end; + +function _GetOrderBy( + const SQL: string; + ParserClass: TParserClass; + SelectCode, OrderCode, ByCode: Integer +): string; +var + Parser: TParser; + FirstPos: integer; + LastPos: integer; + Code: integer; +begin + Result := ''; + Parser := ParserClass.Create(PChar(SQL)); + try + FirstPos := 0; + LastPos := Length(SQL); + if Parser.ToLexem(SelectCode) <> lcEnd then begin + if Parser.ToLexem(OrderCode) <> lcEnd then + if Parser.GetNextCode = ByCode then + FirstPos := Parser.CurrPos + 1 + else + FirstPos := 0; + + if FirstPos <> 0 then begin + Result := Copy(SQL, FirstPos, LastPos - FirstPos + 1); + + Parser.SetText(Result); + repeat + Code := Parser.GetNextCode; + if Parser.IsClauseLexem(Code) then + Result := Copy(Result, 0, Parser.PrevPos); + until Code = lcEnd; + end; + end; + finally + Parser.Free; + end; +end; + +function UpdateKindToStatementType(const UpdateKind: TUpdateKind): TStatementType; +begin + case UpdateKind of + DB.ukModify: + Result := stUpdate; + DB.ukInsert: + Result := stInsert; + DB.ukDelete: + Result := stDelete; + else + begin + Result := stCustom; // To prevent compiler warning + Assert(False); + end; + end; +end; + +function StatementTypeToUpdateKind(const StatementType: TStatementType): TUpdateKind; +begin + case StatementType of + stUpdate: + Result := DB.ukModify; + stInsert: + Result := DB.ukInsert; + stDelete: + Result := DB.ukDelete; + else + begin + Result := DB.ukInsert; // To prevent compiler warning + Assert(False); + end; + end; +end; +{ EDAError } + +constructor EDAError.Create(ErrorCode: integer; Msg: string); +begin + inherited Create(Msg); + + FErrorCode := ErrorCode; +end; + +{ TDAConnectionOptions } + +constructor TDAConnectionOptions.Create(Owner: TCustomDAConnection); +begin + inherited Create; + + FOwner := Owner; + KeepDesignConnected := True; +end; + +procedure TDAConnectionOptions.AssignTo(Dest: TPersistent); +begin + if Dest is TDAConnectionOptions then begin + TDAConnectionOptions(Dest).KeepDesignConnected := KeepDesignConnected; + TDAConnectionOptions(Dest).DisconnectedMode := DisconnectedMode; + end + else + inherited; +end; + +procedure TDAConnectionOptions.SetDisconnectedMode(Value: boolean); +begin + if Value <> DisconnectedMode then begin + FOwner.Disconnect; + FDisconnectedMode := Value; + if FOwner.FIConnection <> nil then + FOwner.FIConnection.SetProp(prDisconnectedMode, Value); + end; +end; + +{ TPoolingOptions } + +constructor TPoolingOptions.Create(Owner: TCustomDAConnection); +begin + inherited Create; + + FOwner := Owner; + FMaxPoolSize := 100; +end; + +procedure TPoolingOptions.AssignTo(Dest: TPersistent); +begin + if Dest is TPoolingOptions then begin + TPoolingOptions(Dest).FMaxPoolSize := FMaxPoolSize; + TPoolingOptions(Dest).FMinPoolSize := FMinPoolSize; + TPoolingOptions(Dest).FConnectionLifetime := FConnectionLifetime; + TPoolingOptions(Dest).FValidate := FValidate; + end + else + inherited; +end; + +{ TCustomDAConnection } + +constructor TCustomDAConnection.Create(Owner: TComponent); +begin + inherited Create(Owner); + + FSQLs := TDAList.Create; + FAutoCommit := True; + LoginPrompt := True; + + FOptions := CreateOptions; + FPoolingOptions := CreatePoolingOptions; + FShouldShowPrompt := True; + + hRegisterClient := TCriticalSection.Create; +end; + +destructor TCustomDAConnection.Destroy; +begin + try + Disconnect; + finally + ClearRefs; + + inherited; + + FSQLs.Free; // placed after inherited for successful UnregisterClient on destroy + FreeIConnection; + FPoolingOptions.Free; + FOptions.Free; + hRegisterClient.Free; + end; +end; + +procedure TCustomDAConnection.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + + if (Operation = opRemove) and (FConnectDialog = AComponent) then + FConnectDialog := nil; +end; + +function TCustomDAConnection.GetIConnectionClass: TCRConnectionClass; +begin + Assert(False, 'Must be overrided'); + Result := TCRConnection; +end; + +function TCustomDAConnection.GetICommandClass: TCRCommandClass; +begin + Assert(False, 'Must be overrided'); + Result := TCRCommand; +end; + +function TCustomDAConnection.GetIRecordSetClass: TCRRecordSetClass; +begin + Assert(False, 'Must be overrided'); + Result := TCRRecordSet; +end; + +procedure TCustomDAConnection.CreateIConnection; +begin + SetIConnection(nil); +end; + +function TCustomDAConnection.CreateICommand: TCRCommand; +begin + Result := GetICommandClass.Create; + Result.SetConnection(nil); +end; + +function TCustomDAConnection.CreateIRecordSet: TCRRecordSet; +begin + Result := GetIRecordSetClass.Create; + Result.SetConnection(FIConnection); +end; + +procedure TCustomDAConnection.FreeIConnection; +begin + if FIConnection = nil then + exit; + + if FIConnection.Pool <> nil then + FIConnection.ReturnToPool + else + FIConnection.Free; + SetIConnection(nil); +end; + +procedure TCustomDAConnection.SetIConnection(Value: TCRConnection); +var + i: integer; +begin + if Value <> nil then begin + FIConnection := Value; + FIConnection.OnError := DoError; + FIConnection.OnReconnectError := Disconnect; + FIConnection.OnReconnectSuccess := DoAfterConnect; + FIConnection.Component := Self; + + for i := 0 to FSQLs.Count - 1 do begin + TCustomDASQL(FSQLs[i]).CheckICommand; + TCustomDASQL(FSQLs[i]).FICommand.SetConnection(FIConnection); + end; + for i := 0 to DataSetCount - 1 do begin + (DataSets[i] as TCustomDADataSet).CheckIRecordSet; + (DataSets[i] as TCustomDADataSet).FIRecordSet.SetConnection(FIConnection); + end; + end + else begin + if (FIConnection <> nil) and not (csDestroying in ComponentState) then begin + for i := 0 to FSQLs.Count - 1 do + if TCustomDASQL(FSQLs[i]).FICommand <> nil then + TCustomDASQL(FSQLs[i]).FICommand.SetConnection(Value {nil}); + for i := 0 to DataSetCount - 1 do + if (DataSets[i] as TCustomDADataSet).FIRecordSet <> nil then + TCustomDADataSet(DataSets[i]).FIRecordSet.SetConnection(Value {nil}); + end; + FIConnection := Value; + end; +end; + +function TCustomDAConnection.CreateDataSet: TCustomDADataSet; +begin + Result := TCustomDADataSet.Create(nil); // Self ??? + Result.Connection := Self; +end; + +function TCustomDAConnection.CreateSQL: TCustomDASQL; +begin + Result := TCustomDASQL.Create(nil); + Result.Connection := Self; +end; + +procedure TCustomDAConnection.RemoveFromPool; +begin + if FIConnection <> nil then + FIConnection.IsValid := False; +end; + +procedure TCustomDAConnection.MonitorMessage(const Msg: string); +var + MessageID: cardinal; +begin + TDASQLMonitorClass(SQLMonitorClass).CustomMessage(Self, Msg, MessageID); +end; + +procedure TCustomDAConnection.Loaded; +begin + inherited; + + try + try + if FStreamedConnected then + SetConnected(True); + except + on E: Exception do + if csDesigning in ComponentState then + ShowException(E, ExceptAddr) + else + raise; + end; + finally + FStreamedConnected := False; + end; +end; + +procedure TCustomDAConnection.ClearRefs; +begin + while FSQLs.Count > 0 do + TCustomDASQL(FSQLs[0]).Connection := nil; + while DataSetCount > 0 do + (DataSets[0] as TCustomDADataSet).Connection := nil; +end; + +procedure TCustomDAConnection.RegisterClient(Client: TObject; Event: TConnectChangeEvent = nil); +begin + hRegisterClient.Enter; + try + inherited; + + if Client is TCustomDASQL then + FSQLs.Add(Client); + finally + hRegisterClient.Leave; + end; +end; + +procedure TCustomDAConnection.UnRegisterClient(Client: TObject); +begin + hRegisterClient.Enter; + try + inherited; + + if Client is TCustomDASQL then + FSQLs.Remove(Client); + finally + hRegisterClient.Leave; + end; +end; + +function TCustomDAConnection.SQLMonitorClass: TClass; +begin + Result := TCustomDASQLMonitor; +end; + +function TCustomDAConnection.ConnectDialogClass: TConnectDialogClass; +begin + Result := TCustomConnectDialog; +end; + +function TCustomDAConnection.NeedPrompt: boolean; +begin + Result := (LoginPrompt or (csDesigning in ComponentState) and + ((Username = '') or (Password = ''))) and + not ((csDesigning in ComponentState) and ((csReading in ComponentState) or FStreamedConnected)); +end; + +function TCustomDAConnection.IsConnectedStored: boolean; +begin + Result := Connected and not Options.DisconnectedMode; //In disconnect mode Design-time connection disabled +end; + +procedure TCustomDAConnection.DoConnect; +var + MessageID: cardinal; +begin + TDASQLMonitorClass(SQLMonitorClass).DBConnect(Self, MessageID, True); + + CreateIConnection; + PushOperation(clConnect); + StartWait; + try + FIConnection.SetUsername(FUsername); + FIConnection.SetPassword(FPassword); + FIConnection.SetServer(FServer); + + FIConnection.Connect(''); + finally + StopWait; + PopOperation; + end; + + TDASQLMonitorClass(SQLMonitorClass).DBConnect(Self, MessageID, False); +end; + +procedure TCustomDAConnection.DoDisconnect; +var + MessageID: cardinal; +begin + try + try + if InTransaction and not FInProcessError {to prevent call Commit(Rollback) on fatal error} then + if CommitOnDisconnect then + Commit + else + Rollback; + finally + if Connected then begin //disconnect was done in Commit or Rollback + TDASQLMonitorClass(SQLMonitorClass).DBDisconnect(Self, MessageID, True); + + if (FIConnection.Pool <> nil) and FIConnection.IsValid then begin + FIConnection.ReturnToPool; + SetIConnection(nil); + end + else + FIConnection.Disconnect; + + TDASQLMonitorClass(SQLMonitorClass).DBDisconnect(Self, MessageID, False); + end; + end; + except + on E: EDAError do begin + if not((csDestroying in ComponentState) and IsFatalError(E)) then + raise; + end + else + raise; + end; +end; + +function TCustomDAConnection.CommitOnDisconnect: boolean; +begin + Result := True; +end; + +procedure TCustomDAConnection.InternalConnect; +var + StoredConnectCount: integer; + StoredLoginPrompt: boolean; +begin + Inc(FConnectCount); + StoredConnectCount := FConnectCount; + StoredLoginPrompt := LoginPrompt; + LoginPrompt := LoginPrompt and FShouldShowPrompt; + try + try + Connect; + except + on EFailOver do; + else begin + if not Connected then + Dec(StoredConnectCount);//Restore ConnectCount in case of Connection Failure + raise; + end; + end; + finally + FConnectCount := StoredConnectCount; + LoginPrompt := StoredLoginPrompt; + FShouldShowPrompt := not Connected; //in case of Connect Exception LogPrompt appears again + end; +end; + +procedure TCustomDAConnection.InternalDisconnect; +begin + Dec(FConnectCount); + if FConnectCount < 0 then //This could happen in case of Commit/RollBack after Execute with AutoCommit = False + FConnectCount := 0; + if (FConnectCount = 0) and Options.DisconnectedMode then + if not InTransaction then //Execute with AutoCommit = False, after execute InTransaction = True, so wait for Commit/RollBack or for + //execute with AutoCommit = True + Disconnect; + FShouldShowPrompt := False; +end; + +procedure TCustomDAConnection.Connect; +begin + SetConnected(True); +end; + +procedure TCustomDAConnection.Disconnect; +begin + SetConnected(False); +end; + +procedure TCustomDAConnection.PerformConnect(Retry: boolean); +begin + if csReading in ComponentState then + FStreamedConnected := True + else begin + if GetConnected then + Exit; + if not Retry and Assigned(BeforeConnect) then + BeforeConnect(Self); + DoConnect; + Inc(FConnectCount); + SendConnectEvent(True); + if Assigned(AfterConnect) then + AfterConnect(Self); + end; +end; + +procedure TCustomDAConnection.GetTableNames(List: TStrings); +begin + List.Clear; +end; + +procedure TCustomDAConnection.GetDatabaseNames(List: TStrings); +begin + List.Clear; +end; + +procedure TCustomDAConnection.GetStoredProcNames(List: TStrings); +begin + List.Clear; +end; + +{ Transaction control } + +procedure TCustomDAConnection.SuppressAutoCommit; +var + Temp: boolean; +begin + Temp := False; + FIConnection.SetProp(prAutoCommit, Temp); +end; + +procedure TCustomDAConnection.RestoreAutoCommit; +begin + FIConnection.SetProp(prAutoCommit, FAutoCommit); +end; + +procedure TCustomDAConnection.InternalStartTransaction; +begin + FIConnection.StartTransaction; + FTransactionID := 'Local'; +end; + +procedure TCustomDAConnection.StartTransaction; +var + MessageID: cardinal; + ReStart: boolean; +begin + if Options.DisconnectedMode then + InternalConnect; + if not Connected then + DatabaseError(SConnectionIsClosed); + if InTransaction then + DatabaseError(STransactionInProgress); + + TDASQLMonitorClass(SQLMonitorClass).TRStart(Self, MessageID, True); + + PushOperation(clTransStart); + try + repeat + ReStart := False; + try + InternalStartTransaction; + FTransactionID := 'Local'; + SuppressAutoCommit; + except + on E: EFailOver do + ReStart := True; + end + until not ReStart; + finally + PopOperation; + end; + TDASQLMonitorClass(SQLMonitorClass).TRStart(Self, MessageID, False); +end; + +procedure TCustomDAConnection.Commit; +var + MessageID: cardinal; + WasInTransaction: boolean; +begin + if not Connected then + DatabaseError(SConnectionIsClosed); + + WasInTransaction := InTransaction; + TDASQLMonitorClass(SQLMonitorClass).TRCommit(Self, MessageID, True); + + FIConnection.Commit; + FTransactionID := ''; + RestoreAutocommit; + + TDASQLMonitorClass(SQLMonitorClass).TRCommit(Self, MessageID, False); + if WasInTransaction and Options.DisconnectedMode then //Only in case of explicit transaction start + InternalDisconnect; +end; + +procedure TCustomDAConnection.Rollback; +var + MessageID: cardinal; + WasInTransaction: boolean; +begin + if not Connected then + DatabaseError(SConnectionIsClosed); + + WasInTransaction := InTransaction; + TDASQLMonitorClass(SQLMonitorClass).TRRollback(Self, MessageID, True); + + FIConnection.Rollback; + FTransactionID := ''; + RestoreAutoCommit; + + TDASQLMonitorClass(SQLMonitorClass).TRRollback(Self, MessageID, False); + if WasInTransaction and Options.DisconnectedMode then //Only in case of explicit transaction start + InternalDisconnect; +end; + +procedure TCustomDAConnection.ApplyUpdates(DataSets: array of TCustomDADataSet); +var + DataSet: TCustomDADataSet; + i: integer; + ReApply: boolean; +begin + PushOperation(clConnectionApply); + try + repeat + ReApply := False; + for i := 0 to High(DataSets) do begin + DataSet := DataSets[i]; + if DataSet.Connection <> Self then + DatabaseError(Format(SUpdateWrongDB, [DataSet.Name, Name])); + end; + try + StartTransaction; + try + for i := 0 to High(DataSets) do begin + DataSet := DataSets[i]; + if DataSet.Active and DataSet.CachedUpdates then + DataSet.ApplyUpdates; + end; + Commit; + except + on EFailOver do raise; + else begin + Rollback; + raise; + end; + end; + + for i := 0 to High(DataSets) do begin + DataSet := DataSets[i]; + if (DataSet.Connection = Self) and DataSet.Active and DataSet.CachedUpdates then + DataSet.CommitUpdates; + end; + except + on EFailOver do + ReApply := True; + end; + until (not ReApply); + finally + PopOperation; + end; +end; + +procedure TCustomDAConnection.ApplyUpdates; +var + i: integer; + DataSetArray: array of TCustomDADataSet; +begin + SetLength(DataSetArray, DataSetCount); + for i := 0 to DataSetCount - 1 do + DataSetArray[i] := TCustomDADataSet(DataSets[i]); + ApplyUpdates(DataSetArray); +end; + +//Operations stack +function TCustomDAConnection.PushOperation(Operation: TConnLostCause; AllowFailOver: boolean = true): integer; +var + FOOperation: TFailOverOperation; +begin + Result := 0; + if Options.LocalFailover then begin + if FOperationsStackLen = Length(FOperationsStack) then + SetLength(FOperationsStack, FOperationsStackLen + OperationsStackDelta); + + Result := FOperationsStackLen; + FOOperation.Operation := Operation; + FOOperation.AllowFailOver := AllowFailOver; + FOperationsStack[Result] := FOOperation; + Inc(FOperationsStackLen); + end; +end; + +function TCustomDAConnection.PopOperation: TConnLostCause; +begin + Result := clUnknown; + if Options.LocalFailover then begin + Result := FOperationsStack[FOperationsStackLen].Operation; + Dec(FOperationsStackLen); + end; +end; + +function TCustomDAConnection.IsFatalError(E: EDAError): boolean; +begin + Result := False; +end; + +procedure TCustomDAConnection.ResetOnFatalError; +begin + //should be ovveriden on product level +end; + +procedure TCustomDAConnection.RestoreAfterFailOver; +begin + //should be ovveriden on product level +end; + +function TCustomDAConnection.DetectConnLostCause(Component: TObject): TConnLostCause; +var + i: integer; + AllowFailOver: boolean; +begin + Result := clUnknown; + AllowFailOver := True; + for i := FOperationsStackLen - 1 downto 0 do begin + + if Result < FOperationsStack[i].Operation then begin + Result := FOperationsStack[i].Operation; + AllowFailOver := FOperationsStack[i].AllowFailOver; + end; + + case Result of + clConnect: begin + if TCustomDAConnection(Component).FShouldShowPrompt then + Result := clUnknown;// This is the first connect or non DisconnectedMode - so we should raise exception + break; + end; + clOpen, clExecute: begin + if ((Component is TCustomDADataSet) and not TCustomDADataSet(Component).IsQuery) or + (Component is TCustomDASQL) then + Inc(FConnectCount); // Add ConnectCount - > cause of EndConnection in TCustomDADataSet.DoAfterExecute + end; + end; + end; + + if not AllowFailOver then + Result := clUnknown; +end; + +procedure TCustomDAConnection.DoError(E: Exception; var Fail, Reconnect, Reexecute: boolean; + ReconnectAttempt: integer; var ConnLostCause: TConnLostCause); +var + i: integer; + FatalError: boolean; + RetryMode: TRetryMode; +begin + ConnLostCause := clUnknown; + TDASQLMonitorClass(SQLMonitorClass).DBError(EDAError(E)); + + FatalError := IsFatalError(EDAError(E)); + + if FatalError then begin + + with EDAError(E) do begin + ConnLostCause := DetectConnLostCause(Component); + + Reconnect := + (Connected + or ((ReconnectAttempt > 0) and Options.LocalFailover) // After first abortive attempt Connected = False + or (ConnLostCause = clConnect) and Options.DisconnectedMode) // For disconnect mode TODO: + and ((FTransactionID = '') or (ConnLostCause = clConnectionApply)); // and not InTransaction - ODAC specific: InTransaction can raise exception + + if Reconnect then + for i := 0 to DataSetCount - 1 do begin + Assert(DataSets[i] is TCustomDADataSet); + if TCustomDADataSet(DataSets[i]).Prepared or + ((DataSets[i].Active and not TCustomDADataSet(DataSets[i]).FetchAll + and not TCustomDADataSet(DataSets[i]).Fetched) and + not ((ConnLostCause = clRefresh) and (DataSets[i] = Component))) //In case of Refresh and Active dataset with unfetched data. + then begin + Reconnect := False; + Break; + end; + end; + + if Reconnect then + for i := 0 to FSQLs.Count - 1 do begin + Assert(TObject(FSQLs[i]) is TCustomDASQL); + if TCustomDASQL(FSQLs[i]).Prepared and not TCustomDASQL(FSQLs[i]).Executing then begin + Reconnect := False; + Break; + end; + end; + end; + end; + + if Reconnect then + if Options.LocalFailover then begin + if (ConnLostCause = clUnknown) or (ConnLostCause = clExecute) then + RetryMode := rmRaise + else + RetryMode := rmReconnectExecute; + + if Assigned(FOnConnectionLost) then + FOnConnectionLost(Self, TComponent(EDAError(E).Component), ConnLostCause, RetryMode); + Reconnect := RetryMode > rmRaise; + Reexecute := ((RetryMode > rmReconnect) and not (ConnLostCause = clUnknown)) or + ((ConnLostCause = clConnect) and (RetryMode >= rmReconnect)); + Fail := not Reexecute; + end; + + if not Options.LocalFailover or not Reconnect then + if Assigned(FOnError) then + FOnError(Self, EDAError(E), Fail); + + if FatalError and (FIConnection <> nil) then begin + FIConnection.IsValid := False; + if FIConnection.Pool <> nil then + TCRConnectionPool(FIConnection.Pool).Invalidate; + end; + + if FatalError and (ReconnectAttempt = 0) then + ResetOnFatalError; + + if not FInProcessError and not Reconnect and FatalError and + (ReconnectAttempt = 0) // If Attempt > 0 disconnect was called on CRAccess level + then begin + FInProcessError := True; + try + Disconnect; + except // don't raise exception + end; + FInProcessError := False; + end; +end; + +function TCustomDAConnection.IsKeyViolation(E: EDAError): boolean; +begin + Result := False; +end; + +procedure TCustomDAConnection.AssignTo(Dest: TPersistent); +begin + if Dest is TCustomDAConnection then begin + TCustomDAConnection(Dest).Username := Username; + TCustomDAConnection(Dest).Password := Password; + TCustomDAConnection(Dest).Server := Server; + TCustomDAConnection(Dest).LoginPrompt := LoginPrompt; + PoolingOptions.AssignTo(TCustomDAConnection(Dest).PoolingOptions); + TCustomDAConnection(Dest).Pooling := Pooling; + TCustomDAConnection(Dest).ConnectDialog := ConnectDialog; + TCustomDAConnection(Dest).OnError := OnError; + TCustomDAConnection(Dest).ConvertEOL := ConvertEOL; + Options.AssignTo(TCustomDAConnection(Dest).Options); + TCustomDAConnection(Dest).AutoCommit := AutoCommit; + + TCustomDAConnection(Dest).AfterConnect := AfterConnect; + TCustomDAConnection(Dest).BeforeConnect := BeforeConnect; + TCustomDAConnection(Dest).AfterDisconnect := AfterDisconnect; + TCustomDAConnection(Dest).BeforeDisconnect := BeforeDisconnect; + TCustomDAConnection(Dest).OnLogin := OnLogin; + end + else + inherited; +end; + +function TCustomDAConnection.GetConnected: boolean; +begin + Result := (FIConnection <> nil) and FIConnection.GetConnected; +end; + +procedure TCustomDAConnection.SetConnected(Value: boolean); +var + Dialog: TCustomConnectDialog; + DialogResult: boolean; + OldBeforeDisconnect: TNotifyEvent; + StoredConnectCount: integer; +begin + OldBeforeDisconnect := nil; + try + if Value <> GetConnected then begin + try + // ignore exceptions to disconnect all client + if not Value then begin + FConnectCount := 0; //Explicit disconnect + FShouldShowPrompt := True; + if Assigned(BeforeDisconnect) then BeforeDisconnect(Self); + while True do + try + SendConnectEvent(False); + break; + except + on E: EDAError do + if not IsFatalError(E) then + raise + end; + end + else + if not FStreamedConnected then //DFM loading issue + Inc(FConnectCount); + finally + if csReading in ComponentState then begin + if FOptions.KeepDesignConnected or (csDesigning in ComponentState) then + FStreamedConnected := Value; + end + else if not Value then begin + OldBeforeDisconnect := BeforeDisconnect; + if Assigned(BeforeDisconnect) then //Design-time event lose fix + BeforeDisconnect := nil; + + inherited SetConnected(False); //There is no server operations + + FTransactionID := ''; + end; + end; + if not (csReading in ComponentState) and Value then begin + if NeedPrompt and (ConnectDialogClass <> nil) then begin + if FConnectDialog = nil then + Dialog := ConnectDialogClass.Create(nil) + else + Dialog := FConnectDialog; + StoredConnectCount := FConnectCount; + DialogResult := False; + try + Dialog.FConnection := Self; + DialogResult := Dialog.Execute; + finally + if not DialogResult then + Dec(StoredConnectCount); + FConnectCount := StoredConnectCount; + if FConnectDialog = nil then + Dialog.Free; + end; + + if not DialogResult then begin + if FStreamedConnected or (csDesigning in ComponentState) then + DatabaseError(SCannotConnect) + else + Abort; + end; + end + else begin + StoredConnectCount := FConnectCount; + try + try + PerformConnect; + except + if not Connected then + Dec(StoredConnectCount);//Restore ConnectCount in case of Connection Failure + raise; + end; + finally + FConnectCount := StoredConnectCount; + end; + end; + end; + end; + finally + if Assigned(OldBeforeDisconnect) then + BeforeDisconnect := OldBeforeDisconnect; + end; +end; + +procedure TCustomDAConnection.SetUsername(const Value: string); +begin + if Value <> FUsername then begin + Disconnect; + FUsername := Value; + end; +end; + +procedure TCustomDAConnection.SetPassword(const Value: string); +begin + if Value <> FPassword then begin + Disconnect; + FPassword := Value; + end; +end; + +procedure TCustomDAConnection.SetServer(const Value: string); +begin + if Value <> FServer then begin + Disconnect; + FServer := Value; + end; +end; + +function TCustomDAConnection.GetConnectString: string; +begin + Result := ''; +end; + +procedure TCustomDAConnection.SetConnectString(Value: string); +begin +end; + +procedure TCustomDAConnection.SetAutoCommit(Value: boolean); +begin + FAutoCommit := Value; + if FIConnection <> nil then + FIConnection.SetProp(prAutoCommit, FAutoCommit); +end; + +function TCustomDAConnection.GetInTransaction: boolean; +begin + Result := GetTransactionID <> ''; +end; + +function TCustomDAConnection.GetTransactionID: string; +begin + Result := FTransactionID; +end; + +procedure TCustomDAConnection.SetConvertEOL(Value: boolean); +begin + FConvertEOL := Value; + if FIConnection <> nil then + FIConnection.SetProp(prConvertEOL, Value); +end; + +function TCustomDAConnection.CreateOptions: TDAConnectionOptions; +begin + Result := TDAConnectionOptions.Create(Self); +end; + +procedure TCustomDAConnection.SetOptions(Value: TDAConnectionOptions); +begin + FOptions.Assign(Value); +end; + +function TCustomDAConnection.CreatePoolingOptions: TPoolingOptions; +begin + Result := TPoolingOptions.Create(Self); +end; + +procedure TCustomDAConnection.SetPoolingOptions(Value: TPoolingOptions); +begin + FPoolingOptions.Assign(Value); +end; + +function TCustomDAConnection.IsCaseSensitive: boolean; +begin + Result := True; +end; + +procedure TCustomDAConnection.SetConnectDialog(Value: TCustomConnectDialog); +begin + if Value <> FConnectDialog then begin + if FConnectDialog <> nil then begin + RemoveFreeNotification(FConnectDialog); + if FConnectDialog.FConnection = Self then + FConnectDialog.FConnection := nil; + end; + + FConnectDialog := Value; + + if FConnectDialog <> nil then begin + FreeNotification(FConnectDialog); + FConnectDialog.FConnection := Self; + end; + end; +end; + +procedure TCustomDAConnection.SetPooling(Value: boolean); +begin + if FPooling <> Value then begin + SetConnected(False); + FreeIConnection; + end; + FPooling := Value; +end; + +procedure TCustomDAConnection.DoAfterConnect; +begin + if Assigned(AfterConnect) then + AfterConnect(Self); +end; + +{ TDAParamsInfo } + +function TDAParamsInfo.GetItem(Index: Integer): TDAParamInfo; +begin + Result := TDAParamInfo(inherited GetItem(Index)); +end; + +procedure TDAParamsInfo.SetItem(Index: Integer; Value: TDAParamInfo); +begin + inherited SetItem(Index, Value); +end; + +{ TDAParam } + +destructor TDAParam.Destroy; +begin + FreeObject; + + inherited; +end; + +procedure TDAParam.Clear; +begin + if IsBlobDataType then + TBlob(FParamObject).Clear + else + inherited Clear; +end; + +procedure TDAParam.Assign(Source: TPersistent); +{$IFDEF VER6P} +var + StreamPersist: IStreamPersist; +{$ENDIF} + +{$IFDEF VER6P} + procedure Load(const StreamPersist: IStreamPersist); + var + MS: TMemoryStream; + begin + if not (DataType in [ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}, ftOraBlob, ftOraClob]) then + raise Exception.Create(SDataTypeNotSupported); + + MS := TMemoryStream.Create; + try + StreamPersist.SaveToStream(MS); + LoadFromStream(MS, DataType); + finally + MS.Free; + end; + end; +{$ENDIF} + +begin + if Source is TDAParam then begin + AssignParam(TParam(Source)); + {$IFDEF VER6P} + TParam(Self).Size := TParam(Source).Size; // CR11511 + {$ENDIF} + FSize := TDAParam(Source).FSize; // CR11511 + ParamObject := TDAParam(Source).ParamObject; + end + else + if Source is TParam then + AssignParam(TParam(Source)) + else + if Source is TField then + AssignField(TField(Source)) + else + if Source is TStrings then + AsMemo := TStrings(Source).Text + else +{$IFDEF VER6P} + if Supports(Source, IStreamPersist, StreamPersist) then + Load(StreamPersist) + else +{$ENDIF} + inherited Assign(Source); +end; + +procedure TDAParam.AssignParam(Param: TParam); +begin + if Param <> nil then begin + DataType := Param.DataType; + if Param.IsNull then + Clear + else + if IsBlobDataType and not (Param is TDAParam) then + // in MIDAS we need to do such assignment + // as TDAParam.Value = TParam.Value + Value := Param.Value + else + inherited Value := Param.Value; + Name := Param.Name; + if ParamType = ptUnknown then + ParamType := Param.ParamType; + end; +end; + +procedure TDAParam.AssignTo(Dest: TPersistent); +begin + if Dest is TField then + TField(Dest).Value := Value + else + inherited AssignTo(Dest); +end; + +procedure TDAParam.AssignField(Field: TField); +begin + if Field <> nil then begin + AssignFieldValue(Field, Field.Value); + Name := Field.FieldName; + end; +end; + +procedure TDAParam.AssignFieldValue(Field: TField; const Value: Variant); +begin + if Field <> nil then begin + if (Field.DataType = ftString) and TStringField(Field).FixedChar then + DataType := ftFixedChar + else + if (Field.DataType = ftMemo) and (Field.Size > 255) then + DataType := ftString + else + {$IFDEF VER10P} + if (Field.DataType = ftWideMemo) and (Field.Size > 255) then + DataType := ftWideString + else + {$ENDIF} + DataType := Field.DataType; + if + VarIsNull(Value) + {$IFDEF CLR} + or ((Field is TBytesField) and Field.IsNull) // See d7 TField.GetAsByteArray and d8 TVarBytesField(TField).GetAsByteArray for details + {$ENDIF} + then + Clear + else + Self.Value := Value; + end; +end; + +procedure TDAParam.LoadFromFile(const FileName: string; BlobType: TBlobType); +var + Stream: TStream; +begin + Stream := TFileStream.Create(FileName, fmOpenRead); + try + LoadFromStream(Stream, BlobType); + finally + Stream.Free; + end; +end; + +procedure TDAParam.LoadFromStream(Stream: TStream; BlobType: TBlobType); +begin + if not (BlobType in [ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}, ftOraBlob, ftOraClob]) then + raise Exception.Create(SDataTypeNotSupported); + with Stream do begin + DataType := BlobType; + Position := 0; + Assert(FParamObject <> nil, SDataTypeNotSupported); + TBlob(FParamObject).LoadFromStream(Stream); + end; +end; + +procedure TDAParam.SetBlobData(Buffer: TBytes; Size: Integer); +begin + AsBlob := Encoding.Default.GetString(Buffer, 0, Size); +end; + +procedure TDAParam.SetBlobData(Buffer: TValueBuffer); +begin + AsBlob := Marshal.PtrToStringAnsi(Buffer); +end; + +procedure TDAParam.CreateObject; +begin + Assert(FParamObject = nil); + + if DataType in [ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}] then begin + FParamObject := TBlob.Create; + {$IFDEF VER10P} + if DataType = ftWideMemo then + TBlob(FParamObject).IsUnicode := True; + {$ENDIF} + end; +end; + +procedure TDAParam.FreeObject; +begin + if FParamObject <> nil then begin + FParamObject.Free; + FParamObject := nil; + end; +end; + +procedure TDAParam.SetParamObject(Value: TSharedObject); +begin + FreeObject; + + FParamObject := Value; + if FParamObject <> nil then begin + FParamObject.AddRef; + inherited Value := 'Object'; // for IsNull = False + end; +end; + +function TDAParam.IsDataTypeStored: boolean; +begin + Result := Integer(DataType) <= Integer(High(TFieldType)); +end; + +function TDAParam.IsValueStored: boolean; +begin + Result := Bound and not VarIsArray(Value); +end; + +procedure TDAParam.DefineProperties(Filer: TFiler); + + function WriteData: boolean; + begin + Result := not IsDataTypeStored; + end; + +begin + inherited DefineProperties(Filer); + + Filer.DefineProperty('ExtDataType', ReadExtDataType, WriteExtDataType, WriteData); +end; + +procedure TDAParam.ReadExtDataType(Reader: TReader); +begin + DataType := TFieldType(Reader.ReadInteger); +end; + +procedure TDAParam.WriteExtDataType(Writer: TWriter); +begin + Writer.WriteInteger(Integer(DataType)); +end; + +function TDAParam.IsObjectDataType(DataType: TFieldType): boolean; +begin + Result := DataType in [ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}, ftBlob]; +end; + +function TDAParam.IsObjectDataType: boolean; +begin + Result := IsObjectDataType(DataType); +end; + +function TDAParam.IsBlobDataType: boolean; +begin + Result := DataType in [ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}, ftBlob]; +end; + +function TDAParam.GetDataType: TFieldType; +begin + Result := inherited DataType; +end; + +procedure TDAParam.SetDataType(Value: TFieldType); +begin + if Value <> inherited DataType then begin + if IsObjectDataType then + FreeObject; + + inherited DataType := Value; + + if IsObjectDataType then + CreateObject; + end; +end; + +function TDAParam.GetSize: integer; +begin + Result := FSize; +end; + +procedure TDAParam.SetSize(Value: integer); +begin + FSize := Value; +end; + +function TDAParam.GetAsString: string; +begin + if IsNull then + Result := '' + else + if IsBlobDataType then begin + Assert(FParamObject is TBlob); + Result := TBlob(FParamObject).AsString; + end + else + {$IFNDEF CLR} + if DataType in [ftDate, ftDateTime] then + Result := DateToStr(TVarData(Value).VDate) + else + {$ENDIF} + Result := inherited AsString; +end; + +procedure TDAParam.SetAsString(Value: string); +begin + if IsBlobDataType then + TBlob(FParamObject).AsString := Value + else + if DataType = ftWideString then + AsWideString := Value + else + inherited AsString := Value; +end; + +function TDAParam.GetAsWideString: WideString; +begin + if IsNull then + Result := '' + else + if IsBlobDataType then begin + Assert(FParamObject is TBlob); + Result := TBlob(FParamObject).AsWideString; + end + else + Result := inherited Value; +end; + +procedure TDAParam.SetAsWideString(Value: WideString); +begin + if IsBlobDataType then + TBlob(FParamObject).AsWideString := Value + else + inherited Value := Value; +end; + +function TDAParam.GetAsInteger: integer; +begin + Result := inherited AsInteger; +end; + +procedure TDAParam.SetAsInteger(Value: integer); +begin + inherited AsInteger := Value; +end; + +function TDAParam.GetAsFloat: double; +begin + Result := inherited AsFloat; +end; + +procedure TDAParam.SetAsFloat(Value: double); +begin + inherited AsFloat := Value; +end; + +procedure TDAParam.SetAsBlob(Value: TBlobData); +begin + DataType := ftBlob; + TBlob(FParamObject).AsString := Value +end; + +procedure TDAParam.SetAsMemo(Value: string); +begin + DataType := ftMemo; + Assert(FParamObject <> nil); + TBlob(FParamObject).AsString := Value +end; + +function TDAParam.GetAsBlobRef: TBlob; +begin + if DataType = ftUnknown then + DataType := ftBlob; + + if IsBlobDataType then + Result := FParamObject as TBlob + else + Result := nil; +end; + +procedure TDAParam.SetAsBlobRef(const Value: TBlob); +begin + FreeObject; + + inherited DataType := ftBlob; + + ParamObject := Value; +end; + +function TDAParam.GetAsMemoRef: TBlob; +begin + if DataType = ftUnknown then begin + {$IFDEF VER10P} + if IsBlobDataType and (FParamObject is TBlob) and TBlob(FParamObject).IsUnicode then + DataType := ftWideMemo + else + {$ENDIF} + DataType := ftMemo; + end; + + if IsBlobDataType then + Result := FParamObject as TBlob + else + Result := nil; +end; + +procedure TDAParam.SetAsMemoRef(const Value: TBlob); +begin + FreeObject; + +{$IFDEF VER10P} + if Value.IsUnicode then + inherited DataType := ftWideMemo + else +{$ENDIF} + inherited DataType := ftMemo; + + ParamObject := Value; +end; + +function TDAParam.GetAsVariant: variant; +begin + if IsBlobDataType then + Result := TBlob(FParamObject).AsString + else + Result := inherited Value; +end; + +procedure TDAParam.SetAsVariant(const Value: variant); +begin + if IsBlobDataType then + TBlob(FParamObject).AsString := Value + else + inherited Value := Value; +end; + +{$IFDEF VER6P} +function TDAParam.GetAsSQLTimeStamp: TSQLTimeStamp; +begin + Result := inherited AsSQLTimeStamp; +end; + +procedure TDAParam.SetAsSQLTimeStamp(const Value: TSQLTimeStamp); +begin + inherited AsSQLTimeStamp := Value; +end; +{$ENDIF} + +procedure TDAParam.SetText(const Value: string); +begin + if IsBlobDataType then + TBlob(FParamObject).AsString := Value + else + inherited SetText(Value); +end; + +function TDAParam.GetIsNull: boolean; +begin + if IsBlobDataType then + Result := TBlob(FParamObject).Size = 0 + else + Result := inherited IsNull; +end; + +{ TDAParams } + +constructor TDAParams.Create(Owner: TPersistent); +begin + inherited Create(TDAParam); + + FOwner := Owner; + FNeedsUpdateItem := True; +end; + +procedure TDAParams.Update(Item: TCollectionItem); +begin + if FNeedsUpdateItem then + inherited; +end; + +function TDAParams.GetItem(Index: integer): TDAParam; +begin + Result := TDAParam(inherited Items[Index]); +end; + +procedure TDAParams.SetItem(Index: integer; Value: TDAParam); +begin + inherited Items[Index] := Value; +end; + +function TDAParams.ParamByName(const Value: string): TDAParam; +begin + Result := TDAParam(inherited ParamByName(Value)); +end; + +function TDAParams.FindParam(const Value: string): TDAParam; +begin + Result := TDAParam(inherited FindParam(Value)); +end; + +function TDAParams.CreateParam(FldType: TFieldType; const ParamName: string; + ParamType: TParamType): TDAParam; +begin + Result := TDAParam(inherited CreateParam(ftUnknown, ParamName, ParamType)); + Result.DataType := FldType; +end; + +{ TDADetailDataLink } + +constructor TDADetailDataLink.Create(DataSet: TCustomDADataSet); +begin + inherited Create; + + FDataSet := DataSet; +end; + +procedure TDADetailDataLink.ActiveChanged; +begin + if FDataSet.Active and + not (csDestroying in FDataSet.ComponentState) and + Active + then + FDataSet.RefreshParams; +end; + +procedure TDADetailDataLink.RecordChanged(Field: TField); +begin + if ((Field = nil) or (DataSet.Fields.IndexOf(Field) >= 0)) and FDataSet.Active and + not ((Field <> nil) and (FDataSet.State in [dsEdit, dsInsert])) then + FDataSet.RefreshParams; +end; + +procedure TDADetailDataLink.CheckBrowseMode; +begin + if FDataSet.Active and + not((DataSet.State in [dsInsert]) and (FDataSet.State in [dsEdit,dsInsert])) + then // Prevent post detail before post master + FDataSet.CheckBrowseMode; +end; + +function TDADetailDataLink.GetDetailDataSet: TDataSet; +begin + Result := FDataSet; +end; + +{ TCustomDADataSet } + +constructor TCustomDADataSet.Create(Owner: TComponent); +var + stIdx: TStatementType; +begin + inherited Create(Owner); + + FDataLink := TDADetailDataLink.Create(Self); + + for stIdx := Low(TStatementType) to High(TStatementType) do + if stIdx in GetUpdateSQLStatementTypes then begin + Assert(FUpdateSQL[stIdx] = nil); + FUpdateSQL[stIdx] := TStringList.Create; + TStringList(FUpdateSQL[stIdx]).OnChange := ScanMacros; + end; + + FFetchRows := 25; + FAutoCommit := True; + FRowsAffected := -1; + FRefreshOptions := []; + FLeftQuote := '"'; + FRightQuote := '"'; + + FBatchSQLs := StringBuilder.Create(100); + + CreateCommand; + CreateSQLGenerator; + + SetIRecordSet(FIRecordSet); // TODO - SetIRecordSet called twice + + FDesignCreate := csDesigning in ComponentState; + FOptions := CreateOptions; + + FUpdatingTableInfoIdx := -1; +end; + +destructor TCustomDADataSet.Destroy; +var + stIdx: TStatementType; +begin + Close; + UnPrepare; + + if UsedConnection <> nil then + UsedConnection.UnregisterClient(Self); + + FreeCommand; + FreeSQLGenerator; /// CR11636 + + FOptions.Free; + FDataLink.Free; + FBatchParams.Free; + FBatchSQLs.Free; + + for stIdx := Low(FUpdateComponents) to High(FUpdateComponents) do begin + FUpdateComponents[stIdx].Free; + FUpdateComponents[stIdx] := nil; + FUpdateSQL[stIdx].Free; + FUpdateSQL[stIdx] := nil; + end; + +{$IFDEF MSWINDOWS} + FDetailRefreshTimer.Free; +{$ENDIF} + + inherited; + + SetUpdateObject(nil); +end; + +function TCustomDADataSet.QuoteName(const AName: string): string; +begin + if FOptions.FQuoteNames and (AName <> '') then + Result := Concat(FLeftQuote, AName, FRightQuote) + else + Result := AName; +end; + +function TCustomDADataSet.UnQuoteName(AName: string): string; +var + l: integer; +begin + AName := Trim(AName); + l := Length(AName); + if FOptions.FQuoteNames and (l >= 3) and (AName[1] = FLeftQuote) and (AName[l] = FRightQuote) then + Result := Copy(AName, 2, l - 2) + else + Result := AName; +end; + +procedure TCustomDADataSet.CheckInactive; +begin + inherited CheckInactive; +end; + +procedure TCustomDADataSet.CreateIRecordSet; +begin + if UsedConnection <> nil then + SetIRecordSet(UsedConnection.CreateIRecordSet) + else + SetIRecordSet(nil); +end; + +procedure TCustomDADataSet.FreeIRecordSet; +begin + FIRecordSet.Free; + SetIRecordSet(nil); +end; + +procedure TCustomDADataSet.SetIRecordSet(Value: TData); +var + stIdx: TStatementType; +begin + inherited; + + FIRecordSet := TCRRecordSet(Value); // Value as TCRRecordSet; + if FIRecordSet <> nil then begin + FICommand := FIRecordSet.GetCommand; + FIRecordSet.SetProp(prUniDirectional, FUniDirectional); + FIRecordSet.SetProp(prFetchRows, FFetchRows); + FIRecordSet.SetProp(prFetchAll, FFetchAll); + if FOptions <> nil then begin + FIRecordSet.SetProp(prLongStrings, FOptions.FLongStrings); + FIRecordSet.SetProp(prFlatBuffers, FOptions.FFlatBuffers); + FIRecordSet.TrimFixedChar := FOptions.TrimFixedChar; + FIRecordSet.TrimVarChar := FOptions.TrimVarChar; + end; + + FIRecordSet.AfterExecFetch := DoAfterExecFetch; + FIRecordSet.AfterFetchAll := DoAfterFetchAll; + FIRecordSet.OnBeforeFetch := DoOnBeforeFetch; + FIRecordSet.OnAfterFetch := DoOnAfterFetch; + FIRecordSet.OnDataChanged := DoOnDataChanged; + FIRecordSet.Component := Self; + end + else + FICommand := nil; + + if FCommand <> nil then + FCommand.SetICommand(FICommand); + + if FICommand <> nil then begin + FICommand.SetProp(prAutoCommit, FAutoCommit); + FICommand.AfterExecute := DoAfterExecute; + end; + for stIdx := Low(FUpdateComponents) to High(FUpdateComponents) do + FreeAndNil(FUpdateComponents[stIdx]); + FUpdateQuery := nil; +end; + +procedure TCustomDADataSet.CheckIRecordSet; +var + ClassType: TClass; +begin + if (UsedConnection <> nil) then + ClassType := UsedConnection.GetIRecordSetClass + else + ClassType := nil; + + if (ClassType = nil) or not IsClass(FIRecordSet, ClassType) then begin + FreeIRecordSet; + CreateIRecordSet; + end; +end; + +procedure TCustomDADataSet.CreateCommand; +begin + SetCommand(TCustomDASQL.Create(Self)); +end; + +procedure TCustomDADataSet.FreeCommand; +begin + FCommand.Free; + FCommand := nil; +end; + +procedure TCustomDADataSet.SetCommand(Value: TCustomDASQL); +begin + //FreeCommand; + + FCommand := Value; + if FCommand <> nil then begin + FCommand.SetICommand(FICommand); + FCommand.FDataSet := Self; + + FParams := FCommand.Params; + FMacros := FCommand.Macros; + end; +end; + +function TCustomDADataSet.CreateOptions: TDADataSetOptions; +begin + Result := TDADataSetOptions.Create(Self); +end; + +procedure TCustomDADataSet.Loaded; +begin + FStreamedOpen := True; + try + inherited; + FDesignCreate := False; + finally + FStreamedOpen := False; + end; +end; + +function TCustomDADataSet.UsedConnection: TCustomDAConnection; +begin + Result := FConnection +end; + +procedure TCustomDADataSet.CheckConnection; +begin + BeginConnection(False); +end; + +procedure TCustomDADataSet.BeginConnection(NoConnectCheck: boolean); + function HasDataSet(DAConnection: TCustomDAConnection; DataSet: TDataSet): boolean; + var + i: integer; + begin + for i := 0 to DAConnection.DataSetCount - 1 do begin + if DAConnection.DataSets[i] = DataSet then begin + Result := True; + exit; + end; + end; + Result := False; + end; +begin + if UsedConnection = nil then + DatabaseError(SConnectionNotDefined); + + if NoConnectCheck then + UsedConnection.InternalConnect // We should call connect each time to update ConnectCount + else + if not UsedConnection.Connected then + UsedConnection.Connect; + +// use default session + if (FConnection = nil) and not HasDataSet(UsedConnection, Self) // FDataSets + then begin + UsedConnection.RegisterClient(Self, ConnectChange); + + CheckIRecordSet; + FIRecordSet.SetConnection(UsedConnection.FIConnection) + end; +end; + +procedure TCustomDADataSet.EndConnection; +begin + if UsedConnection <> nil then + UsedConnection.InternalDisconnect; +end; + +procedure TCustomDADataSet.Disconnect; +begin + Close; + UnPrepare; + FieldDefs.Updated := False; +end; + +procedure TCustomDADataSet.ConnectChange(Sender: TObject; Connecting: boolean); +begin + if not Connecting then begin + if not TCustomDAConnection(Sender).Options.DisconnectedMode then + Disconnect + else + FIRecordSet.Disconnect; + end + else + if not (Sender is TCustomDAConnection) then begin // Dll call + Assert(FIRecordSet <> nil); + Assert(UsedConnection <> nil); + Assert(UsedConnection.FIConnection <> nil); + FIRecordSet.SetConnection(UsedConnection.FIConnection); + end; +end; + +{ TablesInfo } + +function TCustomDADataSet.GetTablesInfo: TCRTablesInfo; +begin + Result := FIRecordSet.TablesInfo; +end; + +procedure TCustomDADataSet.SetUpdatingTable(Value: string); +var + i, j: integer; + KeyAndDataFields: TKeyAndDataFields; + OldUpdatingTable: string; + FieldDesc: TFieldDesc; + UpdatingTableIsEmpty: boolean; + + function GetRootParent(FieldDesc: TFieldDesc): TFieldDesc; + begin + Result := FieldDesc; + while Result.ParentField <> nil do + Result := Result.ParentField; + end; +begin + Value := TablesInfo.TableInfoClass.NormalizeName(Value); + OldUpdatingTable := FUpdatingTable; + FUpdatingTable := Value; + + // Clear FCachedKeyAndDataFields + if FUpdatingTable <> OldUpdatingTable then + ClearCachedKeyAndDataFields; + +// Count can be equal to 0 in case: select t.a from (select a from table) t +// if TablesInfo.Count = 0 then +// Exit; // TablesInfo is not avaible (DataSet is not open)} + if not FIRecordSet.Active then + Exit; + + //Assert(Length(FSQLObjects) > 0, 'Function TCustomMSDataSet.SetUpdatingTable cannot be called for non-select query!'); + + UpdatingTableIsEmpty := False; + if TablesInfo.Count = 0 then + i := -1 + else + if Value = '' then // Select default updating table + i := 0 + else begin + i := TablesInfo.IndexByName(Value); + if i = -1 then + i := TablesInfo.IndexByAlias(Value); + + if i = - 1 then begin + if FUpdatingTable <> OldUpdatingTable then begin + FUpdatingTable := OldUpdatingTable; + DatabaseErrorFmt(SBadUpdatingTable, [Value]); + end + else + begin + UpdatingTable := ''; + UpdatingTableIsEmpty := True; // All properties must be setted by previous command + end; + end; + end; + + if not UpdatingTableIsEmpty then begin + FUpdatingTableInfoIdx := i; + + DetectIdentityField; + + if not ReadOnly then begin + // Set Fields[i].ReadOnly Values + if Options.SetFieldsReadOnly and ReadOnlyFieldsEnabled then begin + + for i := 0 to Fields.Count - 1 do + if Fields[i].FieldKind = fkData then + Fields[i].ReadOnly := True; + + GetKeyAndDataFields(KeyAndDataFields, False); + + for i := 0 to Fields.Count - 1 do begin + FieldDesc := GetFieldDesc(Fields[i]); + for j := 0 to High(KeyAndDataFields.DataFieldDescs) do + if (FieldDesc = KeyAndDataFields.DataFieldDescs[j]) or (GetRootParent(FieldDesc) = KeyAndDataFields.DataFieldDescs[j]) then begin + Fields[i].ReadOnly := False; + Break; + end; + end; + end; + end; + end; + + if TablesInfo.Count > 0 then + FOldKeyFields := PSGetKeyFields; +end; + +{ Open/Close } + +procedure TCustomDADataSet.Prepare; +var + MessageID: cardinal; +begin + if not Prepared and not Active then begin + BeginConnection; + + // Get param values from master dataset to avoid bug with master/detail and + // Execute method on detail dataset. + if (FDataLink.DataSource <> nil) and (FDataLink.DataSource.DataSet <> nil) + and (FDataLink.DataSource.DataSet.Active) + then + SetMasterParams(Params); + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLPrepare(Self, FinalSQL, FParams, MessageID, True); + + StartWait; + + FCommand.WriteParams(False); + + inherited; + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLPrepare(Self, FinalSQL, FParams, MessageID, False); + end; +end; + +procedure TCustomDADataSet.UnPrepare; +var + NeedDisconnect: boolean; + MessageID: cardinal; + UnpreparePending: boolean; +begin + NeedDisconnect := Prepared; + UnpreparePending := False; + + if Prepared and (UsedConnection <> nil) then + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then begin + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLUnprepare(Self, FinalSQL, FParams, MessageID, True); + UnpreparePending := True; + end; + + try + inherited; + finally + if NeedDisconnect then + EndConnection; + end; + FIRecordSet.TablesInfo.Clear; + FUpdatingTableInfoIdx := -1; + + if UnpreparePending and (UsedConnection <> nil) then + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLUnprepare(Self, FinalSQL, FParams, MessageID, False); +end; + +procedure TCustomDADataSet.SetActive(Value: Boolean); +begin + if not FStreamedOpen or (csDesigning in ComponentState) or (FConnection = nil) or + FConnection.Options.KeepDesignConnected then + inherited; + + if Value then + FOldTableName := PSGetTableName; +end; + +procedure TCustomDADataSet.BeforeOpenCursor(InfoQuery: boolean); +begin +end; + +procedure TCustomDADataSet.AfterOpenCursor(InfoQuery: boolean); +begin +end; + +function TCustomDADataSet.OpenCursorAllowFailOver: boolean; +begin + Result := True; +end; + +procedure TCustomDADataSet.OpenCursor(InfoQuery: boolean); +var + ReOpen: boolean; +begin + if UsedConnection <> nil then + UsedConnection.PushOperation(clOpen, OpenCursorAllowFailOver); + try + FOldKeyFields := ''; + BeginConnection; + if Active then + Exit; // for open OnChangeConnect + repeat + ReOpen := False; + + BeforeOpenCursor(InfoQuery); + // get param values from master dataset + if (FDataLink.DataSource <> nil) + and (FDataLink.DataSource.DataSet <> nil) + and (FDataLink.DataSource.DataSet.Active) + and (not Foptions.LocalMasterDetail) + then + SetMasterParams(Params); + + if FOptions.QueryRecCount then + FRecordCount := GetRecCount + else + FRecordCount := 0; + + if FNonBlocking then begin + if not InfoQuery then begin + SetCursor(crSQLArrow); + DisableControls; + end; + end + else + StartWait; + + try + FCommand.WriteParams; + inherited; + except + on E: TObject do begin + if FNonBlocking then begin + EnableControls; + StopWait; + end; + if E is EFailOver then begin + UsedConnection.RestoreAfterFailOver; + Reopen := True + end + else begin + EndConnection; + raise; + end; + end; + end; + FRowsAffected := -1; + + AfterOpenCursor(InfoQuery); + until (not ReOpen); + finally + if UsedConnection <> nil then + UsedConnection.PopOperation; + end; +end; + +procedure TCustomDADataset.CloseCursor; +var + stIdx: TStatementType; + NeedDisconnect: boolean; +begin + NeedDisconnect := (FICommand.GetCursorState <> csInactive) and (not FIRecordSet.CanDisconnect); // if command is active and we doesn't + //already substract ConnectCount after all data fetch + inherited; + +/// FUpdateQuery may be prepared for optimization purposes + for stIdx := Low(FUpdateComponents) to High(FUpdateComponents) do + if FUpdateComponents[stIdx] is TCustomDADataSet then + TCustomDADataSet(FUpdateComponents[stIdx]).UnPrepare; + + if NeedDisconnect then //If there is opened cursor then we should disconnect + EndConnection; +end; + +procedure TCustomDADataset.InternalExecute; +var + MessageID: cardinal; +begin + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, '', MessageID, True); + + FIRecordSet.ExecCommand; + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, '', MessageID, False); +end; + +procedure TCustomDADataSet.BeforeExecute; +begin + ; //This routine should be used for actions that performed before execute and + //affected by local failover feature (like PrepareSQL in stored proc) +end; + +procedure TCustomDADataSet.Execute; +var + ReExecute: boolean; +begin + if UsedConnection <> nil then + UsedConnection.PushOperation(clExecute); + try + if Executing then + Exit; + BeginConnection; + if Active then + Close; + repeat + ReExecute := False; + + BeforeExecute; + if not FNonBlocking then + StartWait; + try + if Options.AutoPrepare then + Prepare; + if IsQuery then begin + Open; + EndConnection; //Here we decrement UsedConection.FConnectCount that was incremented in InternalExecute and then + //in OpenCursor, also we make disconection in case of all data fetched during Opening (Less or equal to one fetch block) + end + else begin + // get param values from master dataset + if (FDataLink.DataSource <> nil) + and (FDataLink.DataSource.DataSet <> nil) + and (FDataLink.DataSource.DataSet.Active) + then + SetMasterParams(Params); + if FNonBlocking then + SetCursor(crSQLArrow); + FCommand.WriteParams; + InternalExecute; + if IsQuery then begin + Open; + EndConnection; //Here we decrement UsedConection.FConnectCount that was incremented in InternalExecute and then + //in OpenCursor, also we make disconection in case of all data fetched during Opening (Less or equal to one fetch block) + end; + end; + except + on E: TObject do begin + if FNonBlocking then begin + StopWait; + end; + if (E is EFailOver) and (EFailOver(E).FConnLostCause = clExecute) then begin + UsedConnection.RestoreAfterFailOver; //Restore all read transactions + ReExecute := True; //We should pass clConnectionApplyUpdates FailOver + end + else begin + EndConnection; + raise; + end; + end; + end; + until (not ReExecute); + finally + if UsedConnection <> nil then + UsedConnection.PopOperation; + end; +end; + +procedure TCustomDADataSet.DoAfterExecute(Result: boolean); +var + Value: variant; +begin + if Result then begin + FCommand.ReadParams; + + FICommand.GetProp(prRowsProcessed, Value); + FRowsAffected := Value; + end; + + if FNonBlocking then + StopWait; + + if not IsQuery then begin//Leave connection alive in case of SELECT .Execute instead of .Open to perform Fetch + if UsedConnection.Options.DisconnectedMode and Connection.Connected then begin + //AutoCommit control + if not (UsedConnection.AutoCommit and AutoCommit) and + (UsedConnection.FTransactionID = '') then begin //Connection.GetInTransaction are not allowed here since it could be setted to True on + // Product level during Execuion without AutoCommit (ODAC, IBDAC) + //There is uncommitted transaction that was implicitly started by server + UsedConnection.FTransactionID := 'CRImplicitTransaction'; //Set default value + UsedConnection.FTransactionID := UsedConnection.GetTransactionID; //To return product specific TransactionId + //or even reset InTransaction in case of transaction-free server operation + end + else + if UsedConnection.AutoCommit and AutoCommit then begin + UsedConnection.FTransactionID := UsedConnection.GetTransactionID; //To return product specific TransactionId + end; + end; + EndConnection; //we should read all Out parameters before disconnect + //In NonBlocking Mode this event must be called exactly after server execute + end; + if Assigned(FAfterExecute) then + FAfterExecute(Self, Result); +end; + +procedure TCustomDADataSet.DoAfterExecFetch(Result: boolean); +begin + if Result then + FCommand.ReadParams; + + if FNonBlocking then begin + if Result then begin + if State <> dsInactive then + Resync([]) + end + else + Close; + + if not(FetchAll and Result) then + StopWait; + EnableControls; + end; + + if Assigned(FAfterExecute) then + FAfterExecute(Self, Result); +end; + +procedure TCustomDADataSet.DoAfterFetchAll(Result: boolean); +begin + if FNonBlocking then begin + StopWait; + if Trim(IndexFieldNames) <> '' then + Resync([]); + end; +end; + +procedure TCustomDADataSet.DoAfterScroll; +begin + if FFetchCanceled then begin + Resync([]); + FFetchCanceled := False; + end; + + inherited; +end; + +procedure TCustomDADataSet.DoOnBeforeFetch(out Cancel: boolean); +begin + if not FNonBlocking then + StartWait; + + if Assigned(FBeforeFetch) then + FBeforeFetch(Self, Cancel); + FFetchCanceled := Cancel; + +end; + +procedure TCustomDADataSet.DoOnAfterFetch; +begin + if not FFetchAll or (FICommand.GetCursorState = csFetched) then + if Assigned(FAfterFetch) then + FAfterFetch(Self); + + if FIRecordSet.CanDisconnect then + EndConnection; //Close connection after all data was fetched. +end; + +procedure TCustomDADataSet.DoOnDataChanged; +begin + Resync([]); +end; + +function TCustomDADataSet.Executing: boolean; +var + Value: variant; +begin + FICommand.GetProp(prExecuting, Value); + Result := Value; +end; + +function TCustomDADataSet.Fetching: boolean; +begin + Result := FICommand.GetCursorState in [csFetching, csFetchingAll]; +end; + +function TCustomDADataSet.FetchingAll: boolean; +begin + Result := FICommand.GetCursorState = csFetchingAll; +end; + +function TCustomDADataSet.Fetched: boolean; +begin + Result := (FICommand.GetCursorState >= csFetched) or + Active and (FICommand.GetCursorState = csInactive); +end; + +procedure TCustomDADataSet.DoOnNewRecord; +var + DataSet: TDataSet; + MasterField, DetailField: TField; + MasterName: string; + DetailName: string; + MasterPos: integer; + DetailPos: integer; + + procedure LinkMDFields(const MasterName, DetailName: string); + begin + MasterField := DataSet.FindField(MasterName); + if Assigned(MasterField) then begin + DetailField := FindField(DetailName); + if Assigned(DetailField) and not DetailField.ReadOnly then // CR 11917 + DetailField.Assign(MasterField); + end; + end; + +begin + if (DataSource <> nil) then begin + DataSet := DataSource.DataSet; + if (DataSet <> nil) and DataSet.Active then begin + //MD link by MasteFields and DetailFields + if (FMasterFields <> '') and (FDetailFields <> '') then begin + MasterPos := 1; + DetailPos := 1; + while True do begin + MasterName := ExtractFieldName(FMasterFields, MasterPos); + DetailName := ExtractFieldName(FDetailFields, DetailPos); + if (MasterName <> '') and (DetailName <> '') then + LinkMDFields(MasterName, DetailName) + else + break; + end; + end; + //We couldn't link MD fields in case of undefined FMasterFields or FDetailFields + //cause there is could be field names mismatch + end; + end; + + inherited; +end; + +{ Before / After UpdateExecute } + +function TCustomDADataSet.AssignedBeforeUpdateExecute: boolean; +begin + Result := Assigned(FBeforeUpdateExecute); +end; + +procedure TCustomDADataSet.DoBeforeUpdateExecute(Sender: TDataSet; StatementTypes: TStatementTypes; + Params: TDAParams); +begin + if AssignedBeforeUpdateExecute then + FBeforeUpdateExecute(Sender, StatementTypes, Params); +end; + +function TCustomDADataSet.AssignedAfterUpdateExecute: boolean; +begin + Result := Assigned(FAfterUpdateExecute); +end; + +procedure TCustomDADataSet.DoAfterUpdateExecute(Sender: TDataSet; StatementTypes: TStatementTypes; + Params: TDAParams); +begin + if AssignedAfterUpdateExecute then + FAfterUpdateExecute(Sender, StatementTypes, Params); +end; + +function TCustomDADataSet.GetActualFieldName(Field: TField): string; +var + FieldDesc: TFieldDesc; +begin + FieldDesc := GetFieldDesc(Field); + Result := GetActualFieldName(FieldDesc); +end; + +function TCustomDADataSet.GetActualFieldName(FieldDesc: TFieldDesc): string; +begin + Result := FieldDesc.Name; + if Result = '' then + Result := FieldDesc.ActualName; + Result := QuoteName(Result); +end; + +procedure TCustomDADataSet.GetCurrentKeys(out KeyFields: TFieldArray; out Values: variant); +var + KeyAndDataFields: TKeyAndDataFields; + KeyFieldsCount, DataFieldsCount: integer; + i, j: integer; + RecBuf: TRecordBuffer; + TmpVar: variant; + Delta: integer; + EmptyRecBuf: boolean; +begin + GetKeyAndDataFields(KeyAndDataFields, False); + KeyFieldsCount := Length(KeyAndDataFields.KeyFieldDescs); + DataFieldsCount := Length(KeyAndDataFields.DataFieldDescs); + SetLength(KeyFields, KeyFieldsCount); + Values := Unassigned; + + EmptyRecBuf := not GetActiveRecBuf(RecBuf); + + if KeyFieldsCount = 1 then begin + KeyFields[0] := GetField(KeyAndDataFields.KeyFieldDescs[0]); + if not EmptyRecBuf then + Data.GetFieldAsVariant(KeyAndDataFields.KeyFieldDescs[0].FieldNo, RecBuf, Values); + end + else + if KeyFieldsCount > 1 then begin + Values := VarArrayCreate([0, KeyFieldsCount - 1], varVariant); + for i := 0 to KeyFieldsCount - 1 do begin + KeyFields[i] := GetField(KeyAndDataFields.KeyFieldDescs[i]); + Values[i] := Unassigned; + if not EmptyRecBuf then begin + Data.GetFieldAsVariant(KeyAndDataFields.KeyFieldDescs[i].FieldNo, RecBuf, TmpVar); + Values[i] := TmpVar; + end; + end; + end + else + if (KeyFieldsCount = 0) and (DataFieldsCount > 0) then begin + Delta := 0; + Assert(FSQLGenerator <> nil); + for i := DataFieldsCount - 1 downto 0 do + if FSQLGenerator.IsBlobDataType(KeyAndDataFields.DataFieldDescs[i].DataType) or + FSQLGenerator.IsObjectDataType(KeyAndDataFields.DataFieldDescs[i].DataType) + then begin + Inc(Delta); + for j := i to DataFieldsCount - Delta - 1 do + KeyAndDataFields.DataFieldDescs[j] := KeyAndDataFields.DataFieldDescs[j + 1]; + end; + + SetLength(KeyFields, DataFieldsCount - Delta); + Values := VarArrayCreate([0, DataFieldsCount - Delta - 1], varVariant); + for i := 0 to DataFieldsCount - Delta - 1 do begin + KeyFields[i] := GetField(KeyAndDataFields.DataFieldDescs[i]); + Values[i] := Unassigned; + if not EmptyRecBuf then begin + Data.GetFieldAsVariant(KeyAndDataFields.DataFieldDescs[i].FieldNo, RecBuf, TmpVar); + Values[i] := TmpVar; + end; + end; + end; +end; + +procedure TCustomDADataSet.DataReopen; +begin + if Data.IsFullReopen then + ClearCachedKeyAndDataFields; + + Data.Reopen; +end; + +procedure TCustomDADataSet.InternalRefresh; +var + MessageID: cardinal; + KeyFields: TFieldArray; + Values: variant; + + KeyFieldsReaded, Retry: boolean; +begin + if UsedConnection <> nil then + UsedConnection.PushOperation(clRefresh, OpenCursorAllowFailOver); + try + KeyFieldsReaded := False; + BeginConnection; + repeat + Retry := False; + try + if not KeyFieldsReaded then + GetCurrentKeys(KeyFields, Values); + KeyFieldsReaded := True; //this will allow us to restore active record after failover + if FOptions.QueryRecCount then + FRecordCount := GetRecCount + else + FRecordCount := 0; + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, 'Refresh', MessageID, True); + + StartWait; + FCommand.WriteParams; + + inherited; + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, 'Refresh', MessageID, False); + + FRowsAffected := -1; + + if Length(KeyFields) = 0 then // CR N 11512 + First + else begin + DoBeforeScroll; + if not LocateRecord(KeyFields, Values, [], False) then + First + else begin + Resync([]); + DoAfterScroll; + end; + end; + + except + on E: Exception do begin +{ if FNonBlocking then begin + EnableControls; + StopWait; + end;} + if E is EFailOver then begin + UsedConnection.RestoreAfterFailOver; + Retry := True + end + else + raise; + end; + end; + + until not Retry; + finally + if UsedConnection <> nil then + UsedConnection.PopOperation; + end; +end; + +procedure TCustomDADataSet.InternalRefreshQuick(const CheckDeleted: boolean); +var + KeyAndDataFields: TKeyAndDataFields; + +var + OldStrictUpdate, OldFiltered: boolean; + KeyFields: TFieldArray; + Values: variant; + KeyFieldsCount: integer; + +begin + DoBeforeRefresh; + + BeginConnection; + try + CheckActive; + + GetKeyAndDataFields(KeyAndDataFields, False); + KeyFieldsCount := Length(KeyAndDataFields.KeyFieldDescs); + if KeyFieldsCount = 0 then + DatabaseError(SKeyFieldsReq); + + CheckBrowseMode; + if FUpdatingTableInfoIdx = - 1 then + Exit; + + OldStrictUpdate := Options.StrictUpdate; + OldFiltered := Filtered; + DisableControls; + try + Filtered := False; + Options.StrictUpdate := False; + GetCurrentKeys(KeyFields, Values); + + if CheckDeleted and not IsEmpty then + PerformSQL('', [stRefreshCheckDeleted]); + + PerformSQL('', [stRefreshQuick]); + + if not Locate(KeyFields, Values, []) then + First; + finally + Options.StrictUpdate := OldStrictUpdate; + Filtered := OldFiltered; + EnableControls; + DoAfterRefresh; + end; + + finally + EndConnection; + end; +end; + +procedure TCustomDADataSet.InternalClose; +var + i: integer; +begin + try + try + inherited; + except + on E: EDAError do // Borland's bug in DoInternalClose with FBufferCount + if not(UsedConnection.IsFatalError(E)) then + raise; + else + raise; + end; + finally + FIdentityField := nil; + if not Prepared then begin // In case that User doesn't call Prepare directly + FIRecordSet.TablesInfo.Clear; + FUpdatingTableInfoIdx := -1; + end; + ClearCachedKeyAndDataFields; + + for i := 0 to Length(FLocalMDLinks) - 1 do + if not FLocalMDLinks[i].NativeBuffer then + Marshal.FreeHGlobal(FLocalMDLinks[i].Buffer); + SetLength(FLocalMDLinks, 0); + end; +end; + +function TCustomDADataSet.GetRecCount: longint; +begin + Result := 0; +end; + +procedure TCustomDADataSet.SetRefreshOptions(Value: TRefreshOptions); +begin + FRefreshOptions := Value; +end; + +{ Edit } + +procedure TCustomDADataSet.SetReadOnly(Value: boolean); +begin + FReadOnly := Value; +end; + +function TCustomDADataSet.IsNeedEditPreconnect: boolean; +begin + Result := False; +end; + +function TCustomDADataSet.IsNeedInsertPreconnect: boolean; +begin + Result := False; +end; + +procedure TCustomDADataSet.InternalBeforeEdit; +begin +end; + +procedure TCustomDADataSet.InternalEdit; +begin + if IsNeedEditPreconnect then + BeginConnection; + try + InternalBeforeEdit; + + inherited; + except + if IsNeedEditPreconnect then + EndConnection; + raise; + end; +end; + +procedure TCustomDADataSet.InternalInsert; +begin + if IsNeedInsertPreconnect then + BeginConnection; + try + inherited; + except + if IsNeedInsertPreconnect then + EndConnection; + end; +end; + +function TCustomDADataSet.IsPreconnected : boolean; +begin + Result := ((State = dsEdit) and IsNeedEditPreconnect) or + ((State = dsInsert) and IsNeedInsertPreconnect); +end; + +procedure TCustomDADataSet.InternalCancel; +begin + try + inherited; + finally + if IsPreconnected then + EndConnection; + end; +end; + +procedure TCustomDADataSet.InternalPost; +var + DataSet: TDataSet; + MasterField, DetailField: TField; + MasterName: string; + DetailName: string; + MasterPos: integer; + DetailPos: integer; + RemoveRecord: Boolean; +begin + try + inherited; + + if IsConnectedToMaster then begin + DataSet := DataSource.DataSet; + if (DataSet <> nil) and (DataSet.Active) then begin + MasterPos := 1; + DetailPos := 1; + While True do begin + MasterName := ExtractFieldName(FMasterFields, MasterPos); + DetailName := ExtractFieldName(FDetailFields, DetailPos); + if (MasterName <> '') and (DetailName <> '') then begin + MasterField := DataSet.FindField(MasterName); + if Assigned(MasterField) then begin + DetailField := FindField(DetailName); + if Assigned(DetailField) then begin // Fixed bug with case insensitive master/detail + if (not UsedConnection.IsCaseSensitive) and + (VarType(DetailField.AsVariant) = {$IFDEF CLR} varChar {$ELSE} varString {$ENDIF}) and + (VarType(MasterField.AsVariant) = {$IFDEF CLR} varChar {$ELSE} varString {$ENDIF}) then + RemoveRecord := AnsiCompareTextS(DetailField.AsVariant, MasterField.AsVariant) <> 0 + else + if (not UsedConnection.IsCaseSensitive) and + (VarType(DetailField.AsVariant) = {$IFDEF CLR} varChar {$ELSE} varOleStr {$ENDIF}) and + (VarType(MasterField.AsVariant) = {$IFDEF CLR} varChar {$ELSE} varOleStr {$ENDIF}) then + RemoveRecord := AnsiStrICompWS(DetailField.AsVariant, MasterField.AsVariant) <> 0 + else + RemoveRecord := not VarEqual(DetailField.AsVariant, MasterField.AsVariant); + if RemoveRecord then begin + Assert(not CachedUpdates, 'Can not use Master/Detail with CachedUpdates'); + FIRecordSet.RemoveRecord; + Exit; + end; + end; + end; + end + else + break; + end; + end; + end; + + if (State = dsInsert) and not CachedUpdates and (roAfterInsert in RefreshOptions) and + RefreshAfterInsertAllowed + then + InternalRefreshRecord; + finally + if IsPreconnected then + EndConnection; + end; +end; + +procedure TCustomDADataSet.InternalDeferredPost; +begin + FActiveRecRefresh := True; + try + inherited; + + if (State = dsInsert) and not CachedUpdates and (roAfterInsert in RefreshOptions) and + RefreshAfterInsertAllowed + then + InternalRefreshRecord; + finally + FActiveRecRefresh := False; + end; +end; + +procedure TCustomDADataSet.CreateSQLGenerator; +begin + SetSQLGenerator(TDASQLGenerator.Create(Self)); +end; + +procedure TCustomDADataSet.FreeSQLGenerator; +begin + FSQLGenerator.Free; + FSQLGenerator := nil; +end; + +procedure TCustomDADataSet.SetSQLGenerator(Value: TDASQLGenerator); +begin + FreeSQLGenerator; + FSQLGenerator := Value; +end; + +function TCustomDADataSet.GetUpdateStatement(const StatementType: TStatementType): string; +var + UpdateSQL: TStrings; + SelectSQL: string; +begin + UpdateSQL:= FUpdateSQL[StatementType]; + if UpdateSQL = nil then + Result := '' + else + begin + Result := UpdateSQL.Text; + if StatementType = stRefresh then begin + Result := Trim(Result); + if Pos('WHERE', AnsiUpperCase(Result)) = 1 then begin + if SQLGeneratorCompatibility then + SelectSQL := BaseSQL + else + SelectSQL := Self.SQL.Text; + Result := SQLAddWhere(SelectSQL, Trim(Copy(Result, 6, Length(Result)))); + end; + end; + end; +end; + +function TCustomDADataSet.GetUpdateSQLStatementTypes: TStatementTypes; +begin + Result := [stInsert, stDelete, stUpdate, stRefresh]; +end; + +procedure TCustomDADataSet.SetUpdateSQLIndex(Index: integer; Value: TStrings); +begin + with FUpdateSQL[TStatementType(Index)] do begin + BeginUpdate; + try + Assign(Value); + finally + EndUpdate; + end; + end; +end; + +function TCustomDADataSet.GetUpdateSQLIndex(Index: integer): TStrings; +begin + Result := FUpdateSQL[TStatementType(Index)]; +end; + +procedure TCustomDADataSet.GetIdentityField; +begin +end; + +procedure TCustomDADataSet.GetKeyAndDataFields(out KeyAndDataFields: TKeyAndDataFields; + const ForceUseAllKeyFields: boolean); +begin +end; + +procedure TCustomDADataSet.ClearCachedKeyAndDataFields; +begin + SetLength(FCachedKeyAndDataFields[False].KeyFieldDescs, 0); + SetLength(FCachedKeyAndDataFields[False].DataFieldDescs, 0); + SetLength(FCachedKeyAndDataFields[True].KeyFieldDescs, 0); + SetLength(FCachedKeyAndDataFields[True].DataFieldDescs, 0); +end; + +function TCustomDADataSet.PerformAppend: boolean; +begin + Result := PerformSQL('', [stInsert]); + + if Result then begin + GetIdentityField; + + // Additional InternalRefreshRecord (for CachedUpdates = False) call is + // moved to InternalPost in order to avoid bug with TMemData.PutRecord in + // PerformSQL. + if (roAfterInsert in RefreshOptions) and FInCacheProcessing and + RefreshAfterInsertAllowed + then + InternalRefreshRecord; + end; +end; + +function TCustomDADataSet.PerformDelete: boolean; +begin + Result := PerformSQL('', [stDelete]); +end; + +function TCustomDADataSet.PerformUpdate: boolean; +begin + Result := PerformSQL('', [stUpdate]); + + if Result and (roAfterUpdate in RefreshOptions) then + InternalRefreshRecord; +end; + +procedure TCustomDADataSet.InternalRefreshRecord; +begin + if CachedUpdates and (UpdateStatus = usModified) and (not FInCacheProcessing) then + RevertRecord; {TODO -cMemoryLeak: cause memory leak and DisposeBuf failed} + FreeRefComplexFields(ActiveBuffer); + PerformSQL('', [stRefresh]); +end; + +procedure TCustomDADataSet.Resync(Mode: TResyncMode); +begin + // this need if Resync called for closed dataset (AV BUG !!!) + if Active then + inherited; +end; + +procedure TCustomDADataSet.GetDetailLinkFields(MasterFields, DetailFields: {$IFDEF CLR}TObjectList{$ELSE}TList{$ENDIF}); + + function AddFieldToList(const FieldName: string; DataSet: TDataSet; + List: TList): Boolean; + var + Field: TField; + begin + Field := DataSet.FindField(FieldName); + if (Field <> nil) then + List.Add(Field); + Result := Field <> nil; + end; + +var + i: Integer; + + DataSet: TDataSet; + MasterName: string; + DetailName: string; + MasterPos: integer; + DetailPos: integer; +begin + MasterFields.Clear; + DetailFields.Clear; + if (DataSource <> nil) and (DataSource.DataSet <> nil) then begin + if Params.Count > 0 then + begin + for i := 0 to Params.Count - 1 do + if AddFieldToList(Params[i].Name, DataSource.DataSet, MasterFields) then + AddFieldToList(Params[i].Name, Self, DetailFields) + end + else + if (Self.MasterFields <> '') and (Self.DetailFields <> '') then + begin + DataSet := DataSource.DataSet; + if (DataSet <> nil) and DataSet.Active then begin + MasterPos := 1; + DetailPos := 1; + while True do begin + MasterName := ExtractFieldName(FMasterFields, MasterPos); + DetailName := ExtractFieldName(FDetailFields, DetailPos); + if (MasterName = '') or (DetailName = '') then + Break; + if AddFieldToList(MasterName, DataSource.DataSet, MasterFields) then + AddFieldToList(DetailName, Self, DetailFields); + end; + end; + end; + end; +end; + +function TCustomDADataSet.FindKey(const KeyValues: array of const): Boolean; + function GetKeyValue(Index: integer): variant; // nearly copied from TField.AssignValue + procedure Error; + begin + DatabaseErrorFmt(SFieldValueError, [IntToStr(Index)]); + end; + {$IFDEF CLR} + var + Value: Variant; + {$ENDIF} + begin + Result := Unassigned; + {$IFDEF CLR} + Value := Variant(KeyValues[Index]); + case VarType(Value) of + varInteger, varSmallInt, varShortInt, varByte, varWord, varLongWord, varInt64, varUInt64: + Result := Integer(Value); + varBoolean: + Result := Boolean(Value); + varChar, varString: + Result := String(Value); + varDouble, varSingle: + Result := Double(Value); + varObject: + Result := Value; + varEmpty, varNull: + {Clear}; + varDateTime, varDate: + Result := TDateTime(Value); + {varDecimal: + AsBcd := Value;} + varCurrency: + Result := Currency(Value); + else + Error; + end; + {$ELSE} + with KeyValues[Index] do + case VType of + vtInteger: + Result := Integer(VInteger); + vtInt64: begin /// CR-D12558 + {$IFDEF VER6P} + Result := VInt64^; + {$ELSE} + TVarData(Result).VType := varDecimal; + TVarDataD6(Result).VInt64 := VInt64^; + {$ENDIF} + end; + vtBoolean: + Result := Boolean(VBoolean); + vtChar: + Result := String(VChar); + vtExtended: + Result := Extended(VExtended^); + vtString: + Result := String(VString^); + vtPointer, vtObject: + if VPointer <> nil then Error; + vtPChar: + Result := String(VPChar); + vtAnsiString: + Result := String(VAnsiString); + vtCurrency: + Result := Currency(VCurrency^); + vtVariant: + if not {$IFDEF VER6P}VarIsClear{$ELSE}VarIsEmpty{$ENDIF}(VVariant^) then + Result := Variant(VVariant^); + vtWideString: + Result := WideString(VWideString); + else + Error; + end; + {$ENDIF} + end; + +var + KeyAndDataFields: TKeyAndDataFields; + Values: variant; + KeyFieldsCount: integer; + KeyFields: TFieldArray; + i: integer; +begin + CheckBrowseMode; + GetKeyAndDataFields(KeyAndDataFields, False); + + Values := Unassigned; // To prevent warning + KeyFieldsCount := Length(KeyAndDataFields.KeyFieldDescs); + SetLength(KeyFields, KeyFieldsCount); + case KeyFieldsCount of + 0: + DatabaseError(SKeyFieldsRequired); + 1: begin + KeyFields[0] := GetField(KeyAndDataFields.KeyFieldDescs[0]); + Values := GetKeyValue(0); + end; + else + begin + Values := VarArrayCreate([0, KeyFieldsCount - 1], varVariant); + for i := 0 to KeyFieldsCount - 1 do begin + KeyFields[i] := GetField(KeyAndDataFields.KeyFieldDescs[i]); + + if i <= High(KeyValues) then + Values[i] := GetKeyValue(i) + else + Values[i] := Unassigned; + end; + end; + end; + + Result := LocateEx(KeyFields, Values, FFindKeyOptions); +end; + +procedure TCustomDADataSet.FindNearest(const KeyValues: array of const); +begin + FFindKeyOptions := [lxNearest]; + try + FindKey(KeyValues); + finally + FFindKeyOptions := []; + end; +end; + +procedure TCustomDADataSet.GotoCurrent(DataSet: TCustomDADataSet); +var + KeyFields: TFieldArray; + Values: variant; +begin + DataSet.GetCurrentKeys(KeyFields, Values); + if (Length(KeyFields) = 0) or not Locate(KeyFields, Values, []) then + First; +end; + +procedure TCustomDADataSet.InternalApplyUpdates(AllowFailOver: boolean); +var + ReApply: boolean; +begin + if (UsedConnection <> nil) then + UsedConnection.PushOperation(clApply, AllowFailOver); //Add ApplyUpdates Operation to Operations Stack (FailOver) + try + repeat + ReApply := False; + try + inherited ApplyUpdates; + + except + on E: EFailOver do + if E.FConnLostCause = clApply then begin + UsedConnection.RestoreAfterFailOver; + ReApply := True; + end + else + raise; + end; + until (not ReApply); + finally + if UsedConnection <> nil then + UsedConnection.PopOperation; //Remove ApplyUpdates Operation from Operations Stack + end; +end; + + +procedure TCustomDADataSet.ApplyUpdates; +begin + if UsedConnection = nil then + DatabaseError(SConnectionNotDefined); + + InternalApplyUpdates(not UsedConnection.InTransaction and not AutoCommit); +end; + +procedure TCustomDADataSet.RefreshRecord; +begin + CheckActive; + + case State of + dsInsert: + begin + Cancel; + Exit; + end; + dsEdit: + Cancel; + dsSetKey: + Post; + end; + + if not IsEmpty then begin + UpdateCursorPos; + InternalRefreshRecord; + if FRowsAffected = 0 then begin + // remove deleted record from dataset + if Options.RemoveOnRefresh then + FIRecordSet.RemoveRecord; + Resync([]); + end + else + if FRowsAffected > 0 then + Resync([]); + //DataEvent(deRecordChange, 0); + end; +end; + +procedure TCustomDADataSet.AssignFieldValue(Param: TDAParam; Field: TField; + Old: boolean); +begin + if Param.IsObjectDataType(Field.DataType) then begin + Param.DataType := Field.DataType; + Param.ParamObject := GetFieldObject(Field); + end + else + if Old then + Param.AssignFieldValue(Field, Field.OldValue) + else + Param.AssignFieldValue(Field, Field.NewValue); +end; + +procedure TCustomDADataSet.AssignFieldValue(Param: TDAParam; FieldDesc: TFieldDesc; Old: boolean); +var + FieldType: TFieldType; +begin + FieldType := GetFieldType(FieldDesc.DataType); + if Param.IsObjectDataType(FieldType) then begin + Param.DataType := FieldType; + Param.ParamObject := GetFieldObject(FieldDesc); + end + else + Assert(False, 'This overload should be used only for object fields'); +end; + +procedure TCustomDADataSet.CheckUpdateQuery(const StatementType: TStatementType); +begin + FUpdateQuery := FUpdateComponents[StatementType]; + if FUpdateQuery = nil then begin + Assert(UsedConnection <> nil); + FUpdateQuery := UsedConnection.CreateDataSet; + TCustomDADataSet(FUpdateQuery).FIRecordSet.Component := Self; + end + else + if FUpdateQuery is TCustomDADataSet then + TCustomDADataSet(FUpdateQuery).Connection := UsedConnection + else + if FUpdateQuery is TCustomDASQL then + TCustomDASQL(FUpdateQuery).Connection := UsedConnection + else + Assert(False, 'FUpdateQuery is ' + FUpdateQuery.ClassName); + + TDBAccessUtils.SetLockDebug(FUpdateQuery, True); + + if FUpdateQuery is TCustomDADataSet then begin + TCustomDADataSet(FUpdateQuery).Close; // To prevent exception raising on setting properties + TCustomDADataSet(FUpdateQuery).Options.TrimFixedChar := Options.TrimFixedChar; + TCustomDADataSet(FUpdateQuery).Options.TrimVarChar := Options.TrimVarChar; + TCustomDADataSet(FUpdateQuery).Options.FlatBuffers := True; + TCustomDADataSet(FUpdateQuery).Options.FullRefresh := Options.FullRefresh; + {$IFDEF HAVE_COMPRESS} + TCustomDADataSet(FUpdateQuery).Options.CompressBlobMode := Options.CompressBlobMode; + if StatementType in [stRefresh, stRefreshQuick, stRefreshCheckDeleted] then + TCustomDADataSet(FUpdateQuery).Options.LongStrings := Options.LongStrings; + {$ENDIF} + if StatementType = stBatchUpdate then begin + TCustomDADataSet(FUpdateQuery).ParamCheck := False; + TCustomDADataSet(FUpdateQuery).Params.Clear; + end; + end; + FUpdateComponents[StatementType] := FUpdateQuery; +end; + +/// UpdateExecute performes execute of the UpdateQuery. We need this procedure +/// to get two update models: with and without explicit prepare. +procedure TCustomDADataSet.UpdateExecute; +var + MessageID: cardinal; + i: integer; + St: string; +begin + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then begin + St := ''; + for i := 0 to Integer(High(TStatementType)) do + if TStatementType(i) in StatementTypes then begin + if St <> '' then + St := St + ','; + St := St + Copy(GetEnumName(TypeInfo(TStatementType), i), 3, + Length(GetEnumName(TypeInfo(TStatementType), i))); + end; + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, TDBAccessUtils.GetSQL(FUpdateQuery).Text, TDBAccessUtils.GetParams(FUpdateQuery), St, MessageID, True); + end; + + TDBAccessUtils.Execute(FUpdateQuery); + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, TDBAccessUtils.GetSQL(FUpdateQuery).Text, TDBAccessUtils.GetParams(FUpdateQuery), St, MessageID, False); +end; + +function TCustomDADataSet.IsAutoCommit: boolean; +begin + Result := AutoCommit; +end; + +function TCustomDADataSet.ShouldPrepareUpdateSQL: boolean; +begin + //this function must be overriden on the product level if Upate sql preparation is allowed + Result := False; +end; + +procedure TCustomDADataSet.CheckUpdateSQL(const SQL: string; const StatementTypes: TStatementTypes; + out ParamsInfo: TDAParamsInfo); +var + NewSQL, OldSQL: string; + StatementType: TStatementType; + stIdx: TStatementType; + CheckSQLNeeded: boolean; + UpdateObjectSQL: TStrings; + IsSQLAutoGenerated: boolean; + Index: Integer; + LockMacros: boolean; + LockAssembleSQL: boolean; + DisableScanParams: boolean; +begin + IsSQLAutoGenerated := False; + CheckSQLNeeded := True; + StatementType := stCustom; + for stIdx := Low(TStatementType) to High(TStatementType) do + if stIdx in StatementTypes then begin + if StatementType <> stCustom then + StatementType := stCustom + else + StatementType := stIdx; + if StatementType = stCustom then + Break; + end; + + FUpdateQuery := nil; + try + if Assigned(UpdateObject) then begin + FUpdateQuery := UpdateObject.GetObjectIndex(Ord(StatementType)); + if FUpdateQuery <> nil then begin + CheckSQLNeeded := False; + if TDBAccessUtils.GetSQL(FUpdateQuery).Count = 0 then + DatabaseError(SUpdateObjectEmptySQL); + end; + end; + if FUpdateQuery = nil then + CheckUpdateQuery(StatementType); + finally + Assert(FUpdateQuery <> nil, 'FUpdateQuery = nil. StatementTypes = ' + IntToStr(Word(StatementTypes))); + end; + + if CheckSQLNeeded then begin + TDBAccessUtils.SetAutoCommit(FUpdateQuery, + (StatementTypes * [stInsert, stUpdate, stDelete, stBatchUpdate] <> []) and IsAutoCommit); + + NewSQL := SQL; + if StatementType = stBatchUpdate then + NewSQL := PrepareBatch(FBatchSQLs.ToString) + else + if NewSQL = '' then begin + if Assigned(UpdateObject) then + UpdateObjectSQL := UpdateObject.GetSQLIndex(Ord(StatementType)) + else + UpdateObjectSQL := nil; + + if Assigned(UpdateObjectSQL) then + NewSQL := UpdateObjectSQL.Text; + + if NewSQL = '' then begin + NewSQL := GetUpdateStatement(StatementType); + if (NewSQL <> '') and (Macros.Count > 0) then + Macros.Expand(NewSQL); + + if NewSQL = '' then begin + IsSQLAutoGenerated := True; + if BatchUpdate then + Index := FBatchStatements + else + Index := -1; + + NewSQL := FSQLGenerator.GenerateSQL(StatementType, + not (csDesigning in ComponentState) and not Options.UpdateAllFields, + TDBAccessUtils.GetParams(FUpdateQuery), Index); + case StatementType of + stInsert, stUpdate, stDelete: + LockMacros := True; + else + LockMacros := False; + end; + LockAssembleSQL := (StatementType <> stRefreshQuick) and not (((Params.Count > 0) or Options.FullRefresh) and (StatementType = stRefresh)); + DisableScanParams := LockAssembleSQL; + TDBAccessUtils.SetSQLText(FUpdateQuery, NewSQL, + LockAssembleSQL, + LockMacros, + DisableScanParams); + ParamsInfo := FSQLGenerator.ParamsInfo; + end; + end; + end; + + // Check whether SQL text is the same. For multiple update operations. + if BatchUpdate and not ((StatementType = stBatchUpdate) or (StatementType = stLock) or (StatementType = stRefresh)) then begin + if not IsSQLAutoGenerated then + NewSQL := FCommand.ParseSQL(NewSQL, nil, ':' + FSQLGenerator.IndexedPrefix + IntToStr(FBatchStatements) + '_'); + if NewSQL <> '' then begin + if FBatchSQLs.Length <> 0 then + FBatchSQLs.Append(#13#10); + FBatchSQLs.Append(NewSQL); + FBatchSQLs.Append(';'); + inc(FBatchStatements); + end; + end; + + Assert(FUpdateQuery <> nil); + if not IsSQLAutoGenerated then begin + OldSQL := TDBAccessUtils.GetSQL(FUpdateQuery).Text; + NewSQL := NewSQL; + if OldSQL <> NewSQL then begin + TDBAccessUtils.GetParams(FUpdateQuery).Clear; /// Performance optimization - skipping reassigning old params values on changing SQL + TDBAccessUtils.GetSQL(FUpdateQuery).Text := NewSQL; + end; + end; + + //Used user defined SQL and internal update object used so we could prepare Update object to obtain some performance gain + if ShouldPrepareUpdateSQL and not UsedConnection.Options.DisconnectedMode and not BatchUpdate then begin + if FUpdateQuery is TCustomDADataSet then + TCustomDADataSet(FUpdateQuery).Options.AutoPrepare := not IsSQLAutoGenerated and (SQL = '') + else + if FUpdateQuery is TCustomDASQL then + TCustomDASQL(FUpdateQuery).Prepared := not IsSQLAutoGenerated and (SQL = ''); + end; + end; +end; + +function TCustomDADataSet.UseParamType: boolean; +begin + Result := False; +end; + +function TCustomDADataSet.FieldByParamName(var ParamName: string; var Old: boolean; var AFieldNo: integer): TField; +// Returns field that corresponds to ParamName + function FindFieldByFieldNo(FieldNo: integer): TField; + var + i: integer; + begin + for i := 0 to Fields.Count - 1 do begin + Result := Fields[i]; + if Result.FieldNo = FieldNo then + Exit; + end; + Result := nil; + end; + +var + e: integer; +begin + Old := CompareText(Copy(ParamName, 1, 4), 'OLD_') = 0; + Result := nil; + if Old then begin + Result := FindField(ParamName); + if Result <> nil then + Old := False // fieldname is starting with OLD_ + else + ParamName := Copy(ParamName, 5, Length(ParamName) - 4); + end; + + if Result = nil then begin + Val(ParamName, AFieldNo, e); + if e = 0 then + Result := FindFieldByFieldNo(AFieldNo) + else + AFieldNo := -1; + end + else begin + AFieldNo := -1; + end; + + if Result = nil then + Result := FindField(ParamName); +end; + +function TCustomDADataSet.BatchUpdate: boolean; +begin + Result := FInCacheProcessing and (FOptions.UpdateBatchSize > 1) and + not Assigned(UpdateObject); +end; + +function TCustomDADataSet.CanFlushBatch: boolean; +begin + Result := BatchUpdate and (FBatchStatements > 0) and (FBatchStatements >= FOptions.UpdateBatchSize); +end; + +procedure TCustomDADataSet.ClearBatch; +begin + FBatchSQLs.Length := 0; + FBatchParams.Clear; + FBatchStatements := 0; +end; + +procedure TCustomDADataSet.FlushBatch; +begin + if FBatchStatements > 0 then + try + PerformSQL('', [stBatchUpdate]); + finally + ClearBatch; + end; +end; + +function TCustomDADataSet.PrepareBatch(SQL: string): string; +begin + Result := SQL; +end; + +{$IFNDEF CLR} +type + _TParam = class(TCollectionItem) + private + FParamRef: TParam; + end; +{$ENDIF} + +function TCustomDADataSet.PerformSQL(const SQL: string; const StatementTypes: TStatementTypes): boolean; + + function FindFieldByFieldNo(FieldNo: integer): TField; + var + i: integer; + begin + for i := 0 to Fields.Count - 1 do begin + Result := Fields[i]; + if Result.FieldNo = FieldNo then + Exit; + end; + Result := nil; + end; + + function FindFieldDescByFieldNo(FieldNo: integer): TFieldDesc; + var + i: integer; + begin + for i := 0 to FIRecordSet.Fields.Count - 1 do begin + Result := FIRecordSet.Fields[i]; + if Result.FieldNo = FieldNo then + Exit; + end; + Result := nil; + end; + + function SuppressBatchPrefix(Value: string): string; + var + i,e: integer; + begin + Result := Value; + if BatchUpdate then begin + i := Pos(FSQLGenerator.IndexedPrefix, Value); + if i > 0 then begin + e := i + 2; + while (e <= Length(Result)) and (Result[e] <> '_') do + inc(e); + + {$IFDEF CLR}Borland.Delphi.{$ENDIF}System.Delete(Result, i, e - i + 1); + end; + end; + end; + + procedure WriteUQParams(ParamsInfo: TDAParamsInfo); + var + i: integer; + Param, Param1: TDAParam; + ParamName: string; + Old: boolean; + Field: TField; + AFieldNo: integer; + AFieldDesc: TFieldDesc; + Params: TDAParams; + LowIndex: integer; + + procedure AssignFieldValueEx(Param: TDAParam; Field: TField; Old: boolean); + begin + if UseParamType and + ((Param.ParamType = ptOutput) or (Param.ParamType = ptResult)) then begin + Param.DataType := Field.DataType; + Param.Value := Null; + end + else + AssignFieldValue(Param, Field, Old); + end; + + begin + {$IFDEF PERF_COUNTER} + PerfCounters[5].Start; + {$ENDIF} + + // assigning parameter values from fields of the same name + if BatchUpdate then begin + // copy parameters from UpdateQuery to common collection + if FBatchParams = nil then + FBatchParams := FCommand.CreateParamsObject; + + Params := TDBAccessUtils.GetParams(FUpdateQuery); + FBatchParams.BeginUpdate; + try + for i := 0 to Params.Count - 1 do begin + Param := FBatchParams.CreateParam(Params[i].DataType, Params[i].Name, Params[i].ParamType); + //FBatchParams.AddParam(Param); + {$IFNDEF CLR} + _TParam(Param).FParamRef := Param; + {$ENDIF} + end; + finally + FBatchParams.FNeedsUpdateItem := False; + FBatchParams.EndUpdate; + FBatchParams.FNeedsUpdateItem := True; + end; + + Params := FBatchParams; + LowIndex := Params.Count - TDBAccessUtils.GetParams(FUpdateQuery).Count; + end + else begin + Params := TDBAccessUtils.GetParams(FUpdateQuery); + LowIndex := 0; + end; + + for i := LowIndex to Params.Count - 1 do begin + Param := Params[i]; + AFieldNo := -1; + ParamName := ''; + Field := nil; + if (ParamsInfo <> nil) and not (stRefreshQuick in StatementTypes) and not ((Self.Params.Count > 0) and (stRefresh in StatementTypes)) then begin + Old := ParamsInfo.Items[i - LowIndex].Old; + Field := ParamsInfo.Items[i - LowIndex].Field; + end; + + if (ParamsInfo = nil) or (Field = nil) then begin + // should remove additional index before assigning value from field + ParamName := SuppressBatchPrefix(Param.Name); + if (MasterSource <> nil) and (MasterFields = '') and (DetailFields = '') and (Self.Params.Count > 0) and (stRefresh in StatementTypes) then begin + if FindParam(ParamName) = nil then + Field := FieldByParamName(ParamName, Old, AFieldNo) + end + else + Field := FieldByParamName(ParamName, Old, AFieldNo); + end; + + if Field <> nil then + AssignFieldValueEx(Param, Field, Old and (not ((State = dsInsert) and not FInDeferredPost))) // OldValue is Null on Insert + else begin + Assert(ParamName <> ''); + + AFieldDesc := nil; + if AFieldNo >= 0 then + AFieldDesc := FindFieldDescByFieldNo(AFieldNo); + if AFieldDesc = nil then + AFieldDesc := FIRecordSet.FindField(ParamName); + if (AFieldDesc <> nil) and (AFieldDesc.DataType in [dtObject,dtArray]) then // object fields in not objectview + AssignFieldValue(Param, AFieldDesc, False) + else begin + Param1 := FindParam(ParamName); + if (Param1 <> nil) and ((stRefresh in StatementTypes) or (stRefreshQuick in StatementTypes)) then + Param.Assign(Param1) // assign param from param of SQL + else + if not AssignedBeforeUpdateExecute then + DatabaseError(Format(SNoCorrespondParam, [Param.Name])); + end; + end; + if stRefreshQuick in StatementTypes then + SetMasterParams(Params); + if not UseParamType then + Param.ParamType := ptInput; + end; + {$IFDEF PERF_COUNTER} + PerfCounters[5].Stop; + {$ENDIF} + end; + + procedure ReadUQParams(RecordSet: TCRRecordSet; Buffer: TValueBuffer; ParamsInfo: TDAParamsInfo); + var + i: integer; + Param: TDAParam; + ParamName: string; + Old: boolean; + Field: TField; + AFieldNo: integer; + FieldDesc: TFieldDesc; + RecBuf: TRecordBuffer; + IsBlank: boolean; + SharedObject: TSharedObject; + ReadOnly: boolean; + + begin + {$IFDEF PERF_COUNTER} + PerfCounters[5].Start; + {$ENDIF} + for i := 0 to TDBAccessUtils.GetParams(FUpdateQuery).Count - 1 do begin + Param := TDBAccessUtils.GetParams(FUpdateQuery)[i]; + if UseParamType then + if Param.ParamType < ptOutput then + Continue; + + if ParamsInfo <> nil then begin + Old := ParamsInfo.Items[i].Old; + Field := ParamsInfo.Items[i].Field; + end + else + begin + ParamName := Param.Name; + Field := FieldByParamName(ParamName, Old, AFieldNo); + end; + + if Assigned(Field) and not Old and CanRefreshField(Field) + then begin + ReadOnly := Field.ReadOnly; + if Field.ReadOnly then begin + SetTempState(State); // DisableControls + Field.ReadOnly := False; + end; + + FieldDesc := FIRecordSet.Fields[Field.FieldNo - 1]; + + if (Param.ParamObject <> nil) and (RecordSet <> nil) + and (RecordSet.IsComplexFieldType(FieldDesc.DataType) + and not((FieldDesc.DataType = dtExtString) + or (FieldDesc.DataType = dtExtWideString) + or (FieldDesc.DataType = dtExtVarBytes) + {$IFDEF VER5P}or (FieldDesc.DataType = dtVariant){$ENDIF})) + then begin + // pass SharedObject from parameter to recordset + if FInCacheProcessing then + RecBuf := FIRecordSet.NewCacheRecBuf + else + RecBuf := ActiveBuffer; + FIRecordSet.GetField(FieldDesc.FieldNo, RecBuf, Buffer, IsBlank); + SharedObject := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(Buffer))); + if SharedObject <> nil then + SharedObject.Free; + + SharedObject := Param.ParamObject; + SharedObject.AddRef; + + if Param.IsNull then begin + FIRecordSet.PutField(FieldDesc.FieldNo, RecBuf, Buffer); + FIRecordSet.SetNull(FieldDesc.FieldNo, RecBuf, True); + end + else + FIRecordSet.PutField(FieldDesc.FieldNo, RecBuf, Buffer); + + if (FieldDesc.DataType in [dtBlob, dtMemo, dtWideMemo]) and + (State in [dsInsert,dsEdit]) + then + TBlob(SharedObject).EnableRollback; + end + else + if Param.IsNull then + Field.NewValue := Null + else + if not VarEqual(Field.Value, Param.Value) then + Field.NewValue := Param.Value; + + if ReadOnly then begin + Field.ReadOnly := True; + RestoreState(State); + end + end; + end; + {$IFDEF PERF_COUNTER} + PerfCounters[5].Stop; + {$ENDIF} + end; + + procedure CopyRecBuf(SrcRecordSet: TData; SrcRecBuf: TRecordBuffer; Buffer: TValueBuffer); + var + i: integer; + RecBuf: TRecordBuffer; + FieldDesc: TFieldDesc; + FieldName: string; + FieldDescIdx: integer; + AFieldDesc: TFieldDesc; + RecordSetFieldNo: integer; + IsBlank: boolean; + SharedObject: TSharedObject; + Value, NewValue: variant; + Field: TField; + UQFieldDesc: TFieldDesc; + begin + if FInCacheProcessing then + RecBuf := FIRecordSet.NewCacheRecBuf + else + RecBuf := ActiveBuffer; + + for i := 0 to SrcRecordSet.FieldCount - 1 do + if not SrcRecordSet.Fields[i].HasParent then begin + FieldDesc := SrcRecordSet.Fields[i]; + FieldName := FieldDesc.Name; + + // FindField optimization + AFieldDesc := nil; + FieldDescIdx := FSQLGenerator.DecodeFieldIndex(FieldName); + if FieldDescIdx >= 0 then + AFieldDesc := FIRecordSet.Fields[FieldDescIdx]; + + if AFieldDesc = nil then + AFieldDesc := FIRecordSet.FindField(FieldDesc.Name); + if (AFieldDesc <> nil){ and CanRefreshField(Field) and} + then + if SrcRecordSet.IsComplexFieldType(FieldDesc.DataType) + and not((FieldDesc.DataType = dtExtString) + or (FieldDesc.DataType = dtExtWideString) + or (FieldDesc.DataType = dtExtVarBytes) + {$IFDEF VER5P}or (FieldDesc.DataType = dtVariant){$ENDIF}) + then begin + if (stRefresh in StatementTypes) or (stRefreshQuick in StatementTypes) then begin + RecordSetFieldNo := AFieldDesc.FieldNo; + FIRecordSet.GetField(RecordSetFieldNo, RecBuf, Buffer, IsBlank); + SharedObject := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(Buffer))); + if SharedObject <> nil then + SharedObject.Free; + + SrcRecordSet.GetField(FieldDesc.FieldNo, SrcRecBuf, Buffer, IsBlank); + SharedObject := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(Buffer))); + SharedObject.AddRef; + FIRecordSet.PutField(RecordSetFieldNo, RecBuf, Buffer); + + if IsBlank then begin + FIRecordSet.SetNull(RecordSetFieldNo, RecBuf, True); + if IsClass(SharedObject, TBlob) then // After RefreshRecord for Null Blob fields + TBlobUtils.SetModified(TBlob(SharedObject), False); // TBlob.Modified is True + end; + + if (FieldDesc.DataType in [dtBlob, dtMemo, dtWideMemo]) and + (State in [dsInsert,dsEdit]) + then + TBlob(SharedObject).EnableRollback; + end; + end + {$IFDEF VER5P} + else + if FieldDesc.DataType = dtVariant then begin + RecordSetFieldNo := AFieldDesc.FieldNo; + + UQFieldDesc := FIRecordSet.Fields[RecordSetFieldNo - 1]; + CopyBuffer(IntPtr(Integer(RecBuf) + UQFieldDesc.Offset), Buffer, sizeof(TVariantObject)); + + SharedObject := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(Buffer))); + if SharedObject <> nil then + SharedObject.Free; + + IsBlank := SrcRecordSet.GetNull(FieldDesc.FieldNo, SrcRecBuf); + UQFieldDesc := SrcRecordSet.Fields[FieldDesc.FieldNo - 1]; + CopyBuffer(IntPtr(Integer(SrcRecBuf) + UQFieldDesc.Offset), Buffer, sizeof(TVariantObject)); + + SharedObject := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(Buffer))); + SharedObject.AddRef; + + UQFieldDesc := FIRecordSet.Fields[RecordSetFieldNo - 1]; + CopyBuffer(Buffer, IntPtr(Integer(RecBuf) + UQFieldDesc.Offset), sizeof(TVariantObject)); + FIRecordSet.SetNull(RecordSetFieldNo, RecBuf, IsBlank); + end + {$ENDIF} + else begin + SrcRecordSet.GetFieldAsVariant(FieldDesc.FieldNo, + SrcRecBuf, NewValue); + {This code raises AV with disposed ExtStrings + if FieldDesc.DataType in [dtExtString, dtExtWideString, dtExtVarBytes] then + SrcRecordSet.PutFieldData(FieldDesc, SrcRecBuf, nil);} + Field := FindFieldByFieldNo(AFieldDesc.FieldNo); + if Field <> nil then begin + if stCheck in StatementTypes then begin + // check + if State in dsEditModes then + Value := Field.OldValue + else + Value := Field.NewValue; + + if not VarEqual(Value, NewValue) then + DatabaseError(SRecordChanged); + end + else + // refresh + if FActiveRecRefresh or FInCacheProcessing then begin // DeferredPost and CachedUpdates + if Field.ReadOnly then begin + SetTempState(State); // DisableControls + Field.ReadOnly := False; + Field.NewValue := NewValue; + Field.ReadOnly := True; + RestoreState(State); + end + else + Field.NewValue := NewValue; + end + else + FIRecordSet.PutFieldAsVariant(AFieldDesc.FieldNo, RecBuf, NewValue) + end; + end; + end; + if ((stRefresh in StatementTypes) or (stRefreshQuick in StatementTypes)) and + not FActiveRecRefresh and + not FInCacheProcessing + then begin + {if CachedUpdates then + FIRecordSet.RevertRecord; } /// ??? problem with one record + FIRecordSet.PutRecord(RecBuf); + Data.AddRefComplexFields(RecBuf); + PRecInfo(IntPtr(integer(RecBuf) + FRecInfoOfs)).RefComplexFields := True; + end; + end; + + procedure GetUQFields(const KeyFields: TFieldArray; out KeyFieldsUQ: TFieldArray); + var + i: integer; + begin + Assert(FUpdateQuery is TCustomDADataSet); + SetLength(KeyFieldsUQ, Length(KeyFields)); + for i := 0 to Length(KeyFields) - 1 do + KeyFieldsUQ[i] := TCustomDADataSet(FUpdateQuery).Fields.FindField(KeyFields[i].FieldName); + end; + + +var + i: integer; + RecordSet: TCRRecordSet; + RefreshRecBuf: TRecordBuffer; + RecBuf: TRecordBuffer; + Buffer: TValueBuffer; + s, OldIndexFieldNames: string; + KeyFields, KeyFieldsUQ: TFieldArray; + v: variant; + RQFieldDesc: TFieldDesc; + NewValue: variant; + + OldOnAppend: TOnModifyRecord; + ParamsInfo: TDAParamsInfo; + TempParams: TDAParams; + +begin + BeginConnection; + try + CheckUpdateSQL(SQL, StatementTypes, ParamsInfo); + + if TDBAccessUtils.GetSQL(FUpdateQuery).Count = 0 then begin + Result := False; + Exit; + end; + + if FUpdateQuery is TCustomDADataSet then + RecordSet := TCustomDADataSet(FUpdateQuery).FIRecordSet + else + RecordSet := nil; + + + if StatementTypes = [stBatchUpdate] then begin + TempParams := TDBAccessUtils.GetParams(FUpdateQuery); + TempParams.Assign(FBatchParams); + {$IFNDEF CLR} + for i := 0 to TempParams.Count - 1 do + _TParam(TCollection(TempParams).Items[i]).FParamRef := TParam(TCollection(TempParams).Items[i]); + {$ENDIF} + end + else + // assigning parameter values from fields of the same name + WriteUQParams(ParamsInfo); + + // No need to call events and UpdateExecute when collecting statemets + if not BatchUpdate or (StatementTypes = [stBatchUpdate]) then begin + DoBeforeUpdateExecute(Self, StatementTypes, TDBAccessUtils.GetParams(FUpdateQuery)); + if AssignedBeforeUpdateExecute then begin + for i:= 0 to TDBAccessUtils.GetParams(FUpdateQuery).Count - 1 do + if TDBAccessUtils.GetParams(FUpdateQuery)[i].DataType = ftUnknown then + DatabaseError(Format(SUnknownParamDataType, [TDBAccessUtils.GetParams(FUpdateQuery)[i].Name])); + end; + UpdateExecute(StatementTypes); + end; + + Buffer := Marshal.AllocHGlobal(sizeof(integer)); + try + if (StatementTypes = [stRefreshCheckDeleted]) and (FUpdateQuery is TCustomDADataSet) then begin + UpdateCursorPos; + First; + GetCurrentKeys(KeyFields, v); + GetUQFields(KeyFields, KeyFieldsUQ); + s := ''; + for i := Low(KeyFields) to High(KeyFields) do begin + if s <> '' then + s := s + ';' + GetActualFieldName(KeyFields[i]) + else + s := GetActualFieldName(KeyFields[i]); + end; + + OldIndexFieldNames := TCustomDADataSet(FUpdateQuery).IndexFieldNames; + try + TCustomDADataSet(FUpdateQuery).IndexFieldNames := s; + while not Eof do begin + GetCurrentKeys(KeyFields, v); + if not TCustomDADataSet(FUpdateQuery).Locate(KeyFieldsUQ, v, []) then + FIRecordSet.RemoveRecord; + Next; + end; + finally + TCustomDADataSet(FUpdateQuery).Close; + TCustomDADataSet(FUpdateQuery).IndexFieldNames := OldIndexFieldNames; + end; + Resync([]); + end + else + if (StatementTypes = [stRefreshQuick]) and (FUpdateQuery is TCustomDADataSet) then begin + // Refresh from fields and check + + FRowsAffected := TCustomDADataSet(FUpdateQuery).RecordCount; + + UpdateCursorPos; + RecordSet.AllocRecBuf(IntPtr(RefreshRecBuf)); + try + TCustomDADataSet(FUpdateQuery).First; + // Get key fields list from base DataSet + GetCurrentKeys(KeyFields, v); + GetUQFields(KeyFields, KeyFieldsUQ); + while not TCustomDADataSet(FUpdateQuery).Eof do begin + // And get values from FUpdateQuery + v := VarArrayCreate([0, Length(KeyFieldsUQ) - 1], varVariant); + for i := 0 to Length(KeyFieldsUQ) - 1 do + v[i] := KeyFieldsUQ[i].Value; + + if not LocateEx(KeyFields, v, []) then begin + FIRecordSet.AllocRecBuf(IntPtr(RecBuf)); + OldOnAppend := FIRecordSet.OnAppend; + try + FIRecordSet.OnAppend := nil; + FIRecordSet.InitRecord(RecBuf); + FIRecordSet.AppendRecord(RecBuf); + Resync([]); + finally + FIRecordSet.OnAppend := OldOnAppend; + FIRecordSet.FreeRecBuf(RecBuf); + end; + end; + + RecordSet.GetRecord(RefreshRecBuf); + CopyRecBuf(RecordSet, RefreshRecBuf, Buffer); + + for i := 0 to RecordSet.Fields.Count - 1 do begin + RQFieldDesc := RecordSet.Fields[i]; + if IsRefreshQuickField(RQFieldDesc) then begin + RecordSet.GetFieldAsVariant(RQFieldDesc.FieldNo, RefreshRecBuf, NewValue); + SaveMaxRefreshQuickValue(RQFieldDesc, NewValue); + end; + end; + + TCustomDADataSet(FUpdateQuery).Next; + end; + finally + Data.FreeRecBuf(RefreshRecBuf); + end; + FIRecordSet.SortItems; + Resync([]); + end + else + if ([stRefresh, stCheck] * StatementTypes <> []) and (FUpdateQuery is TCustomDADataSet) + and TCustomDADataSet(FUpdateQuery).IsQuery then begin + // Refresh from fields and check + FRowsAffected := TCustomDADataSet(FUpdateQuery).RecordCount; + + if FOptions.StrictUpdate and (FRowsAffected <> 1) then + DatabaseError(Format(SRefreshFailed, [FRowsAffected])); + + RecordSet.AllocRecBuf(IntPtr(RefreshRecBuf)); + try + RecordSet.SetToBegin; // temp + RecordSet.GetNextRecord(RefreshRecBuf); + if not RecordSet.EOF then + CopyRecBuf(RecordSet, RefreshRecBuf, Buffer); + finally + Data.FreeRecBuf(RefreshRecBuf); + end; + end + else + // strict update and DMLRefresh don't work in BatchUpdate mode + if not BatchUpdate then begin + FRowsAffected := TDBAccessUtils.GetRowsAffected(FUpdateQuery); + + if FOptions.StrictUpdate and + //(Command.SQLType in [SQL_INSERT,SQL_UPDATE,SQL_DELETE]) and /// for ODAC + ((FRowsAffected = 0) or (FRowsAffected > 1)) + then + DatabaseError(Format(SUpdateFailed, [FRowsAffected])); + + // Refresh fields from params of the same name + if NeedReturnParams or (stRefresh in StatementTypes) then // DML Refresh + ReadUQParams(RecordSet, Buffer, ParamsInfo); + end; + + // No need to call events and UpdateExecute when collecting statemets + if not BatchUpdate or (StatementTypes = [stBatchUpdate]) then + DoAfterUpdateExecute(Self, StatementTypes, TDBAccessUtils.GetParams(FUpdateQuery)); + + Result := True; + finally + Marshal.FreeHGlobal(Buffer); + if FUpdateQuery is TCustomDADataSet then + TCustomDADataSet(FUpdateQuery).Close; + end; + finally + EndConnection; + end; +end; + +function TCustomDADataSet.RefreshAfterInsertAllowed: boolean; +begin + Result := True; +end; + +function TCustomDADataSet.IsRefreshQuickField(FieldDesc: TFieldDesc): boolean; +begin + Result := False; +end; + +procedure TCustomDADataSet.SaveMaxRefreshQuickValue(FieldDesc: TFieldDesc; const Value: variant); +begin +end; + +function TCustomDADataSet.GetCanModify: boolean; +begin + Result := not (ReadOnly or UniDirectional) and + (LocalUpdate or + CachedUpdates and Assigned(OnUpdateRecord) or + Assigned(UpdateObject)); +end; + +procedure TCustomDADataSet.SetStateFieldValue(State: TDataSetState; Field: TField; const Value: Variant); // Need to support int64 fields on PerformSQL in RefreshRecord +var + SaveState: TDataSetState; +{$IFNDEF VER6P} + i64: int64; +{$ENDIF} +begin + if not (Field is TLargeintField) then + inherited + else + begin + // Nearly copied from inherited + if Field.FieldKind <> fkData then Exit; + {$IFNDEF VER6P} + if not TVarDataD6(Value).VType in [varSmallint, varInteger, varByte, $12{vt_ui2}, $13{vt_ui4}] then begin + inherited; + exit; + end; + + i64 := TVarDataD6(Value).VInt64; + {$ENDIF} + + SaveState := SetTempState(State); + try + {$IFDEF VER6P} + if VarIsNull(Value) then + Field.Clear + else + TLargeintField(Field).AsLargeInt := Value; + {$ELSE} + TLargeintField(Field).AsLargeInt := i64; + {$ENDIF} + finally + RestoreState(SaveState); + end; + end; +end; + +function TCustomDADataSet.CanRefreshField(Field: TField): boolean; +begin + Result := True; +end; + +function TCustomDADataSet.NeedReturnParams: boolean; +begin + Result := FOptions.ReturnParams; +end; + +{ Master/Detail } + +procedure TCustomDADataSet.RefreshParams; +var + DataSet: TDataSet; +begin + FreeRefBuffers; + + if FDataLink.DataSource <> nil then begin + DataSet := FDataLink.DataSource.DataSet; + if DataSet <> nil then + if DataSet.Active and (DataSet.State <> dsSetKey) then begin + if SetMasterParams(Params) then begin // need refresh + {$IFDEF MSWINDOWS} + if (FDetailRefreshTimer = nil) or (FDetailRefreshTimer.Interval = 0) then + RefreshDetail(nil) + else begin + FDetailRefreshTimer.Enabled := False; //reset time period + FDetailRefreshTimer.Enabled := True; + end; + {$ELSE} + RefreshDetail(nil) + {$ENDIF} + end; + end; + end; +end; + +{$IFDEF MSWINDOWS} +procedure TCustomDADataSet.CheckRefreshDetailTimer; +begin + if FDetailRefreshTimer = nil then begin + FDetailRefreshTimer := {$IFDEF CLR}TTimer{$ELSE}TWin32Timer{$ENDIF}.Create(Self); + FDetailRefreshTimer.Enabled := False; + FDetailRefreshTimer.OnTimer := RefreshDetail; + end; +end; +{$ENDIF} + +procedure TCustomDADataSet.RefreshDetail(Sender: TObject); +var + MessageID: cardinal; +begin +{$IFDEF MSWINDOWS} + if FDetailRefreshTimer <> nil then + FDetailRefreshTimer.Enabled := False; +{$ENDIF} + + if FOptions.LocalMasterDetail then begin + FIRecordSet.FilterUpdated; + Resync([]); + First; + end + else begin + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, 'Refresh', MessageID, True); + + BeginConnection; + + DisableControls; + try + StartWait; + // Refresh + FCommand.WriteParams; + {$IFDEF VER5P} + DoBeforeRefresh; + {$ENDIF} + CheckBrowseMode; + UpdateCursorPos; + try + DataReopen; + if FIRecordSet.IndexFields.Count > 0 then + FIRecordSet.SortItems; + finally + Resync([]); + {$IFDEF VER5P} + DoAfterRefresh; + if not IsEmpty then DoAfterScroll; + {$ENDIF} + end; + finally + EnableControls; + end; + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, 'Refresh', MessageID, False); + + if FOptions.QueryRecCount then + FRecordCount := GetRecCount + else + FRecordCount := 0; + + FRowsAffected := -1; + end; +end; + +function TCustomDADataSet.NeedDetailRefresh(Param: TDAParam; FieldValue: TSharedObject): boolean; +begin + Result := False; + Param.ParamObject := FieldValue; +end; + +function TCustomDADataSet.SetMasterParams(AParams: TDAParams): boolean; +var + DataSet: TDataSet; + DADataSet: TCustomDADataSet; + Field: TField; + i: integer; + RecBuf: TRecordBuffer; + Buffer: IntPtr; + SharedObject: TSharedObject; + IsBlank: boolean; + + MasterField: TField; + MasterFieldDesc: TFieldDesc; + DetailField: TField; + DetailFieldDesc: TFieldDesc; + MasterPos: integer; + DetailPos: integer; + MasterName: string; + DetailName: string; + LinksCount: integer; +begin + Result := False; + + if FOptions.LocalMasterDetail then begin + Result := True; + Assert(DataSource.DataSet is TCustomDADataSet); + + if Length(FLocalMDLinks) > 0 then + for i := 0 to Length(FLocalMDLinks) - 1 do + if not FLocalMDLinks[i].NativeBuffer then + Marshal.FreeHGlobal(FLocalMDLinks[i].Buffer); + + LinksCount := 0; + if (DataSource <> nil) and (FMasterFields <> '') and (FDetailFields <> '') + then begin + DADataSet := TCustomDADataSet(DataSource.DataSet); + if (DADataSet <> nil) and DADataSet.Active then begin + MasterPos := 1; + DetailPos := 1; + while True do begin + MasterName := ExtractFieldName(FMasterFields, MasterPos); + DetailName := ExtractFieldName(FDetailFields, DetailPos); + if (MasterName <> '') and (DetailName <> '') then begin + MasterField := DADataSet.FindField(MasterName); + if Assigned(MasterField) then begin + DetailField := FindField(DetailName); + if Assigned(DetailField) then begin + SetLength(FLocalMDLinks, LinksCount + 1); + with FLocalMDLinks[LinksCount] do begin + DetailFieldDesc := Data.FindField(DetailField.FieldName); + MasterFieldDesc := DADataSet.GetFieldDesc(MasterField); + if DetailFieldDesc = nil then + raise Exception.Create(Format(SFieldNotFound, [DetailField.FieldName])); + if MasterFieldDesc = nil then + raise Exception.Create(Format(SFieldNotFound, [MasterField.FieldName])); //TODO: Field : cannot be used for local master/detail link + FieldNo := DetailFieldDesc.FieldNo; + Buffer := nil; + IsNull := MasterField.IsNull; + NativeBuffer := False; + if not IsNull then + if DetailFieldDesc.DataType = MasterFieldDesc.DataType then begin + if DADataSet.GetActiveRecBuf(RecBuf) then + FLocalMDLinks[LinksCount].Buffer := DADataSet.Data.GetFieldBuf(RecBuf, MasterFieldDesc, BufferType, IsNull, NativeBuffer); + end + else + CopyFieldValue(MasterField.Value, Buffer, BufferType, DetailFieldDesc); + end; + Inc(LinksCount); + end; + end; + end + else + break; + end; + end; + end; + end + else + if FDataLink.DataSource <> nil then begin + DataSet := FDataLink.DataSource.DataSet; + if DataSet <> nil then begin + for i := 0 to AParams.Count - 1 do begin + Field := DataSet.FindField(AParams[i].Name); + + if not Assigned(Field) then + Continue; + + AParams[i].DataType := Field.DataType; // set datatype for null Field value + if AParams[i].IsObjectDataType then begin + SharedObject := nil; + if (DataSet is TCustomDADataset) then + with TCustomDADataset(DataSet) do + if Field.FieldNo <> 0 then begin + if GetActiveRecBuf(RecBuf) then begin + Buffer := Marshal.AllocHGlobal(sizeof(IntPtr)); + try + Data.GetField(Field.FieldNo, RecBuf, Buffer, IsBlank); + SharedObject := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(Buffer))); + finally + Marshal.FreeHGlobal(Buffer); + end; + + end; + end + else + SharedObject := GetFieldObject(Field); + + Result := NeedDetailRefresh(AParams[i], SharedObject); + end + else + if (VarIsEmpty(AParams[i].Value) or not VarEqual(AParams[i].Value, Field.Value)) and + not (VarIsEmpty(AParams[i].Value) and Field.IsNull) then begin + AParams[i].AssignField(Field); + Result := True; + end; + AParams[i].ParamType := ptInput; + end; + end; + end; +end; + +function TCustomDADataSet.IsConnectedToMaster: boolean; +begin + Result := (MasterSource <> nil) and (FMasterFields <> '') and (FDetailFields <> ''); +end; + +procedure TCustomDADataSet.RefreshDetailSQL; +var + OldActive: boolean; +begin + OldActive := Active; + + Close; + UnPrepare; + AssembleSQL; + + if OldActive then + Open; +end; + +function TCustomDADataSet.LocalDetailFilter(RecBuf: IntPtr): boolean; +var + i: Integer; +begin + Result := True; + for i := 0 to Length(FLocalMDLinks) - 1 do + with FLocalMDLinks[i] do begin + if not Result then + Break; + if (IsNull) or (TMemData(Data).GetNull(FieldNo, RecBuf)) then + Result := not ((IsNull) or (TMemData(Data).GetNull(FieldNo, RecBuf))) + else + Result := TMemData(Data).CompareFieldValue(Buffer, BufferType, Data.Fields[FieldNo - 1], RecBuf, []) = 0; + end; +end; + +procedure TCustomDADataSet.AssembleSQL; +begin + FCommand.AssembleSQL; + +// close and unprepare to apply new sql + UnPrepare; +end; + +procedure TCustomDADataSet.ScanMacros(Sender: TObject = nil); +var + AllSQL: string; + stIdx: TStatementType; +begin + AllSQL := SQL.Text; + for stIdx := Low(FUpdateSQL) to High(FUpdateSQL) do + if Assigned(FUpdateSQL[stIdx]) then + AllSQL := AllSQL + FUpdateSQL[stIdx].Text; + Macros.Scan(AllSQL); +end; + +{function TCustomDADataSet.DoGetFinalSQL: string; +begin + Result := GetFinalSQL; +end; + +procedure TCustomDADataSet.DoScanMacros(Sender: TObject); +begin + ScanMacros; +end;} + +procedure TCustomDADataSet.DefineProperties(Filer: TFiler); + function WriteParams: boolean; + begin + if Filer.Ancestor <> nil then + Result := not FParams.IsEqual(TCustomDADataSet(Filer.Ancestor).FParams) + else + Result := FParams.Count > 0; + end; + + function WriteMacros: boolean; + begin + if Filer.Ancestor <> nil then + Result := not FMacros.IsEqual(TCustomDADataSet(Filer.Ancestor).FMacros) + else + Result := FMacros.Count > 0; + end; +begin + inherited DefineProperties(Filer); + + Filer.DefineProperty('ParamData', FCommand.ReadParamData, FCommand.WriteParamData, WriteParams); + Filer.DefineProperty('MacroData', FCommand.ReadMacroData, FCommand.WriteMacroData, WriteMacros); +end; + +function TCustomDADataSet.FindParam(const Value: string): TDAParam; +begin + Result := FParams.FindParam(Value); +end; + +function TCustomDADataSet.ParamByName(const Value: string): TDAParam; +begin + Result := FParams.ParamByName(Value); +end; + +function TCustomDADataSet.FindMacro(const Value: string): TMacro; +begin + Result := FMacros.FindMacro(Value); +end; + +function TCustomDADataSet.MacroByName(const Value: string): TMacro; +begin + Result := FMacros.MacroByName(Value); +end; + +{ Additional data types } + +function TCustomDADataSet.GetField(FieldDesc: TFieldDesc): TField; +var + i: integer; +begin + Assert(FieldDesc <> nil); + Result := nil; + for i := 0 to Fields.Count - 1 do + if Fields[i].FieldNo = FieldDesc.FieldNo then begin + Result := Fields[i]; + Break; + end; +end; + +function TCustomDADataSet.GetDataType(const FieldName: string): integer; +begin + Result := FIRecordSet.FieldByName(FieldName).DataType; +end; + +function TCustomDADataSet.GetFieldDesc(const FieldName: string): TFieldDesc; +begin + Result := FIRecordSet.FieldByName(FieldName); +end; + +function TCustomDADataSet.GetFieldDesc(const FieldNo: integer): TFieldDesc; +begin + if FieldNo <= 0 then {fkCalculated, fkLookup} + Result := nil + else + Result := TFieldDesc(FIRecordSet.Fields[FieldNo - 1]) +end; + +function TCustomDADataSet.GetFieldPrecision(const FieldName: string): integer; +var + Field: TFieldDesc; +begin + Field := FIRecordSet.FieldByName(FieldName); + if (Field <> nil) and (Field.DataType in [dtInteger,dtFloat]) then + Result := Field.Length + else + Result := 0; +end; + +function TCustomDADataSet.GetFieldScale(const FieldName: string): integer; +var + Field: TFieldDesc; +begin + Field := FIRecordSet.FieldByName(FieldName); + if (Field <> nil) and (Field.DataType in [dtInteger,dtFloat]) then + Result := Field.Scale + else + Result := 0; +end; + +function TCustomDADataSet.GetFieldObject(FieldDesc: TFieldDesc): TSharedObject; +var + RecBuf: TRecordBuffer; +begin + if GetActiveRecBuf(RecBuf) then begin + if not FIRecordSet.IsComplexFieldType(FieldDesc.DataType) then + DatabaseError(SNeedBlobType); + + Result := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(RecBuf, FieldDesc.Offset))); + end + else + Result := nil; +end; + +function TCustomDADataSet.GetFieldObject(Field: TField): TSharedObject; +var + FieldDesc: TFieldDesc; +begin + FieldDesc := GetFieldDesc(Field); + Result := GetFieldObject(FieldDesc); +end; + +function TCustomDADataSet.GetFieldObject(const FieldName: string): TSharedObject; +var + FieldDesc: TFieldDesc; +begin + FieldDesc := FIRecordSet.FieldByName(FieldName); + Result := GetFieldObject(FieldDesc); +end; + +{$IFDEF VER5P} + +{ IProviderSupport } + +procedure TCustomDADataSet.PSEndTransaction(Commit: Boolean); +begin + if (UsedConnection <> nil) and + AutoCommit and + UsedConnection.AutoCommit + then + if Commit then + UsedConnection.Commit + else + UsedConnection.Rollback; +end; + +procedure TCustomDADataSet.PSExecute; +begin + Execute; +end; + +function TCustomDADataSet.PSExecuteStatement(const ASQL: string; AParams: TParams; + {$IFDEF CLR}var ResultSet: TObject{$ELSE}ResultSet: Pointer = nil{$ENDIF}): Integer; + + procedure SetSQL(SQL: TStrings); + var + St: StringBuilder; + i, j: integer; + begin + // replace parameters in SQL + St := StringBuilder.Create(Length(ASQL) + Length(ASQL) div 2); + try + j := 1; + for i := 1 to Length(ASQL) do + if ASQL[i] = '?' then begin + St.Append(':'); + St.Append(IntToStr(j)); + Inc(j) + end + else + St.Append(ASQL[i]); + SQL.Text := St.ToString; + finally + St.Free; + end; + end; + + procedure SetParams(Params: TDAParams); + var + i: integer; + begin + //FQuery.Params.Assign(AParams); // params doesn't name + for i := 0 to Params.Count - 1 do begin + Params[i].Assign(AParams[i]); + Params[i].Name := IntToStr(i + 1); + if Params[i].ParamType = ptUnknown then + Params[i].ParamType := ptInput; + end; + end; + +var + Command: TCustomDASQL; + Query: TCustomDADataSet; +begin + if Assigned(ResultSet) then begin + Query := UsedConnection.CreateDataSet; + try + Query.Debug := Debug; + SetSQL(Query.SQL); + SetParams(Query.Params); + Query.Execute; + Result := Query.RowsAffected; + {$IFDEF CLR} + ResultSet := Query; + {$ELSE} + TDataSet(ResultSet^) := Query; + {$ENDIF} + except + Query.Free; + raise; + end; + end + else + begin + Command := UsedConnection.CreateSQL; + try + Command.Debug := Debug; + SetSQL(Command.SQL); + SetParams(Command.Params); + Command.Execute; + Result := Command.RowsAffected; + finally + Command.Free; + end; + end; +end; + +function TCustomDADataSet.PSGetParams: DB.TParams; +begin + Result := Params; +end; + +function TCustomDADataSet.PSGetQuoteChar: string; +begin + Result := '"'; +end; + +function TCustomDADataSet.PSGetTableName: string; +begin + if Active then begin + if (FUpdatingTableInfoIdx < 0) or (FUpdatingTableInfoIdx >= TablesInfo.Count) then + Result := FUpdatingTable + else + Result := TablesInfo[FUpdatingTableInfoIdx].TableName; + end + else begin + Result := FOldTableName; + if Result = '' then + Result := TablesInfo.TableInfoClass.NormalizeName(FUpdatingTable); + if Result = '' then + Result := TablesInfo.TableInfoClass.NormalizeName(GetTableNameFromSQL(SQL.Text)); + end; +end; + +function TCustomDADataSet.PSInTransaction: Boolean; +begin + if UsedConnection <> nil then + Result := UsedConnection.InTransaction + else + Result := False; +end; + +function TCustomDADataSet.PSIsSQLBased: Boolean; +begin + Result := True; +end; + +function TCustomDADataSet.PSIsSQLSupported: Boolean; +begin + Result := True; +end; + +procedure TCustomDADataSet.PSReset; +begin + inherited PSReset; + + if Active then begin + Close; + Open; + end; +end; + +procedure TCustomDADataSet.PSSetParams(AParams: DB.TParams); +begin + if AParams.Count <> 0 then + Params.Assign(AParams); +end; + +procedure TCustomDADataSet.PSSetCommandText(const CommandText: string); +begin + if CommandText <> '' then + SQL.Text := CommandText; +end; + +procedure TCustomDADataSet.PSStartTransaction; +begin + if (UsedConnection <> nil) and + AutoCommit and + UsedConnection.AutoCommit + then + UsedConnection.StartTransaction; +end; + +function TCustomDADataSet.PSUpdateRecord(UpdateKind: TUpdateKind; Delta: TDataSet): Boolean; +var + UpdateAction: TUpdateAction; + + I: Integer; + Old: Boolean; + Param: TDAParam; + Params: TDAParams; + PName: string; + Field: TField; + Value: Variant; + +begin + Result := False; + if Assigned(OnUpdateRecord) then + begin + UpdateAction := uaFail; + OnUpdateRecord(Delta, UpdateKind, UpdateAction); + Result := UpdateAction = uaApplied; + end; + + if not Result and Assigned(FUpdateObject) and Assigned(Delta) then begin + CheckUpdateQuery(UpdateKindToStatementType(UpdateKind)); + + TDBAccessUtils.SetAutoCommit(FUpdateQuery, AutoCommit); + Params := TDBAccessUtils.GetParams(FUpdateQuery); + + // Nearly copied from TUpdateSQL.SetParams + with FUpdateQuery do + for I := 0 to Params.Count - 1 do + begin + Param := Params[I]; + PName := Param.Name; + Old := CompareText(Copy(PName, 1, 4), 'OLD_') = 0; + if Old then {$IFDEF CLR}Borland.Delphi.{$ENDIF}System.Delete(PName, 1, 4); + Field := Delta.FindField(PName); + if not Assigned(Field) then Continue; + if Old then Param.AssignFieldValue(Field, Field.OldValue) else + begin + Value := Field.NewValue; + if {$IFNDEF VER6P} VarIsEmpty {$ELSE}VarIsClear{$ENDIF}(Value) then Value := Field.OldValue; + Param.AssignFieldValue(Field, Value); + end; + end; + TDBAccessUtils.Execute(FUpdateQuery); + + Result := True; + end; +end; + +function TCustomDADataSet.PSGetDefaultOrder: TIndexDef; + + function AddField(const Fields, NewField: string): string; + begin + if Fields <> '' then + Result := Fields + ';' + NewField + else + Result := NewField; + end; + +var + S, Token, SaveField: string; + Parser: TBoolParser; + Code, Index: integer; +begin + Result := nil; + S := GetOrderBy; + if S = '' then + Exit; + + Parser := TBoolParser.Create(S); + Parser.DecSeparator := '.'; + try + Result := TIndexDef.Create(nil); + Parser.ToBegin(); + + Code := Parser.GetNext(Token); + while Code <> lcEnd do begin + case Code of + lcIdent, lcString: begin + if 'DESC' = UpperCase(Token) then begin + Result.DescFields := AddField(Result.DescFields, SaveField); + end + else + if Assigned(FindField(Token)) then begin + Result.Fields := AddField(Result.Fields, Token); + SaveField := Token; + end; + end; + lcNumber: begin + try + Index := StrToInt(Token); + SaveField := FieldDefs[Index - 1].Name; + except // float number + Code := Parser.GetNext(Token); //to prevent freezeng on errors. CR + continue; + end; + Result.Fields := AddField(Result.Fields, SaveField); + end; + end; + + Code := Parser.GetNext(Token); + end; + finally + Parser.Free; + end; +end; + +function TCustomDADataSet.PreventPSKeyFields(var PSKeyFields: string): boolean; +begin + Result := False; +end; + + +function TCustomDADataSet.PSGetKeyFields: string; +var + OldDebug: boolean; + OldFetchAll: boolean; + OldFetchRows: integer; + + procedure QuickOpen; + begin + OldDebug := Debug; + OldFetchAll := FetchAll; + OldFetchRows := FetchRows; + + Debug := False; + FetchAll := False; + FetchRows := 1; + Execute; + end; + + procedure Restore; + begin + Close; + Debug := OldDebug; + FetchAll := OldFetchAll; + FetchRows := OldFetchRows; + end; + +var + i: integer; + KeyAndDataFields: TKeyAndDataFields; + QO: boolean; + +begin + Result := inherited PSGetKeyFields; + if Result = '' then + if FOldKeyFields = '' then begin + if not PreventPSKeyFields(Result) then begin //Set product specific KeyField values or omit Server roundtrip on DS opening + QO := not Active and (Connection <> nil) and (FIRecordSet <> nil) and (FIRecordSet.FieldCount = 0); + if QO then + QuickOpen; + try + GetKeyAndDataFields(KeyAndDataFields, False); + + for i := 0 to High(KeyAndDataFields.KeyFieldDescs) do + if Result = '' then + Result := KeyAndDataFields.KeyFieldDescs[i].Name + else + Result := Result + ';' + KeyAndDataFields.KeyFieldDescs[i].Name; + finally + if QO then + Restore; + end; + end; + FOldKeyFields := Result; + end + else + Result := FOldKeyFields; +end; +{$ENDIF} + +procedure TCustomDADataSet.AssignTo(Dest: TPersistent); +var + stIdx: TStatementType; +begin + inherited; + + if Dest is TCustomDADataSet then begin + TCustomDADataSet(Dest).Connection := Connection; + TCustomDADataSet(Dest).MasterSource := MasterSource; + TCustomDADataSet(Dest).MasterFields := MasterFields; + TCustomDADataSet(Dest).DetailFields := DetailFields; + TCustomDADataSet(Dest).ParamCheck := ParamCheck; // before SQL + TCustomDADataSet(Dest).SQL.Text := SQL.Text; + for stIdx := Low(FUpdateSQL) to High(FUpdateSQL) do + if Assigned(TCustomDADataSet(Dest).FUpdateSQL[stIdx]) and Assigned(FUpdateSQL[stIdx]) then + TCustomDADataSet(Dest).FUpdateSQL[stIdx].Text := FUpdateSQL[stIdx].Text; + + TCustomDADataSet(Dest).FilterSQL := FilterSQL; + TCustomDADataSet(Dest).Macros.Assign(Macros); + TCustomDADataSet(Dest).Params.Assign(Params); + TCustomDADataSet(Dest).Debug := Debug; + + TCustomDADataSet(Dest).FetchRows := FetchRows; + TCustomDADataSet(Dest).UniDirectional := UniDirectional; + TCustomDADataSet(Dest).AutoCommit := AutoCommit; + TCustomDADataSet(Dest).RefreshOptions := RefreshOptions; + TCustomDADataSet(Dest).UpdatingTable := UpdatingTable; + TCustomDADataSet(Dest).Options.Assign(Options); + end; +end; + +procedure TCustomDADataSet.SetConnection(Value: TCustomDAConnection); +begin + if (Value <> FConnection) or (Value <> UsedConnection) then begin + + if UsedConnection <> nil then begin + Disconnect; + UsedConnection.UnregisterClient(Self); + end; + + FConnection := Value; + + if FConnection <> nil then begin + Value.RegisterClient(Self, ConnectChange); + + CheckIRecordSet; + FIRecordSet.SetConnection(FConnection.FIConnection) + end + else + FIRecordSet.SetConnection(nil); + {$IFDEF CLR} + DataEvent(dePropertyChange, nil); + {$ELSE} + DataEvent(dePropertyChange, 0); + {$ENDIF} + end; +end; + +function TCustomDADataSet.GetSQL: TStrings; +begin + Result := FCommand.SQL; +end; + +procedure TCustomDADataSet.SetSQL(Value: TStrings); +begin + FCommand.SQL := Value; +end; + +procedure TCustomDADataSet.SetFetchRows(Value: integer); +begin + if FFetchRows <> Value then begin + CheckInactive; + if (Value < 1) or (Value > 10000) then + DatabaseError(SInvalidFetchRows); + + FFetchRows := Value; + FIRecordSet.SetProp(prFetchRows, FetchRows); + end; +end; + +procedure TCustomDADataSet.SetFetchAll(Value: boolean); +begin + FFetchAll := Value; + FIRecordSet.SetProp(prFetchAll, FetchAll); + if FFetchAll then begin + UniDirectional := False; + if Active then begin + FIRecordSet.FetchAll; + Resync([]); + end; + end; +end; + +function TCustomDADataSet.CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; +var + Blob: TBlob; + OldModified: boolean; +begin + if Field.DataSet = Self then + Blob := GetBlob(Field) + else + Blob := GetBlob(Field.FieldName); + if (Blob <> nil) and (Mode <> bmWrite) and UsedConnection.ConvertEOL + and (Field.DataType in [ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}, ftOraClob]) + then begin + OldModified := Blob.Modified; + Blob.AddCR; + TBlobUtils.SetModified(Blob, OldModified); + end; + + Result := inherited CreateBlobStream(Field, Mode); +end; + +function TCustomDADataSet.GetDataSource: TDataSource; +begin + Result := FDataLink.DataSource; +end; + +procedure TCustomDADataSet.SetMasterSource(Value: TDataSource); +var + NeedRefresh: boolean; +begin + if FDataLink.DataSource <> Value then begin + if IsLinkedTo(Value) then + DatabaseError(SCircularDataLink); + NeedRefresh := IsConnectedToMaster; + FDataLink.DataSource := Value; + NeedRefresh := NeedRefresh or IsConnectedToMaster; + + if NeedRefresh then + RefreshDetailSQL; + end; +end; + +function TCustomDADataSet.GetParams: TDAParams; +begin + Result := FCommand.Params; +end; + +procedure TCustomDADataSet.SetParams(Value: TDAParams); +begin + FCommand.Params := Value; +end; + +function TCustomDADataSet.GetParamCount: word; +begin + Result := FParams.Count; +end; + +function TCustomDADataSet.GetParamCheck: boolean; +begin + Result := FCommand.ParamCheck; +end; + +procedure TCustomDADataSet.SetParamCheck(Value: boolean); +begin + FCommand.ParamCheck := Value; +end; + +function TCustomDADataSet.GetMacros: TMacros; +begin + Result := FCommand.Macros; +end; + +procedure TCustomDADataSet.SetMacros(Value: TMacros); +begin + FCommand.Macros := Value; +end; + +function TCustomDADataSet.GetMacroCount: word; +begin + Result := FMacros.Count; +end; + +function TCustomDADataSet.GetRecordCount: integer; +var + RowsFetched: variant; +begin + if not Active or Fetched or not Options.QueryRecCount or (FRecordCount = 0) then + Result := inherited GetRecordCount + else begin + FICommand.GetProp(prRowsProcessed, RowsFetched); + Result := FRecordCount - RowsFetched + Data.RecordCount; + end; +end; + +function TCustomDADataSet.GetRowsAffected: integer; +begin + Result := FRowsAffected; +end; + +procedure TCustomDADataSet.SetUniDirectional(Value: boolean); +begin + if Value <> FUniDirectional then begin + CheckInactive; + FUniDirectional := Value; + FIRecordSet.SetProp(prUniDirectional, FUniDirectional); + if FUniDirectional then + FetchAll := False; + end; +end; + +procedure TCustomDADataSet.SetAutoCommit(Value: boolean); +begin + FAutoCommit := Value; + FICommand.SetProp(prAutoCommit, FAutoCommit); +end; + +function TCustomDADataSet.GetIsQuery: boolean; +begin + Result := TCRRecordSet(Data).RowsReturn; +end; + +//------------------------------------------------------------------------------ +// SQL Modification methods +//------------------------------------------------------------------------------ + +procedure TCustomDADataSet.SaveSQL; +begin + FBaseSQL := SQL.Text; +end; + +procedure TCustomDADataSet.RestoreSQL; +begin + if FBaseSQL <> '' then begin + SQL.Text := FBaseSQL; + FBaseSQL := ''; + end; +end; + +function TCustomDADataSet.SQLSaved: boolean; +begin + Result := FBaseSQL <> ''; +end; + +/// SaveModifiedSQL is used to back up original sql text before modification. +procedure TCustomDADataSet.SaveModifiedSQL(NewSQL: string); +var + BaseSQL: string; +begin + if NewSQL <> Trim(SQL.Text) then begin + if FBaseSQL = '' then + FBaseSQL := SQL.Text; + if not BaseSQLOldbehavior then + BaseSQL := FBaseSQL; + + SQL.Text := NewSQL; + if not BaseSQLOldbehavior then + FBaseSQL := BaseSQL; + end; +end; + +procedure TCustomDADataSet.InitUpdatingTable; +begin + if (FUpdatingTable <> '') and + (TablesInfo.IndexByName(TablesInfo.TableInfoClass.NormalizeName(FUpdatingTable)) = - 1) then + FUpdatingTable := ''; + SetUpdatingTable(FUpdatingTable); +end; + +procedure TCustomDADataSet.DetectIdentityField; +begin + FIdentityField := nil; +end; + +function TCustomDADataSet.ReadOnlyFieldsEnabled: boolean; +begin + Result := True; +end; + +procedure TCustomDADataSet.WriteFieldXMLAttributeType(Field: TField; FieldDesc: TFieldDesc; const FieldAlias: string; XMLWriter: XMLTextWriter); +begin + inherited; + + if (FieldDesc is TCRFieldDesc) + and (TCRFieldDesc(FieldDesc).TableInfo <> nil) + and (TCRFieldDesc(FieldDesc).TableInfo.TableName <> '') then + XmlWriter.WriteAttributeString('rs:basetable', TCRFieldDesc(FieldDesc).TableInfo.TableName); +end; + +procedure TCustomDADataSet.InternalOpen; +var + MessageID: cardinal; +begin + if Options.AutoPrepare then + Prepare; + + if not FLockDebug + and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) + and (FIRecordSet.GetCommand.GetCursorState <> csExecuted) {To prevent multiple calls on DataSet.Execute} + then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, '', MessageID, True); + + inherited; + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, '', MessageID, False); + + ClearCachedKeyAndDataFields; + InitUpdatingTable; + + if (FDataLink.DataSource <> nil) + and (FDataLink.DataSource.DataSet <> nil) + and (FDataLink.DataSource.DataSet.Active) + and (FOptions.LocalMasterDetail) + then begin + SetMasterParams(Params); + Data.FilterUpdated; + end; + +end; + +/// SQLAddWhere, SQLDeleteWhere, SQLSetOrderBy, SQlGetOrderBy are SQL-server +/// specific functions and they should be overriden in descendants. They operate +/// with strings only. Return value is new SQL text or it's part being +/// requested. +function TCustomDADataSet.SQLAddWhere(SQLText, Condition: string): string; +begin + Result := ''; +end; + +function TCustomDADataSet.SQLDeleteWhere(SQLText: string): string; +begin + Result := ''; +end; + +function TCustomDADataSet.SQLGetWhere(SQLText: string): string; +begin + Result := ''; +end; + +function TCustomDADataSet.SQLSetOrderBy(SQLText: string; Fields: string): string; +begin + Result := ''; +end; + +function TCustomDADataSet.SQLGetOrderBy(SQLText: string): string; +begin + Result := ''; +end; + +/// AddWhere, DeleteWhere, SetOrderBy, GetOrderBy are public SQL-server +/// indepedant methods. They can modify SQL property value of the dataset. Each +/// method calls it's internal equivalent with 'SQL' prefix. +procedure TCustomDADataSet.AddWhere(Condition: string); +begin + SaveModifiedSQL(SQLAddWhere(Trim(SQL.Text), Condition)); +end; + +procedure TCustomDADataSet.DeleteWhere; +begin + SaveModifiedSQL(SQLDeleteWhere(Trim(SQL.Text))); +end; + +procedure TCustomDADataSet.SetOrderBy(Fields: string); +begin + SaveModifiedSQL(SQLSetOrderBy(Trim(SQL.Text), Fields)); +end; + +function TCustomDADataSet.GetOrderBy: string; +begin + Result := SQLGetOrderBy(Trim(SQL.Text)); +end; + +/// GetBaseSQL returns original sql text with expanded macros. +function TCustomDADataSet.GetBaseSQL: string; +begin + if FBaseSQL <> '' then + Result := FBaseSQL + else + Result := SQL.Text; + + if Macros.Count > 0 then + Macros.Expand(Result); +end; + +function TCustomDADataSet.GetFinalSQL: string; +var + Str, Where: string; + MasterName: string; + DetailName: string; + MasterPos: integer; + DetailPos: integer; +begin + Str := FCommand.FinalSQL; + + if FFilterSQL <> '' then + Str := SQLAddWhere(Str, FilterSQL); + + if (DataSource <> nil) and (FMasterFields <> '') and (FDetailFields <> '') + and not (FOptions.LocalMasterDetail) + then begin + MasterPos := 1; + DetailPos := 1; + Where := ''; + while True do begin + MasterName := ExtractFieldName(FMasterFields, MasterPos); + DetailName := ExtractFieldName(FDetailFields, DetailPos); + if (MasterName <> '') and (DetailName <> '') then begin + if Where <> '' then + Where := Where + ' and '; + Where := Where + TablesInfo.TableInfoClass.NormalizeName(DetailName, Options.QuoteNames) + ' = :' + TablesInfo.TableInfoClass.NormalizeName(MasterName, Options.QuoteNames); + end + else + break; + end; + if Where <> '' then + Str := SQLAddWhere(Str, Where); + end; + + Result := Str; +end; + +procedure TCustomDADataSet.SetUpdateObject(Value: TCustomDAUpdateSQL); +begin + if Value <> nil then begin + Value.CheckUpdateComponent(Value.ModifyObject, Self); + Value.CheckUpdateComponent(Value.InsertObject, Self); + Value.CheckUpdateComponent(Value.DeleteObject, Self); + Value.CheckUpdateComponent(Value.RefreshObject, Self); + end; + if Value <> FUpdateObject then begin + if Assigned(FUpdateObject) and (FUpdateObject.DataSet = Self) then + FUpdateObject.DataSet := nil; + FUpdateObject := Value; + if Assigned(FUpdateObject) then begin + if Assigned(FUpdateObject.DataSet) and + (FUpdateObject.DataSet <> Self) then + FUpdateObject.DataSet.UpdateObject := nil; + FUpdateObject.DataSet := Self; + end; + end; +end; + +procedure TCustomDADataSet.SetOptions(Value: TDADataSetOptions); +begin + FOptions.Assign(Value); +end; + +procedure TCustomDADataSet.SetFilterSQL(Value: string); +var + OldFilter: string; + OldActive: boolean; +begin + if Value <> FFilterSQL then begin + OldFilter := FFilterSQL; + FFilterSQL := Trim(Value); + + OldActive := Active; + if not (csReading in ComponentState) then begin + Close; + UnPrepare; + end; + + AssembleSQL; + + if OldActive then + try + Open; + if Filtered and (Filter <> '') then begin + Data.FilterUpdated; + Resync([]); + First; + end; + except + FFilterSQL := OldFilter; + AssembleSQL; + raise; + end; + end; +end; + +procedure TCustomDADataSet.SetFiltered(Value: boolean); +var + KeyFields: TFieldArray; + Values: variant; +begin + if Value <> Filtered then begin + if Active then + GetCurrentKeys(KeyFields, Values); + + inherited; + + if Active and (Length(KeyFields) <> 0) then + Locate(KeyFields, Values, []); + end; +end; + +procedure TCustomDADataSet.SetMasterFields(Value: string); +var + NeedRefresh: boolean; +begin + if Value <> FMasterFields then begin + NeedRefresh := IsConnectedToMaster; + FMasterFields := Value; + NeedRefresh := NeedRefresh or IsConnectedToMaster; + + if NeedRefresh then + RefreshDetailSQL; + end; +end; + +procedure TCustomDADataSet.SetForeignKeyFields(Value: string); +var + NeedRefresh: boolean; +begin + if Value <> FDetailFields then begin + NeedRefresh := IsConnectedToMaster; + FDetailFields := Value; + NeedRefresh := NeedRefresh or IsConnectedToMaster; + + if NeedRefresh then + RefreshDetailSQL; + end; +end; + +{ TDADataSetOptions } + +constructor TDADataSetOptions.Create(Owner: TCustomDADataSet); +begin + inherited Create; + + FOwner := Owner; + + RequiredFields := True; + StrictUpdate := True; + TrimFixedChar := True; + LongStrings := True; + FlatBuffers := False; + RemoveOnRefresh := True; + FDetailDelay := 0; + UpdateBatchSize := 1; +end; + +procedure TDADataSetOptions.AssignTo(Dest: TPersistent); +begin + if Dest is TDADataSetOptions then begin + TDADataSetOptions(Dest).RequiredFields := RequiredFields; + TDADataSetOptions(Dest).StrictUpdate := StrictUpdate; + TDADataSetOptions(Dest).NumberRange := NumberRange; + TDADataSetOptions(Dest).QueryRecCount := QueryRecCount; + TDADataSetOptions(Dest).AutoPrepare := AutoPrepare; + TDADataSetOptions(Dest).ReturnParams := ReturnParams; + TDADataSetOptions(Dest).TrimFixedChar := TrimFixedChar; + TDADataSetOptions(Dest).TrimVarChar := TrimVarChar; + TDADataSetOptions(Dest).LongStrings := LongStrings; + TDADataSetOptions(Dest).FlatBuffers := FlatBuffers; + TDADataSetOptions(Dest).DetailDelay := DetailDelay; + TDADataSetOptions(Dest).SetFieldsReadOnly := SetFieldsReadOnly; + TDADataSetOptions(Dest).QuoteNames := QuoteNames; + {$IFDEF HAVE_COMPRESS} + TDADataSetOptions(Dest).CompressBlobMode := CompressBlobMode; + {$ENDIF} + TDADataSetOptions(Dest).LocalMasterDetail := LocalMasterDetail; + TDADataSetOptions(Dest).CacheCalcFields := CacheCalcFields; + TDADataSetOptions(Dest).FullRefresh := FullRefresh; + TDADataSetOptions(Dest).UpdateAllFields := UpdateAllFields; + end + else + inherited; +end; + +procedure TDADataSetOptions.SetRequiredFields(Value: boolean); +begin + if FRequiredFields <> Value then begin + FRequiredFields := Value; + FOwner.FLocalConstraints := FRequiredFields; + FOwner.FieldDefs.Updated := False; + if FOwner.Active then // for change RequiredFields in runtime + FOwner.FieldDefs.Update; + end; +end; + +procedure TDADataSetOptions.SetNumberRange(Value: boolean); +begin + FNumberRange := Value; + FOwner.FNumberRange := FNumberRange; +end; + +procedure TDADataSetOptions.SetTrimFixedChar(Value: boolean); +begin + FTrimFixedChar := Value; + FOwner.Data.TrimFixedChar := FTrimFixedChar; +end; + +procedure TDADataSetOptions.SetTrimVarChar(Value: boolean); +begin + FTrimVarChar := Value; + FOwner.Data.TrimVarChar := FTrimVarChar; +end; + +procedure TDADataSetOptions.SetLongStrings(Value: boolean); +begin + FOwner.CheckInactive; + FLongStrings := Value; + FOwner.FIRecordSet.SetProp(prLongStrings, FLongStrings); + FOwner.FieldDefs.Updated := False; +end; + +procedure TDADataSetOptions.SetAutoPrepare(Value: boolean); +begin + if FAutoPrepare = Value then + Exit; + + FOwner.Unprepare; + FAutoPrepare := Value; +end; + +procedure TDADataSetOptions.SetFlatBuffers(const Value: boolean); +begin + FOwner.CheckInactive; + FFlatBuffers := Value; + FOwner.FIRecordSet.SetProp(prFlatBuffers, Value); +end; + +procedure TDADataSetOptions.SetDetailDelay(Value: integer); +begin + FDetailDelay := Value; +{$IFDEF MSWINDOWS} + FOwner.CheckRefreshDetailTimer; + FOwner.FDetailRefreshTimer.Interval := Value; +{$ENDIF} +end; + +procedure TDADataSetOptions.SetLocalMasterDetail(Value: boolean); +begin + if Value <> FLocalMasterDetail then begin + FOwner.CheckInactive; + FLocalMasterDetail := Value; + if FLocalMasterDetail then + FOwner.FIRecordSet.FilterMDFunc := FOwner.LocalDetailFilter + else + FOwner.FIRecordSet.FilterMDFunc := nil; + + if Value then + FOwner.AssembleSQL; + end; +end; + +function TDADataSetOptions.GetCacheCalcFields: boolean; +begin + Result := FOwner.FCacheCalcFields; +end; + +procedure TDADataSetOptions.SetCacheCalcFields(Value: boolean); +begin + if Value <> CacheCalcFields then begin + FOwner.CheckInactive; + FOwner.FCacheCalcFields := Value; + end; +end; + +{$IFDEF HAVE_COMPRESS} +procedure TDADataSetOptions.SetCompressBlobMode(Value: TCompressBlobMode); +begin + if FCompressBlobMode <> Value then begin + TCustomDADataSet(FOwner).CheckInactive; + FCompressBlobMode := Value; + FOwner.FIRecordSet.SetProp(prCompressBlobMode, Integer(Value)); + FOwner.FieldDefs.Updated := False; + end; +end; +{$ENDIF} + +{ TDASQLGenerator } + +constructor TDASQLGenerator.Create(Owner: TCustomDADataSet); +begin + inherited Create; + + Assert(Owner <> nil); + FOwner := Owner; + + FHeaderSB := StringBuilder.Create(100); + FFldSB := StringBuilder.Create(100); + FMiddleSB := StringBuilder.Create(100); + FFldParamSB := StringBuilder.Create(100); + FCondSB := StringBuilder.Create(100); + FFooterSB := StringBuilder.Create(100); + + FParamsInfo := TDAParamsInfo.Create(GetParamInfoClass); +end; + +destructor TDASQLGenerator.Destroy; +begin + FParamsInfo.Free; + + FHeaderSB.Free; + FFldSB.Free; + FMiddleSB.Free; + FFldParamSB.Free; + FCondSB.Free; + FFooterSB.Free; + inherited; +end; + +function TDASQLGenerator.GetParamInfoClass: TDAParamInfoClass; +begin + Result := TDAParamInfo; +end; + +procedure TDASQLGenerator.Clear; +begin + FHeaderSB.Length := 0; + FFldSB.Length := 0; + FMiddleSB.Length := 0; + FFldParamSB.Length := 0; + FCondSB.Length := 0; + FFooterSB.Length := 0; + + FOldRecBuf := nil; + FNewRecBuf := nil; +end; + +function TDASQLGenerator.AssembleSB(const StatementType: TStatementType): string; +begin + // TODO: may be optimized for Win32 + Result := + FHeaderSB.ToString + + FFldSB.ToString + + FMiddleSB.ToString + + FFldParamSB.ToString + + FCondSB.ToString + + FFooterSB.ToString; +end; + +function TDASQLGenerator.Data: TData; +begin + Result := FOwner.Data; +end; + +function TDASQLGenerator.OldRecBuf: IntPtr; +begin + if FOldRecBuf <> nil then + Result := FOldRecBuf + else + begin + // Old buffer + if FOwner.FInDeferredPost then + Result := FOwner.OldDeferredPostBuf + else + if FOwner.FInCacheProcessing then + Result := FOwner.OldCacheRecBuf + else + Result := FOwner.GetOldRecord; + FOldRecBuf := Result; + end +end; + +function TDASQLGenerator.NewRecBuf: IntPtr; +begin + if FNewRecBuf <> nil then + Result := FNewRecBuf + else + begin + // New buffer + if FOwner.FInCacheProcessing then + Result := FOwner.NewCacheRecBuf + else + Result := FOwner.ActiveBuffer; + FNewRecBuf := Result; + end +end; + +function TDASQLGenerator.IsBlobDataType(DataType: word): boolean; +begin + Result := DataType in [dtBlob, dtMemo, dtWideMemo]; //Data.IsBlobFieldType +end; + +function TDASQLGenerator.IsObjectDataType(DataType: word): boolean; +begin + Result := DataType in [dtObject, dtArray]; +end; + +function TDASQLGenerator.FieldIsNull(FieldDesc: TCRFieldDesc; OldValue: boolean; Data: TData; OldRecBuf, NewRecBuf: IntPtr): boolean; +//This function added for Expand fields support +var + i: integer; +begin + Result := not FOwner.Active; + if Result then + Exit; + + if IsObjectDataType(FieldDesc.DataType) then begin + i := FieldDesc.FieldNo; + while (i < Data.FieldCount) and (Data.Fields[i].ParentField = FieldDesc) do begin + Result := FieldIsNull(TCRFieldDesc(Data.Fields[i]), OldValue); + inc(i); + if not Result then + Break; + end; + end + else + if OldValue then + Result := Data.GetNull(FieldDesc.FieldNo, OldRecBuf) + else + Result := Data.GetNull(FieldDesc.FieldNo, NewRecBuf); +end; + +function TDASQLGenerator.FieldIsNull(FieldDesc: TCRFieldDesc; OldValue: boolean): boolean; +begin + Result := not FOwner.Active; + if Result then + Exit; + + Result := FieldIsNull(FieldDesc, OldValue, Data, OldRecBuf, NewRecBuf); +end; + +function TDASQLGenerator.FieldModified(FieldDesc: TCRFieldDesc; Data: TData; OldRecBuf, NewRecBuf: IntPtr): boolean; +//This function added for Expand fields support +var + i: integer; +begin + if IsBlobDataType(FieldDesc.DataType) then begin + if FOwner.FInCacheProcessing then + Result := Data.GetObject(FieldDesc.FieldNo, NewRecBuf) <> + Data.GetObject(FieldDesc.FieldNo, OldRecBuf) + else + Result := TBlob(Data.GetObject(FieldDesc.FieldNo, NewRecBuf)).Modified + end + else + if IsObjectDataType(FieldDesc.DataType) then begin + Result := False; + i := FieldDesc.FieldNo; + while (i < Data.FieldCount) and (Data.Fields[i].ParentField = FieldDesc) do begin //Child FieldDescs always next to parent FielDescs + Result := FieldModified(TCRFieldDesc(Data.Fields[i])); + inc(i); + if Result then + break; + end; + end + else + Result := TMemData(Data).CompareFields(OldRecBuf, NewRecBuf, FieldDesc) <> 0; +end; + +function TDASQLGenerator.FieldModified(FieldDesc: TCRFieldDesc): boolean; +begin + Result := FieldModified(FieldDesc, Data, OldRecBuf, NewRecBuf); +end; + +function TDASQLGenerator.GetActualFieldName(FieldDesc: TCRFieldDesc; IsRefresh: boolean): string; +begin + Result := QuoteName(GetActualFieldNameEx(FieldDesc, FieldDesc.TableInfo)); + if IsRefresh and FOwner.Options.FullRefresh or FOwner.ReadOnly then begin//Use original Select part, so we could use Field aliasess + if (FieldDesc.TableInfo <> nil) then + if FieldDesc.TableInfo.TableAlias <> '' then + Result := FieldDesc.TableInfo.NormalizeName(FieldDesc.TableInfo.TableAlias, FOwner.FOptions.FQuoteNames) + + '.' + Result + else + Result := FieldDesc.TableInfo.NormalizeName(FieldDesc.TableInfo.TableName, FOwner.FOptions.FQuoteNames) + + '.' + Result; + end; +end; + +function TDASQLGenerator.GetActualFieldNameEx(FieldDesc: TCRFieldDesc; TableInfo: TCRTableInfo): string; +var + p: integer; +begin + Result := FieldDesc.ActualName; + if (FieldDesc.TableInfo = TableInfo) or (FieldDesc.TableInfo.TableName = TableInfo.TableName) then begin + p := Pos('.', Result); + if (p <> 0) and (Pos(FieldDesc.TableInfo.TableName, Result) = 1) then //Here we should detremine that Result is not something like "Dot.FieldName" + Result := Copy(Result, p + 1, MaxInt);{Delete table name from fieldname} + end; +end; + +function TDASQLGenerator.GenerateIndexName(Name: string): string; +begin + Result := '_' + Name; +end; + +function TDASQLGenerator.DecodeFieldIndex(FieldName: string): integer; +var + e: integer; +begin + Result := -1; + if (Length(FieldName) >= 2) and (FieldName[1] = '_') then begin + Val(Copy(FieldName, 2, MaxInt), Result, e); + if e <> 0 then + Result := -1; + end; +end; + +function TDASQLGenerator.IndexedPrefix: string; +begin + Result := 'P_'; +end; + +function TDASQLGenerator.QuoteName(const AName: string): string; +begin + Assert(FOwner <> nil); + Result := FOwner.QuoteName(AName); +end; + +function TDASQLGenerator.UnQuoteName(AName: string): string; +begin + Assert(FOwner <> nil); + Result := FOwner.UnQuoteName(AName); +end; + +function TDASQLGenerator.IsSubstituteParamName: boolean; +begin + Result := True; +end; + +procedure TDASQLGenerator.AddParam(SB: StringBuilder; FieldDesc: TFieldDesc; + const StatementType: TStatementType; + const ParamType: TParamType; + Index: integer = -1; + Old: boolean = False); +var + ParamName: string; + ParamInfo: TDAParamInfo; + Param: TDAParam; +begin + { Nonsense after adding ParamsInfo support + if not (csDesigning in FOwner.ComponentState) and (FieldDesc.FieldNo <> 0) then + ParamName := IntToStr(FieldDesc.FieldNo) + else} + ParamName := FieldDesc.Name; + + if Old then + ParamName := 'Old_' + ParamName; + + if Index > - 1 then + ParamName := IndexedPrefix + IntToStr(Index) + '_' + ParamName; + +// if csDesigning in FOwner.ComponentState then // Don't call QuoteName IntToStr(FieldDesc.FieldNo) + ParamName := QuoteName(ParamName); //TODO:???? QuoteName + + if ((FParams = nil) or not IsSubstituteParamName) or (((FOwner.Params.Count > 0) or FOwner.Options.FullRefresh) and (StatementType = stRefresh)) then begin + SB.Append(':'); + SB.Append(ParamName); + end + else + SB.Append('?'); + + if FParams <> nil then begin + Param := TDAParam(FParams.Add); + Param.Name := ParamName; + Param.ParamType := ParamType; + {$IFNDEF CLR} + _TParam(Param).FParamRef := Param; + {$ENDIF} + ParamInfo := TDAParamInfo(FParamsInfo.Add); + ParamInfo.Field := FOwner.GetField(FieldDesc); + ParamInfo.Old := Old; + ParamInfo.ParamIndex := Index; + end; +end; + +procedure TDASQLGenerator.AddFieldToCondition(SB: StringBuilder; FieldDesc: TCRFieldDesc; const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; const Index: integer = -1); +var + ActualName: string; +begin + if SB.Length > 0 then + SB.Append(' AND '); + + Assert(FieldDesc <> nil); + ActualName := GetActualFieldName(FieldDesc, StatementType = stRefresh); + SB.Append(ActualName); + + if ModifiedFieldsOnly and FieldIsNull(FieldDesc, StatementType <> stRefresh) then //Refresh generated with current field values + SB.Append(' IS NULL') + else + begin + SB.Append(' = '); + AddParam(SB,FieldDesc, StatementType, ptInput, Index, (StatementType <> stRefresh) or + (FOwner.CachedUpdates and (StatementType = stRefresh))); //Refresh generated with current field values + end; +end; + +procedure TDASQLGenerator.GenerateConditions(SB: StringBuilder; const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; const KeyAndDataFields: TKeyAndDataFields; + const Index: integer = -1); +var + i: integer; +begin + if Length(KeyAndDataFields.KeyFieldDescs) > 0 then + for i := 0 to High(KeyAndDataFields.KeyFieldDescs) do + AddFieldToCondition(SB, KeyAndDataFields.KeyFieldDescs[i], StatementType, ModifiedFieldsOnly, Index) + else begin + if FOwner.FIdentityField <> nil then + AddFieldToCondition(SB, TCRFieldDesc(FOwner.GetFieldDesc(FOwner.FIdentityField)), + StatementType, ModifiedFieldsOnly, Index) + else begin + if Length(KeyAndDataFields.DataFieldDescs) = 0 then + DatabaseError(SNoKeyFields); + for i := 0 to High(KeyAndDataFields.DataFieldDescs) do + if not IsBlobDataType(KeyAndDataFields.DataFieldDescs[i].DataType) then + AddFieldToCondition(SB, KeyAndDataFields.DataFieldDescs[i], StatementType, ModifiedFieldsOnly, Index); + end; + end; +end; + +procedure TDASQLGenerator.AddFieldToInsertSQL(FieldDesc: TCRFieldDesc; const Index: integer = -1); +begin + if FFldSB.Length > 0 then begin + FFldSB.Append(', '); + FFldParamSB.Append(', '); + end; + + FFldSB.Append(FieldDesc.ActualNameQuoted(TCRRecordSet(FOwner.Data), FOwner.Options.QuoteNames)); + AddParam(FFldParamSB, FieldDesc, stInsert, ptInput, Index); +end; + +procedure TDASQLGenerator.GenerateInsertSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); +var + i: integer; + FieldDesc: TCRFieldDesc; +begin + for i := 0 to High(KeyAndDataFields.DataFieldDescs) do begin + FieldDesc := KeyAndDataFields.DataFieldDescs[i]; + // Insert all(!) field values + if not ModifiedFieldsOnly or not FieldIsNull(FieldDesc, False) then + AddFieldToInsertSQL(FieldDesc, Index); + end; + + FHeaderSB.Append('INSERT INTO '); + FHeaderSB.Append(FTableInfo.NormalizeName(FTableInfo.TableNameFull, FOwner.FOptions.FQuoteNames)); + FHeaderSB.Append(SLLineSeparator); + FHeaderSB.Append(' ('); + // Append FFldSB + FMiddleSB.Append(')'); + FMiddleSB.Append(SLLineSeparator); + FMiddleSB.Append('VALUES'); + FMiddleSB.Append(SLLineSeparator); + FMiddleSB.Append(' ('); + // Append FFldParamSB + FFooterSB.Append(')'); +end; + +procedure TDASQLGenerator.AddFieldToUpdateSQL(FieldDesc: TCRFieldDesc; const ModifiedFieldsOnly: boolean; + const Index: integer = -1); +begin + if FFldSB.Length > 0 then + FFldSB.Append(', '); + + FFldSB.Append(FieldDesc.ActualNameQuoted(TCRRecordSet(FOwner.Data), FOwner.Options.QuoteNames)); + FFldSB.Append(' = '); + AddParam(FFldSB, FieldDesc, stUpdate, ptInput, Index); +end; + +procedure TDASQLGenerator.GenerateUpdateSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); +var + i: integer; + FieldDesc: TCRFieldDesc; +begin + for i := 0 to High(KeyAndDataFields.DataFieldDescs) do begin + FieldDesc := KeyAndDataFields.DataFieldDescs[i]; + + if not ModifiedFieldsOnly or FieldModified(FieldDesc) then + AddFieldToUpdateSQL(FieldDesc, ModifiedFieldsOnly, Index); + end; + + if FFldSB.Length > 0 then begin + FHeaderSB.Append('UPDATE '); + FHeaderSB.Append(FTableInfo.NormalizeName(FTableInfo.TableNameFull, FOwner.FOptions.FQuoteNames)); + FHeaderSB.Append(SLLineSeparator); + FHeaderSB.Append('SET'); + FHeaderSB.Append(SLLineSeparator); + FHeaderSB.Append(' '); + // Append FFldSB + FMiddleSB.Append(SLLineSeparator); + FMiddleSB.Append('WHERE'); + FMiddleSB.Append(SLLineSeparator); + FMiddleSB.Append(' '); + // Append FParamSB + GenerateConditions(FCondSB, stUpdate, ModifiedFieldsOnly, KeyAndDataFields, Index); + end; +end; + +procedure TDASQLGenerator.GenerateDeleteSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); +begin + FHeaderSB.Append('DELETE FROM '); + FHeaderSB.Append(FTableInfo.NormalizeName(FTableInfo.TableNameFull, FOwner.FOptions.FQuoteNames)); + FHeaderSB.Append(SLLineSeparator); + FHeaderSB.Append('WHERE'); + FHeaderSB.Append(SLLineSeparator); + FHeaderSB.Append(' '); + GenerateConditions(FCondSB, stDelete, ModifiedFieldsOnly, KeyAndDataFields, Index); +end; + +procedure TDASQLGenerator.GenerateLockSQL( + const KeyAndDataFields: TKeyAndDataFields; + const Index: integer = -1); +begin + +end; + +procedure TDASQLGenerator.AddFieldToRefreshSQL(FieldDesc: TCRFieldDesc); +begin + if FFldSB.Length > 0 then + FFldSB.Append(', '); + + if FieldDesc.TableInfo = nil then + FFldSB.Append(FieldDesc.ActualNameQuoted(TCRRecordSet(FOwner.Data), FOwner.Options.QuoteNames)) + else + if FieldDesc.TableInfo.TableAlias <> '' then + FFldSB.Append(FieldDesc.TableInfo.NormalizeName(FieldDesc.TableInfo.TableAlias, FOwner.FOptions.FQuoteNames) + + '.' + FieldDesc.ActualNameQuoted(TCRRecordSet(FOwner.Data), FOwner.Options.QuoteNames)) + else + FFldSB.Append(FieldDesc.TableInfo.NormalizeName(FieldDesc.TableInfo.TableName, FOwner.FOptions.FQuoteNames) + + '.' + FieldDesc.ActualNameQuoted(TCRRecordSet(FOwner.Data), FOwner.Options.QuoteNames)); + + if not (csDesigning in FOwner.ComponentState) then + FFldSB.Append(' AS ' + GenerateIndexName(IntToStr(FOwner.FIRecordSet.Fields.IndexOf(FieldDesc)))); +end; + +procedure TDASQLGenerator.GenerateRefreshSQLSelectPart(const KeyAndDataFields: TKeyAndDataFields); +var + i: integer; + FieldArrHigh: integer; + UseDataFields: boolean; + FieldDesc: TCRFieldDesc; +begin + FHeaderSB.Append('SELECT '); + + UseDataFields := Length(KeyAndDataFields.DataFieldDescs) > 0; + if UseDataFields then + FieldArrHigh := Length(KeyAndDataFields.DataFieldDescs) - 1 + else + FieldArrHigh := High(KeyAndDataFields.KeyFieldDescs); + + // SELECT ... FROM .... {WITH NOLOCK} + // Add SELECT section + for i := 0 to FieldArrHigh do begin + if UseDataFields then + FieldDesc := KeyAndDataFields.DataFieldDescs[i] + else + FieldDesc := KeyAndDataFields.KeyFieldDescs[i]; + + AddFieldToRefreshSQL(FieldDesc); + end; +end; + +procedure TDASQLGenerator.GenerateRefreshSQLFromPart; +begin + FMiddleSB.Append(FTableInfo.NormalizeName(FTableInfo.TableName, FOwner.FOptions.FQuoteNames)); + if FTableInfo.TableAlias <> '' then begin + FMiddleSB.Append(' '); + FMiddleSB.Append(FTableInfo.NormalizeName(FTableInfo.TableAlias, FOwner.FOptions.FQuoteNames)); + end; +end; + +procedure TDASQLGenerator.GenerateRefreshSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean); +begin + GenerateConditions(FCondSB, stRefresh, ModifiedFieldsOnly, KeyAndDataFields); + if FOwner.Options.FullRefresh or FOwner.ReadOnly then begin + if FCondSB.Length = 0 then + FHeaderSB.Append(FOwner.SQL.Text) + else begin + FHeaderSB.Append(FOwner.SQLAddWhere(FOwner.SQL.Text, SLLineSeparator + ' ' + FCondSB.ToString)); + FCondSB.Length := 0; // WHERE clause already added to FHeaderSB + end; + end + else begin + GenerateRefreshSQLSelectPart(KeyAndDataFields); + FMiddleSB.Append(' FROM '); + GenerateRefreshSQLFromPart; + FMiddleSB.Append(SLLineSeparator); + FMiddleSB.Append('WHERE'); + FMiddleSB.Append(SLLineSeparator); + FMiddleSB.Append(' '); + end; +end; + +procedure TDASQLGenerator.GenerateRefreshQuickSQL(const KeyAndDataFields: TKeyAndDataFields); +begin + GenerateConditions(FCondSB, stRefreshQuick, False{ignored}, KeyAndDataFields); + FHeaderSB.Append(FOwner.SQLAddWhere(FOwner.FinalSQL, FCondSB.ToString)); + FCondSB.Length := 0; // WHERE clause already added to FHeaderSB +end; + +procedure TDASQLGenerator.GenerateRefreshCheckDeletedSQL(const KeyAndDataFields: TKeyAndDataFields); +var + i: integer; + FieldDesc: TFieldDesc; + ActualFieldName: string; + Condition: string; + + function ForceUnQuoteName(AName: string): string; + var + l: integer; + begin + AName := Trim(AName); + l := Length(AName); + if (l >= 3) and (AName[1] = FOwner.FLeftQuote) and (AName[l] = FOwner.FRightQuote) then + Result := Copy(AName, 2, l - 2) + else + Result := AName; + end; + +begin + FHeaderSB.Append('SELECT '); + + for i:= 0 to Length(KeyAndDataFields.KeyFieldDescs) - 1 do begin + FieldDesc := KeyAndDataFields.KeyFieldDescs[i]; + if i > 0 then begin + FFldSB.Append(', '); + FFooterSB.Append(', '); + end; + ActualFieldName := GetActualFieldName(TCRFieldDesc(FieldDesc), False); + FFldSB.Append(ActualFieldName); + FFooterSB.Append(ActualFieldName); + if UpperCase(ForceUnQuoteName(ActualFieldName)) <> UpperCase(ForceUnQuoteName(FieldDesc.Name)) then + FFldSB.Append(' AS ' + FieldDesc.Name); + end; + + FMiddleSB.Append(' FROM '); + FMiddleSB.Append(FTableInfo.NormalizeName(FTableInfo.TableNameFull, FOwner.FOptions.FQuoteNames)); + Condition := FOwner.SQLGetWhere(FOwner.FinalSQL); + if Condition <> '' then + FMiddleSB.Append(' WHERE ' + Condition); + FMiddleSB.Append(' ORDER BY '); +end; + +function TDASQLGenerator.GenerateSQLforUpdTable(TableInfo: TCRTableInfo; + const KeyAndDataFields: TKeyAndDataFields; + const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + Params: TDAParams; + const Index: integer = -1): string; +{$IFNDEF CLR} +var + i: integer; +{$ENDIF} +begin + if TableInfo.TableName = '' then + DatabaseError(SBadTableInfoName); + + Clear; + + FTableInfo := TableInfo; + FParams := Params; + if FParams <> nil then begin + FParams.BeginUpdate; + FParams.Clear; + FParamsInfo.Clear; + end; + try + case StatementType of + stInsert: + GenerateInsertSQL(KeyAndDataFields, ModifiedFieldsOnly, Index); + stUpdate: + GenerateUpdateSQL(KeyAndDataFields, ModifiedFieldsOnly, Index); + stDelete: + GenerateDeleteSQL(KeyAndDataFields, ModifiedFieldsOnly, Index); + stLock: + GenerateLockSQL(KeyAndDataFields, Index); + stRefresh: + GenerateRefreshSQL(KeyAndDataFields, ModifiedFieldsOnly); + stRefreshQuick: + GenerateRefreshQuickSQL(KeyAndDataFields); + stRefreshCheckDeleted: + GenerateRefreshCheckDeletedSQL(KeyAndDataFields); + else + DatabaseError(SBadStatementType); + end; + + Result := AssembleSB(StatementType); + finally + if FParams <> nil then begin + FParams.EndUpdate; + {$IFNDEF CLR} + for i := 0 to FParams.Count - 1 do + _TParam(TCollection(FParams).Items[i]).FParamRef := TParam(TCollection(FParams).Items[i]); + {$ENDIF} + end; + end; +end; + +function TDASQLGenerator.GenerateSQL(const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + Params: TDAParams; + const Index: Integer = -1): string; +var + KeyAndDataFields: TKeyAndDataFields; +begin +{$IFDEF PERF_COUNTER} + PerfCounters[4].Start; +{$ENDIF} + if FOwner.FUpdatingTableInfoIdx = -1 then + Result := '' + else + begin + FOwner.GetKeyAndDataFields(KeyAndDataFields, (StatementType = stRefresh) and FOwner.Options.FullRefresh); + Result := GenerateSQLforUpdTable(FOwner.TablesInfo[FOwner.FUpdatingTableInfoIdx], + KeyAndDataFields, StatementType, ModifiedFieldsOnly, Params, Index); + end; +{$IFDEF PERF_COUNTER} + PerfCounters[4].Stop; +{$ENDIF} +end; + +{ TCustomDASQL } + +constructor TCustomDASQL.Create(Owner: TComponent); +begin + inherited Create(Owner); + + FSQL := TStringList.Create; + TStringList(FSQL).OnChange := SQLChanged; + FParams := CreateParamsObject; + FParamCheck := True; + if Owner is TCustomDADataSet then + FMacros := TMacros.Create(Owner) + else + FMacros := TMacros.Create(Self); + FChangeCursor := True; + + FDesignCreate := csDesigning in ComponentState; + + if not (Owner is TCustomDADataSet) then // temp + CreateICommand; +end; + +destructor TCustomDASQL.Destroy; +var + Owner: TComponent; +begin + UnPrepare; + + if UsedConnection <> nil then + UsedConnection.UnregisterClient(Self); + + FMacros.Free; + FParams.Clear; // To prevent SharedObj leak on CLR + FParams.Free; + FSQL.Free; + + Owner := Self.Owner; + + inherited; + + if not (Owner is TCustomDADataSet) then // temp + FreeICommand; +end; + +procedure TCustomDASQL.CreateICommand; +begin + if UsedConnection <> nil then + SetICommand(UsedConnection.CreateICommand) + else + SetICommand(nil); +end; + +procedure TCustomDASQL.FreeICommand; +begin + FICommand.Free; + SetICommand(nil); +end; + +procedure TCustomDASQL.SetICommand(Value: TCRCommand); +var + ScanParams: variant; +begin + FICommand := Value; + + if FICommand <> nil then begin + if FConnection <> nil then + FICommand.SetConnection(FConnection.FIConnection) + else + FICommand.SetConnection(nil); + + FICommand.SetSQL(FNativeSQL); //AssembleSQL; // set FICommand.SQL + FICommand.SetProp(prAutoCommit, FAutoCommit); + FICommand.AfterExecute := DoAfterExecute; + if (Owner is TCustomDADataSet) or (Owner is TCustomDAConnection) then + FICommand.Component := Owner + else + FICommand.Component := Self; + FICommand.GetProp(prScanParams, ScanParams); + + // Write param info + if not boolean(ScanParams) then + WriteParams(False); + end; +end; + +procedure TCustomDASQL.CheckICommand; +var + ClassType: TClass; +begin + if (UsedConnection <> nil) then + ClassType := UsedConnection.GetICommandClass + else + ClassType := nil; + + if (ClassType = nil) or not (FICommand is ClassType) then begin + FreeICommand; + CreateICommand; + end; +end; + +function TCustomDASQL.CreateParamsObject: TDAParams; +begin + Result := TDAParams.Create(Self); +end; + +procedure TCustomDASQL.Loaded; +begin + inherited; + + FDesignCreate := False; +end; + +function TCustomDASQL.UsedConnection: TCustomDAConnection; +begin + Result := FConnection +end; + +procedure TCustomDASQL.CheckConnection; +begin + BeginConnection(False); +end; + +procedure TCustomDASQL.BeginConnection(NoConnectCheck: boolean = True); +begin + if UsedConnection = nil then + DatabaseError(SConnectionNotDefined); + + + if NoConnectCheck then + UsedConnection.InternalConnect // We should call connect each time to update ConnectCount + else + if not UsedConnection.Connected then + UsedConnection.Connect; + +// use default session + if (FConnection = nil) and (UsedConnection.FSQLs.IndexOf(Self) = -1) then begin + UsedConnection.RegisterClient(Self, ConnectChange); + + CheckICommand; + FICommand.SetConnection(UsedConnection.FIConnection) + end; +end; + +procedure TCustomDASQL.EndConnection; +begin + if UsedConnection <> nil then + UsedConnection.InternalDisconnect; +end; + +procedure TCustomDASQL.Disconnect; +begin + if FDataSet = nil then + UnPrepare + else + FDataSet.Disconnect; +end; + +procedure TCustomDASQL.ConnectChange(Sender: TObject; Connecting: boolean); +begin + if not Connecting then + Disconnect; +end; + +procedure TCustomDASQL.InternalPrepare; +begin + FICommand.Prepare; +end; + +procedure TCustomDASQL.Prepare; +var + MessageID: cardinal; +begin + if not Prepared then begin + BeginConnection; + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLPrepare(Self, FinalSQL, FParams, MessageID, True); + + InternalPrepare; + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLPrepare(Self, FinalSQL, FParams, MessageID, False); + end; +end; + +procedure TCustomDASQL.InternalUnPrepare; +begin + FICommand.Unprepare; +end; + +procedure TCustomDASQL.UnPrepare; +begin + if Prepared then begin + try + InternalUnPrepare; + finally + EndConnection; //Diconnect after no longer prepared + end; + end; +end; + +procedure TCustomDASQL.InternalExecute(Iters: integer); +var + ReExecute: boolean; +begin + if UsedConnection <> nil then + UsedConnection.PushOperation(clExecute); + try + repeat + ReExecute := False; + try + FICommand.Execute(Iters); + except + on E: EFailOver do + if E.FConnLostCause = clExecute then begin + Connection.RestoreAfterFailOver; //Restore all read transactions + ReExecute := True; //We should pass clConnectionApplyUpdates FailOver + end + else + raise; + end; + until (not ReExecute); + finally + if UsedConnection <> nil then + UsedConnection.PopOperation; + end; +end; + +procedure TCustomDASQL.Execute; +begin + Execute(1); +end; + +procedure TCustomDASQL.Execute(Iters: integer); +var + MessageID: cardinal; +begin + if not Executing then begin + BeginConnection; + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, '', MessageID, True); + + if FChangeCursor then + if FNonBlocking then + SetCursor(crSQLArrow) + else + StartWait; + + WriteParams; + InternalExecute(Iters); + + if not FLockDebug and (TDASQLMonitorClass(UsedConnection.SQLMonitorClass).HasMonitor or Debug) then + TDASQLMonitorClass(UsedConnection.SQLMonitorClass).SQLExecute(Self, FinalSQL, FParams, '', MessageID, False); + end; +end; + +procedure TCustomDASQL.DoAfterExecute(Result: boolean); +var + Connection: TCustomDAConnection; +begin + if Result then + ReadParams; + + if FChangeCursor and FNonBlocking then + StopWait; + + Connection := UsedConnection; + if Connection.Options.DisconnectedMode and Connection.Connected then begin + //AutoCommit control + if not (Connection.AutoCommit and AutoCommit) and + (Connection.FTransactionID = '') then begin //Connection.GetInTransaction are not allowed here since it could be setted to True on + // Product level during Execuion without AutoCommit (ODAC, IBDAC) + //There is uncommitted transaction that was implicitly started by server + Connection.FTransactionID := 'CRImplicitTransaction'; //Set default value + Connection.FTransactionID := Connection.GetTransactionID; //To return product specific TransactionId + //or even reset InTransaction in case of transaction-free server operation + end + else + if Connection.AutoCommit and AutoCommit then begin + Connection.FTransactionID := Connection.GetTransactionID; //To return product specific TransactionId + end; + end; + EndConnection; //we should read all Out parameters before disconnect, so + //in NonBlocking Mode this event must be called exactly after server execute + if Assigned(FAfterExecute) then + FAfterExecute(Self, Result); +end; + +function TCustomDASQL.Executing: boolean; +var + Value: variant; +begin + FICommand.GetProp(prExecuting, Value); + Result := Value; +end; + +function TCustomDASQL.WaitExecuting(TimeOut: integer): boolean; +{$IFDEF MSWINDOWS} +var + Msg: TMSG; + T: DWORD; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + T := GetTickCount; + while Executing and ((TimeOut = 0) or (GetTickCount - T < DWORD(TimeOut * 1000))) do + if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin + if Msg.Message <> WM_QUIT then begin + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; +{$ELSE} + while Executing do; +{$ENDIF} + + Result := not Executing; +end; + +procedure TCustomDASQL.ScanMacros; +begin + if FDataSet = nil then + FMacros.Scan(FSQL.Text) + else + FDataSet.ScanMacros; +end; + +function TCustomDASQL.GetFinalSQL: string; +var + i: Integer; +begin + Result := FSQL.Text; + + // Copied from SysUtils + i := Length(Result); + while (i > 0) and (Result[i] <= ' ') do + Dec(i); + SetLength(Result, i); + + if FMacros.Count > 0 then + FMacros.Expand(Result); +end; + +function TCustomDASQL.ParseSQL(const SQL: string; Params: TDAParams; RenamePrefix: string = ''): string; +var + ParsedSQL: StringBuilder; + Parser: TParser; + StartPos: integer; + + LeftQuote, RightQuote: char; +begin + if FDataSet <> nil then begin + LeftQuote := FDataSet.FLeftQuote; + RightQuote := FDataSet.FRightQuote; + end + else + begin + LeftQuote := '"'; + RightQuote := '"'; + end; + + ParsedSQL := StringBuilder.Create(Length(SQL) + Length(SQL) div 2); + try + Parser := CreateParser(SQL); + try + if Params <> nil then begin + Params.BeginUpdate; + Params.Clear; + end; + Parser.OmitBlank := False; + Parser.OmitComment := True; + Parser.QuotedString := True; + Parser.ToBegin; + StartPos := Parser.CurrPos; + while Parser.ToLexem(':') do begin + ParsedSQL.Append(Copy(SQL, StartPos + 1, Parser.CurrPos - StartPos - 1)); + ParseSQLParam(ParsedSQL, Parser, Params, LeftQuote, RightQuote, RenamePrefix); + + StartPos := Parser.CurrPos; + end; + ParsedSQL.Append(Copy(SQL, StartPos + 1, Parser.CurrPos - StartPos)); + finally + Parser.Free; + if Params <> nil then + Params.EndUpdate; + end; + + Result := ParsedSQL.ToString; + finally + ParsedSQL.Free; + end; +end; + +function TCustomDASQL.ParseSQL(Params: TDAParams): string; +begin + Result := ParseSQL(FNativeSQL, Params, ''); +end; + +procedure TCustomDASQL.ParseSQLParam(ParsedSQL: StringBuilder; Parser: TParser; Params: TDAParams; const LeftQuote, RightQuote: char; RenamePrefix: string); +var + Code: integer; + St: string; + DogPresent: boolean; + l: integer; + ParamName: string; +begin + Code := Parser.GetNext(St); + DogPresent := St = '@'; + if DogPresent then + Code := Parser.GetNext(St); // Omit '@' in ParamName for BDE compatibility + + if ((Params <> nil) or (RenamePrefix <> '')) and ((Code = lcIdent) or (Code = lcNumber) or (Parser.KeywordLexems.IndexOf(St) <> -1)) // and (St <> '=') + then begin + if DogPresent then + ParamName := '@' + St + else + ParamName := St; + + l := Length(ParamName); + // remove quotes + if (ParamName[1] = LeftQuote) and (ParamName[l] = RightQuote) then + ParamName := Copy(ParamName, 2, l - 2); + if Params <> nil then begin + TDAParam(Params.Add).Name := ParamName; + ParsedSQL.Append('?'); + end + else + ParsedSQL.Append(RenamePrefix + ParamName); + end + else // Labels in SQL Server, MySQL syntax and PL SQL Blocks (a := b). + begin + ParsedSQL.Append(':'); + if DogPresent then + ParsedSQL.Append('@'); + ParsedSQL.Append(St); + end; +end; + +function TCustomDASQL.CreateParser(const Text: string): TParser; +begin + Result := TParser.Create(Text); +end; + +procedure TCustomDASQL.AssembleSQL; +var + InternalScanParams: variant; // scan params by internal layer + List: TDAParams; +begin +{$IFDEF PERF_COUNTER} + //PerfCounters[3].Start; +{$ENDIF} + + if FDataSet = nil then + FNativeSQL := FinalSQL + else + FNativeSQL := FDataSet.FinalSQL; + + FICommand.GetProp(prScanParams, InternalScanParams); + + if ParamCheck or (csDesigning in ComponentState) then begin + List := CreateParamsObject; + try + if boolean(InternalScanParams) then begin + // Internal param parsing + List.Assign(FParams); + + FICommand.SetSQL(FNativeSQL); + + CreateParams; + + FParams.AssignValues(List); + end + else begin + List.BeginUpdate; + try + FNativeSQL := ParseSQL(FNativeSQL, List); + List.AssignValues(FParams); + finally + List.EndUpdate; + end; + + FParams.Clear; + FParams.Assign(List); + + FICommand.SetSQL(FNativeSQL); + + WriteParams(False); + end; + finally + List.Clear; + List.Free; + end; + end + else begin +// if not InternalScanParams then // replace parameters +// FNativeSQL := FParams.ParseSQL(FNativeSQL, False); // needed only in SDAC + + FICommand.SetSQL(FNativeSQL); + end; +{$IFDEF PERF_COUNTER} + //PerfCounters[3].Stop; +{$ENDIF} +end; + +// creates TDAParam objects if parameters was parsed by FICommand +procedure TCustomDASQL.CreateParams; +var + ParamDesc: TParamDesc; + i: integer; +begin + FParams.BeginUpdate; + try + FParams.Clear; + for i := 0 to FICommand.GetParamCount - 1 do begin + ParamDesc := FICommand.GetParam(i); + with FParams.Add as TDAParam do begin + Name := ParamDesc.GetName; + DataType := GetFieldType(ParamDesc.GetDataType); + ParamType := TParamType(ParamDesc.GetParamType); + end; + end; + finally + FParams.EndUpdate; + end; +end; + +// Write values of parameters to FICommand +procedure TCustomDASQL.WriteParams(WriteValue: boolean = True); +var + Param: TDAParam; + ParamDesc: CRAccess.TParamDesc; + Dt: word; + + procedure WriteParamValue; + var + Value: Variant; + {$IFDEF CLR} + Bytes: TBytes; + {$ELSE} + l: integer; + s: string; + {$ENDIF} + {$IFNDEF VER6P} + tmp: int64; + {$ENDIF} + begin + if Param.IsObjectDataType then begin + ParamDesc.SetNull(Param.IsNull); + ParamDesc.SetObject(Param.ParamObject); + Exit; + end; + + Value := Param.Value; + if (Param.DataType = ftDate) and not (VarIsEmpty(Value) or VarIsNull(Value)) then begin + {$IFDEF VER6P} + Value := Trunc(Value); // drop time info /// CR-D16224 + {$ELSE} + tmp := Trunc(Value); + TVarData(Value).VType := varInt64; + TVarDataD6(Value).VInt64 := tmp; + {$ENDIF} + end; + + + // Convert param values if necessary + if ((Dt = dtBytes) or (Dt = dtVarBytes) or (Dt = dtBlob)) + and (VarType(Value) <> varArray + varByte) then + case VarType(Value) of + varString{$IFDEF CLR}, varChar{$ENDIF}: begin + {$IFDEF CLR} + Bytes := Encoding.Default.GetBytes(String(Value)); + Value := Unassigned; + Value := Bytes; + {$ELSE} + s := Value; + l := Length(s); + Value := Unassigned; + Value := VarArrayCreate([0, l - 1], varByte); + if l > 0 then + Move(s[1], TVarData(Value).VArray.Data^, l); + {$ENDIF} + end; + end; + ParamDesc.SetValue(Unassigned); + ParamDesc.SetValue(Value); + end; + +var + ft: TFieldType; + i: integer; +begin + for i := 0 to Params.Count - 1 do begin + Param := Params[i]; + if i < FICommand.GetParamCount then + ParamDesc := FICommand.GetParam(i) + else + ParamDesc := FICommand.AddParam; + ParamDesc.SetName(Param.Name); + + ft := Param.DataType; + dt := GetDataType(ft); + + ParamDesc.SetDataType(dt); + ParamDesc.SetParamType(TParamDirection(Param.ParamType)); + + if WriteValue then begin + {$IFDEF PERF_COUNTER} + PerfCounters[5].Start; + {$ENDIF} + WriteParamValue; + {$IFDEF PERF_COUNTER} + PerfCounters[5].Stop; + {$ENDIF} + end; + end; + while Params.Count < FICommand.GetParamCount do + FICommand.DeleteParam(FICommand.GetParamCount - 1); +end; + +// Read values of parameters from FICommand +procedure TCustomDASQL.ReadParams; +var + i: integer; + Param: TDAParam; + ParamDesc: TParamDesc; +begin + for i := 0 to FParams.Count - 1 do begin + Param := Params[i]; + ParamDesc := FICommand.GetParam(i); + if ParamDesc <> nil then + if (not Param.IsObjectDataType) and (Param.ParamType in [ptUnknown, ptOutput, ptInputOutput, ptResult]) then + Param.Value := ParamDesc.Value; + end; +end; + +procedure TCustomDASQL.DefineProperties(Filer: TFiler); + function WriteParams: boolean; + begin + if Filer.Ancestor <> nil then + Result := not FParams.IsEqual(TCustomDASQL(Filer.Ancestor).FParams) + else + Result := FParams.Count > 0; + end; + + function WriteMacros: boolean; + begin + if Filer.Ancestor <> nil then + Result := not FMacros.IsEqual(TCustomDASQL(Filer.Ancestor).FMacros) + else + Result := FMacros.Count > 0; + end; +begin + inherited DefineProperties(Filer); + + Filer.DefineProperty('ParamData', ReadParamData, WriteParamData, WriteParams); + Filer.DefineProperty('MacroData', ReadMacroData, WriteMacroData, WriteMacros); +end; + +procedure TCustomDASQL.ReadParamData(Reader: TReader); +begin + Reader.ReadValue; + Reader.ReadCollection(FParams); +end; + +procedure TCustomDASQL.WriteParamData(Writer: TWriter); +begin + Writer.WriteCollection(FParams); +end; + +procedure TCustomDASQL.ReadMacroData(Reader: TReader); +begin + Reader.ReadValue; + Reader.ReadCollection(FMacros); +end; + +procedure TCustomDASQL.WriteMacroData(Writer: TWriter); +begin + Writer.WriteCollection(FMacros); +end; + +function TCustomDASQL.FindParam(const Value: string): TDAParam; +begin + Result := FParams.FindParam(Value); +end; + +function TCustomDASQL.ParamByName(const Value: string): TDAParam; +begin + Result := FParams.ParamByName(Value); +end; + +function TCustomDASQL.FindMacro(const Value: string): TMacro; +begin + Result := FMacros.FindMacro(Value); +end; + +function TCustomDASQL.MacroByName(const Value: string): TMacro; +begin + Result := FMacros.MacroByName(Value); +end; + +procedure TCustomDASQL.AssignTo(Dest: TPersistent); +begin + if Dest is TCustomDASQL then begin + TCustomDASQL(Dest).Connection := Connection; + TCustomDASQL(Dest).ParamCheck := ParamCheck; // before SQL + TCustomDASQL(Dest).SQL.Text := SQL.Text; + TCustomDASQL(Dest).Macros.Assign(Macros); + TCustomDASQL(Dest).Params.Assign(Params); + TCustomDASQL(Dest).Debug := Debug; + TCustomDASQL(Dest).AutoCommit := AutoCommit; + end + else + inherited; +end; + +procedure TCustomDASQL.SetConnection(Value: TCustomDAConnection); +begin + if (Value <> FConnection) or (Value <> UsedConnection) then begin + if UsedConnection <> nil then begin + Disconnect; + UsedConnection.UnregisterClient(Self); + end; + + FConnection := Value; + + if FConnection <> nil then begin + Value.RegisterClient(Self, ConnectChange); + + CheckICommand; + FICommand.SetConnection(FConnection.FIConnection) + end + else + FICommand.SetConnection(nil); + end; +end; + +procedure TCustomDASQL.SetSQL(Value: TStrings); +begin + if FSQL.Text <> Value.Text then begin + FSQL.BeginUpdate; + try + FSQL.Assign(Value); + finally + FSQL.EndUpdate; + end; + end; +end; + +procedure TCustomDASQL.SQLChanged(Sender: TObject); +var + Cmd: TCRCommand; +begin + //if not (csReading in ComponentState) then begin + if FDataSet = nil then + UnPrepare + else begin + if not BaseSQLOldBehavior then + FDataSet.FBaseSQL := ''; + FDataSet.Close; + FDataSet.UnPrepare; + FDataSet.FieldDefs.Updated := False; + + if FDataSet.Data is TCRRecordSet then begin + Cmd := TCRRecordSet(FDataSet.Data).GetCommand; + if Cmd <> nil then + Cmd.SetCursorState(csInactive); + TCRRecordSet(FDataSet.Data).CommandType := ctUnknown; + end; + + FDataSet.FOldTableName := ''; + FDataSet.FOldKeyFields := ''; + end; + + if not FLockMacros then + ScanMacros; + + if not FLockAssembleSQL then + AssembleSQL + else + FICommand.SetSQL(FSQL.Text); +end; + +function TCustomDASQL.GetPrepared: boolean; +begin + Result := FICommand.GetPrepared; +end; + +procedure TCustomDASQL.SetPrepared(Value: boolean); +begin + if Value then + Prepare + else + UnPrepare; +end; + +procedure TCustomDASQL.SetParams(Value: TDAParams); +begin + FParams.AssignValues(Value); +end; + +function TCustomDASQL.GetParamCount: word; +begin + Result := FParams.Count; +end; + +procedure TCustomDASQL.SetParamCheck(Value: boolean); +begin + FParamCheck := Value; + + Value := Value or (csDesigning in ComponentState); // set value of ScanParams + FICommand.SetProp(prScanParams, Value); + + if Value then + AssembleSQL; +end; + +function TCustomDASQL.GetParamValues(ParamName: string): variant; +begin + Result := FParams.ParamValues[ParamName]; +end; + +procedure TCustomDASQL.SetParamValues(ParamName: string; Value: variant); +begin + FParams.ParamValues[ParamName] := Value; +end; + +procedure TCustomDASQL.SetMacros(Value: TMacros); +begin + FMacros.Assign(Value); +end; + +function TCustomDASQL.GetMacroCount: word; +begin + Result := FMacros.Count; +end; + +procedure TCustomDASQL.SetAutoCommit(Value: boolean); +begin + FAutoCommit := Value; + Assert(FICommand <> nil); + FICommand.SetProp(prAutoCommit, FAutoCommit); +end; + +function TCustomDASQL.GetRowsAffected: integer; +var + Value: variant; +begin + FICommand.GetProp(prRowsProcessed, Value); + Result := Value; +end; + +{ TCustomDAUpdateSQL } + +constructor TCustomDAUpdateSQL.Create(Owner: TComponent); +var + UpdateKind: TUpdateKind; +begin + inherited; + + for UpdateKind := Low(TUpdateKind) to High(TUpdateKind) do + FSQLText[UpdateKindToStatementType(UpdateKind)] := TStringList.Create; + FSQLText[stRefresh] := TStringList.Create; +end; + +destructor TCustomDAUpdateSQL.Destroy; +var + StatementType: TStatementType; +begin + if Assigned(FDataSet) and (FDataSet.UpdateObject = Self) then + FDataSet.UpdateObject := nil; + for StatementType := Low(TStatementType) to High(TStatementType) do + FSQLText[StatementType].Free; + + inherited; +end; + +procedure TCustomDAUpdateSQL.ExecSQL(UpdateKind: TUpdateKind); +var + StatementType: TStatementType; +begin + StatementType := UpdateKindToStatementType(UpdateKind); + FDataSet.PerformSQL(FSQLText[StatementType].Text, [StatementType]); +end; + +function TCustomDAUpdateSQL.GetSQL(UpdateKind: TUpdateKind): TStrings; +begin + Result := GetSQLIndex(Ord(UpdateKindToStatementType(UpdateKind))); +end; + +procedure TCustomDAUpdateSQL.SetSQL(UpdateKind: TUpdateKind; Value: TStrings); +begin + SetSQLIndex(Ord(UpdateKindToStatementType(UpdateKind)), Value); +end; + +function TCustomDAUpdateSQL.GetSQLIndex(Index: integer): TStrings; +begin + Result := FSQLText[TStatementType(Index)]; +end; + +procedure TCustomDAUpdateSQL.SetSQLIndex(Index: integer; Value: TStrings); +begin + FSQLText[TStatementType(Index)].Assign(Value); +end; + +function TCustomDAUpdateSQL.GetDataSet: TCustomDADataSet; +begin + Result := FDataSet; +end; + +procedure TCustomDAUpdateSQL.SetDataSet(DataSet: TCustomDADataSet); +begin + FDataSet := DataSet; +end; + +procedure TCustomDAUpdateSQL.SetObjectIndex(Index: integer; Value: TComponent); +begin + CheckUpdateComponent(Value); + FUpdateObject[TStatementType(Index)] := Value; +end; + +function TCustomDAUpdateSQL.GetObjectIndex(Index: integer): TComponent; +begin + Result := FUpdateObject[TStatementType(Index)]; +end; + +function TCustomDAUpdateSQL.DataSetClass: TCustomDADataSetClass; +begin + Result := TCustomDADataSet; +end; + +function TCustomDAUpdateSQL.SQLClass: TCustomDASQLClass; +begin + Result := TCustomDASQL; +end; + +procedure TCustomDAUpdateSQL.CheckUpdateComponent(Component: TComponent; NewDataset: TCustomDADataset); +begin + if Component <> nil then begin + if not ((Component is SQLClass) or (Component is DataSetClass)) then + raise Exception.Create(Format(SUpdateComponentInvalidType, [DataSetClass.ClassName, SQLClass.ClassName])); + if NewDataSet = Component then + raise Exception.Create(SUpdateComponentCircularReferences); + end; +end; + +procedure TCustomDAUpdateSQL.CheckUpdateComponent(Component: TComponent); +begin + CheckUpdateComponent(Component, FDataset); +end; + +procedure TCustomDAUpdateSQL.Notification(AComponent: TComponent; Operation: TOperation); +var + stIdx: TStatementType; +begin + inherited; + if Operation = opRemove then + for stIdx := Low(FUpdateObject) to High(FUpdateObject) do + if FUpdateObject[stIdx] = AComponent then + FUpdateObject[stIdx] := nil; +end; + +procedure TCustomDAUpdateSQL.Apply(UpdateKind: TUpdateKind); +begin + ExecSQL(UpdateKind); +end; + +procedure TCustomDAUpdateSQL.Loaded; +begin + inherited; + + FDesignCreate := False; +end; + +procedure TCustomDAUpdateSQL.AssignTo(Dest: TPersistent); +begin + if Dest is TCustomDAUpdateSQL then begin + TCustomDAUpdateSQL(Dest).RefreshSQL := RefreshSQL; + TCustomDAUpdateSQL(Dest).ModifySQL := ModifySQL; + TCustomDAUpdateSQL(Dest).InsertSQL := InsertSQL; + TCustomDAUpdateSQL(Dest).DeleteSQL := DeleteSQL; + TCustomDAUpdateSQL(Dest).DataSet := DataSet; + TCustomDAUpdateSQL(Dest).RefreshObject := RefreshObject; + TCustomDAUpdateSQL(Dest).ModifyObject := ModifyObject; + TCustomDAUpdateSQL(Dest).InsertObject := InsertObject; + TCustomDAUpdateSQL(Dest).DeleteObject := DeleteObject; + end + else + inherited; +end; + +{ TMacro } + +constructor TMacro.Create(Collection: TCollection); +begin + inherited; + + FActive := True; +end; + +procedure TMacro.AssignTo(Dest: TPersistent); +begin + if Dest is TMacro then begin + TMacro(Dest).Name := Name; + TMacro(Dest).Value := Value; + TMacro(Dest).Active := Active; + end + else + inherited; +end; + +function TMacro.IsEqual(Value: TMacro): boolean; +begin + Result := (Name = Value.Name) and + (Self.Value = Value.Value) and + (Active = Value.Active); +end; + +function TMacro.GetDisplayName: string; +begin + if FName = '' then + Result := inherited GetDisplayName + else + Result := FName; +end; + +procedure TMacro.SetValue(Value: string); +var + Owner: TPersistent; + OldBaseSQL: string; +begin + if Value <> FValue then begin + FValue := Value; + Owner := TMacros(Collection).FOwner; + if (TMacros(Collection).UpdateCount = 0) and + (Owner <> nil) + then + if Owner is TCustomDADataSet then + with TCustomDADataSet(Owner) do begin + if not Active or (Pos(MacroChar + Self.Name, SQL.Text) <> 0) then begin + OldBaseSQL := FBaseSQL; + FCommand.SQLChanged(Self); + FBaseSQL := OldBaseSQL; + end; + end + else + TCustomDASQL(Owner).SQLChanged(Self); + end; +end; + +function TMacro.GetAsDateTime: TDateTime; +var + St: string; + iStart: integer; + iEnd: integer; + Len: integer; +begin + St := Trim(FValue); + Len := Length(FValue); + if (Len > 0) and (St[1] = '''') then + iStart := 2 + else + iStart := 1; + + if (Len > 0) and (St[Length(St)] = '''') then + iEnd := Length(St) - 1 + else + iEnd := Length(St); + + Result := StrToDateTime(Copy(St, iStart, iEnd - iStart + 1)); +end; + +procedure TMacro.SetAsDateTime(Value: TDateTime); +begin + Self.Value := '''' + DateTimeToStr(Value) + ''''; +end; + +function TMacro.GetAsFloat: double; +begin + Result := StrToFloat(FValue); +end; + +procedure TMacro.SetAsFloat(Value: double); +begin + Self.Value := FloatToStr(Value); +end; + +function TMacro.GetAsInteger: integer; +begin + Result := StrToInt(FValue); +end; + +procedure TMacro.SetAsInteger(Value: integer); +begin + Self.Value := IntToStr(Value); +end; + +function TMacro.GetAsString: string; +var + St: string; + iStart: integer; + iEnd: integer; + Len: integer; +begin + St := Trim(FValue); + Len := Length(FValue); + if (Len > 0) and (St[1] = '''') then + iStart := 2 + else + iStart := 1; + + if (Len > 0) and (St[Length(St)] = '''') then + iEnd := Length(St) - 1 + else + iEnd := Length(St); + + Result := Copy(St, iStart, iEnd - iStart + 1); +end; + +procedure TMacro.SetAsString(Value: string); +begin + Self.Value := '''' + Value + ''''; +end; + +procedure TMacro.SetActive(Value: boolean); +var + Owner: TPersistent; +begin + if Value <> FActive then begin + FActive := Value; + Owner := TMacros(Collection).FOwner; + if (TMacros(Collection).UpdateCount = 0) and + (Owner <> nil) + then + if Owner is TCustomDADataSet then + with TCustomDADataSet(Owner) do begin + if not Active or (Pos(MacroChar + Self.Name, SQL.Text) <> 0) then + AssembleSQL; + end + else + TCustomDASQL(Owner).AssembleSQL + end; +end; + +{ TMacros } + +constructor TMacros.Create(Owner: TPersistent); +begin + inherited Create(TMacro); + + FOwner := Owner; + FParserClass := TParser; +end; + +procedure TMacros.Scan(SQL: string); +var + Macro: TMacro; + NewMacros: TMacros; + Parser: TParser; + CodeLexem: integer; + St, St2: string; + MacroSt: string; // Delphi problem with compare MacroChar = St + Changed, NeedNext: boolean; + i: integer; + +begin + // performance reason +{$IFDEF CLR} + if SQL.IndexOf(Char(MacroChar)) = -1 then begin +{$ELSE} + if StrScan(PChar(SQL), MacroChar) = nil then begin +{$ENDIF} + Clear; + Exit; + end; + + NewMacros := TMacros.Create(nil); + NewMacros.BeginUpdate; + + Parser := FParserClass.Create(SQL); + MacroSt := MacroChar; + Parser.OmitBlank := False; + Parser.Uppered := False; + try + Parser.ToBegin; + repeat + repeat + CodeLexem := Parser.GetNext(St); //+++ char instead of string + until (CodeLexem = lcEnd) or (St = MacroSt); + repeat + NeedNext := True; + if (St = MacroSt) and Parser.IsMacroAllowed(CodeLexem) then begin + CodeLexem := Parser.GetNext(St); + if (CodeLexem = lcIdent) or Parser.IsNumericMacroNameAllowed and (CodeLexem = lcNumber) or + (CodeLexem > Parser.SymbolLexems.Count) and + (CodeLexem <= Parser.SymbolLexems.Count + Parser.KeywordLexems.Count) + // SQL reserved words are allowed + then begin + St2 := St; + if CodeLexem = lcNumber then begin + CodeLexem := Parser.GetNext(St); + if (CodeLexem = lcIdent) or (CodeLexem > Parser.SymbolLexems.Count) + and (CodeLexem <= Parser.SymbolLexems.Count + Parser.KeywordLexems.Count) + then + St2 := St2 + St + else + NeedNext := False + end; + Macro := NewMacros.FindMacro(St2); + if Macro = nil then begin + Macro := TMacro(NewMacros.Add); + if FindMacro(St2) <> nil then + Macro.Assign(FindMacro(St2)) + else + Macro.Name := St2; + end; + end; + end; + until NeedNext; + until CodeLexem = lcEnd; + + if Count <> NewMacros.Count then + Changed := True + else + begin + Changed := False; + for i := 0 to Count - 1 do + if not Items[i].IsEqual(NewMacros.Items[i]) then begin + Changed := True; + Break; + end; + end; + + if Changed then + Assign(NewMacros); + finally + Parser.Free; + NewMacros.Free; + end; +end; + +function TMacros.GetMacroValue(Macro: TMacro): string; +begin + if Macro.Active then + Result := Macro.Value + else + Result := ''; +end; + +procedure TMacros.Expand(var SQL: string); +var + Parser: TParser; + CodeLexem: integer; + Macro: TMacro; + St, St2: string; + MacroSt: string; // Delphi problem with compare MacroChar = St + Result: string; + NeedNext: boolean; +begin + Parser := FParserClass.Create(SQL); + MacroSt := MacroChar; + Parser.OmitBlank := False; + Parser.Uppered := False; + Parser.QuotedString := True; + try + Result := ''; + St := ''; + NeedNext := True; + CodeLexem := 0; // to prevent warning + Parser.ToBegin; + while True do begin + if NeedNext then + CodeLexem := Parser.GetNext(St); + + if CodeLexem = lcEnd then + Break; + + NeedNext := True; + if (St = MacroSt) and Parser.IsMacroAllowed(CodeLexem) then begin + CodeLexem := Parser.GetNext(St); + if (CodeLexem = lcIdent) or Parser.IsNumericMacroNameAllowed and (CodeLexem = lcNumber) or + (CodeLexem > Parser.SymbolLexems.Count) and + (CodeLexem <= Parser.SymbolLexems.Count + Parser.KeywordLexems.Count) + // SQL reserved words is allowed + then begin + St2 := St; + if CodeLexem = lcNumber then begin + CodeLexem := Parser.GetNext(St); + if (CodeLexem = lcIdent) or (CodeLexem > Parser.SymbolLexems.Count) + and (CodeLexem <= Parser.SymbolLexems.Count + Parser.KeywordLexems.Count) + then + St2 := St2 + St + else + NeedNext := False + end; + Macro := FindMacro(St2); + if Macro <> nil then + Result := Result + GetMacroValue(Macro); + end + else + Result := Result + MacroSt + St; + end + else + Result := Result + St; + end; + finally + Parser.Free; + end; + + SQL:= Result; +end; + +procedure TMacros.AssignTo(Dest: TPersistent); +begin + if Dest is TMacros then + TMacros(Dest).Assign(Self) + else + inherited AssignTo(Dest); +end; + +procedure TMacros.AssignValues(Value: TMacros); +var + i: integer; + Macro: TMacro; +begin + for i := 0 to Value.Count - 1 do begin + Macro := FindMacro(Value[i].Name); + if Macro <> nil then + Macro.Assign(Value[i]); + end; +end; + +procedure TMacros.DefineProperties(Filer: TFiler); +begin + Filer.DefineBinaryProperty('Data', ReadBinaryData, nil, False); +end; + +function TMacros.IsEqual(Value: TMacros): boolean; +var + i: integer; +begin + Result := True; + if Self = Value then + Exit; + if Count = Value.Count then begin + for i := 0 to Count - 1 do + if (Items[i].Name <> Value[i].Name) or + (Items[i].Value <> Value[i].Value) or + (Items[i].Active <> Value[i].Active) + then + Result := False; + end + else + Result := False; +end; + +{ Structure of Data + Version 1 (100) -- !!! Add in 100 + ItemCount 1 + NameLength 1 + Name Length(Name) + ValueLength 2 + Value Length(Value) + Active 1 -- !!! Add in 100 +} + +procedure TMacros.ReadBinaryData(Stream: TStream); +const + BufLen = 1000; +var + i, Len: word; + Version: byte; + B: boolean; + Buf: TBytes; + St: string; +begin + SetLength(Buf, BufLen + 1{??? - array [0..BufLen] of byte}); + + with Stream do begin + ReadBuffer(Version, 1); // Version or Count + + if Version = 100 then begin + Len := 0; + ReadBuffer(Len, 1); + end; + + for i := 0 to Count - 1 do begin + Len := 0; + ReadBuffer(Len, 1); + if Len > BufLen then + Len := BufLen; + ReadBuffer(Buf{$IFNDEF CLR}[0]{$ENDIF}, Len); + Buf[Len] := 0; + St := Encoding.Default.GetString(Buf, 0, Len); + with MacroByName(St) do begin + ReadBuffer(Len, 2); + if Len > BufLen then + Len := BufLen; + ReadBuffer(Buf{$IFNDEF CLR}[0]{$ENDIF}, Len); + Buf[Len] := 0; + St := Encoding.Default.GetString(Buf, 0, Len); + Value := St; + + if Version = 100 then begin + ReadBuffer(B, 1); // Active + Active := B; + end; + end; + end; + end; +end; + +function TMacros.GetOwner: TPersistent; +begin + Result := FOwner; +end; + +procedure TMacros.Update(Item: TCollectionItem); +begin + inherited; + + if FOwner <> nil then + if FOwner is TCustomDADataSet then + TCustomDADataSet(FOwner).AssembleSQL + else + TCustomDASQL(FOwner).AssembleSQL +end; + +function TMacros.GetItem(Index: integer): TMacro; +begin + Result := TMacro(inherited Items[Index]); +end; + +procedure TMacros.SetItem(Index: integer; Value: TMacro); +begin + inherited SetItem(Index, TCollectionItem(Value)); +end; + +function TMacros.GetUpdateCount: integer; +begin + Result := inherited UpdateCount; +end; + +function TMacros.FindMacro(const Value: string): TMacro; +var + i: integer; +begin + for i := 0 to Count - 1 do begin + Result := TMacro(inherited Items[i]); + if AnsiCompareText(Result.Name, Value) = 0 then + Exit; + end; + Result := nil; +end; + +function TMacros.MacroByName(const Value: string): TMacro; +begin + Result := FindMacro(Value); + + if Result = nil then + DatabaseErrorFmt(SMacroNotFound, [Value], FOwner as TComponent); +end; + +procedure TMacros.SetParserClass(Value: TParserClass); +begin + FParserClass := Value; +end; + +{ TCustomConnectDialog } + +constructor TCustomConnectDialog.Create(Owner: TComponent); +begin + inherited; + + FRetries := 3; + LabelSet := lsEnglish; + FStoreLogInfo := True; +end; + +procedure TCustomConnectDialog.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + + if (Operation = opRemove) and (FConnection = AComponent) then + FConnection := nil; +end; + +function TCustomConnectDialog.DefDialogClass: TClass; +begin + Result := nil; +end; + +procedure TCustomConnectDialog.GetServerList(List: TStrings); +begin +end; + +function TCustomConnectDialog.GetKeyPath: string; +begin + Result := ''; +end; + +function TCustomConnectDialog.GetServerStoreName: string; +begin + Result := 'Server'; +end; + +{$IFDEF MSWINDOWS} +procedure TCustomConnectDialog.SaveInfoToRegistry(Registry: TRegistry); +begin + Registry.WriteString('Username', Connection.Username); + Registry.WriteString(GetServerStoreName, Connection.Server); +end; + +procedure TCustomConnectDialog.LoadInfoFromRegistry(Registry: TRegistry); +var + ServerKey: string; +begin + ServerKey := GetServerStoreName; + if Registry.ValueExists('Username') then + Connection.FUsername := Registry.ReadString('Username'); + if Registry.ValueExists(ServerKey) then + Connection.FServer := Registry.ReadString(ServerKey); +end; +{$ENDIF} + +{class function TCustomConnectDialog.AcceptBlankPassword: boolean; +begin + Result := False; +end;} + +function TCustomConnectDialog.Execute: boolean; +var + Key: string; + OldUsername, OldPassword, OldServer: string; +{$IFDEF MSWINDOWS} + KeyOpened, IDE: boolean; + Registry: TRegistry; + + procedure SaveServerListToRegistry; + var + List: TStrings; + i,j: integer; + begin + List := TStringList.Create; + try + GetServerList(List); + Registry.WriteString(Format('%s %d', [ServerLabel, 1]), Connection.Server); + i := 2; + for j := 0 to List.Count - 1 do + if AnsiCompareText(List[j], Connection.Server) <> 0 then begin + Registry.WriteString(Format('%s %d', [ServerLabel, i]), List[j]); + Inc(i); + end; + finally + List.Free; + end; + end; + +{$ENDIF} +begin + Result := False; + + if Connection = nil then + DatabaseError(SConnectionNotDefined); + + OldUsername := Connection.Username; + OldPassword := Connection.Password; + OldServer := Connection.Server; + + Key := GetKeyPath + 'Connect\' + ApplicationTitle; + +{$IFDEF MSWINDOWS} + Registry := nil; +{$ENDIF} + try + if FStoreLogInfo then begin + {$IFDEF MSWINDOWS} + Registry := TRegistry.Create; + + KeyOpened := Registry.OpenKey(Key, False); + IDE := (Pos('Delphi', ApplicationTitle) = 1) or + (Pos('C++Builder', ApplicationTitle) = 1); + + if KeyOpened and (not IDE or (Connection.Username = '')) then + LoadInfoFromRegistry(Registry); + + if not SavePassword and not IDE or + (AnsiCompareText(Connection.Username, OldUsername) <> 0) + then + Connection.FPassword := ''; + + if KeyOpened then + Registry.CloseKey; + {$ENDIF} + end; + + if Assigned(ShowConnectFormProc) then + Result := ShowConnectFormProc(Self) + else + Result := False; + + if Result then begin + if FStoreLogInfo then begin + {$IFDEF MSWINDOWS} + // StoreLogInfo can be changed by user since previous check + if Registry = nil then + Registry := TRegistry.Create; + + if Registry.OpenKey(Key, True) then begin + SaveInfoToRegistry(Registry); + Registry.CloseKey; + end; + + if Registry.OpenKey(GetKeyPath + 'Connect', False) then begin + SaveServerListToRegistry; + Registry.CloseKey; + end; + {$ENDIF} + end; + end; + finally + if not Result then begin + Connection.FUsername := OldUsername; + Connection.FPassword := OldPassword; + Connection.FServer := OldServer; + end; + {$IFDEF MSWINDOWS} + Registry.Free; + {$ENDIF} + end; +end; + +{$IFDEF WIN32} +function TCustomConnectDialog.GetString(Id: integer): string; +const + BufLen = 50; +var + Buf: array [0..BufLen] of char; + Base: integer; +begin + case FLabelSet of + lsEnglish: + Base := 100; + lsFrench: + Base := 200; + lsGerman: + Base := 300; + lsItalian: + Base := 400; + lsPolish: + Base := 500; + lsPortuguese: + Base := 600; + lsRussian: + Base := 0; + lsSpanish: + Base := 700; + else + Base := 100; + end; + + Buf[0] := #0; + LoadString(hInstance, Id + Base, @Buf, BufLen); + Result := Buf; +end; +{$ENDIF} + +procedure TCustomConnectDialog.SetLabelSet(Value: TLabelSet); +{$IFDEF WIN32} +begin + FLabelSet := Value; + if FLabelSet <> lsCustom then begin + + FCaption := GetString(0); + FUsernameLabel := GetString(1); + FPasswordLabel := GetString(2); + FServerLabel := GetString(3); + FConnectButton := GetString(4); + FCancelButton := GetString(5); + end; +{$ELSE} +begin + FCaption := 'Connect'; + FUsernameLabel := 'Username'; + FPasswordLabel := 'Password'; + FServerLabel := 'Server'; + FConnectButton := 'Connect'; + FCancelButton := 'Cancel'; +{$ENDIF} +end; + +procedure TCustomConnectDialog.SetCaption(Value: string); +begin + if not(csLoading in ComponentState) then + FLabelSet := lsCustom; + + FCaption := Value; +end; + +procedure TCustomConnectDialog.SetUsernameLabel(Value: string); +begin + if not(csLoading in ComponentState) then + FLabelSet := lsCustom; + + FUsernameLabel := Value; +end; + +procedure TCustomConnectDialog.SetPasswordLabel(Value: string); +begin + if not(csLoading in ComponentState) then + FLabelSet := lsCustom; + + FPasswordLabel := Value; +end; + +procedure TCustomConnectDialog.SetServerLabel(Value: string); +begin + if not(csLoading in ComponentState) then + FLabelSet := lsCustom; + + FServerLabel := Value; +end; + +procedure TCustomConnectDialog.SetConnectButton(Value: string); +begin + if not(csLoading in ComponentState) then + FLabelSet := lsCustom; + + FConnectButton := Value; +end; + +procedure TCustomConnectDialog.SetCancelButton(Value: string); +begin + if not(csLoading in ComponentState) then + FLabelSet := lsCustom; + + FCancelButton := Value; +end; + +{$IFDEF MSWINDOWS} +const + advapi32 = 'advapi32.dll'; + netapi32 = 'netapi32.dll'; + + // Service State -- for CurrentState + SERVICE_STOPPED = $00000001; + SERVICE_START_PENDING = $00000002; + SERVICE_STOP_PENDING = $00000003; + SERVICE_RUNNING = $00000004; + SERVICE_CONTINUE_PENDING = $00000005; + SERVICE_PAUSE_PENDING = $00000006; + SERVICE_PAUSED = $00000007; + + // Service object specific access type + SERVICE_QUERY_CONFIG = $0001; + SERVICE_CHANGE_CONFIG = $0002; + SERVICE_QUERY_STATUS = $0004; + SERVICE_ENUMERATE_DEPENDENTS = $0008; + SERVICE_START = $0010; + SERVICE_STOP = $0020; + SERVICE_PAUSE_CONTINUE = $0040; + SERVICE_INTERROGATE = $0080; + SERVICE_USER_DEFINED_CONTROL = $0100; + SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or + SERVICE_QUERY_CONFIG or + SERVICE_CHANGE_CONFIG or + SERVICE_QUERY_STATUS or + SERVICE_ENUMERATE_DEPENDENTS or + SERVICE_START or + SERVICE_STOP or + SERVICE_PAUSE_CONTINUE or + SERVICE_INTERROGATE or + SERVICE_USER_DEFINED_CONTROL); + + // Service Control Manager object specific access types + SC_MANAGER_CONNECT = $0001; + SC_MANAGER_CREATE_SERVICE = $0002; + SC_MANAGER_ENUMERATE_SERVICE = $0004; + SC_MANAGER_LOCK = $0008; + SC_MANAGER_QUERY_LOCK_STATUS = $0010; + SC_MANAGER_MODIFY_BOOT_CONFIG = $0020; + SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SC_MANAGER_CONNECT or + SC_MANAGER_CREATE_SERVICE or SC_MANAGER_ENUMERATE_SERVICE or SC_MANAGER_LOCK or + SC_MANAGER_QUERY_LOCK_STATUS or SC_MANAGER_MODIFY_BOOT_CONFIG); + + // Service Types + SERVICE_WIN32_OWN_PROCESS = $00000010; + SERVICE_WIN32_SHARE_PROCESS = $00000020; + SERVICE_WIN32 = (SERVICE_WIN32_OWN_PROCESS or + SERVICE_WIN32_SHARE_PROCESS); + + // Service State -- for Enum Requests (Bit Mask) + SERVICE_ACTIVE = $00000001; + SERVICE_INACTIVE = $00000002; + SERVICE_STATE_ALL = (SERVICE_ACTIVE or + SERVICE_INACTIVE); + + // Controls + SERVICE_CONTROL_STOP = $00000001; + +type + // Service Status Enumeration Structure +{$IFDEF CLR} + [StructLayout(LayoutKind.Sequential)] +{$ENDIF} + _SERVICE_STATUS = record + dwServiceType: DWORD; + dwCurrentState: DWORD; + dwControlsAccepted: DWORD; + dwWin32ExitCode: DWORD; + dwServiceSpecificExitCode: DWORD; + dwCheckPoint: DWORD; + dwWaitHint: DWORD; + end; + TServiceStatus = _SERVICE_STATUS; + +{$IFDEF CLR} + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + _ENUM_SERVICE_STATUS = record + [MarshalAs(UnmanagedType.LPTStr)] + lpServiceName: string; + [MarshalAs(UnmanagedType.LPTStr)] + lpDisplayName: string; + ServiceStatus: TServiceStatus; + end; + TEnumServiceStatus = _ENUM_SERVICE_STATUS; +{$ELSE} + _ENUM_SERVICE_STATUSA = record + lpServiceName: PAnsiChar; + lpDisplayName: PAnsiChar; + ServiceStatus: TServiceStatus; + end; + TEnumServiceStatus = _ENUM_SERVICE_STATUSA; +{$ENDIF} + + TOpenSCManager = function (lpMachineName: {$IFDEF CLR}string{$ELSE}PChar{$ENDIF}; lpDatabaseName: {$IFDEF CLR}IntPtr{$ELSE}PChar{$ENDIF}; dwDesiredAccess: DWORD): SC_HANDLE;{$IFNDEF CLR} stdcall;{$ENDIF} + TCloseServiceHandle = function (hSCObject: SC_HANDLE): BOOL;{$IFNDEF CLR} stdcall;{$ENDIF} + TOpenService = function (hSCManager: SC_HANDLE; lpServiceName: PChar; dwDesiredAccess: DWORD): SC_HANDLE;{$IFNDEF CLR} stdcall;{$ENDIF} + TEnumServicesStatus = function (hSCManager: SC_HANDLE; dwServiceType, dwServiceState: DWORD;{$IFDEF CLR}lpServices: IntPtr{$ELSE}var lpServices: TEnumServiceStatus{$ENDIF}; + cbBufSize: DWORD; {$IFDEF CLR}out{$ELSE}var{$ENDIF} pcbBytesNeeded, lpServicesReturned: DWORD; var lpResumeHandle: DWORD): BOOL;{$IFNDEF CLR} stdcall;{$ENDIF} + TQueryServiceStatus = function (hService: SC_HANDLE; {$IFDEF CLR}out{$ELSE}var{$ENDIF} lpServiceStatus: TServiceStatus): BOOL;{$IFNDEF CLR} stdcall;{$ENDIF} + TStartService = function (hService: SC_HANDLE; dwNumServiceArgs: DWORD; {$IFNDEF CLR}var{$ENDIF} lpServiceArgVectors: {$IFDEF CLR}IntPtr{$ELSE}PChar{$ENDIF}): BOOL;{$IFNDEF CLR} stdcall;{$ENDIF} + TControlService = function (hService: SC_HANDLE; dwControl: DWORD; {$IFDEF CLR}out{$ELSE}var{$ENDIF} lpServiceStatus: TServiceStatus): BOOL;{$IFNDEF CLR} stdcall;{$ENDIF} + TNetServerEnum = function (ServerName: IntPtr; Level: longint; var BufPtr: IntPtr; PrefMaxLen: longint; + var EntriesRead, TotalEntries: longint; ServType: longint; Domain: {$IFDEF CLR}IntPtr{$ELSE}PWideChar{$ENDIF}; var ResumeHandle: integer): longint;{$IFNDEF CLR} stdcall;{$ENDIF} + TNetApiBufferFree = function (BufPtr: IntPtr): longint;{$IFNDEF CLR} stdcall;{$ENDIF} + +{$IFDEF CLR} +[SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'OpenSCManager')] +function FnOpenSCManager(lpMachineName: string; lpDatabaseName: IntPtr; dwDesiredAccess: DWORD): SC_HANDLE; external; + +[SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'CloseServiceHandle')] +function FnCloseServiceHandle(hSCObject: SC_HANDLE): BOOL; external; + +[SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'OpenService')] +function FnOpenService(hSCManager: SC_HANDLE; lpServiceName: string; dwDesiredAccess: DWORD): SC_HANDLE; external; + +[SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'EnumServicesStatus')] +function FnEnumServicesStatus(hSCManager: SC_HANDLE; dwServiceType, + dwServiceState: DWORD; lpServices: IntPtr; cbBufSize: DWORD; + out pcbBytesNeeded, lpServicesReturned: DWORD; var lpResumeHandle: DWORD): BOOL; external; + +[SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'QueryServiceStatus')] +function FnQueryServiceStatus(hService: SC_HANDLE; out lpServiceStatus: TServiceStatus): BOOL; external; + +[SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'StartService')] +function FnStartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD; lpServiceArgVectors: IntPtr): BOOL; external; + +[SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'StartServiceA')] +function StartServiceA(hService: SC_HANDLE; dwNumServiceArgs: DWORD; lpServiceArgVectors: IntPtr): BOOL; external; + +[SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'ControlService')] +function FnControlService(hService: SC_HANDLE; dwControl: DWORD; out lpServiceStatus: TServiceStatus): BOOL; external; + +[SuppressUnmanagedCodeSecurity, DllImport(netapi32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'NetServerEnum')] +function FnNetServerEnum(ServerName: IntPtr; Level: longint; var BufPtr: IntPtr; PrefMaxLen: longint; + var EntriesRead, TotalEntries: longint; ServType: longint; Domain: IntPtr; var ResumeHandle: integer): longint; external; + +[SuppressUnmanagedCodeSecurity, DllImport(netapi32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'NetApiBufferFree')] +function FnNetApiBufferFree(BufPtr: IntPtr): longint; external; +{$ENDIF} + +var + hAdvapi32Lib: HMODULE; + hNetapi32Lib: HMODULE; + OpenSCManager: TOpenSCManager; + CloseServiceHandle: TCloseServiceHandle; + OpenService: TOpenService; + EnumServicesStatus: TEnumServicesStatus; + QueryServiceStatus: TQueryServiceStatus; + StartService: TStartService; + ControlService: TControlService; + NetServerEnum: TNetServerEnum; + NetApiBufferFree: TNetApiBufferFree; + +function NotLink: integer; +begin + raise Exception.Create('function is not linked'); + Result := 0; +end; + +procedure LoadNetManagerLib; +{$IFNDEF CLR} + function GetProc(hLib: HMODULE; Name: string): FARPROC; + begin + Result := GetProcAddress(hLib, PChar(Name)); + if Result = nil then + Result := @NotLink; + end; +{$ENDIF} +begin + hAdvapi32Lib := LoadLibrary(PChar(advapi32)); + + if hAdvapi32Lib > 0 then begin + {$IFDEF CLR} + OpenSCManager := FnOpenSCManager; + CloseServiceHandle := FnCloseServiceHandle; + OpenService := FnOpenService; + EnumServicesStatus := FnEnumServicesStatus; + QueryServiceStatus := FnQueryServiceStatus; + StartService := FnStartService; + ControlService := FnControlService; + {$ELSE} + OpenSCManager := GetProc(hAdvapi32Lib, 'OpenSCManagerA'); + CloseServiceHandle := GetProc(hAdvapi32Lib, 'CloseServiceHandle'); + OpenService := GetProc(hAdvapi32Lib, 'OpenServiceA'); + EnumServicesStatus := GetProc(hAdvapi32Lib, 'EnumServicesStatusA'); + QueryServiceStatus := GetProc(hAdvapi32Lib, 'QueryServiceStatus'); + StartService := GetProc(hAdvapi32Lib, 'StartServiceA'); + ControlService := GetProc(hAdvapi32Lib, 'ControlService'); + {$ENDIF} + end; + + hNetapi32Lib := LoadLibrary(PChar(netapi32)); + + if hNetapi32Lib > 0 then begin + {$IFDEF CLR} + if GetProcAddress(hNetapi32Lib, 'NetServerEnum') <> nil then + NetServerEnum := FnNetServerEnum; + if GetProcAddress(hNetapi32Lib, 'NetApiBufferFree') <> nil then + NetApiBufferFree := FnNetApiBufferFree; + {$ELSE} + NetServerEnum := GetProc(hNetapi32Lib, 'NetServerEnum'); + NetApiBufferFree := GetProc(hNetapi32Lib, 'NetApiBufferFree'); + {$ENDIF} + end; +end; + +procedure FreeNetManagerLib; +begin + if hAdvapi32Lib > 0 then begin + FreeLibrary(hAdvapi32Lib); + hAdvapi32Lib := 0; + end; + + if hNetapi32Lib > 0 then begin + FreeLibrary(hNetapi32Lib); + hNetapi32Lib := 0; + end; +end; + +{ TCRServiceNamesThread } + +constructor TCRServiceNamesThread.Create(const Server: string; Services: TCRServicesThread; const Keywords: string); +begin + inherited Create(True); + FServer := Server; + FKeywords := Keywords; + FServices := Services; + Priority := tpHighest; + Resume; +end; + +procedure TCRServiceNamesThread.Execute; +{var + tc: cardinal;} +var + j, k: integer; + sl: TStringList; + b: boolean; +begin + // tc := GetTickCount; + try + FServiceNames := TCRNetManager.GetServiceNames(FServer); + + sl := TStringList.Create; + try + sl.Text := FKeywords; + + b := False; + for j := 0 to Length(FServiceNames) - 1 do begin + for k := 0 to sl.Count - 1 do + if (Pos(sl[k], LowerCase(FServiceNames[j].ServiceName)) > 0) or + (Pos(sl[k], LowerCase(FServiceNames[j].DisplayName)) > 0) then begin + b := True; + CRNetManager.AddToCachedServerList(FKeywords, FServer); + Break; + end; + if b then + Break; + end; + finally + sl.Free; + end; + except + // Silent + end; + {tc := GetTickCount - tc; + OFS(FServer + ' ' + IntToStr(tc) + ' ' + IntToStr(Length(FServices.FServiceNames[FIndex])));} +end; + +constructor TCRServicesThread.Create(List: TStrings; const Keywords: string); +begin + inherited Create(True); + + FList := List; + FKeywords := Keywords; + FreeOnTerminate := True; + + Resume; +end; + +procedure TCRServicesThread.Execute; +var + i: integer; + Threads: array of TCRServiceNamesThread; +begin + SetLength(Threads, FList.Count); + for i := 0 to FList.Count - 1 do + Threads[i] := nil; + try + for i := 0 to FList.Count - 1 do + Threads[i] := TCRServiceNamesThread.Create(FList[i], Self, FKeywords); + + for i := 0 to FList.Count - 1 do + Threads[i].WaitFor; + + finally + for i := 0 to FList.Count - 1 do + Threads[i].Free; + end; +end; + +{ TCRNetManager } + +function ServiceStatusToCurrentStatus(const CurrentState: DWORD): TCRServiceStatus; +begin + case CurrentState of + SERVICE_STOPPED: + Result := ssStopped; + SERVICE_START_PENDING: + Result := ssStartPending; + SERVICE_STOP_PENDING: + Result := ssStopPending; + SERVICE_RUNNING: + Result := ssRunning; + SERVICE_CONTINUE_PENDING: + Result := ssContinuePending; + SERVICE_PAUSE_PENDING: + Result := ssPausePending; + SERVICE_PAUSED: + Result := ssPaused; + else + begin + DatabaseErrorFmt('Unknown service status $%X (%d)', [CurrentState, CurrentState]); + Result := ssStopped; + end; + end; +end; + +constructor TCRNetManager.Create; +begin + inherited; + + FServicesCS := TCriticalSection.Create; +end; + +destructor TCRNetManager.Destroy; +begin + ClearCachedServerList; + FServicesCS.Free; + + inherited; +end; + +class procedure TCRNetManager.ServiceManagerOpen(const Server: string; const ReadOnly: boolean; out sch: SC_HANDLE); +var + s: string; + dwDesiredAccess: DWORD; +begin + sch := 0; + if Trim(LowerCase(Server)) = 'localhost' then + s := '' + else + s := Server; + if ReadOnly then + dwDesiredAccess := GENERIC_READ + else + dwDesiredAccess := SC_MANAGER_ALL_ACCESS; + sch := OpenSCManager({$IFDEF CLR}s{$ELSE}PChar(s){$ENDIF}, nil, dwDesiredAccess); + Win32Check(sch <> 0); +end; + +class procedure TCRNetManager.ServiceManagerClose(const sch: SC_HANDLE); +begin + if sch <> 0 then + CloseServiceHandle(sch); +end; + +class procedure TCRNetManager.ServiceOpen(const Server: string; const ServiceName: string; const ReadOnly: boolean; out sch: SC_HANDLE; out sh: SC_HANDLE); +begin + ServiceManagerOpen(Server, ReadOnly, sch); + try + sh := OpenService(sch, {$IFDEF CLR}ServiceName{$ELSE}PChar(ServiceName){$ENDIF}, SERVICE_ALL_ACCESS); + Win32Check(sh <> 0); + except + ServiceManagerClose(sch); + raise; + end; +end; + +class procedure TCRNetManager.ServiceClose(const sch: SC_HANDLE; const sh: SC_HANDLE); +begin + if sh <> 0 then + CloseServiceHandle(sh); + ServiceManagerClose(sch); +end; + +class function TCRNetManager.GetServiceNames(const Server: string): TCRServicesInfo; +var + sch: SC_HANDLE; +{$IFDEF CLR} + pService: TEnumServiceStatus; +{$ELSE} + pService: ^TEnumServiceStatus; +{$ENDIF} + pServices: IntPtr; + pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD; + i: integer; + SizeOfTEnumServiceStatus: LongWord; + +begin + SetLength(Result, 0); + + pServices := nil; + ServiceManagerOpen(Server, True, sch); + try + //lpServices := nil; + lpResumeHandle := 0; + pcbBytesNeeded := 0; + lpServicesReturned := 0; + EnumServicesStatus(sch, SERVICE_WIN32, SERVICE_STATE_ALL, {$IFDEF CLR}nil{$ELSE}TEnumServiceStatus(pServices^){$ENDIF}, 0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle); + SizeOfTEnumServiceStatus := SizeOf(TEnumServiceStatus); + lpServicesReturned := 0; + pServices := Marshal.AllocHGlobal(pcbBytesNeeded); + Win32Check(EnumServicesStatus(sch, SERVICE_WIN32, SERVICE_STATE_ALL, {$IFDEF CLR}pServices{$ELSE}TEnumServiceStatus(pServices^){$ENDIF}, pcbBytesNeeded, pcbBytesNeeded, lpServicesReturned, lpResumeHandle)); +// Win32Check(EnumServicesStatus(sch, SERVICE_WIN32, SERVICE_STATE_ALL, Services{$IFNDEF CLR}[0]{$ENDIF}, cbBufSize, pcbBytesNeeded, lpServicesReturned, lpResumeHandle)); + SetLength(Result, lpServicesReturned); + + for i := 0 to lpServicesReturned - 1 do begin + {$IFDEF CLR} + pService := TEnumServiceStatus(Marshal.PtrToStructure(IntPtr(Integer(pServices) + Integer(SizeOfTEnumServiceStatus) * i), TypeOf(TEnumServiceStatus))); + {$ELSE} + pService := IntPtr(Integer(pServices) + Integer(SizeOfTEnumServiceStatus) * i); + {$ENDIF} + + Result[i].ServiceName := pService.lpServiceName; + Result[i].DisplayName := pService.lpDisplayName; + Result[i].Status := ServiceStatusToCurrentStatus(pService.ServiceStatus.dwCurrentState); + end; + finally + ServiceManagerClose(sch); + Marshal.FreeHGlobal(pServices); + end; +end; + +class function TCRNetManager.GetServiceStatus(const Server: string; const ServiceName: string): TCRServiceStatus; +var + sch: SC_HANDLE; + sh: SC_HANDLE; + ss: TServiceStatus; +begin + ServiceOpen(Server, ServiceName, True, sch, sh); + try + Win32Check(QueryServiceStatus(sh, ss)); + Result := ServiceStatusToCurrentStatus(ss.dwCurrentState); + finally + ServiceClose(sch, sh); + end; +end; + +class procedure TCRNetManager.ServiceStart(const Server: string; const ServiceName: string; ParamStr: string = ''); + // based on Delphi7 system.pas GetParamStr function + function GetParamStr(Idx: integer; var Param: string): integer; + var + Len: Integer; + StartIdx, SIdx, QIdx: Integer; + begin + while True do + begin + while (ParamStr[Idx] <> #0) and (ParamStr[Idx] <= ' ') do + Inc(Idx); + if (ParamStr[Idx] = '"') and (ParamStr[Idx + 1] = '"') then Inc(Idx, 2) else Break; + end; + Len := 0; + StartIdx := Idx; + while ParamStr[Idx] > ' ' do + begin + if ParamStr[Idx] = '"' then + begin + Inc(Idx); + while (ParamStr[Idx] <> #0) and (ParamStr[Idx] <> '"') do + begin + QIdx := Idx + 1; + Inc(Len, QIdx - Idx); + Idx := QIdx; + end; + if ParamStr[Idx] <> #0 then + Inc(Idx); + end + else + begin + QIdx := Idx + 1; + Inc(Len, QIdx - Idx); + Idx := QIdx; + end; + end; + + SetLength(Param, Len); + + Idx := StartIdx; + SIdx := 1; + while ParamStr[Idx] > ' ' do + begin + if ParamStr[Idx] = '"' then + begin + Inc(Idx); + while (ParamStr[Idx] <> #0) and (ParamStr[Idx] <> '"') do + begin + QIdx := Idx + 1; + while Idx < QIdx do + begin + Param[SIdx] := ParamStr[Idx]; + Inc(Idx); + Inc(SIdx); + end; + end; + if ParamStr[Idx] <> #0 then + Inc(Idx); + end + else + begin + QIdx := Idx + 1; + while Idx < QIdx do + begin + Param[SIdx] := ParamStr[Idx]; + Inc(Idx); + Inc(SIdx); + end; + end; + end; + + Result := Idx; + end; +var + sch: SC_HANDLE; + sh: SC_HANDLE; + i, Idx: integer; + Param: string; + Args: array of string; + pArgs: array of {$IFDEF CLR}IntPtr{$ELSE}PChar{$ENDIF}; + p: {$IFDEF CLR}IntPtr{$ELSE}PChar{$ENDIF}; +{$IFDEF CLR} + b: TBytes; + p1: IntPtr; + Len: integer; +{$ENDIF} + +begin + ServiceOpen(Server, ServiceName, False, sch, sh); + try + ParamStr := Trim(ParamStr); + if ParamStr <> '' then begin + Idx := 1; + SetLength(Args, 0); + + ParamStr := ParamStr + #0; + while True do + begin + Idx := GetParamStr(Idx, Param); + if Param = '' then Break; + + i := Length(Args); + SetLength(Args, i + 1); + Args[i] := Param; + end; + + SetLength(pArgs, Length(Args)); + {$IFDEF CLR} + for i := 0 to Length(Args) - 1 do + pArgs[i] := nil; + p := Marshal.AllocHGlobal(Length(Args) * SizeOf(IntPtr)); + try + for i := 0 to Length(Args) - 1 do begin + Len := Length(Args[i]); + SetLength(b, Len + 1); + Encoding.Default.GetBytes(Args[i], 0, Len, b, 0); + b[Len] := 0; + p1 := Marshal.AllocHGlobal(Len + 1); + Marshal.Copy(b, 0, p1, Len + 1); + pArgs[i] := p1; + Marshal.WriteIntPtr(p, i * SizeOf(IntPtr), p1); + end; + + i := Length(Args); + Win32Check(StartServiceA(sh, i, p)); + finally + for i := 0 to Length(Args) - 1 do + Marshal.FreeHGlobal(pArgs[i]); + Marshal.FreeHGlobal(p); + end; + {$ELSE} + for i := 0 to Length(Args) - 1 do + pArgs[i] := @Args[i][1]; + + i := Length(Args); + Win32Check(StartService(sh, i, pArgs[0])); + {$ENDIF} + end + else + begin + p := nil; + Win32Check(StartService(sh, 0, p)); + end; + finally + ServiceClose(sch, sh); + end; +end; + +class procedure TCRNetManager.ServiceStop(const Server: string; const ServiceName: string); +var + sch: SC_HANDLE; + sh: SC_HANDLE; + ss: TServiceStatus; +begin + ServiceOpen(Server, ServiceName, False, sch, sh); + try + Win32Check(ControlService(sh, SERVICE_CONTROL_STOP, ss)); + finally + ServiceClose(sch, sh); + end; +end; + +procedure TCRNetManager.ClearCachedServerList; +var + i: integer; +begin + if FCachedServerList = nil then + Exit; + + try + for i := 0 to FCachedServerList.Count - 1 do + FCachedServerList.Objects[i].Free; + finally + FreeAndNil(FCachedServerList); + end; +end; + +procedure TCRNetManager.AddToCachedServerList(const Keywords: string; const Server: string); +var +// s: string; + i: integer; + sl: TStringList; +begin +{ s := ''; + for i := Low(Keywords) to High(Keywords) do begin + if s <> '' then + s := s + #$D#$A; + s := s + Keywords[i]; + end;} + + FServicesCS.Acquire; + try + if FCachedServerList = nil then begin + FCachedServerList := TStringList.Create; + {$IFDEF VER6P} + FCachedServerList.CaseSensitive := False; + {$ENDIF} + FCachedServerList.Sorted := True; + end; + i := FCachedServerList.IndexOf(Keywords); + if i = - 1 then begin + sl := TStringList.Create; + {$IFDEF VER6P} + sl.CaseSensitive := False; + {$ENDIF} + sl.Sorted := True; + FCachedServerList.AddObject(Keywords, sl); + end + else + sl := FCachedServerList.Objects[i] as TStringList; + if sl.IndexOf(Server) = -1 then + sl.Add(Server); + finally + FServicesCS.Release; + end; +end; + +class procedure TCRNetManager.GetServerList(List: TStrings); +var + pData, psvr_Name: IntPtr; + EntRead, EntTotal, Resume, i : integer; + s: string; + Info : integer; +begin + List.Clear; + pData := nil; + try + Resume := 0; + Info := NetServerEnum(nil, 100, pData, -1{MAX_PREFERRED_LENGTH}, EntRead, EntTotal, 1{SV_TYPE_WORKSTATION - All LAN Manager workstations}, nil, Resume); + if Info <> 0 then + raise Exception.Create('NetServerEnum error ' + IntToStr(Info)); + + Assert(pData <> nil); + for i := 0 to EntRead - 1 do begin + psvr_Name := Marshal.ReadIntPtr(pData, i * 8 {sizeof(SERVER_INFO_100 )} + 4); + s := Marshal.PtrToStringUni(psvr_Name); + List.Add(s); + end; + finally + if pData <> nil then + NetApiBufferFree(pData); + end; +end; + +procedure TCRNetManager.GetServerList(List: TStrings; const Keywords: string; const Timeout: Longword = 1; const CacheTimeout: Longword = 120); +var + mList, sl: TStringList; + i: integer; + tc: LongWord; + Threads: TCRServicesThread; +{$IFDEF CLR} + ReturnValue: LongWord; +{$ENDIF} +begin + List.Clear; + if Timeout = 0 then + Exit; + + StartWait; + mList := nil; + try + mList := TStringList.Create; + {$IFDEF VER6P} + mList.CaseSensitive := False; + {$ENDIF} + mList.Sorted := True; + + tc := LongWord(Int64(FLastTickCount) + CacheTimeout * 1000); + if (tc < GetTickCount) or (GetTickCount < FLastTickCount) then begin + GetServerList(mList); + mList.Add('localhost'); + Threads := TCRServicesThread.Create(mList, Keywords); + {$IFDEF CLR} + Threads.WaitFor(Timeout * 1000, ReturnValue); + {$ELSE} + WaitForSingleObject(Threads.Handle, Timeout * 1000); + {$ENDIF} + FLastTickCount := GetTickCount; + end; + + if FCachedServerList <> nil then begin + mList.Clear; + FServicesCS.Acquire; + try + i := FCachedServerList.IndexOf(Keywords); + if i <> -1 then begin + sl := FCachedServerList.Objects[i] as TStringList; + for i := 0 to sl.Count - 1 do begin + if mList.IndexOf(sl[i]) = -1 then + mList.Add(sl[i]); + end; + end; + finally + FServicesCS.Release; + end; + end; + + List.Assign(mList); + finally + StopWait; + mList.Free; + end; +end; +{$ENDIF} + +{ TDADataSetUtils } + +procedure TDADataSetUtils.QuickOpen(DataSet: TCustomDADataSet; Refresh: boolean = False); +begin + Inc(FCount); + if FCount > 1 then begin + Assert(FDataSet = DataSet); + Exit; + end; + + Assert(FDataSet = nil, 'TDADataSetUtils.QuickOpen - twice call'); + FDataSet := DataSet; + + FOldActive := DataSet.Active; + FOldDebug := DataSet.Debug; + FOldFetchAll := DataSet.FetchAll; + FOldFetchRows := DataSet.FetchRows; + + if not DataSet.Active or Refresh then begin + DataSet.Debug := False; + DataSet.FetchAll := False; + DataSet.Close; + DataSet.FetchRows := 1; + DataSet.Execute; + end; +end; + +procedure TDADataSetUtils.Restore(RestoreActive: boolean = True); +begin + Assert(FDataSet <> nil, 'TDADataSetUtils.Restore without QuickOpen'); + Dec(FCount); + if FCount > 0 then + Exit; + + FDataSet.Debug := FOldDebug; + FDataSet.FetchAll := FOldFetchAll; + if RestoreActive then begin + if FDataSet.FetchRows <> FOldFetchRows then begin + FDataSet.Active := False; + FDataSet.FetchRows := FOldFetchRows; + end; + FDataSet.Active := FOldActive; + end; + + FDataSet := nil; +end; + +procedure TDADataSetUtils.QuickOpenAndRestore(DataSet: TCustomDADataSet; Refresh: boolean = False); +begin + try + QuickOpen(DataSet, Refresh); + finally + Restore; + end; +end; + +{ TDBAccessUtils } + +class function TDBAccessUtils.IsKeyViolation(Obj: TCustomDAConnection; E: EDAError): boolean; +begin + Result := Obj.IsKeyViolation(E); +end; + +class function TDBAccessUtils.IsObjectDataType(Obj: TDAParam; DataType: TFieldType): boolean; +begin + Result := Obj.IsObjectDataType(DataType); +end; + +class procedure TDBAccessUtils.CheckConnection(Obj: TCustomDADataSet); +begin + Obj.CheckConnection; +end; + +class procedure TDBAccessUtils.CheckConnection(Obj: TCustomDASQL); +begin + Obj.CheckConnection; +end; + +class function TDBAccessUtils.UsedConnection(Obj: TCustomDADataSet): TCustomDAConnection; +begin + Result := Obj.UsedConnection; +end; + +class function TDBAccessUtils.UsedConnection(Obj: TCustomDASQL): TCustomDAConnection; +begin + Result := Obj.UsedConnection; +end; + +class procedure TDBAccessUtils.SetAutoCommit(Obj: TComponent; Value: boolean); +begin + Assert(Obj <> nil); + if Obj is TCustomDASQL then + TCustomDASQL(Obj).AutoCommit := Value + else + if IsClass(Obj, TCustomDADataSet) then + TCustomDADataSet(Obj).AutoCommit := Value + else + Assert(False, Obj.ClassName); +end; + +class function TDBAccessUtils.GetAutoCommit(Obj: TComponent): boolean; +begin + Result := False; + Assert(Obj <> nil); + if Obj is TCustomDASQL then + Result := TCustomDASQL(Obj).AutoCommit + else + if Obj is TCustomDADataSet then + Result := TCustomDADataSet(Obj).AutoCommit + else + Assert(False, Obj.ClassName); +end; + +class procedure TDBAccessUtils.SetDesignCreate(Obj: TCustomDADataSet; Value: boolean); +begin + Obj.FDesignCreate := Value; +end; + +class function TDBAccessUtils.GetDesignCreate(Obj: TCustomDADataSet): boolean; +begin + Result := Obj.FDesignCreate; +end; + +class procedure TDBAccessUtils.SetDesignCreate(Obj: TCustomDASQL; Value: boolean); +begin + Obj.FDesignCreate := Value; +end; + +class function TDBAccessUtils.GetDesignCreate(Obj: TCustomDASQL): boolean; +begin + Result := Obj.FDesignCreate; +end; + +class procedure TDBAccessUtils.SetDesignCreate(Obj: TCustomDAUpdateSQL; Value: boolean); +begin + Obj.FDesignCreate := Value; +end; + +class function TDBAccessUtils.GetDesignCreate(Obj: TCustomDAUpdateSQL): boolean; +begin + Result := Obj.FDesignCreate; +end; + +class procedure TDBAccessUtils.SetDesignCreate(Obj: TCRDataSource; Value: boolean); +begin + Obj.FDesignCreate := Value; +end; + +class function TDBAccessUtils.GetDesignCreate(Obj: TCRDataSource): boolean; +begin + Result := Obj.FDesignCreate; +end; + +class function TDBAccessUtils.CreateIRecordSet(Obj: TCustomDAConnection): TCRRecordSet; +begin + Result := Obj.CreateIRecordSet; +end; + +class function TDBAccessUtils.GetIConnection(Obj: TCustomDAConnection): TCRConnection; +begin + Result := Obj.FIConnection; +end; + +class function TDBAccessUtils.GetUpdateQuery(Obj: TCustomDADataSet): TComponent; +begin + Result := Obj.FUpdateQuery; +end; + +class function TDBAccessUtils.GetTablesInfo(Obj: TCustomDADataSet): TCRTablesInfo; +begin + Result := Obj.TablesInfo; +end; + +class function TDBAccessUtils.GetUpdatingTable(Obj: TCustomDADataSet): string; +begin + Result := Obj.UpdatingTable; +end; + +class procedure TDBAccessUtils.SetUpdatingTable(Obj: TCustomDADataSet; Value: string); +begin + Obj.UpdatingTable := Value; +end; + +class function TDBAccessUtils.GetUpdatingTableIdx(Obj: TCustomDADataSet): integer; +begin + Result := Obj.FUpdatingTableInfoIdx; +end; + +class procedure TDBAccessUtils.SetUpdatingTableIdx(Obj: TCustomDADataSet; Value: integer); +begin + Obj.FUpdatingTableInfoIdx := Value; +end; + +class procedure TDBAccessUtils.InternalConnect(Obj: TCustomDAConnection); +begin + Assert(Obj <> nil); + Obj.InternalConnect; +end; + +class procedure TDBAccessUtils.InternalDisconnect(Obj: TCustomDAConnection); +begin + Assert(Obj <> nil); + Obj.InternalDisconnect; +end; + +class procedure TDBAccessUtils.SuppressAutoCommit(Obj: TCustomDAConnection); +begin + Obj.SuppressAutoCommit; +end; + +class procedure TDBAccessUtils.RestoreAutoCommit(Obj: TCustomDAConnection); +begin + Obj.RestoreAutoCommit; +end; + +class procedure TDBAccessUtils.Disconnect(Obj: TCustomDASQL); +begin + Obj.Disconnect; +end; + +class function TDBAccessUtils.SQLGenerator(Obj: TCustomDADataSet): TDASQLGenerator; +begin + Result := Obj.FSQLGenerator; +end; + +class procedure TDBAccessUtils.GetKeyAndDataFields( + Obj: TCustomDADataSet; + out KeyAndDataFields: TKeyAndDataFields; + const ForceUseAllKeyFields: boolean); +begin + Obj.GetKeyAndDataFields(KeyAndDataFields, ForceUseAllKeyFields); +end; + +class function TDBAccessUtils.GetLockDebug(Obj: TComponent): boolean; +begin + if Obj is TCustomDADataSet then + Result := TCustomDADataSet(Obj).FLockDebug + else + if Obj is TCustomDASQL then + Result := TCustomDASQL(Obj).FLockDebug + else + begin + Result := False; + Assert(False, 'Obj is ' + Obj.ClassName); + end; +end; + +class procedure TDBAccessUtils.SetLockDebug(Obj: TComponent; Value: boolean); +begin + if IsClass(Obj, TCustomDADataSet) then + TCustomDADataSet(Obj).FLockDebug := Value + else + if IsClass(Obj, TCustomDASQL) then + TCustomDASQL(Obj).FLockDebug := Value + else + Assert(False, 'Obj is ' + Obj.ClassName); +end; + +class function TDBAccessUtils.FOwner(Obj: TDAConnectionOptions): TCustomDAConnection; +begin + Result := Obj.FOwner; +end; + +class function TDBAccessUtils.FOwner(Obj: TDADataSetOptions): TCustomDADataSet; +begin + Result := Obj.FOwner; +end; + +class function TDBAccessUtils.SQLMonitorClass(Obj: TCustomDAConnection): TClass; +begin + Result := Obj.SQLMonitorClass; +end; + +class function TDBAccessUtils.QuoteName(Obj: TCustomDADataSet; const AName: string): string; +begin + Result := Obj.QuoteName(AName); +end; + +class function TDBAccessUtils.UnQuoteName(Obj: TCustomDADataSet; AName: string): string; +begin + Result := Obj.UnQuoteName(AName); +end; + +class function TDBAccessUtils.GetSQLs(Obj: TCustomDAConnection): TDAList; +begin + Result := Obj.FSQLs; +end; + +class procedure TDBAccessUtils.RegisterClient(Obj: TCustomDAConnection; Client: TObject; Event: TConnectChangeEvent = nil); +begin + Obj.RegisterClient(Client, Event); +end; + +class procedure TDBAccessUtils.UnRegisterClient(Obj: TCustomDAConnection; Client: TObject); +begin + Obj.UnRegisterClient(Client); +end; + +class function TDBAccessUtils.GetIdentityField(Obj: TCustomDADataSet): TField; +begin + Result := Obj.FIdentityField; +end; + +class function TDBAccessUtils.GetSQL(Obj: TComponent): TStrings; +begin + Result := nil; + Assert(Obj <> nil); + if IsClass(Obj, TCustomDASQL) then + Result := TCustomDASQL(Obj).SQL + else + if IsClass(Obj, TCustomDADataSet) then + Result := TCustomDADataSet(Obj).SQL + else + Assert(False, Obj.ClassName); +end; + +class procedure TDBAccessUtils.SetSQL(Obj: TComponent; Value: TStrings); +begin + Assert(Obj <> nil); + if Obj is TCustomDASQL then + TCustomDASQL(Obj).SQL := Value + else + if Obj is TCustomDADataSet then + TCustomDADataSet(Obj).SQL := Value + else + Assert(False, Obj.ClassName); +end; + +class procedure TDBAccessUtils.SetSQLText(Obj: TComponent; const SQLText: string; const LockAssembleSQL, LockMacros: boolean; const DisableScanParams: boolean = True); +begin + Assert(Obj <> nil); + if IsClass(Obj, TCustomDASQL) then + try + TCustomDASQL(Obj).FLockMacros := LockMacros; + TCustomDASQL(Obj).FLockAssembleSQL := LockAssembleSQL; + TCustomDASQL(Obj).FICommand.SetProp(prDisableParamScan, Variant(True)); + TCustomDASQL(Obj).SQL.Text := SQLText; + finally + TCustomDASQL(Obj).FLockMacros := False; + TCustomDASQL(Obj).FLockAssembleSQL := False; + TCustomDASQL(Obj).FICommand.SetProp(prDisableParamScan, Variant(False)); + end + else + if IsClass(Obj, TCustomDADataSet) then + try + TCustomDADataSet(Obj).FCommand.FLockMacros := LockMacros; + TCustomDADataSet(Obj).FCommand.FLockAssembleSQL := LockAssembleSQL; + TCustomDADataSet(Obj).FCommand.FICommand.SetProp(prDisableParamScan, Variant(DisableScanParams)); + TCustomDADataSet(Obj).SQL.Text := SQLText; + finally + TCustomDADataSet(Obj).FCommand.FLockMacros := False; + TCustomDADataSet(Obj).FCommand.FLockAssembleSQL := False; + TCustomDADataSet(Obj).FCommand.FICommand.SetProp(prDisableParamScan, Variant(False)); + end + else + Assert(False, Obj.ClassName); +end; + +class function TDBAccessUtils.GetParams(Obj: TComponent): TDAParams; +begin + Result := nil; + Assert(Obj <> nil); + if IsClass(Obj, TCustomDASQL) then + Result := TCustomDASQL(Obj).Params + else + if IsClass(Obj, TCustomDADataSet) then + Result := TCustomDADataSet(Obj).Params + else + Assert(False, Obj.ClassName); +end; + +class procedure TDBAccessUtils.Execute(Obj: TComponent); +begin + Assert(Obj <> nil); + if IsClass(Obj, TCustomDASQL) then + TCustomDASQL(Obj).Execute + else + if IsClass(Obj, TCustomDADataSet) then + TCustomDADataSet(Obj).Execute + else + Assert(False, Obj.ClassName); +end; + +class procedure TDBAccessUtils.Open(Obj: TComponent); +begin + Assert(Obj <> nil); + Assert(Obj is TCustomDADataSet); + TCustomDADataSet(Obj).Open; +end; + +class function TDBAccessUtils.GetRowsAffected(Obj: TComponent): integer; +begin + Result := 0; + Assert(Obj <> nil); + if IsClass(Obj, TCustomDASQL) then + Result := TCustomDASQL(Obj).RowsAffected + else + if IsClass(Obj, TCustomDADataSet) then + Result := TCustomDADataSet(Obj).RowsAffected + else + Assert(False, Obj.ClassName); +end; + +class function TDBAccessUtils.GetUpdateSQLStatementTypes(Obj: TCustomDADataSet): TStatementTypes; +begin + Result := Obj.GetUpdateSQLStatementTypes; +end; + +class function TDBAccessUtils.GetUpdateSQLIndex(Obj: TCustomDADataSet; StatementType: TStatementType): TStrings; +begin + Result := nil; + if Assigned(Obj.UpdateObject) then + if Obj.UpdateObject.GetObjectIndex(Ord(StatementType)) = nil then + Result := Obj.UpdateObject.GetSQLIndex(Ord(StatementType)) + else + Exit; + if Result = nil then + Result := Obj.GetUpdateSQLIndex(Ord(StatementType)); +end; + +class function TDBAccessUtils.ParseSQL(Obj: TCustomDASQL; const SQL: string; Params: TDAParams; RenamePrefix: string = ''): string; +begin + Result := Obj.ParseSQL(SQL, Params, RenamePrefix); +end; + +class function TDBAccessUtils.CreateParamsObject(Obj: TCustomDASQL): TDAParams; +begin + Result := Obj.CreateParamsObject; +end; + +class procedure TDBAccessUtils.SetDesigning(Obj: TComponent; Value: Boolean; SetChildren: Boolean = True); +begin + if Obj is TCustomDADataSet then + TCustomDADataSet(Obj).SetDesigning(Value, SetChildren) + else + if Obj is TCustomDASQL then + TCustomDASQL(Obj).SetDesigning(Value, SetChildren) + else + Assert(False, Obj.ClassName); +end; + +class function TDBAccessUtils.GetIRecordSet(Obj: TCustomDADataSet): TCRRecordSet; +begin + Result := Obj.FIRecordSet; +end; + +class function TDBAccessUtils.GetDataSetClass(Obj: TCustomDAUpdateSQL): TCustomDADataSetClass; +begin + Result := Obj.DataSetClass; +end; + +class function TDBAccessUtils.GetSQLClass(Obj: TCustomDAUpdateSQL): TCustomDASQLClass; +begin + Result := Obj.SQLClass; +end; + +class function TDBAccessUtils.GetParserClass(Obj: TMacros): TParserClass; +begin + Result := Obj.FParserClass; +end; + +{ TCRDataSource } + +constructor TCRDataSource.Create(Owner: TComponent); +begin + inherited Create(Owner); + + FDesignCreate := csDesigning in ComponentState; +end; + +procedure TCRDataSource.Loaded; +begin + inherited; + + FDesignCreate := False; +end; + +procedure TCRDataSource.AssignTo(Dest: TPersistent); +begin + if Dest is TDataSource then begin + TDataSource(Dest).DataSet := DataSet; + TDataSource(Dest).AutoEdit := AutoEdit; + TDataSource(Dest).Enabled := Enabled; + end else + inherited; +end; + +initialization + ChangeCursor := True; + MacroChar := '&'; + SetCursorProc := nil; + ShowConnectFormProc := nil; + BaseSQLOldBehavior := False; + SQLGeneratorCompatibility := False; +{$IFDEF MSWINDOWS} +{$IFNDEF CLR} + OpenSCManager := @NotLink; + CloseServiceHandle := @NotLink; + OpenService := @NotLink; + EnumServicesStatus := @NotLink; + QueryServiceStatus := @NotLink; + StartService := @NotLink; + ControlService := @NotLink; + NetServerEnum := @NotLink; + NetApiBufferFree := @NotLink; +{$ENDIF} + LoadNetManagerLib; + CRNetManager := TCRNetManager.Create; +{$ENDIF} + +finalization +{$IFDEF MSWINDOWS} + CRNetManager.Free; + FreeNetManagerLib; +{$ENDIF} + +end. diff --git a/internal/4.10.0.10/1/Source/DBAccess.res b/internal/4.10.0.10/1/Source/DBAccess.res new file mode 100644 index 0000000000000000000000000000000000000000..c4d628d4dcdaa3f6502c31b77552098309d8841f GIT binary patch literal 2332 zcmb7_-I5bk5XT!iCL4Cw%qmjgg$_4zBUXxn5|O1~an&l&-4fRe??N`aMB)riCVUkS zz+><*T=NoM_!!IY-zPJf-K4BCQ+?8NPM_|7e~y`13LPCqf<5+o$6E>=9krlSe%4Da z1ZP;z*u`)wTnksj^{~nRCjZyMX*(ZohMmx|FG4TeM&i40pSO#g-40iL?Hs##J#4we z=ltJvJ-x7M8{GZ|O6@A^CeOXF9RgZ!p=T?sz)AZSbi=K5W;<7q{}xoT*9FZTm-*50 z-8iAI@{+_oIdgxk)7SJa>rE4zWOK1Q|dY6;jp4tdI!m(Q4 zPeG8|ls#!a>EpV))JxVDe5`yuYdhSIm`m3)#7kL`=AnBy!a`u-S=r!O|DCY63 zyV6VAwU1GM2mKFu3T_YV5o<;!W8B3n@)> zy>$GI=gOx%Sp2InZLY{e*jmg9m{?OKljw~wnFC9k){#c3k{3M%I zVrd)p6L=>`Uba6t8`b_FxL@+4b*hQ&vl+Iej^S#f2UO*;28L8#tOC`?9u|a2YuEch zRXPTjGI+^jw$DvvaDy5siJ{&OU83r-uWPhbU2LOcgm04VyXWe(SeGN$t=<{Y7dx); z0Db`FOsshhWABXF?br{FB|}EpRYk1(Uc@f6O})*OJm)2aVh+V=W_()5$v0S5?N_w^ z2`TOcxCgxTL9~bN7woB~o>7M*xDWAJK1Iws_5^N%okz&%et*^@Ew2Q1$P{hO-&WYGTFd zEsJfR;8XCa0&}d~^*Ytu>pDJptZGZ^yU&q)!JgS0D1{=9%W$fJIgbD5rz&v5*J9Ua zhbF!%^km)URFvkIszm*z=^iuCrE)cO=CvC;Lp>qQi$7IP3Pt=Mxj^%quxMRz%~)lN05AFx{>AHPCwV(D@`rMO|I>Z!-?btot?1^i@)H NBA%+2mI9b nil then begin + {$IFDEF CLR} + DBMonitor.GetVersion(Result); + {$ELSE} + CoInitialize(nil); + try + DBMonitor.GetVersion(pVersion); + finally + CoUninitialize; + end; + Result := pVersion; + {$ENDIF} + end + except + end; +end; + +{$ENDIF} + +end. diff --git a/internal/4.10.0.10/1/Source/DBMonitorIntf.pas b/internal/4.10.0.10/1/Source/DBMonitorIntf.pas new file mode 100644 index 0000000..ae0e698 --- /dev/null +++ b/internal/4.10.0.10/1/Source/DBMonitorIntf.pas @@ -0,0 +1,117 @@ + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DBMonitorIntf; +{$ENDIF} +interface + +{$IFDEF CLR} +uses + Windows, System.Runtime.InteropServices; +{$ENDIF} + +{$IFNDEF CLR} +const +// IID_IDBMonitor must be changed if any interface changes are performed + IID_IDBMonitor: TGUID = '{89F49E64-F6E0-11D6-9038-00C02631BDC7}'; +{$ENDIF} + +const + Class_DBMonitor: TGUID = '{89F49E65-F6E0-11D6-9038-00C02631BDC7}'; + +type + TEventType = (etAppStarted, etAppFinished, etConnect, etDisconnect, etCommit, + etRollback, etPrepare, etUnprepare, etExecute, etBlob, etError, etMisc); + + TTracePoint = (tpBeforeEvent, tpAfterEvent); + +{$IFDEF CLR} + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + TSQLParam = record + [MarshalAs(UnmanagedType.LPStr)] + Name: string; + [MarshalAs(UnmanagedType.LPStr)] + DataType: string; + [MarshalAs(UnmanagedType.LPStr)] + ParamType: string; + [MarshalAs(UnmanagedType.LPStr)] + Value: string; + end; + TSQLParams = array of TSQLParam; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + TMonitorMessage = record + MessageID: cardinal; + EventType: integer; + TracePoint: integer; + ObjectID: cardinal; + OwnerID: cardinal; + [MarshalAs(UnmanagedType.LPStr)] + ObjectName: string; + [MarshalAs(UnmanagedType.LPStr)] + OwnerName: string; + [MarshalAs(UnmanagedType.LPStr)] + Description: string; + end; + + [ComImport, GuidAttribute('89F49E64-F6E0-11D6-9038-00C02631BDC7'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] +// [Guid('89F49E64-F6E0-11D6-9038-00C02631BDC7'), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + IDBMonitor = interface + [PreserveSig] + function GetVersion([Out, MarshalAs(UnmanagedType.LPStr)] out Version: string): HRESULT; + [PreserveSig] + function SetCaption([In, MarshalAs(UnmanagedType.LPStr)] Caption: string): HRESULT; + [PreserveSig] + function IsMonitorActive(out Active: integer): HRESULT; + [PreserveSig] + function OnEvent(var Msg: TMonitorMessage; [In, MarshalAs(UnmanagedType.LPStr)] ParamStr: string): HRESULT; + [PreserveSig] + function OnExecute(var Msg: TMonitorMessage; [In, MarshalAs(UnmanagedType.LPStr)] SQL: string; + [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Struct)] Params: array of TSQLParam; + ParamCount: integer; RowsAffected: integer): HRESULT; + end; + +//TODO +//[ComImport, Guid('89F49E65-F6E0-11D6-9038-00C02631BDC7')] + DbMonitorClass = class + end; +{$ELSE} + TSQLParam = record + Name: string; + DataType: string; + ParamType: string; + Value: string; + end; + TSQLParams = array of TSQLParam; + + PSQLParam = ^TSQLParam; + + TMonitorMessage = record + MessageID: cardinal; + EventType: integer; + TracePoint: integer; + ObjectID: cardinal; + OwnerID: cardinal; + ObjectName: PChar; + OwnerName: PChar; + Description: PChar; + end; + + IDBMonitor = interface(IUnknown) + ['{89F49E64-F6E0-11D6-9038-00C02631BDC7}'] + function GetVersion(out pVersion: PChar): HRESULT; stdcall; + function SetCaption(Caption: PChar): HRESULT; stdcall; + function IsMonitorActive(out Active: integer): HRESULT; stdcall; + function OnEvent(var Msg: TMonitorMessage; ParamStr: PChar): HRESULT; stdcall; + function OnExecute(var Msg: TMonitorMessage; SQL: PChar; Params: PSQLParam; + ParamCount: integer; RowsAffected: integer): HRESULT; stdcall; + end; +{$ENDIF} + +implementation + +end. + + diff --git a/internal/4.10.0.10/1/Source/Dac.inc b/internal/4.10.0.10/1/Source/Dac.inc new file mode 100644 index 0000000..d8e0dc2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Dac.inc @@ -0,0 +1,219 @@ +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2003 Core Lab. All right reserved. + +{$DEFINE DAC600} + +{$IFNDEF LINUX} + {$DEFINE MSWINDOWS} +{$ENDIF} + +{$IFDEF MSWINDOWS} + {$IFNDEF CLR} + {$DEFINE USE_SYNEDIT} + {$ENDIF} +{$ENDIF} + +{$IFDEF VER120} { Delphi 4 } + {$DEFINE D4} + {$DEFINE VER4} + + {$DEFINE VER34} + {$DEFINE VER4P} +{$ENDIF} + +{$IFDEF VER130} { Delphi 5 } +{$IFNDEF BCB} + {$DEFINE D5} + {$DEFINE VER5} + + {$DEFINE VER5P} +{$ENDIF} +{$ENDIF} + +{$IFDEF VER140} { Delphi 6, Kylix 1, Kylix 2 } +{$IFNDEF BCB} + {$DEFINE D6} + {$DEFINE VER6} + + {$DEFINE VER5P} + {$DEFINE VER6P} +{$ENDIF} +{$ENDIF} + +{$IFDEF VER150} { Delphi 7 } +{$IFNDEF BCB} + {$DEFINE D7} + {$DEFINE VER7} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} +{$ENDIF} +{$ENDIF} + +{$IFDEF VER160} { Delphi 8 } + {$DEFINE D8} + {$DEFINE VER8} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} + {$DEFINE VER8P} +{$ENDIF} + +{$IFDEF VER170} { Delphi 9 } + {$DEFINE D9} + {$DEFINE VER9} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} + {$DEFINE VER8P} + {$DEFINE VER9P} +{$ENDIF} + +{$IFDEF VER180} { Delphi 10 } +{$IFNDEF VER185} { Delphi 11 Spacely} + {$DEFINE D10} + {$DEFINE VER10} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} + {$DEFINE VER8P} + {$DEFINE VER9P} + {$DEFINE VER10P} +{$ENDIF} +{$ENDIF} + +{$IFDEF VER185} { Delphi 11 Spacely} + {$DEFINE D11} + {$DEFINE VER11} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$DEFINE VER7P} + {$DEFINE VER8P} + {$DEFINE VER9P} + {$DEFINE VER10P} + {$DEFINE VER11P} +{$ENDIF} + + +{$IFDEF VER125} { C++ Builder 4 } + {$DEFINE BCB} + {$DEFINE CB4} + {$DEFINE VER4} + + {$DEFINE VER34} + {$DEFINE VER4P} + {$ObjExportAll On} +{$ENDIF} + +{$IFDEF VER130} { C++ Builder 5 } +{$IFDEF BCB} + {$DEFINE CB5} + {$DEFINE VER5} + + {$DEFINE VER5P} + {$ObjExportAll On} +{$ENDIF} +{$ENDIF} + +{$IFDEF VER140} { C++ Builder 6 } +{$IFDEF BCB} + {$DEFINE CB6} + {$DEFINE VER6} + + {$DEFINE VER5P} + {$DEFINE VER6P} + {$ObjExportAll On} +{$ENDIF} +{$ENDIF} + +{$IFDEF INTERNAL} +{$IFDEF BCB} + {$DEFINE BDE_SHARED} // Use TUpdateAction from DBTables +{$ENDIF} +{$ENDIF} + +// old + +{$IFDEF VER100} { Delphi 3 } + {$DEFINE D3} + {$DEFINE D3_CB3} + {$DEFINE VER34} + {$DEFINE VER3+} +{$ENDIF} + +{$IFDEF VER110} { C++ Builder 3 } + {$DEFINE CB} + {$DEFINE CB3} + {$DEFINE D3_CB3} + {$DEFINE VER34} + {$DEFINE VER3+} + {$ObjExportAll On} +{$ENDIF} + +{$IFDEF VER7P} + {$WARN UNSAFE_TYPE OFF} + {$WARN UNSAFE_CODE OFF} + {$WARN UNSAFE_CAST OFF} +{$ENDIF} + +{$IFDEF VER6P} + {$WARN SYMBOL_PLATFORM OFF} + {$WARN SYMBOL_DEPRECATED OFF} + {$WARN UNIT_PLATFORM OFF} + {$WARN UNIT_DEPRECATED OFF} +{$ENDIF} + +{$IFDEF BCB} + {$IFNDEF VER6P} + // CBuilder5 - UTF8 functions is not implemented + {$DEFINE UTF8} + {$ENDIF} +{$ELSE} + // Delphi5, Kylix2 - UTF8 functions is not implemented + // Delphi6, Kylix3 - can't divide K2 and K3 + {$IFDEF MSWINDOWS} + {$IFNDEF VER6P} + {$DEFINE UTF8} + {$ENDIF} + {$ELSE} + {$IFNDEF VER7P} + {$DEFINE UTF8} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{---------------------------- + MyDAC | other +----------------------|------ + k z | - + d5-d6 z | - + d7 d | d + d8 clr - | - + d9p clr - | - + d9p w32 d | d +----------------------------- + z - ZLib objs + d - Delphi internal} + +{$IFNDEF LITE} + {$IFNDEF CLR} + {$DEFINE HAVE_COMPRESS} // Define TCompressBlob class + {$IFDEF MSWINDOWS} + {$IFDEF VER7P} + {$DEFINE HAVE_COMPRESS_INTERNAL} // ZLib build in Delphi + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFNDEF NODBTOOLS} // for VirtualTable build +{$IFDEF VER9P} + {$DEFINE DBTOOLS} // include DBToolsClient unit and related code +{$ENDIF} +{$ENDIF} diff --git a/internal/4.10.0.10/1/Source/DacClx.pas b/internal/4.10.0.10/1/Source/DacClx.pas new file mode 100644 index 0000000..5568525 --- /dev/null +++ b/internal/4.10.0.10/1/Source/DacClx.pas @@ -0,0 +1,17 @@ + +{$I Dac.inc} +{$J+} + +unit DacClx; + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Registry, SysUtils, +{$ENDIF} + Classes, DB, DBAccess, DASQLMonitor, TypInfo, MemData, QForms, QControls, + QStdCtrls, QExtCtrls, QGraphics; + +{$I DacGui.inc} + diff --git a/internal/4.10.0.10/1/Source/DacGui.inc b/internal/4.10.0.10/1/Source/DacGui.inc new file mode 100644 index 0000000..1d8155b --- /dev/null +++ b/internal/4.10.0.10/1/Source/DacGui.inc @@ -0,0 +1,458 @@ + +procedure SetCursor(Value: integer); +procedure ShowDebugForm(DASQLMonitorClass: TDASQLMonitorClass; + Component: TComponent; SQL: string; Params: TDAParams; Caption: string); +function ShowConnectForm(ConnectDialog: TCustomConnectDialog): boolean; +procedure StartWait; +procedure StopWait; +function ApplicationTitle: string; + +{$IFDEF MSWINDOWS} +function GetHelpFileName(const ProjectName: string): string; +{$ENDIF} + +implementation + +var + SQLDelay: longword = 30; + +{$IFDEF WIN32} +var + TimerID: word = 0; + StartTime: longword = 0; + +procedure FreeTimer(ForceKill: boolean = False); +begin + if (TimerID <> 0) and (ForceKill or (GetTickCount - StartTime > SQLDelay)) then begin + KillTimer(0, TimerID); + TimerID := 0; + StartTime := 0; + SetCursor(crDefault); + end; +end; + +procedure TimerCallBack(hWnd: HWND; Message: Word; TimerID: word; + SysTime: longint); stdcall; +begin + FreeTimer; +end; +{$ELSE} +type + TCursorTimer = class (TTimer) + private + procedure TimerHandler(Sender: TObject); + + public + constructor Create(AOwner: TComponent); override; + end; + +var + Timer: TTimer; + +{ TCursorTimer } + +constructor TCursorTimer.Create(AOwner: TComponent); +begin + inherited; + + OnTimer := TimerHandler; +end; + +procedure TCursorTimer.TimerHandler(Sender: TObject); +begin + Enabled := False; + SetCursor(crDefault); +end; +{$ENDIF} + +const +{$IFDEF MSWINDOWS} + KeyPath = '\SOFTWARE\CoreLab\DBAccess\'; +{$ENDIF} + SQLArrowCount: integer = 0; + +procedure SetCursor(Value: integer); +begin + if ChangeCursor + {$IFDEF WIN32}and (GetCurrentThreadID = MainThreadID){$ENDIF} + then + case Value of + crDefault: begin + if SQLArrowCount > 0 then begin + if Screen.Cursor <> crSQLWait then + Dec(SQLArrowCount); + if SQLArrowCount > 0 then + Screen.Cursor := crSQLArrow + else + Screen.Cursor := crDefault; + end + else + Screen.Cursor := crDefault; + end; + crSQLWait: begin + {$IFDEF WIN32} + if TimerID = 0 then + TimerID := SetTimer(0, 0, SQLDelay, @TimerCallBack); + + if Screen.Cursor <> crSQLWait then + Screen.Cursor := crSQLWait; + + StartTime := GetTickCount; + {$ELSE} + if Timer = nil then begin + Timer := TCursorTimer.Create(nil); + Timer.Enabled := False; + end; + if not Timer.Enabled then begin + Timer.Interval := SQLDelay; + Timer.Enabled := True; + end; + {$IFNDEF K3} + // strange AV when freeing cursor on exit (perhaps beta problem) + if Screen.Cursor <> crSQLWait then + Screen.Cursor := crSQLWait; + {$ENDIF} + {$ENDIF} + end; + crSQLArrow: begin + Inc(SQLArrowCount); + Screen.Cursor:= crSQLArrow; + end; + end; +end; + +type + TDebugForm = class (TForm) + public + constructor CreateNew(Owner: TComponent; Dummy: integer = 0); override; + + procedure FormKeyPress(Sender: TObject; var Key: char); + procedure ButtonClick(Sender: TObject); + end; + +{ TDebugForm } + +constructor TDebugForm.CreateNew(Owner: TComponent; Dummy: integer = 0); +begin + inherited CreateNew(Owner); + + KeyPreview := True; + OnKeyPress := FormKeyPress; +end; + +procedure TDebugForm.FormKeyPress(Sender: TObject; var Key: char); +begin + if (Key = #13) or (Key = #27) then + Close; +end; + +procedure TDebugForm.ButtonClick(Sender: TObject); +begin + Close; +end; + +procedure ShowDebugForm(DASQLMonitorClass: TDASQLMonitorClass; + Component: TComponent; SQL: string; Params: TDAParams; Caption: string); +var + Form: TDebugForm; + Memo: TMemo; + St: string; + Panel: TPanel; +{$IFDEF MSWINDOWS} + Registry: TRegistry; +{$ENDIF} +begin + Form := TDebugForm.CreateNew(nil); + +{$IFDEF MSWINDOWS} + Registry := TRegistry.Create; +{$ENDIF} + + try + St := DASQLMonitorClass.GetCaption + ' Debug: '; + if Component.Owner <> nil then + St := St + Component.Owner.Name + '.'; + St := St + Component.Name; + if Caption <> '' then + St := St + ' [' + Caption + ']'; + + Form.Caption := St; + + Panel := TPanel.Create(Form); + with Panel do begin + Parent := Form; + Align := alTop; + Height := 24; + BevelInner := bvNone; + BevelOuter := bvNone; + end; + + with TButton.Create(Form) do begin + Parent := Panel; + Caption := 'Close'; + Font.Style := [fsBold]; + Top := 1; + Left := 0; + Height := 22; + Width := 150; + OnClick := Form.ButtonClick; + end; + + with TLabel.Create(Form) do begin + Parent := Panel; + Caption := 'Before execution'; + Font.Style := [fsBold]; + Font.Color := clNavy; + Top := 5; + Left := 175; + end; + + with TPanel.Create(Form) do begin + Parent := Form; + Align := alLeft; + Width := 15; + BevelInner := bvLowered; + BevelOuter := bvNone; + end; + + Memo := TMemo.Create(Form); + with Memo do begin + Parent := Form; + Align := alClient; + ReadOnly := True; + Color := clBtnFace; + Font.Name := 'Courier New'; + {$IFDEF MSWINDOWS} + {$IFNDEF CLX} + Font.Charset := GetDefFontCharSet; + {$ENDIF} + {$ENDIF} + ScrollBars := ssBoth; + WordWrap := False; + end; + + Form.ActiveControl := Memo; + + Memo.Lines.Text := SQL + #13#10 + #13#10 + DASQLMonitorClass.GetParams(Params); + Memo.SelStart := 0; + + {$IFDEF MSWINDOWS} + if Registry.OpenKey(KeyPath + 'Debug', False) then begin + if Registry.ValueExists('Left') then + Form.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + Form.Top := Registry.ReadInteger('Top'); + if Registry.ValueExists('Width') then + Form.Width := Registry.ReadInteger('Width'); + if Registry.ValueExists('Height') then + Form.Height := Registry.ReadInteger('Height'); + + Registry.CloseKey; + end + else + {$ENDIF} + begin + Form.Width := (Screen.Width) div 2; + Form.Left := (Screen.Width - Form.Width) div 2; + Form.Top := (Screen.Height - Form.Height) div 2; + end; + + Form.ShowModal; + + {$IFDEF MSWINDOWS} + if Registry.OpenKey(KeyPath + 'Debug', True) then begin + Registry.WriteInteger('Left', Form.Left); + Registry.WriteInteger('Top', Form.Top); + Registry.WriteInteger('Width', Form.Width); + Registry.WriteInteger('Height', Form.Height); + Registry.CloseKey; + end; + {$ENDIF} + + finally + {$IFDEF MSWINDOWS} + Registry.Free; + {$ENDIF} + Form.Free; + end; +end; + +type + _TCustomConnectDialog = class(TCustomConnectDialog) + end; + +function ShowConnectForm(ConnectDialog: TCustomConnectDialog): boolean; +var + FormClass: TFormClass; + ConnectForm: TForm; + PropInfo: PPropInfo; +begin + if (ConnectDialog.DialogClass = '') + or (csDesigning in ConnectDialog.ComponentState) + then + FormClass := TFormClass(_TCustomConnectDialog(ConnectDialog).DefDialogClass) + else + FormClass := TFormClass(FindClass(ConnectDialog.DialogClass)); + + ConnectForm := FormClass.Create(nil); + try + PropInfo := GetPropInfo(FormClass.ClassInfo, 'ConnectDialog'); + if PropInfo <> nil then + SetObjectProp(ConnectForm, PropInfo, ConnectDialog); + + Result := (ConnectForm.ShowModal = mrOk) and ConnectDialog.Connection.Connected; + finally + ConnectForm.Free; + end; +end; + +procedure StartWait; +begin + SetCursor(crSQLWait); +end; + +procedure StopWait; +begin + SetCursor(crDefault); +end; + +function ApplicationTitle: string; +begin + Result := Application.Title; +end; + +{$IFDEF MSWINDOWS} +{$IFDEF VER7P} +{$IFDEF VER8P} +function GetHelpFileName(const ProjectName: string): string; +var + Path: string; + Ind: integer; + + Registry: TRegistry; + sl: TStringList; + i: integer; + UCProjectName: string; +begin + Result := ''; + Registry := nil; + sl := nil; + try + Registry := TRegistry.Create; + {$IFDEF VER9P} + Registry.RootKey := HKEY_LOCAL_MACHINE; + if Registry.OpenKey('Software\CoreLab\' + ProjectName, False) then begin + try + {$IFDEF VER9} + Path := Registry.ReadString('D9'); + {$ELSE} + {$IFDEF VER10} + Path := Registry.ReadString('D10'); + {$ELSE} + {$IFDEF VER11} + Path := Registry.ReadString('D11'); + {$ELSE} + error + {$ENDIF} + {$ENDIF} + {$ENDIF} + Result := IncludeTrailingPathDelimiter(Path) + 'Doc\' + ProjectName + '.hxs'; + Exit; + except + // silent + Registry.CloseKey; + end; + end; + {$ENDIF} + + Registry.RootKey := HKEY_CURRENT_USER; + sl := TStringList.Create; + if not Registry.OpenKey('Software\Borland\BDS\' + + {$IFDEF VER8}'2.0'{$ENDIF} + {$IFDEF VER9}'3.0'{$ENDIF} + {$IFDEF VER10}'4.0'{$ENDIF} + {$IFDEF VER11}'5.0'{$ENDIF} + + '\Known Assemblies', False) then begin + Result := ProjectName + '.hxs'; + Exit; + end; + + Registry.GetValueNames(sl); + UCProjectName := UpperCase('CoreLab.' + ProjectName + '.Design'); + for i := 0 to sl.Count - 1 do + if (Registry.GetDataType(sl[i]) in [rdString, rdExpandString]) + and (UpperCase(Registry.ReadString(sl[i])) = UCProjectName) then begin + Path := sl[i]; + Break; + end; + + if Path = '' then begin + Result := ProjectName + '.hxs'; + Exit; + end; + + finally + sl.Free; + Registry.Free; + end; + + Ind := LastDelimiter('\', Path); + Path := Copy(Path, 1, Ind - 1); + Ind := LastDelimiter('\', Path); + Path := Copy(Path, 1, Ind); + Result := Path + 'Doc\' + ProjectName + '.hxs'; +end; +{$ELSE} +function GetHelpFileName(const ProjectName: string): string; +begin + Result := ProjectName + '.hlp'; +end; +{$ENDIF} +{$ELSE} +function GetHelpFileName(const ProjectName: string): string; +var + Path: string; + Ind: integer; +begin + Path := Application.ExeName; + Ind := LastDelimiter('\', Path); + Path := Copy(Path, 1, Ind - 1); + Ind := LastDelimiter('\', Path); + Path := Copy(Path, 1, Ind); + Result := Path + 'help\' + ProjectName + '.hlp'; +end; +{$ENDIF} +{$ENDIF} + +initialization +{$IFDEF WIN32} +{$IFNDEF CLX} + Screen.Cursors[crSQLArrow] := LoadCursor(HInstance, 'SQLARROW'); +{$ENDIF} +{$ELSE} + Timer := nil; +{$ENDIF} + + SetCursorProc := SetCursor; + ShowConnectFormProc := ShowConnectForm; + ShowDebugFormProc := ShowDebugForm; + StartWaitProc := StartWait; + StopWaitProc := StopWait; + ApplicationTitleProc := ApplicationTitle; + {$IFNDEF VER6P} + ApplicationHandleException := Application.HandleException; + {$ENDIF}; + +finalization +{$IFDEF WIN32} +{$IFNDEF CLX} + DestroyCursor(Screen.Cursors[crSQLArrow]); +{$ENDIF} + FreeTimer(True); +{$ELSE} + if Timer <> nil then + Timer.Free; +{$ENDIF} + +end. + diff --git a/internal/4.10.0.10/1/Source/DacVcl.pas b/internal/4.10.0.10/1/Source/DacVcl.pas new file mode 100644 index 0000000..82d9c9f --- /dev/null +++ b/internal/4.10.0.10/1/Source/DacVcl.pas @@ -0,0 +1,16 @@ + +{$J+} + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DacVcl; +{$ENDIF} +interface +uses + Classes, DB, DBAccess, DASQLMonitor, TypInfo, MemData, Windows, Forms, + Controls, StdCtrls, ExtCtrls, Registry, Graphics, SysUtils; + +{$I DacGui.inc} + diff --git a/internal/4.10.0.10/1/Source/DacVer.inc b/internal/4.10.0.10/1/Source/DacVer.inc new file mode 100644 index 0000000..ce3cbab --- /dev/null +++ b/internal/4.10.0.10/1/Source/DacVer.inc @@ -0,0 +1,8 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. + +const + DACVersion = '6.10.1.10'; + diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.bdsproj new file mode 100644 index 0000000..ff31ae0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.bdsproj @@ -0,0 +1,187 @@ + + + + + + + + + + + + CoreLab.Dac.AdoNet.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac;CoreLab.VirtualTable + False + + False + True + False + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + 1 + True + False + 4096 + 1048576 + 4194304 + Core Lab Data Access Components + False + False + + + + . + + . + .\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\delphi\dac\source\delphi10;D:\Projects\Delphi\Dac\Source\Delphi10 + d:\winnt\microsoft.net\framework\v1.1.4322\System.Data.dll;Borland.VclDbRtl;Borland.Delphi;D:\Projects\Delphi\Dac\Source\Delphi10\CoreLab.Dac.dll + + + False + + + + + + False + + + + + + False + + True False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 4010 + False + False + False + False + False + 1058 + 1251 + + + + + + + + + + + + + 6.10.1.10 + + + + + + 6.10.1.10 + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.cfg b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.cfg new file mode 100644 index 0000000..46dcbc4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.cfg @@ -0,0 +1,45 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.VirtualTable +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N0"." +-LN"." +-U".\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\delphi\dac\source\delphi10;D:\Projects\Delphi\Dac\Source\Delphi10" +-O".\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\delphi\dac\source\delphi10" +-I".\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\delphi\dac\source\delphi10" +-R".\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\delphi\dac\source\delphi10" +-w-SYMBOL_DEPRECATED +-w-SYMBOL_PLATFORM +-w-UNIT_PLATFORM +-w-CASE_LABEL_RANGE diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.dpk b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.dpk new file mode 100644 index 0000000..d48945e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.AdoNet.dpk @@ -0,0 +1,97 @@ +package CoreLab.Dac.AdoNet; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + CoreLab.Dac, + Borland.Delphi, + Borland.VclDbRtl, + System.Data; + +contains + CoreLab.Dac.DataAdapter in '..\Net\CoreLab.Dac.DataAdapter.pas'; + +[assembly: AssemblyTitle('CoreLab.Dac.AdoNet')] +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.4010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.bdsproj new file mode 100644 index 0000000..7e94138 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.bdsproj @@ -0,0 +1,213 @@ + + + + + + + + + + + + CoreLab.Dac.Design.dpk + + + 7.0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + CoreLab.Dac;CoreLab.Dac.Design + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + Data Access Components + False + + + + . + + . + .\;..\Net;..\Design;..\;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\program files\borland\bds\4.0\bin;d:\projects\delphi\dac\source\delphi10;D:\Projects\Delphi\Dac\Source\Delphi10 + Borland.VclRtl;Borland.VclDbCtrls;Borland.Vcl.Design.DbRtl;Borland.Vcl;Borland.Studio.Vcl.Design;Borland.Delphi;CoreLab.Dac + + + False + + + + + + False + + + + + + False + + True + False + + + $00000000 + + + + True + False + 6 + 10 + 1 + 4010 + False + False + False + False + False + 1058 + 1251 + + 1.0.0.01.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.cfg b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.cfg new file mode 100644 index 0000000..30f213a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.cfg @@ -0,0 +1,41 @@ +-$A- +-$B- +-$C- +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSCoreLab.Dac;CoreLab.Dac.Design +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N0"." +-LN"." +-U".\;..\Net;..\;..\Design;..\..\DBToolsInterfaces" +-O".\;..\Net;..\;..\Design" +-I".\;..\Net;..\;..\Design" +-R".\;..\Net;..\;..\Design" +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.dpk b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.dpk new file mode 100644 index 0000000..ced0dc9 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.Design.dpk @@ -0,0 +1,132 @@ +package CoreLab.Dac.Design; + + +{$ALIGN 0} +{$ASSERTIONS OFF} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + CoreLab.DbTools.Interfaces, + CoreLab.Dac, + Borland.Delphi, + Borland.Studio.Vcl.Design, + Borland.Studio.ToolsAPI, + Borland.Vcl, + Borland.Vcl.Design.DbRtl, + Borland.VclDbCtrls, + Borland.VclRtl; + +contains + CoreLab.Dac.Design.DacReg in '..\Net\CoreLab.Dac.Design.DacReg.pas', + CoreLab.Dac.Design.VTDesign in '..\Net\CoreLab.Dac.Design.VTDesign.pas', + CoreLab.Dac.Design.DAMenu in '..\Net\CoreLab.Dac.Design.DAMenu.pas', + CoreLab.Dac.Design.DADesign in '..\Net\CoreLab.Dac.Design.DADesign.pas', + CoreLab.Dac.Design.DAUpdateSQLFrame in '..\Net\CoreLab.Dac.Design.DAUpdateSQLFrame.pas', + CoreLab.Dac.Design.CRFrame in '..\Net\CoreLab.Dac.Design.CRFrame.pas', + CoreLab.Dac.Design.CRColFrame in '..\Net\CoreLab.Dac.Design.CRColFrame.pas', + CoreLab.Dac.Design.CRTabEditor in '..\Net\CoreLab.Dac.Design.CRTabEditor.pas', + CoreLab.Dac.Design.DAConnectionEditor in '..\Net\CoreLab.Dac.Design.DAConnectionEditor.pas', + CoreLab.Dac.Design.CRDataEditor in '..\Net\CoreLab.Dac.Design.CRDataEditor.pas', + CoreLab.Dac.Design.DADataEditor in '..\Net\CoreLab.Dac.Design.DADataEditor.pas', + CoreLab.Dac.Design.DAMacrosFrame in '..\Net\CoreLab.Dac.Design.DAMacrosFrame.pas', + CoreLab.Dac.Design.DAParamsFrame in '..\Net\CoreLab.Dac.Design.DAParamsFrame.pas', + CoreLab.Dac.Design.DAParamValueEditor in '..\Net\CoreLab.Dac.Design.DAParamValueEditor.pas', + CoreLab.Dac.Design.DAQueryEditor in '..\Net\CoreLab.Dac.Design.DAQueryEditor.pas', + CoreLab.Dac.Design.DADualListEditor in '..\Net\CoreLab.Dac.Design.DADualListEditor.pas', + CoreLab.Dac.Design.DADumpProgress in '..\Net\CoreLab.Dac.Design.DADumpProgress.pas', + CoreLab.Dac.Design.DADumpEditor in '..\Net\CoreLab.Dac.Design.DADumpEditor.pas', + CoreLab.Dac.Design.DASPCallFrame in '..\Net\CoreLab.Dac.Design.DASPCallFrame.pas', + CoreLab.Dac.Design.DASQLEditor in '..\Net\CoreLab.Dac.Design.DASQLEditor.pas', + CoreLab.Dac.Design.DASQLFrame in '..\Net\CoreLab.Dac.Design.DASQLFrame.pas', + CoreLab.Dac.Design.DASQLGeneratorFrame in '..\Net\CoreLab.Dac.Design.DASQLGeneratorFrame.pas', + CoreLab.Dac.Design.DATableEditor in '..\Net\CoreLab.Dac.Design.DATableEditor.pas', + CoreLab.Dac.Design.CREditor in '..\Net\CoreLab.Dac.Design.CREditor.pas', + CoreLab.Dac.Design.DADesignUtils in '..\Net\CoreLab.Dac.Design.DADesignUtils.pas', + CoreLab.Dac.Design.DAUpdateSQLEditor in '..\Net\CoreLab.Dac.Design.DAUpdateSQLEditor.pas', + CoreLab.Dac.Design.DAScriptEditor in '..\Net\CoreLab.Dac.Design.DAScriptEditor.pas', + CoreLab.Dac.Design.DAStoredProcEditor in '..\Net\CoreLab.Dac.Design.DAStoredProcEditor.pas', + CoreLab.Dac.Design.VTDataEditor in '..\Net\CoreLab.Dac.Design.VTDataEditor.pas', + CoreLab.Dac.Design.Download in '..\Net\CoreLab.Dac.Design.Download.pas', + CoreLab.Dac.Design.DBToolsClient in '..\Net\CoreLab.Dac.Design.DBToolsClient.pas', + CoreLab.Dac.Design.DBToolsIntf in '..\Net\CoreLab.Dac.Design.DBToolsIntf.pas', + CoreLab.Dac.Design.HelpUtils in '..\Net\CoreLab.Dac.Design.HelpUtils.pas'; + +[assembly: AssemblyTitle('Core Lab Data Access Components')] +[assembly: AssemblyDescription('Core Lab Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.4010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.bdsproj new file mode 100644 index 0000000..9f38f4b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.bdsproj @@ -0,0 +1,208 @@ + + + + + + + + + + + + CoreLab.Dac.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac;CoreLab.VirtualTable + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + + True + True + True + + + + 0 + 0 + 1 + False + False + 4096 + 1048576 + 4194304 + Core Lab Data Access Components + False + False + + + + . + + . + ..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\4.0 + Borland.VclRtl;Borland.VclDbRtl;Borland.Vcl;Borland.Delphi + + + False + + + + + + False + + + + + + False + + True + False + + + True + False + 6 + 10 + 1 + 4010 + False + False + False + False + False + 1058 + 1251 + + + Core Lab + + 6.10.1.10 + + + + + DAC + 6.10.1.10 + + + + + $00000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.cfg b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.cfg new file mode 100644 index 0000000..cd38992 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.cfg @@ -0,0 +1,40 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.VirtualTable +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N0"." +-LN"." +-U"..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\4.0" +-O"..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\4.0" +-I"..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\4.0" +-R"..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\4.0" diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.dpk b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.dpk new file mode 100644 index 0000000..ebee31e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Dac.dpk @@ -0,0 +1,108 @@ +package CoreLab.Dac; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + Borland.Vcl, + Borland.VclDbRtl, + Borland.VclRtl; + +contains + CoreLab.Dac.VirtualTable in '..\Net\CoreLab.Dac.VirtualTable.pas', + CoreLab.Dac.CRParser in '..\Net\CoreLab.Dac.CRParser.pas', + CoreLab.Dac.DAConsts in '..\Net\CoreLab.Dac.DAConsts.pas', + CoreLab.Dac.DacVcl in '..\Net\CoreLab.Dac.DacVcl.pas', + CoreLab.Dac.DALoader in '..\Net\CoreLab.Dac.DALoader.pas', + CoreLab.Dac.DADump in '..\Net\CoreLab.Dac.DADump.pas', + CoreLab.Dac.DASQLMonitor in '..\Net\CoreLab.Dac.DASQLMonitor.pas', + CoreLab.Dac.DBAccess in '..\Net\CoreLab.Dac.DBAccess.pas', + CoreLab.Dac.DBMonitorClient in '..\Net\CoreLab.Dac.DBMonitorClient.pas', + CoreLab.Dac.DBMonitorIntf in '..\Net\CoreLab.Dac.DBMonitorIntf.pas', + CoreLab.Dac.MemData in '..\Net\CoreLab.Dac.MemData.pas', + CoreLab.Dac.MemDS in '..\Net\CoreLab.Dac.MemDS.pas', + CoreLab.Dac.MemUtils in '..\Net\CoreLab.Dac.MemUtils.pas', + CoreLab.Dac.CRAccess in '..\Net\CoreLab.Dac.CRAccess.pas', + CoreLab.Dac.CRConnectionPool in '..\Net\CoreLab.Dac.CRConnectionPool.pas', + CoreLab.Dac.DAScript in '..\Net\CoreLab.Dac.DAScript.pas', + CoreLab.Dac.CRBatchMove in '..\Net\CoreLab.Dac.CRBatchMove.pas', + CoreLab.Dac.Win32Timer in '..\Net\CoreLab.Dac.Win32Timer.pas'; + +[assembly: AssemblyTitle('Core Lab Data Access Components')] +[assembly: AssemblyDescription('Core Lab Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +//[assembly: CLSCompliant(true)] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.4010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.bdsproj new file mode 100644 index 0000000..528d68e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.bdsproj @@ -0,0 +1,187 @@ + + + + + + + + + + + + CoreLab.Sdac.AdoNet.dpk + + + + + + + + + + + + + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + True + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 4 + 10 + 0 + 4010 + False + False + False + False + False + 1049 + 1251 + + + + + 4.10.0.10 + + + + + + 4.10.0.10 + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.cfg b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.cfg new file mode 100644 index 0000000..e048f42 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.cfg @@ -0,0 +1,39 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.Sdac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-U"..\;..\Net" +-O"..\;..\Net" +-I"..\;..\Net" +-R"..\;..\Net" diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.dpk b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.dpk new file mode 100644 index 0000000..c4e2396 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.AdoNet.dpk @@ -0,0 +1,99 @@ +package CoreLab.Sdac.AdoNet; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + System.Data, + Borland.VclDbRtl, + CoreLab.Sdac, + System.Drawing; + +contains + CoreLab.Dac.DataAdapter {CoreLab.Dac.DataAdapter.DADataAdapter: System.Data.Common.DbDataAdapter}, + CoreLab.Sdac.DataAdapter in '..\Net\CoreLab.Sdac.DataAdapter.pas' {CoreLab.Sdac.DataAdapter.MyDataAdapter: CoreLab.Dac.DataAdapter.DADataAdapter}; + +[assembly: AssemblyTitle('CoreLab.Sdac.AdoNet')] +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('SQL Server Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('4.10.0.4010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.bdsproj new file mode 100644 index 0000000..151b6c2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.bdsproj @@ -0,0 +1,204 @@ + + + + + + + + + + + + CoreLab.Sdac.Design.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac;CoreLab.Sdac;CoreLab.Dac.Design;CoreLab.Sdac.Design + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + + . + + . + d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\program files\borland\bds\4.0\bin;d:\projects\delphi\Dac\source\delphi10;d:\Projects\Delphi\Sdac\Source\Delphi10;d:\winnt\microsoft.net\framework\v1.1.4322;..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\projects\delphi\Sdac\source\delphi10;d:\projects\delphi\dac\source\delphi10;d:\projects\delphi\sdac\source\delphi10;d:\Projects\Delphi\dac\source\delphi10;d:\Projects\Delphi\Sdac\Source\Delphi10;d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\corelab\mydac for delphi10\bin;D:\Projects\Delphi\Sdac\Source\Delphi10 + D:\Projects\Delphi\Sdac\Source\Delphi10\CoreLab.Sdac.AdoNet.dll;d:\windows\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll;D:\Projects\Delphi\Sdac\Source\Delphi10\CoreLab.Sdac.dll;d:\program files\corelab\mydac for delphi10\bin\CoreLab.Dac.Design.dll;d:\program files\borland\bds\4.0\bin\Borland.Vcl.Design.Standard.dll;d:\program files\borland\bds\4.0\bin\Borland.Vcl.Design.DbRtl.dll;d:\program files\borland\bds\4.0\bin\Borland.Studio.Vcl.Design.dll;d:\program files\borland\bds\4.0\bin\Borland.Studio.ToolsAPI.dll;d:\program files\common files\borland shared\bds\shared assemblies\4.0\Borland.Delphi.dll + MYBUILDER;SDAC + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 4010 + False + False + False + False + False + + + + + + + 4.10.0.10 + + + + + + 4.10.0.10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.cfg b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.cfg new file mode 100644 index 0000000..1f9c419 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.cfg @@ -0,0 +1,41 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.Sdac;CoreLab.Dac.Design;CoreLab.Sdac.Design +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\Design;.\;..\Net;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\program files\borland\bds\4.0\bin;d:\projects\dexter\sdac\source\delphi10" +-O"..\Design;.\;..\Net;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\program files\borland\bds\4.0\bin;d:\projects\dexter\sdac\source\delphi10" +-I"..\Design;.\;..\Net;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\program files\borland\bds\4.0\bin;d:\projects\dexter\sdac\source\delphi10" +-R"..\Design;.\;..\Net;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\program files\borland\bds\4.0\bin;d:\projects\dexter\sdac\source\delphi10" +-DSDAC diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.dpk b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.dpk new file mode 100644 index 0000000..7292d2c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.Design.dpk @@ -0,0 +1,115 @@ +package CoreLab.Sdac.Design; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + Borland.Delphi, + Borland.Studio.ToolsAPI, + Borland.Studio.Vcl.Design, + Borland.Vcl.Design.DbRtl, + Borland.Vcl.Design.Standard, + CoreLab.Dac.Design, + CoreLab.Sdac, + System.Windows.Forms, + CoreLab.Sdac.AdoNet; + +contains + CoreLab.Sdac.Design.SdacAbout in '..\Net\CoreLab.Sdac.Design.SdacAbout.pas', + CoreLab.Sdac.Design.MSConnectionEditor in '..\Net\CoreLab.Sdac.Design.MSConnectionEditor.pas', + CoreLab.Sdac.Design.MSParamsFrame in '..\Net\CoreLab.Sdac.Design.MSParamsFrame.pas', + CoreLab.Sdac.Design.MSQueryEditor in '..\Net\CoreLab.Sdac.Design.MSQueryEditor.pas', + CoreLab.Sdac.Design.MSNamesEditor in '..\Net\CoreLab.Sdac.Design.MSNamesEditor.pas', + CoreLab.Sdac.Design.MSDumpEditor in '..\Net\CoreLab.Sdac.Design.MSDumpEditor.pas', + CoreLab.Sdac.Design.MSSPCallFrame in '..\Net\CoreLab.Sdac.Design.MSSPCallFrame.pas', + CoreLab.Sdac.Design.MSSQLEditor in '..\Net\CoreLab.Sdac.Design.MSSQLEditor.pas', + CoreLab.Sdac.Design.MSStoredProcEditor in '..\Net\CoreLab.Sdac.Design.MSStoredProcEditor.pas', + CoreLab.Sdac.Design.MSUpdateSQLEditor in '..\Net\CoreLab.Sdac.Design.MSUpdateSQLEditor.pas', + CoreLab.Sdac.Design.MSDesign in '..\Net\CoreLab.Sdac.Design.MSDesign.pas', + CoreLab.Sdac.Design.MSDesignUtils in '..\Net\CoreLab.Sdac.Design.MSDesignUtils.pas', + CoreLab.Sdac.Design.MSMenu in '..\Net\CoreLab.Sdac.Design.MSMenu.pas', + CoreLab.Sdac.Design.MSReg in '..\Net\CoreLab.Sdac.Design.MSReg.pas'; + +[assembly: AssemblyTitle('SQL Server Data Access Components')] +[assembly: AssemblyDescription('SQL Server Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('SQL Server Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('4.10.0.4010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.bdsproj new file mode 100644 index 0000000..547476b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.bdsproj @@ -0,0 +1,272 @@ + + + + + + + + + + + + CoreLab.Sdac.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + CoreLab.Sdac;CoreLab.Dac;Borland.Vcl + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + + True + + + 0 + 0 + 1 + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + False + + + + . + + . + ..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\projects\delphi\dac\source\delphi10 + CoreLab.Dac;Borland.VclRtl;Borland.VclDbRtl;Borland.Vcl;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + True + False + 4 + 10 + 0 + 4010 + False + False + False + False + False + + + + + Core Lab + + 4.10.0.10 + + + + + DAC + 4.10.0.10 + + + + + $00000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.cfg b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.cfg new file mode 100644 index 0000000..71384c6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.cfg @@ -0,0 +1,42 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSCoreLab.Sdac;CoreLab.Dac;Borland.Vcl +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\projects\delphi\dac\source\delphi10" +-O"..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\projects\delphi\dac\source\delphi10" +-I"..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\projects\delphi\dac\source\delphi10" +-R"..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\projects\delphi\dac\source\delphi10" +-DSDAC +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.dpk b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.dpk new file mode 100644 index 0000000..016b218 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/CoreLab.Sdac.dpk @@ -0,0 +1,107 @@ +package CoreLab.Sdac; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + Borland.Delphi, + Borland.Vcl, + Borland.VclDbRtl, + Borland.VclRtl, + CoreLab.Dac; + +contains + CoreLab.Sdac.SdacVcl in '..\Net\CoreLab.Sdac.SdacVcl.pas', + CoreLab.Sdac.OLEDBIntf in '..\Net\CoreLab.Sdac.OLEDBIntf.pas', + CoreLab.Sdac.MSAccess in '..\Net\CoreLab.Sdac.MSAccess.pas', + CoreLab.Sdac.MSConnectForm in '..\Net\CoreLab.Sdac.MSConnectForm.pas', + CoreLab.Sdac.MSConnectionPool in '..\Net\CoreLab.Sdac.MSConnectionPool.pas', + CoreLab.Sdac.MSConsts in '..\Net\CoreLab.Sdac.MSConsts.pas', + CoreLab.Sdac.MSParser in '..\Net\CoreLab.Sdac.MSParser.pas', + CoreLab.Sdac.MSLoader in '..\Net\CoreLab.Sdac.MSLoader.pas', + CoreLab.Sdac.MSDump in '..\Net\CoreLab.Sdac.MSDump.pas', + CoreLab.Sdac.MSScript in '..\Net\CoreLab.Sdac.MSScript.pas', + CoreLab.Sdac.CRThread in '..\Net\CoreLab.Sdac.CRThread.pas', + CoreLab.Sdac.MSServiceBroker in '..\Net\CoreLab.Sdac.MSServiceBroker.pas', + CoreLab.Sdac.MSSQLMonitor in '..\Net\CoreLab.Sdac.MSSQLMonitor.pas', + CoreLab.Sdac.OLEDBAccess in '..\Net\CoreLab.Sdac.OLEDBAccess.pas', + CoreLab.Sdac.OLEDBC in '..\Net\CoreLab.Sdac.OLEDBC.pas'; + +[assembly: AssemblyTitle('SQL Server Data Access Components')] +[assembly: AssemblyDescription('SQL Server Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('SQL Server Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +//[assembly: CLSCompliant(true)] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('4.10.0.4010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/Make.bat b/internal/4.10.0.10/1/Source/Delphi10/Make.bat new file mode 100644 index 0000000..6515d23 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/Make.bat @@ -0,0 +1,11 @@ +@echo off +rem ********************************************************************** +rem * +rem * Sdac for Delphi 10 +rem * +rem ********************************************************************** + +set IdeDir="D:\Program Files\Borland\BDS\4.0 +del /Q/S SDAC\*.* +call ..\Make.bat Delphi 10 WIN32 +call ..\Make.bat Delphi 10 CLR diff --git a/internal/4.10.0.10/1/Source/Delphi10/dac100.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/dac100.bdsproj new file mode 100644 index 0000000..94fbab2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dac100.bdsproj @@ -0,0 +1,178 @@ + + + + + + + + + + + + dac100.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + + + + 0 + 44 + 1 + False + False + False + 16384 + 1048576 + 4194304 + Core Lab Data Access Components + False + + + + . + + . + ..\ + + + + False + + + + + + False + + + + + + False + + True False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 4010 + False + False + False + False + False + 1033 + 1252 + + + 6.10.1.10 + Core Lab + + + + + + DAC + 6.10.1.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/dac100.cfg b/internal/4.10.0.10/1/Source/Delphi10/dac100.cfg new file mode 100644 index 0000000..777026f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dac100.cfg @@ -0,0 +1,45 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-JL +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N0"." +-LE"." +-LN"." +-U"..\" +-O"..\" +-I"..\" +-R"..\" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi10/dac100.dpk b/internal/4.10.0.10/1/Source/Delphi10/dac100.dpk new file mode 100644 index 0000000..1da0e60 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dac100.dpk @@ -0,0 +1,52 @@ +package dac100; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + dbrtl; + +contains + CRAccess in '..\CRAccess.pas', + DALoader in '..\DALoader.pas', + DADump in '..\DADump.pas', + DAScript in '..\DAScript.pas', + CRParser in '..\CRParser.pas', + DAConsts in '..\DAConsts.pas', + DBMonitorIntf in '..\DBMonitorIntf.pas', + DBMonitorClient in '..\DBMonitorClient.pas', + DASQLMonitor in '..\DASQLMonitor.pas', + DBAccess in '..\DBAccess.pas', + MemData in '..\MemData.pas', + MemDS in '..\MemDS.pas', + VirtualTable in '..\VirtualTable.pas', + DAVersionInfo in '..\DAVersionInfo.pas', + CLRClasses in '..\CLRClasses.pas', + MemUtils in '..\MemUtils.pas', + CRBatchMove in '..\CRBatchMove.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/dac100.res b/internal/4.10.0.10/1/Source/Delphi10/dac100.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.bdsproj new file mode 100644 index 0000000..9acb470 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.bdsproj @@ -0,0 +1,179 @@ + + + + + + + + + + + + dacvcl100.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + + + + 0 + 44 + 1 + False + False + False + 16384 + 1048576 + 4194304 + Core Lab Data Access GUI related Components + False + + + + . + + . + ..\ + + + + False + + + + + + False + + + + + + False + + True + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 4010 + False + False + False + False + False + 1033 + 1252 + + + Core Lab + + 6.10.1.10 + + + + + DAC + 6.10.1.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.cfg b/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.cfg new file mode 100644 index 0000000..777026f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.cfg @@ -0,0 +1,45 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-JL +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N0"." +-LE"." +-LN"." +-U"..\" +-O"..\" +-I"..\" +-R"..\" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.dpk b/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.dpk new file mode 100644 index 0000000..bf73414 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.dpk @@ -0,0 +1,36 @@ +package dacvcl100; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access GUI related Components'} +{$IMPLICITBUILD OFF} + +requires + rtl, + dac100, + vcl; + +contains + DacVcl in '..\DacVcl.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.res b/internal/4.10.0.10/1/Source/Delphi10/dacvcl100.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi10/dcldac100.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/dcldac100.bdsproj new file mode 100644 index 0000000..b245c68 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dcldac100.bdsproj @@ -0,0 +1,179 @@ + + + + + + + + + + + + dcldac100.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + Core Lab Data Access Components + False + + + + . + + . + ..\;..\Design\;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\ + + + ..\Design\ + False + + + + + + False + + + + + + False + + True + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 4010 + False + False + False + False + False + 1049 + 1251 + + + Core Lab + + 6.10.1.10 + + + + + DAC + 6.10.1.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/dcldac100.cfg b/internal/4.10.0.10/1/Source/Delphi10/dcldac100.cfg new file mode 100644 index 0000000..87fc627 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dcldac100.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N0"." +-LE"." +-LN"." +-U"..\;..\Design\" +-O"..\;..\Design\" +-I"..\;..\Design\" +-R"..\;..\Design\" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi10/dcldac100.dpk b/internal/4.10.0.10/1/Source/Delphi10/dcldac100.dpk new file mode 100644 index 0000000..073a252 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dcldac100.dpk @@ -0,0 +1,46 @@ +package dcldac100; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + dac100, + dcldb, + dacvcl100, + vcl, + dbrtl, + vcldb, + vclactnband; + +contains + DacReg in '..\Design\DacReg.pas', + VTDesign in '..\Design\VTDesign.pas', + DAMenu in '..\Design\DAMenu.pas', + DADesign in '..\Design\DADesign.pas', + Download in '..\Design\Download.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/dcldac100.res b/internal/4.10.0.10/1/Source/Delphi10/dcldac100.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.bdsproj new file mode 100644 index 0000000..0379d2a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.bdsproj @@ -0,0 +1,172 @@ + + + + + + + + + + + + dclsdac100.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + . + . + + + d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\Projects\Delphi\Dac\Source\;d:\Projects\Delphi\SDac\Source\;d:\Projects\Delphi\Dac\Source\Delphi10 + + sdac;MYBUILDER + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 4010 + False + False + False + False + False + + + + + + + 4.10.0.10 + + + + + + 4.10.0.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.cfg b/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.cfg new file mode 100644 index 0000000..b8cf74c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\Design;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\" +-O"..\Design;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\" +-I"..\Design;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\" +-R"..\Design;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\;D:\Program Files\Borland\BDS\4.0\source\ToolsAPI\" +-Dsdac +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.dpk b/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.dpk new file mode 100644 index 0000000..ec7bd97 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.dpk @@ -0,0 +1,44 @@ + +package dclsdac100; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE sdac} + +requires + sdac100, + dcldb, + dcldac100, + vcljpg, + sdacvcl100, + designide; + +contains + MSDesign in '..\Design\MSDesign.pas', + MSReg in '..\Design\MSReg.pas', + MSMenu in '..\Design\MSMenu.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.res b/internal/4.10.0.10/1/Source/Delphi10/dclsdac100.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi10/sdac100.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/sdac100.bdsproj new file mode 100644 index 0000000..009717e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/sdac100.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + sdac100.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True True + True + + + + 0 + 44 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components False + + + . + . + . + + d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\Projects\Delphi\Dac\Source\;d:\Projects\Delphi\SDac\Source\ + + SDAC + + False + + + + + + False + + + + + + False + True + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 4010 + False + False + False + False + False 1033 + 1252 + + + Core Lab + + 4.10.0.10 + + + + + Sdac + 4.10.0.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/sdac100.cfg b/internal/4.10.0.10/1/Source/Delphi10/sdac100.cfg new file mode 100644 index 0000000..b48f8c5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/sdac100.cfg @@ -0,0 +1,42 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-JL +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N0"." +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\" +-DSDAC +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi10/sdac100.dpk b/internal/4.10.0.10/1/Source/Delphi10/sdac100.dpk new file mode 100644 index 0000000..dc9f910 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/sdac100.dpk @@ -0,0 +1,56 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for Delphi 9 +////////////////////////////////////////////////// + +package sdac100; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + vcl, + vcldb, + dac100, + rtl, + dbrtl; + +contains + MSAccess in '..\MSAccess.pas', + MSConnectionPool in '..\MSConnectionPool.pas', + MSConsts in '..\MSConsts.pas', + MSSQLMonitor in '..\MSSQLMonitor.pas', + OLEDBAccess in '..\OLEDBAccess.pas', + OLEDBC in '..\OLEDBC.pas', + OLEDBIntf in '..\OLEDBIntf.pas', + MSLoader in '..\MSLoader.pas', + MSDump in '..\MSDump.pas', + MSScript in '..\MSScript.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/sdac100.res b/internal/4.10.0.10/1/Source/Delphi10/sdac100.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.bdsproj b/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.bdsproj new file mode 100644 index 0000000..a2ccbac --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + sdacvcl100.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True True + True + + + + 0 + 44 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access GUI related Components False + + + . + . + + + d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\common files\borland shared\bds\shared assemblies\4.0;d:\Projects\Delphi\Dac\Source\;d:\Projects\Delphi\SDac\Source\ + + SDAC + + False + + + + + + False + + + + + + False + True + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 4010 + False + False + False + False + False 1033 + 1252 + + + 4.10.0.10 + Core Lab + + + + + + Sdac + 4.10.0.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.cfg b/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.cfg new file mode 100644 index 0000000..b48f8c5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.cfg @@ -0,0 +1,42 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-JL +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N0"." +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi10;..\" +-DSDAC +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.dpk b/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.dpk new file mode 100644 index 0000000..e76573a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.dpk @@ -0,0 +1,37 @@ +package sdacvcl100; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access GUI related Components'} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + rtl, + dacvcl100, + sdac100; + +contains + sdacVcl in '..\sdacVcl.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.res b/internal/4.10.0.10/1/Source/Delphi10/sdacvcl100.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi11/Make.bat b/internal/4.10.0.10/1/Source/Delphi11/Make.bat new file mode 100644 index 0000000..f201986 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/Make.bat @@ -0,0 +1,10 @@ +@echo off +rem ********************************************************************** +rem * +rem * Sdac for Delphi 11 +rem * +rem ********************************************************************** + +set IdeDir="D:\Program Files\CodeGear\RAD Studio\5.0 +del /Q/S SDAC\*.* +call ..\Make.bat Delphi 11 WIN32 diff --git a/internal/4.10.0.10/1/Source/Delphi11/SDAC105_Group.groupproj b/internal/4.10.0.10/1/Source/Delphi11/SDAC105_Group.groupproj new file mode 100644 index 0000000..9250d51 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/SDAC105_Group.groupproj @@ -0,0 +1,84 @@ + + + {aa1a37fc-d9bf-4b89-af0b-484b89d53467} + + + + + + + + + + + + Default.Personality + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Delphi11/dac105.bdsproj b/internal/4.10.0.10/1/Source/Delphi11/dac105.bdsproj new file mode 100644 index 0000000..eb90f7e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dac105.bdsproj @@ -0,0 +1,182 @@ + + + + + + + + + + + + dac105.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 44 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + Core Lab Data Access Components + + + + + . + + + + + + False + + + + + + False + + + True + False + + + False + + + True + False + 6 + 10 + 1 + 5010 + False + False + False + False + False + 1033 + 1252 + + + Core Lab + + 6.10.1.10 + + + + + DAC + 6.10.1.10 + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/dac105.bpi b/internal/4.10.0.10/1/Source/Delphi11/dac105.bpi new file mode 100644 index 0000000000000000000000000000000000000000..a757701cf84f68e37385c9f8b7a261d109f7bb81 GIT binary patch literal 154868 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi11/dac105.cfg b/internal/4.10.0.10/1/Source/Delphi11/dac105.cfg new file mode 100644 index 0000000..1342a96 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dac105.cfg @@ -0,0 +1,42 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-JL +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N0"." +-LE"." +-LN"." +-U"..\" +-O"..\" +-I"..\" +-R"..\" +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi11/dac105.dpk b/internal/4.10.0.10/1/Source/Delphi11/dac105.dpk new file mode 100644 index 0000000..f26fa9f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dac105.dpk @@ -0,0 +1,53 @@ +package dac105; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE RELEASE} + +requires + rtl, + dbrtl; + +contains + CRAccess in '..\CRAccess.pas', + DALoader in '..\DALoader.pas', + DADump in '..\DADump.pas', + DAScript in '..\DAScript.pas', + CRParser in '..\CRParser.pas', + DAConsts in '..\DAConsts.pas', + DBMonitorIntf in '..\DBMonitorIntf.pas', + DBMonitorClient in '..\DBMonitorClient.pas', + DASQLMonitor in '..\DASQLMonitor.pas', + DBAccess in '..\DBAccess.pas', + MemData in '..\MemData.pas', + MemDS in '..\MemDS.pas', + VirtualTable in '..\VirtualTable.pas', + DAVersionInfo in '..\DAVersionInfo.pas', + CLRClasses in '..\CLRClasses.pas', + MemUtils in '..\MemUtils.pas', + CRBatchMove in '..\CRBatchMove.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi11/dac105.dproj b/internal/4.10.0.10/1/Source/Delphi11/dac105.dproj new file mode 100644 index 0000000..5915adf --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dac105.dproj @@ -0,0 +1,558 @@ + + + {3e934519-3666-4902-aa40-eb29eed797ea} + dac105.dpk + Release + AnyCPU + DCC32 + ..\..\Lib\D11\dac105.bpl + + + 7.0 + False + True + False + 0 + ..\..\Lib\D11 + RELEASE + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + + + 7.0 + False + True + False + 0 + All + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + + + Delphi.Personality + Package + +FalseTrueFalseCore Lab Data Access ComponentsFalseFalseTrueTrueFalse610110FalseFalseFalseFalseFalse10331252Core Lab6.10.1.106.10.1.10dac105.dpk + + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/dac105.res b/internal/4.10.0.10/1/Source/Delphi11/dac105.res new file mode 100644 index 0000000000000000000000000000000000000000..1fbafc12c4031228b5f6dcf5353fcae6b1b8560d GIT binary patch literal 1532 zcmaJ=L2FY%5dK~h@~8)!pa;F!AR^*HQVmt;G|L zeNZ2#$JkeQj1O`^3xZvO-$No-Al`>_kkB`RjZ5`=si32{7!vk_f#Q(R3WC7lqW1Df z*eFg_g071@Y)n|sXo0#h71z%gDL`x#S2~JQBix_B2bIAD{~!oD03t zw+SU^OBF{KhmQiI+C02dI$Ik0YqCS%j_i2WTG}G*27LPkp8d|R<_P$F3@nB=ODr}s z{D(;_GUoWS#0gM31y0W3o!WNd%pT2H8CL=1Xx3iFb3DZgUeK1X#x)w_??PUKhio>j zuR>mthx+I(rAKcmhxjekr}8Ydfpu(heuh`vt!Rf$?N{Jl#<%3}GpTn8DO$WPY7|Iv zbuTq^aQUH*b?l*mZPZXkfom08tXzY^E;(P7lS7^-eN4+!gDAR>Y1UgJXNQlWME)n9 zxB~{GrUocWk#ELtG(;gu+5B`@?^^EDIz@^$aRR{Oy7@10W!JkqmIa?antMdx2uK^v+s>K^}-z%Bg>+(~NG OUnO(=-lvm4lYan?fgPOy literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi11/dacvcl105.bdsproj b/internal/4.10.0.10/1/Source/Delphi11/dacvcl105.bdsproj new file mode 100644 index 0000000..d62cc3e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dacvcl105.bdsproj @@ -0,0 +1,183 @@ + + + + + + + + + + + + dacvcl105.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 44 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + Core Lab Data Access GUI related Components + + + + + + + + + + + False + + + + + + False + + + True + False + + + False + + + True + False + 6 + 10 + 1 + 5010 + False + False + False + False + False + 1033 + 1252 + + + Core Lab + + 6.10.1.10 + + + + + DAC + 6.10.1.10 + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/dacvcl105.bpi b/internal/4.10.0.10/1/Source/Delphi11/dacvcl105.bpi new file mode 100644 index 0000000000000000000000000000000000000000..a07b8aacbb8f0092d4bf1c9df1434a2c80f47faf GIT binary patch literal 1124 zcmaJ>O>fgc5S;{YqtFN;R1gBH3UL96lu%U^afxd;B@!uxn6|fQ<1FbS+v~0;ZNn+Y zNc4<2aNx@S;s?Mv7iPD%LsMEGEWe%i-h8e6y8>sPQ3))U`8$39<2x{dTP_dceX+F7 z5}yT2JGHgyDvV12llcO;0ONTWO-hG;Q0>No;0+CX%&$FLO-~F#VM_S=5Wwm*x0+t3 zq~EUX*;Z#`Ph}%{arPd|Fync0bWcMdxY{lMg6@B*UAEQN4bS z-}AmmPz|&A#xXjmru;Vc&R|DIsHBOPwSPmZP@9=Hc16^aM>%Zq&}GQ7s5gw8(ML(} zrdGOk``w$Cj08%RWp~$Y-{*;Tm@}O9OzZ?KNqBBeZ8b?r(d%iK$U{QQ06z+FuTF!Y zq1Od*1PjDxhC)V<4i3~|g{DuT(*@8LpBly8Owkb0<$TBRmoxq*$JcZP8Y19ZEaW=H zaqR__NA=Y0C=qQ`BI?g(tr?dGnTs9Af$&X{p1{D^oU8P)(JW+|Hp+OH3H)zYPYn0= zl*<%eNPcU`uX6IfJfby6+(*4#?H@mX>2{e}P2F<_3Cb{KxHMjQuDy|Q4E}X=d3Vsy z{qhlcEso4AH?FOvOQsYujAg_l%z4vM5^q|IYi~2f!UR`lCp + + {eb9174d8-8eb7-404a-aa40-9087616d6e0b} + dacvcl105.dpk + Release + AnyCPU + DCC32 + ..\..\Lib\D11\dacvcl105.bpl + + + 7.0 + False + True + False + 0 + RELEASE + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + + + 7.0 + False + True + False + 0 + All + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + + + Delphi.Personality + Package + +FalseTrueFalseCore Lab Data Access GUI related ComponentsFalseFalseFalseTrueFalse610110FalseFalseFalseFalseFalse10331252Core Lab6.10.1.106.10.1.10dacvcl105.dpk + + + + + MainSource + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/dacvcl105.res b/internal/4.10.0.10/1/Source/Delphi11/dacvcl105.res new file mode 100644 index 0000000000000000000000000000000000000000..1fbafc12c4031228b5f6dcf5353fcae6b1b8560d GIT binary patch literal 1532 zcmaJ=L2FY%5dK~h@~8)!pa;F!AR^*HQVmt;G|L zeNZ2#$JkeQj1O`^3xZvO-$No-Al`>_kkB`RjZ5`=si32{7!vk_f#Q(R3WC7lqW1Df z*eFg_g071@Y)n|sXo0#h71z%gDL`x#S2~JQBix_B2bIAD{~!oD03t zw+SU^OBF{KhmQiI+C02dI$Ik0YqCS%j_i2WTG}G*27LPkp8d|R<_P$F3@nB=ODr}s z{D(;_GUoWS#0gM31y0W3o!WNd%pT2H8CL=1Xx3iFb3DZgUeK1X#x)w_??PUKhio>j zuR>mthx+I(rAKcmhxjekr}8Ydfpu(heuh`vt!Rf$?N{Jl#<%3}GpTn8DO$WPY7|Iv zbuTq^aQUH*b?l*mZPZXkfom08tXzY^E;(P7lS7^-eN4+!gDAR>Y1UgJXNQlWME)n9 zxB~{GrUocWk#ELtG(;gu+5B`@?^^EDIz@^$aRR{Oy7@10W!JkqmIa?antMdx2uK^v+s>K^}-z%Bg>+(~NG OUnO(=-lvm4lYan?fgPOy literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi11/dcldac105.bdsproj b/internal/4.10.0.10/1/Source/Delphi11/dcldac105.bdsproj new file mode 100644 index 0000000..1680c84 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dcldac105.bdsproj @@ -0,0 +1,183 @@ + + + + + + + + + + + + dcldac105.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + Core Lab Data Access Components + + + + + + + + + + + False + + + + + + False + + + True + False + + + False + + + True + False + 6 + 10 + 1 + 5010 + False + False + False + False + False + 1049 + 1251 + + + + + 6.10.1.10 + + + + + + 6.10.1.10 + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/dcldac105.cfg b/internal/4.10.0.10/1/Source/Delphi11/dcldac105.cfg new file mode 100644 index 0000000..4865331 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dcldac105.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N0"." +-LE"." +-LN"." +-U"..\;..\Design\" +-O"..\;..\Design\" +-I"..\;..\Design\" +-R"..\;..\Design\" +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi11/dcldac105.dpk b/internal/4.10.0.10/1/Source/Delphi11/dcldac105.dpk new file mode 100644 index 0000000..1c300f5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dcldac105.dpk @@ -0,0 +1,47 @@ +package dcldac105; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE RELEASE} + +requires + rtl, + dac105, + dcldb, + dacvcl105, + vcl, + dbrtl, + vcldb, + vclactnband; + +contains + DacReg in '..\Design\DacReg.pas', + VTDesign in '..\Design\VTDesign.pas', + DAMenu in '..\Design\DAMenu.pas', + DADesign in '..\Design\DADesign.pas', + Download in '..\Design\Download.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi11/dcldac105.dproj b/internal/4.10.0.10/1/Source/Delphi11/dcldac105.dproj new file mode 100644 index 0000000..d9f6922 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dcldac105.dproj @@ -0,0 +1,549 @@ + + + {1ace60bb-2bff-4717-9389-4c2ab1bbb8f6} + dcldac105.dpk + Release + AnyCPU + DCC32 + ..\..\Lib\D11\dcldac105.bpl + + + 7.0 + False + False + 0 + RELEASE + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + + + 7.0 + False + False + 0 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + + + Delphi.Personality + Package + +FalseTrueFalseCore Lab Data Access ComponentsFalseTrueFalseTrueFalse610110FalseFalseFalseFalseFalse10331252Core Lab6.10.1.106.10.1.10dcldac105.dpk + + + + + MainSource + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/dcldac105.res b/internal/4.10.0.10/1/Source/Delphi11/dcldac105.res new file mode 100644 index 0000000000000000000000000000000000000000..1fbafc12c4031228b5f6dcf5353fcae6b1b8560d GIT binary patch literal 1532 zcmaJ=L2FY%5dK~h@~8)!pa;F!AR^*HQVmt;G|L zeNZ2#$JkeQj1O`^3xZvO-$No-Al`>_kkB`RjZ5`=si32{7!vk_f#Q(R3WC7lqW1Df z*eFg_g071@Y)n|sXo0#h71z%gDL`x#S2~JQBix_B2bIAD{~!oD03t zw+SU^OBF{KhmQiI+C02dI$Ik0YqCS%j_i2WTG}G*27LPkp8d|R<_P$F3@nB=ODr}s z{D(;_GUoWS#0gM31y0W3o!WNd%pT2H8CL=1Xx3iFb3DZgUeK1X#x)w_??PUKhio>j zuR>mthx+I(rAKcmhxjekr}8Ydfpu(heuh`vt!Rf$?N{Jl#<%3}GpTn8DO$WPY7|Iv zbuTq^aQUH*b?l*mZPZXkfom08tXzY^E;(P7lS7^-eN4+!gDAR>Y1UgJXNQlWME)n9 zxB~{GrUocWk#ELtG(;gu+5B`@?^^EDIz@^$aRR{Oy7@10W!JkqmIa?antMdx2uK^v+s>K^}-z%Bg>+(~NG OUnO(=-lvm4lYan?fgPOy literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.bdsproj b/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.bdsproj new file mode 100644 index 0000000..e535a09 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.bdsproj @@ -0,0 +1,172 @@ + + + + + + + + + + + + dclsdac105.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + . + . + + + d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\common files\borland shared\bds\shared assemblies\5.0;d:\Projects\Delphi\Dac\Source\;d:\Projects\Delphi\SDac\Source\;d:\Projects\Delphi\Dac\Source\Delphi10 + + sdac;MYBUILDER + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 5010 + False + False + False + False + False + + + + + + + 4.10.0.10 + + + + + + 4.10.0.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.cfg b/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.cfg new file mode 100644 index 0000000..94d171b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.cfg @@ -0,0 +1,43 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-E"." +-N"." +-LE"." +-LN"." +-U"..\Design;.." +-O"..\Design;.." +-I"..\Design;.." +-R"..\Design;.." +-Dsdac +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.dpk b/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.dpk new file mode 100644 index 0000000..37545c6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.dpk @@ -0,0 +1,56 @@ + +package dclsdac105; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE sdac} +{$DEFINE MYBUILDER} +{$DEFINE RELEASE} + +requires + sdac105, + dcldb, + dcldac105, + vcljpg, + sdacvcl105, + designide, + xmlrtl, + rtl, + vclactnband, + vclx, + vcl, + dbrtl, + vcldesigner, + dclstd, + vcldb, + dac105, + dacvcl105; + +contains + MSDesign in '..\Design\MSDesign.pas', + MSReg in '..\Design\MSReg.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.dproj b/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.dproj new file mode 100644 index 0000000..67eeeef --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.dproj @@ -0,0 +1,612 @@ + + + {b3c5ddcc-9704-4351-ad7b-5d16603319e1} + dclsdac105.dpk + Release + AnyCPU + DCC32 + ..\..\Lib\D11\dclsdac105.bpl + + + 7.0 + False + True + False + 0 + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + 4096,1048576 + . + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + sdac;MYBUILDER;RELEASE + True + True + True + ..\..\Lib\D11 + ..\..\Lib\D11 + + + 7.0 + False + True + False + 0 + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + 4096,1048576 + . + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + sdac;MYBUILDER + True + True + True + ..\..\Lib\D11 + ..\..\Lib\D11 + + + Delphi.Personality + Package + + + False + True + False + + + SQL Server Data Access Components + False + True + False + + + True + False + 4 + 10 + 0 + 10 + False + False + False + False + False + 1033 + 1252 + + + Core Lab + + 4.10.0.10 + + + + + Sdac + 4.10.0.10 + + + dclsdac105.dpk + + + + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.res b/internal/4.10.0.10/1/Source/Delphi11/dclsdac105.res new file mode 100644 index 0000000000000000000000000000000000000000..e554dced06f9653e55ce631c5ca73d83ad3991e7 GIT binary patch literal 1540 zcmaJ=O;1xn6g`jDzTiUI=t4Kr7-I|zQnU#g7HGgGBq+ujwzMjPq)?iI6vM)`mn>YklO+qnc8it{26jQ_2u)o zvJvS%4@K$|st0H8GUjsW0{o%dbsJY6sa*^P13IJ$*{s{Ry1vBdq)^C5N8SIAGu3`; zn4Vx?%?aKw0UZc-0sbK}r3&#boPmTRBiOi5|1cNy6xTw+ZqQd85;{Q;I9$_OevFOc zTq8Jeeus?-^BGOhGN$3`86ydZjp9a6aW2M3DZJn4r}+Cp&>M~??h8g3zZdiay%Dj; zemVz72h()>IaBklKRhnn?3qL1vmg!IQ@LJkhQrc^YF>e6Y#+M-GK2+xMn<9?Gb@i7 zC1^=)jwXta3cXr9oGFbRb^W#2fp23y9k-S`OT7)>euihi@vAujKAi%yp^g)ajt%~y z;)|3qJ~eX&)X#yl3wYQSilSF9G198GW;&&HFzi%^ZF{} z6?xc;-%>t)OC=<4X>X*=RLiJhh3hlC;%PxEtZ2Oo&mv#5zb+)-Rb;7%_gVFVR`I6g zyBez4K^yC6Vht7U8(3xLCJeSn|Dv1{%Dm}gYMDJqM-MQ{d~@V%@-fuO|Hxa{iB`3U zc-lM{u}JG1wM{U>i)+l&yN$P6yTu;X8PQapEM?vx;VzTgCOhGjF^MVmGpQ;k;Ev{( z-glJWWaW)iSHL~xEYiQGUg@*N-em%7c+W^DuGfV3nv6Q$F>aH48x3|7iQ_JXIb@Pj zH=3oOXez)2uCRlbyOISHA{# RqbBdMLFVxMN3%b&zX9)pA2 + + + + + + + + + + + sdac105.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True True + True + + + + 0 + 44 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components False + + + . + . + . + + d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\common files\borland shared\bds\shared assemblies\5.0;d:\Projects\Delphi\Dac\Source\;d:\Projects\Delphi\SDac\Source\ + + SDAC + + False + + + + + + False + + + + + + False + True + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 5010 + False + False + False + False + False 1033 + 1252 + + + Core Lab + + 4.10.0.10 + + + + + Sdac + 4.10.0.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/sdac105.bpi b/internal/4.10.0.10/1/Source/Delphi11/sdac105.bpi new file mode 100644 index 0000000000000000000000000000000000000000..8fd214cf5aea81e10a3ae128501270729416466f GIT binary patch literal 74100 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 + + {ea9ec1ce-8ace-4bc6-9d70-dfee1626f110} + sdac105.dpk + Release + AnyCPU + DCC32 + ..\..\Lib\D11\sdac105.bpl + + + 7.0 + False + True + False + 0 + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + 4096,1048576 + . + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + SDAC;RELEASE + True + True + True + ..\..\Lib\D11 + + + 7.0 + False + True + False + 0 + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + All + 4096,1048576 + . + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + ..\..\Lib\D11;..\ + SDAC + True + True + True + ..\..\Lib\D11 + + + Delphi.Personality + Package + +FalseTrueFalseSQL Server Data Access ComponentsFalseFalseTrueTrueFalse410010FalseFalseFalseFalseFalse10331252Core Lab4.10.0.10Sdac4.10.0.10sdac105.dpk + + + + + MainSource + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/sdac105.res b/internal/4.10.0.10/1/Source/Delphi11/sdac105.res new file mode 100644 index 0000000000000000000000000000000000000000..e554dced06f9653e55ce631c5ca73d83ad3991e7 GIT binary patch literal 1540 zcmaJ=O;1xn6g`jDzTiUI=t4Kr7-I|zQnU#g7HGgGBq+ujwzMjPq)?iI6vM)`mn>YklO+qnc8it{26jQ_2u)o zvJvS%4@K$|st0H8GUjsW0{o%dbsJY6sa*^P13IJ$*{s{Ry1vBdq)^C5N8SIAGu3`; zn4Vx?%?aKw0UZc-0sbK}r3&#boPmTRBiOi5|1cNy6xTw+ZqQd85;{Q;I9$_OevFOc zTq8Jeeus?-^BGOhGN$3`86ydZjp9a6aW2M3DZJn4r}+Cp&>M~??h8g3zZdiay%Dj; zemVz72h()>IaBklKRhnn?3qL1vmg!IQ@LJkhQrc^YF>e6Y#+M-GK2+xMn<9?Gb@i7 zC1^=)jwXta3cXr9oGFbRb^W#2fp23y9k-S`OT7)>euihi@vAujKAi%yp^g)ajt%~y z;)|3qJ~eX&)X#yl3wYQSilSF9G198GW;&&HFzi%^ZF{} z6?xc;-%>t)OC=<4X>X*=RLiJhh3hlC;%PxEtZ2Oo&mv#5zb+)-Rb;7%_gVFVR`I6g zyBez4K^yC6Vht7U8(3xLCJeSn|Dv1{%Dm}gYMDJqM-MQ{d~@V%@-fuO|Hxa{iB`3U zc-lM{u}JG1wM{U>i)+l&yN$P6yTu;X8PQapEM?vx;VzTgCOhGjF^MVmGpQ;k;Ev{( z-glJWWaW)iSHL~xEYiQGUg@*N-em%7c+W^DuGfV3nv6Q$F>aH48x3|7iQ_JXIb@Pj zH=3oOXez)2uCRlbyOISHA{# RqbBdMLFVxMN3%b&zX9)pA2 + + + + + + + + + + + sdacvcl105.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True True + True + + + + 0 + 44 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access GUI related Components False + + + . + . + + + d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\common files\borland shared\bds\shared assemblies\5.0;d:\Projects\Delphi\Dac\Source\;d:\Projects\Delphi\SDac\Source\ + + SDAC + + False + + + + + + False + + + + + + False + True + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 5010 + False + False + False + False + False 1033 + 1252 + + + 4.10.0.10 + Core Lab + + + + + + Sdac + 4.10.0.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.bpi b/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.bpi new file mode 100644 index 0000000000000000000000000000000000000000..398be38a239f7f349556892aa2d2e25f505221a1 GIT binary patch literal 2724 zcmd5-K~EDw6rNTsh@eChO^gD8dN5J62wE>>%Wg{=DG+u=Vob<%JCw!kPT3s`_0(e% zIU5fiy!yZV0ea@*o44I9-F92N*~6x9X1?!z`{uoGe@~H~U+Wf`D(NbB9A=6FcWb15 zkF>}gjoI}>Yi^r*Cbj2wGug!z(jF(|d@?~aLfX@$bw2J@sF``bvRJNLuyk84!Airl zyNi=@(G|9T=IcBmsr}++(bylCPc3KUQv3Nm8Ox`P$+t1`GeweDNax?xYe0S%Qcv^< zUF78>*uVrvvtD!#ID}I&UrEoICi6UqZ^(FSBd@Kg5TR;}!UG7<)_UXosZfP$O9I^2 zMJ0$QB%v%+xCzA*F7F;*cPW(4l=~=7wW;T^@VMUe-U_RGyaYmN75DM@JIkr?lMoHZ zi;g9NSAkHl8bq%M`H>*=O35?*%R2x~iUmh4YFnSFu(*>xK6V>7GGVw3g?BIhE= zg5`|By+>R=f-`z9MPU_<3R-4d(tE z^)6E9hEtbCX9iT;GC#_~jn-U6;+^5dIt!RJxENkV>ZR9OnPQ77hWg19yw=I?pXsYk z4l_L&o=M{!lEK%$iX4weamZ#HOprx_1too2PcLPA`>wYO`t-j*=*;lkQPkO^%d|Hz zPmlz7+6?;I_Z0b+OeGTJY=Mkyal|Gg*kqD?k!$|1b)AgqFhIK|OwNDljMLH?I}$H? zV%JB|!qlB@>Uzut>xgr~3$}?~-ZR;Ni&`amtLE3Hv%ABpmM7dMoF3tQxE*J18SIw_ zihM1wu1ne4GsN5vF{2GFn5rO4w~75RRMx}UjWtspv#y3&2XXkOwE>0kedT56i=Y^~ za4o0mMLWO!0a@4MSvNSX$S+>O<+Y&ZK6y3>6(ji9M;|zO?2GHP!6d!G1CGm+7f^d9 zUOQCPuZS+V%Qk6^4fdN75@q9w(q&V)9bsWfRbH!ehdKS9n7{yI-x`FyVa;tS4hIWb zLqSjD1!?TS?;KP!m?Ut~Km}lWynhIE8S~Hj2D}^)L_4nUwxfd)1t?L(*(@14dLU!4 T84_NtM&fa20 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.cfg b/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.cfg new file mode 100644 index 0000000..bb96df5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-JL +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-E"." +-N0"." +-LE"." +-LN"." +-U".." +-O".." +-I".." +-R".." +-DSDAC +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.dpk b/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.dpk new file mode 100644 index 0000000..45664a5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.dpk @@ -0,0 +1,38 @@ +package sdacvcl105; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access GUI related Components'} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} +{$DEFINE RELEASE} + +requires + rtl, + dacvcl105, + sdac105; + +contains + sdacVcl in '..\sdacVcl.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.dproj b/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.dproj new file mode 100644 index 0000000..c495a4e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.dproj @@ -0,0 +1,556 @@ + + + {4312a9f0-157d-4479-be7f-2f6686e7dd07} + sdacvcl105.dpk + Release + AnyCPU + DCC32 + ..\..\Lib\D11\sdacvcl105.bpl + + + 7.0 + False + True + False + 0 + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + 4096,1048576 + . + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + SDAC;RELEASE + True + True + True + ..\..\Lib\D11 + ..\..\Lib\D11 + + + 7.0 + False + True + False + 0 + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + All + 4096,1048576 + . + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + ..\..\Lib\D11;..\;..\Design + SDAC + True + True + True + ..\..\Lib\D11 + ..\..\Lib\D11 + + + Delphi.Personality + Package + +FalseTrueFalseSQL Server Data Access GUI related ComponentsFalseFalseFalseTrueFalse410010FalseFalseFalseFalseFalse103312524.10.0.10Core LabSdac4.10.0.10sdacvcl105.dpk + + + + + MainSource + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.res b/internal/4.10.0.10/1/Source/Delphi11/sdacvcl105.res new file mode 100644 index 0000000000000000000000000000000000000000..e554dced06f9653e55ce631c5ca73d83ad3991e7 GIT binary patch literal 1540 zcmaJ=O;1xn6g`jDzTiUI=t4Kr7-I|zQnU#g7HGgGBq+ujwzMjPq)?iI6vM)`mn>YklO+qnc8it{26jQ_2u)o zvJvS%4@K$|st0H8GUjsW0{o%dbsJY6sa*^P13IJ$*{s{Ry1vBdq)^C5N8SIAGu3`; zn4Vx?%?aKw0UZc-0sbK}r3&#boPmTRBiOi5|1cNy6xTw+ZqQd85;{Q;I9$_OevFOc zTq8Jeeus?-^BGOhGN$3`86ydZjp9a6aW2M3DZJn4r}+Cp&>M~??h8g3zZdiay%Dj; zemVz72h()>IaBklKRhnn?3qL1vmg!IQ@LJkhQrc^YF>e6Y#+M-GK2+xMn<9?Gb@i7 zC1^=)jwXta3cXr9oGFbRb^W#2fp23y9k-S`OT7)>euihi@vAujKAi%yp^g)ajt%~y z;)|3qJ~eX&)X#yl3wYQSilSF9G198GW;&&HFzi%^ZF{} z6?xc;-%>t)OC=<4X>X*=RLiJhh3hlC;%PxEtZ2Oo&mv#5zb+)-Rb;7%_gVFVR`I6g zyBez4K^yC6Vht7U8(3xLCJeSn|Dv1{%Dm}gYMDJqM-MQ{d~@V%@-fuO|Hxa{iB`3U zc-lM{u}JG1wM{U>i)+l&yN$P6yTu;X8PQapEM?vx;VzTgCOhGjF^MVmGpQ;k;Ev{( z-glJWWaW)iSHL~xEYiQGUg@*N-em%7c+W^DuGfV3nv6Q$F>aH48x3|7iQ_JXIb@Pj zH=3oOXez)2uCRlbyOISHA{# RqbBdMLFVxMN3%b&zX9)pA2f&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi5/dcldac50.cfg b/internal/4.10.0.10/1/Source/Delphi5/dcldac50.cfg new file mode 100644 index 0000000..b6bbb6b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi5/dcldac50.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"." +-LN"." +-U"..;..\Design\" +-O"..;..\Design\" +-I"..;..\Design\" +-R"..;..\Design\" +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi5/dcldac50.dof b/internal/4.10.0.10/1/Source/Delphi5/dcldac50.dof new file mode 100644 index 0000000..b2c47df --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi5/dcldac50.dof @@ -0,0 +1,94 @@ +[Compiler] +A=1 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=Core Lab Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..;..\Design;$(DELPHI)\source\toolsapi +Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inet50;NMFast50;webmid50;dclocx50;dcctd5;ip50_d5Trial;CRPack50;odac50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(DELPHI)\MyDac\Bin;$(DELPHI)\MyDac\Lib +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=1 +Item0=$(DELPHI)\Lib\Debug;$(DELPHI)\MyDac\Bin;$(DELPHI)\MyDac\Lib;d:\Projects\Delphi\Dac\Source\Design\;d:\Projects\Delphi\MyDac\Source\Design\ +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlOutputDirectorry] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi5/dcldac50.dpk b/internal/4.10.0.10/1/Source/Delphi5/dcldac50.dpk new file mode 100644 index 0000000..c6fd587 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi5/dcldac50.dpk @@ -0,0 +1,41 @@ +package dcldac50; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl50, + dac50, + dcldb50; + +contains + DacReg in '..\Design\DacReg.pas', + VTDesign in '..\Design\VTDesign.pas', + DADesign in '..\Design\DADesign.pas', + DAMenu in '..\Design\DAMenu.pas', + Download in '..\Design\Download.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi5/dcldac50.res b/internal/4.10.0.10/1/Source/Delphi5/dcldac50.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.cfg b/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.cfg new file mode 100644 index 0000000..1713b5e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\;..\..\..\Dac\Source\Delphi5;..\..\..\Dac\Source..;..\Design" +-O"..\;..\..\..\Dac\Source\Delphi5;..\..\..\Dac\Source..;..\Design" +-I"..\;..\..\..\Dac\Source\Delphi5;..\..\..\Dac\Source..;..\Design" +-R"..\;..\..\..\Dac\Source\Delphi5;..\..\..\Dac\Source..;..\Design" +-Dsdac +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.dof b/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.dof new file mode 100644 index 0000000..8eb4502 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.dof @@ -0,0 +1,92 @@ +[Compiler] +A=1 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=SQL Server Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\;..\..\..\Dac\Source\Delphi5;..\..\..\Dac\Source;..;..\Design +Packages= +Conditionals=sdac +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=2 +Item0=$(DELPHI)\Lib\Debug;d:\Projects\Delphi\SDAC\Source\;d:\Projects\Delphi\DAC\Source\ +Item1=d:\Projects\Delphi\SDAC\Source\;d:\Projects\Delphi\DAC\Source\ +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlOutputDirectorry] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.dpk b/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.dpk new file mode 100644 index 0000000..2f549fb --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.dpk @@ -0,0 +1,49 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for Delphi 5 +////////////////////////////////////////////////// + + +package dclsdac50; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE sdac} + +requires + dcldb50, + sdac50, + dcldac50, + VCLJPG50; + +contains + MSReg in '..\Design\MSReg.pas', + MSDesign in '..\Design\MSDesign.pas', + MSMenu in '..\Design\MSMenu.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.res b/internal/4.10.0.10/1/Source/Delphi5/dclsdac50.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi5/sdac50.cfg b/internal/4.10.0.10/1/Source/Delphi5/sdac50.cfg new file mode 100644 index 0000000..cbc007b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi5/sdac50.cfg @@ -0,0 +1,41 @@ +-$A+ +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\" +-Dsdac +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi5/sdac50.dof b/internal/4.10.0.10/1/Source/Delphi5/sdac50.dof new file mode 100644 index 0000000..f5cb057 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi5/sdac50.dof @@ -0,0 +1,95 @@ +[Compiler] +A=1 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=SQL Server Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi5;..\ +Packages= +Conditionals=sdac +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(DELPHI)\Sdac\Bin;$(DELPHI)\Sdac\Lib;d:\Projects\Delphi\Sdac\Source\;d:\Projects\Delphi\Dac\Source\ +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=2 +Item0=$(DELPHI)\Lib\Debug;$(DELPHI)\Sdac\Bin;$(DELPHI)\SdDac\Lib;d:\Projects\Delphi\Sdac\Source\;d:\Projects\Delphi\Dac\Source\ +Item1=$(DELPHI)\Sdac\Bin;$(DELPHI)\Sdac\Lib;d:\Projects\Delphi\Sdac\Source\;d:\Projects\Delphi\Dac\Source\ +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlOutputDirectorry] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi5/sdac50.dpk b/internal/4.10.0.10/1/Source/Delphi5/sdac50.dpk new file mode 100644 index 0000000..a273d83 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi5/sdac50.dpk @@ -0,0 +1,54 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for Delphi 5 +////////////////////////////////////////////////// + +package sdac50; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE sdac} + +requires + VCL50, + VCLDB50, + Vclbde50, + dac50; + +contains + SdacVcl in '..\SdacVcl.pas', + OLEDBAccess in '..\OLEDBAccess.pas', + MSAccess in '..\MSAccess.pas', + OLEDBC in '..\oledbc.pas', + MSSQLMonitor in '..\MSSQLMonitor.pas', + MSParser in '..\MSParser.pas', + OLEDBIntf in '..\OLEDBIntf.pas', + MSConsts in '..\MSConsts.pas', + MSScript in '..\MSScript.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi5/sdac50.res b/internal/4.10.0.10/1/Source/Delphi5/sdac50.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi6/Make.bat b/internal/4.10.0.10/1/Source/Delphi6/Make.bat new file mode 100644 index 0000000..6469054 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/Make.bat @@ -0,0 +1,10 @@ +@echo off +rem ********************************************************************** +rem * +rem * Sdac for Delphi 6 +rem * +rem ********************************************************************** + +set IdeDir="D:\Program Files\Borland\Delphi6 +del /Q/S SDAC\*.* +call ..\Make.bat Delphi 6 diff --git a/internal/4.10.0.10/1/Source/Delphi6/dac60.cfg b/internal/4.10.0.10/1/Source/Delphi6/dac60.cfg new file mode 100644 index 0000000..637cad2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dac60.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi6\Projects\Bpl" +-LN"." +-U"..\" +-O"..\" +-I"..\" +-R"..\" +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi6/dac60.dof b/internal/4.10.0.10/1/Source/Delphi6/dac60.dof new file mode 100644 index 0000000..3709d1f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dac60.dof @@ -0,0 +1,96 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=Core Lab Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\ +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= +[HistoryLists\hlConditionals] +Count=1 +Item0=ODAC +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlDCPOutput] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi6/dac60.dpk b/internal/4.10.0.10/1/Source/Delphi6/dac60.dpk new file mode 100644 index 0000000..2388304 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dac60.dpk @@ -0,0 +1,52 @@ +package dac60; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + dbrtl; + +contains + CRAccess in '..\CRAccess.pas', + CRParser in '..\CRParser.pas', + DAConsts in '..\DAConsts.pas', + DBMonitorIntf in '..\DBMonitorIntf.pas', + DBMonitorClient in '..\DBMonitorClient.pas', + DASQLMonitor in '..\DASQLMonitor.pas', + DBAccess in '..\DBAccess.pas', + MemData in '..\MemData.pas', + MemDS in '..\MemDS.pas', + VirtualTable in '..\VirtualTable.pas', + DAVersionInfo in '..\DAVersionInfo.pas', + MemUtils in '..\MemUtils.pas', + CLRClasses in '..\CLRClasses.pas', + DALoader in '..\DALoader.pas', + DAScript in '..\DAScript.pas', + DADump in '..\DADump.pas', + CRBatchMove in '..\CRBatchMove.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi6/dac60.res b/internal/4.10.0.10/1/Source/Delphi6/dac60.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.cfg b/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.cfg new file mode 100644 index 0000000..637cad2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi6\Projects\Bpl" +-LN"." +-U"..\" +-O"..\" +-I"..\" +-R"..\" +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.dof b/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.dof new file mode 100644 index 0000000..5bbc960 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.dof @@ -0,0 +1,96 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=Core Lab Data Access GUI related Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\ +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= +[HistoryLists\hlConditionals] +Count=1 +Item0=ODAC +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlDCPOutput] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.dpk b/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.dpk new file mode 100644 index 0000000..5065e96 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.dpk @@ -0,0 +1,36 @@ +package dacvcl60; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access GUI related Components'} +{$IMPLICITBUILD OFF} + +requires + rtl, + dac60, + vcl; + +contains + DacVcl in '..\DacVcl.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.res b/internal/4.10.0.10/1/Source/Delphi6/dacvcl60.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi6/dcldac60.cfg b/internal/4.10.0.10/1/Source/Delphi6/dcldac60.cfg new file mode 100644 index 0000000..98c7ad7 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dcldac60.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi6\Projects\Bpl" +-LN"." +-U"..;..\Design;d:\program files\borland\delphi6\Source\ToolsAPI" +-O"..;..\Design;d:\program files\borland\delphi6\Source\ToolsAPI" +-I"..;..\Design;d:\program files\borland\delphi6\Source\ToolsAPI" +-R"..;..\Design;d:\program files\borland\delphi6\Source\ToolsAPI" +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi6/dcldac60.dof b/internal/4.10.0.10/1/Source/Delphi6/dcldac60.dof new file mode 100644 index 0000000..8e7421e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dcldac60.dof @@ -0,0 +1,96 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=Core Lab Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..;..\Design;$(DELPHI)\Source\ToolsAPI +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= +[HistoryLists\hlConditionals] +Count=1 +Item0=ODAC +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlDCPOutput] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi6/dcldac60.dpk b/internal/4.10.0.10/1/Source/Delphi6/dcldac60.dpk new file mode 100644 index 0000000..b05c823 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dcldac60.dpk @@ -0,0 +1,42 @@ +package dcldac60; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + dac60, + dcldb, + dacvcl60; + +contains + DacReg in '..\Design\DacReg.pas', + VTDesign in '..\Design\VTDesign.pas', + DAMenu in '..\Design\DAMenu.pas', + DADesign in '..\Design\DADesign.pas', + Download in '..\Design\Download.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi6/dcldac60.res b/internal/4.10.0.10/1/Source/Delphi6/dcldac60.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.cfg b/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.cfg new file mode 100644 index 0000000..80c22ff --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\..\..\Dac\Source\delphi6;..\..\..\Dac\Source;..;..\Design" +-O"..\..\..\Dac\Source\delphi6;..\..\..\Dac\Source;..;..\Design" +-I"..\..\..\Dac\Source\delphi6;..\..\..\Dac\Source;..;..\Design" +-R"..\..\..\Dac\Source\delphi6;..\..\..\Dac\Source;..;..\Design" +-Dsdac +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.dof b/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.dof new file mode 100644 index 0000000..b2ae30b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.dof @@ -0,0 +1,84 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=SQL Server Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source\delphi6;..\..\..\Dac\Source;..;..\Design;$(DELPHI)\Source\ToolsAPI;$(DELPHI)\Source\Property Editors +Packages= +Conditionals=sdac +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= diff --git a/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.dpk b/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.dpk new file mode 100644 index 0000000..ffcdf65 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.dpk @@ -0,0 +1,49 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for Delphi 5 +////////////////////////////////////////////////// + +package dclsdac60; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE sdac} + +requires + sdac60, + dcldb, + dcldac60, + vcljpg, + sdacvcl60; + +contains + MSReg in '..\Design\MSReg.pas', + MSDesign in '..\Design\MSDesign.pas', + MSMenu in '..\Design\MSMenu.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.res b/internal/4.10.0.10/1/Source/Delphi6/dclsdac60.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi6/sdac60.cfg b/internal/4.10.0.10/1/Source/Delphi6/sdac60.cfg new file mode 100644 index 0000000..4906947 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/sdac60.cfg @@ -0,0 +1,42 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi6\Projects\Bpl" +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\delphi6;..\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\delphi6;..\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\delphi6;..\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\delphi6;..\" +-Dsdac +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi6/sdac60.dof b/internal/4.10.0.10/1/Source/Delphi6/sdac60.dof new file mode 100644 index 0000000..6aad23d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/sdac60.dof @@ -0,0 +1,84 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=SQL Server Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source;..\..\..\Dac\Source\delphi6;..\ +Packages= +Conditionals=sdac +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= diff --git a/internal/4.10.0.10/1/Source/Delphi6/sdac60.dpk b/internal/4.10.0.10/1/Source/Delphi6/sdac60.dpk new file mode 100644 index 0000000..c957d5c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/sdac60.dpk @@ -0,0 +1,50 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for Delphi 6 +////////////////////////////////////////////////// + +package sdac60; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE sdac} + +requires + dac60; + +contains + OLEDBAccess in '..\OLEDBAccess.pas', + MSAccess in '..\MSAccess.pas', + OLEDBC in '..\oledbc.pas', + MSSQLMonitor in '..\MSSQLMonitor.pas', + MSParser in '..\MSParser.pas', + OLEDBIntf in '..\OLEDBIntf.pas', + MSConsts in '..\MSConsts.pas', + MSScript in '..\MSScript.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi6/sdac60.res b/internal/4.10.0.10/1/Source/Delphi6/sdac60.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.cfg b/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.cfg new file mode 100644 index 0000000..d3ea2c9 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.cfg @@ -0,0 +1,42 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi6\Projects\Bpl" +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\" +-DSDAC +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.dof b/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.dof new file mode 100644 index 0000000..e43435b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.dof @@ -0,0 +1,103 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=SQL Server Data Access GUI related Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\ +Packages= +Conditionals=SDAC +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= +[HistoryLists\hlConditionals] +Count=2 +Item0=SDAC +Item1=SDAC_TEST;DEBUG +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=4 +Item0=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi6;..\ +Item1=$(DELPHI)\Lib\Debug;D:\Projects\Delphi\Sdac2\Source +Item2=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\;..\..\..\ODAC\source;..\..\..\ODAC\source\Delphi7 +Item3=$(DELPHI)\Lib\Debug +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlOutputDirectorry] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.dpk b/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.dpk new file mode 100644 index 0000000..85a47b2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.dpk @@ -0,0 +1,37 @@ +package sdacvcl60; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access GUI related Components'} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + dac60, + dacvcl60, + sdac60; + +contains + SdacVcl in '..\SdacVcl.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.res b/internal/4.10.0.10/1/Source/Delphi6/sdacvcl60.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi7/Make.bat b/internal/4.10.0.10/1/Source/Delphi7/Make.bat new file mode 100644 index 0000000..93ad5bd --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/Make.bat @@ -0,0 +1,10 @@ +@echo off +rem ********************************************************************** +rem * +rem * Sdac for Delphi 7 +rem * +rem ********************************************************************** + +set IdeDir="D:\Program Files\Borland\Delphi7 +del /Q/S SDAC\*.* +call ..\Make.bat Delphi 7 diff --git a/internal/4.10.0.10/1/Source/Delphi7/dac70.cfg b/internal/4.10.0.10/1/Source/Delphi7/dac70.cfg new file mode 100644 index 0000000..74e1cf6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dac70.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi7\Projects\Bpl" +-LN"." +-U"..\" +-O"..\" +-I"..\" +-R"..\" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi7/dac70.dof b/internal/4.10.0.10/1/Source/Delphi7/dac70.dof new file mode 100644 index 0000000..4780e49 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dac70.dof @@ -0,0 +1,145 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=Core Lab Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\ +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= +[HistoryLists\hlConditionals] +Count=1 +Item0=ODAC +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlDCPOutput] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi7/dac70.dpk b/internal/4.10.0.10/1/Source/Delphi7/dac70.dpk new file mode 100644 index 0000000..43c5429 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dac70.dpk @@ -0,0 +1,52 @@ +package dac70; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + dbrtl; + +contains + CRAccess in '..\CRAccess.pas', + DALoader in '..\DALoader.pas', + CRParser in '..\CRParser.pas', + DAConsts in '..\DAConsts.pas', + DBMonitorIntf in '..\DBMonitorIntf.pas', + DBMonitorClient in '..\DBMonitorClient.pas', + DASQLMonitor in '..\DASQLMonitor.pas', + DBAccess in '..\DBAccess.pas', + MemData in '..\MemData.pas', + MemDS in '..\MemDS.pas', + VirtualTable in '..\VirtualTable.pas', + DAVersionInfo in '..\DAVersionInfo.pas', + CLRClasses in '..\CLRClasses.pas', + MemUtils in '..\MemUtils.pas', + DAScript in '..\DAScript.pas', + DADump in '..\DADump.pas', + CRBatchMove in '..\CRBatchMove.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi7/dac70.res b/internal/4.10.0.10/1/Source/Delphi7/dac70.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.cfg b/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.cfg new file mode 100644 index 0000000..6f6cdec --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"d:\program files\borland\delphi7\Projects\Bpl" +-LN"d:\program files\borland\delphi7\Projects\Bpl" +-U"d:\program files\borland\delphi7\Lib\Debug;D:\Crypto\!SSH_Source;D:\Projects\Delphi\Dac\Source\Design" +-O"d:\program files\borland\delphi7\Lib\Debug;D:\Crypto\!SSH_Source;D:\Projects\Delphi\Dac\Source\Design" +-I"d:\program files\borland\delphi7\Lib\Debug;D:\Crypto\!SSH_Source;D:\Projects\Delphi\Dac\Source\Design" +-R"d:\program files\borland\delphi7\Lib\Debug;D:\Crypto\!SSH_Source;D:\Projects\Delphi\Dac\Source\Design" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.dof b/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.dof new file mode 100644 index 0000000..3c9e2f6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.dof @@ -0,0 +1,145 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=Core Lab Data Access GUI related Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\ +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +Comments= +[HistoryLists\hlConditionals] +Count=1 +Item0=ODAC +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlDCPOutput] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.dpk b/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.dpk new file mode 100644 index 0000000..c596b09 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.dpk @@ -0,0 +1,36 @@ +package dacvcl70; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access GUI related Components'} +{$IMPLICITBUILD OFF} + +requires + rtl, + dac70, + vcl; + +contains + DacVcl in '..\DacVcl.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.res b/internal/4.10.0.10/1/Source/Delphi7/dacvcl70.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi7/dcldac70.cfg b/internal/4.10.0.10/1/Source/Delphi7/dcldac70.cfg new file mode 100644 index 0000000..136d63a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dcldac70.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LE"d:\program files\borland\delphi7\Projects\Bpl" +-LN"." +-U"..\;d:\program files\borland\delphi7\Source\ToolsAPI;..\Design" +-O"..\;d:\program files\borland\delphi7\Source\ToolsAPI;..\Design" +-I"..\;d:\program files\borland\delphi7\Source\ToolsAPI;..\Design" +-R"..\;d:\program files\borland\delphi7\Source\ToolsAPI;..\Design" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi7/dcldac70.dof b/internal/4.10.0.10/1/Source/Delphi7/dcldac70.dof new file mode 100644 index 0000000..8f9c382 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dcldac70.dof @@ -0,0 +1,148 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=Core Lab Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\;$(DELPHI)\Source\ToolsAPI;..\Design +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=6 +MinorVer=10 +Release=1 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=6.10.1.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=DAC +ProductVersion=6.10.1.10 +[HistoryLists\hlConditionals] +Count=1 +Item0=ODAC +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=2 +Item0=..\;$(DELPHI)\Source\ToolsAPI;..\Design +Item1=..\;.\Design;$(DELPHI)\Source\ToolsAPI +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlDCPOutput] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi7/dcldac70.dpk b/internal/4.10.0.10/1/Source/Delphi7/dcldac70.dpk new file mode 100644 index 0000000..8b33f95 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dcldac70.dpk @@ -0,0 +1,52 @@ +package dcldac70; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + dac70, + dcldb, + dacvcl70, + vcl, + dbrtl, + visualclx, + vcldb, + visualdbclx, + designide, + vclactnband, + vcldesigner, + designdgm, + dclstd; + +contains + DacReg in '..\Design\DacReg.pas', + VTDesign in '..\Design\VTDesign.pas', + DAMenu in '..\Design\DAMenu.pas', + DADesign in '..\Design\DADesign.pas', + Download in '..\Design\Download.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi7/dcldac70.res b/internal/4.10.0.10/1/Source/Delphi7/dcldac70.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.cfg b/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.cfg new file mode 100644 index 0000000..80861d8 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\..\..\Dac\Source\delphi7;..\..\..\Dac\Source;..;..\Design" +-O"..\..\..\Dac\Source\delphi7;..\..\..\Dac\Source;..;..\Design" +-I"..\..\..\Dac\Source\delphi7;..\..\..\Dac\Source;..;..\Design" +-R"..\..\..\Dac\Source\delphi7;..\..\..\Dac\Source;..;..\Design" +-Dsdac +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.dof b/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.dof new file mode 100644 index 0000000..cea6d87 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.dof @@ -0,0 +1,142 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=SQL Server Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source\delphi7;..\..\..\Dac\Source;..;..\Design +Packages= +Conditionals=sdac +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName= +FileDescription=Core Lab +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlOutputDirectorry] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.dpk b/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.dpk new file mode 100644 index 0000000..ab320cc --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.dpk @@ -0,0 +1,50 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for Delphi 7 +////////////////////////////////////////////////// + +package dclsdac70; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE sdac} + +requires + sdac70, + dcldb, + dcldac70, + vcljpg, + sdacvcl70, + designide; + +contains + MSReg in '..\Design\MSReg.pas', + MSDesign in '..\Design\MSDesign.pas', + MSMenu in '..\Design\MSMenu.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.res b/internal/4.10.0.10/1/Source/Delphi7/dclsdac70.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi7/sdac70.cfg b/internal/4.10.0.10/1/Source/Delphi7/sdac70.cfg new file mode 100644 index 0000000..e4d4ef0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/sdac70.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\delphi7;..\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\delphi7;..\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\delphi7;..\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\delphi7;..\" +-Dsdac +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi7/sdac70.dof b/internal/4.10.0.10/1/Source/Delphi7/sdac70.dof new file mode 100644 index 0000000..d11e882 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/sdac70.dof @@ -0,0 +1,145 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=SQL Server Data Access Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source;..\..\..\Dac\Source\delphi7;..\ +Packages= +Conditionals=sdac +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=1 +Item0=$(DELPHI)\Lib\Debug +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=. +[HistoryLists\hlOutputDirectorry] +Count=1 +Item0=. diff --git a/internal/4.10.0.10/1/Source/Delphi7/sdac70.dpk b/internal/4.10.0.10/1/Source/Delphi7/sdac70.dpk new file mode 100644 index 0000000..78e1bb3 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/sdac70.dpk @@ -0,0 +1,49 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for Delphi 7 +////////////////////////////////////////////////// + +package sdac70; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE sdac} + +requires + dac70; + +contains + OLEDBAccess in '..\OLEDBAccess.pas', + MSAccess in '..\MSAccess.pas', + OLEDBC in '..\oledbc.pas', + MSSQLMonitor in '..\MSSQLMonitor.pas', + MSParser in '..\MSParser.pas', + MSConsts in '..\MSConsts.pas', + MSScript in '..\MSScript.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi7/sdac70.res b/internal/4.10.0.10/1/Source/Delphi7/sdac70.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.cfg b/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.cfg new file mode 100644 index 0000000..8a65795 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.cfg @@ -0,0 +1,44 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\" +-DSDAC +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.dof b/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.dof new file mode 100644 index 0000000..120220b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.dof @@ -0,0 +1,130 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=SQL Server Data Access GUI related Components +[Directories] +OutputDir= +UnitOutputDir=. +PackageDLLOutputDir= +PackageDCPOutputDir=. +SearchPath=..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi7;..\ +Packages= +Conditionals=SDAC +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=4 +MinorVer=10 +Release=0 +Build=10 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +[Version Info Keys] +CompanyName=Core Lab +FileDescription= +FileVersion=4.10.0.10 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=SDAC +ProductVersion=4.10.0.10 +Comments= diff --git a/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.dpk b/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.dpk new file mode 100644 index 0000000..e691fb9 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.dpk @@ -0,0 +1,38 @@ +package sdacvcl70; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access GUI related Components'} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + dac70, + dacvcl70, + sdac70; + +contains + SdacVcl in '..\SdacVcl.pas', + MSConnectForm in '..\MSConnectForm.pas' {MSConnectForm}; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.res b/internal/4.10.0.10/1/Source/Delphi7/sdacvcl70.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.bdsproj b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.bdsproj new file mode 100644 index 0000000..1ddac1e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.bdsproj @@ -0,0 +1,197 @@ + + + + + + + + + + + + CoreLab.Dac.AdoNet.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac + False + + False + True + False + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + 4096 + 1048576 + 4194304 + Core Lab Data Access Components + False + + + + . + + . + .\;..\Net;..\ + CoreLab.Dac;Borland.VclDbRtl;d:\winnt\microsoft.net\framework\v1.1.4322\System.Data.dll;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 2010 + False + False + False + False + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.cfg b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.cfg new file mode 100644 index 0000000..2945e3d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.cfg @@ -0,0 +1,46 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U".\;..\Net;..\" +-O".\;..\Net;..\" +-I".\;..\Net;..\" +-R".\;..\Net;..\" +-Z +-w-SYMBOL_DEPRECATED +-w-SYMBOL_PLATFORM +-w-UNIT_PLATFORM +-w-CASE_LABEL_RANGE diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.dpk b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.dpk new file mode 100644 index 0000000..a309f38 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.AdoNet.dpk @@ -0,0 +1,97 @@ +package CoreLab.Dac.AdoNet; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + System.Data, + Borland.VclDbRtl, + CoreLab.Dac; + +contains + CoreLab.Dac.DataAdapter in '..\Net\CoreLab.Dac.DataAdapter.pas'; + +[assembly: AssemblyTitle('CoreLab.Dac.AdoNet')] +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.2010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.bdsproj b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.bdsproj new file mode 100644 index 0000000..9779f3d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.bdsproj @@ -0,0 +1,202 @@ + + + + + + + + + + + + CoreLab.Dac.Design.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + CoreLab.Dac;CoreLab.Dac.Design + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + Data Access Components + + + + . + + . + ..\Design;.\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\program files\borland\bds\2.0\bin;D:\Projects\Delphi\Dac\Source\Delphi8 + Borland.Vcl.Design.DbRtl;Borland.VclDbCtrls;Borland.Studio.Vcl.Design;D:\Projects\Delphi\Dac\Source\Delphi8\CoreLab.Dac.dll;Borland.VclRtl;Borland.Vcl;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 2010 + False + False + False + False + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.cfg b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.cfg new file mode 100644 index 0000000..3d69376 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.cfg @@ -0,0 +1,40 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSCoreLab.Dac;CoreLab.Dac.Design +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\Design;.\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\program files\borland\bds\2.0\bin;D:\Projects\Delphi\Dac\Source\Delphi8" +-O"..\Design;.\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\program files\borland\bds\2.0\bin;D:\Projects\Delphi\Dac\Source\Delphi8" +-I"..\Design;.\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\program files\borland\bds\2.0\bin;D:\Projects\Delphi\Dac\Source\Delphi8" +-R"..\Design;.\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\projects\delphi\dac\source\delphi8;d:\program files\borland\bds\2.0\bin;D:\Projects\Delphi\Dac\Source\Delphi8" diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.dpk b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.dpk new file mode 100644 index 0000000..074c0e3 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.Design.dpk @@ -0,0 +1,129 @@ +package CoreLab.Dac.Design; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + Borland.Vcl, + Borland.VclRtl, + CoreLab.Dac, + Borland.Studio.Vcl.Design, + Borland.Studio.ToolsAPI, + Borland.VclDbCtrls, + Borland.Vcl.Design.DbRtl; + +contains + CoreLab.Dac.Design.DacReg in '..\Net\CoreLab.Dac.Design.DacReg.pas', + CoreLab.Dac.Design.VTDesign in '..\Net\CoreLab.Dac.Design.VTDesign.pas', + CoreLab.Dac.Design.DAMenu in '..\Net\CoreLab.Dac.Design.DAMenu.pas', + CoreLab.Dac.Design.DADesign in '..\Net\CoreLab.Dac.Design.DADesign.pas', + CoreLab.Dac.Design.DAUpdateSQLFrame in '..\Net\CoreLab.Dac.Design.DAUpdateSQLFrame.pas', + CoreLab.Dac.Design.CRFrame in '..\Net\CoreLab.Dac.Design.CRFrame.pas', + CoreLab.Dac.Design.CRColFrame in '..\Net\CoreLab.Dac.Design.CRColFrame.pas', + CoreLab.Dac.Design.CRTabEditor in '..\Net\CoreLab.Dac.Design.CRTabEditor.pas', + CoreLab.Dac.Design.DAConnectionEditor in '..\Net\CoreLab.Dac.Design.DAConnectionEditor.pas', + CoreLab.Dac.Design.CRDataEditor in '..\Net\CoreLab.Dac.Design.CRDataEditor.pas', + CoreLab.Dac.Design.DADataEditor in '..\Net\CoreLab.Dac.Design.DADataEditor.pas', + CoreLab.Dac.Design.DAMacrosFrame in '..\Net\CoreLab.Dac.Design.DAMacrosFrame.pas', + CoreLab.Dac.Design.DAParamsFrame in '..\Net\CoreLab.Dac.Design.DAParamsFrame.pas', + CoreLab.Dac.Design.DAParamValueEditor in '..\Net\CoreLab.Dac.Design.DAParamValueEditor.pas', + CoreLab.Dac.Design.DAQueryEditor in '..\Net\CoreLab.Dac.Design.DAQueryEditor.pas', + CoreLab.Dac.Design.DADualListEditor in '..\Net\CoreLab.Dac.Design.DADualListEditor.pas', + CoreLab.Dac.Design.DADumpProgress in '..\Net\CoreLab.Dac.Design.DADumpProgress.pas', + CoreLab.Dac.Design.DADumpEditor in '..\Net\CoreLab.Dac.Design.DADumpEditor.pas', + CoreLab.Dac.Design.DASPCallFrame in '..\Net\CoreLab.Dac.Design.DASPCallFrame.pas', + CoreLab.Dac.Design.DASQLEditor in '..\Net\CoreLab.Dac.Design.DASQLEditor.pas', + CoreLab.Dac.Design.DASQLFrame in '..\Net\CoreLab.Dac.Design.DASQLFrame.pas', + CoreLab.Dac.Design.DASQLGeneratorFrame in '..\Net\CoreLab.Dac.Design.DASQLGeneratorFrame.pas', + CoreLab.Dac.Design.DATableEditor in '..\Net\CoreLab.Dac.Design.DATableEditor.pas', + CoreLab.Dac.Design.CREditor in '..\Net\CoreLab.Dac.Design.CREditor.pas', + CoreLab.Dac.Design.DADesignUtils in '..\Net\CoreLab.Dac.Design.DADesignUtils.pas', + CoreLab.Dac.Design.DAUpdateSQLEditor in '..\Net\CoreLab.Dac.Design.DAUpdateSQLEditor.pas', + CoreLab.Dac.Design.DAScriptEditor in '..\Net\CoreLab.Dac.Design.DAScriptEditor.pas', + CoreLab.Dac.Design.DAStoredProcEditor in '..\Net\CoreLab.Dac.Design.DAStoredProcEditor.pas', + CoreLab.Dac.Design.VTDataEditor in '..\Net\CoreLab.Dac.Design.VTDataEditor.pas', + CoreLab.Dac.Design.Download in '..\Net\CoreLab.Dac.Design.Download.pas', + CoreLab.Dac.Design.HelpUtils in '..\Net\CoreLab.Dac.Design.HelpUtils.pas'; + +[assembly: AssemblyTitle('Core Lab Data Access Components')] +[assembly: AssemblyDescription('Core Lab Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.2010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.bdsproj b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.bdsproj new file mode 100644 index 0000000..dda35b6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.bdsproj @@ -0,0 +1,197 @@ + + + + + + + + + + + + CoreLab.Dac.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + + True + + + 0 + 0 + 1 + False + False + 4096 + 1048576 + 4194304 + Core Lab Data Access Components + False + + + + . + + . + ..\Net;.. + Borland.VclRtl;Borland.VclDbRtl;Borland.Vcl;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + True + False + 6 + 10 + 1 + 2010 + False + False + False + False + False + + + Core Lab + + 6.10.1.10 + + + + + DAC + 6.10.1.10 + + + + + $00000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.cfg b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.cfg new file mode 100644 index 0000000..b5a3f4f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.cfg @@ -0,0 +1,41 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\Net;.." +-O"..\Net;.." +-I"..\Net;.." +-R"..\Net;.." +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.dpk b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.dpk new file mode 100644 index 0000000..c013ecd --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Dac.dpk @@ -0,0 +1,108 @@ +package CoreLab.Dac; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + Borland.Vcl, + Borland.VclDbRtl, + Borland.VclRtl; + +contains + CoreLab.Dac.VirtualTable in '..\Net\CoreLab.Dac.VirtualTable.pas', + CoreLab.Dac.CRParser in '..\Net\CoreLab.Dac.CRParser.pas', + CoreLab.Dac.DAConsts in '..\Net\CoreLab.Dac.DAConsts.pas', + CoreLab.Dac.DacVcl in '..\Net\CoreLab.Dac.DacVcl.pas', + CoreLab.Dac.DALoader in '..\Net\CoreLab.Dac.DALoader.pas', + CoreLab.Dac.DADump in '..\Net\CoreLab.Dac.DADump.pas', + CoreLab.Dac.DASQLMonitor in '..\Net\CoreLab.Dac.DASQLMonitor.pas', + CoreLab.Dac.DBAccess in '..\Net\CoreLab.Dac.DBAccess.pas', + CoreLab.Dac.DBMonitorClient in '..\Net\CoreLab.Dac.DBMonitorClient.pas', + CoreLab.Dac.DBMonitorIntf in '..\Net\CoreLab.Dac.DBMonitorIntf.pas', + CoreLab.Dac.MemData in '..\Net\CoreLab.Dac.MemData.pas', + CoreLab.Dac.MemDS in '..\Net\CoreLab.Dac.MemDS.pas', + CoreLab.Dac.MemUtils in '..\Net\CoreLab.Dac.MemUtils.pas', + CoreLab.Dac.CRAccess in '..\Net\CoreLab.Dac.CRAccess.pas', + CoreLab.Dac.Win32Timer in '..\Net\CoreLab.Dac.Win32Timer.pas', + CoreLab.Dac.CRConnectionPool in '..\Net\CoreLab.Dac.CRConnectionPool.pas', + CoreLab.Dac.DAScript in '..\Net\CoreLab.Dac.DAScript.pas', + CoreLab.Dac.CRBatchMove in '..\Net\CoreLab.Dac.CRBatchMove.pas'; + +[assembly: AssemblyTitle('Core Lab Data Access Components')] +[assembly: AssemblyDescription('Core Lab Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +//[assembly: CLSCompliant(true)] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.2010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.bdsproj b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.bdsproj new file mode 100644 index 0000000..39dbe2d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.bdsproj @@ -0,0 +1,176 @@ + + + + + + + + + + + + CoreLab.Sdac.AdoNet.dpk + + + + + + + + + + + + + + + + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + + + + + d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\delphi\sdac\source\delphi8 + d:\winnt\microsoft.net\framework\v1.1.4322\System.Drawing.dll;CoreLab.Sdac;Borland.VclDbRtl;d:\winnt\microsoft.net\framework\v1.1.4322\System.Data.dll;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 4 + 10 + 0 + 2010 + False + False + False + False + False + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.cfg b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.cfg new file mode 100644 index 0000000..92711a5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.cfg @@ -0,0 +1,41 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.Sdac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\;..\Net" +-O"..\;..\Net" +-I"..\;..\Net" +-R"..\;..\Net" diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.dpk b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.dpk new file mode 100644 index 0000000..64b6599 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.AdoNet.dpk @@ -0,0 +1,99 @@ +package CoreLab.Sdac.AdoNet; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + System.Data, + Borland.VclDbRtl, + CoreLab.Sdac, + CoreLab.Dac.AdoNet; + +contains + CoreLab.Sdac.Design.DataAdapter in '..\Net\CoreLab.Sdac.Design.DataAdapter.pas' {CoreLab.Sdac.Design.DataAdapter.MyDataAdapter: CoreLab.Sdac.Design.DataAdapter.MyDataAdapter}, + CoreLab.Sdac.DataAdapter in '..\Net\CoreLab.Sdac.DataAdapter.pas' {CoreLab.Sdac.AdoNetAdapter.MSDataAdapter: CoreLab.Dac.DataAdapter.DADataAdapter}; + +[assembly: AssemblyTitle('CoreLab.Sdac.AdoNet')] +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('SQL Server Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('4.10.0.2010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.bdsproj b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.bdsproj new file mode 100644 index 0000000..d38f5b4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.bdsproj @@ -0,0 +1,189 @@ + + + + + + + + + + + + CoreLab.Sdac.Design.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac;CoreLab.Sdac;CoreLab.Dac.Design;CoreLab.Sdac.Design + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + + . + + . + d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\program files\borland\bds\2.0\bin;d:\projects\delphi\Dac\source\delphi8;d:\Projects\Delphi\Sdac\Source\Delphi8;d:\winnt\microsoft.net\framework\v1.1.4322;..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi8;d:\projects\delphi\Sdac\source\delphi8;d:\projects\delphi\dac\source\delphi8;d:\projects\delphi\sdac\source\delphi8 + CoreLab.Sdac.AdoNet;d:\winnt\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll;CoreLab.Sdac;CoreLab.Dac.Design;Borland.Vcl.Design.Standard;Borland.Vcl.Design.DbRtl;Borland.Studio.Vcl.Design;d:\program files\borland\bds\2.0\bin\Borland.Studio.ToolsAPI.dll;Borland.Delphi + SDAC + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 2010 + False + False + False + False + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.cfg b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.cfg new file mode 100644 index 0000000..f0e9cef --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.cfg @@ -0,0 +1,41 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.Sdac;CoreLab.Dac.Design;CoreLab.Sdac.Design +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U".\;..\Net;..\Design;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi8" +-O".\;..\Net;..\Design;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi8" +-I".\;..\Net;..\Design;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi8" +-R".\;..\Net;..\Design;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi8" +-DSDAC-Z \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.dpk b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.dpk new file mode 100644 index 0000000..835635e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.Design.dpk @@ -0,0 +1,114 @@ +package CoreLab.Sdac.Design; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + Borland.Delphi, + Borland.Studio.ToolsAPI, + Borland.Studio.Vcl.Design, + Borland.Vcl.Design.DbRtl, + Borland.Vcl.Design.Standard, + CoreLab.Dac.Design, + CoreLab.Sdac, + System.Windows.Forms, + CoreLab.Sdac.AdoNet; + +contains + CoreLab.Sdac.Design.SdacAbout in '..\Net\CoreLab.Sdac.Design.SdacAbout.pas', + CoreLab.Sdac.Design.MSConnectionEditor in '..\Net\CoreLab.Sdac.Design.MSConnectionEditor.pas', + CoreLab.Sdac.Design.MSParamsFrame in '..\Net\CoreLab.Sdac.Design.MSParamsFrame.pas', + CoreLab.Sdac.Design.MSQueryEditor in '..\Net\CoreLab.Sdac.Design.MSQueryEditor.pas', + CoreLab.Sdac.Design.MSNamesEditor in '..\Net\CoreLab.Sdac.Design.MSNamesEditor.pas', + CoreLab.Sdac.Design.MSDumpEditor in '..\Net\CoreLab.Sdac.Design.MSDumpEditor.pas', + CoreLab.Sdac.Design.MSSPCallFrame in '..\Net\CoreLab.Sdac.Design.MSSPCallFrame.pas', + CoreLab.Sdac.Design.MSSQLEditor in '..\Net\CoreLab.Sdac.Design.MSSQLEditor.pas', + CoreLab.Sdac.Design.MSStoredProcEditor in '..\Net\CoreLab.Sdac.Design.MSStoredProcEditor.pas', + CoreLab.Sdac.Design.MSUpdateSQLEditor in '..\Net\CoreLab.Sdac.Design.MSUpdateSQLEditor.pas', + CoreLab.Sdac.Design.MSDesign in '..\Net\CoreLab.Sdac.Design.MSDesign.pas', + CoreLab.Sdac.Design.MSDesignUtils in '..\Net\CoreLab.Sdac.Design.MSDesignUtils.pas', + CoreLab.Sdac.Design.MSMenu in '..\Net\CoreLab.Sdac.Design.MSMenu.pas', + CoreLab.Sdac.Design.MSReg in '..\Net\CoreLab.Sdac.Design.MSReg.pas'; + +[assembly: AssemblyTitle('SQL Server Data Access Components')] +[assembly: AssemblyDescription('SQL Server Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('SQL Server Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('4.10.0.2010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.bdsproj b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.bdsproj new file mode 100644 index 0000000..25e38d4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.bdsproj @@ -0,0 +1,181 @@ + + + + + + + + + + + + CoreLab.Sdac.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + + . + . + + .\;..\Net;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\Net\D8;..\..\..\Dac\Source\Delphi8 + CoreLab.Dac;Borland.VclRtl;Borland.VclDbRtl;Borland.Delphi;Borland.Vcl + SDAC + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 2010 + False + False + False + False + False + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.cfg b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.cfg new file mode 100644 index 0000000..2021c4e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.cfg @@ -0,0 +1,43 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.Sdac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\;..\Net" +-O"..\;..\Net" +-I"..\;..\Net" +-R"..\;..\Net" +-DSDAC +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.dpk b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.dpk new file mode 100644 index 0000000..56296af --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/CoreLab.Sdac.dpk @@ -0,0 +1,107 @@ +package CoreLab.Sdac; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + Borland.Delphi, + Borland.Vcl, + Borland.VclDbRtl, + Borland.VclRtl, + CoreLab.Dac; + +contains + CoreLab.Sdac.SdacVcl in '..\Net\CoreLab.Sdac.SdacVcl.pas', + CoreLab.Sdac.OLEDBIntf in '..\Net\CoreLab.Sdac.OLEDBIntf.pas', + CoreLab.Sdac.MSAccess in '..\Net\CoreLab.Sdac.MSAccess.pas', + CoreLab.Sdac.MSConnectForm in '..\Net\CoreLab.Sdac.MSConnectForm.pas', + CoreLab.Sdac.MSConnectionPool in '..\Net\CoreLab.Sdac.MSConnectionPool.pas', + CoreLab.Sdac.MSConsts in '..\Net\CoreLab.Sdac.MSConsts.pas', + CoreLab.Sdac.MSParser in '..\Net\CoreLab.Sdac.MSParser.pas', + CoreLab.Sdac.MSLoader in '..\Net\CoreLab.Sdac.MSLoader.pas', + CoreLab.Sdac.MSDump in '..\Net\CoreLab.Sdac.MSDump.pas', + CoreLab.Sdac.MSScript in '..\Net\CoreLab.Sdac.MSScript.pas', + CoreLab.Sdac.CRThread in '..\Net\CoreLab.Sdac.CRThread.pas', + CoreLab.Sdac.MSServiceBroker in '..\Net\CoreLab.Sdac.MSServiceBroker.pas', + CoreLab.Sdac.MSSQLMonitor in '..\Net\CoreLab.Sdac.MSSQLMonitor.pas', + CoreLab.Sdac.OLEDBAccess in '..\Net\CoreLab.Sdac.OLEDBAccess.pas', + CoreLab.Sdac.OLEDBC in '..\Net\CoreLab.Sdac.OLEDBC.pas'; + +[assembly: AssemblyTitle('SQL Server Data Access Components')] +[assembly: AssemblyDescription('SQL Server Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('SQL Server Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +//[assembly: CLSCompliant(true)] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('4.10.0.2010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi8/Make.bat b/internal/4.10.0.10/1/Source/Delphi8/Make.bat new file mode 100644 index 0000000..f80733e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi8/Make.bat @@ -0,0 +1,10 @@ +@echo off +rem ********************************************************************** +rem * +rem * Sdac for Delphi 8 +rem * +rem ********************************************************************** + +set IdeDir="D:\Program Files\Borland\BDS\2.0 +del /Q/S SDAC\*.* +call ..\Make.bat Delphi 8 CLR diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.bdsproj new file mode 100644 index 0000000..1cc4a19 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.bdsproj @@ -0,0 +1,170 @@ + + + + + + + + + + + + CoreLab.Dac.AdoNet.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac + False + + False + True + False + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + 4096 + 1048576 + 4194304 + Core Lab Data Access Components + False + + + + . + + . + .\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\delphi\dac\source\delphi9 + CoreLab.Dac;Borland.VclDbRtl;d:\winnt\microsoft.net\framework\v1.1.4322\System.Data.dll;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 3010 + False + False + False + False + False + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.cfg b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.cfg new file mode 100644 index 0000000..83f5c2e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.cfg @@ -0,0 +1,45 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U".\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\winnt\microsoft.net\framework\v1.1.4322;d:\projects\delphi\dac\source\delphi9" +-O".\;..\Net;..\" +-I".\;..\Net;..\" +-R".\;..\Net;..\" +-w-SYMBOL_DEPRECATED +-w-SYMBOL_PLATFORM +-w-UNIT_PLATFORM +-w-CASE_LABEL_RANGE diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.dpk b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.dpk new file mode 100644 index 0000000..7b31c88 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.AdoNet.dpk @@ -0,0 +1,97 @@ +package CoreLab.Dac.AdoNet; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + System.Data, + Borland.VclDbRtl, + CoreLab.Dac; + +contains + CoreLab.Dac.DataAdapter in '..\Net\CoreLab.Dac.DataAdapter.pas'; + +[assembly: AssemblyTitle('CoreLab.Dac.AdoNet')] +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.3010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.bdsproj new file mode 100644 index 0000000..9a0234f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.bdsproj @@ -0,0 +1,205 @@ + + + + + + + + + + + + CoreLab.Dac.Design.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + CoreLab.Dac;CoreLab.Dac.Design + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + Data Access Components + + + + . + + . + ..\Design;.\;..\Net;..\;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\program files\borland\bds\3.0\bin;d:\projects\delphi\dac\source\delphi9 + Borland.Vcl.Design.DbRtl;Borland.VclDbCtrls;Borland.Studio.Vcl.Design;CoreLab.Dac;Borland.VclRtl;Borland.Vcl;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 3010 + False + False + False + False + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.cfg b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.cfg new file mode 100644 index 0000000..83ff37c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.cfg @@ -0,0 +1,40 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSCoreLab.Dac;CoreLab.Dac.Design +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U".\;..\Net;..\;..\Design;..\..\DBToolsInterfaces" +-O".\;..\Net;..\;..\Design" +-I".\;..\Net;..\;..\Design" +-R".\;..\Net;..\;..\Design" diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.dpk b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.dpk new file mode 100644 index 0000000..1c6858f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.Design.dpk @@ -0,0 +1,132 @@ +package CoreLab.Dac.Design; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + CoreLab.DbTools.Interfaces, + Borland.Delphi, + Borland.Vcl, + Borland.VclRtl, + Borland.Studio.Vcl.Design, + Borland.Studio.ToolsAPI, + Borland.VclDbCtrls, + Borland.Vcl.Design.DbRtl, + CoreLab.Dac; + +contains + CoreLab.Dac.Design.DacReg in '..\Net\CoreLab.Dac.Design.DacReg.pas', + CoreLab.Dac.Design.VTDesign in '..\Net\CoreLab.Dac.Design.VTDesign.pas', + CoreLab.Dac.Design.DAMenu in '..\Net\CoreLab.Dac.Design.DAMenu.pas', + CoreLab.Dac.Design.DADesign in '..\Net\CoreLab.Dac.Design.DADesign.pas', + CoreLab.Dac.Design.DAUpdateSQLFrame in '..\Net\CoreLab.Dac.Design.DAUpdateSQLFrame.pas', + CoreLab.Dac.Design.CRFrame in '..\Net\CoreLab.Dac.Design.CRFrame.pas', + CoreLab.Dac.Design.CRColFrame in '..\Net\CoreLab.Dac.Design.CRColFrame.pas', + CoreLab.Dac.Design.CRTabEditor in '..\Net\CoreLab.Dac.Design.CRTabEditor.pas', + CoreLab.Dac.Design.DAConnectionEditor in '..\Net\CoreLab.Dac.Design.DAConnectionEditor.pas', + CoreLab.Dac.Design.CRDataEditor in '..\Net\CoreLab.Dac.Design.CRDataEditor.pas', + CoreLab.Dac.Design.DADataEditor in '..\Net\CoreLab.Dac.Design.DADataEditor.pas', + CoreLab.Dac.Design.DAMacrosFrame in '..\Net\CoreLab.Dac.Design.DAMacrosFrame.pas', + CoreLab.Dac.Design.DAParamsFrame in '..\Net\CoreLab.Dac.Design.DAParamsFrame.pas', + CoreLab.Dac.Design.DAParamValueEditor in '..\Net\CoreLab.Dac.Design.DAParamValueEditor.pas', + CoreLab.Dac.Design.DAQueryEditor in '..\Net\CoreLab.Dac.Design.DAQueryEditor.pas', + CoreLab.Dac.Design.DADualListEditor in '..\Net\CoreLab.Dac.Design.DADualListEditor.pas', + CoreLab.Dac.Design.DADumpProgress in '..\Net\CoreLab.Dac.Design.DADumpProgress.pas', + CoreLab.Dac.Design.DADumpEditor in '..\Net\CoreLab.Dac.Design.DADumpEditor.pas', + CoreLab.Dac.Design.DASPCallFrame in '..\Net\CoreLab.Dac.Design.DASPCallFrame.pas', + CoreLab.Dac.Design.DASQLEditor in '..\Net\CoreLab.Dac.Design.DASQLEditor.pas', + CoreLab.Dac.Design.DASQLFrame in '..\Net\CoreLab.Dac.Design.DASQLFrame.pas', + CoreLab.Dac.Design.DASQLGeneratorFrame in '..\Net\CoreLab.Dac.Design.DASQLGeneratorFrame.pas', + CoreLab.Dac.Design.DATableEditor in '..\Net\CoreLab.Dac.Design.DATableEditor.pas', + CoreLab.Dac.Design.CREditor in '..\Net\CoreLab.Dac.Design.CREditor.pas', + CoreLab.Dac.Design.DADesignUtils in '..\Net\CoreLab.Dac.Design.DADesignUtils.pas', + CoreLab.Dac.Design.DAUpdateSQLEditor in '..\Net\CoreLab.Dac.Design.DAUpdateSQLEditor.pas', + CoreLab.Dac.Design.DAScriptEditor in '..\Net\CoreLab.Dac.Design.DAScriptEditor.pas', + CoreLab.Dac.Design.DAStoredProcEditor in '..\Net\CoreLab.Dac.Design.DAStoredProcEditor.pas', + CoreLab.Dac.Design.VTDataEditor in '..\Net\CoreLab.Dac.Design.VTDataEditor.pas', + CoreLab.Dac.Design.Download in '..\Net\CoreLab.Dac.Design.Download.pas', + CoreLab.Dac.Design.DBToolsClient in '..\Net\CoreLab.Dac.Design.DBToolsClient.pas', + CoreLab.Dac.Design.DBToolsIntf in '..\Net\CoreLab.Dac.Design.DBToolsIntf.pas', + CoreLab.Dac.Design.HelpUtils in '..\Net\CoreLab.Dac.Design.HelpUtils.pas'; + +[assembly: AssemblyTitle('Core Lab Data Access Components')] +[assembly: AssemblyDescription('Core Lab Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.3010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.bdsproj new file mode 100644 index 0000000..b48884e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.bdsproj @@ -0,0 +1,196 @@ + + + + + + + + + + + + CoreLab.Dac.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + + True + + + 0 + 0 + 1 + False + False + 4096 + 1048576 + 4194304 + Core Lab Data Access Components + False + + + + . + + . + ..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\3.0 + Borland.VclRtl;Borland.VclDbRtl;Borland.Vcl;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + True + False + 6 + 10 + 1 + 3010 + False + False + False + False + False + + + Core Lab + + 6.10.1.10 + + + + + DAC + 6.10.1.10 + + + + + $00000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.cfg b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.cfg new file mode 100644 index 0000000..4971988 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.cfg @@ -0,0 +1,41 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\3.0" +-O"..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\3.0" +-I"..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\3.0" +-R"..\Net;..;d:\program files\common files\borland shared\bds\shared assemblies\3.0" +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.dpk b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.dpk new file mode 100644 index 0000000..a523a16 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Dac.dpk @@ -0,0 +1,108 @@ +package CoreLab.Dac; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + Borland.Vcl, + Borland.VclDbRtl, + Borland.VclRtl; + +contains + CoreLab.Dac.VirtualTable in '..\Net\CoreLab.Dac.VirtualTable.pas', + CoreLab.Dac.CRParser in '..\Net\CoreLab.Dac.CRParser.pas', + CoreLab.Dac.DAConsts in '..\Net\CoreLab.Dac.DAConsts.pas', + CoreLab.Dac.DacVcl in '..\Net\CoreLab.Dac.DacVcl.pas', + CoreLab.Dac.DALoader in '..\Net\CoreLab.Dac.DALoader.pas', + CoreLab.Dac.DASQLMonitor in '..\Net\CoreLab.Dac.DASQLMonitor.pas', + CoreLab.Dac.DBAccess in '..\Net\CoreLab.Dac.DBAccess.pas', + CoreLab.Dac.DBMonitorClient in '..\Net\CoreLab.Dac.DBMonitorClient.pas', + CoreLab.Dac.DBMonitorIntf in '..\Net\CoreLab.Dac.DBMonitorIntf.pas', + CoreLab.Dac.MemData in '..\Net\CoreLab.Dac.MemData.pas', + CoreLab.Dac.MemDS in '..\Net\CoreLab.Dac.MemDS.pas', + CoreLab.Dac.MemUtils in '..\Net\CoreLab.Dac.MemUtils.pas', + CoreLab.Dac.CRAccess in '..\Net\CoreLab.Dac.CRAccess.pas', + CoreLab.Dac.CRConnectionPool in '..\Net\CoreLab.Dac.CRConnectionPool.pas', + CoreLab.Dac.DAScript in '..\Net\CoreLab.Dac.DAScript.pas', + CoreLab.Dac.DADump in '..\Net\CoreLab.Dac.DADump.pas', + CoreLab.Dac.CRBatchMove in '..\Net\CoreLab.Dac.CRBatchMove.pas', + CoreLab.Dac.Win32Timer in '..\Net\CoreLab.Dac.Win32Timer.pas'; + +[assembly: AssemblyTitle('Core Lab Data Access Components')] +[assembly: AssemblyDescription('Core Lab Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('Core Lab Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +//[assembly: CLSCompliant(true)] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('6.10.1.3010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.bdsproj new file mode 100644 index 0000000..e5d5eff --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.bdsproj @@ -0,0 +1,185 @@ + + + + + + + + + + + + CoreLab.Sdac.AdoNet.dpk + + + + + + + + + + + + + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + True + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 4 + 10 + 0 + 3010 + False + False + False + False + False + 1049 + 1251 + + + + + 4.10.0.10 + + + + + + 4.10.0.10 + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.cfg b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.cfg new file mode 100644 index 0000000..e048f42 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.cfg @@ -0,0 +1,39 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-vn +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.Sdac +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-U"..\;..\Net" +-O"..\;..\Net" +-I"..\;..\Net" +-R"..\;..\Net" diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.dpk b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.dpk new file mode 100644 index 0000000..3bc6183 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.AdoNet.dpk @@ -0,0 +1,99 @@ +package CoreLab.Sdac.AdoNet; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + Borland.Delphi, + System.Data, + Borland.VclDbRtl, + CoreLab.Sdac, + System.Drawing; + +contains + CoreLab.Dac.DataAdapter {CoreLab.Dac.DataAdapter.DADataAdapter: System.Data.Common.DbDataAdapter}, + CoreLab.Sdac.DataAdapter in '..\Net\CoreLab.Sdac.DataAdapter.pas' {CoreLab.Sdac.DataAdapter.MyDataAdapter: CoreLab.Dac.DataAdapter.DADataAdapter}; + +[assembly: AssemblyTitle('CoreLab.Sdac.AdoNet')] +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('SQL Server Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('4.10.0.3010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.bdsproj new file mode 100644 index 0000000..2a9a305 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.bdsproj @@ -0,0 +1,206 @@ + + + + + + + + + + + + CoreLab.Sdac.Design.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl;CoreLab.Dac;CoreLab.Sdac;CoreLab.Dac.Design;CoreLab.Sdac.Design + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + + . + + . + d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\program files\borland\bds\3.0\bin;d:\projects\delphi\Dac\source\delphi9;d:\Projects\Delphi\Sdac\Source\Delphi9;d:\winnt\microsoft.net\framework\v1.1.4322;..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\projects\delphi\Sdac\source\delphi9;d:\projects\delphi\dac\source\delphi9;d:\projects\delphi\sdac\source\delphi9;d:\Projects\Delphi\dac\source\delphi9;d:\Projects\Delphi\Sdac\Source\Delphi9;d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\corelab\mydac for delphi9\bin;D:\Projects\Delphi\Sdac\Source\Delphi9 + CoreLab.Sdac.AdoNet;d:\windows\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll;CoreLab.Sdac;d:\program files\corelab\mydac for delphi9\bin\CoreLab.Dac.Design.dll;Borland.Vcl.Design.Standard;Borland.Vcl.Design.DbRtl;Borland.Studio.Vcl.Design;d:\program files\borland\bds\3.0\bin\Borland.Studio.ToolsAPI.dll;Borland.Delphi + SDAC + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 3010 + False + False + False + False + False 1033 + 1252 + + + + + 4.10.0.10 + + + + + + 4.10.0.10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.cfg b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.cfg new file mode 100644 index 0000000..2582085 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.cfg @@ -0,0 +1,41 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSBorland.Vcl;CoreLab.Dac;CoreLab.Sdac;CoreLab.Dac.Design;CoreLab.Sdac.Design +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\Design;.\;..\Net;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\program files\borland\bds\3.0\bin;d:\projects\delphi\dac\source\delphi9;d:\projects\delphi\sdac\source\delphi9" +-O"..\Design;.\;..\Net;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\program files\borland\bds\3.0\bin;d:\projects\delphi\dac\source\delphi9;d:\projects\delphi\sdac\source\delphi9" +-I"..\Design;.\;..\Net;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\program files\borland\bds\3.0\bin;d:\projects\delphi\dac\source\delphi9;d:\projects\delphi\sdac\source\delphi9" +-R"..\Design;.\;..\Net;..\;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\program files\borland\bds\3.0\bin;d:\projects\delphi\dac\source\delphi9;d:\projects\delphi\sdac\source\delphi9" +-DSDAC diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.dpk b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.dpk new file mode 100644 index 0000000..c225a6e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.Design.dpk @@ -0,0 +1,119 @@ +package CoreLab.Sdac.Design; + + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE MYBUILDER} +{$DEFINE SDAC} + +requires + Borland.Delphi, + Borland.Studio.ToolsAPI, + Borland.Studio.Vcl.Design, + Borland.Vcl.Design.DbRtl, + Borland.Vcl.Design.Standard, + CoreLab.Dac.Design, + CoreLab.Sdac, + System.Windows.Forms, + CoreLab.Sdac.AdoNet; + +contains + CoreLab.Sdac.Design.MSNamesEditor in '..\Net\CoreLab.Sdac.Design.MSNamesEditor.pas', + CoreLab.Sdac.Design.MSDumpEditor in '..\Net\CoreLab.Sdac.Design.MSDumpEditor.pas', + CoreLab.Sdac.Design.SdacAbout in '..\Net\CoreLab.Sdac.Design.SdacAbout.pas', + CoreLab.Sdac.Design.MSConnectionEditor in '..\Net\CoreLab.Sdac.Design.MSConnectionEditor.pas', + CoreLab.Sdac.Design.MSParamsFrame in '..\Net\CoreLab.Sdac.Design.MSParamsFrame.pas', + CoreLab.Sdac.Design.MSQueryEditor in '..\Net\CoreLab.Sdac.Design.MSQueryEditor.pas', + CoreLab.Sdac.Design.MSSPCallFrame in '..\Net\CoreLab.Sdac.Design.MSSPCallFrame.pas', + CoreLab.Sdac.Design.MSSQLEditor in '..\Net\CoreLab.Sdac.Design.MSSQLEditor.pas', + CoreLab.Sdac.Design.MSStoredProcEditor in '..\Net\CoreLab.Sdac.Design.MSStoredProcEditor.pas', + CoreLab.Sdac.Design.MSUpdateSQLEditor in '..\Net\CoreLab.Sdac.Design.MSUpdateSQLEditor.pas', + CoreLab.Sdac.Design.MSDesign in '..\Net\CoreLab.Sdac.Design.MSDesign.pas', + CoreLab.Sdac.Design.MSDesignUtils in '..\Net\CoreLab.Sdac.Design.MSDesignUtils.pas', + CoreLab.Sdac.Design.MSMenu in '..\Net\CoreLab.Sdac.Design.MSMenu.pas', + CoreLab.Sdac.Design.MSReg in '..\Net\CoreLab.Sdac.Design.MSReg.pas', + CoreLab.Sdac.MSScript in '..\Net\CoreLab.Sdac.MSScript.pas', + CoreLab.Sdac.MSLoader in '..\Net\CoreLab.Sdac.MSLoader.pas', + CoreLab.Sdac.MSDump in '..\Net\CoreLab.Sdac.MSDump.pas'; + +[assembly: AssemblyTitle('SQL Server Data Access Components')] +[assembly: AssemblyDescription('SQL Server Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('SQL Server Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('4.10.0.3010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.bdsproj new file mode 100644 index 0000000..13e2cb0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.bdsproj @@ -0,0 +1,191 @@ + + + + + + + + + + + + CoreLab.Sdac.dpk + + + 7.0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + CoreLab.Sdac;CoreLab.Dac;Borland.Vcl + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + + True + + + 0 + 0 + 1 + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + False + + + + . + + . + ..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9 + CoreLab.Dac;Borland.VclRtl;Borland.VclDbRtl;Borland.Vcl;Borland.Delphi + + + False + + + + + + False + + + + + + False + + + True + False + 4 + 10 + 0 + 3010 + False + False + False + False + False + + + + + Core Lab + + 4.10.0.10 + + + + + DAC + 4.10.0.10 + + + + + $00000000 + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.cfg b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.cfg new file mode 100644 index 0000000..effe558 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.cfg @@ -0,0 +1,42 @@ +-$A- +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-NSCoreLab.Sdac;CoreLab.Dac;Borland.Vcl +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9" +-O"..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9" +-I"..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9" +-R"..\Net;..;..\..\..\Dac\Source\Net;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;d:\program files\common files\borland shared\bds\shared assemblies\3.0;d:\projects\delphi\dac\source\delphi9" +-DSDAC +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.dpk b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.dpk new file mode 100644 index 0000000..a4bc9b0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/CoreLab.Sdac.dpk @@ -0,0 +1,104 @@ +package CoreLab.Sdac; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + Borland.Delphi, + Borland.Vcl, + Borland.VclDbRtl, + Borland.VclRtl, + CoreLab.Dac; + +contains + CoreLab.Sdac.SdacVcl in '..\Net\CoreLab.Sdac.SdacVcl.pas', + CoreLab.Sdac.OLEDBIntf in '..\Net\CoreLab.Sdac.OLEDBIntf.pas', + CoreLab.Sdac.MSAccess in '..\Net\CoreLab.Sdac.MSAccess.pas', + CoreLab.Sdac.MSConnectForm in '..\Net\CoreLab.Sdac.MSConnectForm.pas', + CoreLab.Sdac.MSConnectionPool in '..\Net\CoreLab.Sdac.MSConnectionPool.pas', + CoreLab.Sdac.MSConsts in '..\Net\CoreLab.Sdac.MSConsts.pas', + CoreLab.Sdac.MSParser in '..\Net\CoreLab.Sdac.MSParser.pas', + CoreLab.Sdac.MSSQLMonitor in '..\Net\CoreLab.Sdac.MSSQLMonitor.pas', + CoreLab.Sdac.OLEDBAccess in '..\Net\CoreLab.Sdac.OLEDBAccess.pas', + CoreLab.Sdac.OLEDBC in '..\Net\CoreLab.Sdac.OLEDBC.pas', + CoreLab.Sdac.CRThread in '..\Net\CoreLab.Sdac.CRThread.pas', + CoreLab.Sdac.MSServiceBroker in '..\Net\CoreLab.Sdac.MSServiceBroker.pas'; + +[assembly: AssemblyTitle('SQL Server Data Access Components')] +[assembly: AssemblyDescription('SQL Server Data Access Components')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('Core Lab')] +[assembly: AssemblyProduct('SQL Server Data Access Components')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +//[assembly: CLSCompliant(true)] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('4.10.0.3010')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('CoreLab.snk')] +[assembly: AssemblyKeyName('')] + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/Make.bat b/internal/4.10.0.10/1/Source/Delphi9/Make.bat new file mode 100644 index 0000000..68bd7f6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/Make.bat @@ -0,0 +1,11 @@ +@echo off +rem ********************************************************************** +rem * +rem * Sdac for Delphi 9 +rem * +rem ********************************************************************** + +set IdeDir="D:\Program Files\Borland\BDS\3.0 +del /Q/S SDAC\*.* +call ..\Make.bat Delphi 9 WIN32 +call ..\Make.bat Delphi 9 CLR diff --git a/internal/4.10.0.10/1/Source/Delphi9/dac90.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/dac90.bdsproj new file mode 100644 index 0000000..fba57c4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dac90.bdsproj @@ -0,0 +1,170 @@ + + + + + + + + + + + + dac90.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + Core Lab Data Access Components + + + + . + + . + ..\ + rtl;vcl;dbrtl;vcldb;vclx;dclado90;dbxcds;dbexpress;dclib90;dclindy90;xmlrtl;inet;inetdbbde;inetdbxpress;soaprtl;dsnap;dcl31w90;inetdb;vcldbx;dclie90;webdsnap;websnap;dss;teeui;teedb;tee;dcldbxcds90;dclact90;dsnapcon;odacvcl90;odac90;CRControls90;dac90;oraprov90;dacvcl90;dcldac90;dclodac90 + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 3010 + False + False + False + False + False + + + 6.10.1.10 + Core Lab + + + + + + DAC + 6.10.1.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/dac90.cfg b/internal/4.10.0.10/1/Source/Delphi9/dac90.cfg new file mode 100644 index 0000000..8e2aa2c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dac90.cfg @@ -0,0 +1,43 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\" +-O"..\" +-I"..\" +-R"..\" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi9/dac90.dpk b/internal/4.10.0.10/1/Source/Delphi9/dac90.dpk new file mode 100644 index 0000000..b76a62c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dac90.dpk @@ -0,0 +1,52 @@ +package dac90; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + dbrtl; + +contains + CRAccess in '..\CRAccess.pas', + DALoader in '..\DALoader.pas', + DADump in '..\DADump.pas', + CRParser in '..\CRParser.pas', + DAConsts in '..\DAConsts.pas', + DBMonitorIntf in '..\DBMonitorIntf.pas', + DBMonitorClient in '..\DBMonitorClient.pas', + DASQLMonitor in '..\DASQLMonitor.pas', + DBAccess in '..\DBAccess.pas', + MemData in '..\MemData.pas', + MemDS in '..\MemDS.pas', + VirtualTable in '..\VirtualTable.pas', + DAVersionInfo in '..\DAVersionInfo.pas', + CLRClasses in '..\CLRClasses.pas', + MemUtils in '..\MemUtils.pas', + DAScript in '..\DAScript.pas', + CRBatchMove in '..\CRBatchMove.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/dac90.res b/internal/4.10.0.10/1/Source/Delphi9/dac90.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.bdsproj new file mode 100644 index 0000000..1f925c1 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.bdsproj @@ -0,0 +1,170 @@ + + + + + + + + + + + + dacvcl90.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + Core Lab Data Access GUI related Components + + + + . + + . + ..\ + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 3010 + False + False + False + False + False + + + Core Lab + + 6.10.1.10 + + + + + DAC + 6.10.1.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.cfg b/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.cfg new file mode 100644 index 0000000..8e2aa2c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.cfg @@ -0,0 +1,43 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\" +-O"..\" +-I"..\" +-R"..\" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.dpk b/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.dpk new file mode 100644 index 0000000..70e895d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.dpk @@ -0,0 +1,36 @@ +package dacvcl90; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access GUI related Components'} +{$IMPLICITBUILD OFF} + +requires + rtl, + dac90, + vcl; + +contains + DacVcl in '..\DacVcl.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.res b/internal/4.10.0.10/1/Source/Delphi9/dacvcl90.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi9/dcldac90.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/dcldac90.bdsproj new file mode 100644 index 0000000..0035d87 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dcldac90.bdsproj @@ -0,0 +1,172 @@ + + + + + + + + + + + + dcldac90.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + Core Lab Data Access Components + + + + . + + . + ..\Design;..\;D:\Program Files\Borland\BDS\3.0\source\ToolsAPI\ + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 6 + 10 + 1 + 3010 + False + False + False + False + False + + + + + Core Lab + + 6.10.1.10 + + + + + DAC + 6.10.1.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/dcldac90.cfg b/internal/4.10.0.10/1/Source/Delphi9/dcldac90.cfg new file mode 100644 index 0000000..a00a7d9 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dcldac90.cfg @@ -0,0 +1,43 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\;..\Design\" +-O"..\;..\Design\" +-I"..\;..\Design\" +-R"..\;..\Design\" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/4.10.0.10/1/Source/Delphi9/dcldac90.dpk b/internal/4.10.0.10/1/Source/Delphi9/dcldac90.dpk new file mode 100644 index 0000000..27c3767 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dcldac90.dpk @@ -0,0 +1,47 @@ +package dcldac90; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Core Lab Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + dac90, + dcldb, + dacvcl90, + vcl, + dbrtl, + vcldb, + vclactnband; + +contains + DacReg in '..\Design\DacReg.pas', + VTDesign in '..\Design\VTDesign.pas', + DAMenu in '..\Design\DAMenu.pas', + DADesign in '..\Design\DADesign.pas', + Download in '..\Design\Download.pas'; + +end. + \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Delphi9/dcldac90.res b/internal/4.10.0.10/1/Source/Delphi9/dcldac90.res new file mode 100644 index 0000000000000000000000000000000000000000..d50d7f1a806f2109fc8f26365aad6e174a19a50c GIT binary patch literal 1324 zcmaJ=O=}ZT6g}gF8S26&=t4Jk5Erf_)!+wRM5zV}eqp5BCTgEZY*P|#lq}3Dn}ENe z{~?eD1|chdgsU!GxUf&zt0#?efj*Q zTpDzZmx#DWcyQ((b555Yz#n=&r+D&8^e~xB=#U{qS*Liqxy0zCP{^lO)&J*yb-Xhh zp7Bu48SfT>4urdea0tIxA>V~FFkoba8ZhG+aMpqyV{5-sme2rhGKVyN&T&d^e8!v-#v>;Yjj7#^YGOh}`2m zoxx~uo9-|$HShe*{ldk*8A?1G($HQG`n454mJU?&3N)j=?-CdxQ3zM$NpxaX<<-{! zZK=c2L3CWrX$%Jo}CRngihTAy7`RL@rpI`~%`k z!JLrrkAV6yaC8Fi*!KJrd$4FlE&wPJ)}F&-+{YT85UY4foyzQ9$ToP0qP%W}Y>|gO zu1};j^3z=^BHN`suSD-Us@UN95YKsA(+(Tjufn^?*W9lYsdp9uk?FE}fgH8l)Wkr= z1WFa}(ZXA7;|(g*@36_r+c0R-`(0y-DDg}05+!o!zr}7ji#xzX3}C0Q>*| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.bdsproj new file mode 100644 index 0000000..e034c21 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.bdsproj @@ -0,0 +1,172 @@ + + + + + + + + + + + + dclsdac90.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + . + . + + + d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\Projects\Delphi\Dac\Source\;d:\Projects\Delphi\SDac\Source\;d:\Projects\Delphi\Dac\Source\Delphi9 + + sdac;MYBUILDER + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 3010 + False + False + False + False + False + + + + + + + 4.10.0.10 + + + + + + 4.10.0.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.cfg b/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.cfg new file mode 100644 index 0000000..31c25ca --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\Design;..\..\Net\D9;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\;D:\Program Files\Borland\BDS\3.0\source\ToolsAPI\" +-O"..\Design;..\..\Net\D9;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\;D:\Program Files\Borland\BDS\3.0\source\ToolsAPI\" +-I"..\Design;..\..\Net\D9;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\;D:\Program Files\Borland\BDS\3.0\source\ToolsAPI\" +-R"..\Design;..\..\Net\D9;..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\;D:\Program Files\Borland\BDS\3.0\source\ToolsAPI\" +-Dsdac +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.dpk b/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.dpk new file mode 100644 index 0000000..56be516 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.dpk @@ -0,0 +1,50 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for Delphi 9 +////////////////////////////////////////////////// + +package dclsdac90; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE sdac} + +requires + sdac90, + dcldb, + dcldac90, + vcljpg, + sdacvcl90, + designide; + +contains + MSDesign in '..\Design\MSDesign.pas', + MSReg in '..\Design\MSReg.pas', + MSMenu in '..\Design\MSMenu.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.res b/internal/4.10.0.10/1/Source/Delphi9/dclsdac90.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi9/sdac90.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/sdac90.bdsproj new file mode 100644 index 0000000..aba2834 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/sdac90.bdsproj @@ -0,0 +1,172 @@ + + + + + + + + + + + + sdac90.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access Components + + + . + . + . + + d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\Projects\Delphi\Dac\Source\;d:\Projects\Delphi\SDac\Source\ + + SDAC + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 3010 + False + False + False + False + False + + + + + + + 4.10.0.10 + + + + + + 4.10.0.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/sdac90.cfg b/internal/4.10.0.10/1/Source/Delphi9/sdac90.cfg new file mode 100644 index 0000000..10bc42c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/sdac90.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\" +-DSDAC +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi9/sdac90.dpk b/internal/4.10.0.10/1/Source/Delphi9/sdac90.dpk new file mode 100644 index 0000000..4d673c0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/sdac90.dpk @@ -0,0 +1,54 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Package for Delphi 9 +////////////////////////////////////////////////// + +package sdac90; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + vcl, + vcldb, + dac90, + rtl, + dbrtl; + +contains + MSAccess in '..\MSAccess.pas', + MSConnectionPool in '..\MSConnectionPool.pas', + MSConsts in '..\MSConsts.pas', + MSSQLMonitor in '..\MSSQLMonitor.pas', + OLEDBAccess in '..\OLEDBAccess.pas', + OLEDBC in '..\OLEDBC.pas', + OLEDBIntf in '..\OLEDBIntf.pas', + MSScript in '..\MSScript.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/sdac90.res b/internal/4.10.0.10/1/Source/Delphi9/sdac90.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.bdsproj b/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.bdsproj new file mode 100644 index 0000000..3a6c3b0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.bdsproj @@ -0,0 +1,172 @@ + + + + + + + + + + + + sdacvcl90.dpk + + + 7.0 + + + 8 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 4096 + 1048576 + 4194304 + SQL Server Data Access GUI related Components + + + . + . + + + d:\windows\microsoft.net\framework\v1.1.4322;d:\program files\common files\borland shared\bds\shared assemblies\2.0;d:\Projects\Delphi\Dac\Source\;d:\Projects\Delphi\SDac\Source\ + + SDAC + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 4 + 10 + 0 + 3010 + False + False + False + False + False + + + + + 4.10.0.10 + + + + + + + + 4.10.0.10 + + + diff --git a/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.cfg b/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.cfg new file mode 100644 index 0000000..10bc42c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D- +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L- +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M4096,1048576 +-K$00400000 +-N"." +-LN"." +-U"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\" +-O"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\" +-I"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\" +-R"..\..\..\Dac\Source;..\..\..\Dac\Source\Delphi9;..\" +-DSDAC +-Z diff --git a/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.dpk b/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.dpk new file mode 100644 index 0000000..6c4a9ff --- /dev/null +++ b/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.dpk @@ -0,0 +1,37 @@ +package sdacvcl90; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'SQL Server Data Access GUI related Components'} +{$IMPLICITBUILD OFF} +{$DEFINE SDAC} + +requires + rtl, + dacvcl90, + sdac90; + +contains + sdacVcl in '..\sdacVcl.pas'; + +end. diff --git a/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.res b/internal/4.10.0.10/1/Source/Delphi9/sdacvcl90.res new file mode 100644 index 0000000000000000000000000000000000000000..1c23367e2a852c6a99b5fca1aa56a68dfe71ac60 GIT binary patch literal 1332 zcmaJ=O=}ZT6g}g_40T}>bfFtN3m4*|q#97^B1$z-@Czf^Hc|UTqD@J(QL=DW*#!I@ z-3QXZAY|q5DB{AMU3O9OJomoIB+=?6=e>LG_dId|ASA4Hpt>MG&rJP3V?6cca+fpH zpleh@;x6IAnIq<$E)l>VqR3r5sS**!<1rmFgk08LJl$Mkbdt~KrmEim=YD0hJ0Cvd zftqK$TL3x`?h=9l{6d+056-}Vp%HFeYB0#gJ>|6|U@smiPXan|96MgqUO~!@@@ymS zJHO+`B=w9I*fpl%`WYhy$c^$wPkA=w!v)@Lj27a%aon5FCm#t%lK(Lt#rj3$9_Q)w zhy7c02U%0|F5EoGU+S5G#Iqp{?X_&Lw$8`Wfofi!X0#7n0wW{}!MZ$&PRy!QeGSl- zIvh=u0A+f$dGe+-cGUIPVaI_@akOGBQ6jD&uwUTWZ~WIB0-uk7Qi2t7!SeVY5Z@Hc z2?+lfsGk7G6L=>!@+bCi*@|2QP#~;5k4LzNO*|$x@PzkN=J!Ij!9y74bSq?wJnVCQ zLamWYcd3BcF710odaI~li{}G8qqeCXwzOZFy2#heuZh$XPYln=M=NKmoh&xzX4Fr0hj;) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Design/CRColFrame.dfm b/internal/4.10.0.10/1/Source/Design/CRColFrame.dfm new file mode 100644 index 0000000..c754dbd --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRColFrame.dfm @@ -0,0 +1,21 @@ +inherited CRColFrame: TCRColFrame + Width = 448 + object lbItemName: TListBox + Left = 8 + Top = 24 + Width = 153 + Height = 195 + Anchors = [akLeft, akTop, akBottom] + ItemHeight = 13 + TabOrder = 0 + OnClick = lbItemNameClick + end + object PanelItem: TPanel + Left = 176 + Top = 8 + Width = 264 + Height = 211 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 1 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/CRColFrame.pas b/internal/4.10.0.10/1/Source/Design/CRColFrame.pas new file mode 100644 index 0000000..2286371 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRColFrame.pas @@ -0,0 +1,261 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Collection Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CRColFrame; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, +{$ENDIF} +{$IFDEF LINUX} + QStdCtrls, QExtCtrls, QControls, QGraphics, QForms, +{$ENDIF} + Classes, SysUtils, + CRFrame, CRTabEditor; + +type + TCRColFrame = class(TCRFrame) + lbItemName: TListBox; + PanelItem: TPanel; + procedure lbItemNameClick(Sender: TObject); + + protected + FOldItemIndex: integer; + + FInStoreItem, FInSelectItem: boolean; + + function GetItems: TCollection; virtual; + function GetItemName(Item: TCollectionItem): string; virtual; + procedure InitItems; virtual; + procedure StoreItem; + function IsControlEnabled(Control: TControl): boolean; + procedure ItemToControls(Item: TCollectionItem); virtual; + procedure ControlsToItem(Item: TCollectionItem); virtual; + procedure UpdateControlState(Control: TControl); + procedure UpdateControlsState; virtual; + + procedure DoActivate; override; + procedure DoFinish; override; + + property Items: TCollection read GetItems; + public + procedure SelectItem; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R CRColFrame.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses + DB, DASQLEditor; + +function TCRColFrame.GetItems: TCollection; +begin + Result := nil; + Assert(False, 'Must be overriden'); +end; + +function TCRColFrame.GetItemName(Item: TCollectionItem): string; +begin + Result := ''; + Assert(False, 'Must be overriden'); +end; + +procedure TCRColFrame.ItemToControls(Item: TCollectionItem); +begin + Assert(False, 'Must be overriden'); +end; + +procedure TCRColFrame.ControlsToItem(Item: TCollectionItem); +begin + Assert(False, 'Must be overriden'); +end; + +procedure TCRColFrame.InitItems; +var + i: integer; + OldIndex: integer; +begin + OldIndex := lbItemName.ItemIndex; + lbItemName.Items.Clear; + Enabled := Items.Count > 0; + if not Enabled then begin + UpdateControlsState; + if (Editor.ActiveControl = nil) and (TCRTabEditorForm(Editor).PageControl.ActivePage = Page) then + Editor.ActiveControl := Page; + Exit; + end; + FOldItemIndex := -1; + + for i := 0 to Items.Count - 1 do + lbItemName.Items.Add(GetItemName(Items.Items[i])); + + if (OldIndex >= 0) and (OldIndex < Items.Count) then + lbItemName.ItemIndex := OldIndex + else + lbItemName.ItemIndex := 0; + + SelectItem; +end; + +function TCRColFrame.IsControlEnabled(Control: TControl): boolean; +begin + Result := Enabled and Control.Enabled and Control.Parent.Enabled and Control.Visible; +end; + +procedure TCRColFrame.UpdateControlState(Control: TControl); +var + e: boolean; +begin + e := IsControlEnabled(Control); + + if Control is TComboBox then begin + if e then + TComboBox(Control).Color := clWindow + else + begin + TComboBox(Control).Color := clBtnFace; + TComboBox(Control).ItemIndex := -1; + end; + end + else + if Control is TEdit then begin + if e then begin + TEdit(Control).Color := clWindow; + TEdit(Control).ParentFont := True; + end + else + begin + TEdit(Control).Color := clBtnFace; + TEdit(Control).Font.Color := clBtnFace; + TEdit(Control).Text := ''; + end; + end + else + if Control is TMemo then begin + if e then begin + TMemo(Control).Color := clWindow; + TMemo(Control).ParentFont := True; + end + else + begin + TMemo(Control).Color := clBtnFace; + TMemo(Control).Font.Color := clBtnFace; + TMemo(Control).Text := ''; + end; + end + else + if not (Control is TLabel) and not (Control is TButton) and + not (Control is TCheckBox) then + Assert(False, Control.Name + ' is ' + Control.ClassName); +end; + +procedure TCRColFrame.UpdateControlsState; +var + i: integer; +begin + for i := 0 to PanelItem.ControlCount - 1 do + UpdateControlState(PanelItem.Controls[i]); +end; + +procedure TCRColFrame.StoreItem; +var + Item: TCollectionItem; +begin + if (FOldItemIndex <> - 1) and + (Items.Count > FOldItemIndex) then begin + Item := Items.Items[FOldItemIndex]; + FInStoreItem := True; + try + ControlsToItem(Item); + finally + FInStoreItem := False; + end; + end; +end; + +procedure TCRColFrame.SelectItem; +var + Item: TCollectionItem; + OldModified: boolean; + i: integer; + +begin + OldModified := Modified; + FInSelectItem := True; + try + PanelItem.Enabled := lbItemName.ItemIndex <> - 1; + + if PanelItem.Enabled then begin + for i := 0 to PanelItem.ControlCount - 1 do + PanelItem.Controls[i].Enabled := True; + + Item := Items.Items[lbItemName.ItemIndex]; + ItemToControls(Item); + + FOldItemIndex := lbItemName.ItemIndex; + end; + + finally + UpdateControlsState; + FInSelectItem := False; + Modified := OldModified; + end; +end; + +procedure TCRColFrame.DoActivate; +begin + inherited; + + // on processing error in ControlsToItem FInStoreItem maybe True + if not FInStoreItem then + InitItems; +end; + +procedure TCRColFrame.DoFinish; +begin + inherited; +{ + Temporary commented to avoid folowing situations: + 1. Set DataType to Integer + 2. Set value to 'qqqq' + 3. Press Cancel button + 4. Press 'Yes' + + Assert(Owner is TDASQLEditorForm); + if (TDASQLEditorForm(Owner).ActiveControl <> TDASQLEditorForm(Owner).btCancel) + and (TDASQLEditorForm(Owner).ActiveControl <> nil) then +} + + StoreItem; +end; + +procedure TCRColFrame.lbItemNameClick(Sender: TObject); +begin + if lbItemName.ItemIndex <> FOldItemIndex then begin + StoreItem; + SelectItem; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/CRColFrame.xfm b/internal/4.10.0.10/1/Source/Design/CRColFrame.xfm new file mode 100644 index 0000000..fa29923 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRColFrame.xfm @@ -0,0 +1,21 @@ +inherited CRColFrame: TCRColFrame + Width = 450 + object lbItemName: TListBox + Left = 8 + Top = 24 + Width = 153 + Height = 197 + Anchors = [akLeft, akTop, akBottom] + ItemHeight = 13 + TabOrder = 0 + OnClick = lbItemNameClick + end + object PanelItem: TPanel + Left = 176 + Top = 8 + Width = 266 + Height = 213 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 1 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/CRDataEditor.dfm b/internal/4.10.0.10/1/Source/Design/CRDataEditor.dfm new file mode 100644 index 0000000..bf206c2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRDataEditor.dfm @@ -0,0 +1,83 @@ +inherited CRDataEditorForm: TCRDataEditorForm + Width = 697 + Height = 360 + Caption = 'CRDataEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 292 + Width = 689 + TabOrder = 2 + Visible = False + inherited imCorner: TImage + Left = 677 + end + inherited btOk: TBitBtn + Left = 525 + end + inherited btCancel: TBitBtn + Left = 606 + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 273 + Width = 689 + Height = 19 + Panels = < + item + Width = 120 + end + item + Width = 120 + end + item + Width = 50 + end> + end + object pnlToolBar: TPanel + Left = 0 + Top = 0 + Width = 689 + Height = 22 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object btClose: TSpeedButton + Left = 75 + Top = 0 + Width = 75 + Height = 23 + Caption = '&Close' + end + object DBNavigator: TDBNavigator + Left = 425 + Top = 0 + Width = 240 + Height = 22 + DataSource = DataSource + TabOrder = 0 + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 22 + Width = 689 + Height = 251 + Align = alClient + DataSource = DataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = 13 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Pitch = fpVariable + TitleFont.Style = [] + end + object DataSource: TDataSource + OnStateChange = DataSourceStateChange + OnDataChange = DataSourceDataChange + Left = 16 + Top = 48 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/CRDataEditor.pas b/internal/4.10.0.10/1/Source/Design/CRDataEditor.pas new file mode 100644 index 0000000..4318079 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRDataEditor.pas @@ -0,0 +1,134 @@ +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Base Component Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CRDataEditor; +{$ENDIF} + +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, DBGrids, Dialogs, + StdCtrls, ExtCtrls, Buttons, ComCtrls, Grids, DBCtrls, +{$ENDIF} +{$IFDEF LINUX} + SysUtils, Types, Classes, QGraphics, QControls, QForms, QDBGrids, QDialogs, QStdCtrls, + QExtCtrls, QButtons, QDBCtrls, QComCtrls, QGrids, +{$ENDIF} + DB, CREditor, MemDS, DADesignUtils; + +type + TCRDataEditorForm = class(TCREditorForm) + pnlToolBar: TPanel; + btClose: TSpeedButton; + DBNavigator: TDBNavigator; +{$IFDEF CLR} + DBGrid: TCustomDBGrid; +{$ELSE} + DBGrid: TDBGrid; +{$ENDIF} + StatusBar: TStatusBar; + DataSource: TDataSource; + procedure DataSourceStateChange(Sender: TObject); + procedure DataSourceDataChange(Sender: TObject; Field: TField); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + protected + FDataSet: TMemDataSet; + + procedure DoInit; override; + procedure DoSave; override; + procedure DoFinish; override; + + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R CRDataEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses +{$IFDEF CLR} + Variants, +{$ENDIF} + TypInfo; + +{ TDADataEditorForm } + +procedure TCRDataEditorForm.DoInit; +var + cg: TCustomDBGrid; +begin + inherited; + + cg := DBGrid; + if ReplaceGridToCRGrid(cg) then begin + {$IFDEF CLR} + DBGrid := cg; + {$ELSE} + DBGrid := TDBGrid(cg); + {$ENDIF} + SetPropValue(DBGrid, 'OptionsEx', Variant('dgeEnableSort,dgeLocalFilter,dgeLocalSorting]')); // disable dgeRecordCount + end; + DataSource.DataSet := Component as TMemDataSet; +end; + +procedure TCRDataEditorForm.DoSave; +begin +end; + +procedure TCRDataEditorForm.DoFinish; +begin + inherited; +end; + +function TCRDataEditorForm.GetComponent: TComponent; +begin + Result := FDataSet; +end; + +procedure TCRDataEditorForm.SetComponent(Value: TComponent); +begin + FDataSet := Value as TMemDataSet; +end; + +procedure TCRDataEditorForm.DataSourceStateChange(Sender: TObject); +begin + StatusBar.Panels[0].Text := 'RecordCount: ' + IntToStr(FDataSet.RecordCount); + StatusBar.Panels[1].Text := 'RecordNo: ' + IntToStr(FDataSet.RecNo); +end; + +procedure TCRDataEditorForm.DataSourceDataChange(Sender: TObject; + Field: TField); +begin + DataSourceStateChange(nil); +end; + +procedure TCRDataEditorForm.FormCloseQuery(Sender: TObject; + var CanClose: Boolean); +begin + DBGrid.SetFocus; + inherited; +end; + +{$IFDEF CLR} +initialization + + RegisterClass(TDBGrid); +{$ENDIF} + +end. diff --git a/internal/4.10.0.10/1/Source/Design/CRDataEditor.xfm b/internal/4.10.0.10/1/Source/Design/CRDataEditor.xfm new file mode 100644 index 0000000..bf206c2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRDataEditor.xfm @@ -0,0 +1,83 @@ +inherited CRDataEditorForm: TCRDataEditorForm + Width = 697 + Height = 360 + Caption = 'CRDataEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 292 + Width = 689 + TabOrder = 2 + Visible = False + inherited imCorner: TImage + Left = 677 + end + inherited btOk: TBitBtn + Left = 525 + end + inherited btCancel: TBitBtn + Left = 606 + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 273 + Width = 689 + Height = 19 + Panels = < + item + Width = 120 + end + item + Width = 120 + end + item + Width = 50 + end> + end + object pnlToolBar: TPanel + Left = 0 + Top = 0 + Width = 689 + Height = 22 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object btClose: TSpeedButton + Left = 75 + Top = 0 + Width = 75 + Height = 23 + Caption = '&Close' + end + object DBNavigator: TDBNavigator + Left = 425 + Top = 0 + Width = 240 + Height = 22 + DataSource = DataSource + TabOrder = 0 + end + end + object DBGrid: TDBGrid + Left = 0 + Top = 22 + Width = 689 + Height = 251 + Align = alClient + DataSource = DataSource + TabOrder = 1 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = 13 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Pitch = fpVariable + TitleFont.Style = [] + end + object DataSource: TDataSource + OnStateChange = DataSourceStateChange + OnDataChange = DataSourceDataChange + Left = 16 + Top = 48 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/CREditor.dfm b/internal/4.10.0.10/1/Source/Design/CREditor.dfm new file mode 100644 index 0000000..1449b4e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CREditor.dfm @@ -0,0 +1,87 @@ +object CREditorForm: TCREditorForm + Left = 302 + Top = 181 + Width = 511 + Height = 73 + Caption = 'CREditorForm' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + KeyPreview = True + OldCreateOrder = True + Position = poDefaultPosOnly + Scaled = False + OnCloseQuery = FormCloseQuery + OnHide = FormHide + OnKeyPress = FormKeyPress + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object BtnPanel: TPanel + Left = 0 + Top = 5 + Width = 503 + Height = 41 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object imCorner: TImage + Left = 491 + Top = 29 + Width = 12 + Height = 12 + Anchors = [akRight, akBottom] + Picture.Data = { + 07544269746D6170D6000000424DD60000000000000076000000280000000C00 + 00000C0000000100040000000000600000000000000000000000100000001000 + 0000000000000000800000800000008080008000000080008000808000008080 + 8000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF008778F778F77800008F778F778F77000088F778F778F70000888F778F778F + 00008888F778F778000088888F778F770000888888F778F700008888888F778F + 000088888888F7780000888888888F7700008888888888F70000888888888888 + 0000} + Transparent = True + end + object btOk: TBitBtn + Left = 339 + Top = 8 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + Default = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnClick = SaveClick + end + object btCancel: TBitBtn + Left = 420 + Top = 8 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Cancel = True + Caption = 'Cancel' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnClick = CloseClick + NumGlyphs = 2 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/CREditor.pas b/internal/4.10.0.10/1/Source/Design/CREditor.pas new file mode 100644 index 0000000..824a0a1 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CREditor.pas @@ -0,0 +1,1255 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Base Component Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CREditor; +{$ENDIF} + +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, DBGrids, Dialogs, + StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + SysUtils, Types, Classes, QGraphics, QControls, QForms, QDBGrids, QDialogs, QStdCtrls, QExtCtrls, + QButtons, Qt, +{$ENDIF} +{$IFDEF DBTOOLS} + DBToolsClient, +{$IFDEF CLR} + System.Text, +{$ENDIF} +{$ENDIF} + DBAccess, DADesignUtils; + +type + TCREditorClass = class of TCREditorForm; + TCREditorForm = class(TForm) + BtnPanel: TPanel; + btOk: TBitBtn; + btCancel: TBitBtn; + imCorner: TImage; + procedure FormShow(Sender: TObject); + procedure FormHide(Sender: TObject); + procedure SaveClick(Sender: TObject); + procedure CloseClick(Sender: TObject); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure FormKeyPress(Sender: TObject; var Key: Char); + {$IFDEF DBTOOLS} + {$IFDEF CLR} + protected + OldMessageProcessing : TMessageEvent; + procedure MessageProcessing(var Msg: TMsg; var Handled: Boolean); + public + destructor Destroy; override; + {$ENDIF} + {$ENDIF} + private + FOldCreateOrder: boolean; + {$IFDEF MSWINDOWS} + FOldPosition: TPosition; + {$ENDIF} + + FConfirmCancel: boolean; + + procedure SetConfirmCancel(const Value: boolean); + {$IFDEF DBTOOLS} + procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE; + {$ENDIF} + protected + FModified: boolean; + FolderName: string; + FDADesignUtilsClass: TDADesignUtilsClass; + FInitialProperty: string; + {$IFDEF USE_SYNEDIT} + FSynSQLSyn: TPersistent; + FUseSynEdit: boolean; + {$ENDIF} + + function GetModified: boolean; virtual; + procedure SetModified(Value: boolean); virtual; + + procedure ReplaceMemos; + {$IFDEF USE_SYNEDIT} + procedure SynMenuItemClick(Sender: TObject); + procedure SynMenuPopup(Sender: TObject); + {$ENDIF} + + procedure DoInit; virtual; + procedure DoActivate; virtual; + procedure DoSave; virtual; + procedure DoFinish; virtual; + + procedure ExitActiveControl; virtual; + procedure SaveControlData; virtual; + + function SaveState: boolean; virtual; + function LoadState: boolean; virtual; + + function GetComponent: TComponent; virtual; + procedure SetComponent(Value: TComponent); virtual; + function GetLocalComponent: TComponent; virtual; + + {$IFDEF MSWINDOWS} + function KeyPath: string; + {$ENDIF} + {$IFDEF DBTOOLS} + procedure ActiveChanged; override; + {$ENDIF} + property Modified: boolean read GetModified write SetModified; + + public + constructor Create(Owner: TComponent; DADesignUtilsClass: TDADesignUtilsClass); reintroduce; virtual; + + {$IFDEF USE_SYNEDIT} + procedure ReplaceMemo(var Memo: TWinControl; DrawGutter: boolean); + {$ENDIF} + + procedure CheckConnection(const Component: TComponent); + + /// If ConfirmCancel is True editor asks user for comfirmation to discard + /// changes. By default ConfirmCancel is set to True. + property ConfirmCancel: boolean read FConfirmCancel write SetConfirmCancel; + + property DADesignUtilsClass: TDADesignUtilsClass read FDADesignUtilsClass; + + property Component: TComponent read GetComponent write SetComponent; + property LocalComponent: TComponent read GetLocalComponent; + property InitialProperty: string read FInitialProperty write FInitialProperty; + + published + property OldCreateOrder: boolean read FOldCreateOrder write FOldCreateOrder; // for D3 + end; + + { + TComponent + TControl + TWinControl + TCustomEdit + TCustomMemo + TMemo + TDAMemo + TCustomControl + TCustomSynEdit + TSynEdit + TSynMemo + } + + TDAMemo = class(TMemo) + protected + BackSpacePressed: boolean; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyPress(var Key: Char); override; + end; + +{$IFDEF LINUX} + TWinControlClass = class of TWinControl; +{$ENDIF} + + function ReplaceControl(var Control: TWinControl; const NewClass: TWinControlClass): boolean; + function ReplaceGridToCRGrid(var DBGrid: TCustomDBGrid): boolean; + + function GetMemoText(Memo: TWinControl): string; + procedure SetMemoText(Memo: TWinControl; Value: string); + function GetReadOnly(Memo: TWinControl): boolean; + procedure SetReadOnly(Memo: TWinControl; Value: boolean); + function GetSelStart(Memo: TWinControl): integer; + procedure SetSelStart(Memo: TWinControl; Value: integer); + procedure SetSelLength(Memo: TWinControl; Value: integer); + procedure LoadFromFile(Memo: TWinControl; FileName: string); + procedure SaveToFile(Memo: TWinControl; FileName: string); + +implementation +uses +{$IFDEF MSWINDOWS} + Registry, +{$ENDIF} +{$IFDEF USE_SYNEDIT} + Menus, +{$ENDIF} + TypInfo, + DAParamValueEditor, DB, DAConsts; + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R CREditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +const + sSynMemo = 'TSynMemo'; + sSynSQLSyn = 'TSynSQLSyn'; + +{$IFDEF USE_SYNEDIT} + SynMenuItemNames: array[0..7] of string = ( + '&Undo', + '-', + 'Cu&t', + '&Copy', + '&Paste', + '&Delete', + '-', + 'Select &All' + ); + +type + TSynMenuItem = class(TMenuItem) + public + Memo: TWinControl; + end; +{$ENDIF} + + +function ReplaceControl(var Control: TWinControl; const NewClass: TWinControlClass): boolean; +var + NewControl: TWinControl; + + i, PropCount: integer; +{$IFDEF CLR} + PropList: TPropList; + PropInfo: TPropInfo; +{$ELSE} + PropList: PPropList; + PropInfo: PPropInfo; +{$ENDIF} + + OldParent: TWinControl; + OldTabOrder: integer; + OldName: string; + + Obj, NewObj: TPersistent; + + OldAct: boolean; + OldMemoValue: string; + +begin + Result := NewClass <> nil; + if not Result then + Exit; + +{$IFDEF CLR} + if NewClass.ClassName = 'TCRDBGrid' then begin + Result := False; + Exit; + end; +{$ENDIF} + + NewControl := NewClass.Create(Control.Owner); + + OldParent := Control.Parent; + OldTabOrder := Control.TabOrder; + OldName := Control.Name; + + if (Control is TMemo) and (NewControl is TMemo) then + OldMemoValue := TMemo(Control).Lines.Text + else + OldMemoValue := ''; + + OldAct := (Control.Owner <> nil) + and (Control.Owner is TCustomForm) + and (TCustomForm(Control.Owner).ActiveControl = Control); + + Control.Parent := OldParent; + +{$IFDEF CLR} + PropList := GetPropList(NewClass.ClassInfo, tkAny, False); + PropCount := Length(PropList); +{$ELSE} + PropCount := GetPropList(NewClass.ClassInfo, tkAny, nil{$IFDEF VER6P}, False {$ENDIF}); + GetMem(PropList, PropCount * sizeof(PropList[0])); + try + GetPropList(NewClass.ClassInfo, tkAny, PropList{$IFDEF VER6P}, False {$ENDIF}); +{$ENDIF} + for i := 0 to PropCount - 1 do begin + PropInfo := GetPropInfo(Control, PropList[i].Name); + if (PropInfo <> nil) // published property + and (PropList[i].Name <> 'Name') + and (IsStoredProp(Control, PropInfo)) then + case PropList[i].PropType{$IFNDEF CLR}^{$ENDIF}.Kind of + tkClass: + begin + {$IFDEF CLR} + Obj := GetObjectProp(Control, PropInfo) as TPersistent; + {$ELSE} + Obj := TPersistent(integer(GetPropValue(Control, PropList[i].Name))); + {$ENDIF} + + if (Obj <> nil) and (Obj.ClassName <> 'TMemoStrings'{$IFDEF CLR}{$IFDEF VER9P} + '$StdCtrls'{$ENDIF}{$ENDIF}) then begin + Assert(Obj is TPersistent); + {$IFDEF CLR} + NewObj := GetObjectProp(NewControl, PropList[i].Name) as TPersistent; + {$ELSE} + NewObj := TPersistent(integer(GetPropValue(NewControl, PropList[i].Name))); + {$ENDIF} + if NewObj = nil then begin + NewObj := Obj; + SetObjectProp(Control, PropInfo, nil); + //SetOrdProp(Control, PropList[i], integer(nil)); + end + else + begin + Assert(NewObj is TPersistent); + {$IFDEF VER10} + if NewObj is TMargins then Continue; + {$ENDIF} + NewObj.Assign(Obj); + end; + {$IFDEF CLR} + PropInfo := GetPropInfo(NewControl, PropList[i].Name); + {$ENDIF} + SetObjectProp(NewControl, PropInfo, NewObj); + //SetOrdProp(NewControl, PropList[i], integer(NewObj)); + end; + end; + tkMethod: + SetMethodProp(NewControl, PropList[i], GetMethodProp(Control, PropList[i])); + else + SetPropValue(NewControl, PropList[i].Name, GetPropValue(Control, PropList[i].Name)); + end; + end; + +{$IFNDEF CLR} + finally + FreeMem(PropList); + end; +{$ENDIF} + + Control.Free; + Control := NewControl; + Control.Name := OldName; + Control.Parent := OldParent; + Control.TabOrder := OldTabOrder; + + if Control is TMemo then + TMemo(Control).Lines.Text := OldMemoValue; + + if OldAct then + TCustomForm(Control.Owner).ActiveControl := Control; +end; + +function ReplaceGridToCRGrid(var DBGrid: TCustomDBGrid): boolean; +var + wc: TWinControl; + NewClass: TWinControlClass; +begin + wc := TWinControl(DBGrid); + NewClass := TWinControlClass(GetClass('TCRDBGrid')); + Result := ReplaceControl(wc, NewClass); + if Result then + DBGrid := wc as TCustomDBGrid; +end; + +function GetMemoText(Memo: TWinControl): string; +begin +{$IFDEF DBTOOLS} + if DBTools.HasDACSqlEditorFrame(Memo) then + Result := DBTools.GetDACSqlEditorFrame(Memo).Text + else +{$ENDIF} + if Memo is TMemo then + Result := TMemo(Memo).Lines.Text + else + if Memo.ClassName = sSynMemo then + Result := TStrings(GetObjectProp(Memo, 'Lines')).Text + else + begin + Result := ''; + Assert(False, Memo.ClassName); + end; +end; + +procedure SetMemoText(Memo: TWinControl; Value: string); +begin +{$IFDEF DBTOOLS} + if DBTools.HasDACSqlEditorFrame(Memo) then + DBTools.GetDACSqlEditorFrame(Memo).Text := Value + else +{$ENDIF} + if Memo is TMemo then + TMemo(Memo).Lines.Text := Value + else + if Memo.ClassName = sSynMemo then + TStrings(GetObjectProp(Memo, 'Lines')).Text := Value + else + Assert(False, Memo.ClassName); +end; + +function GetReadOnly(Memo: TWinControl): boolean; +begin +{$IFDEF DBTOOLS} + if DBTools.HasDACSqlEditorFrame(Memo) then + Result := DBTools.GetDACSqlEditorFrame(Memo).ReadOnly + else +{$ENDIF} + if Memo is TMemo then + Result := TMemo(Memo).ReadOnly + else + if Memo.ClassName = sSynMemo then + Result := Boolean(GetOrdProp(Memo, 'ReadOnly')) + else + begin + Result := False; + Assert(False, Memo.ClassName); + end; +end; + +procedure SetReadOnly(Memo: TWinControl; Value: boolean); +begin +{$IFDEF DBTOOLS} + if DBTools.HasDACSqlEditorFrame(Memo) then + DBTools.GetDACSqlEditorFrame(Memo).ReadOnly := Value + else +{$ENDIF} + if Memo is TMemo then + TMemo(Memo).ReadOnly := Value + else + if Memo.ClassName = sSynMemo then + SetOrdProp(Memo, 'ReadOnly', Longint(Value)); +end; + +function GetSelStart(Memo: TWinControl): integer; +begin +{$IFDEF DBTOOLS} + if DBTools.HasDACSqlEditorFrame(Memo) then + Result := 0 + else +{$ENDIF} + if Memo is TMemo then + Result := TMemo(Memo).SelStart + else + {$IFDEF USE_SYNEDIT} + if Memo.ClassName = sSynMemo then + SendMessage(Memo.Handle, EM_GETSEL, Integer(@Result), 0) + else + {$ENDIF} + begin + Result := -1; + Assert(False, Memo.ClassName); + end; +end; + +procedure SetSelStart(Memo: TWinControl; Value: integer); +begin +{$IFDEF DBTOOLS} + if DBTools.HasDACSqlEditorFrame(Memo) then begin + + end + else +{$ENDIF} + if Memo is TMemo then + TMemo(Memo).SelStart := Value + else + {$IFDEF USE_SYNEDIT} + if Memo.ClassName = sSynMemo then + SendMessage(Memo.Handle, EM_SETSEL, Value, Value) + else + {$ENDIF} + Assert(False, Memo.ClassName); +end; + +procedure SetSelLength(Memo: TWinControl; Value: integer); +begin +{$IFDEF DBTOOLS} + if DBTools.HasDACSqlEditorFrame(Memo) then begin + + end + else +{$ENDIF} + if Memo is TMemo then + TMemo(Memo).SelLength := Value + else + {$IFDEF USE_SYNEDIT} + if Memo.ClassName = sSynMemo then + SetOrdProp(Memo, 'SelLength', Value) + else + {$ENDIF} + Assert(False, Memo.ClassName); +end; + +procedure LoadFromFile(Memo: TWinControl; FileName: string); +var + SL: TStrings; +{$IFDEF DBTOOLS} + UseDBTools: boolean; +{$ENDIF} +begin + SL := nil; +{$IFDEF DBTOOLS} + if not DBTools.HasDACSqlEditorFrame(Memo) then +{$ENDIF} + if Memo is TMemo then + SL := TMemo(Memo).Lines + else + {$IFDEF USE_SYNEDIT} + if Memo.ClassName = sSynMemo then + SL := TStrings(GetObjectProp(Memo, 'Lines')) + else + {$ENDIF} + Assert(False, Memo.ClassName); + +{$IFDEF DBTOOLS} + UseDBTools := SL = nil; + if UseDBTools then + SL := TSTringList.Create; + try +{$ENDIF} + SL.LoadFromFile(FileName); +{$IFDEF DBTOOLS} + if UseDBTools then + DBTools.GetDACSqlEditorFrame(Memo).Text := SL.Text + finally + if UseDBTools then + SL.Free; + end; +{$ENDIF} +end; + +procedure SaveToFile(Memo: TWinControl; FileName: string); +var + SL: TStrings; +{$IFDEF DBTOOLS} + UseDBTools: boolean; +{$ENDIF} +begin + SL := nil; +{$IFDEF DBTOOLS} + if not DBTools.HasDACSqlEditorFrame(Memo) then +{$ENDIF} + if Memo is TMemo then + SL := TMemo(Memo).Lines + else + {$IFDEF USE_SYNEDIT} + if Memo.ClassName = sSynMemo then + SL := TStrings(GetObjectProp(Memo, 'Lines')) + else + {$ENDIF} + Assert(False, Memo.ClassName); + +{$IFDEF DBTOOLS} + UseDBTools := SL = nil; + if UseDBTools then begin + SL := TSTringList.Create; + SL.Text := DBTools.GetDACSqlEditorFrame(Memo).Text + end; + try +{$ENDIF} + SL.SaveToFile(FileName); +{$IFDEF DBTOOLS} + finally + if UseDBTools then + SL.Free; + end; +{$ENDIF} +end; + +{ TDAMemo } + +procedure TDAMemo.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited; + + if Shift = [ssCtrl] then begin + if Key = 65 then + SelectAll + else + if (Key = {$IFNDEF LINUX}VK_BACK{$ELSE}Key_Backspace{$ENDIF}) then + BackSpacePressed := True; + end; +end; + +procedure TDAMemo.KeyPress(var Key: Char); +var + StartI, EndI: integer; + Text: string; +begin + inherited; + + if BackSpacePressed then begin + BackSpacePressed := False; + Text := Lines.Text; + StartI := SelStart; + EndI := SelStart; + while (StartI > 0) and (Text[StartI] <= ' ') do + Dec(StartI); + while (StartI > 0) and (Text[StartI] > ' ') do + Dec(StartI); + if EndI > StartI then begin + SelStart := StartI; + SelLength := EndI - StartI; + SelText := ''; + end; + Key := #0; + end; +end; + +{ TCREditorForm } + +constructor TCREditorForm.Create(Owner: TComponent; DADesignUtilsClass: TDADesignUtilsClass); +begin + inherited Create(Owner); + FDADesignUtilsClass := DADesignUtilsClass; + FolderName := ClassName; + ConfirmCancel := True; +end; + +{$IFDEF USE_SYNEDIT} +procedure TCREditorForm.SynMenuPopup(Sender: TObject); +var + n, m: DWORD; + Memo: TWinControl; + HasSelection: boolean; +begin + with TPopupMenu(Sender) do begin + Memo := TSynMenuItem(Items[0]).Memo; + SendMessage(Memo.Handle, EM_GETSEL, Integer(@n), Integer(@m)); + HasSelection := n < m; + Items[0].Enabled := // Undo + SendMessage(Memo.Handle, EM_CANUNDO, 0, 0) <> 0; + Items[2].Enabled := // Cut + HasSelection; + Items[3].Enabled := // Copy + HasSelection; + Items[4].Enabled := // Paste + IsClipboardFormatAvailable(CF_TEXT); + Items[5].Enabled := // Delete + HasSelection; + Items[7].Enabled := // Select All + GetMemoText(Memo) <> ''; + end; +end; + +procedure TCREditorForm.SynMenuItemClick(Sender: TObject); +begin + with TSynMenuItem(Sender) do begin + case Tag of + 0: // Undo + SendMessage(Memo.Handle, EM_UNDO, 0, 0); + 2:// Cut + SendMessage(Memo.Handle, WM_CUT, 0, 0); + 3:// Copy + SendMessage(Memo.Handle, WM_COPY, 0, 0); + 4:// Paste + SendMessage(Memo.Handle, WM_PASTE, 0, 0); + 5:// Delete + SendMessage(Memo.Handle, WM_CLEAR, 0, 0); + 7:// Select All + SendMessage(Memo.Handle, EM_SETSEL, 0, Length(GetMemoText(Memo))); + end; + end; +end; + +procedure TCREditorForm.ReplaceMemo(var Memo: TWinControl; DrawGutter: boolean); +type + TSetProc = procedure (Self: TObject; Ptr: pointer); +const + NilMethod: TMethod = + (Code: nil; Data: nil); +var + MemoClass: string; + NewMemo: TCustomControl; + OldName: string; + TypeInfo: PTypeInfo; +// Ptr:pointer; +// i: integer; + Gutter: TObject; + i: integer; + Menu: TPopupMenu; + MenuItem: TSynMenuItem; +begin + if FUseSynEdit and (GetClass(sSynMemo) <> nil) and (FSynSQLSyn <> nil) then begin + MemoClass := sSynMemo; + + NewMemo := TCustomControl(GetClass(MemoClass).NewInstance); + NewMemo.Create(Memo.Owner); + + with NewMemo do begin + Parent := Memo.Parent; + Left := Memo.Left; + Top := Memo.Top; + Width := Memo.Width; + Height := Memo.Height; + Align := Memo.Align; + TabOrder := Memo.TabOrder; + Anchors := Memo.Anchors; + //Constraints := Memo.Constraints; + TypeInfo := GetClass(MemoClass).ClassInfo; + HelpContext := Memo.HelpContext; + if Memo is TMemo then begin + SetReadOnly(NewMemo, TMemo(Memo).ReadOnly); + if MemoClass = sSynMemo then + SetOrdProp(NewMemo, 'Color', Longint(TMemo(Memo).Color)); + end; + + if GetPropInfo(Memo.ClassInfo, 'OnChange') <> nil then + SetMethodProp(NewMemo, GetPropInfo(TypeInfo, 'OnChange'), + GetMethodProp(Memo, GetPropInfo(Memo.ClassInfo, 'OnChange'))); + SetMethodProp(NewMemo, GetPropInfo(TypeInfo, 'OnExit'), + GetMethodProp(Memo, GetPropInfo(Memo.ClassInfo, 'OnExit'))); + SetMethodProp(NewMemo, GetPropInfo(TypeInfo, 'OnKeyDown'), + GetMethodProp(Memo, GetPropInfo(Memo.ClassInfo, 'OnKeyDown'))); + SetMethodProp(NewMemo, GetPropInfo(TypeInfo, 'OnKeyPress'), + GetMethodProp(Memo, GetPropInfo(Memo.ClassInfo, 'OnKeyPress'))); + end; + + if (Memo.Owner <> nil) and (TForm(Memo.Owner).ActiveControl = Memo) then begin + SetMethodProp(Memo, GetPropInfo(TypeInfo, 'OnExit'), NilMethod); + TForm(Memo.Owner).ActiveControl := NewMemo; + end; + + OldName := Memo.Name; + Memo.Free; + Memo := TMemo(NewMemo); + NewMemo.Name := OldName; + + if MemoClass = sSynMemo then begin + SetObjectProp(NewMemo, 'Highlighter', FSynSQLSyn); + SetOrdProp(NewMemo, 'Options', $3680DBF); // [eoAltSetsColumnMode, eoAutoIndent, eoAutoSizeMaxScrollWidth, eoDisableScrollArrows, eoDragDropEditing, eoDropFiles, eoEnhanceEndKey, eoGroupUndo, eoHideShowScrollbars, eoKeepCaretX, eoShowScrollHint, eoSmartTabDelete, eoSmartTabs, eoTabIndent, eoTabsToSpaces] + Gutter := GetObjectProp(NewMemo, 'Gutter'); + Assert(Gutter <> nil); + if DrawGutter then begin + SetOrdProp(Gutter, 'Visible', Longint(True)); + + SetOrdProp(Gutter, 'AutoSize', Longint(True)); + SetOrdProp(Gutter, 'DigitCount', 2); + SetOrdProp(Gutter, 'LeftOffset', 0); + SetOrdProp(Gutter, 'RightOffset', 0); + SetOrdProp(Gutter, 'ShowLineNumbers', Longint(True)); + SetOrdProp(Gutter, 'Width', 1); + end + else + SetOrdProp(Gutter, 'Visible', Longint(False)); + + Menu := TPopupMenu.Create(Self); + Menu.OnPopup := SynMenuPopup; + for i := 0 to High(SynMenuItemNames) do begin + MenuItem := TSynMenuItem.Create(Self); + MenuItem.Memo := Memo; + MenuItem.Caption := SynMenuItemNames[i]; + MenuItem.Tag := i; + MenuItem.OnClick := SynMenuItemClick; + Menu.Items.Add(MenuItem); + end; + SetObjectProp(Memo, 'PopupMenu', Menu); + end; + end; +end; +{$ENDIF} + +procedure TCREditorForm.ReplaceMemos; +var + i: integer; + MemoArr: array of TWinControl; + + procedure ProcessComponent(Component: TComponent); + var + i: integer; + SubComponent: TComponent; + begin + for i := 0 to Component.ComponentCount - 1 do begin + SubComponent := Component.Components[i]; + if SubComponent.ClassType = TMemo then begin + SetLength(MemoArr, Length(MemoArr) + 1); + MemoArr[Length(MemoArr) - 1] := TMemo(SubComponent); + end + else + if SubComponent is TFrame then + ProcessComponent(SubComponent); + end; + end; + +begin +{$IFDEF USE_SYNEDIT} + if not (FUseSynEdit or FDADesignUtilsClass.DBToolsAvailable) then +{$ENDIF} + begin + ProcessComponent(Self); + for i := 0 to Length(MemoArr) - 1 do + ReplaceControl(MemoArr[i], TDAMemo) + end; +end; + +procedure TCREditorForm.DoInit; +{$IFDEF LINUX} + procedure ProcessCombos(Component: TComponent); + var + i: integer; + begin + // K2 Only??? + for i := 0 to Component.ComponentCount - 1 do + if (Component.Components[i] is TComboBox) + and (TComboBox(Component.Components[i]).Items.Count = 0) + and Assigned(TComboBox(Component.Components[i]).OnDropDown) then + TComboBox(Component.Components[i]).Items.Add(''); + end; + +var + i: integer; +{$ENDIF} +begin + Modified := False; + + if (Component = nil) and (Self is TDAParamValueEditor) then + Exit; + Assert(Component <> nil, ClassName); + if Component.Owner <> nil then + Caption := Component.Owner.Name + '.' + Component.Name + else + Caption := Component.Name; + + ReplaceMemos; +{$IFDEF LINUX} + ProcessCombos(Self); + for i := 0 to ComponentCount - 1 do + if Components[i] is TCustomFrame then + ProcessCombos(Components[i]); + + // Events order on Windows: OnCloseQuery, OnClose + // Events order on Kylix: OnClose, OnCloseQuery + OnCloseQuery := nil; +{$ENDIF} +end; + +procedure TCREditorForm.DoActivate; +begin +end; + +procedure TCREditorForm.DoSave; +begin + SaveControlData; +end; + +procedure TCREditorForm.DoFinish; +begin +end; + +procedure TCREditorForm.ExitActiveControl; +var + C: {$IFNDEF LINUX}TWinControl{$ELSE}TWidgetControl{$ENDIF}; +begin + C := ActiveControl; + if (C is TComboBox) then + (C as TComboBox).DroppedDown := False; + ActiveControl := nil; + if ActiveControl <> nil then + SysUtils.Abort; // Error on, for example, OnFrameExit + // SysUtils prefix is needed to compile in Kylix + + while (C <> nil) and (not C.Visible or not C.Enabled) do // "Cannot focus disabled or invisible window" bug. See TCRGridTitleEdit.DoFinish code + C := C.Parent; + + ActiveControl := C; +end; + +procedure TCREditorForm.SaveControlData; +begin + ExitActiveControl; +end; + +{$IFDEF MSWINDOWS} + +function TCREditorForm.SaveState: boolean; +var + Registry: TRegistry; +begin + if (BorderStyle <> bsDialog) or (FOldPosition <> poScreenCenter) + then begin + Registry := TRegistry.Create; + try + with Registry do begin + OpenKey(KeyPath + '\' + FolderName, True); + if BorderStyle in [bsSizeable, bsSizeToolWin] then begin + WriteBool('Maximized', WindowState = wsMaximized); + WriteBool('Minimized', WindowState = wsMinimized); + if WindowState = wsNormal then begin + WriteInteger('Width', Width); + WriteInteger('Height', Height); + end; + end; + if (FOldPosition <> poScreenCenter) and (WindowState = wsNormal) then begin + WriteInteger('Left', Left); + WriteInteger('Top', Top); + end; + {if not Modal then + SetBool('Visible', Visible);} + Result := True; + end + finally + Registry.Free; + end + end + else + Result := False; +end; + +function TCREditorForm.LoadState: boolean; +var + Registry: TRegistry; +begin + Registry := TRegistry.Create; + try + with Registry do begin + if OpenKey(KeyPath + '\' + FolderName, False) then begin + if Position <> poScreenCenter then begin + if ValueExists('Left') then + Left := ReadInteger('Left'); + if ValueExists('Top') then + Top := ReadInteger('Top'); + end; + if BorderStyle in [bsSizeable, bsSizeToolWin] then begin + if ValueExists('Width') then + Width := ReadInteger('Width'); + if ValueExists('Height') then + Height := ReadInteger('Height'); + + if ValueExists('Maximized') and ReadBool('Maximized') then + WindowState := wsMaximized + else + {if ValueExists('Minimized') and ReadBool('Minimized') then + WindowState := wsMinimized + else} + WindowState := wsNormal; + end; + if ValueExists('Visible') and ReadBool('Visible') then begin + Show; + Update; + end; + Result := True; + end + else + begin + Left := (Screen.Width - Width) div 2; + Top := (Screen.Height - Height) div 2; + Result := False; + end; + + {$IFDEF USE_SYNEDIT} + if OpenKey(KeyPath, False) and ValueExists('UseSynEdit') then + FUseSynEdit := ReadBool('UseSynEdit') + else + FUseSynEdit := True; + FUseSynEdit := FUseSynEdit and (GetClass(sSynSQLSyn) <> nil) and (GetClass(sSynMemo) <> nil); + {$ENDIF} + end; + finally + Registry.Free; + end; + FOldPosition := Position; +end; + +function TCREditorForm.KeyPath: string; +begin + Result := '\SOFTWARE\CoreLab\' + FDADesignUtilsClass.GetProjectName + '\Editors'; +end; + +{$ENDIF} + +{$IFDEF DBTOOLS} +procedure TCREditorForm.ActiveChanged; +begin + inherited; + + if ActiveControl is TDACSqlEditorFrame then + ActiveControl.SetFocus; +end; +{$ENDIF} + +{$IFDEF LINUX} + +function TCREditorForm.SaveState: boolean; +begin + Result := True; +end; + +function TCREditorForm.LoadState: boolean; +begin + Result := True; +end; +{$ENDIF} + +function TCREditorForm.GetComponent: TComponent; +begin + Assert(False, 'Must be overriden'); + Result := nil; +end; + +procedure TCREditorForm.SetComponent(Value: TComponent); +begin + Assert(False, 'Must be overriden'); +end; + +function TCREditorForm.GetLocalComponent: TComponent; +begin + Assert(False, 'Must be overriden'); + Result := nil; +end; + +procedure TCREditorForm.FormShow(Sender: TObject); +{$IFDEF USE_SYNEDIT} +var + NewSHClass: TPersistentClass; +{$ENDIF} +begin +{$IFDEF DBTOOLS} +{$IFDEF CLR} + OldMessageProcessing := Application.OnMessage; + Application.OnMessage := MessageProcessing; +{$ENDIF} +{$ENDIF} + + LoadState; +{$IFDEF USE_SYNEDIT} + NewSHClass := GetClass(sSynSQLSyn); + if FUseSynEdit and (NewSHClass <> nil) then begin + FSynSQLSyn := TComponentClass(NewSHClass).Create(Self); + SetOrdProp(FSynSQLSyn, 'SQLDialect', FDADesignUtilsClass.SQLDialect); + end; +{$ENDIF} + +{$IFDEF LINUX} + DoInit; +{$ELSE} + try + DoInit; + except + on E: EAbort do begin + PostMessage(Handle, WM_CLOSE, 0, 0); + end; + end; +{$ENDIF} + DoActivate; +end; + +procedure TCREditorForm.FormHide(Sender: TObject); +{$IFDEF LINUX} +var + CanClose: Boolean; // Skipped by Kylix bug +{$ENDIF} +begin +{$IFDEF LINUX} + FormCloseQuery(Sender, CanClose); +{$ENDIF} + + DoFinish; + SaveState; +{$IFDEF USE_SYNEDIT} + FSynSQLSyn.Free; +{$ENDIF} +end; + +procedure TCREditorForm.SaveClick(Sender: TObject); +begin + DoSave; + + Modified := False; + + ModalResult := mrOk; +end; + +procedure TCREditorForm.CloseClick(Sender: TObject); +begin + ModalResult := mrCancel +end; + +procedure TCREditorForm.FormCloseQuery(Sender: TObject; + var CanClose: Boolean); +{$IFDEF MSWINDOWS} +const + ResYes = IDYES; + ResNo = IDNO; +var + Res: integer; +{$ELSE} +const + ResYes = smbYes; + ResNo = smbNo; +var + Res: TMessageButton; +{$ENDIF} + OldActiveControl: TWinControl; +begin +{$IFDEF DBTOOLS} + DBTools.CheckDBToolsChanges(Self); +{$ENDIF} + OldActiveControl := ActiveControl; + try + ExitActiveControl; + except + // Silent. User can enter wrong data + end; + if (OldActiveControl <> nil) and OldActiveControl.Visible and OldActiveControl.Enabled then + ActiveControl := OldActiveControl; + + if Modified then begin + if ConfirmCancel then + {$IFDEF MSWINDOWS} + Res := Application.MessageBox('Save changes to component?', 'Confirm', + MB_YESNOCANCEL or MB_ICONQUESTION) + {$ELSE} + Res := Application.MessageBox('Save changes to component?', 'Confirm', + [smbYes, smbNo], smsWarning) + {$ENDIF} + else + Res := ResNo; + + if Res = ResYes then begin + {$IFDEF MSWINDOWS} + ModalResult := mrOk; + {$ENDIF} + DoSave; + Modified := False; + CanClose := True; + end + else + if Res = ResNo then begin + CanClose := True; + {$IFDEF MSWINDOWS} + ModalResult := mrCancel; + {$ENDIF} + end + else + CanClose := False; + end + else + CanClose := True; +end; + +procedure TCREditorForm.SetConfirmCancel(const Value: boolean); +begin + FConfirmCancel := Value; +end; + +procedure TCREditorForm.FormKeyPress(Sender: TObject; var Key: Char); +begin + if Key = #27 then begin + Close; + Key := #0; + end; +end; + +function TCREditorForm.GetModified: boolean; +begin + Result := FModified; +end; + +procedure TCREditorForm.SetModified(Value: boolean); +begin + FModified := Value; +end; + +{$IFDEF DBTOOLS} +{$IFDEF CLR} +destructor TCREditorForm.Destroy; +begin + if Assigned(OldMessageProcessing) then + Application.OnMessage := OldMessageProcessing; + + inherited; +end; + +procedure TCREditorForm.MessageProcessing(var Msg: TMsg; var Handled: Boolean); +var + Wnd: HWND; + ParentHwnd: HWND; + IsDbToolsCtrl: boolean; + ClassName: StringBuilder; + + function IsDbToolsShortCut(Key: word): boolean; + var + Shift: word; + begin + Result := False; + if Key and $FF00 = 0 then begin + if GetKeyState(VK_CONTROL) < 0 then + Shift := scCtrl + else + Shift := 0; + if GetKeyState(VK_MENU) < 0 then + Inc(Shift, scAlt); //VK_SHIFT is of no importance + + if ((Key = VK_F4) and (Shift = scAlt)) //Alt+F4 + or ((Key = VK_ESCAPE) and (Shift = 0)) //ESC + or ((Key >= Ord('a')) and (Key <= Ord('z')) and (Shift = scAlt)) //Alt+a..z + or ((Key = VK_TAB) and ((Shift = scCtrl) or (Shift = 0))) then //[Ctrl+]Tab + Exit; + end; + Result := True; + end; + +begin +//This procedure transports messages to managed non VCL DbToolsControls + Handled := False; + if (Msg.Message >= WM_KEYFIRST) and (Msg.Message <= WM_KEYLAST) then + with Msg do begin + IsDbToolsCtrl := False; + Wnd := HWnd; + if (FindControl(Wnd) = nil) and (Wnd <> 0) then begin + //Check that Wnd is our managed control handle + ParentHwnd := GetParent(Wnd); + ClassName := StringBuilder.Create; + ClassName.Capacity := 1024; + while (not IsDbToolsCtrl) and (ParentHwnd <> 0) do begin + GetClassName(ParentHwnd, ClassName, 1024); + IsDbToolsCtrl := Pos('TDACSqlEditorFrame', ClassName.ToString) <> 0; + ParentHwnd := GetParent(ParentHwnd); + end; + ClassName.Free; + if IsDbToolsCtrl and IsDbToolsShortCut(Msg.WParam) then begin + TranslateMessage(Msg); + Handled := DispatchMessage(Msg) = 0; + Exit; + end; + end; + end; + + if (@OldMessageProcessing <> nil) then + OldMessageProcessing(Msg, Handled); +end; +{$ENDIF} + +procedure TCREditorForm.WMActivate(var Message: TWMActivate); +var + Control: TWinControl; +begin + if Message.Active = WA_INACTIVE then begin + Control := DbTools.GetActiveDACSqlEditorFrame; + if Control <> nil then + ActiveControl := Control; + end; + + inherited; +end; + +{$ENDIF} + +procedure TCREditorForm.CheckConnection(const Component: TComponent); +var + Connection: TCustomDAConnection; +begin + if Component is TCustomDAConnection then + Connection := TCustomDAConnection(Component) + else begin + Connection := FDADesignUtilsClass.UsedConnection(Component); + if Connection = nil then + DatabaseError(SConnectionNotDefined); + end; + if not Connection.Connected then begin + Connection.Connect; + {$IFDEF DBTOOLS} + DBTools.CheckConnectionChanges; + {$ENDIF} + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/CREditor.xfm b/internal/4.10.0.10/1/Source/Design/CREditor.xfm new file mode 100644 index 0000000..b9237b1 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CREditor.xfm @@ -0,0 +1,83 @@ +object CREditorForm: TCREditorForm + Left = 301 + Top = 180 + Width = 513 + Height = 75 + Caption = 'CREditorForm' + Color = clButton + Font.Color = clText + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + KeyPreview = True + ParentFont = False + Position = poDefaultPosOnly + Scaled = False + OnCloseQuery = FormCloseQuery + OnHide = FormHide + OnKeyPress = FormKeyPress + OnShow = FormShow + PixelsPerInch = 75 + object BtnPanel: TPanel + Left = 0 + Top = 34 + Width = 513 + Height = 41 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object imCorner: TImage + Left = 501 + Top = 29 + Width = 12 + Height = 12 + Anchors = [akRight, akBottom] + Picture.Data = { + 07544269746D6170DA000000424DD60000000000000076000000280000000C00 + 00000C0000000100040000000000600000000000000000000000100000001000 + 0000000000000000800000800000008080008000000080008000808000008080 + 8000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF008778F778F77800008F778F778F77000088F778F778F70000888F778F778F + 00008888F778F778000088888F778F770000888888F778F700008888888F778F + 000088888888F7780000888888888F7700008888888888F70000888888888888 + 0000} + Transparent = True + end + object btOk: TBitBtn + Left = 341 + Top = 8 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + Default = True + Font.Color = clText + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnClick = SaveClick + end + object btCancel: TBitBtn + Left = 422 + Top = 8 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Cancel = True + Caption = 'Cancel' + Font.Color = clText + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnClick = CloseClick + NumGlyphs = 2 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/CRFldLinks.dfm b/internal/4.10.0.10/1/Source/Design/CRFldLinks.dfm new file mode 100644 index 0000000..743bf75 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRFldLinks.dfm @@ -0,0 +1,166 @@ +object CRLinkFields: TCRLinkFields + Left = 235 + Top = 123 + ActiveControl = IndexList + BorderStyle = bsDialog + Caption = 'Field Link Designer' + ClientHeight = 265 + ClientWidth = 352 + Color = clBtnFace + ParentFont = True + OldCreateOrder = True + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Bevel1: TBevel + Left = 4 + Top = 33 + Width = 343 + Height = 190 + Shape = bsFrame + end + object Bevel2: TBevel + Left = 350 + Top = 285 + Width = 341 + Height = 43 + Shape = bsFrame + end + object Label30: TLabel + Left = 13 + Top = 40 + Width = 57 + Height = 13 + Caption = 'D&etail Fields' + FocusControl = DetailList + IsControl = True + end + object Label31: TLabel + Left = 222 + Top = 38 + Width = 62 + Height = 13 + Caption = '&Master Fields' + FocusControl = MasterList + IsControl = True + end + object IndexLabel: TLabel + Left = 4 + Top = 10 + Width = 83 + Height = 13 + Caption = 'A&vailable Indexes' + FocusControl = IndexList + end + object Label2: TLabel + Left = 12 + Top = 142 + Width = 61 + Height = 13 + Caption = '&Joined Fields' + FocusControl = BindList + end + object DetailList: TListBox + Left = 13 + Top = 55 + Width = 117 + Height = 69 + IntegralHeight = True + ItemHeight = 13 + TabOrder = 1 + OnClick = BindingListClick + IsControl = True + end + object MasterList: TListBox + Left = 222 + Top = 54 + Width = 117 + Height = 69 + IntegralHeight = True + ItemHeight = 13 + TabOrder = 2 + OnClick = BindingListClick + IsControl = True + end + object BindList: TListBox + Left = 12 + Top = 157 + Width = 242 + Height = 56 + IntegralHeight = True + ItemHeight = 13 + MultiSelect = True + TabOrder = 3 + OnClick = BindListClick + IsControl = True + end + object IndexList: TComboBox + Left = 109 + Top = 7 + Width = 192 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + OnChange = IndexListChange + OnClick = IndexListChange + end + object AddButton: TButton + Left = 138 + Top = 74 + Width = 75 + Height = 25 + Caption = '&Add' + TabOrder = 4 + OnClick = AddButtonClick + end + object DeleteButton: TButton + Left = 263 + Top = 157 + Width = 75 + Height = 25 + Caption = '&Delete' + TabOrder = 5 + OnClick = DeleteButtonClick + end + object ClearButton: TButton + Left = 263 + Top = 188 + Width = 75 + Height = 25 + Caption = '&Clear' + TabOrder = 6 + OnClick = ClearButtonClick + end + object Button1: TButton + Left = 100 + Top = 231 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 7 + OnClick = BitBtn1Click + end + object Button2: TButton + Left = 186 + Top = 231 + Width = 75 + Height = 25 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 8 + end + object Help: TButton + Left = 272 + Top = 231 + Width = 75 + Height = 25 + Caption = '&Help' + TabOrder = 9 + OnClick = HelpClick + end +end diff --git a/internal/4.10.0.10/1/Source/Design/CRFldLinks.pas b/internal/4.10.0.10/1/Source/Design/CRFldLinks.pas new file mode 100644 index 0000000..93d7f56 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRFldLinks.pas @@ -0,0 +1,543 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright @ 1998-2007 Core Lab. All right reserved. +// CRFldLinks +////////////////////////////////////////////////// + +{$I Dac.inc} + +unit CRFldLinks; + +interface + +uses +{$IFDEF LINUX} + QStdCtrls, QControls, QExtCtrls, QForms, +{$ELSE} + StdCtrls, Controls, ExtCtrls, Forms, +{$ENDIF} + {$IFDEF VER6P}DesignIntf, DesignEditors,{$ELSE}DsgnIntf,{$ENDIF} + SysUtils, Classes, DB, Buttons, Windows; + +type + +{ TCRFieldLinkProperty } + + TCRFieldLinkProperty = class(TStringProperty) + private + FChanged: Boolean; + FDataSet: TDataSet; + protected + function GetDataSet: TDataSet; + procedure GetFieldNamesForIndex(List: TStrings); virtual; + function GetIndexBased: Boolean; virtual; + function GetIndexDefs: TIndexDefs; virtual; + function GetIndexFieldNames: string; virtual; + function GetIndexName: string; virtual; + function GetMasterFields: string; virtual; abstract; + procedure SetIndexFieldNames(const Value: string); virtual; + procedure SetIndexName(const Value: string); virtual; + procedure SetMasterFields(const Value: string); virtual; abstract; + public + constructor CreateWith(ADataSet: TDataSet); virtual; + procedure GetIndexNames(List: TStrings); + property IndexBased: Boolean read GetIndexBased; + property IndexDefs: TIndexDefs read GetIndexDefs; + property IndexFieldNames: string read GetIndexFieldNames write SetIndexFieldNames; + property IndexName: string read GetIndexName write SetIndexName; + property MasterFields: string read GetMasterFields write SetMasterFields; + property Changed: Boolean read FChanged; + procedure Edit; override; + function GetAttributes: TPropertyAttributes; override; + property DataSet: TDataSet read GetDataSet; + end; + +{ TCRLinkFields } + + TCRLinkFields = class(TForm) + DetailList: TListBox; + MasterList: TListBox; + BindList: TListBox; + Label30: TLabel; + Label31: TLabel; + IndexList: TComboBox; + IndexLabel: TLabel; + Label2: TLabel; + Bevel1: TBevel; + Bevel2: TBevel; + AddButton: TButton; + DeleteButton: TButton; + ClearButton: TButton; + Button1: TButton; + Button2: TButton; + Help: TButton; + procedure FormCreate(Sender: TObject); + procedure BindingListClick(Sender: TObject); + procedure AddButtonClick(Sender: TObject); + procedure DeleteButtonClick(Sender: TObject); + procedure BindListClick(Sender: TObject); + procedure ClearButtonClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure BitBtn1Click(Sender: TObject); + procedure HelpClick(Sender: TObject); + procedure IndexListChange(Sender: TObject); + private + FDataSet: TDataSet; + FMasterDataSet: TDataSet; + FDataSetProxy: TCRFieldLinkProperty; + FFullIndexName: string; + MasterFieldList: string; + IndexFieldList: string; + OrderedDetailList: TStringList; + OrderedMasterList: TStringList; + procedure OrderFieldList(OrderedList, List: TStrings); + procedure AddToBindList(const Str1, Str2: string); + procedure Initialize; + property FullIndexName: string read FFullIndexName; + procedure SetDataSet(Value: TDataSet); + public + property DataSet: TDataSet read FDataSet write SetDataSet; + property DataSetProxy: TCRFieldLinkProperty read FDataSetProxy write FDataSetProxy; + function Edit: Boolean; + end; + +function EditMasterFields(ADataSet: TDataSet; ADataSetProxy: TCRFieldLinkProperty): Boolean; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R CRFldLinks.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses +{$IFDEF LINUX} + QDialogs, +{$ELSE} + Dialogs, +{$IFDEF VER6P} + DsnDBCst, +{$ENDIF} +{$ENDIF} + DBConsts, LibHelp, TypInfo; + +{ Utility Functions } + +function StripFieldName(const Fields: string; var Pos: Integer): string; +var + I: Integer; +begin + I := Pos; + while (I <= Length(Fields)) and (Fields[I] <> ';') do Inc(I); + Result := Copy(Fields, Pos, I - Pos); + if (I <= Length(Fields)) and (Fields[I] = ';') then Inc(I); + Pos := I; +end; + +function StripDetail(const Value: string): string; +var + S: string; + I: Integer; +begin + S := Value; + I := 0; + while Pos('->', S) > 0 do + begin + I := Pos('->', S); + S[I] := ' '; + end; + Result := Copy(Value, 0, I - 2); +end; + +function StripMaster(const Value: string): string; +var + S: string; + I: Integer; +begin + S := Value; + I := 0; + while Pos('->', S) > 0 do + begin + I := Pos('->', S); + S[I] := ' '; + end; + Result := Copy(Value, I + 3, Length(Value)); +end; + +function EditMasterFields(ADataSet: TDataSet; ADataSetProxy: TCRFieldLinkProperty): Boolean; +begin + with TCRLinkFields.Create(nil) do + try + DataSetProxy := ADataSetProxy; + DataSet := ADataSet; + Result := Edit; + finally + Free; + end; +end; + +{ TCRFieldLinkProperty } + +function TCRFieldLinkProperty.GetIndexBased: Boolean; +begin + Result := False; +end; + +function TCRFieldLinkProperty.GetIndexDefs: TIndexDefs; +begin + Result := nil; +end; + +function TCRFieldLinkProperty.GetIndexFieldNames: string; +begin + Result := ''; +end; + +function TCRFieldLinkProperty.GetIndexName: string; +begin + Result := ''; +end; + +procedure TCRFieldLinkProperty.GetIndexNames(List: TStrings); +begin +end; + +procedure TCRFieldLinkProperty.GetFieldNamesForIndex(List: TStrings); +begin +end; + +procedure TCRFieldLinkProperty.SetIndexFieldNames(const Value: string); +begin +end; + +procedure TCRFieldLinkProperty.SetIndexName(const Value: string); +begin +end; + +function TCRFieldLinkProperty.GetAttributes: TPropertyAttributes; +begin + Result := [paDialog]; +{$IFDEF LINUX} + Result := Result + [paVCL] +{$ENDIF} +end; + +procedure TCRFieldLinkProperty.Edit; +begin + FChanged := EditMasterFields(DataSet, Self); + if FChanged then Modified; +end; + +constructor TCRFieldLinkProperty.CreateWith(ADataSet: TDataSet); +begin + FDataSet := ADataSet; +end; + +function TCRFieldLinkProperty.GetDataSet: TDataSet; +begin + if FDataSet = nil then + FDataSet := TDataSet(GetComponent(0)); + Result := FDataSet; +end; + +{ TCRLinkFields } + +procedure TCRLinkFields.FormCreate(Sender: TObject); +begin + OrderedDetailList := TStringList.Create; + OrderedMasterList := TStringList.Create; +{$IFDEF LINUX} + Help.Visible := False; +{$ELSE} +{$IFDEF VER6P} + HelpContext := hcDFieldLinksDesign; +{$ENDIF} +{$ENDIF} +end; + +procedure TCRLinkFields.FormDestroy(Sender: TObject); +begin + OrderedDetailList.Free; + OrderedMasterList.Free; +end; + +function TCRLinkFields.Edit; +begin + Initialize; + if ShowModal = mrOK then + begin + if FullIndexName <> '' then + DataSetProxy.IndexName := FullIndexName else + DataSetProxy.IndexFieldNames := IndexFieldList; + DataSetProxy.MasterFields := MasterFieldList; + Result := True; + end + else + Result := False; +end; + +procedure TCRLinkFields.SetDataSet(Value: TDataSet); +{$IFDEF LINUX} +const + SMissingDataSource = 'Missing MasterSource or DataSource'; +{$ENDIF} +{$IFNDEF VER6P} +const + SMissingDataSource = 'Missing MasterSource or DataSource'; +{$ENDIF} +var + IndexDefs: TIndexDefs; +begin + Value.FieldDefs.Update; + IndexDefs := DataSetProxy.IndexDefs; + if Assigned(IndexDefs) then IndexDefs.Update; + if not Assigned(Value.DataSource) or not Assigned(Value.DataSource.DataSet) then + DatabaseError(SMissingDataSource, Value); + Value.DataSource.DataSet.FieldDefs.Update; + FDataSet := Value; + FMasterDataSet := Value.DataSource.DataSet; +end; + +procedure TCRLinkFields.Initialize; +var + SIndexName: string; + + procedure SetUpLists(const MasterFieldList, DetailFieldList: string); + var + I, J: Integer; + MasterFieldName, DetailFieldName: string; + begin + I := 1; + J := 1; + while (I <= Length(MasterFieldList)) and (J <= Length(DetailFieldList)) do + begin + MasterFieldName := StripFieldName(MasterFieldList, I); + DetailFieldName := StripFieldName(DetailFieldList, J); + if (MasterList.Items.IndexOf(MasterFieldName) <> -1) and + (OrderedDetailList.IndexOf(DetailFieldName) <> -1) then + begin + with OrderedDetailList do + Objects[IndexOf(DetailFieldName)] := TObject(True); + with DetailList.Items do Delete(IndexOf(DetailFieldName)); + with MasterList.Items do Delete(IndexOf(MasterFieldName)); + BindList.Items.Add(Format('%s -> %s', + [DetailFieldName, MasterFieldName])); + ClearButton.Enabled := True; + end; + end; + end; + +begin + if not DataSetProxy.IndexBased then + begin + IndexLabel.Visible := False; + IndexList.Visible := False; + end + else with DataSetProxy do + begin + GetIndexNames(IndexList.Items); + if IndexFieldNames <> '' then + SIndexName := IndexDefs.FindIndexForFields(IndexFieldNames).Name + else SIndexName := IndexName; + if (SIndexName <> '') and (IndexList.Items.IndexOf(SIndexName) >= 0) then + IndexList.ItemIndex := IndexList.Items.IndexOf(SIndexName) else + IndexList.ItemIndex := 0; + end; + with DataSetProxy do + begin + MasterFieldList := MasterFields; + if (IndexFieldNames = '') and (IndexName <> '') and + (IndexDefs.IndexOf(IndexName) >=0) then + IndexFieldList := IndexDefs[IndexDefs.IndexOf(IndexName)].Fields else + IndexFieldList := IndexFieldNames; + end; + IndexListChange(nil); + FMasterDataSet.GetFieldNames(MasterList.Items); + OrderedMasterList.Assign(MasterList.Items); + SetUpLists(MasterFieldList, IndexFieldList); +end; + +procedure TCRLinkFields.IndexListChange(Sender: TObject); +var + I: Integer; + IndexExp: string; +begin + DetailList.Items.Clear; + if DataSetProxy.IndexBased then + begin + DataSetProxy.IndexName := IndexList.Text; + I := DataSetProxy.IndexDefs.IndexOf(DataSetProxy.IndexName); + if (I <> -1) then IndexExp := DataSetProxy.IndexDefs.Items[I].Expression; + if IndexExp <> '' then + DetailList.Items.Add(IndexExp) else + DataSetProxy.GetFieldNamesForIndex(DetailList.Items); + end else + DataSet.GetFieldNames(DetailList.Items); + MasterList.Items.Assign(OrderedMasterList); + OrderedDetailList.Assign(DetailList.Items); + for I := 0 to OrderedDetailList.Count - 1 do + OrderedDetailList.Objects[I] := TObject(False); + BindList.Clear; + AddButton.Enabled := False; + ClearButton.Enabled := False; + DeleteButton.Enabled := False; + MasterList.ItemIndex := -1; +end; + +procedure TCRLinkFields.OrderFieldList(OrderedList, List: TStrings); +var + I, J: Integer; + MinIndex, Index, FieldIndex: Integer; +begin + for J := 0 to List.Count - 1 do + begin + MinIndex := $7FFF; + FieldIndex := -1; + for I := J to List.Count - 1 do + begin + Index := OrderedList.IndexOf(List[I]); + if Index < MinIndex then + begin + MinIndex := Index; + FieldIndex := I; + end; + end; + List.Move(FieldIndex, J); + end; +end; + +procedure TCRLinkFields.AddToBindList(const Str1, Str2: string); +var + I: Integer; + NewField: string; + NewIndex: Integer; +begin + NewIndex := OrderedDetailList.IndexOf(Str1); + NewField := Format('%s -> %s', [Str1, Str2]); + with BindList.Items do + begin + for I := 0 to Count - 1 do + begin + if OrderedDetailList.IndexOf(StripDetail(Strings[I])) > NewIndex then + begin + Insert(I, NewField); + Exit; + end; + end; + Add(NewField); + end; +end; + +procedure TCRLinkFields.BindingListClick(Sender: TObject); +begin + AddButton.Enabled := (DetailList.ItemIndex <> LB_ERR) and + (MasterList.ItemIndex <> LB_ERR); +end; + +procedure TCRLinkFields.AddButtonClick(Sender: TObject); +var + DetailIndex: Integer; + MasterIndex: Integer; +begin + DetailIndex := DetailList.ItemIndex; + MasterIndex := MasterList.ItemIndex; + AddToBindList(DetailList.Items[DetailIndex], + MasterList.Items[MasterIndex]); + with OrderedDetailList do + Objects[IndexOf(DetailList.Items[DetailIndex])] := TObject(True); + DetailList.Items.Delete(DetailIndex); + MasterList.Items.Delete(MasterIndex); + ClearButton.Enabled := True; + AddButton.Enabled := False; +end; + +procedure TCRLinkFields.ClearButtonClick(Sender: TObject); +var + I: Integer; + BindValue: string; +begin + for I := 0 to BindList.Items.Count - 1 do + begin + BindValue := BindList.Items[I]; + DetailList.Items.Add(StripDetail(BindValue)); + MasterList.Items.Add(StripMaster(BindValue)); + end; + BindList.Clear; + ClearButton.Enabled := False; + DeleteButton.Enabled := False; + OrderFieldList(OrderedDetailList, DetailList.Items); + DetailList.ItemIndex := -1; + MasterList.Items.Assign(OrderedMasterList); + for I := 0 to OrderedDetailList.Count - 1 do + OrderedDetailList.Objects[I] := TObject(False); + AddButton.Enabled := False; +end; + +procedure TCRLinkFields.DeleteButtonClick(Sender: TObject); +var + I: Integer; +begin + with BindList do + begin + for I := Items.Count - 1 downto 0 do + begin + if Selected[I] then + begin + DetailList.Items.Add(StripDetail(Items[I])); + MasterList.Items.Add(StripMaster(Items[I])); + with OrderedDetailList do + Objects[IndexOf(StripDetail(Items[I]))] := TObject(False); + Items.Delete(I); + end; + end; + if Items.Count > 0 then Selected[0] := True; + DeleteButton.Enabled := Items.Count > 0; + ClearButton.Enabled := Items.Count > 0; + OrderFieldList(OrderedDetailList, DetailList.Items); + DetailList.ItemIndex := -1; + OrderFieldList(OrderedMasterList, MasterList.Items); + MasterList.ItemIndex := -1; + AddButton.Enabled := False; + end; +end; + +procedure TCRLinkFields.BindListClick(Sender: TObject); +begin + DeleteButton.Enabled := BindList.ItemIndex <> LB_ERR; +end; + +procedure TCRLinkFields.BitBtn1Click(Sender: TObject); +var + I: Integer; +begin + MasterFieldList := ''; + IndexFieldList := ''; + FFullIndexName := ''; + with BindList do + begin + for I := 0 to Items.Count - 1 do + begin + MasterFieldList := Format('%s%s;', [MasterFieldList, StripMaster(Items[I])]); + IndexFieldList := Format('%s%s;', [IndexFieldList, StripDetail(Items[I])]); + end; + if MasterFieldList <> '' then + SetLength(MasterFieldList, Length(MasterFieldList) - 1); + if IndexFieldList <> '' then + SetLength(IndexFieldList, Length(IndexFieldList) - 1); + end; +end; + +procedure TCRLinkFields.HelpClick(Sender: TObject); +begin +{$IFNDEF LINUX} + Application.HelpContext(HelpContext); +{$ENDIF} +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/CRFldLinks.xfm b/internal/4.10.0.10/1/Source/Design/CRFldLinks.xfm new file mode 100644 index 0000000..f35ce12 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRFldLinks.xfm @@ -0,0 +1,155 @@ +object CRLinkFields: TCRLinkFields + Left = 235 + Top = 123 + Width = 697 + Height = 334 + HorzScrollBar.Range = 691 + VertScrollBar.Range = 328 + ActiveControl = IndexList + Caption = 'Field Link Designer' + Color = clButton + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 15 + TextWidth = 7 + object Bevel1: TBevel + Left = 4 + Top = 33 + Width = 343 + Height = 190 + Shape = bsFrame + end + object Bevel2: TBevel + Left = 350 + Top = 285 + Width = 341 + Height = 43 + Shape = bsFrame + end + object Label30: TLabel + Left = 13 + Top = 40 + Width = 70 + Height = 15 + Caption = 'D&etail Fields' + FocusControl = DetailList + end + object Label31: TLabel + Left = 222 + Top = 38 + Width = 76 + Height = 15 + Caption = '&Master Fields' + FocusControl = MasterList + end + object IndexLabel: TLabel + Left = 4 + Top = 10 + Width = 100 + Height = 15 + Caption = 'A&vailable Indexes' + FocusControl = IndexList + end + object Label2: TLabel + Left = 12 + Top = 142 + Width = 76 + Height = 15 + Caption = '&Joined Fields' + FocusControl = BindList + end + object DetailList: TListBox + Left = 13 + Top = 55 + Width = 117 + Height = 69 + TabOrder = 1 + OnClick = BindingListClick + end + object MasterList: TListBox + Left = 222 + Top = 54 + Width = 117 + Height = 69 + TabOrder = 2 + OnClick = BindingListClick + end + object BindList: TListBox + Left = 12 + Top = 157 + Width = 242 + Height = 56 + MultiSelect = True + TabOrder = 3 + OnClick = BindListClick + end + object IndexList: TComboBox + Left = 109 + Top = 7 + Width = 192 + Height = 23 + Style = csDropDownList + ItemHeight = 17 + TabOrder = 0 + OnChange = IndexListChange + OnClick = IndexListChange + end + object AddButton: TButton + Left = 138 + Top = 74 + Width = 75 + Height = 25 + Caption = '&Add' + TabOrder = 4 + OnClick = AddButtonClick + end + object DeleteButton: TButton + Left = 263 + Top = 157 + Width = 75 + Height = 25 + Caption = '&Delete' + TabOrder = 5 + OnClick = DeleteButtonClick + end + object ClearButton: TButton + Left = 263 + Top = 188 + Width = 75 + Height = 25 + Caption = '&Clear' + TabOrder = 6 + OnClick = ClearButtonClick + end + object Button1: TButton + Left = 100 + Top = 231 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 7 + OnClick = BitBtn1Click + end + object Button2: TButton + Left = 186 + Top = 231 + Width = 75 + Height = 25 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 8 + end + object Help: TButton + Left = 272 + Top = 231 + Width = 75 + Height = 25 + Caption = '&Help' + TabOrder = 9 + OnClick = HelpClick + end +end diff --git a/internal/4.10.0.10/1/Source/Design/CRFrame.dfm b/internal/4.10.0.10/1/Source/Design/CRFrame.dfm new file mode 100644 index 0000000..ebf3a3d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRFrame.dfm @@ -0,0 +1,8 @@ +object CRFrame: TCRFrame + Left = 0 + Top = 0 + Width = 481 + Height = 229 + TabOrder = 0 + OnEnter = FrameEnter +end diff --git a/internal/4.10.0.10/1/Source/Design/CRFrame.pas b/internal/4.10.0.10/1/Source/Design/CRFrame.pas new file mode 100644 index 0000000..1c47d56 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRFrame.pas @@ -0,0 +1,115 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// Base Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CRFrame; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Controls, ComCtrls, + Forms, +{$ENDIF} +{$IFDEF LINUX} + QControls, QForms, QComCtrls, +{$ENDIF} +{$IFDEF DBTOOLS} + DBToolsClient, +{$ENDIF} + Classes, CREditor; + +type + TCRFrameClass = class of TCRFrame; + + TCRFrame = class(TFrame) + procedure FrameEnter(Sender: TObject); + protected + FModified: boolean; + FEditor: TCREditorForm; + FActivated: boolean; // To avoid duplicate call (for example, on TCRFrame.FrameExit and PageControl.OnChanging events) + + function GetPage: TTabSheet; + procedure DoActivate; virtual; + procedure DoFinish; virtual; + + public + function ActiveControl: TWinControl; virtual; // Return default control for this frame + procedure Activate; + procedure Finish; + procedure ReActivate; + + property Page: TTabSheet read GetPage; + property Editor: TCREditorForm read FEditor write FEditor; + property Modified: boolean read FModified write FModified; + + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R CRFrame.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{ TCRFrame } + +function TCRFrame.ActiveControl: TWinControl; +begin + Result := nil; +end; + +function TCRFrame.GetPage: TTabSheet; +begin + Result := Parent as TTabSheet; +end; + +procedure TCRFrame.DoActivate; +begin +end; + +procedure TCRFrame.DoFinish; +begin +{$IFDEF DBTOOLS} + DBTools.CheckDBToolsChanges(Self); +{$ENDIF} +end; + +procedure TCRFrame.Activate; +begin + if not FActivated then + ReActivate; +end; + +procedure TCRFrame.Finish; +begin + if FActivated then + DoFinish; + FActivated := False; +end; + +procedure TCRFrame.FrameEnter(Sender: TObject); +begin + Activate; +end; + +procedure TCRFrame.ReActivate; +begin + DoActivate; + FActivated := True; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/CRFrame.xfm b/internal/4.10.0.10/1/Source/Design/CRFrame.xfm new file mode 100644 index 0000000..d70aa96 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRFrame.xfm @@ -0,0 +1,8 @@ +object CRFrame: TCRFrame + Left = 0 + Top = 0 + Width = 481 + Height = 229 + TabOrder = 0 + OnEnter = FrameEnter +end diff --git a/internal/4.10.0.10/1/Source/Design/CRTabEditor.dfm b/internal/4.10.0.10/1/Source/Design/CRTabEditor.dfm new file mode 100644 index 0000000..c3108f7 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRTabEditor.dfm @@ -0,0 +1,40 @@ +inherited CRTabEditorForm: TCRTabEditorForm + Left = 295 + Top = 204 + Width = 512 + Height = 338 + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + BorderIcons = [biSystemMenu] + Constraints.MinHeight = 332 + Constraints.MinWidth = 512 + Font.Height = -11 + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 270 + Width = 504 + TabOrder = 1 + inherited imCorner: TImage + Left = 492 + end + inherited btOk: TBitBtn + Left = 340 + end + inherited btCancel: TBitBtn + Left = 421 + end + end + object PageControl: TPageControl + Left = 8 + Top = 8 + Width = 488 + Height = 255 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 0 + TabStop = False + OnChange = PageControlChange + OnChanging = PageControlChanging + end +end diff --git a/internal/4.10.0.10/1/Source/Design/CRTabEditor.pas b/internal/4.10.0.10/1/Source/Design/CRTabEditor.pas new file mode 100644 index 0000000..21706bc --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRTabEditor.pas @@ -0,0 +1,250 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// Tab Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit CRTabEditor; +{$ENDIF} +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + Types, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QExtCtrls, QComCtrls, QButtons, +{$ENDIF} +{$IFDEF DBTOOLS} + DBToolsClient, +{$ENDIF} + SysUtils, Classes, + CREditor, CRFrame, DADesignUtils, MemData; + +type + TCRTabEditorForm = class(TCREditorForm) + PageControl: TPageControl; + procedure FormDestroy(Sender: TObject); + procedure PageControlChange(Sender: TObject); + procedure PageControlChanging(Sender: TObject; + var AllowChange: Boolean); + + protected + FFramesList: TList; + + {$IFDEF LINUX} + procedure DoInit; override; + procedure DoActivate; override; + {$ENDIF} + {$IFDEF DBTOOLS} + procedure ExitActiveControl; override; + {$ENDIF} + procedure SaveControlData; override; + + function AddTab(FrameClass: TCRFrameClass; Page: TTabSheet): TCRFrame; + + function GetFrameByInitProp: TCRFrame; virtual; + + function GetModified: boolean; override; + procedure SetModified(Value: boolean); override; + + function GetActiveFrame: TCRFrame; + + // Avoid Kylix bug + procedure DoPageControlChange(Sender: TObject); virtual; + procedure DoPageControlChanging(Sender: TObject; var AllowChange: Boolean); virtual; + public + constructor Create(Owner: TComponent; DADesignUtilsClass: TDADesignUtilsClass); override; + procedure ActivateFrame(Frame: TCRFrame); + + property ActiveFrame: TCRFrame read GetActiveFrame; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R CRTabEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{ TCRTabEditorForm } + +{ +procedure TCRTabEditorForm.CreateFrames; +begin + Assert(False, 'Must be overriden - D8 bug'); +end; +} + +{$IFDEF LINUX} +procedure TCRTabEditorForm.DoInit; +begin + inherited; + + PageControl.OnChange := nil; + PageControl.OnChanging := nil; + PageControl.ActivePageIndex := 0; + PageControl.OnChange := PageControlChange; + PageControl.OnChanging := PageControlChanging; +end; + +procedure TCRTabEditorForm.DoActivate; +var + ActiveFrame: TCRFrame; +begin + inherited; + + // on Windows frame is activated from PageControlChange method + ActiveFrame := GetActiveFrame; + if ActiveFrame <> nil then + ActiveFrame.Activate; +end; +{$ENDIF} + +{$IFDEF DBTOOLS} +procedure TCRTabEditorForm.ExitActiveControl; +begin + DBTools.CheckDBToolsChanges(GetActiveFrame); + inherited; +end; +{$ENDIF} + +procedure TCRTabEditorForm.SaveControlData; +var + ActiveFrame: TCRFrame; +begin + ActiveFrame := GetActiveFrame; + if ActiveFrame <> nil then + ActiveFrame.Finish; + + inherited; +end; + +function TCRTabEditorForm.AddTab(FrameClass: TCRFrameClass; Page: TTabSheet): TCRFrame; +begin + Result := FrameClass.Create(Self); + Result.Parent := Page; + Result.Align := alClient; + Result.Name := Page.Name + FrameClass.ClassName; + Result.Editor := Self; + + FFramesList.Add(Result); +end; + +function TCRTabEditorForm.GetModified: boolean; +var + i :integer; +begin + Result := inherited GetModified; + for i := 0 to FFramesList.Count - 1 do + Result := Result or TCRFrame(FFramesList[i]).Modified; +end; + +procedure TCRTabEditorForm.SetModified(Value: boolean); +var + i :integer; +begin + inherited; + for i := 0 to FFramesList.Count - 1 do + TCRFrame(FFramesList[i]).Modified := Value; +end; + +constructor TCRTabEditorForm.Create(Owner: TComponent; DADesignUtilsClass: TDADesignUtilsClass); +begin + FFramesList := TList.Create; + inherited; +end; + +procedure TCRTabEditorForm.FormDestroy(Sender: TObject); +begin + inherited; + FFramesList.Free; +end; + +function TCRTabEditorForm.GetActiveFrame: TCRFrame; +var + i: integer; +begin + for i := 0 to FFramesList.Count - 1 do + if TCRFrame(FFramesList[i]).Page = PageControl.ActivePage then begin + Result := TCRFrame(FFramesList[i]); + Exit; + end; + Result := nil; +end; + +procedure TCRTabEditorForm.ActivateFrame(Frame: TCRFrame); +var + ActiveFrame: TCRFrame; +begin + ActiveFrame := GetActiveFrame; + if ActiveFrame <> nil then + ActiveFrame.Finish; + + if Frame.Page <> PageControl.ActivePage then + PageControl.ActivePage := Frame.Page; + Frame.Activate; +end; + +procedure TCRTabEditorForm.DoPageControlChange(Sender: TObject); +var + ActiveFrame: TCRFrame; +begin + ActiveFrame := GetActiveFrame; + if ActiveFrame <> nil then + ActiveFrame.Activate; +end; + +procedure TCRTabEditorForm.PageControlChange(Sender: TObject); +begin + DoPageControlChange(Sender); +end; + +procedure TCRTabEditorForm.DoPageControlChanging(Sender: TObject; var AllowChange: Boolean); +var + ActiveFrame: TCRFrame; +begin + try + ActiveFrame := GetActiveFrame; + if ActiveFrame <> nil then + ActiveFrame.Finish; + except + on E: Exception do begin + AllowChange := False; + ApplicationHandleException(E); + end; + end; +end; + +procedure TCRTabEditorForm.PageControlChanging(Sender: TObject; var AllowChange: Boolean); +begin + DoPageControlChanging(Sender, AllowChange); +end; + +function TCRTabEditorForm.GetFrameByInitProp: TCRFrame; +var + i :integer; +begin + Result := nil; + if InitialProperty <> '' then begin + for i := 0 to FFramesList.Count - 1 do + if TCRFrame(FFramesList[i]).Page.Caption = InitialProperty then begin + Result := TCRFrame(FFramesList[i]); + Break; + end; + Assert(Result <> nil, 'Unknown frame ' + InitialProperty); + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/CRTabEditor.xfm b/internal/4.10.0.10/1/Source/Design/CRTabEditor.xfm new file mode 100644 index 0000000..fd1c96b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/CRTabEditor.xfm @@ -0,0 +1,29 @@ +inherited CRTabEditorForm: TCRTabEditorForm + Left = 294 + Top = 203 + Height = 340 + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + BorderIcons = [biSystemMenu] + Constraints.MinHeight = 332 + Constraints.MinWidth = 512 + Font.Height = -11 + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 272 + TabOrder = 1 + end + object PageControl: TPageControl + Left = 8 + Top = 8 + Width = 489 + Height = 281 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 0 + TabStop = False + OnChange = PageControlChange + OnChanging = PageControlChanging + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAConnectionEditor.dfm b/internal/4.10.0.10/1/Source/Design/DAConnectionEditor.dfm new file mode 100644 index 0000000..2203f56 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAConnectionEditor.dfm @@ -0,0 +1,415 @@ +inherited DAConnectionEditorForm: TDAConnectionEditorForm + Left = 307 + Top = 150 + VertScrollBar.Range = 0 + ActiveControl = edUsername + BorderStyle = bsDialog + Caption = 'DAConnectionEditorForm' + ClientHeight = 281 + ClientWidth = 450 + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 256 + Width = 25 + Height = 25 + Align = alNone + TabOrder = 2 + Visible = False + inherited imCorner: TImage + Left = 68 + Top = 13 + end + inherited btOk: TBitBtn + Left = 40 + Top = 16 + end + inherited btCancel: TBitBtn + Left = 40 + Top = 0 + end + end + object PageControl: TPageControl + Left = 8 + Top = 8 + Width = 434 + Height = 232 + ActivePage = shConnect + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 0 + OnChange = PageControlChange + object shConnect: TTabSheet + Caption = 'C&onnect' + object shRed: TShape + Left = 24 + Top = 175 + Width = 15 + Height = 15 + Anchors = [akLeft, akBottom] + Brush.Color = clBtnFace + Pen.Color = clBtnShadow + Shape = stCircle + end + object shYellow: TShape + Left = 41 + Top = 175 + Width = 15 + Height = 15 + Anchors = [akLeft, akBottom] + Brush.Color = clBtnFace + Enabled = False + Pen.Color = clBtnShadow + Shape = stCircle + end + object shGreen: TShape + Left = 58 + Top = 175 + Width = 15 + Height = 15 + Anchors = [akLeft, akBottom] + Brush.Color = clBtnFace + Enabled = False + Pen.Color = clBtnShadow + Shape = stCircle + end + object Panel: TPanel + Left = 8 + Top = 8 + Width = 273 + Height = 150 + Anchors = [akLeft, akTop, akBottom] + BevelInner = bvRaised + BevelOuter = bvLowered + TabOrder = 0 + object lbUsername: TLabel + Left = 16 + Top = 20 + Width = 48 + Height = 13 + Caption = 'Username' + end + object lbPassword: TLabel + Left = 16 + Top = 53 + Width = 46 + Height = 13 + Caption = 'Password' + end + object lbServer: TLabel + Left = 16 + Top = 86 + Width = 31 + Height = 13 + Caption = 'Server' + end + object edServer: TComboBox + Left = 104 + Top = 82 + Width = 153 + Height = 21 + ItemHeight = 13 + Sorted = True + TabOrder = 2 + OnChange = edServerChange + OnDropDown = edServerDropDown + OnExit = edServerExit + OnKeyUp = edServerKeyUp + end + object edUsername: TEdit + Left = 104 + Top = 16 + Width = 153 + Height = 21 + TabOrder = 0 + OnChange = edUsernameChange + OnExit = edServerExit + end + object edPassword: TMaskEdit + Left = 104 + Top = 49 + Width = 153 + Height = 21 + PasswordChar = '*' + TabOrder = 1 + OnChange = edPasswordChange + end + end + object btConnect: TButton + Left = 92 + Top = 170 + Width = 89 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = '&Connect' + Default = True + TabOrder = 2 + OnClick = btConnectClick + end + object btDisconnect: TButton + Left = 192 + Top = 170 + Width = 89 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = '&Disconnect' + TabOrder = 3 + OnClick = btDisconnectClick + end + object cbLoginPrompt: TCheckBox + Left = 300 + Top = 8 + Width = 121 + Height = 17 + Caption = '&LoginPrompt' + TabOrder = 1 + OnClick = cbLoginPromptClick + end + end + object shInfo: TTabSheet + Caption = '&Info' + ImageIndex = 1 + object meInfo: TMemo + Left = 8 + Top = 8 + Width = 409 + Height = 185 + Anchors = [akLeft, akTop, akRight, akBottom] + ReadOnly = True + TabOrder = 0 + end + end + object shAbout: TTabSheet + Caption = '&About' + ImageIndex = 2 + OnMouseMove = shAboutMouseMove + object Label1: TLabel + Left = 10 + Top = 6 + Width = 240 + Height = 23 + Caption = 'Data Access Components' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -19 + Font.Name = 'Tahoma' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + end + object Label2: TLabel + Left = 10 + Top = 68 + Width = 38 + Height = 13 + Caption = 'Version ' + end + object lbVersion: TLabel + Left = 56 + Top = 68 + Width = 45 + Height = 13 + Caption = '3.20.0.20' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + end + object Label3: TLabel + Left = 10 + Top = 92 + Width = 243 + Height = 13 + Caption = 'Copyright '#169' 1997-2007 Core Lab. All right reserved.' + end + object Label5: TLabel + Left = 10 + Top = 116 + Width = 26 + Height = 13 + Caption = 'Web:' + end + object Label6: TLabel + Left = 10 + Top = 140 + Width = 31 + Height = 13 + Caption = 'E-mail:' + end + object lbWeb: TLabel + Left = 56 + Top = 116 + Width = 73 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbWebClick + OnMouseMove = lbWebMouseMove + end + object lbMail: TLabel + Left = 56 + Top = 140 + Width = 92 + Height = 13 + Cursor = crHandPoint + Caption = 'support@crlab.com' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentColor = False + ParentFont = False + OnClick = lbMailClick + OnMouseMove = lbMailMouseMove + end + object lbIDE: TLabel + Left = 115 + Top = 68 + Width = 54 + Height = 13 + Caption = 'for Delphi 6' + end + object imPeng: TImage + Left = 376 + Top = 8 + Width = 40 + Height = 48 + Picture.Data = { + 07544269746D6170B60B0000424DB60B00000000000036040000280000002800 + 000030000000010008000000000080070000120B0000120B0000000100000000 + 000000000000000080000080000000808000800000008000800080800000C0C0 + C000C0DCC000F0CAA6000020400000206000002080000020A0000020C0000020 + E00000400000004020000040400000406000004080000040A0000040C0000040 + E00000600000006020000060400000606000006080000060A0000060C0000060 + E00000800000008020000080400000806000008080000080A0000080C0000080 + E00000A0000000A0200000A0400000A0600000A0800000A0A00000A0C00000A0 + E00000C0000000C0200000C0400000C0600000C0800000C0A00000C0C00000C0 + E00000E0000000E0200000E0400000E0600000E0800000E0A00000E0C00000E0 + E00040000000400020004000400040006000400080004000A0004000C0004000 + E00040200000402020004020400040206000402080004020A0004020C0004020 + E00040400000404020004040400040406000404080004040A0004040C0004040 + E00040600000406020004060400040606000406080004060A0004060C0004060 + E00040800000408020004080400040806000408080004080A0004080C0004080 + E00040A0000040A0200040A0400040A0600040A0800040A0A00040A0C00040A0 + E00040C0000040C0200040C0400040C0600040C0800040C0A00040C0C00040C0 + E00040E0000040E0200040E0400040E0600040E0800040E0A00040E0C00040E0 + E00080000000800020008000400080006000800080008000A0008000C0008000 + E00080200000802020008020400080206000802080008020A0008020C0008020 + E00080400000804020008040400080406000804080008040A0008040C0008040 + E00080600000806020008060400080606000806080008060A0008060C0008060 + E00080800000808020008080400080806000808080008080A0008080C0008080 + E00080A0000080A0200080A0400080A0600080A0800080A0A00080A0C00080A0 + E00080C0000080C0200080C0400080C0600080C0800080C0A00080C0C00080C0 + E00080E0000080E0200080E0400080E0600080E0800080E0A00080E0C00080E0 + E000C0000000C0002000C0004000C0006000C0008000C000A000C000C000C000 + E000C0200000C0202000C0204000C0206000C0208000C020A000C020C000C020 + E000C0400000C0402000C0404000C0406000C0408000C040A000C040C000C040 + E000C0600000C0602000C0604000C0606000C0608000C060A000C060C000C060 + E000C0800000C0802000C0804000C0806000C0808000C080A000C080C000C080 + E000C0A00000C0A02000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0 + E000C0C00000C0C02000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0 + A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00030303030303030303030303030303030303030303030303030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303030303030364030303030303030303030303030303030303031D1C1D1C13 + 5C03030303030303030303035B1C25251D650303030303030303030303030366 + 2525262F2F2F2F25130A529BA49BA49B9B9B5B5214262F2F2F26666603030303 + 030303032626262F2F3737373737372F250A000000000000000000001C2F3737 + 37372F2F2F030303030303262F373737373737373737372F1D00525B5B524900 + 000000001C2F3737373737372F6F2F03030303032F373737373737373737372F + 6507FFFFFFFFF6079B0000001C2F37373737373737372F2F030303032F373737 + 373737373737372FF6FFFFFFFFFFFFFFFF0749001C2F37373737373737373737 + 2F0303032F3737373737373737373713A4F6FFFFFFFFFFFFFFFFF652132F3737 + 37373737373737372F0303032F3737373737373737371C0000F7FFFFFFFFFFFF + FFFFFF08652F37372F3737373737372F2F0303032F37373737373737372F0000 + 0007FFFFFFFFFFFFFFFFFF08AE2F2F2F2F2F2F3737372F03030303032F373737 + 373737373713000007FFFFFFFFFFFFFFFFFFFF086E2F2F251C1C263737772F03 + 030303032F2F2F2F3737373726005208FFFFFFFFFFFFFFFFFFFFFFF6B737260A + 00000025372F2F03030303030303036F2F37372F005BF6FFFFFFF6FFFFFFFFFF + FFFFFFFFB73726000000000A372F030303030303030303036F3737129BFFFFFF + FFFFF6FFFFFFFFFFFFFFFFFFBF7F6D00000000002F0303030303030303030303 + 531C0A52FFFFFFFFFFF6F6FFFFFFFFFFFFFFFFFFFFFFA4000000004949030303 + 03030303030303030000009BFFFFFFFFFFFFF6FFFFFFFFFFFFFFFFFFFFFFF700 + 0000000000030303030303030303030349004952FFFFFFFFFFFFF6FFFFFFFFFF + FFFFFFFFFFFF0700000000000003030303030303030303039B000052FFFFFFFF + FFFFF6FFFFFFFFFFFFFFFFFFFFFFF70000000000000303030303030303030303 + 0349000008FFFFFFFFFFF6FFFFFFFFFFFFFFFFFFFFFFF7000000000000030303 + 0303030303030303039B0000F7FFFFFFFFFFF6FFFFFFFFFFFFFFFFFFFFFFA400 + 000000005203030303030303030303030303490052FFFFFFFFFFF6FFFFFFFFFF + FFFFFFFFFFFF9B00000000009B03030303030303030303030303520000F7FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF6524949000000030303030303030303030303 + 03039B000052F6FFFFFFFFFFFFFFFFFFFFFFFFFFF6F700000000005203030303 + 0303030303030303030303000000F7F6FFFFFFF6FFFFFFFFFFF6F60808520000 + 0000009B0303030303030303030303030303039B00005207F6FFF6F6F6FFFFF6 + 08070707A4000000000049030303030303030303030303030303030349004908 + FFFFFFF6F6FFFFFFF6F6F6080000000000000303030303030303030303030303 + 0303030303000007FFFFFFFFFFFFFFFFFFFFFF07000000000003030303030303 + 030303030303030303030303039B005BFFFFF60808F6FFFFFFFFFFA400000000 + 9B0303030303030303030303030303030303030303039B0007FF07070707F6FF + FFFFF64900000052030303030303030303030303030303030303030303030349 + 490807AD65AD0708FFFFA4000000000303030303030303030303030303030303 + 030303030303030300F76526262666AE0807000052005B030303030303030303 + 0303030303030303030303030303030300652E372F2E262E6E5C00525B000303 + 030303030303030303030303030303030303030303030303122E37377F37372E + 2F1C000000520303030303030303030303030303030303030303030303030303 + 0A263737377F3F3F37250000009B030303030303030303030303030303030303 + 030303030303030349AE2F37377F3F2FB75B0000000303030303030303030303 + 030303030303030303030303030303A49B52122E2E6D65009BF7000000030303 + 0303030303030303030303030303030303030303030303A49B009BA400A4A400 + 520700000003030303030303030303030303030303030303030303030303039B + 5BF7079B00A4F65B07A400000003030303030303030303030303030303030303 + 030303030303035B0007F7000000F70807490000000303030303030303030303 + 0303030303030303030303030303039B00000000000000525200000000030303 + 0303030303030303030303030303030303030303030303030000000000000000 + 0000000052030303030303030303030303030303030303030303030303030303 + 0000000000000000000000009B03030303030303030303030303030303030303 + 030303030303030300000000000000005B520000030303030303030303030303 + 0303030303030303030303030303030303000000000000005B49000303030303 + 030303030303030303030303030303030303030303030303035B000000000000 + 0049030303030303030303030303030303030303030303030303030303030303 + 0303035B49000052030303030303030303030303030303030303030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303} + Transparent = True + Visible = False + end + object lbEdition: TLabel + Left = 23 + Top = 31 + Width = 104 + Height = 18 + Caption = 'Standard Edition' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + end + end + end + object btClose: TButton + Left = 366 + Top = 249 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Cancel = True + Caption = 'Close' + TabOrder = 1 + OnClick = SaveClick + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAConnectionEditor.pas b/internal/4.10.0.10/1/Source/Design/DAConnectionEditor.pas new file mode 100644 index 0000000..3569b7b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAConnectionEditor.pas @@ -0,0 +1,533 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// ConnectionEditor Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} +{$I Dac.inc} + +unit DAConnectionEditor; +{$ENDIF} +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Mask, ExtCtrls, ComCtrls, Registry, DacVcl, Buttons, +{$ENDIF} +{$IFDEF LINUX} + SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QMask, QExtCtrls, QComCtrls, DacClx, Qt, QButtons, +{$ENDIF} +{$IFDEF DBTOOLS} + DBToolsClient, +{$ENDIF} + CREditor, DBAccess, DADesignUtils; + +type + TDAConnectionEditorForm = class(TCREditorForm) + PageControl: TPageControl; + shConnect: TTabSheet; + Panel: TPanel; + lbUsername: TLabel; + lbPassword: TLabel; + lbServer: TLabel; + edUsername: TEdit; + edPassword: TMaskEdit; + edServer: TComboBox; + btConnect: TButton; + btDisconnect: TButton; + shInfo: TTabSheet; + shAbout: TTabSheet; + btClose: TButton; + meInfo: TMemo; + Label1: TLabel; + Label2: TLabel; + lbVersion: TLabel; + Label3: TLabel; + Label5: TLabel; + Label6: TLabel; + lbWeb: TLabel; + lbMail: TLabel; + lbIDE: TLabel; + cbLoginPrompt: TCheckBox; + shRed: TShape; + shYellow: TShape; + shGreen: TShape; + imPeng: TImage; + lbEdition: TLabel; + procedure btDisconnectClick(Sender: TObject); + procedure lbWebClick(Sender: TObject); + procedure lbMailClick(Sender: TObject); + procedure cbLoginPromptClick(Sender: TObject); + procedure lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure shAboutMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbMailMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure edUsernameChange(Sender: TObject); + procedure edPasswordChange(Sender: TObject); + procedure edServerChange(Sender: TObject); + procedure btConnectClick(Sender: TObject); + procedure edServerDropDown(Sender: TObject); virtual; + procedure PageControlChange(Sender: TObject); + procedure edServerKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure edServerExit(Sender: TObject); + + protected + FConnection: TCustomDAConnection; + FInDoInit: boolean; + {$IFDEF MSWINDOWS} + FRegistry: TRegistry; + {$ENDIF} + {$IFDEF DBTOOLS} + FInExistingChange: boolean; + + function GetExistingConnectionComboBox: TComboBox; virtual; + procedure ChooseExistingConnection; + function GetConnectionCondition: string; virtual; + {$ENDIF} + + procedure GetServerList(List: TStrings); virtual; + procedure AddServerToList; virtual; + + procedure ShowState(Yellow: boolean = False); virtual; + procedure ConnToControls; virtual; + procedure ControlsToConn; virtual; + procedure FillInfo; virtual; + + procedure DoInit; override; + + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + + public + constructor Create(Owner: TComponent; DADesignUtilsClass: TDADesignUtilsClass); override; + destructor Destroy; override; + + end; + +implementation + +uses + {$IFDEF MSWINDOWS}ShellAPI, HelpUtils,{$ENDIF} + {$IFDEF VER6P}Variants, {$ENDIF} + MemData, + MemUtils; + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DAConnectionEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$I DacVer.inc} + +{$IFDEF LINUX} +type + _TMaskEdit = class (TMaskEdit) + end; +{$ENDIF} + +constructor TDAConnectionEditorForm.Create(Owner: TComponent; DADesignUtilsClass: TDADesignUtilsClass); +begin + inherited; + +{$IFDEF MSWINDOWS} + FRegistry := TRegistry.Create; + if not FRegistry.OpenKey('\SOFTWARE\CoreLab\' + FDADesignUtilsClass.GetProjectName + '\Connect', True) then + FreeAndNil(FRegistry); +{$ENDIF} +end; + +destructor TDAConnectionEditorForm.Destroy; +begin +{$IFDEF MSWINDOWS} + FreeAndNil(FRegistry); +{$ENDIF} + inherited; +end; + +procedure TDAConnectionEditorForm.DoInit; +var + IDE: string; +begin + FInDoInit := True; + try + inherited; + + {$IFDEF D3} + IDE := 'Delphi 3'; + {$ENDIF} + {$IFDEF D4} + IDE := 'Delphi 4'; + {$ENDIF} + {$IFDEF D5} + IDE := 'Delphi 5'; + {$ENDIF} + {$IFDEF D6} + IDE := 'Delphi 6'; + {$ENDIF} + {$IFDEF D7} + IDE := 'Delphi 7'; + {$ENDIF} + {$IFDEF D8} + IDE := 'Delphi 8'; + {$ENDIF} + {$IFDEF D9} + IDE := 'Delphi 2005'; + {$ENDIF} + {$IFDEF D10} + IDE := 'Delphi 2006'; + {$ENDIF} + {$IFDEF D11} + IDE := 'Delphi 2007'; + {$ENDIF} + {$IFDEF CB3} + IDE := 'C++Builder 3'; + {$ENDIF} + {$IFDEF CB4} + IDE := 'C++Builder 4'; + {$ENDIF} + {$IFDEF CB5} + IDE := 'C++Builder 5'; + {$ENDIF} + {$IFDEF CB6} + IDE := 'C++Builder 6'; + {$ENDIF} + {$IFDEF LINUX} + IDE := 'Kylix'; + {$ENDIF} + lbVersion.Caption := DACVersion + ' '; + lbIDE.Caption := 'for ' + IDE; + lbIDE.Left := lbVersion.Left + lbVersion.Width; + + + {$IFDEF LINUX} + imPeng.Visible := True; + imPeng.BringToFront; + _TMaskEdit(edPassword).EchoMode := emPassword; + {$ENDIF} + + {$IFDEF DBTOOLS} + if DADesignUtilsClass.DBToolsAvailable then begin + GetDBToolsService(DADesignUtilsClass).GetConnections(GetExistingConnectionComboBox.Items, GetConnectionCondition); + ChooseExistingConnection; + end; + {$ENDIF} + + ConnToControls; + + ShowState; + finally + FInDoInit := False; + end; +end; + +function TDAConnectionEditorForm.GetComponent: TComponent; +begin + Result := FConnection; +end; + +procedure TDAConnectionEditorForm.SetComponent(Value: TComponent); +begin + FConnection := Value as TCustomDAConnection; +end; + +{$IFDEF DBTOOLS} +function TDAConnectionEditorForm.GetExistingConnectionComboBox: TComboBox; +begin + Result := nil; + Assert(False, 'Must be overriden'); +end; + +procedure TDAConnectionEditorForm.ChooseExistingConnection; +begin + if not FInExistingChange and DADesignUtilsClass.DBToolsAvailable then + with GetExistingConnectionComboBox do + ItemIndex := Items.IndexOf(GetDBToolsService(DADesignUtilsClass).FindConnectionName(FConnection)); +end; + +function TDAConnectionEditorForm.GetConnectionCondition: string; +begin + Result := ''; +end; +{$ENDIF} + +procedure TDAConnectionEditorForm.ConnToControls; +begin + edUsername.Text := FConnection.Username; + edPassword.Text := FConnection.Password; + edServer.Text := FConnection.Server; + cbLoginPrompt.Checked := FConnection.LoginPrompt; +end; + +procedure TDAConnectionEditorForm.ControlsToConn; +begin + // all parameters are set in controls OnChange event handlers +end; + +procedure TDAConnectionEditorForm.ShowState(Yellow: boolean); +begin + btDisconnect.Enabled := FConnection.Connected; + + shRed.Brush.Color := clBtnFace; + shYellow.Brush.Color := clBtnFace; + shGreen.Brush.Color := clBtnFace; + + if Yellow then begin + shYellow.Brush.Color := clYellow; + shYellow.Update; + end + else + if FConnection.Connected then begin + shGreen.Brush.Color := clGreen; + shYellow.Update; + end + else + shRed.Brush.Color := clRed; +end; + +procedure TDAConnectionEditorForm.lbWebClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + OpenUrl('http://' + lbWeb.Caption); + lbWeb.Font.Color := $FF0000; +{$ENDIF} +end; + +procedure TDAConnectionEditorForm.lbMailClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + MailTo(lbMail.Caption); + lbMail.Font.Color := $FF0000; +{$ENDIF} +end; + +procedure TDAConnectionEditorForm.cbLoginPromptClick(Sender: TObject); +begin + FConnection.LoginPrompt := cbLoginPrompt.Checked; +end; + +procedure TDAConnectionEditorForm.lbWebMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbWeb.Font.Color := $4080FF; +end; + +procedure TDAConnectionEditorForm.lbMailMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbMail.Font.Color := $4080FF; +end; + +procedure TDAConnectionEditorForm.shAboutMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbWeb.Font.Color := $FF0000; + lbMail.Font.Color := $FF0000; +end; + +procedure TDAConnectionEditorForm.edUsernameChange(Sender: TObject); +begin + if FInDoInit then + Exit; + + try + FConnection.Username := edUsername.Text; + finally + ShowState; + end; +end; + +procedure TDAConnectionEditorForm.edPasswordChange(Sender: TObject); +begin + if FInDoInit then + Exit; + + try + FConnection.Password := edPassword.Text; + finally + ShowState; + end; +end; + +procedure TDAConnectionEditorForm.edServerChange(Sender: TObject); +begin + if FInDoInit then + Exit; + + try + FConnection.Server := edServer.Text; + finally + ShowState; + end; +end; + +procedure TDAConnectionEditorForm.btConnectClick(Sender: TObject); +begin + ShowState(True); +{$IFDEF DBTOOLS} + ChooseExistingConnection; +{$ENDIF} + StartWait; + try + ControlsToConn; + FConnection.PerformConnect; + if FConnection.Connected then + AddServerToList; + finally + StopWait; + ShowState; + end; + + ModalResult := mrOk; +end; + +procedure TDAConnectionEditorForm.btDisconnectClick(Sender: TObject); +begin +{$IFDEF DBTOOLS} + ChooseExistingConnection; +{$ENDIF} + try + FConnection.Disconnect; + finally + ShowState; + end; +end; + +procedure TDAConnectionEditorForm.edServerDropDown(Sender: TObject); +begin + StartWait; + try + GetServerList(edServer.Items); + finally + StopWait; + end; +end; + +procedure TDAConnectionEditorForm.GetServerList(List: TStrings); +{$IFDEF MSWINDOWS} +var + i: integer; + s: string; + ValueNames: TStringList; +{$ENDIF} +begin + List.Clear; +{$IFDEF MSWINDOWS} + if FRegistry <> nil then begin + ValueNames := TStringList.Create; + try + FRegistry.GetValueNames(ValueNames); + ValueNames.Sort; + for i := 0 to ValueNames.Count - 1 do begin + s := Trim(FRegistry.ReadString(ValueNames[i])); + if (s <> '') and (List.IndexOf(s) = -1) then + List.Add(s); + end; + finally + ValueNames.Free; + end; + end; +{$ENDIF} +end; + +procedure TDAConnectionEditorForm.AddServerToList; +{$IFDEF MSWINDOWS} +var + i: integer; + s: string; + ValueNames, Values: TStringList; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + if FRegistry <> nil then begin + ValueNames := nil; + Values := nil; + try + ValueNames := TStringList.Create; + Values := TStringList.Create; + + Values.Add(FConnection.Server); // Add current server at first position + + FRegistry.GetValueNames(ValueNames); + ValueNames.Sort; + + for i := 0 to ValueNames.Count - 1 do + if FRegistry.GetDataType(ValueNames[i]) = rdString then begin + s := Trim(FRegistry.ReadString(ValueNames[i])); + if (s <> '') and (Values.IndexOf(s) = -1) then + Values.Add(s); + FRegistry.DeleteValue(ValueNames[i]); // Clear old list + end; + + // Store updated list in registry + for i := 0 to Values.Count - 1 do begin + s := Format('Server %d', [i]); + FRegistry.WriteString(s, Values[i]); + end; + + finally + ValueNames.Free; + Values.Free; + end; + end; +{$ENDIF} +end; + +procedure TDAConnectionEditorForm.FillInfo; +var + OldLoginPrompt: boolean; + +begin + OldLoginPrompt := FConnection.LoginPrompt; + try + FConnection.LoginPrompt := False; + + if not FConnection.Connected then + try + ShowState(True); + FConnection.Connect; + except + on E: Exception do + begin + // PageControl.ActivePage := shConnect; + // Application.ShowException(E); - silent exception. Please see CR MyDAC 3443 + end; + end; + meInfo.Lines.Clear; + finally + FConnection.LoginPrompt := OldLoginPrompt; + ShowState(False); + end; +end; + +procedure TDAConnectionEditorForm.PageControlChange(Sender: TObject); +begin + if PageControl.ActivePage = shInfo then + FillInfo; +end; + +procedure TDAConnectionEditorForm.edServerKeyUp(Sender: TObject; + var Key: Word; Shift: TShiftState); +begin + if Key ={$IFDEF MSWINDOWS}VK_RETURN{$ELSE}KEY_RETURN{$ENDIF} then + edServerChange(Sender); +end; + +procedure TDAConnectionEditorForm.edServerExit(Sender: TObject); +begin +{$IFDEF DBTOOLS} + ChooseExistingConnection; +{$ENDIF} +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DAConnectionEditor.xfm b/internal/4.10.0.10/1/Source/Design/DAConnectionEditor.xfm new file mode 100644 index 0000000..12ef51a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAConnectionEditor.xfm @@ -0,0 +1,411 @@ +inherited DAConnectionEditorForm: TDAConnectionEditorForm + Left = 307 + Top = 150 + Width = 450 + Height = 281 + VertScrollBar.Range = 0 + ActiveControl = edUsername + BorderStyle = fbsDialog + Caption = 'DAConnectionEditorForm' + Constraints.MinHeight = 281 + Constraints.MinWidth = 450 + PixelsPerInch = 75 + inherited BtnPanel: TPanel + Top = 256 + Width = 25 + Height = 25 + Align = alNone + TabOrder = 2 + Visible = False + inherited imCorner: TImage + Left = 68 + Top = 13 + end + inherited btOk: TBitBtn + Left = 40 + Top = 16 + end + inherited btCancel: TBitBtn + Left = 40 + Top = 0 + end + end + object PageControl: TPageControl + Left = 8 + Top = 8 + Width = 434 + Height = 232 + ActivePage = shConnect + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 0 + OnChange = PageControlChange + object shConnect: TTabSheet + Caption = 'C&onnect' + object shRed: TShape + Left = 24 + Top = 175 + Width = 15 + Height = 15 + Anchors = [akLeft, akBottom] + Brush.Color = clButton + Pen.Color = clDark + Pen.Width = 0 + Shape = stCircle + end + object shYellow: TShape + Left = 41 + Top = 175 + Width = 15 + Height = 15 + Anchors = [akLeft, akBottom] + Brush.Color = clButton + Enabled = False + Pen.Color = clDark + Pen.Width = 0 + Shape = stCircle + end + object shGreen: TShape + Left = 58 + Top = 175 + Width = 15 + Height = 15 + Anchors = [akLeft, akBottom] + Brush.Color = clButton + Enabled = False + Pen.Color = clDark + Pen.Width = 0 + Shape = stCircle + end + object Panel: TPanel + Left = 8 + Top = 8 + Width = 273 + Height = 150 + Anchors = [akLeft, akTop, akBottom] + BevelInner = bvRaised + BevelOuter = bvLowered + TabOrder = 0 + object lbUsername: TLabel + Left = 16 + Top = 20 + Width = 55 + Height = 20 + Caption = 'Username' + end + object lbPassword: TLabel + Left = 16 + Top = 53 + Width = 54 + Height = 20 + Caption = 'Password' + end + object lbServer: TLabel + Left = 16 + Top = 86 + Width = 37 + Height = 20 + Caption = 'Server' + end + object edServer: TComboBox + Left = 104 + Top = 82 + Width = 153 + Height = 28 + ItemHeight = 22 + TabOrder = 2 + OnChange = edServerChange + OnDropDown = edServerDropDown + OnKeyUp = edServerKeyUp + end + object edUsername: TEdit + Left = 104 + Top = 16 + Width = 153 + Height = 28 + TabOrder = 0 + OnChange = edUsernameChange + end + object edPassword: TMaskEdit + Left = 104 + Top = 49 + Width = 153 + Height = 28 + TabOrder = 1 + OnChange = edPasswordChange + end + end + object btConnect: TButton + Left = 92 + Top = 170 + Width = 89 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = '&Connect' + Default = True + TabOrder = 2 + OnClick = btConnectClick + end + object btDisconnect: TButton + Left = 192 + Top = 170 + Width = 89 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = '&Disconnect' + TabOrder = 3 + OnClick = btDisconnectClick + end + object cbLoginPrompt: TCheckBox + Left = 300 + Top = 8 + Width = 121 + Height = 17 + Caption = '&LoginPrompt' + TabOrder = 1 + OnClick = cbLoginPromptClick + end + end + object shInfo: TTabSheet + Caption = '&Info' + ImageIndex = 1 + object meInfo: TMemo + Left = 8 + Top = 8 + Width = 409 + Height = 185 + Anchors = [akLeft, akTop, akRight, akBottom] + ReadOnly = True + TabOrder = 0 + end + end + object shAbout: TTabSheet + Caption = '&About' + ImageIndex = 2 + OnMouseMove = shAboutMouseMove + object Label1: TLabel + Left = 10 + Top = 6 + Width = 240 + Height = 23 + Caption = 'Data Access Components' + Font.Color = clNavy + Font.Height = 19 + Font.Name = 'Tahoma' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + end + object Label2: TLabel + Left = 10 + Top = 68 + Width = 38 + Height = 13 + Caption = 'Version ' + end + object lbVersion: TLabel + Left = 56 + Top = 68 + Width = 45 + Height = 13 + Caption = '3.20.0.20' + Font.Color = clNavy + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + end + object Label3: TLabel + Left = 10 + Top = 92 + Width = 243 + Height = 13 + Caption = 'Copyright '#169' 1997-2007 Core Lab. All right reserved.' + end + object Label5: TLabel + Left = 10 + Top = 116 + Width = 26 + Height = 13 + Caption = 'Web:' + end + object Label6: TLabel + Left = 10 + Top = 140 + Width = 31 + Height = 13 + Caption = 'E-mail:' + end + object lbWeb: TLabel + Left = 56 + Top = 116 + Width = 73 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbWebClick + OnMouseMove = lbWebMouseMove + end + object lbMail: TLabel + Left = 56 + Top = 140 + Width = 92 + Height = 13 + Cursor = crHandPoint + Caption = 'support@crlab.com' + Color = clBtnFace + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentColor = False + ParentFont = False + OnClick = lbMailClick + OnMouseMove = lbMailMouseMove + end + object lbIDE: TLabel + Left = 115 + Top = 68 + Width = 54 + Height = 13 + Caption = 'for Delphi 6' + end + object imPeng: TImage + Left = 376 + Top = 8 + Width = 40 + Height = 48 + Picture.Data = { + 07544269746D6170BA0B0000424DB60B00000000000036040000280000002800 + 000030000000010008000000000080070000120B0000120B0000000100000000 + 000000000000000080000080000000808000800000008000800080800000C0C0 + C000C0DCC000F0CAA6000020400000206000002080000020A0000020C0000020 + E00000400000004020000040400000406000004080000040A0000040C0000040 + E00000600000006020000060400000606000006080000060A0000060C0000060 + E00000800000008020000080400000806000008080000080A0000080C0000080 + E00000A0000000A0200000A0400000A0600000A0800000A0A00000A0C00000A0 + E00000C0000000C0200000C0400000C0600000C0800000C0A00000C0C00000C0 + E00000E0000000E0200000E0400000E0600000E0800000E0A00000E0C00000E0 + E00040000000400020004000400040006000400080004000A0004000C0004000 + E00040200000402020004020400040206000402080004020A0004020C0004020 + E00040400000404020004040400040406000404080004040A0004040C0004040 + E00040600000406020004060400040606000406080004060A0004060C0004060 + E00040800000408020004080400040806000408080004080A0004080C0004080 + E00040A0000040A0200040A0400040A0600040A0800040A0A00040A0C00040A0 + E00040C0000040C0200040C0400040C0600040C0800040C0A00040C0C00040C0 + E00040E0000040E0200040E0400040E0600040E0800040E0A00040E0C00040E0 + E00080000000800020008000400080006000800080008000A0008000C0008000 + E00080200000802020008020400080206000802080008020A0008020C0008020 + E00080400000804020008040400080406000804080008040A0008040C0008040 + E00080600000806020008060400080606000806080008060A0008060C0008060 + E00080800000808020008080400080806000808080008080A0008080C0008080 + E00080A0000080A0200080A0400080A0600080A0800080A0A00080A0C00080A0 + E00080C0000080C0200080C0400080C0600080C0800080C0A00080C0C00080C0 + E00080E0000080E0200080E0400080E0600080E0800080E0A00080E0C00080E0 + E000C0000000C0002000C0004000C0006000C0008000C000A000C000C000C000 + E000C0200000C0202000C0204000C0206000C0208000C020A000C020C000C020 + E000C0400000C0402000C0404000C0406000C0408000C040A000C040C000C040 + E000C0600000C0602000C0604000C0606000C0608000C060A000C060C000C060 + E000C0800000C0802000C0804000C0806000C0808000C080A000C080C000C080 + E000C0A00000C0A02000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0 + E000C0C00000C0C02000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0 + A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00030303030303030303030303030303030303030303030303030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303030303030364030303030303030303030303030303030303031D1C1D1C13 + 5C03030303030303030303035B1C25251D650303030303030303030303030366 + 2525262F2F2F2F25130A529BA49BA49B9B9B5B5214262F2F2F26666603030303 + 030303032626262F2F3737373737372F250A000000000000000000001C2F3737 + 37372F2F2F030303030303262F373737373737373737372F1D00525B5B524900 + 000000001C2F3737373737372F6F2F03030303032F373737373737373737372F + 6507FFFFFFFFF6079B0000001C2F37373737373737372F2F030303032F373737 + 373737373737372FF6FFFFFFFFFFFFFFFF0749001C2F37373737373737373737 + 2F0303032F3737373737373737373713A4F6FFFFFFFFFFFFFFFFF652132F3737 + 37373737373737372F0303032F3737373737373737371C0000F7FFFFFFFFFFFF + FFFFFF08652F37372F3737373737372F2F0303032F37373737373737372F0000 + 0007FFFFFFFFFFFFFFFFFF08AE2F2F2F2F2F2F3737372F03030303032F373737 + 373737373713000007FFFFFFFFFFFFFFFFFFFF086E2F2F251C1C263737772F03 + 030303032F2F2F2F3737373726005208FFFFFFFFFFFFFFFFFFFFFFF6B737260A + 00000025372F2F03030303030303036F2F37372F005BF6FFFFFFF6FFFFFFFFFF + FFFFFFFFB73726000000000A372F030303030303030303036F3737129BFFFFFF + FFFFF6FFFFFFFFFFFFFFFFFFBF7F6D00000000002F0303030303030303030303 + 531C0A52FFFFFFFFFFF6F6FFFFFFFFFFFFFFFFFFFFFFA4000000004949030303 + 03030303030303030000009BFFFFFFFFFFFFF6FFFFFFFFFFFFFFFFFFFFFFF700 + 0000000000030303030303030303030349004952FFFFFFFFFFFFF6FFFFFFFFFF + FFFFFFFFFFFF0700000000000003030303030303030303039B000052FFFFFFFF + FFFFF6FFFFFFFFFFFFFFFFFFFFFFF70000000000000303030303030303030303 + 0349000008FFFFFFFFFFF6FFFFFFFFFFFFFFFFFFFFFFF7000000000000030303 + 0303030303030303039B0000F7FFFFFFFFFFF6FFFFFFFFFFFFFFFFFFFFFFA400 + 000000005203030303030303030303030303490052FFFFFFFFFFF6FFFFFFFFFF + FFFFFFFFFFFF9B00000000009B03030303030303030303030303520000F7FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF6524949000000030303030303030303030303 + 03039B000052F6FFFFFFFFFFFFFFFFFFFFFFFFFFF6F700000000005203030303 + 0303030303030303030303000000F7F6FFFFFFF6FFFFFFFFFFF6F60808520000 + 0000009B0303030303030303030303030303039B00005207F6FFF6F6F6FFFFF6 + 08070707A4000000000049030303030303030303030303030303030349004908 + FFFFFFF6F6FFFFFFF6F6F6080000000000000303030303030303030303030303 + 0303030303000007FFFFFFFFFFFFFFFFFFFFFF07000000000003030303030303 + 030303030303030303030303039B005BFFFFF60808F6FFFFFFFFFFA400000000 + 9B0303030303030303030303030303030303030303039B0007FF07070707F6FF + FFFFF64900000052030303030303030303030303030303030303030303030349 + 490807AD65AD0708FFFFA4000000000303030303030303030303030303030303 + 030303030303030300F76526262666AE0807000052005B030303030303030303 + 0303030303030303030303030303030300652E372F2E262E6E5C00525B000303 + 030303030303030303030303030303030303030303030303122E37377F37372E + 2F1C000000520303030303030303030303030303030303030303030303030303 + 0A263737377F3F3F37250000009B030303030303030303030303030303030303 + 030303030303030349AE2F37377F3F2FB75B0000000303030303030303030303 + 030303030303030303030303030303A49B52122E2E6D65009BF7000000030303 + 0303030303030303030303030303030303030303030303A49B009BA400A4A400 + 520700000003030303030303030303030303030303030303030303030303039B + 5BF7079B00A4F65B07A400000003030303030303030303030303030303030303 + 030303030303035B0007F7000000F70807490000000303030303030303030303 + 0303030303030303030303030303039B00000000000000525200000000030303 + 0303030303030303030303030303030303030303030303030000000000000000 + 0000000052030303030303030303030303030303030303030303030303030303 + 0000000000000000000000009B03030303030303030303030303030303030303 + 030303030303030300000000000000005B520000030303030303030303030303 + 0303030303030303030303030303030303000000000000005B49000303030303 + 030303030303030303030303030303030303030303030303035B000000000000 + 0049030303030303030303030303030303030303030303030303030303030303 + 0303035B49000052030303030303030303030303030303030303030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303} + Transparent = True + Visible = False + end + object lbEdition: TLabel + Left = 23 + Top = 31 + Width = 104 + Height = 18 + Caption = 'Standard Edition' + Font.Color = clNavy + Font.Height = 15 + Font.Name = 'Tahoma' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + end + end + end + object btClose: TButton + Left = 366 + Top = 249 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Cancel = True + Caption = 'Close' + TabOrder = 1 + OnClick = SaveClick + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DADataEditor.dfm b/internal/4.10.0.10/1/Source/Design/DADataEditor.dfm new file mode 100644 index 0000000..15a0ad5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADataEditor.dfm @@ -0,0 +1,45 @@ +inherited DADataEditorForm: TDADataEditorForm + Caption = 'DADataEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited pnlToolBar: TPanel + inherited btClose: TSpeedButton + OnClick = btCloseClick + end + object btOpen: TSpeedButton [1] + Left = 0 + Top = 0 + Width = 75 + Height = 23 + Caption = '&Open' + OnClick = btOpenClick + end + object btnExit: TSpeedButton [2] + Left = 233 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Exit' + OnClick = CloseClick + end + object btSaveToFile: TSpeedButton [3] + Left = 154 + Top = 0 + Width = 75 + Height = 23 + Caption = '&Save to file' + OnClick = btSaveToFileClick + end + inherited DBNavigator: TDBNavigator + Left = 336 + Hints.Strings = () + end + end + object SaveDialog: TSaveDialog + DefaultExt = 'xml' + FileName = 'Data1.xml' + Filter = 'XML (*.xml)|*.xml|Any File (*.*)|*.*' + Left = 384 + Top = 34 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DADataEditor.pas b/internal/4.10.0.10/1/Source/Design/DADataEditor.pas new file mode 100644 index 0000000..82c0096 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADataEditor.pas @@ -0,0 +1,137 @@ +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Base Component Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DADataEditor; +{$ENDIF} + +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, DBGrids, Dialogs, + StdCtrls, ExtCtrls, Buttons, ComCtrls, Grids, DBCtrls, +{$ENDIF} +{$IFDEF LINUX} + SysUtils, Types, Classes, QGraphics, QControls, QForms, QDBGrids, QDialogs, QStdCtrls, + QExtCtrls, QButtons, QDBCtrls, QComCtrls, QGrids, +{$ENDIF} + DB, CRDataEditor, DBAccess, DADesignUtils; + +type + TDADataEditorForm = class(TCRDataEditorForm) + btOpen: TSpeedButton; + btnExit: TSpeedButton; + btSaveToFile: TSpeedButton; + SaveDialog: TSaveDialog; + procedure btOpenClick(Sender: TObject); + procedure btCloseClick(Sender: TObject); + procedure btSaveToFileClick(Sender: TObject); + private + // fields to store old DataSet properties + FOldAutoCommit: boolean; + FOldFilterOptions: TFilterOptions; + FOldFilterSQL: string; + FOldSQL: string; + FOldActive: boolean; + FOldFilter: string; + FOldFiltered: boolean; + protected + procedure DoInit; override; + procedure DoSave; override; + procedure DoFinish; override; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DADataEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses +{$IFDEF CLR} + Variants, +{$ENDIF} + TypInfo; + +{ TDADataEditorForm } + +procedure TDADataEditorForm.DoInit; +begin + inherited; + + FOldAutoCommit := TDBAccessUtils.GetAutoCommit(TCustomDADataSet(FDataSet)); + FOldFilterOptions := TCustomDADataSet(FDataSet).FilterOptions; + FOldFilterSQL := TCustomDADataSet(FDataSet).FilterSQL; + FOldSQL := TCustomDADataSet(FDataSet).SQL.Text; + FOldActive := FDataSet.Active; + TDBAccessUtils.SetAutoCommit(TCustomDADataSet(FDataSet), True); + FOldFilter := FDataSet.Filter; + FOldFiltered := FDataSet.Filtered; + FOldActive := FDataSet.Active; + try + FDataSet.Open; + except + Application.HandleException(Self); + end; + btOpen.Enabled := not FDataSet.Active; + btClose.Enabled := FDataSet.Active; +end; + +procedure TDADataEditorForm.DoSave; +begin +end; + +procedure TDADataEditorForm.DoFinish; +begin + TDBAccessUtils.SetAutoCommit(TCustomDADataSet(FDataSet), FOldAutoCommit); + TCustomDADataSet(FDataSet).FilterOptions := FOldFilterOptions; + TCustomDADataSet(FDataSet).FilterSQL := FOldFilterSQL; + if TCustomDADataSet(FDataSet).SQL.Text <> FOldSQL then + TCustomDADataSet(FDataSet).SQL.Text := FOldSQL; + FDataSet.Filter := FOldFilter; + FDataSet.Filtered := FOldFiltered; + FDataSet.Active := FOldActive; + + inherited; +end; + +procedure TDADataEditorForm.btOpenClick(Sender: TObject); +begin + FDataSet.Open; + btOpen.Enabled := not FDataSet.Active; + btClose.Enabled := FDataSet.Active; +end; + +procedure TDADataEditorForm.btCloseClick(Sender: TObject); +begin + FDataSet.Close; + btOpen.Enabled := not FDataSet.Active; + btClose.Enabled := FDataSet.Active; +end; + +procedure TDADataEditorForm.btSaveToFileClick(Sender: TObject); +begin + if SaveDialog.Execute then + FDataSet.SaveToXML(SaveDialog.FileName); +end; + +{$IFDEF CLR} + +initialization + + RegisterClass(TDBGrid); +{$ENDIF} + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DADataEditor.xfm b/internal/4.10.0.10/1/Source/Design/DADataEditor.xfm new file mode 100644 index 0000000..baba82f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADataEditor.xfm @@ -0,0 +1,45 @@ +inherited DADataEditorForm: TDADataEditorForm + Caption = 'DADataEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited pnlToolBar: TPanel + inherited btClose: TSpeedButton + OnClick = btCloseClick + end + object btOpen: TSpeedButton [1] + Left = 0 + Top = 0 + Width = 75 + Height = 23 + Caption = '&Open' + OnClick = btOpenClick + end + object btnExit: TSpeedButton [2] + Left = 233 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Exit' + OnClick = CloseClick + end + object btSaveToFile: TSpeedButton [3] + Left = 154 + Top = 0 + Width = 75 + Height = 23 + Caption = '&Save to file' + OnClick = btSaveToFileClick + end + inherited DBNavigator: TDBNavigator + Left = 240 + Hints.Strings = () + end + end + object SaveDialog: TSaveDialog + DefaultExt = 'xml' + FileName = 'Data1.xml' + Filter = 'XML (*.xml)|*.xml|Any File (*.*)|*.*' + Left = 384 + Top = 34 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DADesign.pas b/internal/4.10.0.10/1/Source/Design/DADesign.pas new file mode 100644 index 0000000..2605b79 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADesign.pas @@ -0,0 +1,2015 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright @ 1998-2007 Core Lab. All right reserved. +// DADesign +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DADesign; +{$ENDIF} +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + Registry, StdCtrls, +{$IFDEF CLR} + Borland.Vcl.Design.DesignEditors, Borland.Vcl.Design.DesignIntf, + Borland.Vcl.Design.FldLinks, + System.Runtime.InteropServices, +{$ELSE} + {$IFDEF VER6P}DesignIntf, DesignEditors,{$ELSE}DsgnIntf,{$ENDIF} + {$IFNDEF BCB}{$IFDEF VER5P}FldLinks, {$ENDIF}ColnEdit, {$ELSE}CRFldLinks,{$ENDIF} +{$ENDIF} +{$ENDIF} +{$IFDEF LINUX} + Types, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + DesignIntf, DesignEditors, CRFldLinks, +{$ENDIF} +{$IFDEF DBTOOLS} + Menus, + {$IFDEF CLR}Borland.Vcl.Design.DesignMenus{$ELSE}DesignMenus{$ENDIF}, + DBToolsIntf, + DBToolsClient, +{$ENDIF} + SysUtils, Classes, TypInfo, DBAccess, DAScript, DALoader, DADump, + CRFrame, CREditor, DADesignUtils, CRParser; + + procedure ConvertToClass(Designer:{$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}; Component: TComponent; NewClass: TComponentClass); + +{ ------------ DAC property editors ----------- } +type + TDAFieldsEditor = class (TPropertyEditor) + public + function GetAttributes: TPropertyAttributes; override; + function GetValue: string; override; + procedure Edit; override; + end; + + TDAPropertyEditor = class (TPropertyEditor) + public + function GetAttributes: TPropertyAttributes; override; + function GetValue: string; override; + procedure Edit; override; + end; + + TDAPasswordProperty = class(TStringProperty) + protected + FActivated: boolean; +{$IFNDEF CLR} + public +{$ENDIF} + procedure Initialize; override; +{$IFDEF CLR} + public +{$ENDIF} + procedure Activate; override; + function GetValue: string; override; + end; + + TDATableNameEditor = class (TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function AutoFill: boolean; override; + end; + + TDAUpdatingTableEditor = class (TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + end; + + TDADatabaseNameEditor = class (TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function AutoFill: boolean; override; + end; + + TDASPNameEditor = class (TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function AutoFill: boolean; override; + end; + + TDAFieldDefsListEditor = class (TStringProperty) // TDATableOrderFieldsEditor + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function AutoFill: boolean; override; + end; + + TDAFieldsListEditor = class (TStringProperty) // TDADataSetIndexFieldNamesEditor + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function AutoFill: boolean; override; + end; + + TDALoaderTableNameEditor = class (TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function AutoFill: boolean; override; + end; + +{$IFDEF LINUX} + TDADataSetMasterFieldsEditor = class (TCRFieldLinkProperty) +{$ELSE} +{$IFDEF BCB} + TDADataSetMasterFieldsEditor = class (TCRFieldLinkProperty) +{$ELSE} + TDADataSetMasterFieldsEditor = class (TFieldLinkProperty) +{$ENDIF} +{$ENDIF} + protected + function GetMasterFields: string; override; + procedure SetMasterFields(const Value: string); override; + function GetIndexFieldNames: string; override; + procedure SetIndexFieldNames(const Value: string); override; + end; + + TVariantEditor = class (TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + function GetValue: string; override; + procedure SetValue(const Value: string); override; + end; + + TDADatasetOrSQLProperty = class(TComponentProperty) + private + FCheckProc: TGetStrProc; + procedure CheckComponent(const Value: string); + public + procedure GetValues(Proc: TGetStrProc); override; + end; + + TDAUpdateSQLProperty = class(TComponentProperty) + private + FCheckProc: TGetStrProc; + procedure CheckComponent(const Value: string); + public + procedure GetValues(Proc: TGetStrProc); override; + end; + + TCustomDAConnectionClass = class of TCustomDAConnection; + + TDAConnectionList = class + private + procedure ListBoxDblClick(Sender: TObject); + procedure ListBoxKeyPress(Sender: TObject; var Key: Char); + {$IFDEF CLR} + procedure FormShow(Sender: TObject); + {$ENDIF} + + protected + Items: TStrings; + Form: TForm; + {$IFDEF CLR} + FormLeft: integer; + FormTop: integer; + {$ENDIF} + + procedure StrProc(const S: string); + function GetConnectionType: TCustomDAConnectionClass; virtual; abstract; + public + constructor Create; + destructor Destroy; override; + + function GetConnection(Component: TComponent; Designer: {$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}): TCustomDAConnection; + end; + +{$IFDEF VER6P} + + TDAConnectionListClass = class of TDAConnectionList; + + TDADesignNotification = class(TInterfacedObject, IDesignNotification) + protected + FItem: TPersistent; + FConnectionList: TDAConnectionList; + DSItems: TStrings; + procedure StrProc(const S: string); + procedure DSStrProc(const S: string); + public + procedure ItemDeleted(const ADesigner: IDesigner; AItem: TPersistent); virtual; + //overide this method on Product level and add all product specific classess + procedure ItemInserted(const ADesigner: IDesigner; AItem: TPersistent); virtual; abstract; + procedure ItemsModified(const ADesigner: IDesigner); virtual; + procedure SelectionChanged(const ADesigner: IDesigner; + const ASelection: IDesignerSelections); virtual; + procedure DesignerOpened(const ADesigner: IDesigner + {$IFNDEF K1}; AResurrecting: Boolean{$ENDIF}); virtual; + procedure DesignerClosed(const ADesigner: IDesigner + {$IFNDEF K1}; AGoingDormant: Boolean{$ENDIF}); virtual; + + function CreateConnectionList: TDAConnectionList; virtual; abstract; + function GetConnectionPropertyName: string; virtual; abstract; + end; +{$ENDIF} + +{ ------------ DAC component editors ----------- } +type + TVerbMethod = procedure of object; + TVerb = record + Caption: string; + Method: TVerbMethod; + end; + TVerbs = array of TVerb; + + TDAComponentEditorClass = class of TDAComponentEditor; + TDAComponentEditor = class (TComponentEditor) + protected + FCREditorClass: TCREditorClass; + FDADesignUtilsClass: TDADesignUtilsClass; + + FVerbs: TVerbs; + {$IFDEF DBTOOLS} + FDBToolsVerbs: TDBToolsVerbs; + FDBToolsSingleVerb: TDBToolsVerb; + FDBToolsVerbIndex: integer; + {$ENDIF} + function AddVerb(const Caption: string; Method: TVerbMethod): integer; overload; + function AddVerb(const Caption: string; CREditorClass: TCREditorClass; DADesignUtilsClass: TDADesignUtilsClass): integer; overload; + procedure InitVerbs; virtual; + + procedure ShowEditor; overload; + procedure ShowEditor(const InitialProperty: string); overload; + {$IFDEF DBTOOLS} + procedure AddDBToolsVerbs(Verbs: TDBToolsVerbs); + procedure DBToolsMenuExecute; + {$ENDIF} + public + constructor Create(AComponent: TComponent; ADesigner: {$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}); override; + + function GetVerbCount: integer; override; + function GetVerb(Index: integer): string; override; + procedure ExecuteVerb(Index: integer); override; + procedure Edit; override; + {$IFDEF DBTOOLS} + procedure PrepareItem(Index: integer; const AItem: IMenuItem); override; + {$ENDIF} + end; + + TDAConnectionEditor = class(TDAComponentEditor); + + TDASQLEditor = class(TDAComponentEditor); + + TDAScriptEditor = class(TDAComponentEditor); + + TDAUpdateSQLEditor = class(TDAComponentEditor); + + TDADataSetEditor = class(TDAComponentEditor) + private +{$IFDEF MSWINDOWS} +{$IFNDEF VER8} + procedure ExecuteDsmAction(const ProcName: string); + procedure DsmCreateDefaultControl; + procedure DsmShowInDataSetManager; + procedure Separator; +{$ENDIF} +{$ENDIF} + protected + procedure ShowFieldsEditor; + procedure ShowDataEditor; +{$IFDEF MSWINDOWS} +{$IFNDEF VER8} + procedure InitVerbs; override; +{$ENDIF} +{$ENDIF} + end; + + TDALoaderEditor = class(TDAComponentEditor) + protected + procedure InitVerbs; override; + procedure ShowColEditor; + procedure CreateColumns; + end; + +{$IFDEF MSWINDOWS} + TDASQLMonitorEditor = class (TDAComponentEditor) + protected + procedure RunDBMonitor; + procedure RunSQLMonitor; + procedure InitVerbs; override; + public + procedure Edit; override; + end; +{$ENDIF} + + TCRDataSourceEditor = class(TDAComponentEditor) + private + Items: TStrings; + FFirstProp: {$IFDEF VER6P}IProperty{$ELSE}TPropertyEditor{$ENDIF}; + procedure StrProc(const S: string); + procedure ConvertToDataSource; + procedure CheckEdit({$IFDEF VER6P}const Prop: IProperty{$ELSE}Prop: TPropertyEditor{$ENDIF}); + protected + procedure InitVerbs; override; + public + constructor Create(Component: TComponent; aDesigner: {$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}); override; + procedure Edit; override; + end; + + TDesignMacros = class(TMacros) + protected + function GetMacroValue(Macro: TMacro): string; override; + public + procedure Scan(var SQL: string); reintroduce; + end; + +procedure Register; +procedure DARegisterComponentEditor(ComponentClass: TComponentClass; ComponentEditor: TDAComponentEditorClass; + CREditorClass: TCREditorClass; + DADesignUtilsClass: TDADesignUtilsClass); +procedure ShowEditor( + CREditorClass: TCREditorClass; + DADesignUtilsClass: TDADesignUtilsClass; + Component: TComponent; + Designer:{$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}; + InitialProperty: string = '' +); + +implementation + +uses +{$IFDEF CLR} + Borland.Studio.ToolsAPI, Borland.VCL.Design.DSDesign, Borland.Vcl.Design.ColnEdit, + MemUtils, +{$ELSE} + ToolsAPI, +{$IFNDEF BCB} +{$IFNDEF LINUX} + DSDesign, +{$ENDIF} +{$ENDIF} +{$ENDIF} +{$IFDEF VER6P} + Variants, +{$ENDIF} +{$IFDEF MSWINDOWS} + DBMonitorClient, DASQLMonitor, ShellAPI, +{$ENDIF} +{$IFDEF DBTOOLS} + Download, +{$ENDIF} + DB, CRAccess, + DAConnectionEditor, DATableEditor, DAQueryEditor, DASQLEditor, DADataEditor, CRTabEditor, + DAStoredProcEditor, DAScriptEditor, DADumpEditor, + DAParamsFrame, DAMacrosFrame, DAConsts; + +type + TDAComponentInfo = record + ComponentClass: TComponentClass; + ComponentEditor: TDAComponentEditorClass; + CREditorClass: TCREditorClass; + DADesignUtilsClass: TDADesignUtilsClass + end; + +var + ComponentsInfo: array of TDAComponentInfo; + NotificationActive: boolean; + +procedure DARegisterComponentEditor(ComponentClass: TComponentClass; ComponentEditor: TDAComponentEditorClass; + CREditorClass: TCREditorClass; + DADesignUtilsClass: TDADesignUtilsClass); +var + i: integer; +begin + RegisterComponentEditor(ComponentClass, ComponentEditor); + i := Length(ComponentsInfo); + SetLength(ComponentsInfo, i + 1); + ComponentsInfo[i].ComponentClass := ComponentClass; + ComponentsInfo[i].ComponentEditor := ComponentEditor; + ComponentsInfo[i].CREditorClass := CREditorClass; + ComponentsInfo[i].DADesignUtilsClass := DADesignUtilsClass; +end; + +procedure ConvertToClass(Designer:{$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}; Component: TComponent; NewClass: TComponentClass); +type + TPropData = record + Component: TComponent; + PropInfo: PPropInfo; + end; +var + AName: string; + NewComponent: TComponent; + DesignInfo: Longint; + Instance: TComponent; + + FreeNotifies: TList; + i, j, PropCount: integer; +{$IFDEF CLR} + PropList: TPropList; +{$ELSE} + PropList: PPropList; +{$ENDIF} + Refs: array of TPropData; + l: integer; + + Root: TComponent; + OldNotificationActive: boolean; +begin + DesignInfo := Component.DesignInfo; + OldNotificationActive := NotificationActive; + try + NotificationActive := False; + NewComponent := Designer.CreateComponent(NewClass, Component.Owner, + Word(DesignInfo {$IFDEF CLR}shr 16{$ENDIF}), Word(DesignInfo {$IFNDEF CLR}shr 16{$ENDIF}), 28, 28); + finally + NotificationActive := OldNotificationActive; + end; + AName := Component.Name; + Component.Name := 'CRTemp_' + AName; + FreeNotifies := TList.Create; + try +{$IFDEF VER6P} + Root := Designer.Root; +{$ELSE} + Root := Designer.ContainerWindow; +{$ENDIF} + for i := 0 to Root.ComponentCount - 1 do begin + FreeNotifies.Add(Root.Components[i]); + end; + for i := 0 to FreeNotifies.Count - 1 do begin + Instance := TComponent(FreeNotifies[i]); + {$IFDEF CLR} + PropList := GetPropList(Instance.ClassInfo, [tkClass]{$IFNDEF CLR}, nil{$IFDEF VER6P}, False{$ENDIF}{$ENDIF}); + PropCount := Length(PropList); + if PropCount > 0 then begin + {$ELSE} + PropCount := GetPropList(Instance.ClassInfo, [tkClass]{$IFNDEF CLR}, nil{$IFDEF VER6P}, False{$ENDIF}{$ENDIF}); + if PropCount > 0 then begin + GetMem(PropList, PropCount * SizeOf(PropList[0])); + try + GetPropList(Instance.ClassInfo, [tkClass]{$IFNDEF CLR}, PropList{$IFDEF VER6P}, False{$ENDIF}{$ENDIF}); + {$ENDIF} + for j := 0 to PropCount - 1 do begin + if (PropList[j].PropType <> nil) and + ({$IFDEF CLR}KindOf(PropList[j].PropType){$ELSE}PropList[j].PropType^.Kind{$ENDIF}= tkClass) + and (TComponent(GetObjectProp(Instance, PropList[j])) = Component) + then begin + l := Length(Refs); + SetLength(Refs, l + 1); + Refs[l].Component := Instance; + Refs[l].PropInfo := PropList[j]; + end; + end; + {$IFNDEF CLR} + finally + FreeMem(PropList); + end; + end; + {$ELSE} + end; + {$ENDIF} + end; + finally + FreeNotifies.Free; + end; + NewComponent.Assign(Component); + for i := 0 to Length(Refs) - 1 do begin + SetObjectProp(Refs[i].Component, Refs[i].PropInfo, NewComponent); + end; + Component.Free; + NewComponent.Name := AName; + Designer.Modified; +end; + +type +{$IFDEF LINUX} + {$DEFINE OLDDESIGNER} +{$ENDIF} +{$IFDEF BCB} + {$DEFINE OLDDESIGNER} +{$ENDIF} + +{$IFDEF OLDDESIGNER} + TDADSDesigner = class (TDataSetDesigner) + private + FFieldsEditor: TForm; // TFieldsEditor; // WAR For support TDSDesigner + public + constructor Create(DataSet: TDataSet); + destructor Destroy; override; + property FieldsEditor: TForm read FFieldsEditor; + end; +{$ELSE} + TDADSDesigner = TDSDesigner; +{$ENDIF} + +{$IFDEF OLDDESIGNER} +var + DataSetEditorClass: TComponentEditorClass; + + +{ TOraDSDesigner } +constructor TDADSDesigner.Create(DataSet: TDataSet); +begin + inherited Create(DataSet); + + FFieldsEditor := nil; +end; + +destructor TDADSDesigner.Destroy; +begin + inherited; +end; +{$ENDIF} + +procedure ShowEditor( + CREditorClass: TCREditorClass; + DADesignUtilsClass: TDADesignUtilsClass; + Component: TComponent; + Designer:{$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}; + InitialProperty: string = '' +); +var + CREditor: TCREditorForm; +begin + Assert(CREditorClass <> nil); + CREditor := CREditorClass.Create(nil, DADesignUtilsClass); + try + CREditor.Component := Component; + TCREditorForm(CREditor).InitialProperty := InitialProperty; + if CREditor.ShowModal = mrOk then + if Designer <> nil then + Designer.Modified; + finally + CREditor.Free; + end; +end; + +{ TDAFieldsEditor } + +function TDAFieldsEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paDialog, paReadOnly]; +end; + +function TDAFieldsEditor.GetValue: string; +begin + Result := '(' + DB.TFields.ClassName + ')'; +end; + +procedure TDAFieldsEditor.Edit; +var + NeedCreate: boolean; + DADSDesigner: TDADSDesigner; + Component: TComponent; +{$IFDEF OLDDESIGNER} + DataSetEditor: TComponentEditor; +{$ENDIF} +begin + Component := TComponent(GetComponent(0)); + + if (Component as TDataSet).Designer = nil then + NeedCreate := True + else + if (Component as TDataSet).Designer is TDADSDesigner then begin + (Component as TDataSet).Designer.Free; + NeedCreate := True; + end + else + NeedCreate := False; + + if NeedCreate then begin + {$IFDEF OLDDESIGNER} + DataSetEditor := DataSetEditorClass.Create(Component, Designer) as TComponentEditor; + try + DataSetEditor.ExecuteVerb(0); + finally + DataSetEditor.Free; + end; + {$ELSE} + {$IFDEF CLR}Borland.VCL.Design.{$ENDIF}DSDesign.ShowFieldsEditor(Designer, TDataSet(Component), TDSDesigner); + {$ENDIF} + end + else begin + DADSDesigner := TDADSDesigner((Component as TDataSet).Designer); + DADSDesigner.FieldsEditor.Show; + end; +end; + +{ TDAPropertyEditor } + +function TDAPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paDialog, paReadOnly]; +end; + +function TDAPropertyEditor.GetValue: string; +var +{$IFDEF CLR} + PropInfo: TPropInfo; +{$ELSE} + PropInfo: PPropInfo; +{$ENDIF} + Obj: TPersistent; +begin + Obj := nil; + PropInfo := GetPropInfo; + if (PropInfo <> nil) and (PropInfo.PropType{$IFNDEF CLR}^{$ENDIF}.Kind = tkClass) then begin + {$IFDEF CLR} + Obj := GetObjectProp(GetComponent(0), PropInfo) as TPersistent; + {$ELSE} + Obj := TPersistent(integer(GetPropValue(GetComponent(0), GetName))); + {$ENDIF} + end; + if Obj <> nil then + Result := '(' + GetPropType.Name + ')' // CR 19906 S + else + Result := inherited GetValue; +end; + +procedure TDAPropertyEditor.Edit; +var + Component: TComponent; + i: integer; +begin + Component := GetComponent(0) as TComponent; + + for i := 0 to Length(ComponentsInfo) - 1 do + if Component is ComponentsInfo[i].ComponentClass then begin + ShowEditor(ComponentsInfo[i].CREditorClass, ComponentsInfo[i].DADesignUtilsClass, Component, Designer, GetName); + Exit; + end; + Assert(False); +end; + +{ TDAPasswordProperty } + +procedure TDAPasswordProperty.Initialize; +begin + inherited; + + FActivated := False; +end; + +function TDAPasswordProperty.GetValue: string; +var + i: Integer; +begin + Result := inherited GetValue; + if not FActivated then begin + for i := 1 to Length(Result) do + Result[i] := '*'; + end + else + FActivated := False; +end; + +procedure TDAPasswordProperty.Activate; +begin + inherited; + + FActivated := True; +end; + +{ TDATableNameEditor } + +function TDATableNameEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +function TDATableNameEditor.AutoFill: boolean; +begin + Result := False; +end; + +procedure TDATableNameEditor.GetValues(Proc: TGetStrProc); +var + List: TStringList; + i: integer; + Component: TComponent; + UsedConnection: TCustomDAConnection; +begin + Assert(PropCount > 0, 'PropCount = 0'); + Component := GetComponent(0) as TComponent; + Assert(Component is TCustomDADataSet, Component.ClassName); + + UsedConnection := TDBAccessUtils.UsedConnection(TCustomDADataSet(Component)); + if UsedConnection = nil then + Exit; + + List := TStringList.Create; + try + UsedConnection.GetTableNames(List); + // List.Sort; + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + end; +end; + +{ TDAUpdatingTableEditor } + +function TDAUpdatingTableEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +procedure TDAUpdatingTableEditor.GetValues(Proc: TGetStrProc); +var + Component: TComponent; + DataSet: TCustomDADataset; + TablesInfo: TCRTablesInfo; + UsedConnection: TCustomDAConnection; + + i: integer; + OldSQL: string; + OldActive: boolean; + +begin + Component := TComponent(GetComponent(0)); + DataSet := Component as TCustomDADataset; + + if (DataSet = nil) then + Exit; + UsedConnection := TDBAccessUtils.UsedConnection(DataSet); + if (UsedConnection = nil) or not UsedConnection.Connected then + Exit; + + OldSQL := DataSet.SQL.text; + OldActive := DataSet.Active; + try + TablesInfo := TDBAccessUtils.GetTablesInfo(DataSet); + try + if TablesInfo.Count = 0 then begin + DataSet.AddWhere('0=1'); + DataSet.Active := True; + TablesInfo := TDBAccessUtils.GetTablesInfo(DataSet); + end; + + for i := 0 to TablesInfo.Count - 1 do + Proc(TablesInfo[i].TableName); + except + end; + + finally + if DataSet.SQL.Text <> OldSQL then + DataSet.SQL.Text := OldSQL; + + if DataSet.Active <> OldActive then + DataSet.Active := OldActive; + end; +end; + +{ TDADatabaseNameEditor } + +function TDADatabaseNameEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +function TDADatabaseNameEditor.AutoFill: boolean; +begin + Result := False; +end; + +procedure TDADatabaseNameEditor.GetValues(Proc: TGetStrProc); +var + List: TStringList; + i: integer; + Component: TComponent; +begin + Assert(PropCount > 0, 'PropCount = 0'); + Component := GetComponent(0) as TComponent; + Assert(Component is TCustomDAConnection, Component.ClassName); + + List := TStringList.Create; + try + TCustomDAConnection(Component).GetDatabaseNames(List); + List.Sort; + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + end; +end; + +{ TDASPNameEditor } + +function TDASPNameEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +function TDASPNameEditor.AutoFill: boolean; +begin + Result := False; +end; + +procedure TDASPNameEditor.GetValues(Proc: TGetStrProc); +var + List: TStringList; + i: integer; + Component: TComponent; + UsedConnection: TCustomDAConnection; +begin + Assert(PropCount > 0, 'PropCount = 0'); + Component := GetComponent(0) as TComponent; + Assert(Component is TCustomDADataSet, Component.ClassName); + + UsedConnection := TDBAccessUtils.UsedConnection(TCustomDADataSet(Component)); + if UsedConnection = nil then + Exit; + + List := TStringList.Create; + try + UsedConnection.GetStoredProcNames(List); + List.Sort; + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + end; +end; + +{ TDAFieldDefsListEditor } + +function TDAFieldDefsListEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +function TDAFieldDefsListEditor.AutoFill: boolean; +begin + Result := False; +end; + +procedure TDAFieldDefsListEditor.GetValues(Proc: TGetStrProc); +var + i: integer; + Component: TComponent; + Table: TCustomDADataSet; + DataSetUtils: TDADataSetUtils; +begin + Assert(PropCount > 0, 'PropCount = 0'); + Component := GetComponent(0) as TComponent; + Assert(Component is TCustomDADataSet, Component.ClassName); + + DataSetUtils := TDADataSetUtils.Create; + try + Table := TCustomDADataSet(GetComponent(0)); + DataSetUtils.QuickOpen(Table); + + for i := 0 to Table.FieldDefs.Count - 1 do + Proc(Table.FieldDefs[i].Name); + + finally + DataSetUtils.Restore(True); + DataSetUtils.Free; + end; +end; + +{ TDAFieldsListEditor } + +function TDAFieldsListEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +function TDAFieldsListEditor.AutoFill: boolean; +begin + Result := False; +end; + +procedure TDAFieldsListEditor.GetValues(Proc: TGetStrProc); +var + i: integer; + Component: TComponent; + Table: TCustomDADataSet; + DataSetUtils: TDADataSetUtils; +begin + Assert(PropCount > 0, 'PropCount = 0'); + Component := GetComponent(0) as TComponent; + Assert(Component is TCustomDADataSet, Component.ClassName); + + DataSetUtils := TDADataSetUtils.Create; + try + Table := TCustomDADataSet(GetComponent(0)); + DataSetUtils.QuickOpen(Table); + + for i := 0 to Table.Fields.Count - 1 do + Proc(Table.Fields[i].FieldName); + + finally + DataSetUtils.Restore(True); + DataSetUtils.Free; + end; +end; + +{ TDALoaderTableNameEditor } + +function TDALoaderTableNameEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +function TDALoaderTableNameEditor.AutoFill: boolean; +begin + Result := False; +end; + +procedure TDALoaderTableNameEditor.GetValues(Proc: TGetStrProc); +var + List: TStrings; + i: integer; + UsedConnection: TCustomDAConnection; +begin + List := TStringList.Create; + try + UsedConnection := TDALoaderUtils.UsedConnection(TDALoader(GetComponent(0))); + if UsedConnection = nil then + exit; + UsedConnection.GetTableNames(List); + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + end; +end; + + +{ TDADataSetMasterFieldsEditor } + +function TDADataSetMasterFieldsEditor.GetMasterFields: string; +begin + Result := (DataSet as TCustomDADataSet).MasterFields; +end; + +procedure TDADataSetMasterFieldsEditor.SetMasterFields(const Value: string); +begin + (DataSet as TCustomDADataSet).MasterFields := Value; +end; + +function TDADataSetMasterFieldsEditor.GetIndexFieldNames: string; +begin + Result := (DataSet as TCustomDADataSet).DetailFields; +end; + +procedure TDADataSetMasterFieldsEditor.SetIndexFieldNames(const Value: string); +begin + (DataSet as TCustomDADataSet).DetailFields := Value; +end; + +{ TVariantEditor } + +function TVariantEditor.GetAttributes: TPropertyAttributes; +begin + if VarIsArray(GetVarValue) then + Result := [paReadOnly] + else + Result := inherited GetAttributes; +end; + +function TVariantEditor.GetValue: string; +begin + if VarIsArray(GetVarValue) then + Result := '' + else + Result := GetVarValue;//inherited GetValue; +end; + +procedure TVariantEditor.SetValue(const Value: string); +begin + SetVarValue(Value); +end; + +{ TDADatasetOrSQLProperty } + +procedure TDADatasetOrSQLProperty.CheckComponent(const Value: string); +var + i: integer; + Component: TComponent; + AClass: TClass; + DataSetClass: TCustomDADataSetClass; + SQLClass: TCustomDASQLClass; + UpdateSQL: TCustomDAUpdateSQL; +begin + DataSetClass := nil; + SQLClass := nil; + Component := Designer.GetComponent(Value); + if Component <> nil then begin + for i := 0 to PropCount - 1 do begin + UpdateSQL := TCustomDAUpdateSQL(GetComponent(i)); + if UpdateSQL.Dataset = Component then + Exit; + if (i = 0) or (DataSetClass <> nil) then begin + AClass := TDBAccessUtils.GetDataSetClass(UpdateSQL); + if (i > 0) and (AClass <> DataSetClass) then + DataSetClass := nil + else + DataSetClass := TCustomDADataSetClass(AClass); + end; + if (i = 0) or (SQLClass <> nil) then begin + AClass := TDBAccessUtils.GetSQLClass(UpdateSQL); + if (i > 0) and (AClass <> SQLClass) then + SQLClass := nil + else + SQLClass := TCustomDASQLClass(AClass); + end; + end; + if not ((Component is SQLClass) or (Component is DataSetClass)) then + Exit; + end; + FCheckProc(Value); +end; + +procedure TDADatasetOrSQLProperty.GetValues(Proc: TGetStrProc); +begin + FCheckProc := Proc; + inherited GetValues(CheckComponent); +end; + +{ TDAUpdateSQLProperty } + +procedure TDAUpdateSQLProperty.CheckComponent(const Value: string); +var + i, j: integer; + UpdateObject: TComponent; + UpdateSQL: TCustomDAUpdateSQL; + DataSetClass: TCustomDADataSetClass; +begin + Assert(Designer.GetComponent(Value) is TCustomDAUpdateSQL); + UpdateSQL := TCustomDAUpdateSQL(Designer.GetComponent(Value)); + + DataSetClass := TDBAccessUtils.GetDataSetClass(UpdateSQL); + for i := 0 to PropCount - 1 do + if not (GetComponent(i) is DataSetClass) then + Exit; + + for i := 0 to 3 do begin + UpdateObject := nil; + case i of + 0: UpdateObject := UpdateSQL.ModifyObject; + 1: UpdateObject := UpdateSQL.InsertObject; + 2: UpdateObject := UpdateSQL.DeleteObject; + 3: UpdateObject := UpdateSQL.RefreshObject; + end; + + if UpdateObject <> nil then + for j := 0 to PropCount - 1 do + if TCustomDADataSet(GetComponent(j)) = UpdateObject then + Exit; + end; + + FCheckProc(Value); +end; + +procedure TDAUpdateSQLProperty.GetValues(Proc: TGetStrProc); +begin + FCheckProc := Proc; + inherited GetValues(CheckComponent); +end; + +{ TDAConnectionList } + +constructor TDAConnectionList.Create; +begin + inherited; + + Items := TStringList.Create; +end; + +destructor TDAConnectionList.Destroy; +begin + Items.Free; + + inherited; +end; + +procedure TDAConnectionList.StrProc(const S: string); +begin +{$IFNDEF VER6P} + Items.Add(S); +{$ENDIF} +end; + +procedure TDAConnectionList.ListBoxDblClick(Sender: TObject); +begin + Form.ModalResult := mrOk; +end; + +procedure TDAConnectionList.ListBoxKeyPress(Sender: TObject; var Key: Char); +begin + case Key of + #13: + Form.ModalResult := mrOk; + #27: + Form.ModalResult := mrCancel; + end; +end; + +{$IFDEF CLR} /// DAC 11241 +procedure TDAConnectionList.FormShow(Sender: TObject); +begin + Form.Left := FormLeft - 20; + Form.Top := FormTop - 20; +end; +{$ENDIF} + +function TDAConnectionList.GetConnection(Component: TComponent; Designer: {$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}): TCustomDAConnection; +const + Width = 124; + Height = 180; +var + ListBox: TListBox; + TypeData: TTypeData; +{$IFDEF VER6P} + DesignOffset: TPoint; +{$ENDIF} +begin +{$IFDEF CLR} + TypeData := TTypeData.Create(TypeOf(GetConnectionType)); + Designer.GetComponentNames(TypeData, StrProc); +{$ELSE} + TypeData.ClassType := GetConnectionType; + Designer.GetComponentNames(@TypeData, StrProc); +{$ENDIF} + + if Items.Count = 0 then + Result := nil + else + if Items.Count = 1 then + Result := TCustomDAConnection(Designer.GetComponent(Items[0])) + else begin + Form := TForm.Create(nil); + ListBox := TListBox.Create(Form); + {$IFDEF MSWINDOWS} + Form.BorderStyle := bsSizeToolWin; + {$ENDIF} + {$IFDEF LINUX} + Form.BorderStyle := fbsSizeToolWin; + {$ENDIF} + {$IFDEF VER6P} + if Designer.Root is TForm then begin + {$IFDEF CLR} + DesignOffset := (Designer.Root as TForm).ClientToScreen(TPoint.Create(Word(Designer.Root.DesignInfo), Word(Designer.Root.DesignInfo shr 16))); + FormLeft := DesignOffset.X + Word(Component.DesignInfo shr 16) - Width div 3; + FormTop := DesignOffset.Y + Word(Component.DesignInfo) - 5; + {$ELSE} + DesignOffset := TForm(Designer.Root).BoundsRect.TopLeft; + {$ENDIF} + end + else + {$IFDEF CLR} + DesignOffset := TPoint.Create(Word(Designer.Root.DesignInfo), Word(Designer.Root.DesignInfo shr 16)); + {$ELSE} + DesignOffset := Point(LongRec(Designer.Root.DesignInfo).Lo, LongRec(Designer.Root.DesignInfo).Hi); + Form.Left := DesignOffset.X + Word(Component.DesignInfo) - Width div 3; + Form.Top := DesignOffset.Y + Word(Component.DesignInfo shr 16) - 5; + {$ENDIF} + {$ELSE} + Form.Left := Designer.Form.Left + LongRec(Component.DesignInfo).Lo - Width div 3; + Form.Top := Designer.Form.Top + LongRec(Component.DesignInfo).Hi - 5; + {$ENDIF} + Form.Width := Width; + Form.Height := Height; + Form.Caption := 'Connection List'; + Form.InsertControl(TControl(ListBox));//Form.InsertControl(QControls.TControl(ListBox)); + ListBox.Items.Assign(Items); + ListBox.Align := alClient; + ListBox.ItemIndex := 0; + ListBox.OnDblClick := ListBoxDblClick; + ListBox.OnKeyPress := ListBoxKeyPress; + {$IFDEF CLR} + Form.OnShow := FormShow; + {$ENDIF} + + if Form.ShowModal = mrOk then + Result := TCustomDAConnection(Designer.GetComponent(Items[ListBox.ItemIndex])) + else + Result := nil; + Form.Free; + end; +end; + +{$IFDEF VER6P} + +{ TDADesignNotification } + +procedure TDADesignNotification.DesignerClosed(const ADesigner: IDesigner + {$IFNDEF K1}; AGoingDormant: Boolean{$ENDIF}); +begin + +end; + +procedure TDADesignNotification.DesignerOpened(const ADesigner: IDesigner + {$IFNDEF K1}; AResurrecting: Boolean{$ENDIF}); +begin + +end; + +procedure TDADesignNotification.ItemDeleted(const ADesigner: IDesigner; + AItem: TPersistent); +begin + +end; + +procedure TDADesignNotification.StrProc(const S: string); +begin + FConnectionList.Items.Add(S); +end; + +procedure TDADesignNotification.DSStrProc(const S: string); +begin + DSItems.Add(S); +end; + +procedure TDADesignNotification.ItemsModified(const ADesigner: IDesigner); +var + Component: TComponent; + TypeData: TTypeData; + i, Width, Height: integer; + DS: TDataSet; + DADesignUtilsClass: TDADesignUtilsClass; + Modified: boolean; +begin + if (FItem <> nil) and (FItem is TCRDataSource) then begin + try + Component := TComponent(FItem); + with TCRDataSource(Component) do + if TDBAccessUtils.GetDesignCreate(TCRDataSource(Component)) then begin + DSItems := TStringList.Create; + try + {$IFDEF CLR} + TypeData := TTypeData.Create(TypeOf(TDataSet)); + ADesigner.GetComponentNames(TypeData, DSStrProc); + {$ELSE} + TypeData.ClassType := TDataSet; + ADesigner.GetComponentNames(@TypeData, DSStrProc); + {$ENDIF} + for i := 0 to DSItems.Count - 1 do begin + DS := TDataSet(ADesigner.GetComponent(DSItems[i])); + Width := Word(DesignInfo) - Word(DS.DesignInfo); + Height := Word(DesignInfo shr 16) - Word(DS.DesignInfo shr 16); + if (Width >= -32) and (Width <= 32) and + (Height >= -32) and (Height <= 32) + then begin + DataSet := DS; + break; + end; + end; + TDBAccessUtils.SetDesignCreate(TCRDataSource(Component), False); + finally + DSItems.Free; + end + end; + finally + FItem := nil; + ADesigner.Modified; + end; + end + + else begin + if FConnectionList <> nil then + exit; + if not NotificationActive then + FItem := nil + else + if FItem <> nil then begin + Modified := False; + DADesignUtilsClass := nil; + try + for i := 0 to Length(ComponentsInfo) - 1 do + if FItem is ComponentsInfo[i].ComponentClass then begin + DADesignUtilsClass := ComponentsInfo[i].DADesignUtilsClass; + Modified := True; + Break; + end; + Modified := Modified and (DADesignUtilsClass.GetConnection(TComponent(FItem)) = nil); + if Modified then + try + FConnectionList := CreateConnectionList; + ADesigner.GetComponentNames(GetTypeData(FConnectionList.GetConnectionType.ClassInfo), StrProc); + SetObjectProp(FItem, GetConnectionPropertyName, FConnectionList.GetConnection(TComponent(FItem), ADesigner)); + finally + FreeAndNil(FConnectionList); + end; + finally + FItem := nil; + if Modified then + ADesigner.Modified; + end; + end; + end; +end; + +procedure TDADesignNotification.SelectionChanged( + const ADesigner: IDesigner; const ASelection: IDesignerSelections); +begin + +end; +{$ENDIF} + +{ TDAComponentEditor } + +constructor TDAComponentEditor.Create(AComponent: TComponent; ADesigner: {$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}); +var + i: integer; +{$IFNDEF VER6P} + Connection: TCustomDAConnection; +{$ENDIF} +begin +{$IFDEF DBTOOLS} + FDBToolsVerbIndex := -1; +{$ENDIF} + inherited; + + for i := 0 to Length(ComponentsInfo) - 1 do + if AComponent is ComponentsInfo[i].ComponentClass then begin + FDADesignUtilsClass := ComponentsInfo[i].DADesignUtilsClass; + Break; + end; + + InitVerbs; + +{$IFNDEF VER6P} + if (FDADesignUtilsClass <> nil) + and FDADesignUtilsClass.HasConnection(Component) + and FDADesignUtilsClass.GetDesignCreate(Component) then begin + + with TDAConnectionList(FDADesignUtilsClass.GetConnectionList) do begin + Connection := GetConnection(Component, Designer); + FDADesignUtilsClass.SetConnection(Component, Connection); + Free; + end; + FDADesignUtilsClass.SetDesignCreate(Component, False); + end; +{$ENDIF} +end; + +procedure TDAComponentEditor.InitVerbs; +begin +end; + +procedure TDAComponentEditor.ShowEditor(const InitialProperty: string); +begin + {$IFDEF CLR}CoreLab.Dac.Design.{$ENDIF}DADesign.ShowEditor(FCREditorClass, FDADesignUtilsClass, Component, Designer, InitialProperty); +end; + +procedure TDAComponentEditor.ShowEditor; +begin + {$IFDEF CLR}CoreLab.Dac.Design.{$ENDIF}DADesign.ShowEditor(FCREditorClass, FDADesignUtilsClass, Component, Designer); +end; + +{$IFDEF DBTOOLS} +procedure TDAComponentEditor.AddDBToolsVerbs(Verbs: TDBToolsVerbs); +var + IsSingle: boolean; + VerbIdx: TDBToolsVerb; +begin + if not FDADesignUtilsClass.DBToolsAvailable then begin + if FDADesignUtilsClass.NeedToCheckDbTools = ncExpired then + Exit; + FDADesignUtilsClass.SetDBToolsDownloadParams(True, FDADesignUtilsClass.NeedToCheckDbTools = ncIncompatible); + if NoCheckForTools(FDADesignUtilsClass.NeedToCheckDbTools = ncIncompatible) then + Exit; + end; + + IsSingle := False; + for VerbIdx := Low(TDBToolsVerb) to High(TDBToolsVerb) do + if VerbIdx in Verbs then begin + IsSingle := not IsSingle; + if not IsSingle then + Break; + FDBToolsSingleVerb := VerbIdx; + end; + + if IsSingle then + FDBToolsVerbIndex := AddVerb(DBTools.MenuActions[FDBToolsSingleVerb].Caption, DBToolsMenuExecute) + else begin + FDBToolsVerbs := Verbs; + FDBToolsVerbIndex := AddVerb(FDADesignUtilsClass.GetDBToolsMenuCaption, DBToolsMenuExecute); + end; +end; + +procedure TDAComponentEditor.DBToolsMenuExecute; +begin + DBTools.PrepareMenu(Designer, Component, FDADesignUtilsClass); + if FDBToolsVerbs = [] then //Single verb + DBTools.MenuActions[FDBToolsSingleVerb].Execute; +end; + +procedure TDAComponentEditor.PrepareItem(Index: integer; const AItem: IMenuItem); +var + VerbIdx: TDBToolsVerb; +begin + if (Index = FDBToolsVerbIndex) and (FDBToolsVerbs <> []) then + for VerbIdx := Low(TDBToolsVerb) to High(TDBToolsVerb) do + if VerbIdx in FDBToolsVerbs then + AItem.AddItem(DBTools.MenuActions[VerbIdx]); +end; +{$ENDIF} + +function TDAComponentEditor.AddVerb(const Caption: string; Method: TVerbMethod): integer; +begin + Result := Length(FVerbs); + SetLength(FVerbs, Result + 1); + FVerbs[Result].Caption := Caption; + FVerbs[Result].Method := Method; +end; + +function TDAComponentEditor.AddVerb(const Caption: string; CREditorClass: TCREditorClass; DADesignUtilsClass: TDADesignUtilsClass): integer; +begin + Assert(FCREditorClass = nil); + FCREditorClass := CREditorClass; + Assert(FDADesignUtilsClass <> nil); + Result := AddVerb(Caption, ShowEditor); +end; + +function TDAComponentEditor.GetVerbCount: integer; +{$IFDEF DBTOOLS} +var + i: integer; +{$ENDIF} +begin +{$IFDEF DBTOOLS} + if (FDBToolsVerbIndex >=0) and not FDADesignUtilsClass.DBToolsAvailable then begin + FDADesignUtilsClass.SetDBToolsDownloadParams(True, FDADesignUtilsClass.NeedToCheckDbTools = ncIncompatible); + if NoCheckForTools(FDADesignUtilsClass.NeedToCheckDbTools = ncIncompatible) then begin + for i := FDBToolsVerbIndex to Length(FVerbs) - 2 do + FVerbs[i] := FVerbs[i + 1]; + SetLength(FVerbs, Length(FVerbs) - 1); + FDBToolsVerbIndex := -1; + end; + end; +{$ENDIF} + Result := Length(FVerbs); +end; + +function TDAComponentEditor.GetVerb(Index: integer): string; +begin + Result := FVerbs[Index].Caption; +end; + +procedure TDAComponentEditor.ExecuteVerb(Index: integer); +begin + FVerbs[Index].Method; +end; + +procedure TDAComponentEditor.Edit; +begin + if FCREditorClass <> nil then + ShowEditor + else + if GetVerbCount > 0 then + ExecuteVerb(0) + else + inherited; +end; + +{ TDADataSetEditor } + +procedure TDADataSetEditor.ShowFieldsEditor; +var + NeedCreate: boolean; + DADSDesigner: TDADSDesigner; +{$IFDEF OLDDESIGNER} + DataSetEditor: TComponentEditor; +{$ENDIF} +begin + if (Component as TDataSet).Designer = nil then + NeedCreate := True + else + if (Component as TDataSet).Designer is TDADSDesigner then begin + (Component as TDataSet).Designer.Free; + NeedCreate := True; + end + else + NeedCreate := False; + + if NeedCreate then begin + {$IFDEF OLDDESIGNER} + DataSetEditor := DataSetEditorClass.Create(Component, Designer) as TComponentEditor; + try + DataSetEditor.ExecuteVerb(0); + finally + DataSetEditor.Free; + end; + {$ELSE} + {$IFDEF CLR}Borland.VCL.Design.{$ENDIF}DSDesign.ShowFieldsEditor(Designer, TDataSet(Component), TDSDesigner); + {$ENDIF} + end + else begin + DADSDesigner := TDADSDesigner((Component as TDataSet).Designer); + {$IFDEF LINUX} + DADSDesigner.FFieldsEditor.Show; + {$ELSE} + DADSDesigner.FieldsEditor.Show; + {$ENDIF} + end; +end; + +procedure TDADataSetEditor.ShowDataEditor; +begin + {$IFDEF CLR}CoreLab.Dac.Design.{$ENDIF}DADesign.ShowEditor(TDADataEditorForm, FDADesignUtilsClass, Component, Designer); +end; + +{$IFDEF MSWINDOWS} +{$IFNDEF VER8} +const +{$IFDEF VER5} + DsmBplName = 'DataSetManager50.bpl'; +{$ENDIF} +{$IFDEF VER6} + DsmBplName = 'DataSetManager60.bpl'; +{$ENDIF} +{$IFDEF VER7} + DsmBplName = 'DataSetManager70.bpl'; +{$ENDIF} +{$IFDEF VER9} + DsmBplName = 'DataSetManager90.bpl'; +{$ENDIF} +{$IFDEF VER10} + DsmBplName = 'DataSetManager100.bpl'; +{$ENDIF} +{$IFDEF VER11} + DsmBplName = 'DataSetManager105.bpl'; +{$ENDIF} +{$IFDEF CLR} +[DllImport(DsmBplName)] +procedure CreateDefaultControl([MarshalAs(UnmanagedType.LPStr)]Owner, DataSet: string); external; +[DllImport(DsmBplName)] +procedure ShowDataSetManager([MarshalAs(UnmanagedType.LPStr)]Owner, DataSet: string); external; +{$ENDIF} +procedure TDADataSetEditor.ExecuteDsmAction(const ProcName: string); +var + Handle: Cardinal; +{$IFNDEF CLR} + Proc: procedure(Owner, DataSet: PChar); stdcall; +{$ENDIF} + OwnerName: string; + DataSetName: string; +begin + Handle := GetModuleHandle(PChar(DsmBplName)); + if Handle <> 0 then begin +{$IFNDEF CLR} + Proc := GetProcAddress(Handle, PChar(ProcName)); + if Assigned(Proc) and Assigned(Component.Owner) then begin + OwnerName := (Component as TDataSet).Owner.Name; + DataSetName := (Component as TDataSet).Name; + Proc(@OwnerName[1], @DataSetName[1]); + end; +{$ELSE} + if Assigned(Component.Owner) then begin + OwnerName := Component.Owner.Name; + DataSetName := (Component as TDataSet).Name; + if SameText(ProcName, 'CreateDefaultControl') then + CreateDefaultControl(OwnerName, DataSetName) + else + if SameText(ProcName, 'ShowDataSetManager') then + ShowDataSetManager(OwnerName, DataSetName); + end; +{$ENDIF} + end; +end; + +procedure TDADataSetEditor.InitVerbs; +var + Handle: Cardinal; +begin + inherited; + + Handle := GetModuleHandle(PChar(DsmBplName)); + if Handle <> 0 then begin + AddVerb('-', Separator); + AddVerb('Create default control', DsmCreateDefaultControl); + AddVerb('Show in DataSet Manager', DsmShowInDataSetManager); + end; +end; + +procedure TDADataSetEditor.DsmCreateDefaultControl; +begin +{$IFDEF CLR} + DsmShowInDataSetManager; +{$ENDIF} + ExecuteDsmAction('CreateDefaultControl'); +end; + +procedure TDADataSetEditor.DsmShowInDataSetManager; +begin + ExecuteDsmAction('ShowDataSetManager'); +end; + +procedure TDADataSetEditor.Separator; +begin +end; +{$ENDIF} +{$ENDIF} + +{ TDALoaderEditor } + +procedure TDALoaderEditor.InitVerbs; +begin + inherited; +{$IFNDEF LINUX} +{$IFNDEF CLR} +{$IFNDEF BCB} + AddVerb('Columns E&ditor...', ShowColEditor); +{$ENDIF} +{$ENDIF} +{$ENDIF} + AddVerb('Create Columns', CreateColumns); +end; + +procedure TDALoaderEditor.ShowColEditor; +begin +{$IFNDEF LINUX} +{$IFNDEF CLR} +{$IFNDEF BCB} + Assert(Component is TDALoader); + with ShowCollectionEditorClass(Designer, TCollectionEditor, Component, + TDALoader(Component).Columns, 'Columns', [coAdd,coDelete{,coMove}]) do + UpdateListbox; +{$ENDIF} +{$ENDIF} +{$ENDIF} +end; + +procedure TDALoaderEditor.CreateColumns; +begin + Assert(Component is TDALoader); + if (TDALoader(Component).Columns.Count = 0) or + (MessageDlg('Do you want recreate columns for table ' + + TDALoader(Component).TableName + '?', mtConfirmation, [mbYes,mbNo], 0) = mrYes) + then begin + TDALoader(Component).CreateColumns; + ShowColEditor; + end; +end; + +{$IFDEF MSWINDOWS} + +{ TDASQLMonitorEditor } + +procedure TDASQLMonitorEditor.RunDBMonitor; +begin + Assert(HasMonitor); + ShellExecute(0, 'open', PChar(WhereMonitor), '', '', SW_SHOW) +end; + +procedure TDASQLMonitorEditor.RunSQLMonitor; +begin + ShellExecute(0, 'open', 'sqlmon.exe', '', '', SW_SHOW); +end; + +procedure TDASQLMonitorEditor.InitVerbs; +begin + if HasMonitor then + AddVerb('Run DBMonitor...', RunDBMonitor); + AddVerb('Run SQL Monitor...', RunSQLMonitor); +end; + +procedure TDASQLMonitorEditor.Edit; +begin + if GetVerbCount > 0 then + ExecuteVerb(0); +end; + +{$ENDIF} +{ TCRDataSourceEditor } +constructor TCRDataSourceEditor.Create(Component: TComponent; aDesigner: {$IFDEF VER6P}IDesigner{$ELSE}IFormDesigner{$ENDIF}); +var + TypeData: TTypeData; + i, Width, Height: integer; + DS: TDataSet; +begin + inherited; + + with TCRDataSource(Component) do + if TDBAccessUtils.GetDesignCreate(TCRDataSource(Component)) then begin + Items := TStringList.Create; + try + {$IFDEF CLR} + TypeData := TTypeData.Create(TypeOf(TDataSet)); + aDesigner.GetComponentNames(TypeData, StrProc); + {$ELSE} + TypeData.ClassType := TDataSet; + aDesigner.GetComponentNames(@TypeData, StrProc); + {$ENDIF} + + for i := 0 to Items.Count - 1 do begin + DS := TDataSet(aDesigner.GetComponent(Items[i])); + Width := Word(DesignInfo) - Word(DS.DesignInfo); + Height := Word(DesignInfo shr 16) - Word(DS.DesignInfo shr 16); + if (Width >= 0) and (Width <= 28 + 4) and + (Height >= 0) and (Height <= 28 + 4) + then + DataSet := DS; + end; + TDBAccessUtils.SetDesignCreate(TCRDataSource(Component), False); + finally + Items.Free; + end + end; +end; + +procedure TCRDataSourceEditor.StrProc(const S: string); +begin + Items.Add(S); +end; + +procedure TCRDataSourceEditor.ConvertToDataSource; +begin + if Designer <> nil then + ConvertToClass(Self.Designer, Component, TDataSource); +end; + +procedure TCRDataSourceEditor.InitVerbs; +begin + inherited; + AddVerb('Convert to TDataSource', ConvertToDataSource); +end; + +procedure TCRDataSourceEditor.CheckEdit({$IFDEF VER6P}const Prop: IProperty{$ELSE}Prop: TPropertyEditor{$ENDIF}); +begin + if FFirstProp = nil then + FFirstProp := Prop +{$IFNDEF VER6P} + else + Prop.Free; +{$ENDIF} +end; + +procedure TCRDataSourceEditor.Edit; +var + Components: {$IFDEF VER6P}IDesignerSelections;{$ELSE}TDesignerSelectionList;{$ENDIF} +begin + Components := {$IFDEF VER6P}TDesignerSelections.Create{$ELSE}TDesignerSelectionList.Create{$ENDIF}; +{$IFNDEF VER6P} + try +{$ENDIF} + Components.Add(Component); + FFirstProp := nil; + GetComponentProperties(Components, tkMethods, Designer, CheckEdit); + if FFirstProp <> nil then + {$IFNDEF VER6P} + try + {$ENDIF} + FFirstProp.Edit; + {$IFNDEF VER6P} + finally + FFirstProp.Free; + end; + {$ENDIF} +{$IFNDEF VER6P} + finally + Components.Free; + end; +{$ENDIF} +end; + +{ TDesignMacros } + +const + SComment = '--'; + SBeginMacroComment = 'MACRO'; + SEndMacroComment = 'ENDMACRO'; + +function TDesignMacros.GetMacroValue(Macro: TMacro): string; +var + i: integer; + ResultList: TStringList; +begin + ResultList := TStringList.Create; + try + ResultList.Text := Macro.Value; + if not Macro.Active then + for i := 0 to ResultList.Count - 1 do + ResultList[i] := SComment + ' ' + ResultList[i]; + + ResultList.Insert(0, ''); + ResultList.Insert(1, SComment + ' ' + SBeginMacroComment + ' ' + Macro.Name); + ResultList.Add(SComment + ' ' + SEndMacroComment); + finally + Result := ResultList.Text; + ResultList.Free; + end; +end; + +procedure TDesignMacros.Scan(var SQL: string); +var + i, j: integer; + s, St, CommentSt: string; + SourceSQL: TStringList; + MacroSQL: TStringList; + NewMacro, + MacroFound: boolean; + Macro: TMacro; + + Parser: TParser; + CodeLexem: integer; + + function TrimLineSeparator(s: string): string; + begin + if Copy(s, Length(s) - Length(SLLineSeparator) + 1, Length(SLLineSeparator)) = SLLineSeparator then + Result := Copy(s, 1, Length(s) - Length(SLLineSeparator)) + else + Result := s; + end; + + function AtFirstPos(Substr: string; s: string): boolean; + begin + Result := Copy(Trim(s), 1, Length(Substr)) = Substr; + end; + + function TrimFirst(Substr: string; s: string): string; + begin + s := Trim(s); + Result := Copy(s, Length(Substr) + 1, Length(s) - Length(Substr)) + end; + +begin + Clear; + + MacroFound := False; + SourceSQL := TStringList.Create; + MacroSQL := TStringList.Create; + Parser := FParserClass.Create(''); + Macro := nil; + + try + Parser.OmitBlank := False; + Parser.Uppered := False; + SourceSQL.Text := SQL; + SQL := ''; + + for i := 0 to SourceSQL.Count - 1 do begin + s := SourceSQL[i]; + + CommentSt := ''; + + if AtFirstPos(SComment, s) then begin + + Parser.SetText(Trim(s)); + Parser.ToBegin; + if Parser.GetNext(St) = lcComment then begin + Parser.SetText(TrimFirst(SComment, s)); + Parser.ToBegin; + repeat + CodeLexem := Parser.GetNext(St) + until CodeLexem <> lcBlank; + CommentSt := St; + end; + end; + + if Macro <> nil then + if CommentSt = SEndMacroComment then begin + if not Macro.Active then + for j := 0 to MacroSQL.Count - 1 do begin + St := TrimFirst(SComment, MacroSQL[j]); + if St[1] = ' ' then + St := Copy(St, 2, Length(St) - 1); + MacroSQL[j] := St; + end; + + if MacroSQL.Count = 0 then + Macro.Active := True; + Macro.Value := TrimLineSeparator(MacroSQL.Text); + MacroSQL.Clear; + Macro := nil; + end + else begin + MacroSQL.Add(s); + if CommentSt = '' then + Macro.Active := True; + end + + else begin + NewMacro := False; + + if CommentSt = SBeginMacroComment then begin + + if Parser.GetNext(St) = lcBlank then begin + repeat + CodeLexem := Parser.GetNext(St) + until CodeLexem <> lcBlank; + + NewMacro := (CodeLexem = lcIdent) or + Parser.IsNumericMacroNameAllowed and (CodeLexem = lcNumber) or + (CodeLexem > Parser.SymbolLexems.Count) and + (CodeLexem <= Parser.SymbolLexems.Count + Parser.KeywordLexems.Count); + if NewMacro and (CodeLexem = lcNumber) then begin + CodeLexem := Parser.GetNext(s); + if (CodeLexem = lcIdent) or (CodeLexem > Parser.SymbolLexems.Count) + and (CodeLexem <= Parser.SymbolLexems.Count + Parser.KeywordLexems.Count) + then + St := St + s + end; + end; + end; + + if NewMacro then begin + MacroFound := True; + Macro := FindMacro(St); + if Macro = nil then begin + Macro := TMacro(Add); + Macro.Name := St; + end; + Macro.Active := False; + SQL := TrimLineSeparator(SQL); + if (SQL <> '') and (Pos(SQL[Length(SQL)], #$9#$A#$D#$20) < 1) then + SQL := SQL + ' '; + SQL := SQL + MacroChar + Macro.Name; + end + else begin + if MacroFound then begin + SQL := TrimLineSeparator(SQL); + end; + if i < SourceSQL.Count - 1 then + s := s + SLLineSeparator; + SQL := SQL + s; + MacroFound := False; + end; + end; + end; + + finally + SourceSQL.Free; + MacroSQL.Free; + Parser.Free; + end; +end; + +procedure Register; +{$IFDEF OLDDESIGNER} +var + DataSet: TDataSet; + DataSetEditor: TComponentEditor; +{$ENDIF} +begin + +{$IFDEF OLDDESIGNER} +{$WARNINGS OFF} +{$IFDEF VER6P} + DataSet := nil; + try + DataSet := TDataSet.Create(nil); + DataSetEditor := Pointer(Integer(GetComponentEditor(DataSet, nil)) - 20); + DataSetEditorClass := TComponentEditorClass(DataSetEditor.ClassType); + finally + DataSet.Free; + end; +{$ELSE} + DataSet := nil; + DataSetEditor := nil; + try + DataSet := TDataSet.Create(nil); + DataSetEditor := GetComponentEditor(DataSet, nil); + DataSetEditorClass := TComponentEditorClass(DataSetEditor.ClassType); + finally + DataSetEditor.Free; + DataSet.Free; + end; +{$ENDIF} +{$WARNINGS ON} +{$ENDIF} + + // Register property editors + RegisterPropertyEditor(TypeInfo(TFields), TCustomDADataSet, 'Fields', TDAFieldsEditor); + RegisterPropertyEditor(TypeInfo(TDAParams), TCustomDASQL, 'Params', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TDAParams), TCustomDADataset, 'Params', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TMacros), TCustomDASQL, 'Macros', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TMacros), TDAScript, 'Macros', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TMacros), TCustomDADataset, 'Macros', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(String), TCustomDADataset, 'TableName', TDATableNameEditor); + RegisterPropertyEditor(TypeInfo(String), TCustomDADataset, 'StoredProcName', TDASPNameEditor); + RegisterPropertyEditor(TypeInfo(String), TCustomDADataset, 'OrderFields', TDAFieldDefsListEditor); + RegisterPropertyEditor(TypeInfo(String), TCustomDADataset, 'IndexFieldNames', TDAFieldsListEditor); + RegisterPropertyEditor(TypeInfo(String), TCustomDADataSet, 'MasterFields', TDADataSetMasterFieldsEditor); + RegisterPropertyEditor(TypeInfo(String), TCustomDADataSet, 'DetailFields', TDADataSetMasterFieldsEditor); + RegisterPropertyEditor(TypeInfo(Variant), TDAParam, 'Value', TVariantEditor); + RegisterPropertyEditor(TypeInfo(String), TCustomDAConnection, 'Database', TDADatabaseNameEditor); + RegisterPropertyEditor(TypeInfo(String), TCustomDADataSet, 'UpdatingTable', TDAUpdatingTableEditor); + + RegisterPropertyEditor(TypeInfo(String), TCustomDAConnection, 'Password', TDAPasswordProperty); + + RegisterPropertyEditor(TypeInfo(TComponent), TCustomDAUpdateSQL, 'RefreshObject', TDADatasetOrSQLProperty); + RegisterPropertyEditor(TypeInfo(TComponent), TCustomDAUpdateSQL, 'ModifyObject', TDADatasetOrSQLProperty); + RegisterPropertyEditor(TypeInfo(TComponent), TCustomDAUpdateSQL, 'InsertObject', TDADatasetOrSQLProperty); + RegisterPropertyEditor(TypeInfo(TComponent), TCustomDAUpdateSQL, 'DeleteObject', TDADatasetOrSQLProperty); + RegisterPropertyEditor(TypeInfo(TCustomDAUpdateSQL), TCustomDADataSet, 'UpdateObject', TDAUpdateSQLProperty); + RegisterPropertyEditor(TypeInfo(String), TDALoader, 'TableName', TDALoaderTableNameEditor); + RegisterPropertyEditor(TypeInfo(Boolean), TDALoader, 'Debug', nil); + + // Register component editors + RegisterComponentEditor(TDALoader, TDALoaderEditor); +{$IFDEF MSWINDOWS} + RegisterComponentEditor(TCustomDASQLMonitor, TDASQLMonitorEditor); +{$ENDIF} +end; + +initialization + + NotificationActive := True; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DADesign.res b/internal/4.10.0.10/1/Source/Design/DADesign.res new file mode 100644 index 0000000000000000000000000000000000000000..8a83ab006f8e25df12f2b20b134f5f8e4179d99a GIT binary patch literal 3680 zcmdUwT}&KR6vsznOnj@+2NPfVXngRYqBNRlTB4;%TaD5tO$eqILm*AD_Cx%r4ML%U z8c9lvfNf)u(xymFj8U5fnm&*|u*)~Y!WMRyWtU}lVL#^kWBuQ~^me+t&?Rb&H)m(h zJ#)`*&N*}DUXJ6q&G;pg^au5U5qO;Aw!)H3KFSqw`?#IlJNVzrZR2*~e;c{ix?XLV;@R$r^0iNakrsC(Kp zD>EyH8sW}dm_nI!N*6%SI@r^T_r2{HxW%SW=oD8f)N*j=OIBgb@jHEnDhHe+o{@oo zbC}2!WGKK7`FRHf_LO4xPeKNH+t0kMd(zg;+pYu1I5#`bkJ!4XXt9VIT~e2WYS^!Y z=H;MA4$R?}G(RnRrUdtdI5#HT9Zk4~5;G2<(l~}J>QVyhwZt-GQbk_$5RT84W*250 zh$@Z4*64|-7GKt)VQnR-L;^}^L0qL+Wxs2`>;%(2YXL2x;CadU?@3A&#rO8CRUcDT3{^5@8d8kByI6#9B8v(- zYRRiCx>N6N28H7L(m6>C!@zn|BT-oeD8gAGQCS7q@qIVejK|PSO(kt0i+Fd25YrPY zghSrlq7p%qqfn&DCBG|^L*hv$vEDRvQ`bm#D7Y->Qd}2EM`^Jz3I&u(I&&UPE(d1O zr19;_VcISo%n3e_=&=i zqXi?CuMZu1#ZjI=SeD1WQ$P$`t8ueM|MQ&w`&sR`CiT~E)L$Buo_hIujePZ#)cLt| zxk|irOt^4FXg@5p9*Vb=$Iq9=n?JCZz4&i%NNQbQk-UDa_FW=*d68H1;o0xXU5%wP z^(9W4*QdM3J}w+x&FfW1MZVpV7Ypp~C=Z^G1vnkI<5Vo-3b;aUH}@7!%zLLJ$Nk6W zBhsAS@&XmA)5KxfPzA8wbNe=Pq3%{AHg@#k`a%Op;{Za1!s!7qX1f-24rdkG?d;J| zD3-conoA@gv#-YbbgJWuAajYt%Ao;dUcp)Yu65nOM~yEU`)4dnwyBVh5_06wy(npt zT_R03#G&z!?Zz~*)fkFQHW}=nE1?Z>R^v(ST3O>6J-)+Uk)K%;tA*8v#6yQ^7}!V^ zQ5WMhp0N`YlV3q0@NK8|yT!)ur@@U6nuWKhXZB)kryL4Z^|5Xj(r%`2Ldx4LwzucG#LTIqNj7eW1JK$g}0O&wqHKsIL2?j^36ucQ$49p$(gg>VDJu#_zCr Pm`hgWf8DfMGlKCibdQ;+ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Design/DADesign10p.res b/internal/4.10.0.10/1/Source/Design/DADesign10p.res new file mode 100644 index 0000000000000000000000000000000000000000..8688e5c807135258e5786ba7242e6f4f7fd5cf32 GIT binary patch literal 8112 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 B`sM%t literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Source/Design/DADesignUtils.pas b/internal/4.10.0.10/1/Source/Design/DADesignUtils.pas new file mode 100644 index 0000000..f677494 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADesignUtils.pas @@ -0,0 +1,625 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DADesignUtils; +{$ENDIF} + +interface + +uses +{$IFDEF DBTOOLS} + DBToolsIntf, + CRAccess, +{$ENDIF} + Classes, SysUtils, DBAccess; + +type +{$IFDEF DBTOOLS} + TNeedToCheckDbTools = (ncNone, ncExpired, ncNoAddin, ncIncompatible); +{$ENDIF} + + TDADesignUtilsAlias = class + public + {$IFNDEF VER8}class{$ENDIF} function GetProjectName: string; virtual; // Returns ProjectName = ('DataEditor', 'ODAC', 'SDAC', 'MyDAC', ...) + + { Component } + {$IFNDEF VER8}class{$ENDIF} function GetDesignCreate(Obj: TComponent): boolean; virtual; + {$IFNDEF VER8}class{$ENDIF} procedure SetDesignCreate(Obj: TComponent; Value: boolean); virtual; + {$IFNDEF VER8}class{$ENDIF} function GetConnectionList: TObject; virtual; //avoid circular link error + + { Connection support } + {$IFNDEF VER8}class{$ENDIF} function HasConnection(Obj: TComponent): boolean; virtual; + {$IFNDEF VER8}class{$ENDIF} function GetConnection(Obj: TComponent): TCustomDAConnection; virtual; + {$IFNDEF VER8}class{$ENDIF} procedure SetConnection(Obj: TComponent; Value: TCustomDAConnection); virtual; + {$IFNDEF VER8}class{$ENDIF} function UsedConnection(Obj: TComponent): TCustomDAConnection; virtual; + + { SQL support } + {$IFNDEF VER8}class{$ENDIF} function GetSQL(Obj: TComponent; StatementType: TStatementType = stQuery): TStrings; virtual; + {$IFNDEF VER8}class{$ENDIF} procedure SetSQL(Obj: TComponent; Value: TStrings; StatementType: TStatementType = stQuery); overload; virtual; + {$IFNDEF VER8}class{$ENDIF} procedure SetSQL(Obj: TComponent; Value: string; StatementType: TStatementType = stQuery); overload; virtual; + + class function GetParams(Obj: TComponent): TDAParams; + class procedure SetParams(Obj: TComponent; Value: TDAParams); + class function GetMacros(Obj: TComponent): TMacros; + class procedure SetMacros(Obj: TComponent; Value: TMacros); + class procedure Execute(Obj: TComponent); + class function GetAfterExecute(Obj: TComponent): TAfterExecuteEvent; + class procedure SetAfterExecute(Obj: TComponent; Value: TAfterExecuteEvent); + + { DataSet support} + {$IFNDEF VER8}class{$ENDIF} function GetStatementTypes: TStatementTypes; virtual; // allowable StatementTypes for GetSQL and SetSQL + + { TDATable support } + {$IFNDEF VER8}class{$ENDIF} function GetTableName(Obj: TCustomDADAtaSet): string; virtual; + {$IFNDEF VER8}class{$ENDIF} procedure SetTableName(Obj: TCustomDADAtaSet; Value: string); virtual; + {$IFNDEF VER8}class{$ENDIF} function GetOrderFields(Obj: TCustomDADAtaSet): string; virtual; + {$IFNDEF VER8}class{$ENDIF} procedure SetOrderFields(Obj: TCustomDADAtaSet; Value: string); virtual; + {$IFNDEF VER8}class{$ENDIF} procedure PrepareSQL(Obj: TCustomDADAtaSet); virtual; + + { TDAStoredProc support} + {$IFNDEF VER8}class{$ENDIF} function GetStoredProcName(Obj: TCustomDADataSet): string; virtual; + {$IFNDEF VER8}class{$ENDIF} procedure SetStoredProcName(Obj: TCustomDADataSet; Value: string); virtual; + + {$IFDEF USE_SYNEDIT} + {$IFNDEF VER8}class{$ENDIF} function SQLDialect: integer ; virtual; // SynHighlighterSQL TSQLDialect = (sqlStandard, sqlInterbase6, sqlMSSQL7, sqlMySQL, sqlOracle, sqlSybase, sqlIngres, sqlMSSQL2K); + {$ENDIF} + + class function DBToolsAvailable: boolean; + + {$IFDEF DBTOOLS} + class function DBToolsService: TObject; virtual; //avoid circular link error + class function NeedToCheckDbTools: TNeedToCheckDbTools; virtual; + class function GetDBToolsServiceVersion: int64; virtual; + class function GetDBToolsServiceVersionStr: string; + class function GetDBToolsMenuCaption: string; virtual; + class function HasParams(Obj: TComponent): boolean; + class function GetFullName(Obj: TComponent): string; virtual; + class function GetObjectType(Obj: TComponent): string; virtual; + class function IsStoredProc(Obj: TComponent): boolean; virtual; + + class procedure GetDBToolsConnectionList(Connection: TCustomDAConnection); virtual; + class procedure SetDBToolsDownloadParams(VerbCheck: boolean; Incompatible: boolean); virtual; + {$ENDIF} + end; + +{$IFDEF VER8} + TDADesignUtilsClass = TDADesignUtilsAlias; + +var + TDADesignUtils: TDADesignUtilsAlias; +{$ELSE} + TDADesignUtils = TDADesignUtilsAlias; + TDADesignUtilsClass = class of TDADesignUtils; +{$ENDIF} + +implementation + +uses +{$IFDEF MSWINDOWS} + Forms, Windows, ComObj, +{$ELSE} + QForms, +{$ENDIF} +{$IFDEF CLR} + System.Runtime.InteropServices, +{$ELSE} + CLRClasses, +{$ENDIF} +{$IFDEF DBTOOLS} + DBToolsClient, +{$ENDIF} + DALoader, DADump, DAScript; + +{ TDADesignUtilsAlias } + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.GetProjectName: string; +begin + Result := 'DAC'; +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.GetDesignCreate(Obj: TComponent): boolean; +begin + Result := False; + Assert(Obj <> nil); + if Obj is TCustomDASQL then + Result := TDBAccessUtils.GetDesignCreate(TCustomDASQL(Obj)) + else + if Obj is TCustomDADataSet then + Result := TDBAccessUtils.GetDesignCreate(TCustomDADataSet(Obj)) + else + if Obj is TDALoader then + Result := TDALoaderUtils.GetDesignCreate(TDALoader(Obj)) + else + if Obj is TDADump then + Result := TDADumpUtils.GetDesignCreate(TDADump(Obj)) + else + if Obj is TDAScript then + Result := TDAScriptUtils.GetDesignCreate(TDAScript(Obj)) + else + if Obj is TCustomDAUpdateSQL then + Result := TDBAccessUtils.GetDesignCreate(TCustomDAUpdateSQL(Obj)) + else + if Obj is TCRDataSource then + Result := TDBAccessUtils.GetDesignCreate(TCRDataSource(Obj)) + else + Assert(False, Obj.ClassName); +end; + +{$IFNDEF VER8}class{$ENDIF} procedure TDADesignUtilsAlias.SetDesignCreate(Obj: TComponent; Value: boolean); +begin + Assert(Obj <> nil); + if Obj is TCustomDASQL then + TDBAccessUtils.SetDesignCreate(TCustomDASQL(Obj), Value) + else + if Obj is TCustomDADataSet then + TDBAccessUtils.SetDesignCreate(TCustomDADataSet(Obj), Value) + else + if Obj is TDALoader then + TDALoaderUtils.SetDesignCreate(TDALoader(Obj), Value) + else + if Obj is TDADump then + TDADumpUtils.SetDesignCreate(TDADump(Obj), Value) + else + if Obj is TDAScript then + TDAScriptUtils.SetDesignCreate(TDAScript(Obj), Value) + else + if Obj is TCustomDAUpdateSQL then + TDBAccessUtils.SetDesignCreate(TCustomDAUpdateSQL(Obj), Value) + else + if Obj is TCRDataSource then + TDBAccessUtils.SetDesignCreate(TCRDataSource(Obj), Value) + else + Assert(False, Obj.ClassName); +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.GetConnectionList: TObject; +begin + Result := nil; + Assert(False, 'Must be overriden on Product layer'); +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.HasConnection(Obj: TComponent): boolean; +begin + Assert(Obj <> nil); + if Obj is TCustomDASQL then + Result := True + else + if Obj is TCustomDADataSet then + Result := True + else + if Obj is TDAScript then + Result := True + else + if Obj is TDALoader then + Result := True + else + if Obj is TDADump then + Result := True + else + Result := False; +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.GetConnection(Obj: TComponent): TCustomDAConnection; +begin + Result := nil; + Assert(Obj <> nil); + if Obj is TCustomDASQL then + Result := TCustomDASQL(Obj).Connection + else + if Obj is TCustomDADataSet then + Result := TCustomDADataSet(Obj).Connection + else + if Obj is TDAScript then + Result := TDAScript(Obj).Connection + else + if Obj is TDALoader then + Result := TDALoader(Obj).Connection + else + if Obj is TDADump then + Result := TDADump(Obj).Connection + else + Assert(False, Obj.ClassName); +end; + +{$IFNDEF VER8}class{$ENDIF} procedure TDADesignUtilsAlias.SetConnection(Obj: TComponent; Value: TCustomDAConnection); +begin + Assert(Obj <> nil); + if Obj is TCustomDASQL then + TCustomDASQL(Obj).Connection := Value + else + if Obj is TCustomDADataSet then + TCustomDADataSet(Obj).Connection := Value + else + if Obj is TDAScript then + TDAScript(Obj).Connection := Value + else + if Obj is TDALoader then + TDALoader(Obj).Connection := Value + else + if Obj is TDADump then + TDADump(Obj).Connection := Value + else + Assert(False, Obj.ClassName); +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.UsedConnection(Obj: TComponent): TCustomDAConnection; +begin + Result := nil; + Assert(Obj <> nil); + if Obj is TCustomDASQL then + Result := TDBAccessUtils.UsedConnection(TCustomDASQL(Obj)) + else + if Obj is TCustomDADataSet then + Result := TDBAccessUtils.UsedConnection(TCustomDADataSet(Obj)) + else + if Obj is TDAScript then + Result := TDAScriptUtils.UsedConnection(TDAScript(Obj)) + else + if Obj is TDALoader then + Result := TDALoaderUtils.UsedConnection(TDALoader(Obj)) + else + if Obj is TCustomDAUpdateSQL then begin + if TCustomDAUpdateSQL(Obj).DataSet <> nil then + Result := TDBAccessUtils.UsedConnection(TCustomDAUpdateSQL(Obj).DataSet) + else + Result := nil; + end + else + if Obj is TDADump then + Result := TDADump(Obj).Connection + else + Assert(False, Obj.ClassName); +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.GetStatementTypes: TStatementTypes; +begin + Result := [stQuery, stInsert, stUpdate, stDelete, stRefresh]; +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.GetSQL(Obj: TComponent; StatementType: TStatementType = stQuery): TStrings; +begin + Result := nil; + Assert(Obj <> nil); + Assert((StatementType = stQuery) or (Obj is TCustomDADataSet) or (Obj is TCustomDAUpdateSQL)); + if Obj is TCustomDASQL then + Result := TCustomDASQL(Obj).SQL + else + if Obj is TCustomDADataSet then begin + case StatementType of + stQuery: + Result := TCustomDADataSet(Obj).SQL; + stInsert: + Result := TCustomDADataSet(Obj).SQLInsert; + stUpdate: + Result := TCustomDADataSet(Obj).SQLUpdate; + stDelete: + Result := TCustomDADataSet(Obj).SQLDelete; + stRefresh: + Result := TCustomDADataSet(Obj).SQLRefresh; + else + begin + Result := nil; + Assert(False, 'StatementType = ' + IntToStr(Integer(StatementType))); + end; + end; + end + else + if Obj is TCustomDAUpdateSQL then begin + case StatementType of + stInsert: + Result := TCustomDAUpdateSQL(Obj).InsertSQL; + stUpdate: + Result := TCustomDAUpdateSQL(Obj).ModifySQL; + stDelete: + Result := TCustomDAUpdateSQL(Obj).DeleteSQL; + stRefresh: + Result := TCustomDAUpdateSQL(Obj).RefreshSQL; + else + begin + Result := nil; + Assert(False, 'StatementType = ' + IntToStr(Integer(StatementType))); + end; + end; + end + else + if Obj is TDAScript then + Result := TDAScript(Obj).SQL + else + Assert(False, Obj.ClassName); +end; + +{$IFNDEF VER8}class{$ENDIF} procedure TDADesignUtilsAlias.SetSQL(Obj: TComponent; Value: TStrings; StatementType: TStatementType = stQuery); +begin + Assert(Obj <> nil); + Assert((StatementType = stQuery) or (Obj is TCustomDADataSet) or (Obj is TCustomDAUpdateSQL)); + if Obj is TCustomDASQL then + TCustomDASQL(Obj).SQL := Value + else + if Obj is TCustomDADataSet then begin + case StatementType of + stQuery: + TCustomDADataSet(Obj).SQL := Value; + stInsert: + TCustomDADataSet(Obj).SQLInsert := Value; + stUpdate: + TCustomDADataSet(Obj).SQLUpdate := Value; + stDelete: + TCustomDADataSet(Obj).SQLDelete := Value; + stRefresh: + TCustomDADataSet(Obj).SQLRefresh := Value; + else + Assert(False, 'StatementType = ' + IntToStr(Integer(StatementType))); + end; + end + else + if Obj is TCustomDAUpdateSQL then begin + case StatementType of + stInsert: + TCustomDAUpdateSQL(Obj).InsertSQL := Value; + stUpdate: + TCustomDAUpdateSQL(Obj).ModifySQL := Value; + stDelete: + TCustomDAUpdateSQL(Obj).DeleteSQL := Value; + stRefresh: + TCustomDAUpdateSQL(Obj).RefreshSQL := Value; + else + Assert(False, 'StatementType = ' + IntToStr(Integer(StatementType))); + end; + end + else + if Obj is TDAScript then + TDAScript(Obj).SQL := Value + else + Assert(False, Obj.ClassName); +end; + +{$IFNDEF VER8}class{$ENDIF} procedure TDADesignUtilsAlias.SetSQL(Obj: TComponent; Value: string; StatementType: TStatementType = stQuery); +var + List: TStringList; +begin + List := TStringList.Create; + try + List.Text := Value; + SetSQL(Obj, List, StatementType); + finally + List.Free; + end; +end; + +class function TDADesignUtilsAlias.GetParams(Obj: TComponent): TDAParams; +begin + Result := nil; + Assert(Obj <> nil); + if Obj is TCustomDASQL then + Result := TCustomDASQL(Obj).Params + else + if Obj is TCustomDADataSet then + Result := TCustomDADataSet(Obj).Params + else + Assert(False, Obj.ClassName); +end; + +class procedure TDADesignUtilsAlias.SetParams(Obj: TComponent; Value: TDAParams); +begin + Assert(Obj <> nil); + if Obj is TCustomDASQL then + TCustomDASQL(Obj).Params := Value + else + if Obj is TCustomDADataSet then + TCustomDADataSet(Obj).Params := Value + else + Assert(False, Obj.ClassName); +end; + +class function TDADesignUtilsAlias.GetMacros(Obj: TComponent): TMacros; +begin + Result := nil; + Assert(Obj <> nil); + if Obj is TCustomDASQL then + Result := TCustomDASQL(Obj).Macros + else + if Obj is TCustomDADataSet then + Result := TCustomDADataSet(Obj).Macros + else + if Obj is TDAScript then + Result := TDAScript(Obj).Macros + else + Assert(False, Obj.ClassName); +end; + +class procedure TDADesignUtilsAlias.SetMacros(Obj: TComponent; Value: TMacros); +begin + Assert(Obj <> nil); + if Obj is TCustomDASQL then + TCustomDASQL(Obj).Macros := Value + else + if Obj is TCustomDADataSet then + TCustomDADataSet(Obj).Macros := Value + else + if Obj is TDAScript then + TDAScript(Obj).Macros := Value + else + Assert(False, Obj.ClassName); +end; + +class procedure TDADesignUtilsAlias.Execute(Obj: TComponent); +begin + Assert(Obj <> nil); + if Obj is TCustomDASQL then + TCustomDASQL(Obj).Execute + else + if Obj is TCustomDADataSet then + TCustomDADataSet(Obj).Execute + else + Assert(False, Obj.ClassName); +end; + +class function TDADesignUtilsAlias.GetAfterExecute(Obj: TComponent): DBAccess.TAfterExecuteEvent; +begin + Result := nil; + Assert(Obj <> nil); + if Obj is TCustomDASQL then + Result := TCustomDASQL(Obj).AfterExecute + else + if Obj is TCustomDADataSet then + Result := TCustomDADataSet(Obj).AfterExecute + else + Assert(False, Obj.ClassName); +end; + +class procedure TDADesignUtilsAlias.SetAfterExecute(Obj: TComponent; Value: DBAccess.TAfterExecuteEvent); +begin + Assert(Obj <> nil); + if Obj is TCustomDASQL then + TCustomDASQL(Obj).AfterExecute := Value + else + if Obj is TCustomDADataSet then + TCustomDADataSet(Obj).AfterExecute := Value + else + Assert(False, Obj.ClassName); +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.GetTableName(Obj: TCustomDADAtaSet): string; +begin + Result := ''; + Assert(False, 'Must be overriden - D8 bug'); +end; + +{$IFNDEF VER8}class{$ENDIF} procedure TDADesignUtilsAlias.SetTableName(Obj: TCustomDADAtaSet; Value: string); +begin + Assert(False, 'Must be overriden - D8 bug'); +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.GetOrderFields(Obj: TCustomDADAtaSet): string; +begin + Result := ''; + Assert(False, 'Must be overriden - D8 bug'); +end; + +{$IFNDEF VER8}class{$ENDIF} procedure TDADesignUtilsAlias.SetOrderFields(Obj: TCustomDADAtaSet; Value: string); +begin + Assert(False, 'Must be overriden - D8 bug'); +end; + +{$IFNDEF VER8}class{$ENDIF} procedure TDADesignUtilsAlias.PrepareSQL(Obj: TCustomDADAtaSet); +begin + Assert(False, 'Must be overriden - D8 bug'); +end; + +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.GetStoredProcName(Obj: TCustomDADataSet): string; +begin + Assert(False, 'Must be overriden - D8 bug'); +end; + +{$IFNDEF VER8}class{$ENDIF} procedure TDADesignUtilsAlias.SetStoredProcName(Obj: TCustomDADataSet; Value: string); +begin + Assert(False, 'Must be overriden - D8 bug'); +end; + +{$IFDEF USE_SYNEDIT} +{$IFNDEF VER8}class{$ENDIF} function TDADesignUtilsAlias.SQLDialect: integer; +begin + Result := 0; // sqlStandard +end; +{$ENDIF} + +class function TDADesignUtilsAlias.DBToolsAvailable: boolean; +begin + Result := {$IFDEF DBTOOLS}DBToolsService <> nil{$ELSE}False{$ENDIF}; +end; + +{$IFDEF DBTOOLS} +class function TDADesignUtilsAlias.HasParams(Obj: TComponent): boolean; +begin + Result := (Obj is TCustomDASQL) or (Obj is TCustomDADataSet); +end; + +class function TDADesignUtilsAlias.GetFullName(Obj: TComponent): string; +begin + Result := ''; + if not (Obj is TCustomDAConnection) then + Assert(False, Obj.ClassName); +end; + +class function TDADesignUtilsAlias.GetObjectType(Obj: TComponent): string; +begin + Result := ''; + if not (Obj is TCustomDAConnection) then + Assert(False, Obj.ClassName); +end; + +class function TDADesignUtilsAlias.DBToolsService: TObject; +begin + Result := nil; +end; + +class function TDADesignUtilsAlias.NeedToCheckDbTools: TNeedToCheckDbTools; +begin + Result := ncNone; + Assert(False, 'Must be overriden'); +end; + +class function TDADesignUtilsAlias.GetDBToolsServiceVersion: int64; +begin + Result := 0; + Assert(False, 'Must be overriden'); +end; + +class function TDADesignUtilsAlias.GetDBToolsServiceVersionStr: string; +var + n: int64; + i: integer; +begin + n := GetDBToolsServiceVersion; + Result := ''; + for i := 0 to 3 do begin + Result := IntToStr(n and $ffff) + Result; + if i < 3 then begin + Result := '.' + Result; + n := n shr 16; + end; + end; +end; + +class function TDADesignUtilsAlias.GetDBToolsMenuCaption: string; +begin + Result := ''; + Assert(False, 'Must be overriden'); +end; + +class procedure TDADesignUtilsAlias.GetDBToolsConnectionList(Connection: TCustomDAConnection); +begin + Assert(False, 'Must be overriden'); +end; + +class procedure TDADesignUtilsAlias.SetDBToolsDownloadParams(VerbCheck: boolean; Incompatible: boolean); +begin + Assert(False, 'Must be overriden'); +end; + +class function TDADesignUtilsAlias.IsStoredProc(Obj: TComponent): boolean; +begin + Result := False; + Assert(False, 'Must be overriden'); +end; +{$ENDIF} + +initialization +{$IFDEF VER8} + TDADesignUtils := TDADesignUtilsAlias.Create; +{$ENDIF} + +finalization +{$IFDEF VER8} + TDADesignUtils.Free; +{$ENDIF} + + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DADualListEditor.dfm b/internal/4.10.0.10/1/Source/Design/DADualListEditor.dfm new file mode 100644 index 0000000..d4b045d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADualListEditor.dfm @@ -0,0 +1,363 @@ +inherited DADualListEditorForm: TDADualListEditorForm + Left = 339 + Top = 221 + Width = 524 + Height = 332 + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + BorderStyle = bsSizeToolWin + Caption = 'Select Tables' + Constraints.MinHeight = 332 + Constraints.MinWidth = 513 + OnResize = FormResize + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 257 + Width = 516 + TabOrder = 4 + inherited imCorner: TImage + Left = 504 + end + inherited btOk: TBitBtn + Left = 320 + end + inherited btCancel: TBitBtn + Left = 401 + end + end + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 230 + Height = 257 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object SrcLabel: TLabel + Left = 8 + Top = 8 + Width = 214 + Height = 16 + AutoSize = False + Caption = 'Available tables' + end + object SrcList: TListBox + Left = 8 + Top = 24 + Width = 214 + Height = 230 + Anchors = [akLeft, akTop, akRight, akBottom] + DragMode = dmAutomatic + ItemHeight = 13 + MultiSelect = True + Sorted = True + TabOrder = 0 + OnClick = ListClick + OnDblClick = IncludeBtnClick + OnDragDrop = SrcListDragDrop + OnDragOver = SrcListDragOver + end + end + object PanelButtons: TPanel + Left = 230 + Top = 0 + Width = 24 + Height = 257 + Align = alLeft + BevelOuter = bvNone + TabOrder = 1 + object IncludeBtn: TSpeedButton + Left = 0 + Top = 32 + Width = 24 + Height = 24 + Caption = '>' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + OnClick = IncludeBtnClick + end + object IncAllBtn: TSpeedButton + Left = 0 + Top = 64 + Width = 24 + Height = 24 + Caption = '>>' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + OnClick = IncAllBtnClick + end + object ExcludeBtn: TSpeedButton + Left = 0 + Top = 96 + Width = 24 + Height = 24 + Caption = '<' + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + OnClick = ExcludeBtnClick + end + object ExAllBtn: TSpeedButton + Left = 0 + Top = 128 + Width = 24 + Height = 24 + Caption = '<<' + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + OnClick = ExcAllBtnClick + end + end + object Panel3: TPanel + Left = 254 + Top = 0 + Width = 231 + Height = 257 + Align = alClient + BevelOuter = bvNone + TabOrder = 2 + object DstLabel: TLabel + Left = 8 + Top = 8 + Width = 214 + Height = 16 + AutoSize = False + Caption = 'Selected tables' + end + object DstList: TListBox + Left = 8 + Top = 24 + Width = 214 + Height = 230 + Anchors = [akLeft, akTop, akRight, akBottom] + DragMode = dmAutomatic + ItemHeight = 13 + MultiSelect = True + TabOrder = 0 + OnClick = ListClick + OnDblClick = ExcludeBtnClick + OnDragDrop = DstListDragDrop + OnDragOver = DstListDragOver + OnKeyDown = DstListKeyDown + end + end + object PanelButtons2: TPanel + Left = 485 + Top = 0 + Width = 31 + Height = 257 + Align = alRight + BevelOuter = bvNone + TabOrder = 3 + object UpBtn: TSpeedButton + Left = 0 + Top = 32 + Width = 24 + Height = 24 + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Glyph.Data = { + 96090000424D9609000000000000360000002800000028000000140000000100 + 1800000000006009000000000000000000000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8080808080808080808080 + 80808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080808080808080808080808080 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF800000800000800000800000800000808080FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF800000800000800000800000800000808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000 + FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0 + C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00008000 + 00808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0800000808080 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000800000808080808080808080FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0C0C0C0C0C0C0C0C0C0800000808080808080808080FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + NumGlyphs = 2 + ParentFont = False + OnClick = UpBtnClick + end + object DownBtn: TSpeedButton + Left = 0 + Top = 64 + Width = 24 + Height = 24 + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Glyph.Data = { + 96090000424D9609000000000000360000002800000028000000140000000100 + 1800000000006009000000000000000000000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000808080808080FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF800000808080808080FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF0000FF0000800000808080808080FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0C0C0C0800000808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000 + FF0000FF0000800000808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0 + C0C0800000808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF00 + 00800000808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0800000 + 808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000800000800000800000FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0800000800000800000FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000 + FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0 + C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00008000 + 00808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0800000808080 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000 + FF0000FF0000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0 + C0C0800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + NumGlyphs = 2 + ParentFont = False + OnClick = DownBtnClick + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DADualListEditor.pas b/internal/4.10.0.10/1/Source/Design/DADualListEditor.pas new file mode 100644 index 0000000..c82304e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADualListEditor.pas @@ -0,0 +1,328 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Dual List Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DADualListEditor; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, Grids, DBGrids, DBCtrls, Buttons, ExtCtrls, StdCtrls, +{$ENDIF} +{$IFDEF LINUX} + Qt, SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QComCtrls, QGrids, QDBGrids, QDBCtrls, QButtons, QExtCtrls, +{$ENDIF} + CREditor, DBAccess; + +type + TDADualListEditorForm = class(TCREditorForm) + Panel2: TPanel; + SrcLabel: TLabel; + SrcList: TListBox; + PanelButtons: TPanel; + IncludeBtn: TSpeedButton; + IncAllBtn: TSpeedButton; + ExcludeBtn: TSpeedButton; + ExAllBtn: TSpeedButton; + Panel3: TPanel; + DstLabel: TLabel; + DstList: TListBox; + PanelButtons2: TPanel; + UpBtn: TSpeedButton; + DownBtn: TSpeedButton; + procedure IncludeBtnClick(Sender: TObject); + procedure ExcludeBtnClick(Sender: TObject); + procedure IncAllBtnClick(Sender: TObject); + procedure ExcAllBtnClick(Sender: TObject); + procedure DstListDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure DstListDragDrop(Sender, Source: TObject; X, Y: Integer); + procedure SrcListDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure SrcListDragDrop(Sender, Source: TObject; X, Y: Integer); + procedure FormResize(Sender: TObject); + procedure UpBtnClick(Sender: TObject); + procedure DownBtnClick(Sender: TObject); + procedure DstListKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure ListClick(Sender: TObject); + protected + procedure DoInit; override; + + procedure MoveSelected(Source, Dest: TListBox; Index: Integer; SelectNext: boolean); + procedure MoveAll(Source, Dest: TListBox; Index: Integer); + procedure Move(List: TListBox; FromIndex, ToIndex: integer); + function GetFirstSelection(List: TCustomListBox): Integer; + procedure SetButtons; + + function GetSrcLabelCaption: string; virtual; + procedure GetSrcListItems(Items: TStrings); virtual; + function GetDestLabelCaption: string; virtual; + procedure GetDstListItems(Items: TStrings); virtual; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DADualListEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TDADualListEditorForm.IncludeBtnClick(Sender: TObject); +begin + MoveSelected(SrcList, DstList, DstList.Items.Count, True); +end; + +procedure TDADualListEditorForm.ExcludeBtnClick(Sender: TObject); +begin + MoveSelected(DstList, SrcList, SrcList.Items.Count, True); +end; + +procedure TDADualListEditorForm.IncAllBtnClick(Sender: TObject); +begin + MoveAll(SrcList, DstList, DstList.Items.Count); +end; + +procedure TDADualListEditorForm.ExcAllBtnClick(Sender: TObject); +begin + MoveAll(DstList, SrcList, SrcList.Items.Count); +end; + +procedure TDADualListEditorForm.MoveSelected(Source, Dest: TListBox; Index: Integer; + SelectNext: boolean); +var + i, FirstSel: integer; +begin + for i := 0 to Dest.Items.Count - 1 do + Dest.Selected[i] := False; + + FirstSel := -1; + for i := Source.Items.Count - 1 downto 0 do + if Source.Selected[i] then begin + if Dest.Sorted then + Dest.Items.AddObject(Source.Items[i], Source.Items.Objects[i]) + else begin + Dest.Items.InsertObject(Index, Source.Items[i], Source.Items.Objects[i]); + Dest.Selected[Index] := True; + end; + Source.Items.Delete(i); + FirstSel := i; + end; + + if FirstSel >= 0 then begin + if SelectNext then + if Source.Items.Count > FirstSel then + Source.Selected[FirstSel] := True + else + if Source.Items.Count > 0 then + Source.Selected[Source.Items.Count - 1] := True; + Modified := True; + SetButtons; + end; +end; + +procedure TDADualListEditorForm.MoveAll(Source, Dest: TListBox; Index: Integer); +var + i: integer; +begin + for i := 0 to Dest.Items.Count - 1 do + Dest.Selected[i] := False; + + for i := Source.Items.Count - 1 downto 0 do + if Dest.Sorted then + Dest.Items.AddObject(Source.Items[i], Source.Items.Objects[i]) + else begin + Dest.Items.InsertObject(Index, Source.Items[i], Source.Items.Objects[i]); + Dest.Selected[Index] := True; + end; + Source.Items.Clear; + + Modified := True; + SetButtons; +end; + +procedure TDADualListEditorForm.SetButtons; +var + SrcEmpty, DstEmpty: Boolean; +begin + SrcEmpty := SrcList.Items.Count = 0; + DstEmpty := DstList.Items.Count = 0; + IncludeBtn.Enabled := SrcList.SelCount > 0; + IncAllBtn.Enabled := not SrcEmpty; + ExcludeBtn.Enabled := DstList.SelCount > 0; + ExAllBtn.Enabled := not DstEmpty; + UpBtn.Enabled := (DstList.SelCount = 1) and (GetFirstSelection(DstList) > 0); + DownBtn.Enabled := (DstList.SelCount = 1) and (GetFirstSelection(DstList) < DstList.Items.Count - 1); +end; + +function TDADualListEditorForm.GetFirstSelection(List: TCustomListBox): Integer; +var + i: integer; +begin + for i := 0 to List.Items.Count - 1 do + if List.Selected[i] then begin + Result := i; + Exit; + end; + Result := -1; +end; + +procedure TDADualListEditorForm.DoInit; +var + i, j: integer; +begin + inherited; + + SrcLabel.Caption := GetSrcLabelCaption; + GetSrcListItems(SrcList.Items); + DstLabel.Caption := GetDestLabelCaption; + GetDstListItems(DstList.Items); + + for i := 0 to DstList.Items.Count - 1 do begin + j := SrcList.Items.IndexOf(DstList.Items[i]); + if j <> -1 then + SrcList.Items.Delete(j); + end; + + SetButtons; + ConfirmCancel := False; + Modified := False; + FormResize(nil); +end; + +procedure TDADualListEditorForm.DstListDragOver(Sender, Source: TObject; X, + Y: Integer; State: TDragState; var Accept: Boolean); +begin + Accept := (Source = SrcList) and (SrcList.SelCount > 0) or + (Source = DstList) and (DstList.SelCount = 1); +end; + +procedure TDADualListEditorForm.DstListDragDrop(Sender, Source: TObject; X, + Y: Integer); +var + pos: TPoint; + Index, SelIndex: Integer; +begin + pos.X := X; + pos.Y := Y; + Index := DstList.ItemAtPos(pos, False); + if Source = SrcList then + MoveSelected(SrcList, DstList, Index, False) + else + if Source = DstList then begin + SelIndex := GetFirstSelection(DstList); + Move(DstList, SelIndex, Index); + end; +end; + +procedure TDADualListEditorForm.SrcListDragOver(Sender, Source: TObject; X, + Y: Integer; State: TDragState; var Accept: Boolean); +begin + Accept := (Source = DstList) and (DstList.SelCount > 0); +end; + +procedure TDADualListEditorForm.SrcListDragDrop(Sender, Source: TObject; X, + Y: Integer); +var + pos: TPoint; + Index: Integer; +begin + if Source = DstList then begin + pos.X := X; + pos.Y := Y; + Index := SrcList.ItemAtPos(pos, False); + MoveSelected(DstList, SrcList, Index, False); + end; +end; + +procedure TDADualListEditorForm.FormResize(Sender: TObject); +begin + inherited; + Panel2.Width := (ClientWidth - PanelButtons.Width * 2) div 2; +end; + +function TDADualListEditorForm.GetSrcLabelCaption: string; +begin + Result := 'Source list items'; +end; + +procedure TDADualListEditorForm.GetSrcListItems(Items: TStrings); +begin + Items.Clear; +end; + +function TDADualListEditorForm.GetDestLabelCaption: string; +begin + Result := 'Destination list items'; +end; + +procedure TDADualListEditorForm.GetDstListItems(Items: TStrings); +begin + Items.Clear; +end; + +procedure TDADualListEditorForm.Move(List: TListBox; FromIndex, ToIndex: integer); +begin + if (FromIndex >= 0) and (ToIndex >= 0) and (ToIndex < List.Items.Count) and (FromIndex <> ToIndex) + then begin + List.Items.Move(FromIndex, ToIndex); + List.Selected[ToIndex] := True; + Modified := True; + SetButtons; + end; +end; + +procedure TDADualListEditorForm.UpBtnClick(Sender: TObject); +var + SelIndex: integer; +begin + SelIndex := GetFirstSelection(DstList); + Move(DstList, SelIndex, SelIndex - 1); +end; + +procedure TDADualListEditorForm.DownBtnClick(Sender: TObject); +var + SelIndex: integer; +begin + SelIndex := GetFirstSelection(DstList); + Move(DstList, SelIndex, SelIndex + 1); +end; + +procedure TDADualListEditorForm.DstListKeyDown(Sender: TObject; + var Key: Word; Shift: TShiftState); +begin + if Shift = [ssCtrl] then + case Key of + {$IFDEF LINUX}Key_Up{$ELSE}VK_UP{$ENDIF}: begin + UpBtnClick(nil); + Key := 0; + end; + {$IFDEF LINUX}Key_Down{$ELSE}VK_DOWN{$ENDIF}: begin + DownBtnClick(nil); + Key := 0; + end; + end; +end; + +procedure TDADualListEditorForm.ListClick(Sender: TObject); +begin + SetButtons; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DADualListEditor.xfm b/internal/4.10.0.10/1/Source/Design/DADualListEditor.xfm new file mode 100644 index 0000000..bd83db4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADualListEditor.xfm @@ -0,0 +1,363 @@ +inherited DADualListEditorForm: TDADualListEditorForm + Left = 339 + Top = 221 + Width = 524 + Height = 332 + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + BorderStyle = fbsSizeToolWin + Caption = 'Select Tables' + Constraints.MinHeight = 332 + Constraints.MinWidth = 513 + OnResize = FormResize + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 257 + Width = 516 + TabOrder = 4 + inherited imCorner: TImage + Left = 504 + end + inherited btOk: TBitBtn + Left = 320 + end + inherited btCancel: TBitBtn + Left = 401 + end + end + object Panel2: TPanel + Left = 0 + Top = 0 + Width = 230 + Height = 257 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object SrcLabel: TLabel + Left = 8 + Top = 8 + Width = 214 + Height = 16 + AutoSize = False + Caption = 'Available tables' + end + object SrcList: TListBox + Left = 8 + Top = 24 + Width = 214 + Height = 230 + Anchors = [akLeft, akTop, akRight, akBottom] + DragMode = dmAutomatic + ItemHeight = 13 + MultiSelect = True + Sorted = True + TabOrder = 0 + OnClick = ListClick + OnDblClick = IncludeBtnClick + OnDragDrop = SrcListDragDrop + OnDragOver = SrcListDragOver + end + end + object PanelButtons: TPanel + Left = 230 + Top = 0 + Width = 24 + Height = 257 + Align = alLeft + BevelOuter = bvNone + TabOrder = 1 + object IncludeBtn: TSpeedButton + Left = 0 + Top = 32 + Width = 24 + Height = 24 + Caption = '>' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + OnClick = IncludeBtnClick + end + object IncAllBtn: TSpeedButton + Left = 0 + Top = 64 + Width = 24 + Height = 24 + Caption = '>>' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + OnClick = IncAllBtnClick + end + object ExcludeBtn: TSpeedButton + Left = 0 + Top = 96 + Width = 24 + Height = 24 + Caption = '<' + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + OnClick = ExcludeBtnClick + end + object ExAllBtn: TSpeedButton + Left = 0 + Top = 128 + Width = 24 + Height = 24 + Caption = '<<' + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + OnClick = ExcAllBtnClick + end + end + object Panel3: TPanel + Left = 254 + Top = 0 + Width = 231 + Height = 257 + Align = alClient + BevelOuter = bvNone + TabOrder = 2 + object DstLabel: TLabel + Left = 8 + Top = 8 + Width = 214 + Height = 16 + AutoSize = False + Caption = 'Selected tables' + end + object DstList: TListBox + Left = 8 + Top = 24 + Width = 214 + Height = 230 + Anchors = [akLeft, akTop, akRight, akBottom] + DragMode = dmAutomatic + ItemHeight = 13 + MultiSelect = True + TabOrder = 0 + OnClick = ListClick + OnDblClick = ExcludeBtnClick + OnDragDrop = DstListDragDrop + OnDragOver = DstListDragOver + OnKeyDown = DstListKeyDown + end + end + object PanelButtons2: TPanel + Left = 485 + Top = 0 + Width = 31 + Height = 257 + Align = alRight + BevelOuter = bvNone + TabOrder = 3 + object UpBtn: TSpeedButton + Left = 0 + Top = 32 + Width = 24 + Height = 24 + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Glyph.Data = { + 96090000424D9609000000000000360000002800000028000000140000000100 + 1800000000006009000000000000000000000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8080808080808080808080 + 80808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080808080808080808080808080 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF800000800000800000800000800000808080FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF800000800000800000800000800000808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000 + FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0 + C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00008000 + 00808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0800000808080 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000800000808080808080808080FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0C0C0C0C0C0C0C0C0C0800000808080808080808080FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + NumGlyphs = 2 + ParentFont = False + OnClick = UpBtnClick + end + object DownBtn: TSpeedButton + Left = 0 + Top = 64 + Width = 24 + Height = 24 + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Glyph.Data = { + 96090000424D9609000000000000360000002800000028000000140000000100 + 1800000000006009000000000000000000000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000808080808080FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF800000808080808080FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF0000FF0000800000808080808080FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0C0C0C0800000808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000 + FF0000FF0000800000808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0 + C0C0800000808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF00 + 00800000808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0800000 + 808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000800000800000800000FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0800000800000800000FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000 + FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0 + C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00008000 + 00808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0800000808080 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000800000808080FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0C0C0C0C0C0C0C0C0C0800000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000 + FF0000FF0000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0C0 + C0C0800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + NumGlyphs = 2 + ParentFont = False + OnClick = DownBtnClick + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DADumpEditor.dfm b/internal/4.10.0.10/1/Source/Design/DADumpEditor.dfm new file mode 100644 index 0000000..ec1e6a7 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADumpEditor.dfm @@ -0,0 +1,130 @@ +inherited DADumpEditorForm: TDADumpEditorForm + Left = 336 + Top = 182 + Height = 468 + Caption = 'DADumpEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 393 + end + object ClientPanel: TPanel + Left = 0 + Top = 0 + Width = 505 + Height = 393 + Align = alClient + Constraints.MinHeight = 257 + Constraints.MinWidth = 489 + TabOrder = 1 + object meSQL: TMemo + Left = 233 + Top = 1 + Width = 271 + Height = 391 + Align = alClient + ScrollBars = ssBoth + TabOrder = 1 + WordWrap = False + OnExit = meSQLExit + end + object LeftPanel: TPanel + Left = 1 + Top = 1 + Width = 232 + Height = 391 + Align = alLeft + BevelOuter = bvNone + BevelWidth = 5 + Constraints.MinHeight = 335 + TabOrder = 0 + object gbBackupOptions: TGroupBox + Left = 8 + Top = 8 + Width = 217 + Height = 313 + Caption = 'Backup Options' + TabOrder = 0 + object lbTableNames: TLabel + Left = 8 + Top = 20 + Width = 63 + Height = 13 + Caption = 'Table Names' + end + object cbTableNames: TComboBox + Left = 8 + Top = 40 + Width = 201 + Height = 21 + Anchors = [akLeft, akTop, akRight] + DropDownCount = 16 + ItemHeight = 13 + TabOrder = 1 + OnChange = cbTableNamesChange + OnDropDown = cbTableNamesDropDown + end + object cbGenerateHeader: TCheckBox + Left = 8 + Top = 128 + Width = 201 + Height = 17 + Caption = 'Generate Header' + TabOrder = 0 + end + end + object btBackup: TBitBtn + Left = 16 + Top = 328 + Width = 97 + Height = 25 + Caption = 'Backup' + TabOrder = 1 + OnClick = btBackupClick + end + object btRestore: TBitBtn + Left = 121 + Top = 328 + Width = 96 + Height = 25 + Caption = 'Restore' + TabOrder = 2 + OnClick = btRestoreClick + end + object btImport: TBitBtn + Left = 16 + Top = 359 + Width = 97 + Height = 25 + Caption = 'Import from file' + TabOrder = 3 + OnClick = btImportClick + end + object btExport: TBitBtn + Left = 120 + Top = 359 + Width = 97 + Height = 25 + Caption = 'Export to file' + TabOrder = 4 + OnClick = btExportClick + end + end + end + object OpenDialog: TOpenDialog + DefaultExt = 'sql' + Filter = 'Query files (*.sql)|*.sql|All files (*.*)|*.*' + FilterIndex = 0 + Options = [ofHideReadOnly, ofFileMustExist, ofEnableSizing] + Left = 321 + Top = 25 + end + object SaveDialog: TSaveDialog + DefaultExt = 'sql' + Filter = 'Query files (*.sql)|*.sql|All files (*.*)|*.*' + FilterIndex = 0 + Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing] + Left = 353 + Top = 25 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DADumpEditor.pas b/internal/4.10.0.10/1/Source/Design/DADumpEditor.pas new file mode 100644 index 0000000..da37c8c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADumpEditor.pas @@ -0,0 +1,249 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// DADump Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DADumpEditor; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, ExtCtrls, Buttons, DacVcl, +{$ENDIF} +{$IFDEF LINUX} + Types, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QExtCtrls, QComCtrls, QButtons, DacClx, +{$ENDIF} +{$IFDEF DBTOOLS} + DBToolsClient, +{$ENDIF} + SysUtils, Classes, CREditor, DBAccess, DADump, DADesignUtils, DADualListEditor; + +type + TDADumpEditorForm = class(TCREditorForm) + ClientPanel: TPanel; + LeftPanel: TPanel; + meSQL: TMemo; + gbBackupOptions: TGroupBox; + cbGenerateHeader: TCheckBox; + btBackup: TBitBtn; + btRestore: TBitBtn; + btImport: TBitBtn; + btExport: TBitBtn; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + cbTableNames: TComboBox; + lbTableNames: TLabel; + procedure btBackupClick(Sender: TObject); + procedure btRestoreClick(Sender: TObject); + procedure meSQLExit(Sender: TObject); + procedure btImportClick(Sender: TObject); + procedure btExportClick(Sender: TObject); + procedure SaveClick(Sender: TObject); + procedure cbTableNamesChange(Sender: TObject); + procedure cbTableNamesDropDown(Sender: TObject); + protected + FDump, FLocalDump: TDADump; + + procedure EditTableNames(Sender: TObject); virtual; + procedure DoInit; override; + procedure DoSave; override; + procedure DoFinish; override; + + procedure GetButtons; virtual; + procedure SetButtons; virtual; + + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + function GetLocalComponent: TComponent; override; + public + property Dump: TDADump read FDump write FDump; + end; + +implementation + +uses + DAConsts, DADumpProgress; + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DADumpEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{ TDADumpEditorForm } + +procedure TDADumpEditorForm.DoInit; +{$IFDEF USE_SYNEDIT} +var + WinControl: TWinControl; +{$ENDIF} +begin + inherited; + +{$IFDEF USE_SYNEDIT} +{$IFDEF DBTOOLS} + if DADesignUtilsClass.DBToolsAvailable then + DBTools.ReplaceMemo(meSQL, DADesignUtilsClass, Component) + else begin +{$ENDIF} + WinControl := meSQL; + ReplaceMemo(WinControl, True); + meSQL := TMemo(WinControl); +{$IFDEF DBTOOLS} + end; +{$ENDIF} +{$ENDIF} + + FLocalDump := TComponentClass(Dump.ClassType).Create(nil) as TDADump; + FLocalDump.Assign(Dump); + + SetMemoText(meSQL, FLocalDump.SQL.Text); + + cbGenerateHeader.Checked := FLocalDump.Options.GenerateHeader; +end; + +procedure TDADumpEditorForm.DoSave; +begin + GetButtons; + Dump.Assign(FLocalDump); +end; + +procedure TDADumpEditorForm.DoFinish; +begin + FLocalDump.Free; +end; + +procedure TDADumpEditorForm.GetButtons; +begin + FLocalDump.Options.GenerateHeader := cbGenerateHeader.Checked; +end; + +procedure TDADumpEditorForm.SetButtons; +begin + btRestore.Enabled := Length(Trim(GetMemoText(meSQL))) > 0; +end; + +function TDADumpEditorForm.GetComponent: TComponent; +begin + Result := Dump; +end; + +function TDADumpEditorForm.GetLocalComponent: TComponent; +begin + Result := FLocalDump; +end; + +procedure TDADumpEditorForm.SetComponent(Value: TComponent); +begin + Dump := Value as TDADump; +end; + +procedure TDADumpEditorForm.btBackupClick(Sender: TObject); +var + OldChangeCursor: boolean; +begin + GetButtons; + + OldChangeCursor := ChangeCursor; + try + StartWait; + ChangeCursor := False; + with TDADumpProgressForm.Create(nil) do + try + if Dump.Owner <> nil then + Caption := Dump.Owner.Name + '.' + Dump.Name + else + Caption := Dump.Name; + DADump := FLocalDump; + Backup; + finally + Free; + end; + finally + SetMemoText(meSQL, FLocalDump.SQL.Text); + ChangeCursor := OldChangeCursor; + StopWait; + end; + Modified := True; + SetButtons; +end; + +procedure TDADumpEditorForm.btRestoreClick(Sender: TObject); +begin + if MessageDlg(SAreYouSureRestore, mtConfirmation, [mbYes,mbNo], 0) = mrNo then + Exit; + + with TDADumpProgressForm.Create(nil) do + try + if Dump.Owner <> nil then + Caption := Dump.Owner.Name + '.' + Dump.Name + else + Caption := Dump.Name; + DADump := FLocalDump; + Restore; + finally + Free; + end; +end; + +procedure TDADumpEditorForm.meSQLExit(Sender: TObject); +begin + if TrimRight(FLocalDump.SQL.Text) = TrimRight(GetMemoText(meSQL)) then + Exit; + + Modified := True; + FLocalDump.SQL.Text := GetMemoText(meSQL); + SetButtons; +end; + +procedure TDADumpEditorForm.btImportClick(Sender: TObject); +begin + if OpenDialog.Execute then + LoadFromFile(meSQL, OpenDialog.FileName); +end; + +procedure TDADumpEditorForm.btExportClick(Sender: TObject); +begin + if not SaveDialog.Execute then + Exit; + + meSQLExit(nil); + SaveToFile(meSQL, SaveDialog.FileName); +end; + +procedure TDADumpEditorForm.SaveClick(Sender: TObject); +begin + meSQLExit(nil); + inherited; +end; + +procedure TDADumpEditorForm.cbTableNamesChange(Sender: TObject); +begin + FLocalDump.TableNames := cbTableNames.Text; +end; + +procedure TDADumpEditorForm.cbTableNamesDropDown(Sender: TObject); +begin + EditTableNames(Sender); +end; + +procedure TDADumpEditorForm.EditTableNames(Sender: TObject); +begin +// +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DADumpEditor.xfm b/internal/4.10.0.10/1/Source/Design/DADumpEditor.xfm new file mode 100644 index 0000000..148084c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADumpEditor.xfm @@ -0,0 +1,128 @@ +inherited DADumpEditorForm: TDADumpEditorForm + Left = 336 + Top = 182 + Height = 468 + Caption = 'DADumpEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 393 + end + object ClientPanel: TPanel + Left = 0 + Top = 0 + Width = 505 + Height = 393 + Align = alClient + Constraints.MinHeight = 257 + Constraints.MinWidth = 489 + TabOrder = 1 + object meSQL: TMemo + Left = 233 + Top = 1 + Width = 271 + Height = 391 + Align = alClient + ScrollBars = ssBoth + TabOrder = 1 + WordWrap = False + OnExit = meSQLExit + end + object LeftPanel: TPanel + Left = 1 + Top = 1 + Width = 232 + Height = 391 + Align = alLeft + BevelOuter = bvNone + BevelWidth = 5 + Constraints.MinHeight = 335 + TabOrder = 0 + object gbBackupOptions: TGroupBox + Left = 8 + Top = 8 + Width = 217 + Height = 313 + Caption = 'Backup Options' + TabOrder = 0 + object lbTableNames: TLabel + Left = 8 + Top = 20 + Width = 63 + Height = 13 + Caption = 'Table Names' + end + object cbTableNames: TComboBox + Left = 8 + Top = 40 + Width = 201 + Height = 21 + Anchors = [akLeft, akTop, akRight] + DropDownCount = 16 + ItemHeight = 13 + TabOrder = 1 + OnChange = cbTableNamesChange + OnDropDown = cbTableNamesDropDown + end + object cbGenerateHeader: TCheckBox + Left = 8 + Top = 128 + Width = 201 + Height = 17 + Caption = 'Generate Header' + TabOrder = 0 + end + end + object btBackup: TBitBtn + Left = 16 + Top = 328 + Width = 97 + Height = 25 + Caption = 'Backup' + TabOrder = 1 + OnClick = btBackupClick + end + object btRestore: TBitBtn + Left = 121 + Top = 328 + Width = 96 + Height = 25 + Caption = 'Restore' + TabOrder = 2 + OnClick = btRestoreClick + end + object btImport: TBitBtn + Left = 16 + Top = 359 + Width = 97 + Height = 25 + Caption = 'Import from file' + TabOrder = 3 + OnClick = btImportClick + end + object btExport: TBitBtn + Left = 120 + Top = 359 + Width = 97 + Height = 25 + Caption = 'Export to file' + TabOrder = 4 + OnClick = btExportClick + end + end + end + object OpenDialog: TOpenDialog + DefaultExt = 'sql' + Filter = 'Query files (*.sql)|*.sql|All files (*.*)|*.*' + FilterIndex = 0 + Left = 321 + Top = 25 + end + object SaveDialog: TSaveDialog + DefaultExt = 'sql' + Filter = 'Query files (*.sql)|*.sql|All files (*.*)|*.*' + FilterIndex = 0 + Left = 353 + Top = 25 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DADumpProgress.dfm b/internal/4.10.0.10/1/Source/Design/DADumpProgress.dfm new file mode 100644 index 0000000..3af46ef --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADumpProgress.dfm @@ -0,0 +1,78 @@ +object DADumpProgressForm: TDADumpProgressForm + Left = 656 + Top = 188 + BorderStyle = bsDialog + Caption = 'DADumpProgressForm' + ClientHeight = 131 + ClientWidth = 248 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnActivate = FormActivate + OnClose = FormClose + OnResize = FormResize + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 8 + Width = 41 + Height = 16 + Caption = 'Label1' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object BitBtn1: TBitBtn + Left = 86 + Top = 98 + Width = 75 + Height = 25 + Anchors = [akBottom] + Cancel = True + Caption = 'Cancel' + TabOrder = 0 + OnClick = BitBtn1Click + Glyph.Data = { + DE010000424DDE01000000000000760000002800000024000000120000000100 + 0400000000006801000000000000000000001000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 333333333333333333333333000033338833333333333333333F333333333333 + 0000333911833333983333333388F333333F3333000033391118333911833333 + 38F38F333F88F33300003339111183911118333338F338F3F8338F3300003333 + 911118111118333338F3338F833338F3000033333911111111833333338F3338 + 3333F8330000333333911111183333333338F333333F83330000333333311111 + 8333333333338F3333383333000033333339111183333333333338F333833333 + 00003333339111118333333333333833338F3333000033333911181118333333 + 33338333338F333300003333911183911183333333383338F338F33300003333 + 9118333911183333338F33838F338F33000033333913333391113333338FF833 + 38F338F300003333333333333919333333388333338FFF830000333333333333 + 3333333333333333333888330000333333333333333333333333333333333333 + 0000} + NumGlyphs = 2 + end + object ProgressBar1: TProgressBar + Left = 8 + Top = 32 + Width = 232 + Height = 25 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + end + object ProgressBar2: TProgressBar + Left = 8 + Top = 65 + Width = 232 + Height = 25 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DADumpProgress.pas b/internal/4.10.0.10/1/Source/Design/DADumpProgress.pas new file mode 100644 index 0000000..5148df5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADumpProgress.pas @@ -0,0 +1,213 @@ +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// DB Access +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DADumpProgress; +{$ENDIF} + +interface + +uses + SysUtils, Classes, +{$IFNDEF LINUX} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + ComCtrls, Grids, DBGrids, DBCtrls, Buttons, ExtCtrls, StdCtrls, +{$ELSE} + QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QComCtrls, QGrids, QDBGrids, QDBCtrls, QButtons, QExtCtrls, Qt, QTypes, +{$ENDIF} + DBAccess, DADump; + +type + TDADumpProgressForm = class(TForm) + Label1: TLabel; + BitBtn1: TBitBtn; + ProgressBar1: TProgressBar; + ProgressBar2: TProgressBar; + procedure DADumpBackupProgress(Sender: TObject; TableName: String; + TableNum, TableCount, Percent: Integer); + procedure DADumpRestoreProgress(Sender: TObject; Percent: Integer); + procedure FormActivate(Sender: TObject); + procedure BitBtn1Click(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormResize(Sender: TObject); + protected + IsBackup: boolean; + WaitForTerminate: boolean; + InProgress: boolean; + + procedure Process; + + {$IFDEF LINUX} + function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; override; + {$ENDIF} + public + DADump: TDADump; + + procedure Backup; + procedure Restore; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DADumpProgress.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{$IFDEF LINUX} +const + QEventType_CMFormActivate = QEventType(Integer(QEventType_ClxBase) + $1000); +{$ENDIF} + +{ TDADumpProgressForm } + +procedure TDADumpProgressForm.Backup; +var + OldProgress: TDABackupProgressEvent; +begin + Assert(DADump <> nil); + OldProgress := DADump.OnBackupProgress; + try + Label1.Caption := 'Backup'; + IsBackup := True; + DADump.OnBackupProgress := DADumpBackupProgress; + + {$IFDEF LINUX} + // ShowMessage('1 ' + IntToStr(Integer(Self))); + QApplication_postEvent(Handle, QCustomEvent_create(QEventType_CMFormActivate, Self)); + // ShowMessage('2'); + {$ENDIF} + ShowModal; + finally + DADump.OnBackupProgress := OldProgress; + end; +end; + +procedure TDADumpProgressForm.Restore; +var + OldProgress: TDARestoreProgressEvent; + +begin + Assert(DADump <> nil); + OldProgress := DADump.OnRestoreProgress; + try + Label1.Caption := 'Restore'; + IsBackup := False; + DADump.OnRestoreProgress := DADumpRestoreProgress; + ShowModal; + finally + DADump.OnRestoreProgress := OldProgress; + end; +end; + +procedure TDADumpProgressForm.DADumpBackupProgress(Sender: TObject; + TableName: String; TableNum, TableCount, Percent: Integer); +begin + if WaitForTerminate then + SysUtils.Abort; + + Label1.Caption := 'Backup ' + TableName; + ProgressBar1.Max := TableCount; + ProgressBar1.Position := TableNum; + ProgressBar2.Position := Percent; + + Update; + Application.ProcessMessages; + end; + +procedure TDADumpProgressForm.DADumpRestoreProgress(Sender: TObject; + Percent: Integer); +begin + if WaitForTerminate then + SysUtils.Abort; + + ProgressBar2.Position := Percent; + + Update; + Application.ProcessMessages; +end; + +procedure TDADumpProgressForm.Process; +begin + ProgressBar1.Enabled := IsBackup; + + WaitForTerminate := False; + InProgress := True; + Cursor := crSQLWait; + try + try + if IsBackup then + DADump.Backup + else + DADump.Restore; + except + on E: Exception do + Application.ShowException(E); + end; + finally + InProgress := False; + Cursor := crDefault; + {$IFDEF MSWINDOWS} + PostMessage(Handle, WM_CLOSE, 0, 0); + {$ELSE} + QApplication_postEvent(Handle, QCloseEvent_create); + {$ENDIF} + end; +end; + +procedure TDADumpProgressForm.FormActivate(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + Process; +{$ENDIF} +end; + +{$IFDEF LINUX} +function TDADumpProgressForm.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; +begin + Result := True; + if QEvent_type(Event) = QEventType_CMFormActivate then + Process + else + Result := inherited EventFilter(Sender, Event); +end; +{$ENDIF} + +procedure TDADumpProgressForm.BitBtn1Click(Sender: TObject); +begin + WaitForTerminate := True; + Close; +end; + +procedure TDADumpProgressForm.FormClose(Sender: TObject; + var Action: TCloseAction); +begin + WaitForTerminate := True; + while InProgress do + Sleep(300); +end; + +procedure TDADumpProgressForm.FormResize(Sender: TObject); +begin +{$IFDEF LINUX} + ClientHeight := 131; + ClientWidth := 248; + ProgressBar1.Width := 232; + ProgressBar2.Width := 232; + BitBtn1.Left := 86; +{$ENDIF} +end; + +end. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Design/DADumpProgress.xfm b/internal/4.10.0.10/1/Source/Design/DADumpProgress.xfm new file mode 100644 index 0000000..d9d8ebf --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DADumpProgress.xfm @@ -0,0 +1,76 @@ +object DADumpProgressForm: TDADumpProgressForm + Left = 656 + Top = 188 + BorderStyle = fbsDialog + Caption = 'DADumpProgressForm' + ClientHeight = 131 + ClientWidth = 248 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnActivate = FormActivate + OnClose = FormClose + OnResize = FormResize + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 8 + Width = 41 + Height = 16 + Caption = 'Label1' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object BitBtn1: TBitBtn + Left = 86 + Top = 98 + Width = 75 + Height = 25 + Anchors = [akBottom] + Cancel = True + Caption = 'Cancel' + TabOrder = 0 + OnClick = BitBtn1Click + Glyph.Data = { + DE010000424DDE01000000000000760000002800000024000000120000000100 + 0400000000006801000000000000000000001000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 333333333333333333333333000033338833333333333333333F333333333333 + 0000333911833333983333333388F333333F3333000033391118333911833333 + 38F38F333F88F33300003339111183911118333338F338F3F8338F3300003333 + 911118111118333338F3338F833338F3000033333911111111833333338F3338 + 3333F8330000333333911111183333333338F333333F83330000333333311111 + 8333333333338F3333383333000033333339111183333333333338F333833333 + 00003333339111118333333333333833338F3333000033333911181118333333 + 33338333338F333300003333911183911183333333383338F338F33300003333 + 9118333911183333338F33838F338F33000033333913333391113333338FF833 + 38F338F300003333333333333919333333388333338FFF830000333333333333 + 3333333333333333333888330000333333333333333333333333333333333333 + 0000} + NumGlyphs = 2 + end + object ProgressBar1: TProgressBar + Left = 8 + Top = 32 + Width = 232 + Height = 25 + Anchors = [akLeft, akTop, akRight] + end + object ProgressBar2: TProgressBar + Left = 8 + Top = 65 + Width = 232 + Height = 25 + Anchors = [akLeft, akTop, akRight] + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAMacrosFrame.dfm b/internal/4.10.0.10/1/Source/Design/DAMacrosFrame.dfm new file mode 100644 index 0000000..7f5921d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAMacrosFrame.dfm @@ -0,0 +1,62 @@ +inherited DAMacrosFrame: TDAMacrosFrame + object lbMName: TLabel [0] + Left = 19 + Top = 8 + Width = 61 + Height = 13 + Caption = 'Macro Name' + end + object lbMacroLog: TLabel [1] + Left = 8 + Top = 7 + Width = 11 + Height = 16 + Caption = '&&' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + end + inherited PanelItem: TPanel + object lbMValue: TLabel + Left = 16 + Top = 12 + Width = 27 + Height = 13 + Caption = 'Value' + end + object lbActive: TLabel + Left = 33 + Top = 191 + Width = 30 + Height = 13 + Anchors = [akLeft, akBottom] + Caption = 'Active' + end + object meMacroValue: TMemo + Left = 14 + Top = 28 + Width = 238 + Height = 157 + Anchors = [akLeft, akTop, akRight, akBottom] + Lines.Strings = ( + '') + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + OnExit = meMacroValueExit + end + object cbMacroActive: TCheckBox + Left = 14 + Top = 189 + Width = 15 + Height = 17 + Anchors = [akLeft, akBottom] + TabOrder = 1 + OnClick = cbMacroActiveClick + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAMacrosFrame.pas b/internal/4.10.0.10/1/Source/Design/DAMacrosFrame.pas new file mode 100644 index 0000000..c0e3379 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAMacrosFrame.pas @@ -0,0 +1,119 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// Macros Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DAMacrosFrame; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, + Dialogs, + StdCtrls, ExtCtrls, +{$ENDIF} +{$IFDEF LINUX} + QStdCtrls, QExtCtrls, QControls, +{$ENDIF} + Classes, SysUtils, + DBAccess, CRFrame, CRColFrame, CRTabEditor; + +type + TDAMacrosFrame = class(TCRColFrame) + lbMName: TLabel; + lbMacroLog: TLabel; + lbMValue: TLabel; + meMacroValue: TMemo; + cbMacroActive: TCheckBox; + lbActive: TLabel; + procedure cbMacroActiveClick(Sender: TObject); + procedure meMacroValueExit(Sender: TObject); + + protected + function GetItems: TCollection; override; + function GetMacros: TMacros; + + function GetItemName(Item: TCollectionItem): string; override; + procedure ItemToControls(Item: TCollectionItem); override; + procedure ControlsToItem(Item: TCollectionItem); override; + + property Macros: TMacros read GetMacros; + public + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DAMacrosFrame.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses + DB, DASQLEditor; + +function TDAMacrosFrame.GetItems: TCollection; +begin + Result := Editor.DADesignUtilsClass.GetMacros(Editor.localComponent); +end; + +function TDAMacrosFrame.GetMacros: TMacros; +begin + Result := Items as TMacros; +end; + +function TDAMacrosFrame.GetItemName(Item: TCollectionItem): string; +begin + Result := TMacro(Item).Name; +end; + +procedure TDAMacrosFrame.ItemToControls(Item: TCollectionItem); +begin + meMacroValue.Lines.Text := TMacro(Item).Value; + cbMacroActive.Checked := TMacro(Item).Active; +end; + +procedure TDAMacrosFrame.ControlsToItem(Item: TCollectionItem); +begin + TMacro(Item).Value := meMacroValue.Lines.Text; + TMacro(Item).Active := cbMacroActive.Checked; +end; + +procedure TDAMacrosFrame.cbMacroActiveClick(Sender: TObject); +begin + if FInSelectItem or not IsControlEnabled(Sender as TControl) then + Exit; + + Macros[lbItemName.ItemIndex].Active := cbMacroActive.Checked; + Modified := True; + + UpdateControlsState; +end; + +procedure TDAMacrosFrame.meMacroValueExit(Sender: TObject); +begin + if FInSelectItem or not IsControlEnabled(Sender as TControl) then + Exit; + + if meMacroValue.Lines.Text <> Macros[lbItemName.ItemIndex].Value then begin + Macros[lbItemName.ItemIndex].Value := meMacroValue.Lines.Text; + + Modified := True; + + UpdateControlsState; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DAMacrosFrame.xfm b/internal/4.10.0.10/1/Source/Design/DAMacrosFrame.xfm new file mode 100644 index 0000000..6be5ee0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAMacrosFrame.xfm @@ -0,0 +1,62 @@ +inherited DAMacrosFrame: TDAMacrosFrame + object lbMName: TLabel [0] + Left = 19 + Top = 8 + Width = 61 + Height = 13 + Caption = 'Macro Name' + end + object lbMacroLog: TLabel [1] + Left = 8 + Top = 7 + Width = 11 + Height = 16 + Caption = '&&' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + end + inherited PanelItem: TPanel + object lbMValue: TLabel + Left = 16 + Top = 12 + Width = 27 + Height = 13 + Caption = 'Value' + end + object lbActive: TLabel + Left = 33 + Top = 191 + Width = 30 + Height = 13 + Anchors = [akLeft, akBottom] + Caption = 'Active' + end + object meMacroValue: TMemo + Left = 14 + Top = 28 + Width = 238 + Height = 157 + Anchors = [akLeft, akTop, akRight, akBottom] + Lines.Strings = ( + '') + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + OnExit = meMacroValueExit + end + object cbMacroActive: TCheckBox + Left = 14 + Top = 189 + Width = 15 + Height = 17 + Anchors = [akLeft, akBottom] + TabOrder = 1 + OnClick = cbMacroActiveClick + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAMenu.pas b/internal/4.10.0.10/1/Source/Design/DAMenu.pas new file mode 100644 index 0000000..8bc72ea --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAMenu.pas @@ -0,0 +1,646 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright @ 1998-2007 Core Lab. All right reserved. +// DAMenu +////////////////////////////////////////////////// + +{$IFNDEF DAMENU_HEADER} + +{$I Dac.inc} + +unit DAMenu; +{$ENDIF} +interface + +{$IFDEF VER7P} + {$WARN UNIT_DEPRECATED OFF} +{$ENDIF} + +uses +{$IFDEF CLR} + System.Windows.Forms, Borland.Studio.ToolsAPI, WinUtils, +{$ELSE} + ToolsAPI, Menus, +{$ENDIF} +{$IFDEF MSWINDOWS} + Windows, +{$ENDIF} + Graphics, Classes, SysUtils; + +type + TDAMenu = class; + + +{$IFDEF CLR} + TAPIMenuItem = IOTAMenuItem; + TDAMenuClickSender = TObject; + TDAMenuClickEvent = procedure (Sender: TDAMenuClickSender; E: EventArgs) of object; +{$ELSE} + TAPIMenuItem = TMenuItem; + TDAMenuClickSender = TObject; + TDAMenuClickEvent = procedure (Sender: TDAMenuClickSender) of object; +{$ENDIF} + + TDAMenuItem = class(TCollectionItem) + protected + FSubMenu: TDAMenu; + FCaption: string; + FName: string; + FVisible: boolean; + + FNeedDestroyMenuItem: boolean; + FMenuItem: TAPIMenuItem; + + procedure SetCaption(Value: string); + procedure SetVisible(Value: boolean); + public + constructor Create(DAMenu: TDAMenu; MenuItem: TAPIMenuItem); reintroduce; overload; + constructor Create(DAMenu: TDAMenu; Caption, Name: string; ClickEvent: TDAMenuClickEvent = nil; Index: integer = -1); reintroduce; overload; + destructor Destroy; override; + + property SubMenu: TDAMenu read FSubMenu; + property Caption: string read FCaption write SetCaption; + property Name: string read FName; + property Visible: boolean read FVisible write SetVisible; + end; + + TDAMenu = class(TCollection) + protected + FParentItem: TDAMenuItem; + FHInstance: HINST; + FMenuItems: TAPIMenuItem; + FProjectName: string; + FSubMenuProcessed: boolean; + FFAQName: string; + FWizardPosition: integer; + {$IFNDEF LITE} + procedure HelpItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); + procedure FAQItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); + {$ENDIF} + public + constructor Create( + ParentItem: TDAMenuItem; + const AProcessSubMenu: boolean = False); + destructor Destroy; override; + + function AddSeparator: TDAMenuItem; + {$IFNDEF LITE} + function AddFAQ(Caption, Name, ProjectName {'Mydac', 'Oda', 'Sdac'}: string): TDAMenuItem; + function AddHelp(Caption, Name, ProjectName {'Mydac', 'Oda', 'Sdac'}: string): TDAMenuItem; + {$IFNDEF VER9P} + procedure AddWizard(Caption, Name: string; ClickEvent: TDAMenuClickEvent); + {$ENDIF} + {$ENDIF} + procedure AddWizards; + function Add(Caption, Name: string; ClickEvent: TDAMenuClickEvent = nil; Index: integer = -1): TDAMenuItem; + procedure ProcessSubMenu; + procedure GetSubMenu; + end; + + TDAProductMenu = class(TDAMenu) + protected + {$IFDEF CLR} + FMenuItems: IOTAMainMenuService; + {$ENDIF} + FCRMenuName: string; + FServerMenuCaption: string; + FProductMenuCaption: string; + FAboutCaption: string; + FAboutName: string; + FAboutClickEvent: TDAMenuClickEvent; + + FCRMenu: TDAMenuItem; + FHasProduct: boolean; + + procedure Prepare; + function GetSubMenu: TDAMenu; + {$IFDEF VER9P} + property SubMenu: TDAMenu read GetSubMenu; + {$ENDIF} + public + constructor Create(const ACRMenuName, AAboutCaption, AAboutName: string; + const AServerMenuCaption: string; const AProductMenuCaption: string = ''); overload; + constructor Create; overload; + function AddItems(Instance: HINST): boolean; virtual; + function AddAbout: TDAMenuItem; + + property CRMenuName: string read FCRMenuName; + property ServerMenuCaption: string read FServerMenuCaption; + property ProductMenuCaption: string read FProductMenuCaption; + {$IFNDEF VER9P} + property SubMenu: TDAMenu read GetSubMenu; + {$ENDIF} + end; + +function RemoveAmpersands(RawCaption: string): string; + +implementation + +uses +{$IFDEF CLR} + Registry, +{$ENDIF} +{$IFDEF MSWINDOWS} +{$IFNDEF LITE} + DacVcl, +{$ENDIF} +{$ENDIF} +{$IFNDEF LITE} + ShellApi, +{$ENDIF} +{$IFNDEF VER6P} + ActiveX, comobj, +{$ENDIF} +{$IFNDEF LITE} + HelpUtils, +{$ENDIF} + Forms, Dialogs; + +{ TDAMenuItem } + +constructor TDAMenuItem.Create(DAMenu: TDAMenu; MenuItem: TAPIMenuItem); +begin + inherited Create(DAMenu); + FMenuItem := MenuItem; + FNeedDestroyMenuItem := False; + + if FMenuItem <> nil then begin + FName := FMenuItem.Name; + FVisible := FMenuItem.Visible; + {$IFDEF CLR} + FCaption := FMenuItem.Text; + {$ELSE} + FCaption := FMenuItem.Caption; + {$ENDIF} + end; + + FSubMenu := TDAMenu.Create(Self); +end; + +constructor TDAMenuItem.Create(DAMenu: TDAMenu; Caption, Name: string; ClickEvent: TDAMenuClickEvent = nil; Index: integer = -1); +var + Bmp: Graphics.TBitmap; +{$IFDEF CLR} + MainMenu: TDAMenu; + bitmapHandle: IntPtr; + referenceItemName: string; + Location: OTAMenuItemLocation; + h: HBITMAP; +{$ENDIF} + MenuItem: TAPIMenuItem; +begin + Bmp := nil; + try + if (DAMenu <> nil) and (DAMenu.FHInstance <> 0) then begin + Bmp := Graphics.TBitmap.Create; + try + //Bmp.LoadFromResourceName(FHInstance, UpperCase(Name)); + Bmp.LoadFromResourceName(DAMenu.FHInstance, UpperCase(Name)); + //Bmp.LoadFromFile('d:\' + Name + '.bmp'); + except + Bmp.Free; // Resource not found + Bmp := nil; + end; + end; + {$IFDEF CLR} + MainMenu := DAMenu; + while not (MainMenu is TDAProductMenu) do + MainMenu := TDAMenu(MainMenu.FParentItem.Collection); + + if DAMenu.Count = 0 then begin + referenceItemName := DAMenu.FMenuItems.Name; + Location := OTAMenuItemLocation.otamlChild; + end + else + if (Index = -1) or (Index >= DAMenu.Count) then begin + referenceItemName := DAMenu.FMenuItems.ChildMenuItem(DAMenu.Count - 1).Name; + Location := OTAMenuItemLocation.otamlAfter; + end + else + begin + referenceItemName := DAMenu.FMenuItems.ChildMenuItem(Index).Name; + Location := OTAMenuItemLocation.otamlBefore; + end; + + bitmapHandle := nil; + if Bmp <> nil then + try + h := Bmp.Handle; + bitmapHandle := IntPtr(Integer(h)); + except + bitmapHandle := nil; + end; + MenuItem := TDAProductMenu(MainMenu).FMenuItems.AddMenuItem( + referenceItemName, + Location, + Name, + Caption, + bitmapHandle); + + if Assigned(ClickEvent) then + Include(MenuItem.Executed, ClickEvent); + Create(DAMenu, MenuItem); + {$ELSE} + if Index = -1 then + Index := DAMenu.Count; + MenuItem := TAPIMenuItem.Create(nil); + MenuItem.Caption := Caption; + MenuItem.Name := Name; + MenuItem.OnClick := ClickEvent; + if Bmp <> nil then + MenuItem.ImageIndex := (BorlandIDEServices as INTAServices).AddMasked(Bmp, Bmp.TransparentColor); + DAMenu.FMenuItems.Insert(Index, MenuItem); + Create(DAMenu, MenuItem); + {$ENDIF} + FNeedDestroyMenuItem := True; + finally + Bmp.Free; + end; +end; + +destructor TDAMenuItem.Destroy; +begin + FSubMenu.Free; + +{$IFNDEF CLR} + if Assigned(FMenuItem) then begin + if FNeedDestroyMenuItem then + FMenuItem.Free + end; +{$ENDIF} + + inherited Destroy; +end; + +procedure TDAMenuItem.SetCaption(Value: string); +begin +{$IFDEF CLR} + FMenuItem.Text := Value; +{$ELSE} + FMenuItem.Caption := Value; +{$ENDIF} +end; + +procedure TDAMenuItem.SetVisible(Value: boolean); +begin + FMenuItem.Visible := Value; +end; +{ TDAMenu } + +constructor TDAMenu.Create( + ParentItem: TDAMenuItem; + const AProcessSubMenu: boolean = False); + +{$IFDEF CLR} + procedure MainMenu; + var + MainMenu: IOTAMainMenuService; + begin + MainMenu := BorlandIDE.GetService(typeof(IOTAMainMenuService)) as IOTAMainMenuService; + + Assert(Self is TDAProductMenu); + + TDAProductMenu(Self).FMenuItems := MainMenu; + end; +{$ELSE} + procedure MainMenu; + var + MainMenu: TMenu; + begin + MainMenu := (BorlandIDEServices as INTAServices).GetMainMenu; + if MainMenu <> nil then + FMenuItems := MainMenu.Items + else + FMenuItems := nil; + end; +{$ENDIF} +begin + inherited Create(TDAMenuItem); + + FWizardPosition := -1; + + if ParentItem = nil then + MainMenu; + +{$IFDEF CLR} + + FParentItem := ParentItem; + if ParentItem = nil then + FMenuItems := TDAProductMenu(Self).FMenuItems.GetFirstMenuItem.ParentMenuItem + else + FMenuItems := ParentItem.FMenuItem; +{$ELSE} + if ParentItem <> nil then + FMenuItems := ParentItem.FMenuItem; +{$ENDIF} + if (FMenuItems <> nil) and AProcessSubMenu + (*{$IFDEF VER9P}and (ParentItem <> nil){$ENDIF}*) // bug with IOTAMenuItem.Count under CLR (DbxOda) + then + ProcessSubMenu; +end; + +destructor TDAMenu.Destroy; +begin + Clear; + inherited; +end; + +{$IFNDEF LITE} +procedure TDAMenu.HelpItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +var + HelpFile, JumpID: string; +begin +{$IFDEF VER8P} + HelpFile := 'ms-help://CoreLab.' + FProjectName; + JumpID := Format('ms-help://CoreLab.%s/%s/overview_%s.htm', [FProjectName, FProjectName, FProjectName]); +{$ELSE} + HelpFile := GetHelpFileName(FProjectName); + JumpID := 'Overview_' + FProjectName; +{$ENDIF} + ShowHelp(HelpFile, JumpID); +end; +{$ENDIF} + +function TDAMenu.AddSeparator: TDAMenuItem; +var + guid: TGuid; + s, s1: string; + i, Cnt: integer; +begin + Result := nil; + if FMenuItems <> nil then begin + s := '-'; + {$IFDEF CLR} + Cnt := FMenuItems.ChildCount; + {$ELSE} + Cnt := FMenuItems.Count; + {$ENDIF} + if FWizardPosition <> -1 then + Cnt := FWizardPosition - 1; + if Cnt > 0 then + {$IFDEF CLR} + s := FMenuItems.ChildMenuItem(Cnt - 1).Text; + {$ELSE} + s := FMenuItems.Items[Cnt - 1].Caption; + {$ENDIF} + + if s = '-' then + Exit; + end; + +{$IFDEF VER6P} + if CreateGuid(guid) <> 0 then + RaiseLastOSError; +{$ELSE} + if CoCreateGuid(guid) <> 0 then + RaiseLastWin32Error; +{$ENDIF} + + s := GUIDToString(guid); + s1 := 'Separator'; + for i := 1 to Length(s) do + case s[i] of + '0'..'9', 'a'..'z', 'A'..'Z': + s1 := s1 + s[i]; + end; + + Result := Add('-', s1); +end; + +{$IFNDEF LITE} +function TDAMenu.AddFAQ(Caption, Name, ProjectName {'Mydac', 'Oda', 'Sdac'}: string): TDAMenuItem; +var + i: integer; +begin + Result := nil; +{$IFDEF VER8P} + FFAQName := ExtractFilePath(GetHelpFileName(ProjectName)); +{$ELSE} + FFAQName := ExtractFilePath(Application.ExeName); +{$ENDIF} + i := Length(FFAQName) - 1; + while (i > 1) and (FFAQName[i] <> '/') and (FFAQName[i] <> '\') do + Dec(i); + + if i < 3 then + Exit; + + FFAQName := Copy(FFAQName, 1, i) {$IFNDEF VER8P}+ ProjectName{$ENDIF} + '\FAQ.html'; + if FileExists(FFAQName) then + Result := Add(Caption, Name, FAQItemClick); +end; + +procedure TDAMenu.FAQItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +begin + ShellExecute(0, 'open', {$IFDEF CLR}FFAQName{$ELSE}PChar(FFAQName){$ENDIF}, '', '', SW_SHOW); +end; + +function TDAMenu.AddHelp(Caption, Name, ProjectName {'Mydac', 'Odac', 'Sdac'}: string): TDAMenuItem; +var + HelpFileName: string; +begin + FProjectName := ProjectName; + HelpFileName := GetHelpFileName(ProjectName); + if (ExtractFilePath(HelpFileName) = '') or (FileExists(HelpFileName)) then + Result := Add(Caption, Name, HelpItemClick) + else + Result := nil; +end; + +{$IFNDEF VER9P} +procedure TDAMenu.AddWizard(Caption, Name: string; ClickEvent: TDAMenuClickEvent); +begin + TDAMenuItem.Create(Self, Caption, Name, ClickEvent, -1); + if FWizardPosition = -1 then + FWizardPosition := 0 +end; +{$ENDIF} + +{$ENDIF} + +function TDAMenu.Add(Caption, Name: string; ClickEvent: TDAMenuClickEvent = nil; Index: integer = -1): TDAMenuItem; +begin + if (Index = -1) and (FWizardPosition <> -1) then begin + Index := FWizardPosition; + Inc(FWizardPosition); + end; + Result := TDAMenuItem.Create(Self, Caption, Name, ClickEvent, Index); +end; + +procedure TDAMenu.ProcessSubMenu; +var + Skip: boolean; + i, j: integer; + MenuItem: TAPIMenuItem; +begin + if FMenuItems <> nil then begin + if not FSubMenuProcessed then + Clear + else + if FMenuItems.{$IFDEF WIN32}Count{$ELSE}ChildCount{$ENDIF} = Count then + Exit; + {$IFDEF CLR} + for i := 0 to FMenuItems.ChildCount - 1 do begin + MenuItem := FMenuItems.ChildMenuItem(i); + {$ELSE} + for i := 0 to FMenuItems.Count - 1 do begin + MenuItem := FMenuItems.Items[i]; + {$ENDIF} + Skip := False; + if FSubMenuProcessed then + for j := 0 to Count - 1 do + if TDAMenuItem(Items[j]).Name = MenuItem.Name then begin + Skip := True; + Break; + end; + if Skip then + Continue; + TDAMenuItem.Create(Self, MenuItem); + FWizardPosition := 0; + end; + FSubMenuProcessed := True; + end; +end; + +procedure TDAMenu.GetSubMenu; +var + i: integer; + MenuItem: TAPIMenuItem; +begin + if (FMenuItems <> nil) and not FSubMenuProcessed then begin + Clear; + {$IFDEF CLR} + for i := 0 to FMenuItems.ChildCount - 1 do begin + MenuItem := FMenuItems.ChildMenuItem(i); + TDAMenuItem.Create(Self, MenuItem); + end; + {$ELSE} + for i := 0 to FMenuItems.Count - 1 do begin + MenuItem := FMenuItems.Items[i]; + TDAMenuItem.Create(Self, MenuItem); + end; + {$ENDIF} + FSubMenuProcessed := True; + end; +end; + +procedure TDAMenu.AddWizards; +begin + FWizardPosition := -1; +end; + +{ TDAProductMenu } + +constructor TDAProductMenu.Create(const ACRMenuName, AAboutCaption, + AAboutName: string; const AServerMenuCaption: string; + const AProductMenuCaption: string = ''); +begin + inherited Create(nil, True); + + FCRMenuName := ACRMenuName; + FAboutCaption := AAboutCaption; + FAboutName := AAboutName; + FServerMenuCaption := AServerMenuCaption; + FProductMenuCaption := AProductMenuCaption; +{$IFNDEF VER9P} + Prepare; +{$ENDIF} +end; + +constructor TDAProductMenu.Create; +begin + inherited Create(nil, True); +end; + +procedure TDAProductMenu.Prepare; +var + ThirdParty: TDAMenuItem; + i: integer; + UsedCaption: string; +begin + ThirdParty := nil; + for i := 0 to Count - 1 do begin + if TDAMenuItem(Items[i]).Name = FCRMenuName then begin + FCRMenu := TDAMenuItem(Items[i]); + SubMenu.ProcessSubMenu; + if SubMenu.Count > 0 then + SubMenu.AddSeparator; + Break; + end + else + if (FProductMenuCaption <> '') and (UpperCase(RemoveAmpersands(TDAMenuItem(Items[i]).Caption)) = + UpperCase(RemoveAmpersands(FServerMenuCaption))) then + ThirdParty := TDAMenuItem(Items[i]); + end; + + FHasProduct := False; + + if ThirdParty = nil then + UsedCaption := FServerMenuCaption + else + UsedCaption := FProductMenuCaption; + if FCRMenu = nil then + FCRMenu := Add(UsedCaption, FCRMenuName, nil, Count - 1{$IFDEF VER9P}{$IFNDEF CLR} - 1{$ENDIF}{$ENDIF}) + else begin + FCRMenu.Caption := UsedCaption; + {$IFDEF VER9P} + for i := 0 to SubMenu.Count - 1 do + if RemoveAmpersands(TDAMenuItem(SubMenu.Items[i]).Caption) = + RemoveAmpersands(FAboutCaption) then begin + FHasProduct := True; + Break; + end; + {$ENDIF} + end; +end; + +function TDAProductMenu.AddItems(Instance: HINST): boolean; +begin + FHInstance := Instance; + Result := False; + ProcessSubMenu; +{$IFDEF VER9P} + Prepare; +{$ENDIF} + if not FHasProduct then begin + FHInstance := Instance; + SubMenu.FHInstance := Instance; + SubMenu.AddSeparator; + Result := True; + FHasProduct := True; + end +{$IFDEF VER9P} + else + AddAbout.Visible := False +{$ENDIF} +end; + +function TDAProductMenu.GetSubMenu: TDAMenu; +begin + Result := FCRMenu.SubMenu; +end; + +function TDAProductMenu.AddAbout: TDAMenuItem; +begin + Result := SubMenu.Add(FAboutCaption, FAboutName, FAboutClickEvent); +end; + +function RemoveAmpersands(RawCaption: string): string; +var + i: integer; +begin + Result := ''; + i := 1; + while i <= Length(RawCaption) do begin + if RawCaption[i] = '&' then begin + Inc(i); + if i > Length(RawCaption) then + Break; + end; + Result := Result + RawCaption[i]; + Inc(i); + end; +end; + +end. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Design/DAParamValueEditor.dfm b/internal/4.10.0.10/1/Source/Design/DAParamValueEditor.dfm new file mode 100644 index 0000000..7bdd118 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAParamValueEditor.dfm @@ -0,0 +1,26 @@ +inherited DAParamValueEditor: TDAParamValueEditor + Left = 366 + Top = 221 + Height = 332 + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + BorderStyle = bsSizeToolWin + Caption = 'Param.Value Editor' + Constraints.MinHeight = 332 + Constraints.MinWidth = 513 + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 257 + TabOrder = 1 + end + object Memo: TMemo + Left = 0 + Top = 0 + Width = 505 + Height = 257 + Align = alClient + TabOrder = 0 + OnChange = MemoChange + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAParamValueEditor.pas b/internal/4.10.0.10/1/Source/Design/DAParamValueEditor.pas new file mode 100644 index 0000000..3586f5a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAParamValueEditor.pas @@ -0,0 +1,90 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DAParamValueEditor; +{$ENDIF} + +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons, ComCtrls, ExtCtrls, +{$ENDIF} +{$IFDEF LINUX} + SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QExtCtrls, QComCtrls, QButtons, +{$ENDIF} + DB, CREditor; + +type + TDAParamValueEditor = class(TCREditorForm) + Memo: TMemo; + //udIndex: TUpDown; + + procedure MemoChange(Sender: TObject); + + protected + function GetValue: string; + procedure SetValue(Value: string); + + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + + public + property Value: string read GetValue write SetValue; + end; + +implementation + +uses + MemData, CRParser + {$IFDEF VER6P} + , Variants + {$ENDIF} + ; + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DAParamValueEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +function TDAParamValueEditor.GetValue: string; +begin + Result := Memo.Lines.Text; +end; + +procedure TDAParamValueEditor.SetValue(Value: string); +begin + Memo.Lines.Text := Value; + Modified := False; +end; + +procedure TDAParamValueEditor.MemoChange(Sender: TObject); +begin + inherited; + Modified := True; +end; + +function TDAParamValueEditor.GetComponent: TComponent; +begin + Result := nil; +end; + +procedure TDAParamValueEditor.SetComponent(Value: TComponent); +begin +end; + +end. + diff --git a/internal/4.10.0.10/1/Source/Design/DAParamValueEditor.xfm b/internal/4.10.0.10/1/Source/Design/DAParamValueEditor.xfm new file mode 100644 index 0000000..6757df9 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAParamValueEditor.xfm @@ -0,0 +1,26 @@ +inherited DAParamValueEditor: TDAParamValueEditor + Left = 366 + Top = 221 + Height = 332 + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + BorderStyle = fbsSizeToolWin + Caption = 'Param.Value Editor' + Constraints.MinHeight = 332 + Constraints.MinWidth = 513 + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 257 + TabOrder = 1 + end + object Memo: TMemo + Left = 0 + Top = 0 + Width = 505 + Height = 257 + Align = alClient + TabOrder = 0 + OnChange = MemoChange + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAParamsFrame.dfm b/internal/4.10.0.10/1/Source/Design/DAParamsFrame.dfm new file mode 100644 index 0000000..f88a847 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAParamsFrame.dfm @@ -0,0 +1,124 @@ +inherited DAParamsFrame: TDAParamsFrame + object lbPName: TLabel [0] + Left = 16 + Top = 8 + Width = 79 + Height = 13 + Caption = 'Parameter Name' + end + object lbParamLog: TLabel [1] + Left = 9 + Top = 6 + Width = 5 + Height = 16 + Caption = ':' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + end + inherited PanelItem: TPanel + Top = 24 + Height = 197 + object lbPType: TLabel + Left = 16 + Top = 16 + Width = 50 + Height = 13 + Caption = 'Data Type' + end + object lbParamType: TLabel + Left = 177 + Top = 16 + Width = 57 + Height = 13 + Anchors = [akTop, akRight] + Caption = 'Param Type' + end + object lbPValue: TLabel + Left = 16 + Top = 64 + Width = 27 + Height = 13 + Caption = 'Value' + end + object lbNullValue: TLabel + Left = 34 + Top = 125 + Width = 48 + Height = 13 + Caption = 'Null Value' + FocusControl = cbNullValue + end + object lbSize: TLabel + Left = 136 + Top = 125 + Width = 20 + Height = 13 + Caption = 'Size' + end + object cbDataType: TComboBox + Left = 16 + Top = 32 + Width = 154 + Height = 21 + Style = csDropDownList + Anchors = [akLeft, akTop, akRight] + DropDownCount = 15 + ItemHeight = 13 + TabOrder = 0 + OnChange = cbDataTypeChange + end + object cbParamType: TComboBox + Left = 177 + Top = 32 + Width = 73 + Height = 21 + Style = csDropDownList + Anchors = [akTop, akRight] + DropDownCount = 9 + ItemHeight = 13 + TabOrder = 1 + OnChange = cbParamTypeChange + end + object edValue: TEdit + Left = 16 + Top = 80 + Width = 212 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + OnChange = edValueChange + end + object bEdValue: TButton + Left = 228 + Top = 80 + Width = 21 + Height = 21 + Anchors = [akTop, akRight] + Caption = '...' + TabOrder = 3 + OnClick = bEdValueClick + end + object cbNullValue: TCheckBox + Left = 16 + Top = 124 + Width = 13 + Height = 17 + TabOrder = 4 + OnClick = cbNullValueClick + end + object edSize: TEdit + Left = 192 + Top = 121 + Width = 58 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 5 + OnChange = edSizeChange + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAParamsFrame.pas b/internal/4.10.0.10/1/Source/Design/DAParamsFrame.pas new file mode 100644 index 0000000..a6b3d3e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAParamsFrame.pas @@ -0,0 +1,455 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// Params Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DAParamsFrame; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, + Dialogs, + StdCtrls, ExtCtrls, +{$ENDIF} +{$IFDEF LINUX} + QStdCtrls, QExtCtrls, QControls, +{$ENDIF} + Classes, SysUtils, + DBAccess, DB, + CRFrame, CRTabEditor, CRColFrame; + +type + TDataTypeInfo = record + Name: string; + DataType: TFieldType; + EmptyIsNull: boolean; + Editable: boolean; + Sizeable: boolean; + DefaultValue: string; + end; + TDataTypeInfos = array of TDataTypeInfo; + + TParamTypeInfo = record + Name: string; + ParamType: TParamType; + end; + TParamTypeInfos = array of TParamTypeInfo; + + TDAParamsFrame = class(TCRColFrame) + lbPName: TLabel; + lbParamLog: TLabel; + lbPType: TLabel; + cbDataType: TComboBox; + cbParamType: TComboBox; + lbParamType: TLabel; + lbPValue: TLabel; + edValue: TEdit; + bEdValue: TButton; + cbNullValue: TCheckBox; + lbNullValue: TLabel; + lbSize: TLabel; + edSize: TEdit; + procedure cbDataTypeChange(Sender: TObject); + procedure cbParamTypeChange(Sender: TObject); + procedure edValueChange(Sender: TObject); + procedure cbNullValueClick(Sender: TObject); + procedure edSizeChange(Sender: TObject); + procedure bEdValueClick(Sender: TObject); + + protected + FDataTypeInfos: TDataTypeInfos; // Must be filled in successor's constructor + FParamTypeInfos: TParamTypeInfos; // Must be filled in successor's constructor + + procedure AddDataType( + Name: string; // if empty then use DB array + DataType: TFieldType; + EmptyIsNull: boolean; + Editable: boolean; + Sizeable: boolean; + DefaultValue: string + ); + procedure AddParamType( + Name: string; + ParamType: TParamType + ); + + function GetItems: TCollection; override; + function GetParams: TDAParams; + function GetItemName(Item: TCollectionItem): string; override; + procedure InitItems; override; + procedure ItemToControls(Item: TCollectionItem); override; + procedure StoreItemValue(Item: TCollectionItem); virtual; + procedure ControlsToItem(Item: TCollectionItem); override; + procedure UpdateControlsState; override; + + property Params: TDAParams read GetParams; + public + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DAParamsFrame.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses +{$IFDEF VER6P} + Variants, +{$ENDIF} + DASQLEditor, DAParamValueEditor, CREditor, MemData; + +function TDAParamsFrame.GetItems: TCollection; +begin + Result := Editor.DADesignUtilsClass.GetParams(Editor.LocalComponent); +end; + +function TDAParamsFrame.GetParams: TDAParams; +begin + Result := Items as TDAParams; +end; + +function TDAParamsFrame.GetItemName(Item: TCollectionItem): string; +begin + Result := TDAParam(Item).Name; +end; + +procedure TDAParamsFrame.InitItems; +var + i: integer; +begin + if (cbDataType.Items.Count = 0) and (Length(FDataTypeInfos) <> 0) then begin // First call + for i := Low(FDataTypeInfos) to High(FDataTypeInfos) do + cbDataType.Items.Add(FDataTypeInfos[i].Name); + cbDataType.DropDownCount := cbDataType.Items.Count; + end; + + if cbParamType.Items.Count = 0 then // First call + if Length(FParamTypeInfos) <> 0 then begin + for i := Low(FParamTypeInfos) to High(FParamTypeInfos) do + cbParamType.Items.Add(FParamTypeInfos[i].Name); + cbParamType.DropDownCount := cbParamType.Items.Count; + end + else + begin + cbParamType.Visible := False; + lbParamType.Visible := False; + cbDataType.Width := cbParamType.Left + cbParamType.Width - cbDataType.Left; + end; + + inherited; +end; + +procedure TDAParamsFrame.ItemToControls(Item: TCollectionItem); +var + Find: boolean; + i: integer; +begin + // DataType + if TDAParam(Item).DataType = ftUnknown then + cbDataType.ItemIndex := -1 + else begin + Find := False; + for i := Low(FDataTypeInfos) to High(FDataTypeInfos) do + if FDataTypeInfos[i].DataType = TDAParam(Item).DataType then begin + cbDataType.ItemIndex := i; + Find := True; + end; + + if not Find then + //raise Exception.Create('EdItem: Data type not found'); + cbDataType.ItemIndex := -1; + end; + + // ItemType + if IsControlEnabled(cbParamType) then begin + if TDAParam(Item).ParamType = ptUnknown then + cbParamType.ItemIndex := -1 + else begin + Find := False; + for i := Low(FParamTypeInfos) to High(FParamTypeInfos) do + if FParamTypeInfos[i].ParamType = TDAParam(Item).ParamType then begin + cbParamType.ItemIndex := i; + Find := True; + end; + + if not Find then + //raise Exception.Create('EdItem: Item type not found'); + cbParamType.ItemIndex := -1; + end; + end; + + // Null + if cbNullValue.Enabled then + cbNullValue.Checked := TDAParam(Item).IsNull; + + // Size + edSize.Text := IntToStr(TDAParam(Item).Size); + if edSize.Text = '0' then + edSize.Text := ''; + + // Value + if edValue.Enabled then + edValue.Text := TDAParam(Item).Text + else + edValue.Text := ''; +end; + +procedure TDAParamsFrame.StoreItemValue(Item: TCollectionItem); +var +{$IFNDEF CLR} + v: Variant; +{$ENDIF} + VType: {$IFDEF VER6P}TVarType{$ELSE}integer{$ENDIF}; +begin + if (cbNullValue.Checked and IsControlEnabled(cbNullValue)) + or not IsControlEnabled(edValue) then + Exit; + + case TDAParam(Item).DataType of + ftLargeInt: + begin + {$IFDEF CLR} + TDAParam(Item).Value := StrToInt64(edValue.Text); + {$ELSE} + {$IFNDEF VER6P} + TVarDataD6(v).VType := varDecimal; + TVarDataD6(v).VInt64 := StrToInt64(edValue.Text); + {$ELSE} + TVarData(v).VType := varInt64; + TVarData(v).VInt64 := StrToInt64(edValue.Text); + {$ENDIF} + + TDAParam(Item).Value := v; + {$ENDIF} + end; + {$IFDEF VER5P} + ftVariant: + TDAParam(Item).Value := edValue.Text; + {$ENDIF} + else + with TDAParam(Item) do begin + if (DataType = ftUnknown) or + (Ord(DataType) > Ord(High(TFieldType))) then + VType := varEmpty + else + VType := FieldTypeVarMap[DataType]; + if VType <> varEmpty then + Value := VarAsType(edValue.Text, VType) + else + Value := edValue.Text; + end; + end; +end; + +procedure TDAParamsFrame.ControlsToItem(Item: TCollectionItem); +var + BadControl: TWinControl; +begin + BadControl := nil; + try + // DataType + BadControl := cbDataType; + if cbDataType.ItemIndex = - 1 then + TDAParam(Item).DataType := ftUnknown + else + TDAParam(Item).DataType := FDataTypeInfos[cbDataType.ItemIndex].DataType; + + // ItemType + if IsControlEnabled(cbParamType) then begin + BadControl := cbParamType; + if cbParamType.ItemIndex = - 1 then + TDAParam(Item).ParamType := ptUnknown + else + TDAParam(Item).ParamType := FParamTypeInfos[cbParamType.ItemIndex].ParamType; + end; + + // Null + // Null must be stored before value + BadControl := cbNullValue; + if IsControlEnabled(cbNullValue) and cbNullValue.Checked then + TDAParam(Item).Clear; + + // Size + BadControl := edSize; + if (edSize.Text <> '') and edSize.Enabled then + TDAParam(Item).Size := StrToInt(edSize.Text) + else + TDAParam(Item).Size := 0; + + // Value + // Value must be stored after Null + BadControl := edValue; + StoreItemValue(Item); + + except + if Page.PageControl.ActivePage = Page then begin + lbItemName.ItemIndex := FOldItemIndex; + + if BadControl <> nil then begin + BadControl.SetFocus; + if BadControl is TCustomEdit then + TCustomEdit(BadControl).SelectAll; + end; + end; + raise; + end; +end; + +procedure TDAParamsFrame.UpdateControlsState; +var + Editable: boolean; +begin + if cbDataType.ItemIndex = - 1 then + Editable := False + else + Editable := FDataTypeInfos[cbDataType.ItemIndex].Editable; + + cbNullValue.Enabled := Editable; + edValue.Enabled := Editable; + bEdValue.Enabled := edValue.Enabled; + cbParamType.Enabled := Editable; + edSize.Enabled := Editable and FDataTypeInfos[cbDataType.ItemIndex].Sizeable; + + inherited; +end; + +procedure TDAParamsFrame.cbDataTypeChange(Sender: TObject); +begin + if FInSelectItem or not IsControlEnabled(Sender as TControl) then + Exit; + + Modified := True; + UpdateControlsState; +end; + +procedure TDAParamsFrame.cbParamTypeChange(Sender: TObject); +begin + if FInSelectItem or not IsControlEnabled(Sender as TControl) then + Exit; + + Modified := True; + UpdateControlsState; +end; + +procedure TDAParamsFrame.edValueChange(Sender: TObject); +var + l, Size: integer; +begin + if FInSelectItem or not IsControlEnabled(Sender as TControl) then + Exit; + + Assert(cbDataType.ItemIndex <> - 1); + l := Length(edValue.Text); + if cbNullValue.Checked and (l <> 0) then begin + cbNullValue.Checked := False; + end + else + if not cbNullValue.Checked and (l = 0) + and FDataTypeInfos[cbDataType.ItemIndex].EmptyIsNull then + cbNullValue.Checked := True; + + if edSize.Enabled then begin + if (edSize.Text <> '') then + Size := StrToInt(edSize.Text) + else + Size := 0; + + if FDataTypeInfos[cbDataType.ItemIndex].Sizeable + and (Size < l) then + edSize.Text := IntToStr(l); + end; + + Modified := True; + UpdateControlsState; +end; + +procedure TDAParamsFrame.cbNullValueClick(Sender: TObject); +begin + if FInSelectItem or not IsControlEnabled(Sender as TControl) then + Exit; + + Modified := True; + + if cbNullValue.Checked then + edValue.Text := '' + else + if (edValue.Text = '') and (cbDataType.ItemIndex <> -1) then + edValue.Text := FDataTypeInfos[cbDataType.ItemIndex].DefaultValue; + UpdateControlsState; +end; + +procedure TDAParamsFrame.edSizeChange(Sender: TObject); +begin + if FInSelectItem or not IsControlEnabled(Sender as TControl) then + Exit; + + Modified := True; + UpdateControlsState; +end; + +procedure TDAParamsFrame.AddDataType( + Name: string; // if empty then use DB array + DataType: TFieldType; + EmptyIsNull: boolean; + Editable: boolean; + Sizeable: boolean; + DefaultValue: string +); +var + l: integer; +begin + l := Length(FDataTypeInfos); + SetLength(FDataTypeInfos, l + 1); + + FDataTypeInfos[l].Name := Name; + FDataTypeInfos[l].DataType := DataType; + FDataTypeInfos[l].EmptyIsNull := EmptyIsNull; + FDataTypeInfos[l].Editable := Editable; + FDataTypeInfos[l].Sizeable := Sizeable; + FDataTypeInfos[l].DefaultValue := DefaultValue; +end; + +procedure TDAParamsFrame.AddParamType( + Name: string; + ParamType: TParamType +); +var + l: integer; +begin + l := Length(FParamTypeInfos); + SetLength(FParamTypeInfos, l + 1); + + FParamTypeInfos[l].Name := Name; + FParamTypeInfos[l].ParamType := ParamType; +end; + +procedure TDAParamsFrame.bEdValueClick(Sender: TObject); +begin + Assert(Owner is TCREditorForm); + with TDAParamValueEditor.Create(Self, TCREditorForm(Owner).DADesignUtilsClass) do + try + Value := edValue.Text; + ShowModal; + if ModalResult = mrOK then + edValue.Text := Value; + finally + Free; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DAParamsFrame.xfm b/internal/4.10.0.10/1/Source/Design/DAParamsFrame.xfm new file mode 100644 index 0000000..46d2f10 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAParamsFrame.xfm @@ -0,0 +1,124 @@ +inherited DAParamsFrame: TDAParamsFrame + object lbPName: TLabel [0] + Left = 16 + Top = 8 + Width = 79 + Height = 13 + Caption = 'Parameter Name' + end + object lbParamLog: TLabel [1] + Left = 9 + Top = 6 + Width = 5 + Height = 16 + Caption = ':' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + end + inherited PanelItem: TPanel + Top = 24 + Height = 197 + object lbPType: TLabel + Left = 16 + Top = 16 + Width = 50 + Height = 13 + Caption = 'Data Type' + end + object lbParamType: TLabel + Left = 177 + Top = 16 + Width = 57 + Height = 13 + Anchors = [akTop, akRight] + Caption = 'Param Type' + end + object lbPValue: TLabel + Left = 16 + Top = 64 + Width = 27 + Height = 13 + Caption = 'Value' + end + object lbNullValue: TLabel + Left = 34 + Top = 125 + Width = 48 + Height = 13 + Caption = 'Null Value' + FocusControl = cbNullValue + end + object lbSize: TLabel + Left = 136 + Top = 125 + Width = 20 + Height = 13 + Caption = 'Size' + end + object cbDataType: TComboBox + Left = 16 + Top = 32 + Width = 154 + Height = 21 + Style = csDropDownList + Anchors = [akLeft, akTop, akRight] + DropDownCount = 15 + ItemHeight = 13 + TabOrder = 0 + OnChange = cbDataTypeChange + end + object cbParamType: TComboBox + Left = 177 + Top = 32 + Width = 73 + Height = 21 + Style = csDropDownList + Anchors = [akTop, akRight] + DropDownCount = 9 + ItemHeight = 13 + TabOrder = 1 + OnChange = cbParamTypeChange + end + object edValue: TEdit + Left = 16 + Top = 80 + Width = 212 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + OnChange = edValueChange + end + object bEdValue: TButton + Left = 228 + Top = 80 + Width = 21 + Height = 21 + Anchors = [akTop, akRight] + Caption = '...' + TabOrder = 3 + OnClick = bEdValueClick + end + object cbNullValue: TCheckBox + Left = 16 + Top = 124 + Width = 13 + Height = 17 + TabOrder = 4 + OnClick = cbNullValueClick + end + object edSize: TEdit + Left = 192 + Top = 121 + Width = 58 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 5 + OnChange = edSizeChange + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAQueryEditor.dfm b/internal/4.10.0.10/1/Source/Design/DAQueryEditor.dfm new file mode 100644 index 0000000..714fec8 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAQueryEditor.dfm @@ -0,0 +1,30 @@ +inherited DAQueryEditorForm: TDAQueryEditorForm + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + inherited btOk: TBitBtn + TabOrder = 2 + end + inherited btCancel: TBitBtn + TabOrder = 3 + end + object btnDataEditor: TBitBtn + Left = 94 + Top = 8 + Width = 80 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = '&Data Editor...' + TabOrder = 1 + OnClick = btnDataEditorClick + end + end + inherited PageControl: TPageControl + object shEditSQL: TTabSheet [1] + Caption = '&Update SQLs' + end + object shGenerator: TTabSheet [2] + Caption = 'SQL &Generator' + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAQueryEditor.pas b/internal/4.10.0.10/1/Source/Design/DAQueryEditor.pas new file mode 100644 index 0000000..78b0834 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAQueryEditor.pas @@ -0,0 +1,171 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// Query Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DAQueryEditor; +{$ENDIF} +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + Types, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QExtCtrls, QComCtrls, QButtons, +{$ENDIF} + SysUtils, DB, Classes, + DBAccess, MemUtils, + CRFrame, CREditor, CRTabEditor, DASQLFrame, DAParamsFrame, DAMacrosFrame, DASPCallFrame, + DASQLEditor, DAUpdateSQLFrame, DASQLGeneratorFrame; + +type + TDAQueryEditorForm = class(TDASQLEditorForm) + shEditSQL: TTabSheet; + shGenerator: TTabSheet; + btnDataEditor: TBitBtn; + procedure btnDataEditorClick(Sender: TObject); + protected + FUpdateSQLFrame: TDAUpdateSQLFrame; + FSQLGeneratorFrame: TDASQLGeneratorFrame; + + procedure DoInit; override; + procedure DoActivate; override; + procedure DoSave; override; + + function GetQuery: TCustomDADataSet; + procedure SetQuery(Value: TCustomDADataSet); + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + function GetFrameByInitProp: TCRFrame; override; + + property Query: TCustomDADataSet read GetQuery write SetQuery; + + public + property UpdateSQLFrame: TDAUpdateSQLFrame read FUpdateSQLFrame; + + end; + +implementation + +uses + DADesignUtils, DADataEditor; + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DAQueryEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TDAQueryEditorForm.DoInit; +begin + try + inherited; + finally + Assert(FUpdateSQLFrame <> nil); + Assert(FSQLGeneratorFrame <> nil); + FSPCallFrame.Mode := spQuery; + end; +end; + +procedure TDAQueryEditorForm.DoActivate; +begin + inherited; + if PageControl.ActivePage = FUpdateSQLFrame.Page then + ActiveControl := FUpdateSQLFrame.ActiveControl; +end; + +procedure TDAQueryEditorForm.DoSave; +var + OldActive: boolean; + OldDebug: boolean; +begin + OldActive := TCustomDADataSet(FComponent).Active; + OldDebug := TCustomDADataSet(FComponent).Debug; + try + // CR-M12021 + TCustomDADataSet(FLocalComponent).MasterSource := TCustomDADataSet(FComponent).MasterSource; + TCustomDADataSet(FLocalComponent).MasterFields := TCustomDADataSet(FComponent).MasterFields; + TCustomDADataSet(FLocalComponent).DetailFields := TCustomDADataSet(FComponent).DetailFields; + + inherited; + TCustomDADataSet(FComponent).Debug := False; + try + TCustomDADataSet(FComponent).Active := OldActive; + except + end; + finally + TCustomDADataSet(FComponent).Debug := OldDebug; + end; +end; + +function TDAQueryEditorForm.GetQuery: TCustomDADataSet; +begin + Result := FComponent as TCustomDADataSet; +end; + +procedure TDAQueryEditorForm.SetQuery(Value: TCustomDADataSet); +begin + FComponent := Value; +end; + +function TDAQueryEditorForm.GetComponent: TComponent; +begin + Result := Query; +end; + +procedure TDAQueryEditorForm.SetComponent(Value: TComponent); +begin + Query := Value as TCustomDADataSet; +end; + +function TDAQueryEditorForm.GetFrameByInitProp: TCRFrame; +begin + if InitialProperty = 'SQLDelete' then begin + FUpdateSQLFrame.SetStatementType(stDelete); + Result := FUpdateSQLFrame; + end + else + if InitialProperty = 'SQLInsert' then begin + FUpdateSQLFrame.SetStatementType(stInsert); + Result := FUpdateSQLFrame; + end + else + if InitialProperty = 'SQLRefresh' then begin + FUpdateSQLFrame.SetStatementType(stRefresh); + Result := FUpdateSQLFrame; + end + else + if InitialProperty = 'SQLUpdate' then begin + FUpdateSQLFrame.SetStatementType(stUpdate); + Result := FUpdateSQLFrame; + end + else + Result := inherited GetFrameByInitProp; +end; + +procedure TDAQueryEditorForm.btnDataEditorClick(Sender: TObject); +begin + SaveControlData; + CheckConnection(LocalComponent); + with TDADataEditorForm.Create(nil, FDADesignUtilsClass) do + try + Component := Self.LocalComponent; + ShowModal; + finally + Free; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DAQueryEditor.xfm b/internal/4.10.0.10/1/Source/Design/DAQueryEditor.xfm new file mode 100644 index 0000000..fadb63e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAQueryEditor.xfm @@ -0,0 +1,31 @@ +inherited DAQueryEditorForm: TDAQueryEditorForm + Left = 298 + Top = 226 + PixelsPerInch = 75 + inherited BtnPanel: TPanel + inherited btOk: TBitBtn + TabOrder = 2 + end + inherited btCancel: TBitBtn + TabOrder = 3 + end + object btnDataEditor: TBitBtn + Left = 94 + Top = 8 + Width = 80 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = '&Data Editor...' + TabOrder = 1 + OnClick = btnDataEditorClick + end + end + inherited PageControl: TPageControl + object shEditSQL: TTabSheet [1] + Caption = '&Update SQLs' + end + object shGenerator: TTabSheet [2] + Caption = 'SQL &Generator' + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DASPCallFrame.dfm b/internal/4.10.0.10/1/Source/Design/DASPCallFrame.dfm new file mode 100644 index 0000000..3c295db --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASPCallFrame.dfm @@ -0,0 +1,99 @@ +inherited DASPCallFrame: TDASPCallFrame + Width = 473 + Height = 332 + inherited Panel1: TPanel + Top = 146 + Width = 473 + Height = 186 + TabOrder = 3 + inherited meSQL: TMemo + Width = 457 + Height = 168 + Color = clBtnFace + ReadOnly = True + end + end + inherited pnlTop: TPanel + Top = 56 + Width = 473 + TabOrder = 1 + Visible = False + inherited btClear: TSpeedButton + Left = 465 + Width = 7 + Visible = False + end + inherited gbStatementType: TGroupBox + Width = 458 + end + end + object pnSQL: TPanel + Left = 0 + Top = 0 + Width = 473 + Height = 56 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + Visible = False + object Label14: TLabel + Left = 8 + Top = 8 + Width = 114 + Height = 13 + Caption = 'Stored Procedure Name' + end + object cbStoredProcName: TComboBox + Left = 8 + Top = 24 + Width = 321 + Height = 21 + Anchors = [akLeft, akTop, akRight] + DropDownCount = 16 + ItemHeight = 13 + TabOrder = 0 + OnChange = cbStoredProcNameChange + OnDropDown = cbStoredProcNameDropDown + end + object btGenerate: TButton + Left = 344 + Top = 22 + Width = 121 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Generate' + Enabled = False + TabOrder = 1 + OnClick = btGenerateClick + end + end + object pnSQLSP: TPanel + Left = 0 + Top = 98 + Width = 473 + Height = 48 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + Visible = False + object Label2: TLabel + Left = 5 + Top = 20 + Width = 84 + Height = 13 + Caption = 'StoredProc Name' + end + object cbStoredProcNameSP: TComboBox + Left = 97 + Top = 16 + Width = 376 + Height = 21 + Anchors = [akLeft, akTop, akRight] + DropDownCount = 16 + ItemHeight = 13 + TabOrder = 0 + OnDropDown = cbStoredProcNameDropDown + OnExit = cbStoredProcNameSPExit + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DASPCallFrame.pas b/internal/4.10.0.10/1/Source/Design/DASPCallFrame.pas new file mode 100644 index 0000000..319e47a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASPCallFrame.pas @@ -0,0 +1,258 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Stored Proc Call Generator Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DASPCallFrame; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + QStdCtrls, QExtCtrls, QControls, QButtons, QForms, +{$ENDIF} + Classes, SysUtils, DBAccess, + CRFrame, CRTabEditor, DASQLFrame, DAUpdateSQLFrame; + +type + TDASPCallFrameMode = (spSQL, spQuery, spSQLSP, spQuerySP); + + TDASPCallFrame = class(TDAUpdateSQLFrame) + pnSQL: TPanel; + Label14: TLabel; + cbStoredProcName: TComboBox; + btGenerate: TButton; + pnSQLSP: TPanel; + Label2: TLabel; + cbStoredProcNameSP: TComboBox; + procedure btGenerateClick(Sender: TObject); + procedure cbStoredProcNameChange(Sender: TObject); + procedure cbStoredProcNameDropDown(Sender: TObject); + procedure cbStoredProcNameSPExit(Sender: TObject); + protected + FListGot: boolean; + FMode: TDASPCallFrameMode; + function GetStatementTypes: TStatementTypes; override; + procedure SetMode(Value: TDASPCallFrameMode); + function CreateProcCall(SPName: string; SPParams: TDAParams): string; virtual; + function UsedConnection: TCustomDAConnection; + procedure DoActivate; override; + public + function GetSPName: string; + procedure SetSPName(Value: string); + + function ActiveControl: TWinControl; override; + + property Mode: TDASPCallFrameMode read FMode write SetMode; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DASPCallFrame.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses + DASQLEditor, DAQueryEditor, CREditor, DAConsts, DADesignUtils; + +function TDASPCallFrame.ActiveControl: TWinControl; +begin + case Mode of + spSQL, spQuery, spQuerySP: + Result := cbStoredProcName; + spSQLSP: + Result := cbStoredProcNameSP; + else + Result := inherited ActiveControl; + end; +end; + +procedure TDASPCallFrame.SetMode(Value: TDASPCallFrameMode); +begin + if Value = spSQLSP then + meSQL.Left := 1 + else + meSQL.Left := 8; + meSQL.Top := 8; + meSQL.Width := meSQL.Parent.ClientWidth - meSQL.Left * 2; + meSQL.Height := meSQL.Parent.Height - meSQL.Top * 2; // Delphi bug? + + pnSQL.Visible := False; + pnlTop.Visible := False; + pnSQLSP.Visible := False; + + pnSQL.Visible := Value in [spQuery, spQuerySP, spSQL]; + if pnSQL.Visible then + pnlTop.Top := pnSQL.Height + 1 + else + pnlTop.Top := 0; + pnlTop.Visible := Value in [spQuery, spQuerySP]; + pnSQLSP.Visible := Value = spSQLSP; + + FMode := Value; +end; + +function TDASPCallFrame.CreateProcCall(SPName: string; SPParams: TDAParams): string; +begin + Assert(False, 'Must be overriden'); +end; + +function TDASPCallFrame.UsedConnection: TCustomDAConnection; +begin + Result := nil; + if Editor.Component is TCustomDADataSet then + Result := TDBAccessUtils.UsedConnection(TCustomDADataSet(Editor.Component)) + else + if Editor.Component is TCustomDASQL then + Result := TDBAccessUtils.UsedConnection(TCustomDASQL(Editor.Component)) + else + Assert(False); +end; + +procedure TDASPCallFrame.DoActivate; +begin + inherited; +{$IFDEF DBTOOLS} + if Editor.DADesignUtilsClass.DBToolsAvailable then + cbStoredProcNameSP.OnSelect := cbStoredProcNameSPExit; +{$ENDIF} + cbStoredProcNameChange(nil); +end; + +procedure TDASPCallFrame.btGenerateClick(Sender: TObject); +var + Command: TCustomDASQL; + Par: TDAParams; + OldSQL: string; +begin + OldSQL := TrimRight(LocalComponentSQL.Text); + case Mode of + spSQL: begin + SQLText := CreateProcCall(GetSPName, Editor.DADesignUtilsClass.GetParams(Editor.LocalComponent)); + meSQLExit(nil); + end; + spQuery, spQuerySP: begin + Assert(UsedConnection <> nil); + Command := UsedConnection.CreateSQL; + try + if FStatementType = stQuery then + Par := Editor.DADesignUtilsClass.GetParams(Editor.LocalComponent) + else + Par := Command.Params; + + Command.SQL.Text := CreateProcCall(GetSPName, Par); + SQLText := Command.SQL.Text; + meSQLExit(nil); + meSQLChange(nil); + finally + Command.Free; + end; + end; + end; + if TrimRight(SQLText) <> OldSQL then + Modified := True; +end; + +procedure TDASPCallFrame.cbStoredProcNameChange(Sender: TObject); +begin + case Mode of + spSQL, spQuery, spQuerySP: + btGenerate.Enabled := (UsedConnection <> nil) and (Trim(cbStoredProcName.Text) <> ''); + {spSQLSP: + btGenerateSP.Enabled := Trim(cbStoredProcNameSP.Text) <> '';} + end; +end; + +function TDASPCallFrame.GetSPName: string; +begin + case Mode of + spSQL, spQuery, spQuerySP: + Result := cbStoredProcName.Text; + spSQLSP: + Result := cbStoredProcNameSP.Text; + end; + Result := Trim(Result); +end; + +procedure TDASPCallFrame.SetSPName(Value: string); +begin + case Mode of + spSQL, spQuery, spQuerySP: + cbStoredProcName.Text := Value; + spSQLSP: + cbStoredProcNameSP.Text := Value; + end; +end; + +procedure TDASPCallFrame.cbStoredProcNameDropDown(Sender: TObject); +begin + try + if not FListGot and (UsedConnection <> nil) then begin + Editor.CheckConnection(UsedConnection); + UsedConnection.GetStoredProcNames(cbStoredProcName.Items); + cbStoredProcNameSP.Items.Assign(cbStoredProcName.Items); + FListGot := True; + end; + except + Application.HandleException(Self); + end; +end; + +procedure TDASPCallFrame.cbStoredProcNameSPExit(Sender: TObject); +var + SPName: string; +begin + try + SPName := GetSPName; + if (SPName <> '') and (SPName <> Editor.DADesignUtilsClass.GetStoredProcName(Editor.LocalComponent as TCustomDADataSet)) then begin + Modified := True; + Editor.DADesignUtilsClass.SetStoredProcName(Editor.LocalComponent as TCustomDADataSet, SPName); + if UsedConnection = nil then + raise Exception.Create(SConnectionNotDefined) + else begin + SQLText := CreateProcCall(SPName, Editor.DADesignUtilsClass.GetParams(Editor.LocalComponent)); + Application.ProcessMessages; + SetSelStart(meSQL, 0); + meSQLExit(nil); + end; + end; + except + if Editor.ActiveControl <> nil then // prevent from infinite loop if ESC was pressed in Editor + Application.HandleException(Self); + end; +end; + +function TDASPCallFrame.GetStatementTypes: TStatementTypes; +begin + case FMode of + spSQL: + Result := [stQuery]; // invisible + spQuery: + Result := Editor.DADesignUtilsClass.GetStatementTypes; + spSQLSP: + Result := [stQuery]; // invisible + spQuerySP: + Result := Editor.DADesignUtilsClass.GetStatementTypes; + else + Assert(False); + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DASPCallFrame.xfm b/internal/4.10.0.10/1/Source/Design/DASPCallFrame.xfm new file mode 100644 index 0000000..d588856 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASPCallFrame.xfm @@ -0,0 +1,101 @@ +inherited DASPCallFrame: TDASPCallFrame + Width = 473 + Height = 332 + inherited Panel1: TPanel + Top = 146 + Width = 473 + Height = 186 + TabOrder = 3 + inherited meSQL: TMemo + Width = 457 + Height = 168 + Color = clBtnFace + ReadOnly = True + end + end + inherited pnlTop: TPanel + Top = 56 + Width = 473 + TabOrder = 1 + Visible = False + inherited btClear: TSpeedButton + Left = 465 + Width = 7 + Visible = False + end + inherited gbStatementType: TGroupBox + Width = 458 + end + end + object pnSQL: TPanel + Left = 0 + Top = 0 + Width = 473 + Height = 56 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + Visible = False + object Label14: TLabel + Left = 8 + Top = 8 + Width = 114 + Height = 13 + Caption = 'Stored Procedure Name' + end + object cbStoredProcName: TComboBox + Left = 8 + Top = 24 + Width = 321 + Height = 21 + Anchors = [akLeft, akTop, akRight] + DropDownCount = 16 + ItemHeight = 13 + TabOrder = 0 + Items.Strings = ( + '') + OnChange = cbStoredProcNameChange + OnDropDown = cbStoredProcNameDropDown + end + object btGenerate: TButton + Left = 344 + Top = 22 + Width = 121 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Generate' + Enabled = False + TabOrder = 1 + OnClick = btGenerateClick + end + end + object pnSQLSP: TPanel + Left = 0 + Top = 98 + Width = 473 + Height = 48 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + Visible = False + object Label2: TLabel + Left = 5 + Top = 20 + Width = 84 + Height = 13 + Caption = 'StoredProc Name' + end + object cbStoredProcNameSP: TComboBox + Left = 97 + Top = 16 + Width = 376 + Height = 21 + Anchors = [akLeft, akTop, akRight] + DropDownCount = 16 + ItemHeight = 13 + TabOrder = 0 + OnDropDown = cbStoredProcNameDropDown + OnExit = cbStoredProcNameSPExit + end + end +end \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Design/DASQLEditor.dfm b/internal/4.10.0.10/1/Source/Design/DASQLEditor.dfm new file mode 100644 index 0000000..a40502c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASQLEditor.dfm @@ -0,0 +1,40 @@ +inherited DASQLEditorForm: TDASQLEditorForm + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + inherited btOk: TBitBtn + TabOrder = 1 + end + inherited btCancel: TBitBtn + TabOrder = 2 + end + object btExecute: TButton + Left = 8 + Top = 8 + Width = 80 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Execute' + TabOrder = 0 + OnClick = btExecuteClick + end + end + inherited PageControl: TPageControl + ActivePage = shSQL + object shSQL: TTabSheet + Caption = 'S&QL' + end + object shParameters: TTabSheet + Caption = '&Parameters' + ImageIndex = 1 + end + object shMacros: TTabSheet + Caption = '&Macros' + ImageIndex = 2 + end + object shGeneratorSPC: TTabSheet + Caption = 'S&tored Proc Call Generator' + ImageIndex = 3 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DASQLEditor.pas b/internal/4.10.0.10/1/Source/Design/DASQLEditor.pas new file mode 100644 index 0000000..ef3a54c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASQLEditor.pas @@ -0,0 +1,215 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// SQL Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DASQLEditor; +{$ENDIF} +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + Types, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QExtCtrls, QComCtrls, QButtons, +{$ENDIF} +{$IFDEF DBTOOLS} + DBToolsClient, +{$ENDIF} + SysUtils, DB, Classes, + DBAccess, MemUtils, + CREditor, CRTabEditor, CRFrame, DASQLFrame, DAParamsFrame, DAMacrosFrame, DASPCallFrame; + +type + TDASQLEditorForm = class(TCRTabEditorForm) + shSQL: TTabSheet; + shParameters: TTabSheet; + shMacros: TTabSheet; + shGeneratorSPC: TTabSheet; + btExecute: TButton; + procedure btExecuteClick(Sender: TObject); + protected + FSQLFrame: TDASQLFrame; + FParamsFrame: TDAParamsFrame; + FMacrosFrame: TDAMacrosFrame; + FSPCallFrame: TDASPCallFrame; + + FLocalComponent, FComponent: TComponent; + FOldAfterExecute: TAfterExecuteEvent; + + procedure AfterExecute(Sender: TObject; Result: boolean); + + procedure DoInit; override; + procedure DoActivate; override; + procedure DoFinish; override; + procedure DoSave; override; + + procedure DoError(E: Exception); virtual; + + function GetSQL: TCustomDASQL; + procedure SetSQL(Value: TCustomDASQL); + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + function GetLocalComponent: TComponent; override; + + function GetFrameByInitProp: TCRFrame; override; + + property SQL: TCustomDASQL read GetSQL write SetSQL; + + public + property SQLFrame: TDASQLFrame read FSQLFrame; + property ParamsFrame: TDAParamsFrame read FParamsFrame; + property MacrosFrame: TDAMacrosFrame read FMacrosFrame; + + end; + +implementation + +uses + DADesignUtils; + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DASQLEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TDASQLEditorForm.DoInit; +begin + inherited; + + try + FLocalComponent := TComponentClass(FComponent.ClassType).Create(nil); + TDBAccessUtils.SetDesigning(FLocalComponent, csDesigning in FComponent.ComponentState); + FLocalComponent.Assign(FComponent); + FDADesignUtilsClass.SetDesignCreate(FLocalComponent, True); + finally + + Assert(FSQLFrame <> nil); + Assert(FParamsFrame <> nil); + Assert(FMacrosFrame <> nil); + Assert(FSPCallFrame <> nil); + FSPCallFrame.Mode := spSQL; + + Modified := False; + end; +end; + +procedure TDASQLEditorForm.DoActivate; +var + Frame: TCRFrame; +begin + inherited; + + Frame := GetFrameByInitProp; + if Frame <> nil then begin + PageControl.ActivePage := Frame.Page; + //Frame.SetFocus; // on Kylix control can be invisible in the form OnShow event + Frame.Activate; + end; + + if PageControl.ActivePage = FSQLFrame.Page then + ActiveControl := FSQLFrame.ActiveControl; +end; + +procedure TDASQLEditorForm.DoFinish; +begin + FLocalComponent.Free; + FLocalComponent := nil; + inherited; +end; + +procedure TDASQLEditorForm.AfterExecute(Sender:TObject; Result:boolean); +begin + btExecute.Enabled := True; + FDADesignUtilsClass.SetAfterExecute(FLocalComponent, FOldAfterExecute); +end; + +procedure TDASQLEditorForm.DoSave; +begin + inherited; + FComponent.Assign(FLocalComponent); +end; + +procedure TDASQLEditorForm.DoError(E: Exception); +begin + PageControl.ActivePage := FSQLFrame.Page; +{$IFDEF DBTOOLS} + if DBTools.HasDACSqlEditorFrame(FSQLFrame.meSQL) then + ActiveControl := DBTools.GetDACSqlEditorFrame(FSQLFrame.meSQL) + else +{$ENDIF} + ActiveControl := FSQLFrame.meSQL; +end; + +procedure TDASQLEditorForm.btExecuteClick(Sender: TObject); +begin + SaveControlData; + CheckConnection(FLocalComponent); + FOldAfterExecute := FDADesignUtilsClass.GetAfterExecute(FLocalComponent); + FDADesignUtilsClass.SetAfterExecute(FLocalComponent, AfterExecute); + btExecute.Enabled := False; + try + FDADesignUtilsClass.Execute(FLocalComponent); + FParamsFrame.SelectItem; + except + on E: Exception do begin + DoError(E); + AfterExecute(FLocalComponent, False); + raise; + end; + end; +end; + +function TDASQLEditorForm.GetSQL: TCustomDASQL; +begin + Result := FComponent as TCustomDASQL; +end; + +procedure TDASQLEditorForm.SetSQL(Value: TCustomDASQL); +begin + FComponent := Value; +end; + +function TDASQLEditorForm.GetComponent: TComponent; +begin + Result := SQL; +end; + +procedure TDASQLEditorForm.SetComponent(Value: TComponent); +begin + SQL := Value as TCustomDASQL; +end; + +function TDASQLEditorForm.GetLocalComponent: TComponent; +begin + Result := FLocalComponent; +end; + +function TDASQLEditorForm.GetFrameByInitProp: TCRFrame; +begin + if InitialProperty = 'SQL' then + Result := FSQLFrame + else + if InitialProperty = 'Params' then + Result := FParamsFrame + else + if InitialProperty = 'Macros' then + Result := FMacrosFrame + else + Result := inherited GetFrameByInitProp; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DASQLEditor.xfm b/internal/4.10.0.10/1/Source/Design/DASQLEditor.xfm new file mode 100644 index 0000000..a64cf38 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASQLEditor.xfm @@ -0,0 +1,40 @@ +inherited DASQLEditorForm: TDASQLEditorForm + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + inherited btOk: TBitBtn + TabOrder = 1 + end + inherited btCancel: TBitBtn + TabOrder = 2 + end + object btExecute: TButton + Left = 8 + Top = 8 + Width = 80 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Execute' + TabOrder = 0 + OnClick = btExecuteClick + end + end + inherited PageControl: TPageControl + ActivePage = shSQL + object shSQL: TTabSheet + Caption = 'S&QL' + end + object shParameters: TTabSheet + Caption = '&Parameters' + ImageIndex = 1 + end + object shMacros: TTabSheet + Caption = '&Macros' + ImageIndex = 2 + end + object shGeneratorSPC: TTabSheet + Caption = 'S&tored Proc Call Generator' + ImageIndex = 3 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DASQLFrame.dfm b/internal/4.10.0.10/1/Source/Design/DASQLFrame.dfm new file mode 100644 index 0000000..ee27db2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASQLFrame.dfm @@ -0,0 +1,31 @@ +inherited DASQLFrame: TDASQLFrame + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 481 + Height = 229 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + object meSQL: TMemo + Left = 8 + Top = 8 + Width = 465 + Height = 213 + Anchors = [akLeft, akTop, akRight, akBottom] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Courier New' + Font.Pitch = fpVariable + Font.Style = [] + Lines.Strings = ( + '') + ParentFont = False + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + OnExit = meSQLExit + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DASQLFrame.pas b/internal/4.10.0.10/1/Source/Design/DASQLFrame.pas new file mode 100644 index 0000000..5ea135f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASQLFrame.pas @@ -0,0 +1,149 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SQL Editor Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DASQLFrame; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, +{$ENDIF} +{$IFDEF LINUX} + QForms, QControls, QExtCtrls, QStdCtrls, +{$ENDIF} +{$IFDEF DBTOOLS} + DBToolsClient, +{$ENDIF} + Classes, SysUtils, + CRFrame, CRTabEditor; + +type + TDASQLFrame = class(TCRFrame) + meSQL: TMemo; + Panel1: TPanel; + procedure meSQLExit(Sender: TObject); + + protected + function GetSQLText: string; + procedure SetSQLText(const Value: string); + + procedure LoadMemo; virtual; + procedure SaveMemo; virtual; + procedure DoActivate; override; + function GetLocalComponentSQL: TStrings; virtual; + procedure SetLocalComponentSQL(Value: TStrings); virtual; + + property SQLText: string read GetSQLText write SetSQLText; + property LocalComponentSQL: TStrings read GetLocalComponentSQL write SetLocalComponentSQL; + public + {$IFDEF USE_SYNEDIT} + constructor Create(Owner: TComponent); override; + {$ENDIF} + + function ActiveControl: TWinControl; override; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DASQLFrame.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses + CREditor; + +{$IFDEF USE_SYNEDIT} +constructor TDASQLFrame.Create(Owner: TComponent); +var + WinControl: TWinControl; +begin + inherited; + +{$IFDEF DBTOOLS} + if TCREditorForm(Owner).DADesignUtilsClass.DBToolsAvailable then + Exit; +{$ENDIF} + WinControl := meSQL; + Assert(Owner is TCREditorForm); + TCREditorForm(Owner).ReplaceMemo(WinControl, True); + meSQL := TMemo(WinControl); +end; +{$ENDIF} + +function TDASQLFrame.GetSQLText: string; +begin + Result := GetMemoText(meSQL); +end; + +procedure TDASQLFrame.SetSQLText(const Value: string); +begin + if Trim(SQLText) <> Trim(Value) then + SetMemoText(meSQL, Value); +end; + +function TDASQLFrame.GetLocalComponentSQL: TStrings; +begin + Assert(Editor <> nil); + Result := Editor.DADesignUtilsClass.GetSQL(Editor.LocalComponent); +end; + +procedure TDASQLFrame.SetLocalComponentSQL(Value: TStrings); +begin + Assert(Editor <> nil); + Editor.DADesignUtilsClass.SetSQL(Editor.LocalComponent, Value); +end; + +procedure TDASQLFrame.meSQLExit(Sender: TObject); +begin + if TrimRight(LocalComponentSQL.Text) <> TrimRight(SQLText) then begin + SaveMemo; + Modified := True; + end; +end; + +function TDASQLFrame.ActiveControl: TWinControl; +begin +{$IFDEF DBTOOLS} + if DBTools.HasDACSqlEditorFrame(meSQL) then + Result := DBTools.GetDACSqlEditorFrame(meSQL) + else +{$ENDIF} + Result := meSQL; +end; + +procedure TDASQLFrame.LoadMemo; +begin + SQLText := LocalComponentSQL.Text; +end; + +procedure TDASQLFrame.SaveMemo; +begin + LocalComponentSQL.Text := Trim(SQLText); +end; + +procedure TDASQLFrame.DoActivate; +begin +{$IFDEF DBTOOLS} + DBTools.ReplaceMemo(meSQL, Editor.DADesignUtilsClass, Editor.Component); +{$ENDIF} + LoadMemo; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DASQLFrame.xfm b/internal/4.10.0.10/1/Source/Design/DASQLFrame.xfm new file mode 100644 index 0000000..3c434eb --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASQLFrame.xfm @@ -0,0 +1,31 @@ +inherited DASQLFrame: TDASQLFrame + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 481 + Height = 229 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + object meSQL: TMemo + Left = 8 + Top = 8 + Width = 465 + Height = 213 + Anchors = [akLeft, akTop, akRight, akBottom] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Courier New' + Font.Pitch = fpVariable + Font.Style = [] + Lines.Strings = ( + '') + ParentFont = False + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + OnExit = meSQLExit + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.dfm b/internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.dfm new file mode 100644 index 0000000..4d66b76 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.dfm @@ -0,0 +1,137 @@ +inherited DASQLGeneratorFrame: TDASQLGeneratorFrame + Height = 245 + object pnSQLGenerator: TPanel + Left = 8 + Top = 6 + Width = 465 + Height = 229 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 0 + OnResize = pnSQLGeneratorResize + object lbTableName: TLabel + Left = 13 + Top = 13 + Width = 61 + Height = 13 + Caption = 'Table Name:' + end + object lbKeyFieldsLabel: TLabel + Left = 182 + Top = 12 + Width = 51 + Height = 13 + Caption = 'Key Fields:' + end + object lbUpdateFieldsLabel: TLabel + Left = 321 + Top = 11 + Width = 68 + Height = 13 + Anchors = [akTop, akRight] + Caption = 'Update Fields:' + end + object cbTables: TComboBox + Left = 13 + Top = 29 + Width = 156 + Height = 21 + ItemHeight = 13 + TabOrder = 0 + OnChange = cbTablesChange + OnDropDown = cbTablesDropDown + end + object btGenerate: TButton + Left = 13 + Top = 82 + Width = 155 + Height = 22 + Caption = 'Generate SQL' + TabOrder = 2 + OnClick = btGenerateClick + end + object lbKeyFields: TListBox + Left = 180 + Top = 28 + Width = 133 + Height = 188 + Anchors = [akLeft, akTop, akBottom] + ItemHeight = 13 + MultiSelect = True + TabOrder = 8 + OnClick = lbUpdateFieldsClick + end + object lbUpdateFields: TListBox + Left = 321 + Top = 28 + Width = 133 + Height = 188 + Anchors = [akTop, akRight, akBottom] + ItemHeight = 13 + MultiSelect = True + TabOrder = 9 + OnClick = lbUpdateFieldsClick + end + object btGetFields: TButton + Left = 13 + Top = 56 + Width = 155 + Height = 22 + Caption = 'Get Fields' + Enabled = False + TabOrder = 1 + OnClick = btGetFieldsClick + end + object cbInsert: TCheckBox + Left = 15 + Top = 109 + Width = 146 + Height = 17 + Caption = 'Insert' + Checked = True + State = cbChecked + TabOrder = 3 + OnClick = cbIUDRClick + end + object cbUpdate: TCheckBox + Left = 15 + Top = 125 + Width = 146 + Height = 17 + Caption = 'Update' + Checked = True + State = cbChecked + TabOrder = 4 + OnClick = cbIUDRClick + end + object cbDelete: TCheckBox + Left = 15 + Top = 141 + Width = 146 + Height = 17 + Caption = 'Delete' + Checked = True + State = cbChecked + TabOrder = 5 + OnClick = cbIUDRClick + end + object cbRefresh: TCheckBox + Left = 15 + Top = 157 + Width = 146 + Height = 17 + Caption = 'Refresh' + Checked = True + State = cbChecked + TabOrder = 6 + OnClick = cbIUDRClick + end + object cbQuoteFields: TCheckBox + Left = 15 + Top = 173 + Width = 146 + Height = 17 + Caption = 'Quote names' + TabOrder = 7 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.pas b/internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.pas new file mode 100644 index 0000000..f8817d1 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.pas @@ -0,0 +1,628 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// SQLGenerator Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DASQLGeneratorFrame; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + QStdCtrls, QExtCtrls, QButtons, QControls, +{$ENDIF} + Classes, SysUtils, + DBAccess, CRAccess, + CRFrame, CRTabEditor; + +type + TDASQLGeneratorFrame = class(TCRFrame) + pnSQLGenerator: TPanel; + lbTableName: TLabel; + lbKeyFieldsLabel: TLabel; + lbUpdateFieldsLabel: TLabel; + cbTables: TComboBox; + btGenerate: TButton; + lbKeyFields: TListBox; + lbUpdateFields: TListBox; + btGetFields: TButton; + cbInsert: TCheckBox; + cbUpdate: TCheckBox; + cbDelete: TCheckBox; + cbRefresh: TCheckBox; + cbQuoteFields: TCheckBox; + procedure pnSQLGeneratorResize(Sender: TObject); + procedure btGetFieldsClick(Sender: TObject); + procedure cbTablesChange(Sender: TObject); + procedure cbIUDRClick(Sender: TObject); + procedure btGenerateClick(Sender: TObject); + procedure lbUpdateFieldsClick(Sender: TObject); + procedure cbTablesDropDown(Sender: TObject); + + protected + FLocalDataSet: TCustomDADataSet; + FOnChange: TNotifyEvent; + FLockUpdateControlsState: boolean; + FLastGeneratedSQL, + FLastOriginSQL, + FOldSQL, + FOldFilterSQL: string; + FOldUpdatingTable: string; + Fcb: array[TStatementType] of TCheckBox; + + FPromptlyServerRead, + FParseTableNames: boolean; + FActivated: boolean; + + procedure GenerateSelectFromAllFields; virtual; + procedure SetFilterSQL(Value: string; Open: boolean = False); + function OpenDataSet(RaiseException: boolean = False): boolean; + procedure InitTables(DeleteBadTableNames: boolean = False); + procedure ClearFields; + procedure GetFields(Forced: boolean = False); + procedure UpdateControlsState; virtual; + + function GetOriginLocalDataSet: TCustomDADataSet; + function GetLocalDataSet: TCustomDADataSet; + + function GetTablesInfo: TCRTablesInfo; virtual; + function SelectedTableName: string; virtual; + function NormSelectedTableName: string; virtual; + function UnqSelectedTableName: string; + + procedure SetControlEnabled(Control: TControl; Value: boolean); + function cbChecked(StatementType: TStatementType): boolean; + + property LocalDataSet: TCustomDADataSet read GetLocalDataSet; + property OriginLocalDataSet: TCustomDADataSet read GetOriginLocalDataSet; + property TablesInfo: TCRTablesInfo read GetTablesInfo; + + procedure DoActivate; override; + procedure DoFinish; override; + + function GenerateSQLforUpdTable(TableInfo: TCRTableInfo; + const KeyAndDataFields: TKeyAndDataFields; + const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean): string; virtual; + public + constructor Create(AOwner: TComponent); override; + + function ActiveControl: TWinControl; override; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DASQLGeneratorFrame.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses + DB, DAQueryEditor, DAUpdateSQLEditor, DAUpdateSQLFrame, MemData; + +constructor TDASQLGeneratorFrame.Create(AOwner: TComponent); +var + st: TStatementType; +begin + inherited; + for st := Low(TStatementType) to High(TStatementType) do + Fcb[st] := nil; + Fcb[stInsert] := cbInsert; + Fcb[stUpdate] := cbUpdate; + Fcb[stDelete] := cbDelete; + Fcb[stRefresh] := cbRefresh; + FPromptlyServerRead := True; + FParseTableNames := False; + FActivated := False; +end; + +procedure TDASQLGeneratorFrame.SetControlEnabled(Control: TControl; Value: boolean); +begin +{$IFNDEF LINUX} + if not Value and (Editor.ActiveControl = Control) then + Editor.ActiveControl := Control.Parent; +{$ENDIF} + + Control.Enabled := Value; +end; + +function TDASQLGeneratorFrame.cbChecked(StatementType: TStatementType): boolean; +begin + Result := (Fcb[StatementType] <> nil) and Fcb[StatementType].Enabled + and Fcb[StatementType].Checked and Fcb[StatementType].Visible; +end; + +function TDASQLGeneratorFrame.GetOriginLocalDataSet: TCustomDADataSet; +begin + Result := nil; + if FEditor is TDAQueryEditorForm then + Result := TDAQueryEditorForm(FEditor).LocalComponent as TCustomDADataSet + else + if FEditor is TDAUpdateSQLEditorForm then + Result := TDAUpdateSQLEditorForm(FEditor).LocalDataSet + else + Assert(False); +end; + +function TDASQLGeneratorFrame.GetLocalDataSet: TCustomDADataSet; +begin + if FLocalDataSet = nil then begin + FLocalDataSet := TComponentClass(OriginLocalDataSet.ClassType).Create(nil) as TCustomDADataSet; + FLocalDataSet.Assign(OriginLocalDataSet); + TDBAccessUtils.SetDesigning(FLocalDataSet, csDesigning in OriginLocalDataSet.ComponentState); + end; + Result := FLocalDataSet; +end; + +function TDASQLGeneratorFrame.GetTablesInfo: TCRTablesInfo; +begin + Result := TDBAccessUtils.GetTablesInfo(LocalDataSet); +end; + +function TDASQLGeneratorFrame.SelectedTableName: string; +begin + Result := TablesInfo.TableInfoClass.NormalizeName(Trim(cbTables.Text), LocalDataSet.Options.QuoteNames); +end; + +function TDASQLGeneratorFrame.NormSelectedTableName: string; +begin + Result := TablesInfo.TableInfoClass.NormalizeName(Trim(cbTables.Text)); // Without QuoteName! +end; + +function TDASQLGeneratorFrame.UnqSelectedTableName: string; +begin + Result := TablesInfo.TableInfoClass.UnQuote(Trim(cbTables.Text)); +end; + +function TDASQLGeneratorFrame.ActiveControl: TWinControl; +begin + Result := cbTables; +end; + +procedure TDASQLGeneratorFrame.GenerateSelectFromAllFields; +begin + LocalDataSet.SQL.Text := 'SELECT * FROM ' + SelectedTableName; +end; + +procedure TDASQLGeneratorFrame.SetFilterSQL(Value: string; Open: boolean = False); +var + OldDebug: boolean; +begin + OldDebug := LocalDataSet.Debug; + try + LocalDataSet.Debug := False; + LocalDataSet.FilterSQL := Value; + if Open then + LocalDataSet.Open; + finally + LocalDataSet.Debug := OldDebug; + end; +end; + +function TDASQLGeneratorFrame.OpenDataSet(RaiseException: boolean = False): boolean; +begin + Result := True; + try + Editor.CheckConnection(LocalDataSet); + SetFilterSQL('1=0', True); + except + Result := False; + if RaiseException then + raise; + end; +end; + +procedure TDASQLGeneratorFrame.InitTables(DeleteBadTableNames: boolean = False); +var + i, n, ItemIndex: integer; + s: string; +begin + cbTables.Items.BeginUpdate; + try + {$IFDEF LINUX} + if (cbTables.Items.Count = 1) and (cbTables.Items[0] = '') then + cbTables.Items.Clear; + {$ENDIF} + if DeleteBadTableNames then begin + i := 0; + while i < cbTables.Items.Count do + if cbTables.Items.Objects[i] = nil then + cbTables.Items.Delete(i) + else + Inc(i); + end; + + SetFilterSQL('1=0'); + ItemIndex := -1; + if FParseTableNames or OpenDataSet then + for i := 0 to TablesInfo.Count - 1 do begin + s := Trim(TablesInfo[i].TableName); + n := cbTables.Items.IndexOf(s); + if n = -1 then + n := cbTables.Items.Add(s); + if i = 0 then + ItemIndex := n; + end; + + if (Trim(cbTables.Text) = '') and (FOldUpdatingTable <> '') then + cbTables.Text := FOldUpdatingTable + else + if (ItemIndex <> -1) and (Trim(OriginLocalDataSet.SQL.Text) <> FLastOriginSQL) + and (cbTables.Items[ItemIndex] <> cbTables.Text) then begin + FLastOriginSQL := Trim(OriginLocalDataSet.SQL.Text); + ClearFields; + cbTables.ItemIndex := ItemIndex; + end; + finally + {$IFDEF LINUX} + if cbTables.Items.Count = 0 then + cbTables.Items.Add(''); + {$ENDIF} + cbTables.Items.EndUpdate; + end; +end; + +procedure TDASQLGeneratorFrame.ClearFields; +begin + lbKeyFields.Items.Clear; + lbUpdateFields.Items.Clear; +end; + +procedure TDASQLGeneratorFrame.GetFields(Forced: boolean = False); +var + KeyAndDataFields: TKeyAndDataFields; + OriginKeyList, + OriginDataList: TStringList; + + function EmptyLists: boolean; + begin + Result := (lbKeyFields.Items.Count = 0) and (lbUpdateFields.Items.Count = 0); + end; + + procedure GetFieldNames; + var + j: integer; + Empty: boolean; + + procedure AddFieldName(LB: TListBox; Name: string; const FieldList: TStringList; Selected: boolean); + begin + if LB.Items.IndexOf(Name) < 0 then begin + if Selected and (FieldList.Count <> 0) then + Selected := FieldList.IndexOf(Name) >= 0; + LB.Selected[LB.Items.Add(Name)] := Selected; + end; + end; + + begin + try + Empty := EmptyLists; + for j := 0 to High(KeyAndDataFields.KeyFieldDescs) do begin + AddFieldName(lbKeyFields, KeyAndDataFields.KeyFieldDescs[j].ActualName, OriginKeyList, Empty); + end; + for j := 0 to High(KeyAndDataFields.DataFieldDescs) do begin + AddFieldName(lbKeyFields, KeyAndDataFields.DataFieldDescs[j].ActualName, OriginKeyList, False); + AddFieldName(lbUpdateFields, KeyAndDataFields.DataFieldDescs[j].ActualName, OriginDataList, Empty); + end; + + except + ClearFields; + raise; + end; + end; + + procedure InitFields(OriginFields: boolean); + var + i: integer; + + begin + if OriginFields then begin + SetLength(KeyAndDataFields.KeyFieldDescs, 0); + SetLength(KeyAndDataFields.DataFieldDescs, 0); + end; + if not OpenDataSet(not OriginFields) or (OriginFields and not EmptyLists) then + Exit; + + if TablesInfo.IndexByName(SelectedTableName) = -1 then begin + ClearFields; + Exit; + end; + + TDBAccessUtils.SetUpdatingTable(LocalDataSet, SelectedTableName); + TDBAccessUtils.GetKeyAndDataFields(LocalDataSet, KeyAndDataFields, False); + + if OriginFields then begin + for i := 0 to High(KeyAndDataFields.KeyFieldDescs) do + OriginKeyList.Add(KeyAndDataFields.KeyFieldDescs[i].ActualName); + for i := 0 to High(KeyAndDataFields.DataFieldDescs) do + OriginDataList.Add(KeyAndDataFields.DataFieldDescs[i].ActualName); + end + else + if not Forced then + try + GetFieldNames; + finally + UpdateControlsState; + end; + end; + +var + i: integer; + +begin + if not (EmptyLists or Forced) or (UnqSelectedTableName = '') then + Exit; + + if (TDBAccessUtils.UsedConnection(LocalDataSet) <> nil) then + Editor.CheckConnection(LocalDataSet); + + try + OriginKeyList := TStringList.Create; + OriginDataList := TStringList.Create; + if FOldSQL <> LocalDataSet.SQL.Text then + LocalDataSet.SQL.Text := FOldSQL; + InitFields(True); + if EmptyLists then begin + GenerateSelectFromAllFields; + FLastGeneratedSQL := LocalDataSet.SQL.Text; + end + else + LocalDataSet.SQL.Text := FLastGeneratedSQL; + + InitFields(False); + i := cbTables.Items.IndexOf(SelectedTableName); + if i < 0 then + i := cbTables.Items.Add(SelectedTableName); + cbTables.Items.Objects[i] := Self; // Mark good table + finally + OriginKeyList.Free; + OriginDataList.Free; + end; +end; + +procedure TDASQLGeneratorFrame.UpdateControlsState; +var + TableName: string; + sts: TStatementTypes; + st: TStatementType; + IsEnabled: boolean; +begin + if FLockUpdateControlsState then + Exit; + + Assert(LocalDataSet <> nil); + + sts := TDBAccessUtils.GetUpdateSQLStatementTypes(LocalDataSet); + + TableName := SelectedTableName; + IsEnabled := TableName <> ''; + SetControlEnabled(btGetFields, IsEnabled and (lbUpdateFields.Items.Count + lbUpdateFields.Items.Count = 0)); + + SetControlEnabled(cbInsert, IsEnabled and (lbUpdateFields.SelCount > 0)); + SetControlEnabled(cbUpdate, IsEnabled and (lbKeyFields.SelCount > 0) and (lbUpdateFields.SelCount > 0)); + SetControlEnabled(cbDelete, IsEnabled and (lbKeyFields.SelCount > 0)); + SetControlEnabled(cbRefresh, IsEnabled and (lbKeyFields.SelCount > 0) and (lbUpdateFields.SelCount > 0) {and TableNameSelectedFromList}); + + if IsEnabled then + for st := Low(TStatementType) to High(TStatementType) do + if st in sts then begin + IsEnabled := cbChecked(st); + if IsEnabled then + Break; + end; + SetControlEnabled(btGenerate, IsEnabled); + SetControlEnabled(cbQuoteFields, IsEnabled); +end; + +procedure TDASQLGeneratorFrame.pnSQLGeneratorResize(Sender: TObject); +begin + lbKeyFields.Width := (lbUpdateFields.Left + lbUpdateFields.Width - lbKeyFields.Left - 8) div 2; + lbUpdateFields.Left := lbUpdateFields.Left - (lbKeyFields.Width - lbUpdateFields.Width); + lbUpdateFields.Width := lbKeyFields.Width; + lbUpdateFieldsLabel.Left := lbUpdateFields.Left; +end; + +procedure TDASQLGeneratorFrame.btGetFieldsClick(Sender: TObject); +begin + GetFields; +end; + +procedure TDASQLGeneratorFrame.cbTablesChange(Sender: TObject); +begin + ClearFields; + if FPromptlyServerRead and (cbTables.Items.IndexOf(SelectedTableName) <> -1) then + GetFields; + UpdateControlsState; +end; + +procedure TDASQLGeneratorFrame.DoActivate; +var + OldSQL: string; +begin + FOldUpdatingTable := TDBAccessUtils.GetUpdatingTable(LocalDataSet); + OldSQL := LocalDataSet.SQL.Text; + FOldFilterSQL := LocalDataSet.FilterSQL; + try + inherited; + if OriginLocalDataSet.SQL.Text <> LocalDataSet.SQL.Text then + LocalDataSet.SQL := OriginLocalDataSet.SQL; + + if not FActivated then + cbQuoteFields.Checked := LocalDataSet.Options.QuoteNames; + + if ((TDBAccessUtils.UsedConnection(LocalDataSet) <> nil) and + TDBAccessUtils.UsedConnection(LocalDataSet).Connected and + (FOldSQL <> LocalDataSet.SQL.Text) and + FPromptlyServerRead) or FParseTableNames then + InitTables(FParseTableNames); + + FActivated := True; + finally + FOldSQL := OldSQL; // always call; see DoFinish for details + UpdateControlsState; + end; + if FPromptlyServerRead then + GetFields; +end; + +procedure TDASQLGeneratorFrame.DoFinish; +begin + inherited; + + LocalDataSet.Close; + if FOldSQL <> LocalDataSet.SQL.Text then + LocalDataSet.SQL.Text := FOldSQL; + if FOldFilterSQL <> LocalDataSet.FilterSQL then + SetFilterSQL(FOldFilterSQL); + + if FOldUpdatingTable <> TDBAccessUtils.GetUpdatingTable(LocalDataSet) then + TDBAccessUtils.SetUpdatingTable(LocalDataSet, FOldUpdatingTable); + + FLocalDataSet.Free; + FLocalDataSet := nil; +end; + +procedure TDASQLGeneratorFrame.cbIUDRClick(Sender: TObject); +begin + inherited; + UpdateControlsState; +end; + +function TDASQLGeneratorFrame.GenerateSQLforUpdTable( + TableInfo: TCRTableInfo; const KeyAndDataFields: TKeyAndDataFields; + const StatementType: TStatementType; const ModifiedFieldsOnly: boolean): string; +begin + Result := TDBAccessUtils.SQLGenerator(LocalDataSet).GenerateSQLforUpdTable(TableInfo, KeyAndDataFields, StatementType, ModifiedFieldsOnly, nil); +end; + +procedure TDASQLGeneratorFrame.btGenerateClick(Sender: TObject); +var + i, j: integer; + KeyAndDataFields: TKeyAndDataFields; + + TableInfo: TCRTableInfo; + UpdateSQLFrame: TDAUpdateSQLFrame; + + OldSQL: string; + OldActive: boolean; + st: TStatementType; + sts: TStatementTypes; + stSQL: array[TStatementType] of string; + OldQuoteNames: boolean; + +begin + GetFields(True); + OldSQL := LocalDataSet.SQL.Text; + OldActive := LocalDataSet.Active; + OldQuoteNames := LocalDataSet.Options.QuoteNames; + try + if LocalDataSet.SQL.Text <> FLastGeneratedSQL then + LocalDataSet.SQL.Text := FLastGeneratedSQL; + OpenDataSet(True); + TableInfo := TablesInfo.TableInfoClass.Create(nil); + try + TableInfo.IsView := False; // Use to generate only specified fields + TableInfo.TableName := NormSelectedTableName; + TableInfo.TableNameFull := TableInfo.TableName; + TableInfo.TableAlias := ''; + + SetLength(KeyAndDataFields.KeyFieldDescs, lbKeyFields.SelCount); + j := 0; + for i := 0 to lbKeyFields.Items.Count - 1 do + if lbKeyFields.Selected[i] then begin + KeyAndDataFields.KeyFieldDescs[j] := LocalDataSet.GetFieldDesc(lbKeyFields.Items[i]) as TCRFieldDesc; + Inc(j); + end; + + SetLength(KeyAndDataFields.DataFieldDescs, lbUpdateFields.SelCount); + j := 0; + for i := 0 to lbUpdateFields.Items.Count - 1 do + if lbUpdateFields.Selected[i] then begin + KeyAndDataFields.DataFieldDescs[j] := LocalDataSet.GetFieldDesc(lbUpdateFields.Items[i]) as TCRFieldDesc; + Inc(j); + end; + + LocalDataSet.Options.QuoteNames := cbQuoteFields.Checked; + + sts := Editor.DADesignUtilsClass.GetStatementTypes; + try + for st := Low(TStatementType) to High(TStatementType) do + if (st in sts) and cbChecked(st) then begin + stSQL[st] := GenerateSQLforUpdTable(TableInfo, KeyAndDataFields, st, False); + Modified := True; + end; + + // after setting SQL Fields[] may be destroyed + SetLength(KeyAndDataFields.KeyFieldDescs, 0); // Just in case + SetLength(KeyAndDataFields.DataFieldDescs, 0); + for st := Low(TStatementType) to High(TStatementType) do + if (st in sts) and cbChecked(st) then + Editor.DADesignUtilsClass.SetSQL(Editor.LocalComponent, stSQL[st], st); + + finally + UpdateSQLFrame := nil; + if FEditor is TDAUpdateSQLEditorForm then + UpdateSQLFrame := TDAUpdateSQLEditorForm(FEditor).UpdateSQLFrame + else + if FEditor is TDAQueryEditorForm then + UpdateSQLFrame := TDAQueryEditorForm(FEditor).UpdateSQLFrame + else + Assert(False); + + for st := Low(TStatementType) to High(TStatementType) do + if (st in sts) and cbChecked(st) then begin + UpdateSQLFrame.SetStatementType(st); + Break; + end; + + if FEditor is TDAUpdateSQLEditorForm then + TDAUpdateSQLEditorForm(FEditor).ActivateFrame(UpdateSQLFrame) + else + TDAQueryEditorForm(FEditor).ActivateFrame(UpdateSQLFrame); + end; + finally + TableInfo.Free; + end; + finally + LocalDataSet.Options.QuoteNames := OldQuoteNames; + if not OldActive then + LocalDataSet.SQL.Text := OldSQL; + end; +end; + +procedure TDASQLGeneratorFrame.lbUpdateFieldsClick(Sender: TObject); +begin + UpdateControlsState; +end; + +procedure TDASQLGeneratorFrame.cbTablesDropDown(Sender: TObject); +begin + if FParseTableNames then + InitTables + else + if ((TDBAccessUtils.UsedConnection(LocalDataSet) <> nil) and + ((cbTables.Items.Count = 0) {$IFDEF LINUX}or (cbTables.Items.Count = 1) and + (cbTables.Items[0] = ''){$ENDIF})) then begin + InitTables; + cbTablesChange(nil); + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.xfm b/internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.xfm new file mode 100644 index 0000000..b99b99d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DASQLGeneratorFrame.xfm @@ -0,0 +1,140 @@ +inherited DASQLGeneratorFrame: TDASQLGeneratorFrame + Height = 245 + object pnSQLGenerator: TPanel + Left = 8 + Top = 6 + Width = 465 + Height = 229 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 0 + OnResize = pnSQLGeneratorResize + object lbTableName: TLabel + Left = 13 + Top = 13 + Width = 61 + Height = 13 + Caption = 'Table Name:' + end + object lbKeyFieldsLabel: TLabel + Left = 182 + Top = 12 + Width = 51 + Height = 13 + Caption = 'Key Fields:' + end + object lbUpdateFieldsLabel: TLabel + Left = 321 + Top = 11 + Width = 68 + Height = 13 + Anchors = [akTop, akRight] + Caption = 'Update Fields:' + end + object cbTables: TComboBox + Left = 13 + Top = 29 + Width = 156 + Height = 21 + ItemHeight = 13 + TabOrder = 0 + Items.Strings = ( + '') + OnChange = cbTablesChange + OnDropDown = cbTablesDropDown + end + object btGenerate: TButton + Left = 13 + Top = 82 + Width = 155 + Height = 22 + Caption = 'Generate SQL' + TabOrder = 2 + OnClick = btGenerateClick + end + object lbKeyFields: TListBox + Left = 180 + Top = 28 + Width = 133 + Height = 188 + Anchors = [akLeft, akTop, akBottom] + ItemHeight = 13 + MultiSelect = True + TabOrder = 8 + OnClick = lbUpdateFieldsClick + end + object lbUpdateFields: TListBox + Left = 321 + Top = 28 + Width = 133 + Height = 188 + Anchors = [akTop, akRight, akBottom] + ItemHeight = 13 + MultiSelect = True + TabOrder = 9 + OnClick = lbUpdateFieldsClick + end + object btGetFields: TButton + Left = 13 + Top = 56 + Width = 155 + Height = 22 + Caption = 'Get Fields' + Enabled = False + TabOrder = 1 + OnClick = btGetFieldsClick + end + object cbInsert: TCheckBox + Left = 15 + Top = 109 + Width = 146 + Height = 17 + Caption = 'Insert' + Checked = True + State = cbChecked + TabOrder = 3 + OnClick = cbIUDRClick + end + object cbUpdate: TCheckBox + Left = 15 + Top = 125 + Width = 146 + Height = 17 + Caption = 'Update' + Checked = True + State = cbChecked + TabOrder = 4 + OnClick = cbIUDRClick + end + object cbDelete: TCheckBox + Left = 15 + Top = 141 + Width = 146 + Height = 17 + Caption = 'Delete' + Checked = True + State = cbChecked + TabOrder = 5 + OnClick = cbIUDRClick + end + object cbRefresh: TCheckBox + Left = 15 + Top = 157 + Width = 146 + Height = 17 + Caption = 'Refresh' + Checked = True + State = cbChecked + TabOrder = 6 + OnClick = cbIUDRClick + end + object cbQuoteFields: TCheckBox + Left = 15 + Top = 173 + Width = 146 + Height = 17 + Caption = 'Quote names' + Enabled = False + TabOrder = 7 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAScriptEditor.dfm b/internal/4.10.0.10/1/Source/Design/DAScriptEditor.dfm new file mode 100644 index 0000000..9c10692 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAScriptEditor.dfm @@ -0,0 +1,61 @@ +inherited DAScriptEditorForm: TDAScriptEditorForm + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + inherited btOk: TBitBtn + TabOrder = 4 + end + inherited btCancel: TBitBtn + TabOrder = 5 + end + object btExecute: TButton + Left = 8 + Top = 8 + Width = 80 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Execute' + TabOrder = 0 + OnClick = btExecuteClick + end + object cbDebug: TCheckBox + Left = 269 + Top = 12 + Width = 62 + Height = 17 + Caption = '&Debug' + TabOrder = 3 + OnClick = cbDebugClick + end + object btOpen: TButton + Left = 94 + Top = 8 + Width = 80 + Height = 25 + Hint = 'Load from file' + Caption = '&Load...' + TabOrder = 1 + OnClick = btOpenClick + end + object btSave: TButton + Left = 180 + Top = 8 + Width = 80 + Height = 25 + Hint = 'Save to file' + Caption = '&Save...' + TabOrder = 2 + OnClick = btSaveClick + end + end + inherited PageControl: TPageControl + ActivePage = shSQL + object shSQL: TTabSheet + Caption = 'S&QL' + end + object shMacros: TTabSheet + Caption = '&Macros' + ImageIndex = 2 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAScriptEditor.pas b/internal/4.10.0.10/1/Source/Design/DAScriptEditor.pas new file mode 100644 index 0000000..d8b9d48 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAScriptEditor.pas @@ -0,0 +1,246 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Script Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DAScriptEditor; +{$ENDIF} +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + Types, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QExtCtrls, QComCtrls, QButtons, +{$ENDIF} + SysUtils, DB, Classes, + DBAccess, MemUtils, DAScript, + CREditor, CRTabEditor, CRFrame, DASQLFrame, DAMacrosFrame; + +type + TDAScriptEditorForm = class(TCRTabEditorForm) + shSQL: TTabSheet; + shMacros: TTabSheet; + btExecute: TButton; + cbDebug: TCheckBox; + btOpen: TButton; + btSave: TButton; + procedure btExecuteClick(Sender: TObject); + procedure cbDebugClick(Sender: TObject); + procedure btOpenClick(Sender: TObject); + procedure btSaveClick(Sender: TObject); + protected + FSQLFrame: TDASQLFrame; + FMacrosFrame: TDAMacrosFrame; + + FComponent: TComponent; + FLocalScript: TDAScript; + FOldAfterExecute: TAfterStatementExecuteEvent; + FOldDebug: boolean; + + procedure AfterExecute(Sender: TObject; SQL: string); + procedure OnError(Sender: TObject; E: Exception; SQL: string; var Action: TErrorAction); + + procedure DoInit; override; + procedure DoActivate; override; + procedure DoFinish; override; + procedure DoSave; override; + + function GetScript: TDAScript; + procedure SetScript(Value: TDAScript); + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + function GetLocalComponent: TComponent; override; + + function GetFrameByInitProp: TCRFrame; override; + + public + property Script: TDAScript read GetScript write SetScript; + + property SQLFrame: TDASQLFrame read FSQLFrame; + property MacrosFrame: TDAMacrosFrame read FMacrosFrame; + + end; + +implementation + +uses + DADesignUtils; + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DAScriptEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +const + SFileFilter = 'All SQL files|*.sql; *.qry|SQL files (*.sql)|*.sql|Query files (*.qry)|*.qry|All files (*.*)|*.*'; + +procedure TDAScriptEditorForm.DoInit; +begin + FSQLFrame := AddTab(TDASQLFrame, shSQL) as TDASQLFrame; + //FParamsFrame := AddTab(TMyParamsFrame, shParameters) as TDAParamsFrame; + FMacrosFrame := AddTab(TDAMacrosFrame, shMacros) as TDAMacrosFrame; + + inherited; + + FLocalScript := TComponentClass(FComponent.ClassType).Create(nil) as TDAScript; + FLocalScript.Assign(FComponent); + FDADesignUtilsClass.SetDesignCreate(FLocalScript, True); + FLocalScript.OnError := OnError; + + FOldDebug := FLocalScript.Debug; + cbDebug.Checked := FOldDebug; + + Assert(FSQLFrame <> nil); + Assert(FMacrosFrame <> nil); + + Modified := False; +end; + +procedure TDAScriptEditorForm.DoActivate; +var + Frame: TCRFrame; +begin + inherited; + + Frame := GetFrameByInitProp; + if Frame <> nil then begin + PageControl.ActivePage := Frame.Page; + Frame.SetFocus; + Frame.Activate; + end; + + if PageControl.ActivePage = FSQLFrame.Page then + ActiveControl := FSQLFrame.ActiveControl; +end; + +procedure TDAScriptEditorForm.DoFinish; +begin + FLocalScript.Free; + FLocalScript := nil; + inherited; +end; + +procedure TDAScriptEditorForm.AfterExecute(Sender: TObject; SQL: string); +begin + btExecute.Enabled := True; + //FParamsFrame.InitParams; + + FLocalScript.AfterExecute := FOldAfterExecute; +end; + +procedure TDAScriptEditorForm.OnError(Sender: TObject; E: Exception; SQL: string; var Action: TErrorAction); +begin + if MessageDlg(E.Message, mtError, [mbAbort, mbIgnore], 0) <> mrIgnore then + Action := eaAbort + else + Action := eaContinue; +end; + +procedure TDAScriptEditorForm.DoSave; +begin + inherited; + FLocalScript.Debug := FOldDebug; + FComponent.Assign(FLocalScript); +end; + +procedure TDAScriptEditorForm.btExecuteClick(Sender: TObject); +begin + SaveControlData; + CheckConnection(FLocalScript); + FOldAfterExecute := FLocalScript.AfterExecute; + FLocalScript.AfterExecute := AfterExecute; + FLocalScript.Execute; +end; + +function TDAScriptEditorForm.GetScript: TDAScript; +begin + Result := FComponent as TDAScript; +end; + +procedure TDAScriptEditorForm.SetScript(Value: TDAScript); +begin + FComponent := Value; +end; + +function TDAScriptEditorForm.GetComponent: TComponent; +begin + Result := Script; +end; + +procedure TDAScriptEditorForm.SetComponent(Value: TComponent); +begin + Script := Value as TDAScript; +end; + +function TDAScriptEditorForm.GetLocalComponent: TComponent; +begin + Result := FLocalScript; +end; + +function TDAScriptEditorForm.GetFrameByInitProp: TCRFrame; +begin + if InitialProperty = 'SQL' then + Result := FSQLFrame + else +{ if InitialProperty = 'Params' then + Result := FParamsFrame + else} + if InitialProperty = 'Macros' then + Result := FMacrosFrame + else + Result := inherited GetFrameByInitProp; +end; + +procedure TDAScriptEditorForm.cbDebugClick(Sender: TObject); +begin + FLocalScript.Debug := cbDebug.Checked; +end; + +procedure TDAScriptEditorForm.btOpenClick(Sender: TObject); +begin + with TOpenDialog.Create(nil) do + try + Filter := SFileFilter; + if Execute then begin + TDAScript(LocalComponent).SQL.LoadFromFile(FileName); + if ActiveFrame = SQLFrame then + SQLFrame.ReActivate + else + ActivateFrame(SQLFrame); + Modified := True; + end; + finally + Free; + end; +end; + +procedure TDAScriptEditorForm.btSaveClick(Sender: TObject); +begin + SaveControlData; + with TSaveDialog.Create(nil) do + try + Options := Options + [ofOverwritePrompt]; + DefaultExt := 'sql'; + Filter := SFileFilter; + if Execute then + TDAScript(LocalComponent).SQL.SaveToFile(FileName); + finally + Free; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DAScriptEditor.xfm b/internal/4.10.0.10/1/Source/Design/DAScriptEditor.xfm new file mode 100644 index 0000000..a161f6e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAScriptEditor.xfm @@ -0,0 +1,61 @@ +inherited DAScriptEditorForm: TDAScriptEditorForm + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + inherited btOk: TBitBtn + TabOrder = 4 + end + inherited btCancel: TBitBtn + TabOrder = 5 + end + object btExecute: TButton + Left = 8 + Top = 8 + Width = 80 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Execute' + TabOrder = 0 + OnClick = btExecuteClick + end + object cbDebug: TCheckBox + Left = 269 + Top = 12 + Width = 62 + Height = 17 + Caption = '&Debug' + TabOrder = 3 + OnClick = cbDebugClick + end + object btOpen: TButton + Left = 94 + Top = 8 + Width = 80 + Height = 25 + Hint = 'Load from file' + Caption = '&Load...' + TabOrder = 1 + OnClick = btOpenClick + end + object btSave: TButton + Left = 180 + Top = 8 + Width = 80 + Height = 25 + Hint = 'Save to file' + Caption = '&Save...' + TabOrder = 2 + OnClick = btSaveClick + end + end + inherited PageControl: TPageControl + ActivePage = shSQL + object shSQL: TTabSheet + Caption = 'S&QL' + end + object shMacros: TTabSheet + Caption = '&Macros' + ImageIndex = 2 + end + end +end \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.dfm b/internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.dfm new file mode 100644 index 0000000..e938760 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.dfm @@ -0,0 +1,2 @@ +inherited DAStoredProcEditorForm: TDAStoredProcEditorForm +end diff --git a/internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.pas b/internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.pas new file mode 100644 index 0000000..f27d35a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.pas @@ -0,0 +1,79 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// StoredProc Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DAStoredProcEditor; +{$ENDIF} +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + Types, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QExtCtrls, QComCtrls, QButtons, +{$ENDIF} + SysUtils, DB, Classes, + DBAccess, MemUtils, + CREditor, CRTabEditor, DASQLFrame, DAParamsFrame, DAMacrosFrame, DASPCallFrame, + DASQLEditor, DAUpdateSQLFrame, DASQLGeneratorFrame, DAQueryEditor; + +type + TDAStoredProcEditorForm = class(TDAQueryEditorForm) + protected + procedure DoInit; override; + + function GetStoredProc: TCustomDADataSet; + procedure SetStoredProc(Value: TCustomDADataSet); + + property StoredProc: TCustomDADataSet read GetStoredProc write SetStoredProc; + + end; + +implementation + +uses + DADesignUtils; + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DAStoredProcEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TDAStoredProcEditorForm.DoInit; +begin + try + inherited; + finally + Assert(FSQLFrame is TDASPCallFrame); + TDASPCallFrame(FSQLFrame).Mode := spSQLSP; + FSPCallFrame.Mode := spQuerySP; + + TDASPCallFrame(FSQLFrame).SetSPName(FDADesignUtilsClass.GetStoredProcName(LocalComponent as TCustomDADataSet)); + end; +end; + +function TDAStoredProcEditorForm.GetStoredProc: TCustomDADataSet; +begin + Result := FComponent as TCustomDADataSet; +end; + +procedure TDAStoredProcEditorForm.SetStoredProc(Value: TCustomDADataSet); +begin + FComponent := Value; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.xfm b/internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.xfm new file mode 100644 index 0000000..56dbee4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAStoredProcEditor.xfm @@ -0,0 +1,2 @@ +inherited DAStoredProcEditorForm: TDAStoredProcEditorForm +end diff --git a/internal/4.10.0.10/1/Source/Design/DATableEditor.dfm b/internal/4.10.0.10/1/Source/Design/DATableEditor.dfm new file mode 100644 index 0000000..d64c184 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DATableEditor.dfm @@ -0,0 +1,114 @@ +inherited DATableEditorForm: TDATableEditorForm + Left = 294 + Top = 203 + Height = 340 + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + ActiveControl = cbTableName + BorderIcons = [biSystemMenu] + Constraints.MinHeight = 332 + Constraints.MinWidth = 512 + Font.Height = -11 + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 272 + TabOrder = 1 + inherited btOk: TBitBtn + TabOrder = 1 + end + inherited btCancel: TBitBtn + TabOrder = 2 + end + object btnDataEditor: TBitBtn + Left = 8 + Top = 8 + Width = 80 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = '&Data Editor...' + TabOrder = 0 + OnClick = btnDataEditorClick + end + end + object Panel1: TPanel + Left = 8 + Top = 8 + Width = 489 + Height = 257 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 0 + object Label2: TLabel + Left = 8 + Top = 20 + Width = 58 + Height = 13 + Caption = 'Table Name' + end + object Label4: TLabel + Left = 8 + Top = 44 + Width = 56 + Height = 13 + Caption = 'Order Fields' + end + object Label1: TLabel + Left = 8 + Top = 67 + Width = 43 + Height = 13 + Caption = 'FilterSQL' + end + object edFilter: TEdit + Left = 96 + Top = 64 + Width = 388 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + OnExit = edFilterExit + end + object meSQL: TMemo + Left = 5 + Top = 88 + Width = 479 + Height = 164 + Anchors = [akLeft, akTop, akRight, akBottom] + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Courier New' + Font.Pitch = fpVariable + Font.Style = [] + Lines.Strings = ( + '') + ParentFont = False + ReadOnly = True + ScrollBars = ssBoth + TabOrder = 3 + WordWrap = False + end + object cbTableName: TComboBox + Left = 96 + Top = 16 + Width = 388 + Height = 21 + Anchors = [akLeft, akTop, akRight] + DropDownCount = 16 + ItemHeight = 13 + TabOrder = 0 + OnDropDown = cbTableNameDropDown + OnExit = cbTableNameExit + end + object edOrderFields: TEdit + Left = 96 + Top = 40 + Width = 388 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + OnExit = edOrderFieldsExit + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DATableEditor.pas b/internal/4.10.0.10/1/Source/Design/DATableEditor.pas new file mode 100644 index 0000000..6fa03e7 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DATableEditor.pas @@ -0,0 +1,231 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// Table Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DATableEditor; +{$ENDIF} +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + Types, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QExtCtrls, QComCtrls, QButtons, +{$ENDIF} + SysUtils, DB, Classes, + DBAccess, MemUtils, CREditor; + +type + TDATableEditorForm = class(TCREditorForm) + Label2: TLabel; + Label4: TLabel; + Label1: TLabel; + edFilter: TEdit; + meSQL: TMemo; + cbTableName: TComboBox; + edOrderFields: TEdit; + Panel1: TPanel; + btnDataEditor: TBitBtn; + procedure cbTableNameDropDown(Sender: TObject); + procedure cbTableNameExit(Sender: TObject); + procedure edOrderFieldsExit(Sender: TObject); + procedure edFilterExit(Sender: TObject); + procedure btnDataEditorClick(Sender: TObject); + + protected + FListGot: boolean; + FLocalTable, FTable: TCustomDADataSet; + + procedure DoInit; override; + procedure DoFinish; override; + procedure DoSave; override; + + procedure InitSQL; + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + function GetLocalComponent: TComponent; override; + + procedure GetTableNames(Connection: TCustomDAConnection; Items: TStrings); virtual; + public + property Table: TCustomDADataSet read FTable write FTable; + + end; + +implementation + +uses + DADesignUtils, DADataEditor; + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DATableEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +procedure TDATableEditorForm.DoInit; +begin + inherited; + + FLocalTable := TComponentClass(Table.ClassType).Create(nil) as TCustomDADataSet; + FLocalTable.Assign(Table); + TDBAccessUtils.SetDesignCreate(FLocalTable, True); + + InitSQL; + + FListGot := False; + +{$IFDEF LINUX} + cbTableName.Items.Text := ' '; // bug in TComboBox + meSQL.Height := meSQL.Parent.ClientHeight - meSQL.Top - cbTableName.Top; +{$ENDIF} + + cbTableName.Text := FDADesignUtilsClass.GetTableName(FLocalTable); + edFilter.Text := FLocalTable.FilterSQL; + edOrderFields.Text := FDADesignUtilsClass.GetOrderFields(FLocalTable); +end; + +procedure TDATableEditorForm.DoFinish; +begin + FLocalTable.Free; + FLocalTable := nil; + inherited; +end; + +procedure TDATableEditorForm.DoSave; +var + OldActive: boolean; + OldDebug: boolean; +begin + OldActive := Table.Active; + OldDebug := Table.Debug; + + try + Table.Assign(FLocalTable); + inherited; + Table.Debug := False; + try + Table.Active := OldActive; + except + end; + finally + Table.Debug := OldDebug; + end; +end; + +procedure TDATableEditorForm.InitSQL; +begin + meSQL.Lines.Text := ''; + try + if FDADesignUtilsClass.GetTableName(FLocalTable) <> '' then begin + FDADesignUtilsClass.PrepareSQL(FLocalTable); + meSQL.Lines.Text := FLocalTable.FinalSQL; + end; + except + on E: Exception do + if not (E is EOutOfResources) then + raise; // TMemo bug (see TMemoStrings.Insert) + end; +end; + +procedure TDATableEditorForm.GetTableNames(Connection: TCustomDAConnection; + Items: TStrings); +begin + Connection.GetTableNames(Items); +end; + +procedure TDATableEditorForm.cbTableNameDropDown(Sender: TObject); +var + UsedConnection: TCustomDAConnection; +begin + UsedConnection := TDBAccessUtils.UsedConnection(Table); + if TDBAccessUtils.UsedConnection(Table) = nil then + Exit; + + try + if not FListGot then begin + GetTableNames(UsedConnection, cbTableName.Items); + FListGot := True; + end; + except + Application.HandleException(Self); + end; +end; + +procedure TDATableEditorForm.cbTableNameExit(Sender: TObject); +var + s: string; +begin + try + s := TDBAccessUtils.UnQuoteName(FLocalTable, Trim(cbTableName.Text)); + if s <> FDADesignUtilsClass.GetTableName(FLocalTable) then begin + FDADesignUtilsClass.SetTableName(FLocalTable, cbTableName.Text); + InitSQL; + Modified:= True; + end; + except + cbTableName.SetFocus; + raise; + end; +end; + +procedure TDATableEditorForm.edOrderFieldsExit(Sender: TObject); +begin + if edOrderFields.Text <> FDADesignUtilsClass.GetOrderFields(FLocalTable) then begin + FDADesignUtilsClass.SetOrderFields(FLocalTable, edOrderFields.Text); + InitSQL; + Modified:= True; + end; +end; + +procedure TDATableEditorForm.edFilterExit(Sender: TObject); +begin + if edFilter.Text <> FLocalTable.FilterSQL then begin + FLocalTable.FilterSQL:= edFilter.Text; + InitSQL; + Modified:= True; + end; +end; + +function TDATableEditorForm.GetComponent: TComponent; +begin + Result := Table; +end; + +procedure TDATableEditorForm.SetComponent(Value: TComponent); +begin + Table := Value as TCustomDADataSet; +end; + +function TDATableEditorForm.GetLocalComponent: TComponent; +begin + Result := FLocalTable; +end; + +procedure TDATableEditorForm.btnDataEditorClick(Sender: TObject); +begin + inherited; + SaveControlData; + DoSave; + with TDADataEditorForm.Create(nil, FDADesignUtilsClass) do + try + Component := Self.FLocalTable; + ShowModal; + finally + Free; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DATableEditor.xfm b/internal/4.10.0.10/1/Source/Design/DATableEditor.xfm new file mode 100644 index 0000000..38652d0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DATableEditor.xfm @@ -0,0 +1,117 @@ +inherited DATableEditorForm: TDATableEditorForm + Left = 294 + Top = 203 + Height = 340 + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + ActiveControl = cbTableName + BorderIcons = [biSystemMenu] + Constraints.MinHeight = 332 + Constraints.MinWidth = 512 + Font.Height = -11 + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Top = 265 + TabOrder = 1 + inherited btOk: TBitBtn + TabOrder = 1 + end + inherited btCancel: TBitBtn + TabOrder = 2 + end + object btnDataEditor: TBitBtn + Left = 8 + Top = 8 + Width = 80 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = '&Data Editor...' + TabOrder = 0 + OnClick = btnDataEditorClick + end + end + object Panel1: TPanel + Left = 8 + Top = 8 + Width = 497 + Height = 285 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelWidth = 2 + TabOrder = 0 + object Label2: TLabel + Left = 8 + Top = 20 + Width = 58 + Height = 13 + Caption = 'Table Name' + end + object Label4: TLabel + Left = 8 + Top = 44 + Width = 56 + Height = 13 + Caption = 'Order Fields' + end + object Label1: TLabel + Left = 8 + Top = 67 + Width = 43 + Height = 13 + Caption = 'FilterSQL' + end + object edFilter: TEdit + Left = 96 + Top = 64 + Width = 388 + Height = 20 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + OnExit = edFilterExit + end + object meSQL: TMemo + Left = 5 + Top = 88 + Width = 479 + Height = 164 + Anchors = [akLeft, akTop, akRight, akBottom] + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Courier New' + Font.Pitch = fpVariable + Font.Style = [] + Lines.Strings = ( + '') + ParentFont = False + ReadOnly = True + ScrollBars = ssBoth + TabOrder = 3 + WordWrap = False + end + object cbTableName: TComboBox + Left = 96 + Top = 16 + Width = 388 + Height = 26 + Anchors = [akLeft, akTop, akRight] + DropDownCount = 16 + ItemHeight = 13 + TabOrder = 0 + Items.Strings = ( + '') + OnDropDown = cbTableNameDropDown + OnExit = cbTableNameExit + end + object edOrderFields: TEdit + Left = 96 + Top = 40 + Width = 388 + Height = 20 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + OnExit = edOrderFieldsExit + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.dfm b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.dfm new file mode 100644 index 0000000..a0b25db --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.dfm @@ -0,0 +1,15 @@ +inherited DAUpdateSQLEditorForm: TDAUpdateSQLEditorForm + Caption = 'DAUpdateSQLEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited PageControl: TPageControl + ActivePage = shEditSQL + object shEditSQL: TTabSheet + Caption = '&Update SQLs' + end + object shGenerator: TTabSheet + Caption = 'SQL &Generator' + ImageIndex = 1 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.pas b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.pas new file mode 100644 index 0000000..fe145bf --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.pas @@ -0,0 +1,164 @@ + +////////////////////////////////////////////////// +// Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// UpdateSQL Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DAUpdateSQLEditor; +{$ENDIF} +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + Types, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QExtCtrls, QComCtrls, QButtons, +{$ENDIF} + SysUtils, Classes, DBAccess, CREditor, CRFrame, CRTabEditor, DAUpdateSQLFrame, + DASQLGeneratorFrame; + +type + TDAUpdateSQLEditorForm = class(TCRTabEditorForm) + shEditSQL: TTabSheet; + shGenerator: TTabSheet; + protected + FUpdateSQLFrame: TDAUpdateSQLFrame; + FSQLGeneratorFrame: TDASQLGeneratorFrame; + FLocalComponent, FComponent: TComponent; + FLocalDataSet: TCustomDADataSet; + + procedure DoInit; override; + procedure DoActivate; override; + procedure DoFinish; override; + procedure DoSave; override; + + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + function GetLocalComponent: TComponent; override; + + function GetFrameByInitProp: TCRFrame; override; + + function GetUpdateSQL: TCustomDAUpdateSQL; + procedure SetUpdateSQL(const Value: TCustomDAUpdateSQL); + public + property UpdateSQL: TCustomDAUpdateSQL read GetUpdateSQL write SetUpdateSQL; + property UpdateSQLFrame: TDAUpdateSQLFrame read FUpdateSQLFrame; + property LocalDataSet: TCustomDADataSet read FLocalDataSet; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DAUpdateSQLEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{ TDAUpdateSQLEditorForm } + +function TDAUpdateSQLEditorForm.GetComponent: TComponent; +begin + Result := UpdateSQL; +end; + +procedure TDAUpdateSQLEditorForm.SetComponent(Value: TComponent); +begin + UpdateSQL := Value as TCustomDAUpdateSQL; +end; + +function TDAUpdateSQLEditorForm.GetLocalComponent: TComponent; +begin + Result := FLocalComponent; +end; + +function TDAUpdateSQLEditorForm.GetFrameByInitProp: TCRFrame; +begin + if InitialProperty = 'DeleteSQL' then begin + FUpdateSQLFrame.SetStatementType(stDelete); + Result := FUpdateSQLFrame; + end + else + if InitialProperty = 'InsertSQL' then begin + FUpdateSQLFrame.SetStatementType(stInsert); + Result := FUpdateSQLFrame; + end + else + if InitialProperty = 'RefreshSQL' then begin + FUpdateSQLFrame.SetStatementType(stRefresh); + Result := FUpdateSQLFrame; + end + else + if InitialProperty = 'ModifySQL' then begin + FUpdateSQLFrame.SetStatementType(stUpdate); + Result := FUpdateSQLFrame; + end + else + Result := inherited GetFrameByInitProp; +end; + +function TDAUpdateSQLEditorForm.GetUpdateSQL: TCustomDAUpdateSQL; +begin + Result := FComponent as TCustomDAUpdateSQL; +end; + +procedure TDAUpdateSQLEditorForm.SetUpdateSQL(const Value: TCustomDAUpdateSQL); +begin + FComponent := Value; +end; + +procedure TDAUpdateSQLEditorForm.DoInit; +begin + inherited; + + FLocalComponent := TComponentClass(UpdateSQL.ClassType).Create(nil); + FLocalComponent.Assign(UpdateSQL); + FDADesignUtilsClass.SetDesignCreate(FLocalComponent, True); + + if UpdateSQL.DataSet <> nil then begin + shGenerator.TabVisible := True; + FLocalDataSet := TCustomDADataSet(TComponentClass(UpdateSQL.DataSet.ClassType).Create(nil)); + FLocalDataSet.Assign(UpdateSQL.DataSet); + FDADesignUtilsClass.SetDesignCreate(FLocalDataSet, True); + TDBAccessUtils.SetDesigning(FLocalDataSet, csDesigning in UpdateSQL.DataSet.ComponentState); + end + else + shGenerator.TabVisible := False; + + Assert(FUpdateSQLFrame <> nil); + Assert(FSQLGeneratorFrame <> nil); + + Modified := False; +end; + +procedure TDAUpdateSQLEditorForm.DoActivate; +begin + inherited; + + GetFrameByInitProp; +end; + +procedure TDAUpdateSQLEditorForm.DoFinish; +begin + FreeAndNil(FLocalDataSet); + FreeAndNil(FLocalComponent); + inherited; +end; + +procedure TDAUpdateSQLEditorForm.DoSave; +begin + inherited; + FComponent.Assign(FLocalComponent); +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.xfm b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.xfm new file mode 100644 index 0000000..bc1682b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLEditor.xfm @@ -0,0 +1,15 @@ +inherited DAUpdateSQLEditorForm: TDAUpdateSQLEditorForm + Caption = 'DAUpdateSQLEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited PageControl: TPageControl + ActivePage = shEditSQL + object shEditSQL: TTabSheet + Caption = '&Update SQLs' + end + object shGenerator: TTabSheet + Caption = 'SQL &Generator' + ImageIndex = 1 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.dfm b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.dfm new file mode 100644 index 0000000..5a5ed7f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.dfm @@ -0,0 +1,57 @@ +inherited DAUpdateSQLFrame: TDAUpdateSQLFrame + Width = 450 + Height = 230 + inherited Panel1: TPanel + Top = 42 + Width = 450 + Height = 188 + TabOrder = 1 + inherited meSQL: TMemo + Width = 434 + Height = 172 + OnChange = meSQLChange + end + end + object pnlTop: TPanel + Left = 0 + Top = 0 + Width = 450 + Height = 42 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object btClear: TSpeedButton + Left = 420 + Top = 9 + Width = 21 + Height = 31 + Hint = 'Clear' + Anchors = [akTop, akRight] + Flat = True + Glyph.Data = { + 4E010000424D4E01000000000000760000002800000012000000120000000100 + 040000000000D800000000000000000000001000000010000000000000000000 + 8000008000000080800080000000800080008080000080808000C0C0C0000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00888888888888 + 888888FFFFFF888888888888888888FFFFFF888888888888881F88FFFFFF8888 + 1F888888888888FFFFFF888111F8888881F888FFFFFF888111F888881F8888FF + FFFF8888111F88811F8888FFFFFF88888111F811F88888FFFFFF88888811111F + 888888FFFFFF8888888111F8888888FFFFFF88888811111F888888FFFFFF8888 + 8111F811888888FFFFFF8881111F88811F8888FFFFFF881111F8888811F888FF + FFFF8811F8888888811F88FFFFFF888888888888888888FFFFFF888888888888 + 888888FFFFFF888888888888888888FFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = btClearClick + end + object gbStatementType: TGroupBox + Left = 7 + Top = 3 + Width = 410 + Height = 37 + Anchors = [akLeft, akTop, akRight] + Caption = ' Statement Type ' + TabOrder = 0 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.pas b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.pas new file mode 100644 index 0000000..4aadf58 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.pas @@ -0,0 +1,261 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// UpdateSQL Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit DAUpdateSQLFrame; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, Buttons, +{$ENDIF} +{$IFDEF LINUX} + QGraphics, QStdCtrls, QExtCtrls, QButtons, QControls, +{$ENDIF} +{$IFDEF DBTOOLS} + DBToolsClient, +{$ENDIF} + Classes, SysUtils, DBAccess, CRFrame, CRTabEditor, + DASQLFrame; + +type + TDAUpdateSQLFrame = class(TDASQLFrame) + pnlTop: TPanel; + btClear: TSpeedButton; + gbStatementType: TGroupBox; + procedure rbClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + procedure meSQLChange(Sender: TObject); + protected + FStatementType: TStatementType; + FStatementTypeSetted: boolean; + Frb: array[TStatementType] of TRadioButton; + + {$IFDEF DBTOOLS} + procedure LoadMemo; override; + {$ENDIF} + function GetStatementTypes: TStatementTypes; virtual; + + function GetLocalComponentSQL: TStrings; override; + procedure SetLocalComponentSQL(Value: TStrings); override; + + procedure CreateStatementIndicators; + procedure RefreshEmptyIndicators; + procedure SetEmpty(st: TStatementType; Empty: boolean); + procedure DoActivate; override; + + public + procedure SetStatementType(StatementType: TStatementType); + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R DAUpdateSQLFrame.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses + DB, DAQueryEditor, DASQLEditor, DAUpdateSQLEditor, CREditor; + +procedure TDAUpdateSQLFrame.SetStatementType(StatementType: TStatementType); +begin + FStatementTypeSetted := True; + FStatementType := StatementType; + CreateStatementIndicators; + Assert(Frb[FStatementType] <> nil); + Frb[FStatementType].Checked := True; + LoadMemo; +end; + +procedure TDAUpdateSQLFrame.DoActivate; +var + st: TStatementType; + sts: TStatementTypes; +begin + if not FStatementTypeSetted then begin + CreateStatementIndicators; + sts := GetStatementTypes; + for st := Low(TStatementType) to High(TStatementType) do + if (st in sts) and (TrimRight(Editor.DADesignUtilsClass.GetSQL(Editor.LocalComponent, st).Text) <> '') then begin + SetStatementType(st); + Break; + end; + + if not FStatementTypeSetted then begin + for st := Low(TStatementType) to High(TStatementType) do + if (Frb[st] <> nil) and Frb[st].Visible and Frb[st].Enabled then begin + SetStatementType(st); + Break; + end; + end; + end; + + inherited; + + RefreshEmptyIndicators; +end; + +procedure TDAUpdateSQLFrame.SetEmpty(st: TStatementType; + Empty: boolean); +begin + Assert(Frb[st] <> nil); + if Empty then + Frb[st].Font.Style := [] + else + Frb[st].Font.Style := [fsBold]; +end; + +procedure TDAUpdateSQLFrame.CreateStatementIndicators; +var + st: TStatementType; + sts: TStatementTypes; + rbCount, dW, i: integer; + rb: TRadioButton; +begin + for st := Low(TStatementType) to High(TStatementType) do + if Frb[st] <> nil then + Exit; + + Assert(Owner is TCREditorForm); + rbCount := 0; + sts := GetStatementTypes; + for st := Low(TStatementType) to High(TStatementType) do begin + Frb[st].Free; + Frb[st] := nil; + if st in sts then begin + Inc(rbCount); + rb := TRadioButton.Create(Self); + with rb do + begin + Parent := gbStatementType; + Top := 15; + Width := 75; + Height := 17; + case st of + stQuery: + Caption := 'Query'; + stInsert: + Caption := 'Insert'; + stUpdate: + Caption := 'Update'; + stDelete: + Caption := 'Delete'; + stLock: + Caption := 'Lock'; + stRefresh: + Caption := 'Refresh'; + else + Assert(False); + end; + //TabStop := True; ??? + OnClick := rbClick; + end; + Frb[st] := rb; + end; + end; + + i := 0; + dW := (gbStatementType.Width - 8 {rbInsert.Left} * 2) div rbCount; + for st := Low(TStatementType) to High(TStatementType) do + if st in sts then begin + Assert(Frb[st] <> nil); + Frb[st].Left := 8 {rbInsert.Left} + dW * i; + Inc(i); + end; +end; + +procedure TDAUpdateSQLFrame.RefreshEmptyIndicators; +var + st: TStatementType; + sts: TStatementTypes; +begin + sts := GetStatementTypes; + for st := Low(TStatementType) to High(TStatementType) do + if st in sts then + SetEmpty(st, TrimRight(Editor.DADesignUtilsClass.GetSQL(Editor.LocalComponent, st).Text) = ''); +end; + +procedure TDAUpdateSQLFrame.rbClick(Sender: TObject); +var + st: TStatementType; +begin +{$IFDEF DBTOOLS} + DBTools.CheckDBToolsChanges(Self); +{$ENDIF} + for st := Low(TStatementType) to High(TStatementType) do + if (Frb[st] <> nil) and Frb[st].Checked then begin + if FStatementType <> st then begin + SaveMemo; + FStatementType := st; + LoadMemo; + end; + Exit; + end; + Assert(False); +end; + +procedure TDAUpdateSQLFrame.btClearClick(Sender: TObject); +begin + SQLText := ' '; + SaveMemo; + meSQLChange(nil); +end; + +procedure TDAUpdateSQLFrame.meSQLChange(Sender: TObject); +begin + if FStatementTypeSetted then + SetEmpty(FStatementType, TrimRight(SQLText) = ''); +end; + +{$IFDEF DBTOOLS} +procedure TDAUpdateSQLFrame.LoadMemo; +begin + if DBTools.HasDACSqlEditorFrame(meSQL) then + DBTools.GetDACSqlEditorFrame(meSQL).StatementType := FStatementType; + + inherited; +end; +{$ENDIF} + +function TDAUpdateSQLFrame.GetStatementTypes: TStatementTypes; +begin + Result := Editor.DADesignUtilsClass.GetStatementTypes - [stQuery]; + if Editor.LocalComponent is TCustomDAUpdateSQL then + Result := Result - [stLock]; +end; + +function TDAUpdateSQLFrame.GetLocalComponentSQL: TStrings; +begin + Assert(Editor <> nil); + if FStatementType = stQuery then + Result := inherited GetLocalComponentSQL + else + Result := Editor.DADesignUtilsClass.GetSQL(Editor.LocalComponent, FStatementType); +end; + +procedure TDAUpdateSQLFrame.SetLocalComponentSQL(Value: TStrings); +begin + Assert(Editor <> nil); + if FStatementType = stQuery then + inherited SetLocalComponentSQL(Value) + else + Editor.DADesignUtilsClass.SetSQL(Editor.LocalComponent, Value, FStatementType); +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.xfm b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.xfm new file mode 100644 index 0000000..8ed490e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DAUpdateSQLFrame.xfm @@ -0,0 +1,57 @@ +inherited DAUpdateSQLFrame: TDAUpdateSQLFrame + Width = 450 + Height = 230 + inherited Panel1: TPanel + Top = 42 + Width = 450 + Height = 188 + TabOrder = 1 + inherited meSQL: TMemo + Width = 434 + Height = 172 + OnChange = meSQLChange + end + end + object pnlTop: TPanel + Left = 0 + Top = 0 + Width = 450 + Height = 42 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object btClear: TSpeedButton + Left = 420 + Top = 9 + Width = 21 + Height = 31 + Hint = 'Clear' + Anchors = [akTop, akRight] + Flat = True + Glyph.Data = { + 4E010000424D4E01000000000000760000002800000012000000120000000100 + 040000000000D800000000000000000000001000000010000000000000000000 + 8000008000000080800080000000800080008080000080808000C0C0C0000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00888888888888 + 888888FFFFFF888888888888888888FFFFFF888888888888881F88FFFFFF8888 + 1F888888888888FFFFFF888111F8888881F888FFFFFF888111F888881F8888FF + FFFF8888111F88811F8888FFFFFF88888111F811F88888FFFFFF88888811111F + 888888FFFFFF8888888111F8888888FFFFFF88888811111F888888FFFFFF8888 + 8111F811888888FFFFFF8881111F88811F8888FFFFFF881111F8888811F888FF + FFFF8811F8888888811F88FFFFFF888888888888888888FFFFFF888888888888 + 888888FFFFFF888888888888888888FFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = btClearClick + end + object gbStatementType: TGroupBox + Left = 7 + Top = 3 + Width = 410 + Height = 37 + Anchors = [akLeft, akTop, akRight] + Caption = ' Statement Type ' + TabOrder = 0 + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/DBToolsClient.pas b/internal/4.10.0.10/1/Source/Design/DBToolsClient.pas new file mode 100644 index 0000000..b390886 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/DBToolsClient.pas @@ -0,0 +1,2145 @@ + +{$IFNDEF CLR} +{$I Dac.inc} + +unit DBToolsClient; +{$ENDIF} + +interface + +uses +{$IFDEF WIN32} + CLRClasses, + VarUtils, + DesignIntf, + ToolsApi, +{$ELSE} + System.Runtime.InteropServices, + Borland.Vcl.Design.DesignIntf, + Borland.Studio.ToolsAPI, + System.Reflection, + System.Diagnostics, + CoreLab.DbTools, + System.Text, +{$ENDIF} + ActiveX, + DADesignUtils, + Windows, Classes, Controls, StdCtrls, ExtCtrls, DB, DBAccess, + DBToolsIntf, ActnMan, ActnList, Graphics, Menus, Forms, Messages; + +type +{$IFDEF CLR} + TString = string; + IIDEServices = IOTAService; + IModuleServices = IOTAModuleServices; +{$ELSE} + TString = PWideChar; + PConnectionInfo = ^ConnectionInfo; + IIDEServices = IOTAServices; + IModuleServices = IOTAModuleServices70; +{$ENDIF} + + TParamTypeMap = record + DACType: TFieldType; + DBToolsType: integer; + end; + + TSqlSource = class; + + TDBToolsVerb = (dbtEditSql, dbtQueryBuilder, + dbtFindInDatabaseExplorer, dbtEditDatabaseObject, dbtExecuteSql, + dbtDebugSql, dbtRetrieveData, dbtCompile, dbtCompileDebug); + + TDBToolsVerbs = set of TDBToolsVerb; + + TCompareFlag = (cfNormal, cfCaseSensitive, cfNone); + + TDBToolsService = class(TObject) + protected + FUsedConnectionStrList: TStringList; + FUsedConnectionCompareFlags: array of TCompareFlag; + + FConnectionStrList: TStringList; + FConnectionsList: TStringList; + FDefaultConnectionList: TStringList; + FDADesignUtils: TDADesignUtilsClass; + FSqlService: IDbToolsService; + FSqlEditors: array of ISqlEditor; + FParamTypeMaps: array of TParamTypeMap; + + FCurrentDesigner: IDesigner; + FCurrentComponent: TComponent; + + function GetSqlEditor: ISqlEditor; + procedure ReturnSqlEditor(ASqlEditor: ISqlEditor); + function GetSqlSource(Component: TComponent; Designer: IDesigner; SqlTextPrefix: string = ''): TSqlSource; + {$IFDEF WIN32} + class function AccessData(const V: PSafeArray): pointer; + class procedure UnaccessData(const V: PSafeArray); + class function DataHigh(const V: PSafeArray): integer; + {$ENDIF} + class function GetConnectionParamStr(const ParamName, ParamValue: string): string; + function GetConnectionValueStr(ConnectionName: string): string; + procedure ConnStrToList(ConnStr: string; const ConnList: TStrings); + procedure CheckConnection(const Component: TComponent); + + procedure BeginConnectionStrGetting(const ConnectionStrList: TStringList); + public + constructor Create(ADADesignUtils: TDADesignUtilsClass; ASqlService: {$IFDEF WIN32}IUnknown{$ELSE}TObject{$ENDIF};ADefaultConnectionStr: string); + destructor Destroy; override; + function DBToolsTypeToDataType(AType: integer; OldType: TFieldType): TFieldType; + function DataTypeToDBToolsType(AType: TFieldType): integer; + + function GetConnection(const Component: TComponent): TCustomDAConnection; + function GetNativeConnectionString(const Component: TComponent): string; + function GetConnectionString(const Component: TComponent): TString; + function GetConnectionStringObjectTypeAndFullName(const Component: TComponent; out ConnectionString, ObjectType, FullName: TString): boolean; + + procedure GetConnections(NameList: TStrings; Condition: string = ''); + function FindConnectionName(AConnection: TCustomDAConnection): string; //Call GetConnections + function GetConnectionStrList(ConnectionName: string): TStringList; //before! + + procedure FindInDatabaseExplorer; + procedure EditDatabaseObject; + procedure ExecuteSql(Debug: boolean); + procedure Compile(Debug: boolean); + procedure RetrieveData(AsDocument: boolean); + procedure EditSql(AsQuery: boolean); + + procedure AddParamTypeMap(ADACType: TFieldType; ADBToolsType: integer); + + procedure PutConnectionParam(const ConnectionParam: string; const CompareFlag: TCompareFlag = cfNormal); + procedure SkipConnectionParams(const Count: integer); + + property DADesignUtils: TDADesignUtilsClass read FDADesignUtils; + property SqlService: IDbToolsService read FSqlService; + end; + + TDACSqlEditorFrame = class(TPanel) + private + FReadOnly: boolean; + FOnExit: TNotifyEvent; + FOnChange: TNotifyEvent; + FDBToolsService: TDBToolsService; + FSqlEditors: array[TStatementType] of ISqlEditor; + FStatementType: TStatementType; + FComponent: TComponent; + FLastConnectionString: string; + FInInit: boolean; + + function GetSqlEditor: ISqlEditor; + procedure SetStatementType(const Value: TStatementType); + function GetText: string; + procedure SetText(const Value: string); {$IFDEF CLR} reintroduce; {$ENDIF} + procedure SetReadOnly(Value: boolean); + procedure InternalResize; + protected + procedure Resize; override; + function GetSqlEditorHandle: HWND; + procedure CheckModified; + procedure WndProc(var Message: TMessage); override; + public + constructor Create(AOwner: TComponent; Component: TComponent; DBToolsService: TDBToolsService); reintroduce; + destructor Destroy; override; + procedure SetFocus; override; + procedure CheckConnectionChange; + procedure EndInit; + + property SqlEditor: ISqlEditor read GetSqlEditor; + property Text: string read GetText write SetText; + property OnExit: TNotifyEvent read FOnExit write FOnExit; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + property ReadOnly: boolean read FReadOnly write SetReadOnly; + property StatementType: TStatementType write SetStatementType; + end; + + TDBToolsDesignNotification = class; + + TDBTools = class(TObject) + private + FIDEServices: IIDEServices; + FModuleServices: IModuleServices; + FDBToolsServices: array of TDBToolsService; + FDesignNotification: TDBToolsDesignNotification; + FCurrentDADesignUtils: TDADesignUtilsClass; + FCurrentDBToolsService: TDBToolsService; + {$IFDEF WIN32} + FNeedUninitialize: boolean; + {$ENDIF} + FMenuManager: TActionManager; + FMenuActions: array [TDBToolsVerb] of TAction; + FLastDACSqlEditorFrame: TDACSqlEditorFrame; + FLastMemo: TWinControl; + FDACSqlEditorFrames: array of TDACSqlEditorFrame; + + function MenuItemsAvailable: boolean; + procedure DebugSql(Sender: TObject); + procedure EditDatabaseObject(Sender: TObject); + procedure EditSql(Sender: TObject); + procedure ExecuteSql(Sender: TObject); + procedure Compile(Sender: TObject); + procedure CompileDebug(Sender: TObject); + procedure FindInDatabaseExplorer(Sender: TObject); + procedure QueryBuilder(Sender: TObject); + procedure RetrieveData(Sender: TObject); + + procedure CreateMenuActions; + function GetMenuActions(Index: TDBToolsVerb): TAction; + public + property DesignNotification: TDBToolsDesignNotification read FDesignNotification; + property IDEServices: IIDEServices read FIDEServices; + property ModuleServices: IModuleServices read FModuleServices; + + constructor Create; + destructor Destroy; override; + function CreateDBToolsService(const DADesignUtils: TDADesignUtilsClass; + const ClassID: TGUID;{$IFDEF CLR} const ServiceShortName: string; {$ENDIF} + const DefaultConnectionStr: string; const ProviderKey: string; + out ServiceVersion: int64; out NeedToCheck: TNeedToCheckDbTools): TObject; + function CheckDevTools(const ClassID: TGUID; const ProviderKey: string; const DADesignUtils: TDADesignUtilsClass; out ServiceVersion: int64): TNeedToCheckDbTools; + procedure CheckDBToolsChanges(Control: TWinControl); + procedure ReplaceMemo(var Memo: TMemo; DADesignUtils: TDADesignUtilsClass; Component: TComponent); + procedure DesignerClosing(const FileName: string); + function GetDesignerName(Designer: IDesigner): string; + procedure PrepareMenu(Designer: IDesigner; Component: TComponent; DADesignUtils: TDADesignUtilsClass); + function HasDACSqlEditorFrame(Memo: TWinControl): boolean; + function GetDACSqlEditorFrame(Memo: TWinControl): TDACSqlEditorFrame; + procedure CheckConnectionChanges; + function GetActiveDACSqlEditorFrame: TWinControl; + + property MenuActions[Index: TDBToolsVerb]: TAction read GetMenuActions; + end; + + TSqlSource = class(TInterfacedObject, ISqlSource) + protected + FParameterCount: integer; + FParameterSetted: array of boolean; + FDesigner: IDesigner; + FDesignerName: string; + FComponent: TComponent; + FLastName: string; + FComponentSQL: string; + FSqlSourceNotifier: ISqlSourceNotifier; + FStatementType: TStatementType; + FDBToolsService: TDBToolsService; + FLastConnection: TCustomDAConnection; + FLastConnectionString: string; + FSqlTextPrefix: string; + + function GetParams: TDAParams; + function GetSqlText: string; + procedure SetSqlText(Value: string); + + function Get_Name: TString; {$IFDEF WIN32}stdcall;{$ENDIF} + function Get_ConnectionString: TString; {$IFDEF WIN32}stdcall;{$ENDIF} + function Get_DesignerName: TString; {$IFDEF WIN32}stdcall;{$ENDIF} + function Get_Sql: TString; {$IFDEF WIN32}stdcall;{$ENDIF} + procedure Set_Sql({$IFDEF WIN32}const {$ENDIF}Param1: TString); {$IFDEF WIN32}stdcall;{$ENDIF} + procedure GetParameter({$IFDEF WIN32}const {$ENDIF}Index: integer; out Info: CommandParameterInfo); {$IFDEF WIN32}stdcall;{$ENDIF} + procedure SetParameter({$IFDEF WIN32}const {$ENDIF}Index: integer; Info: CommandParameterInfo); {$IFDEF WIN32}stdcall;{$ENDIF} + procedure Set_ParameterCount({$IFDEF WIN32}const {$ENDIF}Value: integer); {$IFDEF WIN32}stdcall;{$ENDIF} + function Get_ParameterCount: integer; {$IFDEF WIN32}stdcall;{$ENDIF} + + procedure Close; {$IFDEF WIN32}stdcall;{$ENDIF} + + property Params: TDAParams read GetParams; + public + constructor Create(DBToolsService: TDBToolsService; Component: TComponent; Designer: IDesigner); + destructor Destroy; override; + procedure CheckRename; + procedure CheckConnectionChange(InternalCheck: boolean); + procedure CheckChanges; + + property SqlSourceNotifier: ISqlSourceNotifier read FSqlSourceNotifier; + property Designer: IDesigner read FDesigner; + property SqlTextPrefix: string read FSqlTextPrefix write FSqlTextPrefix; + end; + + TSqlSourceList = class(TList) + private + FNotifiersToDelete: array of ISqlSourceNotifier; + public + function IndexOf(Component: TComponent): integer; reintroduce; + function Find(Component: TComponent): TSqlSource; overload; + function Find(Component: TComponent; SqlTextPrefix: string): TSqlSource; overload; + function FindDesigner(FileName: string): IDesigner; + procedure CheckSubordinated(AComponent: TComponent); + procedure Delete(Index: integer; WithNotification: boolean = False); reintroduce; overload; + procedure Delete(Component: TComponent; WithNotification: boolean = True); overload; + procedure Delete(SqlSource: TSqlSource); overload; + procedure Add(SqlSource: TSqlSource); + procedure DeleteDesigner(Designer: IDesigner); + procedure CheckDeletedComponents(Designer: IDesigner); + end; + + TModuleNotifier = class({$IFDEF CLR}TObject{$ELSE}TInterfacedObject, IOTANotifier, IOTAModuleNotifier, IOTAModuleNotifier80{$ENDIF}) + private + FModule : IOTAModule; + {$IFDEF WIN32} + AllowSaveSwitch : boolean; + FIndex : integer; + {$ELSE} + procedure BeforeSave(Sender: TObject; e: EventArgs); + {$ENDIF} + procedure RemoveNotifier; + public + constructor Create(const Module: IOTAModule); + destructor Destroy; override; + {$IFDEF WIN32} + {IOTANotifier} + procedure AfterSave; + procedure BeforeSave; + procedure Destroyed; + procedure Modified; + {IOTAModuleNotifier} + function CheckOverwrite: Boolean; + procedure ModuleRenamed(const NewName: string); + {IOTAModuleNotifier80} + function AllowSave: Boolean; + function GetOverwriteFileNameCount: Integer; + function GetOverwriteFileName(Index: Integer): string; + procedure SetSaveFileName(const FileName: string); + {$ENDIF} + property Module: IOTAModule read FModule; + end; + + TModuleList = class(TList) + public + function IndexOf(Module: IOTAModule): integer; reintroduce; + procedure Add(Module: IOTAModule); + procedure Delete(Index: integer); reintroduce; overload; + procedure Delete(Module: IOTAModule); overload; + end; + + TDBToolsDesignNotification = class(TInterfacedObject, IDesignNotification) + protected + FSqlSourceList: TSqlSourceList; + FModuleList: TModuleList; + FDebugStr: string; + public + constructor Create; + destructor Destroy; override; + procedure ItemDeleted(const ADesigner: IDesigner; AItem: TPersistent); + procedure ItemInserted(const ADesigner: IDesigner; AItem: TPersistent); + procedure ItemsModified(const ADesigner: IDesigner); + procedure SelectionChanged(const ADesigner: IDesigner; const ASelection: IDesignerSelections); + procedure DesignerOpened(const ADesigner: IDesigner; AResurrecting: Boolean); + procedure DesignerClosed(const ADesigner: IDesigner; AGoingDormant: Boolean); + + property SqlSourceList: TSqlSourceList read FSqlSourceList; + property ModuleList: TModuleList read FModuleList; + end; + +var + DBTools: TDBTools; + +function GetDBToolsService(DADesignUtilsClass: TDADesignUtilsClass): TDBToolsService; + +implementation + +{$IFDEF WIN32} +{$R DBToolsClient.res} +{$ENDIF} +uses + DADesign, Registry, Download, DAConsts, + Variants, SysUtils, ComObj, TypInfo; + +const + SConnectionName = '_ConnName_'; + SConnStrError = 'ConnectionString error'; + SCompilePrefix = 'compile'; + SEditPrefix = 'edit'; + +{$IFDEF WIN32} + function ToWideChar(s: WideString): PWideChar; + begin + if s = '' then + Result := nil + else + Result := SysAllocString(PWideChar(s)); + end; +{$ENDIF} + +{ TSqlSourceList } + +procedure TSqlSourceList.Add(SqlSource: TSqlSource); +var + ModuleFileName, s: string; + Module: IOTAModule; +begin + SqlSource.Designer.ModuleFileNames(ModuleFileName, s, s); + + inherited Add(SqlSource); + + Module := DBTools.ModuleServices.FindModule(ModuleFileName); + DBTools.DesignNotification.ModuleList.Add(Module) +end; + +function TSqlSourceList.IndexOf(Component: TComponent): integer; +var + i: integer; +begin + Result := -1; + for i := 0 to Count - 1 do + if TSqlSource(Items[i]).FComponent = Component then begin + Result := i; + Break; + end; +end; + +function TSqlSourceList.Find(Component: TComponent): TSqlSource; +var + i: integer; +begin + i := IndexOf(Component); + if i < 0 then + Result := nil + else + Result := TSqlSource(Items[i]); +end; + +function TSqlSourceList.Find(Component: TComponent; SqlTextPrefix: string): TSqlSource; +var + i: integer; +begin + for i := 0 to Count - 1 do + if (TSqlSource(Items[i]).FComponent = Component) and + (TSqlSource(Items[i]).SqlTextPrefix = SqlTextPrefix) then begin + Result := TSqlSource(Items[i]); + Exit; + end; + Result := nil; +end; + +procedure TSqlSourceList.CheckSubordinated(AComponent: TComponent); +var + i: integer; +begin + if AComponent is TCustomDAConnection then begin + for i := 0 to Count - 1 do + with TSqlSource(Items[i]) do + if FDBToolsService.GetConnection(FComponent) = AComponent then + CheckConnectionChange(False); + end + else + for i := 0 to Count - 1 do + if TSqlSource(Items[i]).FComponent.Owner = AComponent then + TSqlSource(Items[i]).CheckRename; +end; + +procedure TSqlSourceList.Delete(Index: integer; WithNotification: boolean = False); +var + n: integer; + SqlSource: TSqlSource; +begin + SqlSource := TSqlSource(Items[Index]); + if WithNotification and (SqlSource.FSqlSourceNotifier <> nil) then begin + n := Length(FNotifiersToDelete); + SetLength(FNotifiersToDelete, n + 1); + FNotifiersToDelete[n] := SqlSource.FSqlSourceNotifier; + SqlSource.FSqlSourceNotifier := nil; + inherited Delete(Index); + end + else + inherited Delete(Index); +end; + +procedure TSqlSourceList.Delete(Component: TComponent; WithNotification: boolean = True); +var + Index: integer; +begin + Index := IndexOf(Component); + if Index >= 0 then + Delete(Index, WithNotification); +end; + +procedure TSqlSourceList.Delete(SqlSource: TSqlSource); +var + i: integer; +begin + for i := 0 to Count - 1 do + if TSqlSource(Items[i]) = SqlSource then begin + inherited Delete(i); + Break; + end; +end; + +procedure TSqlSourceList.DeleteDesigner(Designer: IDesigner); +var + i: integer; + SqlSource: TSqlSource; +begin + i := 0; + while i < Count do begin + SqlSource := TSqlSource(Items[i]); + if SqlSource.Designer = Designer then begin + if SqlSource.FSqlSourceNotifier <> nil then begin + SqlSource.FSqlSourceNotifier.OnSqlSourceDeleted; + SqlSource.FSqlSourceNotifier := nil; + end; + inherited Delete(i); + end + else + Inc(i); + end; +end; + +procedure TSqlSourceList.CheckDeletedComponents(Designer: IDesigner); +var + i, n: integer; + Notifier: ISqlSourceNotifier; + Sel: IDesignerSelections; +begin + n := Length(FNotifiersToDelete); + if n <= 0 then + Exit; + Sel := CreateSelectionList; + Sel.Add(Designer.Root); + Designer.SetSelections(Sel); + Designer.Activate; + for i := n - 1 downto 0 do begin + Notifier := FNotifiersToDelete[i]; + SetLength(FNotifiersToDelete, i); + Notifier.OnSqlSourceDeleted; + end; +end; + +function TSqlSourceList.FindDesigner(FileName: string): IDesigner; +var + i: integer; + ModuleFileName, s: string; +begin + for i := 0 to Count - 1 do begin + TSqlSource(Items[i]).Designer.ModuleFileNames(ModuleFileName, s, s); + if ModuleFileName = FileName then begin + Result := TSqlSource(Items[i]).Designer; + Exit; + end; + end; + Result := nil; +end; + +{ TDBToolsDesignNotification } + +constructor TDBToolsDesignNotification.Create; +begin + inherited; + FSqlSourceList := TSqlSourceList.Create; + FModuleList := TModuleList.Create; +end; + +procedure TDBToolsDesignNotification.DesignerClosed(const ADesigner: IDesigner; + AGoingDormant: Boolean); +begin + if ADesigner <> nil then + DBTools.DesignNotification.SqlSourceList.DeleteDesigner(ADesigner); +end; + +procedure TDBToolsDesignNotification.DesignerOpened(const ADesigner: IDesigner; + AResurrecting: Boolean); +begin +end; + +destructor TDBToolsDesignNotification.Destroy; +var + i, n: integer; +begin + n := FSqlSourceList.Count; + for i := n - 1 downto 0 do + FSqlSourceList.Delete(i); + FSqlSourceList.Free; + + n := FModuleList.Count; + for i := n - 1 downto 0 do begin + {$IFDEF CLR} + TModuleNotifier(FModuleList.Items[i]).Free; + {$ENDIF} + FModuleList.Delete(i); + end; + FModuleList.Free; +end; + +procedure TDBToolsDesignNotification.ItemDeleted(const ADesigner: IDesigner; + AItem: TPersistent); +begin + if AItem is TComponent then + FSqlSourceList.Delete(TComponent(AItem)); + FSqlSourceList.CheckDeletedComponents(ADesigner); +end; + +procedure TDBToolsDesignNotification.ItemInserted(const ADesigner: IDesigner; + AItem: TPersistent); +begin +end; + +procedure TDBToolsDesignNotification.ItemsModified(const ADesigner: IDesigner); +var + i: Integer; + SqlSource: TSqlSource; + SelectionList: IDesignerSelections; + Component: TComponent; +begin + if ADesigner = nil then + Exit; + SelectionList := CreateSelectionList; + ADesigner.GetSelections(SelectionList); + for i := 0 to SelectionList.Count - 1 do begin + if SelectionList.Items[i] is TComponent then begin + Component := TComponent(SelectionList.Items[i]); + SqlSource := FSqlSourceList.Find(Component); + if SqlSource <> nil then + SqlSource.CheckChanges + else + FSqlSourceList.CheckSubordinated(Component); + end; + end; +end; + +procedure TDBToolsDesignNotification.SelectionChanged(const ADesigner: IDesigner; + const ASelection: IDesignerSelections); +begin +end; + +{ TSqlSource } + +procedure TSqlSource.Close; +begin + Assert(DBTools.DesignNotification <> nil); + DBTools.DesignNotification.SqlSourceList.Delete(FComponent, False); +end; + +constructor TSqlSource.Create(DBToolsService: TDBToolsService; Component: TComponent; Designer: IDesigner); +begin + inherited Create; + Assert(DBToolsService <> nil); + FComponent := Component; + FDBToolsService := DBToolsService; + FStatementType := stQuery; + FLastName := Get_Name; + FComponentSQL := GetSqlText; + FDesigner := Designer; + FDesignerName := DBTools.GetDesignerName(FDesigner); + FLastConnection := FDBToolsService.GetConnection(Component); + FLastConnectionString := FDBToolsService.GetNativeConnectionString(FLastConnection); +end; + +destructor TSqlSource.Destroy; +begin + inherited; +end; + +function TSqlSource.GetParams: TDAParams; +begin + with FDBToolsService.DADesignUtils do + if HasParams(FComponent) then + Result := GetParams(FComponent) + else + Result := nil; +end; + +function TSqlSource.Get_ConnectionString: TString; +begin + Result := {$IFDEF WIN32}ToWideChar({$ENDIF} + FLastConnectionString + {$IFDEF WIN32}){$ENDIF}; +end; + +function TSqlSource.Get_DesignerName: TString; +begin + Result := {$IFDEF WIN32}ToWideChar(FDesignerName){$ELSE}FDesignerName{$ENDIF}; +end; + +function TSqlSource.Get_Name: TString; +begin + Result := {$IFDEF WIN32}ToWideChar({$ENDIF} + FComponent.Owner.Name + '-' + FComponent.Name + {$IFDEF WIN32}){$ENDIF}; +end; + +function TSqlSource.GetSqlText: string; +var + SQL: TStrings; + Macros: TMacros; + NewMacros: TDesignMacros; +begin + with FDBToolsService.DADesignUtils do + if IsStoredProc(FComponent) then begin + Result := Trim(GetFullName(FComponent)); + if Result <> '' then + Result := GetObjectType(FComponent) + ':' + Result; + end + else begin + SQL := GetSQL(FComponent); + Macros := GetMacros(FComponent); + NewMacros := TDesignMacros.Create(nil); + try + NewMacros.SetParserClass(TDBAccessUtils.GetParserClass(Macros)); + NewMacros.Assign(Macros); + Result := SQL.Text; + NewMacros.Expand(Result); + finally + NewMacros.Free; + end; + end; + if (FSqlTextPrefix <> '') and (FSqlTextPrefix <> SEditPrefix) then + Result := FSqlTextPrefix + ':' + Result; +end; + +procedure TSqlSource.SetSqlText(Value: string); +var + SQL: TStrings; + Macros: TMacros; + NewMacros: TDesignMacros; +begin + with FDBToolsService.DADesignUtils do + if not IsStoredProc(FComponent) then begin + SQL := GetSQL(FComponent); + Macros := GetMacros(FComponent); + NewMacros := TDesignMacros.Create(nil); + try + NewMacros.SetParserClass(TDBAccessUtils.GetParserClass(Macros)); + NewMacros.Scan(Value); + SQL.Text := Value; + Macros.Assign(NewMacros); + finally + NewMacros.Free; + end; + end; +end; + +function TSqlSource.Get_Sql: TString; +begin + Result := {$IFDEF WIN32}ToWideChar({$ENDIF} + WideString(GetSqlText) + {$IFDEF WIN32}){$ENDIF}; +end; + +procedure TSqlSource.Set_Sql({$IFDEF WIN32}const {$ENDIF}Param1: TString); +begin + SetSqlText(Param1); +end; + +procedure TSqlSource.GetParameter({$IFDEF WIN32}const {$ENDIF}Index: integer; out Info: CommandParameterInfo); +begin + Assert(Index < Get_ParameterCount); + Info.Name := {$IFDEF WIN32}ToWideChar({$ENDIF}Params[Index].Name + {$IFDEF WIN32}){$ENDIF}; + Info.DataType := FDBToolsService.DataTypeToDBToolsType(Params[Index].DataType); + Info.Value := Params[Index].Value; + case Params[Index].ParamType of + ptUnknown, + ptInput: + Info.ParameterType := ParameterType_Input; + ptOutput: + Info.ParameterType := ParameterType_Output; + ptInputOutput: + Info.ParameterType := ParameterType_InputOutput; + ptResult: + Info.ParameterType := ParameterType_ReturnValue; + end; +end; + +function TSqlSource.Get_ParameterCount: integer; +begin + if (Params <> nil) and (Params.Count > FParameterCount) then + Set_ParameterCount(Params.Count); + Result := FParameterCount; +end; + +procedure TSqlSource.Set_ParameterCount({$IFDEF WIN32}const {$ENDIF}Value: integer); +var + i, n: integer; +begin + if Params = nil then + Exit; + FParameterCount := Value; + SetLength(FParameterSetted, Value); + n := Params.Count; + for i := 0 to Value - 1 do begin + if i >= n then + Params.Add; + FParameterSetted[i] := False; + end; +end; + +procedure TSqlSource.SetParameter({$IFDEF WIN32}const {$ENDIF}Index: integer; Info: CommandParameterInfo); +var + i, j: integer; + TempParam: TDAParam; +begin + Assert(Index < Get_ParameterCount); + for i := 0 to Params.Count - 1 do + if Params[i].Name = Info.Name then begin + if i <> Index then begin + TempParam := Params[Index]; + Params[Index] := Params[i]; + Params[i] := TempParam; + end; + Break; + end; + with TDAParam(Params[Index]) do begin + Name := Info.Name; + DataType := FDBToolsService.DBToolsTypeToDataType(Info.DataType, DataType); + Value := Variant(Info.Value); + case Info.ParameterType of + ParameterType_Input: + ParamType := ptInput; + ParameterType_Output: + ParamType := ptOutput; + ParameterType_InputOutput: + ParamType := ptInputOutput; + ParameterType_ReturnValue: + ParamType := ptResult; + end; + end; + for i := FParameterCount - 1 downto 0 do + if not FParameterSetted[i] then + Break + else + if i = 0 then + for j := Params.Count - 1 downto FParameterCount do + Params.Delete(j); +end; + +procedure TSqlSource.CheckRename; +begin + if (FLastName <> Get_Name) then begin + if FSqlSourceNotifier <> nil then + FSqlSourceNotifier.OnSqlSourceRenamed(Get_Name); + FLastName := Get_Name; + end; +end; + +procedure TSqlSource.CheckConnectionChange(InternalCheck: boolean); +var + NewConnection: TCustomDAConnection; + NewConnectionString: string; +begin + NewConnection := FDBToolsService.GetConnection(FComponent); + if InternalCheck and (FLastConnection = NewConnection) then + Exit; + NewConnectionString := FDBToolsService.GetNativeConnectionString(NewConnection); + if NewConnectionString <> FLastConnectionString then begin + FLastConnectionString := NewConnectionString; + if not InternalCheck and (FSqlSourceNotifier <> nil) then + FSqlSourceNotifier.OnSqlSourceChanged; + end; +end; + +procedure TSqlSource.CheckChanges; +begin + CheckRename; + CheckConnectionChange(True); + if GetSqlText <> FComponentSQL then begin + if FSqlSourceNotifier <> nil then + FSqlSourceNotifier.OnSqlSourceChanged; + FComponentSQL := GetSqlText; + end; +end; + +{ TDACSqlEditorFrame } + +procedure TDACSqlEditorFrame.CheckModified; +begin + if (SqlEditor <> nil) and (SqlEditor.Modified) then begin + if Assigned(FOnChange) then + FOnChange(Self); + if Assigned(FOnExit) then + FOnExit(Self); + SqlEditor.Modified := False; + end; +end; + +constructor TDACSqlEditorFrame.Create(AOwner: TComponent; Component: TComponent; DBToolsService: TDBToolsService); +var + i: integer; +begin + inherited Create(AOwner); + + FInInit := True; + FComponent := Component; + FDBToolsService := DBToolsService; + BevelOuter := bvNone; + FStatementType := stQuery; + TabStop := True; + i := Length(DBTools.FDACSqlEditorFrames); + SetLength(DBTools.FDACSqlEditorFrames, i + 1); + DBTools.FDACSqlEditorFrames[i] := Self; +end; + +destructor TDACSqlEditorFrame.Destroy; +var + st: TStatementType; + i, j, n: integer; +begin + for st := Low(TStatementType) to High(TStatementType) do + if FSqlEditors[st] <> nil then + FDBToolsService.ReturnSqlEditor(FSqlEditors[st]); + n := High(DBTools.FDACSqlEditorFrames); + for i := 0 to n do + if DBTools.FDACSqlEditorFrames[i] = Self then begin + for j := i to n - 1 do + DBTools.FDACSqlEditorFrames[j] := DBTools.FDACSqlEditorFrames[j + 1]; + SetLength(DBTools.FDACSqlEditorFrames, n); + Break; + end; + + inherited; +end; + +procedure TDACSqlEditorFrame.EndInit; +begin + FInInit := False; +end; + +procedure TDACSqlEditorFrame.InternalResize; +begin + if SqlEditor <> nil then + Windows.SetWindowPos(GetSqlEditorHandle, 0, 0, 0, ClientWidth, ClientHeight, SWP_NOZORDER or SWP_SHOWWINDOW); +end; + +procedure TDACSqlEditorFrame.Resize; +begin + InternalResize; + inherited; +end; + +procedure TDACSqlEditorFrame.SetFocus; +begin + inherited; + + if SqlEditor <> nil then + Windows.SetFocus(GetSqlEditorHandle); +end; + +procedure TDACSqlEditorFrame.WndProc(var Message: TMessage); +begin + if not FInInit and (Message.Msg = WM_SETFOCUS) and (SqlEditor <> nil) then + Windows.SetFocus(GetSqlEditorHandle) + else + inherited; +end; + +procedure TDACSqlEditorFrame.CheckConnectionChange; +var + NewConnectionString: string; + st: TStatementType; +begin + Assert(SqlEditor <> nil); + + NewConnectionString := FDBToolsService.GetNativeConnectionString(FComponent); + if NewConnectionString <> FLastConnectionString then begin + FLastConnectionString := NewConnectionString; + + if FLastConnectionString <> '' then + for st := Low(TStatementType) to High(TStatementType) do + if FSqlEditors[st] <> nil then + FSqlEditors[st].SetConnection({$IFDEF WIN32}ToWideChar({$ENDIF} + FLastConnectionString + {$IFDEF WIN32}){$ENDIF}); + end; +end; + +function TDACSqlEditorFrame.GetSqlEditorHandle: HWND; +begin + Assert(SqlEditor <> nil); + + Result := SqlEditor.Handle{$IFDEF CLR}.ToInt32{$ENDIF}; +end; + +function TDACSqlEditorFrame.GetText: string; +begin + if SqlEditor <> nil then + Result := SqlEditor.Text + else + Result := ''; +end; + +procedure TDACSqlEditorFrame.SetText(const Value: string); +begin + if SqlEditor <> nil then + SqlEditor.Text := {$IFDEF WIN32}ToWideChar(Value){$ELSE}Value{$ENDIF}; +end; + +procedure TDACSqlEditorFrame.SetReadOnly(Value: boolean); +var + st: TStatementType; +begin + if Value <> FReadOnly then begin + FReadOnly := Value; + for st := Low(TStatementType) to High(TStatementType) do + if FSqlEditors[st] <> nil then + FSqlEditors[st].ReadOnly := Value; + SetStatementType(FStatementType); + end; +end; + +function TDACSqlEditorFrame.GetSqlEditor: ISqlEditor; +begin + if (not ReadOnly) or (FSqlEditors[FStatementType] <> nil) then + Result := FSqlEditors[FStatementType] + else + Result := FSqlEditors[stQuery]; +end; + +procedure TDACSqlEditorFrame.SetStatementType(const Value: TStatementType); +var + NewStatementType: TStatementType; + FHide, FShow, FFocused: boolean; +begin + if FReadOnly and (FSqlEditors[Value] = nil) then + NewStatementType := stQuery + else + NewStatementType := Value; + FHide := NewStatementType <> FStatementType; + FShow := FHide; + if FSqlEditors[NewStatementType] = nil then + if (FSqlEditors[stQuery] <> nil) and (FSqlEditors[stQuery].Text = '') then begin + FSqlEditors[NewStatementType] := FSqlEditors[stQuery]; + FSqlEditors[stQuery] := nil; + FHide := False; + FShow := False; + end + else begin + FSqlEditors[NewStatementType] := FDBToolsService.GetSqlEditor; + if FLastConnectionString <> '' then + FSqlEditors[NewStatementType].SetConnection({$IFDEF WIN32}ToWideChar({$ENDIF} + FLastConnectionString + {$IFDEF WIN32}){$ENDIF}); + FSqlEditors[NewStatementType].Text := {$IFDEF WIN32}nil{$ELSE}''{$ENDIF}; + FShow := True; + end; + if FHide and (FSqlEditors[NewStatementType] <> nil) then begin + Windows.SetParent(GetSqlEditorHandle, MAXDWORD - 2{HWND_MESSAGE}); + FFocused := Windows.GetFocus = GetSqlEditorHandle; + end + else + FFocused := False; + + FStatementType := Value; + if FShow then begin + Windows.SetParent(GetSqlEditorHandle, Handle); + FSqlEditors[NewStatementType].ReadOnly := FReadOnly; + InternalResize; + if FFocused then + Windows.SetFocus(GetSqlEditorHandle); + end; +end; + +{ TDBTools } + +procedure TDBTools.CheckDBToolsChanges(Control: TWinControl); +var + i: integer; +begin + if Control <> nil then + for i := 0 to Control.ComponentCount - 1 do + if Control.Components[i] is TDACSqlEditorFrame then + TDACSqlEditorFrame(Control.Components[i]).CheckModified; +end; + +function TDBTools.CreateDBToolsService(const DADesignUtils: TDADesignUtilsClass; + const ClassID: TGUID;{$IFDEF CLR} const ServiceShortName: string; {$ENDIF} + const DefaultConnectionStr: string; const ProviderKey: string; + out ServiceVersion: int64; out NeedToCheck: TNeedToCheckDbTools): TObject; +var + n: integer; +{$IFDEF CLR} + ServiceType: System.Type; + Obj: TObject; +{$ELSE} + Obj: IUnknown; +{$ENDIF} + DBToolsService: TDBToolsService; + +{$IFDEF CLR} + function FindType(const TypeFullName, AssemblyNameFilter: string; out AType: System.Type): boolean; + var + i, j: integer; + LoadedAssemblies: array of Assembly; + Types: array of System.Type; + begin + Result := False; + LoadedAssemblies := System.AppDomain.CurrentDomain.GetAssemblies; + for i := 0 to Length(LoadedAssemblies) - 1 do + if (LoadedAssemblies[i].FullName.ToLower.IndexOf(AssemblyNameFilter.ToLower) >= 0) then begin + Types := LoadedAssemblies[i].GetExportedTypes; + for j := 0 to Length(Types) - 1 do + if Types[j].FullName = TypeFullName then begin + AType := Types[j]; + Result := True; + Exit; + end; + end; + end; +{$ENDIF} + +begin + Result := nil; + Obj := nil; + try + NeedToCheck := ncNoAddin; + ServiceVersion := 0; + DADesignUtils.SetDBToolsDownloadParams(False, False); + if FIDEServices = nil then begin + {$IFDEF WIN32} + Supports(BorlandIDEServices, IIDEServices, FIDEServices); + Supports(BorlandIDEServices, IModuleServices, FModuleServices); + {$ELSE} + FIDEServices := BorlandIDE.OTAService; + FModuleServices := BorlandIDE.ModuleServices; + {$ENDIF} + end; + + NeedToCheck := CheckDevTools(ClassID, ProviderKey, DADesignUtils, ServiceVersion); + if NeedToCheck <> ncNone then + Exit; + {$IFDEF CLR} + if FindType('CoreLab.DbTools.' + ServiceShortName + '.' + ServiceShortName + 'DbToolsService', ServiceShortName, ServiceType) then + {$ENDIF} + begin + {$IFDEF WIN32} + if not FNeedUninitialize then + FNeedUninitialize := Succeeded(CoInitialize(nil)); + Obj := CreateComObject(ClassID); + {$ELSE} + Obj := BorlandIDE.GetService(ServiceType); + {$ENDIF} + end; + if Obj = nil then begin + NeedToCheck := ncExpired; + Exit; + end + else begin + if FDesignNotification = nil then begin + FDesignNotification := TDBToolsDesignNotification.Create; + RegisterDesignNotification(FDesignNotification); + end; + DBToolsService := TDBToolsService.Create(DADesignUtils, Obj, DefaultConnectionStr); + Result := DBToolsService; + n := Length(FDBToolsServices); + SetLength(FDBToolsServices, n + 1); + FDBToolsServices[n] := DBToolsService; + end; + except + NeedToCheck := ncExpired; + end; +end; + +function TDBTools.CheckDevTools(const ClassID: TGUID; const ProviderKey: string; const DADesignUtils: TDADesignUtilsClass; out ServiceVersion: int64): TNeedToCheckDbTools; + + function GetFileVersion(Filename: string): int64; + var + {$IFDEF CLR} + VersionInfo: FileVersionInfo; + {$ELSE} + Handle, + FixedFileInfoLen, + VersionDataLen: DWORD; + VersionData: TBytes; + FixedFileInfo: ^VS_FIXEDFILEINFO; + {$ENDIF} + begin + Result := 0; + if FileExists(Filename) then begin + {$IFDEF CLR} + VersionInfo := FileVersionInfo.GetVersionInfo(Filename); + Result := + VersionInfo.FileMajorPart * $1000000000000 + + VersionInfo.FileMinorPart * $100000000 + + VersionInfo.FileBuildPart * $10000 + + VersionInfo.FilePrivatePart; + {$ELSE} + VersionDataLen := GetFileVersionInfoSize(PChar(Filename), Handle); + SetLength(VersionData, VersionDataLen); + if GetFileVersionInfo(PChar(Filename), Handle, VersionDataLen, VersionData) and + VerQueryValue(VersionData, '\', Pointer(FixedFileInfo), FixedFileInfoLen) then + Result := FixedFileInfo.dwFileVersionMS * $100000000 + FixedFileInfo.dwFileVersionLS; + {$ENDIF} + end; + end; + +begin + Result := ncNoAddin; + ServiceVersion := 0; + with TRegistry.Create do + try + try + RootKey := HKEY_CLASSES_ROOT; + if OpenKey({$IFDEF WIN32}'CLSID\' + GUIDToString(ClassID) + '\InprocServer32' + {$ELSE}'CLSID\{' + GUIDToString(ClassID) + '}\InprocServer32'{$ENDIF}, False) + and ValueExists('CodeBase') then begin + Result := ncIncompatible; + ServiceVersion := GetFileVersion(ReadString('CodeBase')); + CloseKey; + if ServiceVersion <> 0 then + Result := ncNone; + end + else begin + RootKey := HKEY_LOCAL_MACHINE; + if OpenKey('SOFTWARE\CoreLab\Database Developer Tools\DatabaseProviders\' + ProviderKey, False) + and ValueExists('Assembly') then begin + Result := ncIncompatible; + ServiceVersion := GetFileVersion(ReadString('Assembly')); + CloseKey; + end; + end; + except + //Silent + end; + finally + Free; + if Result <> ncNone then begin + DADesignUtils.SetDBToolsDownloadParams(False, Result = ncIncompatible); + CheckForTools(Result = ncIncompatible); + end; + end; +end; + +function TDBTools.MenuItemsAvailable: boolean; +var + Incompatible: boolean; +begin + Result := FCurrentDADesignUtils.DBToolsAvailable; + Incompatible := FCurrentDADesignUtils.NeedToCheckDbTools = ncIncompatible; + if not Result then begin + FCurrentDADesignUtils.SetDBToolsDownloadParams(True, Incompatible); + CheckForTools(Incompatible); + end; +end; + +procedure TDBTools.EditSql(Sender: TObject); +begin + if MenuItemsAvailable then + FCurrentDBToolsService.EditSql(False); +end; + +procedure TDBTools.QueryBuilder(Sender: TObject); +begin + if MenuItemsAvailable then + FCurrentDBToolsService.EditSql(True); +end; + +procedure TDBTools.FindInDatabaseExplorer(Sender: TObject); +begin + if MenuItemsAvailable then + FCurrentDBToolsService.FindInDatabaseExplorer; +end; + +procedure TDBTools.EditDatabaseObject(Sender: TObject); +begin + if MenuItemsAvailable then + FCurrentDBToolsService.EditDatabaseObject; +end; + +procedure TDBTools.ExecuteSql(Sender: TObject); +begin + if MenuItemsAvailable then + FCurrentDBToolsService.ExecuteSql(False); +end; + +procedure TDBTools.Compile(Sender: TObject); +begin + if MenuItemsAvailable then + FCurrentDBToolsService.Compile(False); +end; + +procedure TDBTools.CompileDebug(Sender: TObject); +begin + if MenuItemsAvailable then + FCurrentDBToolsService.Compile(True); +end; + +procedure TDBTools.DebugSql(Sender: TObject); +begin + if MenuItemsAvailable then + FCurrentDBToolsService.ExecuteSql(True); +end; + +procedure TDBTools.RetrieveData(Sender: TObject); +begin + if MenuItemsAvailable then + FCurrentDBToolsService.RetrieveData(True); +end; + +procedure TDBTools.PrepareMenu(Designer: IDesigner; Component: TComponent; DADesignUtils: TDADesignUtilsClass); +begin + FCurrentDADesignUtils := DADesignUtils; + FCurrentDBToolsService := GetDBToolsService(DADesignUtils); + if FCurrentDBToolsService <> nil then + with FCurrentDBToolsService do begin + FCurrentDesigner := Designer; + FCurrentComponent := Component; + end; +end; + +function TDBTools.HasDACSqlEditorFrame(Memo: TWinControl): boolean; +begin + FLastMemo := Memo; + FLastDACSqlEditorFrame := TDACSqlEditorFrame(Memo.Owner.FindComponent(Memo.Name + '_dbt')); + Result := FLastDACSqlEditorFrame <> nil; +end; + +function TDBTools.GetDACSqlEditorFrame(Memo: TWinControl): TDACSqlEditorFrame; +begin + if Memo <> FLastMemo then + HasDACSqlEditorFrame(Memo); + Result := FLastDACSqlEditorFrame; +end; + +procedure TDBTools.CheckConnectionChanges; +var + i: integer; +begin + for i := 0 to High(FDACSqlEditorFrames) do + FDACSqlEditorFrames[i].CheckConnectionChange; +end; + +function TDBTools.GetActiveDACSqlEditorFrame: TWinControl; +var + i: integer; + Handle: HWND; + ClassName: {$IFDEF WIN32}PChar{$ELSE}StringBuilder{$ENDIF}; +begin + Result := nil; +{$IFDEF WIN32} + GetMem(ClassName, 1024); +{$ELSE} + ClassName := StringBuilder.Create; + ClassName.Capacity := 1024; +{$ENDIF} + try + Handle := GetFocus; + repeat + Handle := GetParent(Handle); + if Handle = 0 then + Exit; + GetClassName(Handle, ClassName, 1024); + {$IFDEF WIN32} + until ClassName = TDACSqlEditorFrame.ClassName; + {$ELSE} + until Pos(TDACSqlEditorFrame.ClassName, ClassName.ToString) <> 0; + {$ENDIF} + + for i := 0 to High(FDACSqlEditorFrames) do + if FDACSqlEditorFrames[i].Handle = Handle then begin + Result := FDACSqlEditorFrames[i]; + Break; + end; + finally + {$IFDEF WIN32} + FreeMem(ClassName); + {$ELSE} + ClassName.Free; + {$ENDIF} + end; +end; + +procedure TDBTools.CreateMenuActions; +var + VerbIdx: TDBToolsVerb; +{$IFDEF WIN32} + Bitmap: TBitmap; + MenuImages: TImageList; +{$ENDIF} +begin +{$IFDEF WIN32} + MenuImages := TImageList.Create(nil); + Bitmap := TBitmap.Create; + Bitmap.LoadFromResourceName(HInstance, 'MENUICONS'); + MenuImages.AddMasked(BitMap, $ff00ff); + Bitmap.Free; + (BorlandIDEServices as INTAServices).AddImages(MenuImages); + MenuImages.Free; +{$ENDIF} + FMenuManager := TActionManager.Create(nil); + for VerbIdx := Low(TDBToolsVerb) to High(TDBToolsVerb) do begin + FMenuActions[VerbIdx] := TAction.Create(FMenuManager); + with FMenuActions[VerbIdx] do + case VerbIdx of + dbtEditSql: begin + Caption := 'Edit SQL'; + OnExecute := EditSql; + end; + dbtQueryBuilder: begin + Caption := 'Query Builder'; + OnExecute := QueryBuilder; + end; + dbtFindInDatabaseExplorer: begin + Caption := 'Find in Database Explorer'; + OnExecute := FindInDatabaseExplorer; + end; + dbtEditDatabaseObject: begin + Caption := 'Edit object'; + OnExecute := EditDatabaseObject; + end; + dbtExecuteSql: begin + Caption := 'Execute'; + OnExecute := ExecuteSql; + end; + dbtDebugSql: begin + Caption := 'Step Into'; + OnExecute := DebugSql; + end; + dbtRetrieveData: begin + Caption := 'Retreive data'; + OnExecute := RetrieveData; + end; + dbtCompile: begin + Caption := 'Recompile'; + OnExecute := Compile; + end; + dbtCompileDebug: begin + Caption := 'Recompile with debug info'; + OnExecute := CompileDebug; + end; + end; + {$IFDEF WIN32} + FMenuActions[VerbIdx].ImageIndex := Ord(VerbIdx); + (BorlandIDEServices as INTAServices).AddActionMenu('', FMenuActions[VerbIdx], nil); + {$ENDIF} + end; +end; + +constructor TDBTools.Create; +begin + inherited; + CreateMenuActions; +end; + +destructor TDBTools.Destroy; +begin + FMenuManager.Free; + if FDesignNotification <> nil then + UnregisterDesignNotification(FDesignNotification); +{$IFDEF WIN32} + if FNeedUninitialize then + CoUninitialize; +{$ENDIF} + + inherited; +end; + +function TDBTools.GetDesignerName(Designer: IDesigner): string; +{$IFDEF CLR} +var + Ptr: IntPtr; +{$ENDIF} +begin +{$IFDEF CLR} + Ptr := Marshal.GetIUnknownForObject(Designer); +{$ENDIF} + Result := 'Designer_' + IntToHex(Integer({$IFDEF WIN32}Designer{$ELSE}Ptr{$ENDIF}), 8) + FDesignNotification.FDebugStr; +{$IFDEF CLR} + Marshal.Release(Ptr); +{$ENDIF} +end; + +function TDBTools.GetMenuActions(Index: TDBToolsVerb): TAction; +begin + Result := FMenuActions[Index]; +end; + +procedure TDBTools.ReplaceMemo(var Memo: TMemo; DADesignUtils: TDADesignUtilsClass; Component: TComponent); +var + NewMemo: TWinControl; + OldName: string; + C: TComponent; + DBToolsService: TDBToolsService; +begin + DBToolsService := GetDBToolsService(DADesignUtils); + if (DBToolsService = nil) or HasDACSqlEditorFrame(Memo) then + Exit; + + NewMemo := TDACSqlEditorFrame.Create(Memo.Owner, Component, DBToolsService); + with TDACSqlEditorFrame(NewMemo) do begin + Parent := Memo.Parent; + Left := Memo.Left; + Top := Memo.Top; + Width := Memo.Width; + Height := Memo.Height; + Align := Memo.Align; + TabOrder := Memo.TabOrder; + Anchors := Memo.Anchors; + HelpContext := Memo.HelpContext; + ReadOnly := Memo.ReadOnly; + OnChange := Memo.OnChange; + OnExit := Memo.OnExit; + //OnKeyDown, OnKeyPress + + StatementType := stQuery; + CheckConnectionChange; + end; + + if Memo.Owner <> nil then begin + Memo.OnExit := nil; + C := NewMemo.Owner; + while C <> nil do begin + if C is TCustomForm then begin + if TCustomForm(C).ActiveControl = Memo then begin + TCustomForm(C).ActiveControl := NewMemo; + NewMemo.SetFocus; + end; + Break; + end; + C := C.Owner; + end; + end; + OldName := Memo.Name; + Memo.Hide; + + NewMemo.Name := OldName + '_dbt'; + TDACSqlEditorFrame(NewMemo).EndInit; +end; + +procedure TDBTools.DesignerClosing(const FileName: string); +var + i: integer; + Designer: IDesigner; + DesignerName: string; +begin + Designer := FDesignNotification.SqlSourceList.FindDesigner(FileName); + if Designer = nil then + Exit; + DesignerName := GetDesignerName(Designer); + for i := 0 to Length(FDBToolsServices) - 1 do + FDBToolsServices[i].SqlService.DesignerClosing(DesignerName); +end; + +{ TDBToolsService } + +constructor TDBToolsService.Create(ADADesignUtils: TDADesignUtilsClass; ASqlService: {$IFDEF WIN32}IUnknown{$ELSE}TObject{$ENDIF}; ADefaultConnectionStr: string); +begin + inherited Create; + + FConnectionStrList := TStringList.Create; + FConnectionsList := TStringList.Create; + FDefaultConnectionList := TStringList.Create; + FDADesignUtils := ADADesignUtils; + +{$IFDEF WIN32} + ASqlService.QueryInterface(IDbToolsService, FSqlService); +{$ELSE} + FSqlService := ASqlService as IDbToolsService; +{$ENDIF} + ConnStrToList(ADefaultConnectionStr, FDefaultConnectionList); +end; + +destructor TDBToolsService.Destroy; +begin +{$IFDEF WIN32} + PInteger(@FSqlService)^ := 0; // To prevent _Release calling +{$ENDIF} + FDefaultConnectionList.Free; + FConnectionStrList.Free; + FConnectionsList.Free; + + inherited; +end; + +function TDBToolsService.DataTypeToDBToolsType(AType: TFieldType): integer; +var + i: integer; +begin + Assert(Length(FParamTypeMaps) > 0); + Result := FParamTypeMaps[0].DBToolsType; + for i := 0 to High(FParamTypeMaps) do + if FParamTypeMaps[i].DACType = AType then begin + Result := FParamTypeMaps[i].DBToolsType; + Break; + end; +end; + +function TDBToolsService.DBToolsTypeToDataType(AType: integer; OldType: TFieldType): TFieldType; +var + i: integer; +begin + Result := ftUnknown; + for i := 0 to High(FParamTypeMaps) do + if FParamTypeMaps[i].DBToolsType = AType then begin + if (Result = ftUnknown) or (FParamTypeMaps[i].DACType = OldType) then + Result := FParamTypeMaps[i].DACType; + if Result = OldType then + Break; + end + else + if Result <> ftUnknown then + Break; +end; + +procedure TDBToolsService.BeginConnectionStrGetting(const ConnectionStrList: TStringList); +begin + FUsedConnectionStrList := ConnectionStrList; + SetLength(FUsedConnectionCompareFlags, 0); +end; + +procedure TDBToolsService.PutConnectionParam(const ConnectionParam: string; const CompareFlag: TCompareFlag = cfNormal); +var + i: integer; +begin + i := Length(FUsedConnectionCompareFlags); + Assert (i < FDefaultConnectionList.Count); + FUsedConnectionStrList.Values[FDefaultConnectionList.Names[i]] := ConnectionParam; + SetLength(FUsedConnectionCompareFlags, i + 1); + FUsedConnectionCompareFlags[i] := CompareFlag; +end; + +procedure TDBToolsService.SkipConnectionParams(const Count: integer); +var + i, j: integer; +begin + i := Length(FUsedConnectionCompareFlags); + Assert (i + Count <= FDefaultConnectionList.Count); + SetLength(FUsedConnectionCompareFlags, i + Count); + for j := i to i + Count - 1 do + FUsedConnectionCompareFlags[j] := cfNone; +end; + +class function TDBToolsService.GetConnectionParamStr(const ParamName, ParamValue: string): string; +var + i: integer; + QuoteChar: char; +begin + Result := ParamName + '='; + if Pos('''', ParamValue) > 0 then + QuoteChar := '"' + else + if Pos('"', ParamValue) > 0 then + QuoteChar := '''' + else + if (Pos(' ', ParamValue) > 0) or (Pos(';', ParamValue) > 0) then + QuoteChar := '"' + else + QuoteChar := #0; + if QuoteChar <> #0 then + Result := Result + QuoteChar; + for i := 1 to Length(ParamValue) do begin + if (QuoteChar <> #0) and (ParamValue[i] = QuoteChar) then + Result := Result + QuoteChar; + Result := Result + ParamValue[i]; + end; + if QuoteChar <> #0 then + Result := Result + QuoteChar; + Result := Result + ';'; +end; + +function TDBToolsService.GetConnection(const Component: TComponent): TCustomDAConnection; +begin + if Component = nil then + Result := nil + else + if Component is TCustomDAConnection then + Result := TCustomDAConnection(Component) + else + Result := DADesignUtils.UsedConnection(Component); +end; + +function TDBToolsService.GetNativeConnectionString(const Component: TComponent): string; +var + i, n: integer; + DefStr: string; + Connection: TCustomDAConnection; + ConnectionList: TStringList; +begin + Result := ''; + Connection := GetConnection(Component); + if Connection <> nil then begin + ConnectionList := TStringList.Create; + try + BeginConnectionStrGetting(ConnectionList); + DADesignUtils.GetDBToolsConnectionList(Connection); + n := ConnectionList.Count - 1; + for i := n downto 0 do begin + DefStr := FDefaultConnectionList.Values[ConnectionList.Names[i]]; + if (DefStr <> '') and (DefStr = ConnectionList.ValueFromIndex[i]) then + ConnectionList.Delete(i); + end; + for i := 0 to ConnectionList.Count - 1 do + Result := Result + GetConnectionParamStr(ConnectionList.Names[i], ConnectionList.ValueFromIndex[i]); + finally + ConnectionList.Free; + end; + end; +end; + +function TDBToolsService.GetConnectionString(const Component: TComponent): TString; +begin + Result := {$IFDEF WIN32}ToWideChar({$ENDIF} + GetNativeConnectionString(Component) + {$IFDEF WIN32}){$ENDIF}; +end; + +function TDBToolsService.GetConnectionStringObjectTypeAndFullName(const Component: TComponent; out ConnectionString, ObjectType, FullName: TString): boolean; +begin + ConnectionString := GetConnectionString(Component); + Result := ConnectionString <> ''; + if Result then begin + FullName := {$IFDEF WIN32}ToWideChar({$ENDIF} + DADesignUtils.GetFullName(Component){$IFDEF WIN32}){$ENDIF}; + ObjectType := {$IFDEF WIN32}ToWideChar({$ENDIF} + DADesignUtils.GetObjectType(Component){$IFDEF WIN32}){$ENDIF}; + if not(Component is TCustomDAConnection) then + Result := Length(FullName) > 0; + end + else begin + FullName := {$IFDEF WIN32}nil{$ELSE}''{$ENDIF}; + ObjectType := {$IFDEF WIN32}nil{$ELSE}''{$ENDIF}; + end; +end; + +procedure TDBToolsService.GetConnections(NameList: TStrings; Condition: string = ''); +var + ConnectionInfoArray: TConnectionInfoArray; + i: integer; + Connection: {$IFDEF WIN32}PConnectionInfo{$ELSE}ConnectionInfo{$ENDIF}; +begin + ConnectionInfoArray := FSqlService.GetConnections; + NameList.BeginUpdate; + FConnectionsList.BeginUpdate; +{$IFDEF WIN32} + Connection := AccessData(ConnectionInfoArray); +{$ENDIF} + try + FConnectionsList.Clear; + NameList.Clear; + for i := 0 to {$IFDEF WIN32}DataHigh{$ELSE}High{$ENDIF}(ConnectionInfoArray) do begin + {$IFDEF CLR} + Connection := ConnectionInfoArray[i]; + {$ENDIF} + if (Condition = '') or (Pos(Condition, Connection.ConnectionString) > 0) then begin + NameList.Add(Connection.Name); + FConnectionsList.Add(GetConnectionValueStr(Connection.Name) + Connection.ConnectionString); + end; + {$IFDEF WIN32} + Inc(Connection); + {$ENDIF} + end; + finally + NameList.EndUpdate; + FConnectionsList.EndUpdate; + {$IFDEF WIN32} + UnaccessData(ConnectionInfoArray); + {$ENDIF} + end; +end; + +function TDBToolsService.FindConnectionName(AConnection: TCustomDAConnection): string; +var + i, j: integer; + AConnectionStrList: TStringList; + Str1, Str2, DefStr: string; + + function ToCommonCase(const s: string): string; + var + ts: string; + begin + Result := s; + if FUsedConnectionCompareFlags[j] = cfNormal then begin + ts := Trim(Result); + if (Length(ts) < 2) or (ts[1] <> '"') or (ts[Length(ts)] <> '"') then + Result := UpperCase(Result); + end; + end; + +begin + AConnectionStrList := TStringList.Create; + try + BeginConnectionStrGetting(AConnectionStrList); + DADesignUtils.GetDBToolsConnectionList(AConnection); + i := Length(FUsedConnectionCompareFlags); + SetLength(FUsedConnectionCompareFlags, FDefaultConnectionList.Count); + for j := i to FDefaultConnectionList.Count - 1 do + FUsedConnectionCompareFlags[j] := cfNormal; + for i := 0 to FConnectionsList.Count - 1 do begin + ConnStrToList(FConnectionsList[i], FConnectionStrList); + for j := 0 to FDefaultConnectionList.Count - 1 do begin + if FUsedConnectionCompareFlags[j] = cfNone then + Continue; + + DefStr := FDefaultConnectionList.ValueFromIndex[j]; + Str1 := ToCommonCase(AConnectionStrList.Values[FDefaultConnectionList.Names[j]]); + Str2 := ToCommonCase(FConnectionStrList.Values[FDefaultConnectionList.Names[j]]); + if (Str1 <> Str2) and (DefStr <> '') then begin + if Str1 = '' then + Str1 := ToCommonCase(DefStr); + if Str2 = '' then + Str2 := ToCommonCase(DefStr); + end; + if Str1 <> Str2 then + Break + else + if j = FDefaultConnectionList.Count - 1 then begin + Result := FConnectionStrList.Values[SConnectionName]; + Exit; + end; + end; + end; + Result := ''; + finally + AConnectionStrList.Free; + end; +end; + +function TDBToolsService.GetConnectionStrList(ConnectionName: string): TStringList; +var + i, j, k: integer; + s: string; +begin + Result := FConnectionStrList; + s := GetConnectionValueStr(ConnectionName); + for i := 0 to FConnectionsList.Count - 1 do + if (Length(FConnectionsList[i]) >= Length(s)) and + (Copy(FConnectionsList[i], 1, Length(s)) = s) then begin + ConnStrToList(Copy(FConnectionsList[i], Length(s) + 1, Length(FConnectionsList[i]) - Length(s)), Result); + + for j := 0 to FDefaultConnectionList.Count - 1 do begin + k := Result.IndexOfName(FDefaultConnectionList.Names[j]); + if k < 0 then + Result.Add(FDefaultConnectionList[j]) + else + if Result.ValueFromIndex[k] = '' then + Result[k] := FDefaultConnectionList[j]; + end; + Exit; + end; + Result.Clear; +end; + +procedure TDBToolsService.CheckConnection(const Component: TComponent); +var + Connection: TCustomDAConnection; +begin + Connection := GetConnection(Component); + if Connection = nil then + DatabaseError(SConnectionNotDefined); +end; + +procedure TDBToolsService.FindInDatabaseExplorer; +var + ConnectionString, ObjectType, FullName: TString; +begin + CheckConnection(FCurrentComponent); + if GetConnectionStringObjectTypeAndFullName(FCurrentComponent, ConnectionString, ObjectType, FullName) then + SqlService.FindInDatabaseExplorer(ConnectionString, ObjectType, FullName); +end; + +procedure TDBToolsService.EditDatabaseObject; +var + ConnectionString, ObjectType, FullName: TString; +begin + CheckConnection(FCurrentComponent); + if GetConnectionStringObjectTypeAndFullName(FCurrentComponent, ConnectionString, ObjectType, FullName) then + SqlService.EditDatabaseObject(ConnectionString, ObjectType, FullName); +end; + +procedure TDBToolsService.ExecuteSql(Debug: boolean); +var + SqlSource: TSqlSource; +begin + CheckConnection(FCurrentComponent); + SqlSource := GetSqlSource(FCurrentComponent, FCurrentDesigner); + SqlService.ExecuteSql(SqlSource, Debug); +end; + +procedure TDBToolsService.Compile(Debug: boolean); +var + SqlSource: TSqlSource; +begin + CheckConnection(FCurrentComponent); + SqlSource := GetSqlSource(FCurrentComponent, FCurrentDesigner, SCompilePrefix); + SqlService.ExecuteSql(SqlSource, Debug); +end; + +procedure TDBToolsService.RetrieveData(AsDocument: boolean); +var + SqlSource: TSqlSource; +begin + CheckConnection(FCurrentComponent); + SqlSource := GetSqlSource(FCurrentComponent, FCurrentDesigner); + SqlService.RetrieveData(SqlSource, AsDocument); +end; + +procedure TDBToolsService.EditSql(AsQuery: boolean); +var + SqlSource: TSqlSource; +begin + SqlSource := GetSqlSource(FCurrentComponent, FCurrentDesigner, SEditPrefix); + SqlService.EditSql(SqlSource, AsQuery, SqlSource.FSqlSourceNotifier); + if SqlSource.FSqlSourceNotifier = nil then + DBTools.DesignNotification.SqlSourceList.Delete(SqlSource); +end; + +function TDBToolsService.GetSqlEditor: ISqlEditor; +var + n: integer; +begin + n := Length(FSqlEditors) - 1; + if n >= 0 then begin + Result := FSqlEditors[n]; + SetLength(FSqlEditors, n); + end + else + SqlService.CreateSqlEditor(Result); +end; + +function TDBToolsService.GetSqlSource(Component: TComponent; Designer: IDesigner; SqlTextPrefix: string = ''): TSqlSource; +begin + Assert(DBTools.DesignNotification <> nil); + Result := DBTools.DesignNotification.SqlSourceList.Find(Component, SqlTextPrefix); + if Result = nil then begin + Result := TSqlSource.Create(Self, Component, Designer); + Result.SqlTextPrefix := SqlTextPrefix; + DBTools.DesignNotification.SqlSourceList.Add(Result); + end; +end; + +procedure TDBToolsService.ReturnSqlEditor(ASqlEditor: ISqlEditor); +var + n: integer; +begin + Windows.SetParent(ASqlEditor.Handle{$IFDEF CLR}.ToInt32{$ENDIF}, MAXDWORD - 2{HWND_MESSAGE}); + n := Length(FSqlEditors); + SetLength(FSqlEditors, n + 1); + FSqlEditors[n] := ASqlEditor; +end; + +procedure TDBToolsService.AddParamTypeMap(ADACType: TFieldType; ADBToolsType: integer); +var + n: integer; +begin + n := Length(FParamTypeMaps); + SetLength(FParamTypeMaps, n + 1); + with FParamTypeMaps[n] do begin + DACType := ADACType; + DBToolsType := ADBToolsType; + end; +end; + +{$IFDEF WIN32} +class function TDBToolsService.AccessData(const V: PSafeArray): pointer; +begin + if V = nil then + Result := nil + else + SafeArrayCheck(SafeArrayAccessData(V, Result)); +end; + +class procedure TDBToolsService.UnaccessData(const V: PSafeArray); +begin + if V <> nil then + SafeArrayCheck(SafeArrayUnaccessData(V)); +end; + +class function TDBToolsService.DataHigh(const V: PSafeArray): integer; +begin + if V = nil then + Result := -1 + else + SafeArrayGetUBound(V, 1, Result); +end; +{$ENDIF} + +function TDBToolsService.GetConnectionValueStr(ConnectionName: string): string; +begin + Result := SConnectionName + '=' + ConnectionName + ';'; +end; + +procedure TDBToolsService.ConnStrToList(ConnStr: string; const ConnList: TStrings); +var + ParamName, ParamValue: string; + QuoteChar: char; + Quoted: boolean; + i, l: integer; +begin + ConnStr := Trim(ConnStr); + ConnList.BeginUpdate; + ConnList.Clear; + try + if ConnStr = '' then + Exit; + if ConnStr[Length(ConnStr)] <> ';' then + ConnStr := ConnStr + ';'; + repeat + i := Pos('=', ConnStr); + if i <= 0 then + Break; + ParamName := Copy(ConnStr, 1, i); //with '=' + Inc(i); + QuoteChar := ConnStr[i]; + Quoted := {$IFDEF CLR}AnsiChar{$ENDIF}(QuoteChar) in ['''', '"']; + if Quoted then + Inc(i); + ParamValue := ''; + repeat + if i + Ord(Quoted) > Length(ConnStr) then + raise Exception.Create(SConnStrError); + + if Quoted then + if ConnStr[i] = QuoteChar then + if (ConnStr[i + 1] = QuoteChar) or (ConnStr[i + 1] = ';') then + Inc(i) + else + raise Exception.Create(SConnStrError); + + if ConnStr[i] = ';' then + Break + else + ParamValue := ParamValue + ConnStr[i]; + Inc(i); + until False; + ConnList.Add(ParamName + ParamValue); + l := Length(ConnStr) - i; + if l > 0 then + ConnStr := Copy(ConnStr, i + 1, l) + else + Break; + until False; + finally + ConnList.EndUpdate; + end; +end; + +{ TModuleNotifier} + +constructor TModuleNotifier.Create(const Module : IOTAModule); +begin + inherited Create; + + FModule := Module; +{$IFDEF WIN32} + FIndex := Module.AddNotifier(Self); +{$ELSE} + Include(Module.BeforeSave, BeforeSave); +{$ENDIF} +end; + +procedure TModuleNotifier.RemoveNotifier; +begin +{$IFDEF WIN32} + if Findex >= 0 then + begin + FModule.RemoveNotifier(FIndex); + FIndex := -1; + end; +{$ELSE} + Exclude(FModule.BeforeSave, BeforeSave); +{$ENDIF} + DBTools.DesignNotification.ModuleList.Delete(FModule); +end; + +destructor TModuleNotifier.Destroy; +begin + RemoveNotifier; + + inherited; +end; + +{$IFDEF WIN32} +procedure TModuleNotifier.Destroyed; +begin + RemoveNotifier; + FModule := nil; +end; + +procedure TModuleNotifier.AfterSave; +begin +end; + +procedure TModuleNotifier.BeforeSave; +begin +end; + +procedure TModuleNotifier.Modified; +begin +end; + +function TModuleNotifier.CheckOverwrite: Boolean; +begin + Result := True; +end; + +procedure TModuleNotifier.ModuleRenamed(const NewName: string); +begin +end; + +function TModuleNotifier.AllowSave: Boolean; +begin + if AllowSaveSwitch then + DBTools.DesignerClosing(FModule.FileName); + AllowSaveSwitch := not AllowSaveSwitch; + Result := True; +end; + +function TModuleNotifier.GetOverwriteFileNameCount: Integer; +begin + Result := 0; +end; + +function TModuleNotifier.GetOverwriteFileName(Index: Integer): string; +begin + Result := ''; +end; + +procedure TModuleNotifier.SetSaveFileName(const FileName: string); +begin +end; + +{$ELSE} +procedure TModuleNotifier.BeforeSave(Sender: TObject; e: EventArgs); +begin + DBTools.DesignerClosing(FModule.FileName); +end; +{$ENDIF} + +{ TModuleList } + +function TModuleList.IndexOf(Module: IOTAModule): integer; +var + i: integer; +begin + Result := -1; + for i := 0 to Count - 1 do + if TModuleNotifier(Items[i]).Module = Module then begin + Result := i; + Break; + end; +end; + +procedure TModuleList.Add(Module: IOTAModule); +begin + if IndexOf(Module) < 0 then + inherited Add(TModuleNotifier.Create(Module)); +end; + +procedure TModuleList.Delete(Module: IOTAModule); +var + Index: integer; +begin + Index := IndexOf(Module); + if Index >= 0 then + Delete(Index); +end; + +procedure TModuleList.Delete(Index: integer); +var + ModuleNotifier: TModuleNotifier; +begin + ModuleNotifier := TModuleNotifier(Items[Index]); + inherited Delete(Index); +{$IFDEF WIN32} + ModuleNotifier.Destroyed; +{$ENDIF} +end; + +function GetDBToolsService(DADesignUtilsClass: TDADesignUtilsClass): TDBToolsService; +begin + Result := TDBToolsService(DADesignUtilsClass.DBToolsService); +end; + +initialization + DBTools := TDBTools.Create; + +finalization + DBTools.Free; + +end. \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Design/DBToolsClient.res b/internal/4.10.0.10/1/Source/Design/DBToolsClient.res new file mode 100644 index 0000000000000000000000000000000000000000..54d2e5f0077617ebafa24cc05c701eb37c61b262 GIT binary patch literal 7032 zcmeI0X;4(z6~|kW%9m8CCP`H)YgLk}Nlm3DDJI6*tTD{u)HtG`C{g1=sUYg0sGy*f zfJ+kx1r%9TT4WIr6&H{eun`>gRhp&Qng*JEX`uJ*<^Q;F=jAmvYE?d@W?mgG=f3{m z<(=O<_ug)SKp^-%{uqY*!Tqo6t=|X)j<~}x4uUm;m4dZ`je=EzPX#XU+~$;yZ~W?q z^Nrqu6NSGw@V7+pOL7~1@GpiPk;#rZ6R>^tqDI88p{ETObXI!#AMrnma=}l(vo~Y6 zZ;RQoxv{mQBJNVmhK<}ffS1*5HckxbhkJF(PEAjXy0c-XwQ~CTv#EN?WVLvrA{R7i zlULQ#hPDnct#x&MJFblKdUPY&bM<>KX}k{q=>J#Vo&Voz)H>IDyS)#uSOHilxetQ) zGYn(3m@EdJSu<^%8Z(S4bpzd6MXS1_ex{{TRW0W6f}S+78gwHO9)-?7gXw3R*y_1s z!N2&`T4Keyx1HCy{3X8PY}>@Hm^2~-FQaC9SXMtIt?aKaQB)SnOLIGlZp$8}H{TOA z-HLBWzf_YHR+V@fOnE*3*z*^!fsDWC%-4CHzf9F{%jbtSeRgnzlh67U`&^fMul-<; zGv2*-J-=LLYv_>Zxf(ov{N{g#e(^=I?^gx8Jf7^?(SG>QGf&U-gZmG@_dc1!?KmMf z{y=u+@~1o-{n}vDP>?fH)XN`>Xj@AQ z99%6m6&RQJDHl$0c|lM3;wj*O7i$q7Ce;|ii>#b}UPARODT&lwF3plNd1>*vq9B8^ z(Ar;U=)T`w5P8AJZD-IaZj?x$W}VusRqr|fiUPN!JX$lkeL|*X!_~Y(gWoc}9t*uFA;B^6@>j z!R^xaZ6yZ|f)`y6b48Je5YW&P@n?B8)S)zvDb=!CE-#{|+ZG#MWZC>K#?#O9V)H9A zPH5688LPo)QR}CA^opkgrSX1SzvKoAkI!~jn*d(yQ_rZ*Ww5;TBmKHT`LgQ0;HBwo z#EwRzM4LOF{9yf!tuKSDrJ?%zCZ{M@$Aq1qmp#5mda$2gt!0JM()`Ba+-h-lMPBAN z_tQ%5BGIlrPLHEAi3r?dHJef+L#-x5)NyZ|2Ttx@Z_#Od+*X*i)5s}24oa*WdtE-n zphVBpjEM8wFJ98*<&I}&be$8n1P6jwv7cX&-`o*eoDvN#G{vaXDrK|Gq#D(9HF9}D z&jOm?w(#!3XqBgD*F!l&QtWB&t&x5iPBsib!;c0Xq5+3fbTb~EV+*qy z4Hmr?$ng4Mc`=R;8b4#L6Bp8W za&u3JD=f#uDQc4=sL>u?B}^UI52pGJ=|EX52Wgl-#;TXA&EF@I^ha_vbGp z;DHTJxWnpSaP_BWbcm7~PKDHk1SM_T&g~ZKFc<+1F6xNIVrDkWkk{DjxxApqAavUz z1JWu_Kf8a;u7?bR17UgoUA2CkVWuqFj_%5ouMcd-se?}D&v)AcpVUT;F&`BVCA7&e z%4b4rmFzM*J!zU8F^mte-#D;+_sIqt%V?Bn^Oaw(^^pX?SY!dq;n0tW(-iDc8y(Ut z&hD))WRV3p)u)Ab%G$`McJizAPEuFhH=Q+4Wt9@?Gi2Gr+3hTQc00RHXOa{an0UrN zF7!}zuus&9y%&yoojbBK%y;`4pMQn!br1G(3)SweVo;*D)hIgKx~^X7 zO-mje83V869Uk;S5TehjRr{69@+V3*L<((a!!Tuz>_$?{s*5Qv`+78lUa#z;dXisc z|3a3vRF!~QeNlF9>bWH0A@TJHIukhS+f7R!$%BV2JIV&4Rm?ki^6N@%jrU#{)({|j zH-UlalwBhojWkNMhc!_f!6>CYXF*tyHTb%AKg}N=9q$ot?m4@$uc4H-weQsA-6Z)1 zYQzCGl4upV8D7qFCvDP6(YCj_z1goqxu}5K8$$FqUWkSalouTAWn5m1>d}O&pI;Bz z{R_54BJGz+TdSVd7Tjrg@_;)N_(3B~^b{k}Gk1s7W zTMnz({SFl?PrIo@R#F7^t7x^Tfc8wB1wy3y78f=SWD2p@(|@}jvb&gciG*1qlEQEf z;mriqKV-=^N)&*lVk{3wwea6B=(n1U7NdUdgg=E7{t!<13-a0$zw{rob zQGxBO77CG)0*gJlAK!NxAK#_x+k$!vdp6LRH8Zw)cc3BXd1mfZkE*+b!FOld$>8OQ zoneq!x0N%cCe{~mULHCt;@IXFc-ih*+);*_s`@j}Hwkw&csmutJe(fw+gOR8cV>S_ zwNsM(V#{>l(3OC}%Lmvj3)|8k>e?6JgcRep1%;QdLTO*m?Fznah{9WY+25v228%(9 z_yZREgVp>Ky{g__l7(eZWn!`zwj@rLeBu0BCo}#%zvuiEv!$djYKq;z&X(4e '' then + if FindAtom({$IFDEF WIN32}PChar(AtomName){$ELSE}AtomName{$ENDIF}) = 0 then begin + SetLength(AddedAtoms, Length(AddedAtoms) + 1); + AddedAtoms[High(AddedAtoms)] := AddAtom({$IFDEF WIN32}PChar(AtomName){$ELSE}AtomName{$ENDIF}); + end + else + Exit; + if not NoCheckForTools(Incompatible, RegIniFile) then begin + if Incompatible then begin + lblText1.Caption := sToolsWrongVersion1; + lblText2.Caption := sToolsWrongVersion2; + lblText3.Caption := ProjectVersionStr + '.'; + end + else begin + lblText1.Caption := sNoTools1; + lblText2.Caption := sNoTools2; + lblText3.Caption := ''; + end; + lblProduct.Left := lblText1.Left + lblText1.Width; + lblProduct.Caption := ToolsNameStr; + if lblProduct.Left + lblProduct.Width + lblText2.Width > ClientWidth - 8 then begin + lblText2.Caption := Trim(lblText2.Caption) + ' '; + lblText2.Top := lblText1.Top + 13; + lblText2.Left := lblText1.Left; + lblText3.Left := lblText2.Left + lblText2.Width; + end + else begin + lblText2.Top := lblText1.Top; + lblText2.Left := lblProduct.Left + lblProduct.Width; + lblText3.Left := lblText1.Left; + end; + lblQuestion.Caption := Format(sToolsDownloadQuestion, [ToolsNameStr]); + ShowModal; + if Incompatible then + RegIniFile.WriteBool('', AskIncompatibleStr, not chkDontAsk.Checked) + else + RegIniFile.WriteBool('', AskNoAddinStr, not chkDontAsk.Checked); + end; + finally + Free; + RegIniFile.Free; + end; + except + on E: Exception do + MessageBox(0, {$IFDEF WIN32}PChar(E.Message){$ELSE}E.Message{$ENDIF}, + 'Add-in ñheck error!', 0); + end; +end; + +function DownloadTools(ProVersion: boolean): boolean; +begin + if ProVersion then + with TDownloadForm.Create(Application) do + try + chkDontAsk.Visible := False; + Result := ShowModal = mrYes; + finally + Free; + end + else begin + Result := True; + OpenUrl(UrlExeStr); + end; +end; + +procedure TDownloadForm.FormShow(Sender: TObject); +begin + Caption := DialogCaptionStr; + Image.Picture.Icon.Handle := LoadIcon(0, IDI_QUESTION); + if (DeveloperProjectNameStr = '') or not chkDontAsk.Visible then + OKBtn.ModalResult := mrYes + else + OKBtn.ModalResult := mrNone; + if not chkDontAsk.Visible then begin + lblText3.Visible := False; + lblText3Wrap.Visible := True; + lblProduct.ParentFont := True; + lblProduct.Font.Style := [fsBold]; + Height := Height + 26; + lblText1.Caption := sDeveloperEdition1; + lblProduct.Cursor := crDefault; + lblProduct.Left := lblText1.Left + lblText1.Width; + lblProduct.Caption := DeveloperProjectNameStr; + lblText2.Caption := sDeveloperEdition2; + lblText2.Left := lblProduct.Left + lblProduct.Width; + lblText3Wrap.Caption := Format(sDeveloperEdition3, [ToolsNameStr]); + lblQuestion.Caption := Format(sDeveloperEditionQuestion, [ToolsNameStr]); + end; +end; + +procedure TDownloadForm.OKBtnClick(Sender: TObject); +begin + if OKBtn.ModalResult = mrYes then + OpenUrl(UrlExeStr) + else + if DownloadTools(True) then + Close; +end; + +procedure TDownloadForm.btHelpClick(Sender: TObject); +begin + if HelpTopicStr <> '' then + {$IFDEF VER8P} + ShowHelp('ms-help://CoreLab.' + HelpProjectStr, Format('ms-help://CoreLab.%s/%s/%s.htm', [HelpProjectStr, HelpProjectStr, HelpTopicStr])); + {$ELSE} + ShowHelp(GetHelpFileName(HelpProjectStr), HelpTopicStr); + {$ENDIF} +end; + +procedure TDownloadForm.FormMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +begin + if chkDontAsk.Visible then + lblProduct.Font.Color := $FF0000; +end; + +procedure TDownloadForm.lblProductMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + if chkDontAsk.Visible then + lblProduct.Font.Color := $4080FF; +end; + +procedure TDownloadForm.lblProductClick(Sender: TObject); +begin + if chkDontAsk.Visible then begin + OpenUrl('http://' + UrlStr); + lblProduct.Font.Color := $FF0000; + end; +end; + +procedure DeleteAddedAtoms; +var + i: integer; +begin + for i := 0 to High(AddedAtoms) do + DeleteAtom(AddedAtoms[i]); +end; + +initialization + +finalization + DeleteAddedAtoms; +end. diff --git a/internal/4.10.0.10/1/Source/Design/HelpUtils.pas b/internal/4.10.0.10/1/Source/Design/HelpUtils.pas new file mode 100644 index 0000000..1c43400 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/HelpUtils.pas @@ -0,0 +1,140 @@ +{$IFNDEF CLR} + +{$I Dac.inc} + +unit HelpUtils; +{$ENDIF} + +interface +{$IFDEF MSWINDOWS} +uses +{$IFDEF VER8P} + Dialogs, +{$ELSE} + Forms, +{$ENDIF} + SysUtils; +{$ENDIF} + + procedure ShowHelp(HelpFile, JumpID: string); + procedure OpenUrl(Url: string); + procedure MailTo(Address: string); + +implementation + +{$IFDEF MSWINDOWS} +uses +{$IFDEF VER8P} +{$IFDEF CLR} + System.ComponentModel.Design, + Borland.Studio.ToolsAPI, + Borland.Vcl.HelpIntfs, +{$ELSE} + HelpIntfs, +{$ENDIF} +{$ENDIF} + Registry, ShellAPI, ShlObj, Windows; +{$ENDIF} + +{$IFDEF VER8P} +type + IApiHelpSystem = {$IFDEF CLR}IHelpService{$ELSE}IHelpSystem{$ENDIF}; +{$ENDIF} + +procedure ShowHelp(HelpFile, JumpID: string); +{$IFDEF MSWINDOWS} +var +{$IFDEF VER8P} + HelpSystem: IApiHelpSystem; +{$ELSE} + OldFile: string; +{$ENDIF} +{$ENDIF} +begin +{$IFDEF MSWINDOWS} +{$IFDEF VER8P} +{$IFDEF CLR} + HelpSystem := BorlandIDE.GetService(typeof(IHelpService)) as IHelpService; +{$ELSE} + GetHelpSystem(HelpSystem); +{$ENDIF} + if Assigned(HelpSystem) then +{$IFDEF CLR} + try + HelpSystem.ShowHelpFromUrl(JumpID) + except on E: Exception do +{$IFNDEF VER9} + MessageDlg(e.Message, mtError, [mbOk], 0); +{$ENDIF} + end +{$ELSE} + HelpSystem.ShowTopicHelp(JumpID, HelpFile) +{$ENDIF} + else + MessageDlg('Failed to use IDE HelpSystem', mtError, [mbOk], 0); +{$ELSE} + OldFile := Application.HelpFile; + try + Application.HelpFile := HelpFile; + Application.HelpJump(JumpID); + finally + Application.HelpFile := OldFile; + end; +{$ENDIF} +{$ENDIF} +end; + +procedure OpenUrl(Url: string); +{$IFDEF MSWINDOWS} +var + htmlDescription: string; + shellcommand: string; + i: integer; + Path: {$IFDEF WIN32}array[0..MAX_PATH] of char{$ELSE}string{$ENDIF}; + Filename: string; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + Filename := ''; + with TRegistry.Create do begin + RootKey := HKEY_CLASSES_ROOT; + if OpenKey('.htm', False) and KeyExists('') then begin + htmlDescription := ReadString(''); + CloseKey; + if OpenKey(htmlDescription + '\shell\open\Command', False) and KeyExists('') then begin + shellcommand := ReadString(''); + for i := Length(shellcommand) downto 1 do + if shellcommand[i] = ' ' then begin + FileName := Copy(shellcommand, 2, i - 3); + if not FileExists(Filename) then + Filename := ''; + break; + end; + end; + end; + end; + if Filename = '' then begin + {$IFDEF WIN32} + SHGetSpecialFolderPath(0, Path, $26{CSIDL_PROGRAM_FILES}, False); + {$ELSE} + Path := Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles); + {$ENDIF} + FileName := Path + '\Internet Explorer\iexplore.exe'; + end; +{$IFDEF WIN32} + ShellExecute(0, 'open', PChar(Filename), PChar(Url), '', SW_SHOW); +{$ELSE} + ShellExecute(0, 'open', Filename, Url, '', SW_SHOW); +{$ENDIF} +{$ENDIF} +end; + +procedure MailTo(Address: string); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'open', {$IFDEF WIN32}PChar('mailto:' + Address){$ELSE}'mailto:' + Address{$ENDIF}, + '', '', SW_SHOW); +{$ENDIF} +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/MSConnectionEditor.dfm b/internal/4.10.0.10/1/Source/Design/MSConnectionEditor.dfm new file mode 100644 index 0000000..bafe9af --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSConnectionEditor.dfm @@ -0,0 +1,76 @@ +inherited MSConnectionEditorForm: TMSConnectionEditorForm + Caption = 'MSConnectionEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited PageControl: TPageControl + inherited shConnect: TTabSheet + inherited Panel: TPanel + object lbDatabase: TLabel [3] + Left = 16 + Top = 118 + Width = 46 + Height = 13 + Caption = 'Database' + end + object edDatabase: TComboBox + Left = 104 + Top = 114 + Width = 153 + Height = 21 + ItemHeight = 13 + TabOrder = 3 + OnChange = edDatabaseChange + OnDropDown = edDatabaseDropDown + OnExit = edDatabaseExit + OnKeyUp = edDatabaseKeyUp + end + end + object rgAuth: TRadioGroup + Left = 296 + Top = 32 + Width = 121 + Height = 65 + Caption = 'Authentication' + Items.Strings = ( + 'Windows' + 'SQL Server') + TabOrder = 4 + OnClick = rgAuthClick + end + end + inherited shAbout: TTabSheet + inherited Label1: TLabel + Width = 351 + Caption = 'SQL Server Data Access Components' + end + inherited lbWeb: TLabel + Width = 101 + Caption = 'www.crlab.com/sdac' + end + inherited lbMail: TLabel + Width = 80 + Caption = 'sdac@crlab.com' + end + end + end + object btQueryAnalyzer: TButton + Left = 8 + Top = 249 + Width = 99 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Query Analyzer' + TabOrder = 3 + OnClick = btQueryAnalyzerClick + end + object btManagementStudio: TButton + Left = 112 + Top = 249 + Width = 99 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Management Studio' + TabOrder = 4 + OnClick = btManagementStudioClick + end +end diff --git a/internal/4.10.0.10/1/Source/Design/MSConnectionEditor.pas b/internal/4.10.0.10/1/Source/Design/MSConnectionEditor.pas new file mode 100644 index 0000000..3c15a8e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSConnectionEditor.pas @@ -0,0 +1,459 @@ +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// MSConnection Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I SDac.inc} + +unit MSConnectionEditor; +{$ENDIF} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, Mask, ExtCtrls, ComCtrls, Buttons, + DAConnectionEditor, MSAccess, OLEDBAccess; + +const + WM_SETDATABASETEXT = WM_USER + 1; + +type + TMSConnectionEditorForm = class(TDAConnectionEditorForm) + lbDatabase: TLabel; + edDatabase: TComboBox; + rgAuth: TRadioGroup; + btQueryAnalyzer: TButton; + btManagementStudio: TButton; + procedure edDatabaseDropDown(Sender: TObject); + procedure rgAuthClick(Sender: TObject); + procedure btQueryAnalyzerClick(Sender: TObject); + procedure edDatabaseExit(Sender: TObject); + procedure edDatabaseKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure edDatabaseChange(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure btManagementStudioClick(Sender: TObject); + procedure edServerDropDown(Sender: TObject); override; + private + FDataBaseText: string; + FCurrItemIndex: Integer; + FListGot: boolean; + procedure WMSetDataBaseText(var Message: TMessage); message WM_SETDATABASETEXT; + protected + function GetConnection: TMSConnection; + procedure SetConnection(Value: TMSConnection); + + procedure DoInit; override; + procedure FillInfo; override; + + procedure ConnToControls; override; + + procedure AddServerToList; override; + + procedure GetServerList(List: TStrings); override; + procedure GetDatabaseList(List: TStrings); + function IsValidKeyValue(Value: string; Name: string): boolean; + public + property Connection: TMSConnection read GetConnection write SetConnection; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R MSConnectionEditor.dfm} +{$ENDIF} + +uses + DacVcl{$IFDEF SDAC}, MSDesign{$ENDIF}, Registry; + +{ TMSConnectionEditorForm } + +function TMSConnectionEditorForm.GetConnection: TMSConnection; +begin + Result := FConnection as TMSConnection; +end; + +procedure TMSConnectionEditorForm.SetConnection(Value: TMSConnection); +begin + FConnection := Value; +end; + +procedure TMSConnectionEditorForm.DoInit; +begin + inherited; + + FInDoInit := True; + try + lbVersion.Caption := SDACVersion; + {$IFDEF SDAC} + btQueryAnalyzer.Visible := IsServerToolInstalled(stQueryAnalyser) and (Connection.Options.Provider <> prCompact); + btManagementStudio.Visible := IsServerToolInstalled(stManagementStudio) and (Connection.Options.Provider <> prCompact); + {$ENDIF} + FCurrItemIndex := -1; + if Connection.Options.Provider = prCompact then begin + cbLoginPrompt.Enabled := False; + rgAuth.Enabled := False; + lbUsername.Enabled := False; + edUserName.Enabled := False; + lbServer.Enabled := False; + edServer.Enabled := False; + end; + FListGot := False; + finally + FInDoInit := False; + end; +end; + +procedure TMSConnectionEditorForm.FillInfo; +var + OldLoginPrompt: boolean; + OldConnectionTimeout: integer; + OLEDBConnection: TOLEDBConnection; + St: string; +begin + OldLoginPrompt := Connection.LoginPrompt; + OldConnectionTimeout := Connection.ConnectionTimeout; + try + Connection.LoginPrompt := False; + if not Connection.Connected then + try + ShowState(True); + Connection.ConnectionTimeout := 1; + Connection.Connect; + except + on E: Exception do + begin + //Application.ShowException(E); - silent exception. Please see CR MyDAC 3443 + end; + end; + meInfo.Lines.Clear; + OLEDBConnection := TMSAccessUtils.FIConnection(Connection); + if OLEDBConnection <> nil then + begin + if Connection.Connected then begin + St := OLEDBConnection.DBMSName + ': ' + OLEDBConnection.DBMSVer; + if st <> ':' then + meInfo.Lines.Add(St); + end; + St := OLEDBConnection.ProviderFriendlyName + ': ' + OLEDBConnection.ProviderVer; + if St <> ': ' then + meInfo.Lines.Add(St); + end; + finally + Connection.LoginPrompt := OldLoginPrompt; + Connection.ConnectionTimeout := OldConnectionTimeout; + ShowState(False); + end; +end; + +procedure TMSConnectionEditorForm.ConnToControls; +begin + inherited; + + edDatabase.Text := Connection.Database; + rgAuth.ItemIndex := Ord(Connection.Authentication); +end; + +procedure TMSConnectionEditorForm.edServerDropDown(Sender: TObject); +begin + if FListGot then + Exit; + + FListGot := True; + + inherited; +end; + +procedure TMSConnectionEditorForm.GetServerList(List: TStrings); +begin + MSAccess.GetServerList(List); +end; + +procedure TMSConnectionEditorForm.AddServerToList; +var + ConnectKey: string; + ValueNames, Values: TStringList; + i: integer; + s: string; +begin + if Connection.Options.Provider = prCompact then begin + if FRegistry <> nil then begin + ValueNames := nil; + Values := nil; + ConnectKey := FRegistry.CurrentPath; + try + ValueNames := TStringList.Create; + Values := TStringList.Create; + + Values.Add(Connection.Database); // Add current database at first position + + FRegistry.CloseKey; + FRegistry.OpenKey(ConnectKey + '\Everywhere', True); + + FRegistry.GetValueNames(ValueNames); + ValueNames.Sort; + + for i := 0 to ValueNames.Count - 1 do begin + s := Trim(FRegistry.ReadString(ValueNames[i])); + if (s <> '') and (Values.IndexOf(s) = -1) then + Values.Add(s); + FRegistry.DeleteValue(ValueNames[i]); // Clear old list + end; + + // Store updated list in registry + for i := 0 to Values.Count - 1 do begin + s := Format('Database %d', [i]); + FRegistry.WriteString(s, Values[i]); + end; + + finally + ValueNames.Free; + Values.Free; + end; + end; + end + else + inherited; +end; + +procedure TMSConnectionEditorForm.GetDatabaseList(List: TStrings); +var + ConnectKey: string; + ValueNames, Values: TStringList; + i: integer; +begin + List.Clear; + if FRegistry <> nil then begin + ValueNames := nil; + Values := nil; + try + ValueNames := TStringList.Create; + Values := TStringList.Create; + ConnectKey := FRegistry.CurrentPath; + try + FRegistry.CloseKey; + if FRegistry.OpenKey(ConnectKey + '\Everywhere', False) then begin + FRegistry.GetValueNames(ValueNames); + ValueNames.Sort; + for i := 0 to ValueNames.Count - 1 do + if IsValidKeyValue(ValueNames[i], 'Database') then + List.Add(FRegistry.ReadString(ValueNames[i])); + end; + finally + FRegistry.CloseKey; + FRegistry.OpenKey(ConnectKey, False); + end; + finally + ValueNames.Free; + Values.Free; + end; + end; + List.Add(''); +end; + +function TMSConnectionEditorForm.IsValidKeyValue(Value: string; Name: string): boolean; +var + p: integer; +begin + p := Pos(AnsiUpperCase(Name), AnsiUpperCase(Value)); + if p <> 0 then begin + Inc(p, Length(Name) - 1); + if p < Length(Value) then + Inc(p); + while (Byte(Value[p]) in [$30..$30+9, $20]) and (p <> Length(Value)) do + Inc(p); + Result := p = Length(Value); + end + else + Result := False; +end; + +procedure TMSConnectionEditorForm.edDatabaseDropDown(Sender: TObject); +var + List: TStringList; + OldLoginPrompt: Boolean; +begin + StartWait; + try + if Connection.Options.Provider = prCompact then begin + GetDatabaseList(edDatabase.Items); + if edDatabase.Items.Count < 20 then + edDatabase.DropDownCount := edDatabase.Items.Count + else + edDatabase.DropDownCount := 20; + end + else begin + edDatabase.Items.Clear; + OldLoginPrompt := Connection.LoginPrompt; + List := TStringList.Create; + try + Connection.LoginPrompt := False; + MSAccess.GetDatabasesList(Connection, List); + List.Sort; + edDatabase.Items.Assign(List); + if edDatabase.Items.Count < 20 then + edDatabase.DropDownCount := edDatabase.Items.Count + else + edDatabase.DropDownCount := 20; + finally + edDatabase.Text := Connection.Database; + List.Free; + Connection.LoginPrompt := OldLoginPrompt; + end; + end; + finally + StopWait; + end; +end; + +procedure TMSConnectionEditorForm.rgAuthClick(Sender: TObject); +begin + try + Connection.Authentication := TMSAuthentication(rgAuth.ItemIndex); + + case Connection.Authentication of + auWindows: + begin + edUsername.Enabled := False; + edPassword.Enabled := False; + lbUsername.Enabled := False; + lbPassword.Enabled := False; + cbLoginPrompt.Enabled := False; + end; + auServer: + begin + edUsername.Enabled := True; + edPassword.Enabled := True; + lbUsername.Enabled := True; + lbPassword.Enabled := True; + cbLoginPrompt.Enabled := True; + end; + end; + finally + ShowState; + end; +end; + +procedure TMSConnectionEditorForm.btQueryAnalyzerClick(Sender: TObject); +begin + SaveControlData; +{$IFDEF SDAC} + RunServerTool(stQueryAnalyser, Connection); +{$ENDIF} +end; + +procedure TMSConnectionEditorForm.btManagementStudioClick(Sender: TObject); +begin + SaveControlData; +{$IFDEF SDAC} + RunServerTool(stManagementStudio, Connection); +{$ENDIF} +end; + +procedure TMSConnectionEditorForm.edDatabaseExit(Sender: TObject); +begin + if FInDoInit then + Exit; + + try + Connection.Database := edDatabase.Text; + finally + ShowState; + end; +end; + +procedure TMSConnectionEditorForm.edDatabaseKeyUp(Sender: TObject; + var Key: Word; Shift: TShiftState); +begin + if Key ={$IFDEF MSWINDOWS}VK_RETURN{$ELSE}KEY_RETURN{$ENDIF} then + edDatabaseExit(Sender); +end; + +procedure TMSConnectionEditorForm.edDatabaseChange(Sender: TObject); +var + Dialog: TOpenDialog; + OldConnected: boolean; +begin + if FInDoInit then + Exit; + + if Connection.Options.Provider <> prCompact then + Exit; + + try + if edDatabase.Text = '' then begin + Dialog := nil; + try + Dialog := TOpenDialog.Create(nil); + {$IFDEF LINUX} + Dialog.Filter := 'All Files (*)|*'; + {$ELSE} + Dialog.Filter := 'SQL Server Database Files (*.sdf)|*.sdf|All Files (*.*)|*.*'; + {$ENDIF} + Dialog.Options := Dialog.Options + [ofPathMustExist]; + if Dialog.Execute then begin + Connection.Connected := False; + FDataBaseText := Dialog.FileName; + {$IFDEF MSWINDOWS} + PostMessage(Handle, WM_SETDATABASETEXT, 0, 0); + {$ENDIF} + end + else + edDatabase.ItemIndex := FCurrItemIndex; + finally + Dialog.Free; + end; + end + else + FCurrItemIndex := edDatabase.Items.IndexOf(edDatabase.Text); + OldConnected := Connection.Connected; + try + Connection.Connected := False; + Connection.Database := edDatabase.Text; + finally + Connection.Connected := OldConnected; + end; + finally + ShowState; + end; +end; + +procedure TMSConnectionEditorForm.WMSetDataBaseText(var Message: TMessage); +var + OldConnected: boolean; +begin + edDatabase.SetFocus; + edDatabase.Text := FDataBaseText; + OldConnected := Connection.Connected; + try + Connection.Connected := False; + Connection.Database := edDatabase.Text; + finally + Connection.Connected := OldConnected; + end; + edDatabase.SelectAll; +end; + +procedure TMSConnectionEditorForm.FormShow(Sender: TObject); +begin + inherited; + TMSAccessUtils.SetLockLoginPromt(Connection, True); +end; + +procedure TMSConnectionEditorForm.FormCloseQuery(Sender: TObject; + var CanClose: Boolean); +begin + inherited; + if CanClose then + TMSAccessUtils.SetLockLoginPromt(Connection, False); +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/MSDesign.pas b/internal/4.10.0.10/1/Source/Design/MSDesign.pas new file mode 100644 index 0000000..1a13b3e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSDesign.pas @@ -0,0 +1,1098 @@ +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC Design +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSDesign; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, Graphics, Controls, Forms, Dialogs, + Registry, StdCtrls, +{$IFDEF CLR} + Borland.Vcl.Design.DesignEditors, Borland.Vcl.Design.DesignIntf, + Borland.Vcl.Design.FldLinks, +{$ELSE} + {$IFDEF VER6P}DesignIntf, DesignEditors,{$ELSE}DsgnIntf,{$ENDIF} + {$IFNDEF BCB}{$IFDEF VER5P}FldLinks,{$ENDIF} ColnEdit,{$ENDIF} +{$ENDIF} +{$ENDIF} + SysUtils, Classes, TypInfo, DADesign, DBAccess, MSAccess, SdacVcl; + +type + +{ ------------ SDac property editors ----------- } + + TMSConnectStringPropertyEditor = class(TStringProperty) + protected + FForm: TForm; + FSucceeded: boolean; + FConnectString: string; + procedure DoActivate(Sender: TObject); + public + function GetAttributes: TPropertyAttributes; override; + procedure Edit; override; + end; + + TMSServerNamePropertyEditor = class (TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function AutoFill: Boolean; override; + end; + + TMSDatabaseNamePropertyEditor = class (TStringProperty) + protected + procedure GetDialogOptions(Dialog: TOpenDialog); virtual; + public + procedure Edit; override; + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + end; + +{$IFNDEF STD} + TMSQueuePropertyEditor = class(TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + end; + + TMSServicePropertyEditor = class(TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + end; + + TMSContractPropertyEditor = class(TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + end; + + TMSTargetDatabaseNamePropertyEditor = class(TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + end; + + TMSTableNamesEditor = class(TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure Edit; override; + end; +{$ENDIF} + + TMSConnectDialogPropertyEditor = class(TComponentProperty) + private + FCheckProc: TGetStrProc; + procedure CheckComponent(const Value: string); + public + procedure GetValues(Proc: TGetStrProc); override; + end; + +{ ------------ SDac component editors ----------- } + + TMSConnectionEditor = class(TDAConnectionEditor) + protected + FQueryAnalyserIndex: integer; + FManagementStudioIndex: integer; + procedure InitVerbs; override; + public + procedure ExecuteVerb(Index: integer); override; + end; + + TMSDataSetEditor = class(TDADataSetEditor); + + TMSQueryEditor = class(TMSDataSetEditor) + protected + FQueryAnalyserIndex: integer; + FManagementStudioIndex: integer; + procedure InitVerbs; override; + public + procedure ExecuteVerb(Index: integer); override; + end; + + TMSSQLEditor = class(TDASQLEditor) + protected + procedure InitVerbs; override; + end; + + TMSTableEditor = class(TMSDataSetEditor) + protected + procedure InitVerbs; override; + end; + + TMSStoredProcEditor = class(TMSDataSetEditor) + protected + procedure InitVerbs; override; + public + procedure ExecuteVerb(Index: integer); override; + end; + + TMSUpdateSQLEditor = class(TDAUpdateSQLEditor) + protected + procedure InitVerbs; override; + end; + + TMSScriptEditor = class(TDASQLEditor) + protected + procedure InitVerbs; override; + end; + +{$IFNDEF STD} + TMSDumpEditor = class(TDAComponentEditor) + protected + procedure InitVerbs; override; + end; +{$ENDIF} + + TMSConnectionList = class (TDAConnectionList) + protected + function GetConnectionType: TCustomDAConnectionClass; override; + end; + +{$IFDEF VER6P} + TMSDesignNotification = class(TDADesignNotification) + public + procedure ItemInserted(const ADesigner: IDesigner; AItem: TPersistent); override; + function CreateConnectionList: TDAConnectionList; override; + procedure SelectionChanged(const ADesigner: IDesigner; + const ASelection: IDesignerSelections); override; + function GetConnectionPropertyName: string; override; + end; +{$ENDIF} + +procedure Register; + +type + TServerTool = (stQueryAnalyser, stManagementStudio); + +procedure RunServerTool(ServerTool: TServerTool; Connection: TMSConnection; const SQL: TStrings = nil); +procedure RunServerToolConnection(ServerTool: TServerTool; Connection: TMSConnection; const SQLText: string); +procedure RunServerToolDataSet(ServerTool: TServerTool; DataSet: TCustomMSDataSet); +procedure RunServerToolMSSQL(ServerTool: TServerTool; MSSQL: TMSSQL); + +function IsServerToolInstalled(ServerTool: TServerTool): boolean; + +implementation + +uses + {$IFDEF CLR}System.Text, WinUtils, {$ENDIF} + {$IFNDEF CLR} ToolsAPI,{$ENDIF} + MSMenu, ShellAPI, ActiveX, ComObj, DB, DAConsts, OLEDBIntf, OLEDBC, OLEDBAccess, + MSDesignUtils, MSConnectionEditor, MSQueryEditor, MSSQLEditor, MSStoredProcEditor, + DATableEditor, MSUpdateSQLEditor, DAScriptEditor, MSScript{$IFNDEF STD}, MSLoader, MSDump, + MSServiceBroker, MSDumpEditor, MSNamesEditor{$ENDIF}; + +var + TmpFiles: TStringList; + +function GetServerToolCommand(ServerTool: TServerTool): string; +type + TRegKeyString = record + Root: HKEY; + Path, KeyName: string; + AdditionalPath: string; + end; + TRegKeyArray = array[0..1] of TRegKeyString; +const + QAKeyPaths: TRegKeyArray = + ((Root: HKEY_LOCAL_MACHINE; Path: 'SOFTWARE\Microsoft\Microsoft SQL Server\80\Tools\ClientSetup'; KeyName: 'SQLPath'; AdditionalPath: '\Binn\isqlw'), + (Root: HKEY_CLASSES_ROOT; Path: 'SQLFile\Shell\open\command'; KeyName: ''; AdditionalPath: '\isqlw')); + MMSKeyPaths: TRegKeyArray = + ((Root: HKEY_LOCAL_MACHINE; Path: 'SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\ClientSetup'; KeyName: 'SQLPath'; AdditionalPath: '\Binn\VSShell\Common7\IDE\sqlwb'), + (Root: HKEY_CLASSES_ROOT; Path: 'sqlwb.sql.9.0\Shell\Open\Command'; KeyName: ''; AdditionalPath: '\sqlwb')); +var + Reg: TRegistry; + i: integer; + KeyPaths: TRegKeyArray; +begin + case ServerTool of + stQueryAnalyser: begin + Result := 'isqlw'; + KeyPaths := QAKeyPaths; + end; + stManagementStudio: begin + Result := 'sqlwb'; + KeyPaths := MMSKeyPaths; + end + else + Assert(False); + end; + + Reg := TRegistry.Create{$IFDEF VER5P}(KEY_READ){$ENDIF}; + try + for i := Low(KeyPaths) to High(KeyPaths) do begin + Reg.RootKey := KeyPaths[i].Root; + if Reg.OpenKeyReadOnly(KeyPaths[i].Path) then begin + Result := Reg.ReadString(KeyPaths[i].KeyName); + Reg.CloseKey; + if Result <> '' then begin + Result := Result + KeyPaths[i].AdditionalPath; + Break; + end; + end; + end; + finally + Reg.Free; + end; +end; + +function IsServerToolInstalled(ServerTool: TServerTool): boolean; +var + Cmd: string; +begin + Cmd := GetServerToolCommand(ServerTool); + Result := FileExists(Cmd + '.exe'); +end; + +procedure RunServerTool(ServerTool: TServerTool; Connection: TMSConnection; const SQL: TStrings = nil); +var + Cmd, CmdParam: string; +{$IFDEF CLR} + TmpPath, TmpFileName: StringBuilder; + SqlFileHandle: TOpenedFile; +{$ELSE} + TmpPath, TmpFileName: array[0..MAX_PATH] of char; + SqlFileHandle: integer; +{$ENDIF} + SqlFileName: string; + Code: integer; +begin + if Connection = nil then + DatabaseError(SConnectionNotDefined); + + CmdParam := ''; //'-1'; + + if Connection.Server <> '' then + CmdParam := CmdParam + ' -S ' + Connection.Server; + + if Connection.Database <> '' then + CmdParam := CmdParam + ' -d ' + Connection.Database; + + if Connection.Authentication = auWindows then + CmdParam := CmdParam + ' -E' + else begin + if Connection.Username <> '' then + CmdParam := CmdParam + ' -U ' + Connection.Username; + CmdParam := CmdParam + ' -P ' + Connection.Password; + end; + + if (SQL <> nil) and (SQL.Count > 0) then begin + {$IFDEF CLR} + TmpPath := StringBuilder.Create(MAX_PATH); + TmpFileName := StringBuilder.Create(MAX_PATH); + + Assert(GetTempPath(MAX_PATH, TmpPath) <> 0, 'Error in call GetTempPath'); + Assert(GetTempFileName(TmpPath.ToString, 'sql'#0, 0, TmpFileName) <> 0, 'Error in call GetTempFileName'); + + if ServerTool = stManagementStudio then begin + SqlFileName := ChangeFileExt(TmpFileName.ToString, '.sql'); + SqlFileHandle := FileCreate(SqlFileName); + //Assert(SqlFileHandle > 0); + FileClose(SqlFileHandle); + TmpFiles.Add(SqlFileName); + SQl.SaveToFile(SqlFileName); + end + else + SQl.SaveToFile(TmpFileName.ToString); + + TmpFiles.Add(TmpFileName.ToString); + case ServerTool of + stQueryAnalyser: + CmdParam := CmdParam + ' -f ' + TmpFileName.ToString; + stManagementStudio: + CmdParam := '"' + SqlFileName + '" ' + CmdParam; + else + Assert(False); + end; + {$ELSE} + Assert(GetTempPath(MAX_PATH, TmpPath) <> 0, 'Error in call GetTempPath'); + + Assert(GetTempFileName(TmpPath, 'sql'#0, 0, TmpFileName) <> 0, 'Error in call GetTempFileName'); + + if ServerTool = stManagementStudio then begin + SqlFileName := ChangeFileExt(TmpFileName, '.sql'); + SqlFileHandle := FileCreate(SqlFileName); + Assert(SqlFileHandle > 0); + FileClose(SqlFileHandle); + TmpFiles.Add(SqlFileName); + SQl.SaveToFile(SqlFileName); + end + else + SQl.SaveToFile(TmpFileName); + + TmpFiles.Add(TmpFileName); + case ServerTool of + stQueryAnalyser: + CmdParam := CmdParam + ' -f ' + StrPas(TmpFileName); + stManagementStudio: + CmdParam := '"' + SqlFileName + '" ' + CmdParam; + else + Assert(False); + end; + {$ENDIF} + end; + + Cmd := GetServerToolCommand(ServerTool); + +{$IFDEF CLR} + Code := ShellExecute(0, '', Cmd, CmdParam, '', SW_SHOWNORMAL); +{$ELSE} + Code := ShellExecute(0, nil, @Cmd[1], @CmdParam[1], nil, SW_SHOWNORMAL); +{$ENDIF} + if Code <= 32 then + raise Exception.CreateFmt('Error executing "%s %s". Code = %d', [Cmd, CmdParam, Code]); +end; + +procedure RunServerToolConnection(ServerTool: TServerTool; Connection: TMSConnection; const SQLText: string); +var + SQL: TStringList; +begin + SQL := TStringList.Create; + try + SQL.Add(SQLtext); + RunServerTool(ServerTool, Connection, SQL); + finally + SQL.Free; + end; +end; + +procedure RunServerToolDataSet(ServerTool: TServerTool; DataSet: TCustomMSDataSet); +begin + RunServerToolConnection(ServerTool, DataSet.Connection, TMSAccessUtils.GetOLEDBSQL(DataSet)); +end; + +procedure RunServerToolMSSQL(ServerTool: TServerTool; MSSQL: TMSSQL); +begin + RunServerToolConnection(ServerTool, MSSQL.Connection, TMSAccessUtils.GetOLEDBSQL(MSSQL)); +end; + +{ TMSConnectStringProperty } + +function TMSConnectStringPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paDialog]; +end; + +procedure TMSConnectStringPropertyEditor.DoActivate(Sender: TObject); +var + DataInit: IDataInitialize; + DBPrompt: IDBPromptInitialize; + DataSource: IUnknown; + InitStr: {$IFDEF CLR}string{$ELSE}PWideChar{$ENDIF}; + InitialString: WideString; +begin + FSucceeded := False; + DataInit := CreateComObject(CLSID_DataLinks) as IDataInitialize; + InitialString := FConnectString; + + if Pos('Provider=', FConnectString) = 0 then begin + if InitialString <> '' then + InitialString := InitialString + ';'; + InitialString := InitialString + 'Provider=SQLOLEDB.1'; + end; + + DataInit.GetDataSource(nil, CLSCTX_INPROC_SERVER, + {$IFDEF CLR} + InitialString, + {$ELSE} + PWideChar(InitialString), + {$ENDIF} + IID_IUnknown, DataSource); + DBPrompt := CreateComObject(CLSID_DataLinks) as IDBPromptInitialize; + + if Succeeded(DBPrompt.PromptDataSource(nil, FForm.Handle, + DBPROMPTOPTIONS_PROPERTYSHEET + DBPROMPTOPTIONS_DISABLE_PROVIDER_SELECTION, 0, nil, nil, IID_IUnknown, DataSource)) then + begin + InitStr := nil; + DataInit.GetInitializationString(DataSource, True, InitStr ); + FConnectString := InitStr; + FSucceeded := True; + end; + + PostMessage(FForm.Handle, WM_CLOSE, 0, 0); +end; + +procedure TMSConnectStringPropertyEditor.Edit; +begin + FConnectString := TMSConnection(GetComponent(0)).ConnectString; + FForm := TForm.Create(nil); + try + FForm.BorderStyle := bsNone; + FForm.Position := poScreenCenter; + FForm.Width := 10; + FForm.Height := 10; + FForm.OnActivate := DoActivate; + FForm.ShowModal; + finally + FForm.Free; + end; + if FSucceeded then begin {Cannot move to DoActivate} + TMSConnection(GetComponent(0)).ConnectString := FConnectString; + Modified; + end; +end; + +{ TMSServerNamePropertyEditor } + +function TMSServerNamePropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +function TMSServerNamePropertyEditor.AutoFill: Boolean; +begin + Result := False; +end; + +procedure TMSServerNamePropertyEditor.GetValues(Proc: TGetStrProc); +var + List: TStringList; + i: integer; + OldCursor: TCursor; + Connection: TMSConnection; + IsEverywhere: boolean; +begin + List := TStringList.Create; + OldCursor := Screen.Cursor; + Screen.Cursor := crSQLWait; + try + Connection := nil; + if GetComponent(0) is TMSConnection then + Connection := GetComponent(0) as TMSConnection; + + IsEverywhere := (Connection <> nil) and (Connection.Options.Provider = prCompact); + if not IsEverywhere then + GetServerList(List); + + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + Screen.Cursor := OldCursor; + end; +end; + +{ TMSDatabaseNamePropertyEditor } + +procedure TMSDatabaseNamePropertyEditor.GetDialogOptions(Dialog: TOpenDialog); +begin +{$IFDEF LINUX} + Dialog.Filter := 'All Files (*)|*'; +{$ENDIF} +{$IFDEF MSWINDOWS} + Dialog.Filter := 'MS SQL Database Files (*.sdf)|*.sdf|All Files (*.*)|*.*'; +{$ENDIF} + Dialog.Options := Dialog.Options + [ofPathMustExist]; +end; + +function TMSDatabaseNamePropertyEditor.GetAttributes: TPropertyAttributes; +var + Connection: TMSConnection; +begin + Connection := nil; + if GetComponent(0) is TMSConnection then + Connection := GetComponent(0) as TMSConnection + else + if GetComponent(0) is TCustomMSDataset then + Connection := TCustomMSDataset(GetComponent(0)).Connection as TMSConnection; + if Connection = nil then + Exit; + + if Connection.Options.Provider <> prCompact then + Result := [paValueList] + else + Result := [paRevertable, paDialog, paMultiSelect]; +end; + +procedure TMSDatabaseNamePropertyEditor.Edit; +var + OpenDialog: TOpenDialog; +begin + OpenDialog := TOpenDialog.Create(nil); + GetDialogOptions(OpenDialog); + if OpenDialog.Execute then + SetValue(OpenDialog.FileName); + OpenDialog.Free; +end; + +procedure TMSDatabaseNamePropertyEditor.GetValues(Proc: TGetStrProc); +var + List: TStringList; + Connection: TMSConnection; + i: integer; + OldConnected: boolean; +begin + Connection := nil; + if GetComponent(0) is TMSConnection then + Connection := GetComponent(0) as TMSConnection + else + if GetComponent(0) is TCustomMSDataset then + Connection := TCustomMSDataset(GetComponent(0)).Connection as TMSConnection; + if Connection = nil then + Exit; + + OldConnected := Connection.Connected; + List := TStringList.Create; + try + try + GetDatabasesList(Connection, List); + except + Designer.Modified; + raise; + end; + List.Sort; + + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + + if (OldConnected <> Connection.Connected) and (Designer <> nil) then + Designer.Modified; + end; +end; + +{ TMSQueuePropertyEditor } +{$IFNDEF STD} +function TMSQueuePropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +procedure TMSQueuePropertyEditor.GetValues(Proc: TGetStrProc); +var + List: TStringList; + Connection: TMSConnection; + ServiceBroker: TMSServiceBroker; + i: integer; + OldConnected: boolean; +begin + ServiceBroker := nil; + Connection := nil; + if GetComponent(0) is TMSServiceBroker then begin + ServiceBroker := TMSServiceBroker(GetComponent(0)); + Connection := ServiceBroker.Connection; + end; + if Connection = nil then + Exit; + + OldConnected := Connection.Connected; + List := TStringList.Create; + try + try + ServiceBroker.GetQueueNames(List); + except + Designer.Modified; + raise; + end; + List.Sort; + + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + + if (OldConnected <> Connection.Connected) and (Designer <> nil) then + Designer.Modified; + end; +end; + +{ TMSServicePropertyEditor } + +function TMSServicePropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList, paSortList, paMultiSelect]; +end; + +procedure TMSServicePropertyEditor.GetValues(Proc: TGetStrProc); +var + List: TStringList; + Connection: TMSConnection; + ServiceBroker: TMSServiceBroker; + i: integer; + OldConnected: boolean; +begin + ServiceBroker := nil; + Connection := nil; + if GetComponent(0) is TMSServiceBroker then begin + ServiceBroker := TMSServiceBroker(GetComponent(0)); + Connection := ServiceBroker.Connection; + end; + if Connection = nil then + Exit; + + OldConnected := Connection.Connected; + List := TStringList.Create; + try + try + ServiceBroker.GetServiceNames(List); + except + Designer.Modified; + raise; + end; + + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + + if (OldConnected <> Connection.Connected) and (Designer <> nil) then + Designer.Modified; + end; +end; + +{ TMSContractPropertyEditor } + +function TMSContractPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +procedure TMSContractPropertyEditor.GetValues(Proc: TGetStrProc); +var + List: TStringList; + Connection: TMSConnection; + ServiceBroker: TMSServiceBroker; + i: integer; + OldConnected: boolean; +begin + ServiceBroker := nil; + Connection := nil; + if GetComponent(0) is TMSServiceBroker then begin + ServiceBroker := TMSServiceBroker(GetComponent(0)); + Connection := ServiceBroker.Connection; + end; + if Connection = nil then + Exit; + + OldConnected := Connection.Connected; + List := TStringList.Create; + try + try + ServiceBroker.GetContractNames(List); + except + Designer.Modified; + raise; + end; + List.Sort; + + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + + if (OldConnected <> Connection.Connected) and (Designer <> nil) then + Designer.Modified; + end; +end; + +{ TMSTargetDatabaseNamePropertyEditor } + +function TMSTargetDatabaseNamePropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList]; +end; + +procedure TMSTargetDatabaseNamePropertyEditor.GetValues(Proc: TGetStrProc); +var + List: TStringList; + Connection: TMSConnection; + i: integer; + OldConnected: boolean; +begin + Connection := nil; + if GetComponent(0) is TMSServiceBroker then + Connection := TMSServiceBroker(GetComponent(0)).Connection as TMSConnection; + if Connection = nil then + Exit; + + OldConnected := Connection.Connected; + List := TStringList.Create; + try + try + GetDatabasesList(Connection, List); + except + Designer.Modified; + raise; + end; + List.Sort; + + for i := 0 to List.Count - 1 do + Proc(List[i]); + finally + List.Free; + + if (OldConnected <> Connection.Connected) and (Designer <> nil) then + Designer.Modified; + end; +end; + +{ TMSTableNamesEditor } + +function TMSTableNamesEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paDialog]; +end; + +procedure TMSTableNamesEditor.Edit; +var + Comp: TComponent; + Conn: TCustomDAConnection; + +begin + Comp := TComponent(GetComponent(0)); + Conn := TMSDesignUtils.GetConnection(Comp); + if Conn = nil then + Exit; + + with TMSNamesEditorForm.Create(nil, TMSDesignUtils) do + try + Connection := Conn as TMSConnection; + if Comp is TMSDump then + Names := TMSDump(Comp).TableNames + else + Assert(False); + + ShowModal; + if ModalResult = mrOk then begin + if Comp is TMSDump then + TMSDump(Comp).TableNames := Names + else + Assert(False); + end; + finally + Free; + end; +end; +{$ENDIF} + +{ TMSConnectDialogPropertyEditor } + +procedure TMSConnectDialogPropertyEditor.CheckComponent(const Value: string); +var + Component: TComponent; +begin + Component := Designer.GetComponent(Value); + if Component <> nil then begin + if not (Component is TMSConnectDialog) then + Exit; + end; + FCheckProc(Value); +end; + +procedure TMSConnectDialogPropertyEditor.GetValues(Proc: TGetStrProc); +begin + FCheckProc := Proc; + inherited GetValues(CheckComponent); +end; + +{ TMSConnectionEditor } + +procedure TMSConnectionEditor.ExecuteVerb(Index: integer); +begin + if (Index = FQueryAnalyserIndex) and (FQueryAnalyserIndex <> -1) then + RunServerTool(stQueryAnalyser, Component as TMSConnection) + else + if (Index = FManagementStudioIndex) and (FManagementStudioIndex <> -1) then + RunServerTool(stManagementStudio, Component as TMSConnection) + else + inherited ExecuteVerb(Index); +end; + +procedure TMSConnectionEditor.InitVerbs; +var + ServerToolMethod: TVerbMethod; + Connection: TMSConnection; +begin + AddVerb('Connection Editor...', TMSConnectionEditorForm, TMSDesignUtils); + + Connection := Component as TMSConnection; + ServerToolMethod := nil; + FQueryAnalyserIndex := -1; + FManagementStudioIndex := -1; + if (Connection <> nil) and (Connection.Options.Provider <> prCompact) then begin + if IsServerToolInstalled(stQueryAnalyser) then + FQueryAnalyserIndex := AddVerb('Query Analyzer...', ServerToolMethod); + if IsServerToolInstalled(stManagementStudio) then + FManagementStudioIndex := AddVerb('Management Studio...', ServerToolMethod); + end; +end; + +{ TMSQueryEditor } + +procedure TMSQueryEditor.ExecuteVerb(Index: integer); +begin + if (Index = FQueryAnalyserIndex) and (FQueryAnalyserIndex <> -1) then + RunServerToolDataSet(stQueryAnalyser, Component as TCustomMSDataSet) + else + if (Index = FManagementStudioIndex) and (FManagementStudioIndex <> -1) then + RunServerToolDataSet(stManagementStudio, Component as TCustomMSDataSet) + else + inherited ExecuteVerb(Index); +end; + +procedure TMSQueryEditor.InitVerbs; +var + Connection: TMSConnection; + ServerToolMethod: TVerbMethod; +begin + AddVerb('Fields &Editor...', ShowFieldsEditor); + AddVerb('MSQuery E&ditor...', TMSQueryEditorForm, TMSDesignUtils); + AddVerb('Data Editor...', ShowDataEditor); + + Connection := (Component as TCustomMSDataSet).Connection; + ServerToolMethod := nil; + FQueryAnalyserIndex := -1; + FManagementStudioIndex := -1; + if (Connection <> nil) and (Connection.Options.Provider <> prCompact) then begin + if IsServerToolInstalled(stQueryAnalyser) then + FQueryAnalyserIndex := AddVerb('Query Analyzer...', ServerToolMethod); + if IsServerToolInstalled(stManagementStudio) then + FManagementStudioIndex := AddVerb('Management Studio...', ServerToolMethod); + end; + + inherited; +end; + +{ TMSSQLEditor } + +procedure TMSSQLEditor.InitVerbs; +begin + AddVerb('MSSQL E&ditor...', TMSSQLEditorForm, TMSDesignUtils); +end; + +{ TMSStoredProcEditor } + +procedure TMSStoredProcEditor.ExecuteVerb(Index: integer); +begin + if Index = GetVerbCount - 1 then + ConvertToClass(Designer, Component, TMSQuery) + else + inherited ExecuteVerb(Index); +end; + +procedure TMSStoredProcEditor.InitVerbs; +begin + AddVerb('Fields &Editor...', ShowFieldsEditor); + AddVerb('MSStoredProc E&ditor...', TMSStoredProcEditorForm, TMSDesignUtils); + AddVerb('Data Editor...', ShowDataEditor); + AddVerb('Convert to TMSQuery', ShowDataEditor); + + inherited; +end; + +{ TMSTableEditor } + +procedure TMSTableEditor.InitVerbs; +begin + AddVerb('Fields &Editor...', ShowFieldsEditor); + AddVerb('MSTable E&ditor...', TDATableEditorForm, TMSDesignUtils); + AddVerb('Data Editor...', ShowDataEditor); + + inherited; +end; + +{ TMSUpdateSQLEditor } + +procedure TMSUpdateSQLEditor.InitVerbs; +begin + inherited; + AddVerb('MSUpdateSQL E&ditor...', TMSUpdateSQLEditorForm, TMSDesignUtils); +end; + +{ TMSScriptEditor } + +procedure TMSScriptEditor.InitVerbs; +begin + inherited; + AddVerb('MSScript E&ditor...', TDAScriptEditorForm, TMSDesignUtils); +end; + +{ TMSDumpEditor } +{$IFNDEF STD} +procedure TMSDumpEditor.InitVerbs; +begin + inherited; + AddVerb('MSDump E&ditor...', TMSDumpEditorForm, TMSDesignUtils); +end; +{$ENDIF} + +{ TMSConnectionList } + +function TMSConnectionList.GetConnectionType: TCustomDAConnectionClass; +begin + Result := TMSConnection; +end; + +{$IFDEF VER6P} + +{ TMSDesignNotification } + +function TMSDesignNotification.CreateConnectionList: TDAConnectionList; +begin + Result := TMSConnectionList.Create; +end; + +function TMSDesignNotification.GetConnectionPropertyName: string; +begin + Result := 'Connection'; +end; + +procedure TMSDesignNotification.ItemInserted(const ADesigner: IDesigner; AItem: TPersistent); +begin + if (AItem <> nil) and ((AItem is TCustomMSDataSet) or (AItem is TMSSQL) or + (AItem is TMSScript) {$IFNDEF STD}or (AItem is TMSLoader) or (AItem is TMSDump) or (AItem is TMSServiceBroker){$ENDIF} or + (AItem is TMSDataSource)) then + FItem := AItem; +end; + +procedure TMSDesignNotification.SelectionChanged(const ADesigner: IDesigner; + const ASelection: IDesignerSelections); +{$IFDEF CLR} +begin +end; +{$ELSE} +var + ModuleServices: IOTAModuleServices; + CurrentModule: IOTAModule; + Project: IOTAProject; + ProjectOptions: IOTAProjectOptions; + DelphiPath: string; + s: string; +begin + CurrentProjectOutputDir := ''; + +{$IFDEF CLR} + ModuleServices := BorlandIDE.ModuleServices; +{$ELSE} + ModuleServices :=BorlandIDEServices as IOTAModuleServices; +{$ENDIF} + + CurrentModule := ModuleServices.CurrentModule; + + if CurrentModule.OwnerCount = 0 then + Exit; + + Project := CurrentModule.Owners[0]; + + ProjectOptions := Project.ProjectOptions; + + CurrentProjectOutputDir := Trim(ProjectOptions.Values['OutputDir']); + + if (CurrentProjectOutputDir <> '') then begin + if (CurrentProjectOutputDir[1] = '.') then begin // relative path + s := Trim(ExtractFilePath(Project.FileName)); + if s = '' then + CurrentProjectOutputDir := '' + else + CurrentProjectOutputDir := IncludeTrailingBackslash(s) + CurrentProjectOutputDir; + end + else + if Pos('$(DELPHI)', UpperCase(CurrentProjectOutputDir)) > 0 then begin + DelphiPath := GetEnvironmentVariable('DELPHI'); + CurrentProjectOutputDir := StringReplace(CurrentProjectOutputDir, '$(DELPHI)', DelphiPath, [rfReplaceAll, rfIgnoreCase]); + end; + end + else + CurrentProjectOutputDir := Trim(ExtractFilePath(Project.FileName)); +end; +{$ENDIF} +{$ENDIF} + +procedure Register; +begin + // Register property editors + RegisterPropertyEditor(TypeInfo(String), TMSConnection, 'ConnectString', TMSConnectStringPropertyEditor); + RegisterPropertyEditor(TypeInfo(String), TMSConnection, 'Server', TMSServerNamePropertyEditor); + RegisterPropertyEditor(TypeInfo(String), TMSConnection, 'Database', TMSDatabaseNamePropertyEditor); + RegisterPropertyEditor(TypeInfo(TCustomConnectDialog), TMSConnection, 'ConnectDialog', TMSConnectDialogPropertyEditor); + + RegisterPropertyEditor(TypeInfo(TStrings), TMSQuery, 'SQL', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSQuery, 'SQLDelete', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSQuery, 'SQLInsert', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSQuery, 'SQLRefresh', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSQuery, 'SQLUpdate', TDAPropertyEditor); + + RegisterPropertyEditor(TypeInfo(TStrings), TMSSQL, 'SQL', TDAPropertyEditor); + + RegisterPropertyEditor(TypeInfo(TStrings), TMSStoredProc, 'SQL', nil); + RegisterPropertyEditor(TypeInfo(TStrings), TMSStoredProc, 'SQLDelete', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSStoredProc, 'SQLInsert', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSStoredProc, 'SQLRefresh', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSStoredProc, 'SQLUpdate', TDAPropertyEditor); + + RegisterPropertyEditor(TypeInfo(TStrings), TMSUpdateSQL, 'InsertSQL', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSUpdateSQL, 'ModifySQL', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSUpdateSQL, 'DeleteSQL', TDAPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStrings), TMSUpdateSQL, 'RefreshSQL', TDAPropertyEditor); + + RegisterPropertyEditor(TypeInfo(String), TMSMetadata, 'DatabaseName', TMSDatabaseNamePropertyEditor); + + RegisterPropertyEditor(TypeInfo(TStrings), TMSScript, 'SQL', TDAPropertyEditor); + +{$IFNDEF STD} + RegisterPropertyEditor(TypeInfo(String), TMSServiceBroker, 'Service', TMSServicePropertyEditor); + + RegisterPropertyEditor(TypeInfo(String), TMSDump, 'TableNames', TMSTableNamesEditor); +{$ENDIF} + + // Register component editors + DARegisterComponentEditor(TMSConnection, TMSConnectionEditor, TMSConnectionEditorForm, TMSDesignUtils); + DARegisterComponentEditor(TMSQuery, TMSQueryEditor, TMSQueryEditorForm, TMSDesignUtils); + DARegisterComponentEditor(TMSSQL, TMSSQLEditor, TMSSQLEditorForm, TMSDesignUtils); + DARegisterComponentEditor(TMSTable, TMSTableEditor, TDATableEditorForm, TMSDesignUtils); + DARegisterComponentEditor(TMSStoredProc, TMSStoredProcEditor, TMSStoredProcEditorForm, TMSDesignUtils); + DARegisterComponentEditor(TMSUpdateSQL, TMSUpdateSQLEditor, TMSUpdateSQLEditorForm, TMSDesignUtils); + DARegisterComponentEditor(TMSScript, TMSScriptEditor, TDAScriptEditorForm, TMSDesignUtils); +{$IFNDEF STD} + DARegisterComponentEditor(TMSDump, TMSDumpEditor, TMSDumpEditorForm, TMSDesignUtils); +{$ENDIF} + + RegisterComponentEditor(TMSDataSource, TCRDataSourceEditor); + + Menu.AddItems({$IFDEF CLR}WinUtils{$ELSE}SysInit{$ENDIF}.HInstance); +end; + +procedure ClearTmpFiles; +var + i: integer; +begin + if TmpFiles = nil then + exit; + + for i := 0 to TmpFiles.Count - 1 do + DeleteFile(TmpFiles[i]); +end; + +{$IFDEF VER6P} +var + Notificator: TMSDesignNotification; +{$ENDIF} + +initialization + + TmpFiles := nil; + TmpFiles := TStringList.Create; + +{$IFDEF VER6P} + Notificator := TMSDesignNotification.Create; + RegisterDesignNotification(Notificator); +{$ENDIF} + + ClearTmpFiles; + +{$IFDEF VER6P} + UnRegisterDesignNotification(Notificator); +{$ENDIF} + +end. diff --git a/internal/4.10.0.10/1/Source/Design/MSDesign.res b/internal/4.10.0.10/1/Source/Design/MSDesign.res new file mode 100644 index 0000000000000000000000000000000000000000..acad9b317b5343b83f99e058d1dd6a0a73121fcd GIT binary patch literal 38688 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 Vb8`=Un|0{xtg-l9U4LKv{{_KhplNgO} zsDp~qA_^+_0w@Zot$_HtQ4=+a#*U~M9Z^B$O|*dlL}mmL2IOs?Uv&^KfSM zwv%wZgNj}Z*U4c&sd~^E=8@Q=l-!Av-D*3SW1B)z~&<+K>7mzO^5{Mf#Hg=r@C0de7gw z@6dij`%im)2VJ7o9X}FmG=>?&!W~h_X$%SriZIdp4fie5A%_K~Gg(cKhzNJ4pQPy# z5fLbXx-d08-DEVSiwKf1njg;2Tvb@Wl<7v}℘W*VXy@j;vzoUR0(URbi861kiL} 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 '' then begin + FEmFile := FEmFile + '\SQL Server Enterprise Manager.MSC'; + Result := FileExists(FEmFile); + Break; + end; + end; + end; + finally + Reg.Free; + end; + end; + + function IsQaAvaible: boolean; + var + p: IntPtr; + begin + FQaFile := 'isqlw.exe'; + {$IFDEF CLR} + Result := SearchPath(nil, FQaFile, nil, 0, nil, p) <> 0; + {$ELSE} + Result := SearchPath(nil, @FQaFile[1], nil, 0, nil, PAnsiChar(p)) <> 0; + {$ENDIF} + end; + + function IsMsAvaible: boolean; + var + p: IntPtr; + begin + FMsFile := 'sqlwb.exe'; + {$IFDEF CLR} + Result := SearchPath(nil, FMsFile, nil, 0, nil, p) <> 0; + {$ELSE} + Result := SearchPath(nil, @FMsFile[1], nil, 0, nil, PAnsiChar(p)) <> 0; + {$ENDIF} + end; + +var + QaAvaible, EmAvaible, MsAvaible: boolean; + +begin + Result := inherited AddItems(Instance); + if not Result then + Exit; + + with FCRMenu.SubMenu do begin + EmAvaible := IsEmAvaible; + QaAvaible := IsQaAvaible; + MsAvaible := IsMsAvaible; + + + if EmAvaible or QaAvaible or MsAvaible then begin + if EmAvaible then + Add(sEmItemCaption, sEmItemName, EnterpriseManagerItemClick); + if QaAvaible then + Add(sQaItemCaption, sQaItemName, QueryAnalyzerItemItemClick); + if MsAvaible then + Add(SMsItemCaption, sMsItemName, ManagementStudioItemItemClick); + + AddSeparator; + end; + + if HasMonitor then begin + Add(sDBMonitorItemCaption, sDBMonitorItemName, DBMonitorItemClick); + end; + + AddWizards; + AddSeparator; + + AddHelp(sHelpItemCaption, sHelpItemName, 'Sdac'); + AddFAQ(sFAQCaption, sFAQName, 'Sdac'); + AddSeparator; + + Add(sHomePageCaption, sHomePageName, HomePageItemClick); + Add(sSdacPageCaption, sSdacPageName, SdacPageItemClick); + Add(sDBMonitorPageCaption, sDBMonitorPageName, DBMonitorPageItemClick); + AddSeparator; + AddAbout; + end; +end; + +procedure TMSMenu.DBMonitorItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +begin + ShellExecute(0, 'open', PChar(WhereMonitor), '', '', SW_SHOW); +end; + +procedure TMSMenu.DBMonitorPageItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +begin + OpenUrl('http://www.crlab.com/dbmonitor/dbmon.exe'); +end; + +procedure TMSMenu.EnterpriseManagerItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +var + i: integer; +begin +{$IFDEF CLR} + i := ShellExecute(0, '', FEmFile, '', '', SW_SHOWNORMAL); +{$ELSE} + i := ShellExecute(0, nil, @FEmFile[1], nil, nil, SW_SHOWNORMAL); +{$ENDIF} + if i <= 32 then + TAPIMenuItem(Sender).Enabled := False; +end; + +procedure TMSMenu.QueryAnalyzerItemItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +var + i: integer; + s: string; +begin + s := '-1'; +{$IFDEF CLR} + i := ShellExecute(0, '', FQaFile, s, '', SW_SHOWNORMAL); +{$ELSE} + i := ShellExecute(0, nil, @FQaFile[1], @s[1], nil, SW_SHOWNORMAL); +{$ENDIF} + if i <= 32 then + TAPIMenuItem(Sender).Enabled := False; +end; + +procedure TMSMenu.ManagementStudioItemItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +var + i: integer; +begin +{$IFDEF CLR} + i := ShellExecute(0, '', FMsFile, nil, '', SW_SHOWNORMAL); +{$ELSE} + i := ShellExecute(0, nil, @FMsFile[1], nil, nil, SW_SHOWNORMAL); +{$ENDIF} + if i <= 32 then + TAPIMenuItem(Sender).Enabled := False; +end; + +procedure TMSMenu.HomePageItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +begin + OpenUrl('http://www.crlab.com'); +end; + +procedure TMSMenu.SdacPageItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +begin + OpenUrl('http://www.crlab.com/sdac'); +end; + +procedure TMSMenu.AboutItemClick(Sender: TDAMenuClickSender{$IFDEF CLR}; E: EventArgs{$ENDIF}); +begin + ShowAbout; +end; + +initialization + Menu := TMSMenu.Create; +finalization + Menu.Free; +end. + diff --git a/internal/4.10.0.10/1/Source/Design/MSNamesEditor.dfm b/internal/4.10.0.10/1/Source/Design/MSNamesEditor.dfm new file mode 100644 index 0000000..18debc8 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSNamesEditor.dfm @@ -0,0 +1,5 @@ +inherited MSNamesEditorForm: TMSNamesEditorForm + Caption = 'MSNamesEditorForm' + PixelsPerInch = 96 + TextHeight = 13 +end diff --git a/internal/4.10.0.10/1/Source/Design/MSNamesEditor.pas b/internal/4.10.0.10/1/Source/Design/MSNamesEditor.pas new file mode 100644 index 0000000..a41422d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSNamesEditor.pas @@ -0,0 +1,105 @@ +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// MSNames Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSNamesEditor; +{$ENDIF} + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, Grids, DBGrids, DBCtrls, Buttons, ExtCtrls, StdCtrls, +{$ENDIF} +{$IFDEF LINUX} + Qt, SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs, QStdCtrls, + QComCtrls, QGrids, QDBGrids, QDBCtrls, QButtons, QExtCtrls, +{$ENDIF} + CREditor, DADualListEditor, MSAccess; + +type + TMSNamesEditorForm = class(TDADualListEditorForm) + protected + FConnection: TMSConnection; + FNames: string; + + procedure DoInit; override; + procedure DoSave; override; + + function GetComponent: TComponent; override; + procedure SetComponent(Value: TComponent); override; + + function GetSrcLabelCaption: string; override; + procedure GetSrcListItems(Items: TStrings); override; + function GetDestLabelCaption: string; override; + procedure GetDstListItems(Items: TStrings); override; + public + property Connection: TMSConnection read FConnection write FConnection; + property Names: string read FNames write FNames; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R MSNamesEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +{ TMSNamesEditorForm } + +procedure TMSNamesEditorForm.DoInit; +begin + if Connection = nil then + Abort; + + inherited; +end; + +procedure TMSNamesEditorForm.DoSave; +begin + Names := TableNamesFromList(DstList.Items); +end; + +function TMSNamesEditorForm.GetComponent: TComponent; +begin + Result := FConnection; +end; + +procedure TMSNamesEditorForm.SetComponent(Value: TComponent); +begin + FConnection := Value as TMSConnection; +end; + +function TMSNamesEditorForm.GetDestLabelCaption: string; +begin + Result := 'Selected tables'; +end; + +procedure TMSNamesEditorForm.GetDstListItems(Items: TStrings); +begin + TableNamesToList(Names, DstList.Items); +end; + +function TMSNamesEditorForm.GetSrcLabelCaption: string; +begin + Result := 'Available tables'; +end; + +procedure TMSNamesEditorForm.GetSrcListItems(Items: TStrings); +begin + Connection.GetTableNames(Items); +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/MSParamsFrame.dfm b/internal/4.10.0.10/1/Source/Design/MSParamsFrame.dfm new file mode 100644 index 0000000..947283d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSParamsFrame.dfm @@ -0,0 +1,2 @@ +inherited MSParamsFrame: TMSParamsFrame +end diff --git a/internal/4.10.0.10/1/Source/Design/MSParamsFrame.pas b/internal/4.10.0.10/1/Source/Design/MSParamsFrame.pas new file mode 100644 index 0000000..e4c6c5f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSParamsFrame.pas @@ -0,0 +1,76 @@ + +////////////////////////////////////////////////// +// SQL Server Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// SDAC Params Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I SDac.inc} + +unit MSParamsFrame; +{$ENDIF} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, DAParamsFrame, MSAccess; + +type + TMSParamsFrame = class(TDAParamsFrame) + public + constructor Create(AOwner: TComponent); override; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R MSParamsFrame.dfm} +{$ENDIF} + +uses + DB; + +{ TMSParamsFrame } + +constructor TMSParamsFrame.Create(AOwner: TComponent); +begin + inherited; + + AddDataType('Unknown', ftUnknown, True, False, False, ''); + AddDataType('String', ftString, False, True, True, ''); + AddDataType('WideString', ftWideString, False, True, True, ''); + AddDataType('Smallint', ftSmallint, True, True, False, '0'); + AddDataType('Integer', ftInteger, True, True, False, '0'); + AddDataType('Word', ftWord, True, True, False, '0'); + AddDataType('LargeInt', ftLargeInt, True, True, False, '0'); + AddDataType('Boolean', ftBoolean, False, True, True, 'False'); + AddDataType('Float', ftFloat, True, True, False, '0'); + AddDataType('Currency', ftCurrency, True, True, False, '0'); + AddDataType('BCD', ftBCD, True, True, False, '0'); +{$IFDEF VER6P} + AddDataType('FMTBcd', ftFMTBcd, True, True, False, '0'); +{$ENDIF} + AddDataType('DateTime', ftDateTime, True, True, False, ''); + AddDataType('Memo', ftMemo, False, True, False, ''); +{$IFDEF VER10P} + AddDataType('WideMemo', ftWideMemo, False, True, False, ''); +{$ENDIF} + AddDataType('Bytes', ftBytes, False, False, True, ''); + AddDataType('VarBytes', ftVarBytes, False, False, True, ''); + AddDataType('Blob', ftBlob, False, False, False, ''); + AddDataType('GUID', ftGuid, False, False, False, ''); + AddDataType('Variant', ftVariant, False, False, False, ''); + AddDataType('XML', TFieldType(ftMSXML), False, True, False, ''); + + AddParamType('IN', ptInput); + AddParamType('IN/OUT', ptInputOutput); + AddParamType('RESULT', ptResult); +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/MSQueryEditor.dfm b/internal/4.10.0.10/1/Source/Design/MSQueryEditor.dfm new file mode 100644 index 0000000..cd25f30 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSQueryEditor.dfm @@ -0,0 +1,48 @@ +inherited MSQueryEditorForm: TMSQueryEditorForm + Width = 599 + Caption = 'MSQueryEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Width = 591 + inherited imCorner: TImage + Left = 579 + end + inherited btOk: TBitBtn + Left = 427 + end + inherited btCancel: TBitBtn + Left = 508 + end + inherited btExecute: TButton + Width = 99 + end + inherited btnDataEditor: TBitBtn + Left = 110 + Width = 99 + end + object btQueryAnalyzer: TBitBtn + Left = 212 + Top = 8 + Width = 99 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Query Analyzer' + TabOrder = 4 + OnClick = btQueryAnalyzerClick + end + object btManagementStudio: TBitBtn + Left = 314 + Top = 8 + Width = 99 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Management Studio' + TabOrder = 5 + OnClick = btManagementStudioClick + end + end + inherited PageControl: TPageControl + Width = 575 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/MSQueryEditor.pas b/internal/4.10.0.10/1/Source/Design/MSQueryEditor.pas new file mode 100644 index 0000000..0399944 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSQueryEditor.pas @@ -0,0 +1,102 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// MSQuery Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I SDac.inc} + +unit MSQueryEditor; +{$ENDIF} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, DAQueryEditor, ComCtrls, StdCtrls, Buttons, ExtCtrls; + +type + + TMSQueryEditorForm = class(TDAQueryEditorForm) + btQueryAnalyzer: TBitBtn; + btManagementStudio: TBitBtn; + procedure btQueryAnalyzerClick(Sender: TObject); + procedure btManagementStudioClick(Sender: TObject); + protected + procedure DoInit; override; + procedure DoError(E: Exception); override; + public + property Query; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R MSQueryEditor.dfm} +{$ENDIF} + +uses + DASQLFrame, DAParamsFrame, MSParamsFrame, DAMacrosFrame, DASPCallFrame, + MSSPCallFrame, DAUpdateSQLFrame, DASQLGeneratorFrame, MSSQLEditor, + MSAccess, OLEDBAccess{$IFDEF SDAC}, MSDesign{$ENDIF}; + +{ TMSQueryEditorForm } + +procedure TMSQueryEditorForm.DoInit; +begin + FSQLFrame := AddTab(TDASQLFrame, shSQL) as TDASQLFrame; + FParamsFrame := AddTab(TMSParamsFrame, shParameters) as TDAParamsFrame; + FMacrosFrame := AddTab(TDAMacrosFrame, shMacros) as TDAMacrosFrame; + FSPCallFrame := AddTab(TMSSPCallFrame, shGeneratorSPC) as TDASPCallFrame; + FUpdateSQLFrame := AddTab(TDAUpdateSQLFrame, shEditSQL) as TDAUpdateSQLFrame; + FSQLGeneratorFrame := AddTab(TDASQLGeneratorFrame, shGenerator) as TDASQLGeneratorFrame; + + inherited; +{$IFDEF SDAC} + btQueryAnalyzer.Visible := IsServerToolInstalled(stQueryAnalyser); +{$ENDIF} + if btQueryAnalyzer.Visible and (Query.Connection <> nil) then + btQueryAnalyzer.Visible := TMSConnection(Query.Connection).Options.Provider <> prCompact; + +{$IFDEF SDAC} + btManagementStudio.Visible := IsServerToolInstalled(stManagementStudio); +{$ENDIF} + if btManagementStudio.Visible and (Query.Connection <> nil) then + btManagementStudio.Visible := TMSConnection(Query.Connection).Options.Provider <> prCompact; + + if btQueryAnalyzer.Visible and btManagementStudio.Visible then + Constraints.MinWidth := 619; +end; + +procedure TMSQueryEditorForm.DoError(E: Exception); +begin + if E is EMSError then + MSSQLEditor.DoError(Self, EMSError(E)) + else + if E is EOLEDBError then + MSSQLEditor.DoError(Self, EOLEDBError(E)) + else + inherited; +end; + +procedure TMSQueryEditorForm.btQueryAnalyzerClick(Sender: TObject); +begin +{$IFDEF SDAC} + RunServerToolDataSet(stQueryAnalyser, LocalComponent as TCustomMSDataSet); +{$ENDIF} +end; + +procedure TMSQueryEditorForm.btManagementStudioClick(Sender: TObject); +begin +{$IFDEF SDAC} + RunServerToolDataSet(stManagementStudio, LocalComponent as TCustomMSDataSet); +{$ENDIF} +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/MSReg.pas b/internal/4.10.0.10/1/Source/Design/MSReg.pas new file mode 100644 index 0000000..079d403 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSReg.pas @@ -0,0 +1,69 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC registration +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSReg; +{$ENDIF} + +interface +uses + Classes, MSAccess, MSSQLMonitor, SdacVcl, MSScript{$IFNDEF STD}, MSLoader, MSDump, MSServiceBroker{$ENDIF}; + +procedure Register; + +implementation + +uses +{$IFDEF CLR} + CoreLab.Sdac.DataAdapter, +{$ENDIF} + DBAccess, DacReg; + +{$IFNDEF CLR} + {$IFDEF VER9} + {$R MSDesign9.res} + {$ELSE} + {$R MSDesign.res} + {$ENDIF} + {$IFDEF VER10P} + {$R MSDesign10p.res} + {$ENDIF} +{$ELSE} + {$R MSDesign.res} +{$ENDIF} + +procedure Register; +begin +{$IFNDEF STD} + RegisterCRBatchMove; +{$ENDIF} + + RegisterComponents('SQL Server Access', [TMSConnection]); + RegisterComponents('SQL Server Access', [TMSQuery]); + RegisterComponents('SQL Server Access', [TMSTable]); + RegisterComponents('SQL Server Access', [TMSStoredProc]); + RegisterComponents('SQL Server Access', [TMSSQL]); + RegisterComponents('SQL Server Access', [TMSScript]); + RegisterComponents('SQL Server Access', [TMSUpdateSQL]); + RegisterComponents('SQL Server Access', [TMSDataSource]); + +{$IFNDEF STD} + RegisterComponents('SQL Server Access', [TMSLoader]); + RegisterComponents('SQL Server Access', [TMSDump]); + RegisterComponents('SQL Server Access', [TMSServiceBroker]); + RegisterComponents('SQL Server Access', [TMSMetadata]); +{$ENDIF} + + RegisterComponents('SQL Server Access', [TMSSQLMonitor]); + RegisterComponents('SQL Server Access', [TMSConnectDialog]); +end; + +end. + diff --git a/internal/4.10.0.10/1/Source/Design/MSSPCallFrame.dfm b/internal/4.10.0.10/1/Source/Design/MSSPCallFrame.dfm new file mode 100644 index 0000000..4858117 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSSPCallFrame.dfm @@ -0,0 +1,19 @@ +inherited MSSPCallFrame: TMSSPCallFrame + inherited pnSQLSP: TPanel + inherited cbStoredProcNameSP: TComboBox + Width = 304 + end + object cbSystem: TCheckBox + Left = 411 + Top = 16 + Width = 58 + Height = 17 + Anchors = [akTop, akRight] + Caption = 'System' + Checked = True + State = cbChecked + TabOrder = 1 + OnClick = cbSystemClick + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/MSSPCallFrame.pas b/internal/4.10.0.10/1/Source/Design/MSSPCallFrame.pas new file mode 100644 index 0000000..d4cabcd --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSSPCallFrame.pas @@ -0,0 +1,79 @@ + +////////////////////////////////////////////////// +// SQL Server Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// SDAC Stored Proc Call Generator Frame +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I SDac.inc} + +unit MSSPCallFrame; +{$ENDIF} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, DASPCallFrame, StdCtrls, Buttons, ExtCtrls, DBAccess; + +type + TMSSPCallFrame = class(TDASPCallFrame) + cbSystem: TCheckBox; + procedure cbStoredProcNameDropDown(Sender: TObject); + procedure cbSystemClick(Sender: TObject); + protected + function CreateProcCall(SPName: string; SPParams: TDAParams): string; override; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R MSSPCallFrame.dfm} +{$ENDIF} + +uses + MSAccess; + +{ TMSSPCallFrame } + +function TMSSPCallFrame.CreateProcCall(SPName: string; SPParams: TDAParams): string; +var + MSSQL: TMSSQL; +begin + MSSQL := TMSSQL.Create(nil); + try + MSSQL.Connection := TMSConnection(UsedConnection); + Assert(MSSQL.Connection <> nil); + MSSQL.CreateProcCall(SPName); + SPParams.Assign(MSSQL.Params); + Result := MSSQL.SQL.Text; + finally + MSSQL.Free; + end; +end; + +procedure TMSSPCallFrame.cbStoredProcNameDropDown(Sender: TObject); +begin + try + if not FListGot and (UsedConnection <> nil) then begin + Editor.CheckConnection(UsedConnection); + TMSConnection(UsedConnection).GetStoredProcNames(cbStoredProcName.Items, cbSystem.Checked); + cbStoredProcNameSP.Items.Assign(cbStoredProcName.Items); + FListGot := True; + end; + except + Application.HandleException(Self); + end; +end; + +procedure TMSSPCallFrame.cbSystemClick(Sender: TObject); +begin + FListGot := False; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/MSSQLEditor.dfm b/internal/4.10.0.10/1/Source/Design/MSSQLEditor.dfm new file mode 100644 index 0000000..f33dd66 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSSQLEditor.dfm @@ -0,0 +1,30 @@ +inherited MSSQLEditorForm: TMSSQLEditorForm + Caption = 'MSSQLEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + inherited btExecute: TButton + Width = 99 + end + object btQueryAnalyzer: TButton + Left = 112 + Top = 8 + Width = 99 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Query Analyzer' + TabOrder = 3 + OnClick = btQueryAnalyzerClick + end + object btManagementStudio: TButton + Left = 216 + Top = 8 + Width = 99 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Management Studio' + TabOrder = 4 + OnClick = btManagementStudioClick + end + end +end diff --git a/internal/4.10.0.10/1/Source/Design/MSSQLEditor.pas b/internal/4.10.0.10/1/Source/Design/MSSQLEditor.pas new file mode 100644 index 0000000..f03b311 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSSQLEditor.pas @@ -0,0 +1,98 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// MSSQL Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I SDac.inc} + +unit MSSQLEditor; +{$ENDIF} +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, DASQLEditor, ComCtrls, StdCtrls, Buttons, ExtCtrls, + OLEDBAccess; + +type + TMSSQLEditorForm = class(TDASQLEditorForm) + btQueryAnalyzer: TButton; + btManagementStudio: TButton; + procedure btQueryAnalyzerClick(Sender: TObject); + procedure btManagementStudioClick(Sender: TObject); + protected + procedure DoInit; override; + procedure DoError(E: Exception); override; + public + property SQL; + end; + +procedure DoError(Sender: TDASQLEditorForm; E: EOLEDBError); + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R MSSQLEditor.dfm} +{$ENDIF} + +uses + MSAccess, DASQLFrame, DAParamsFrame, MSParamsFrame, DAMacrosFrame, DASPCallFrame, + MSSPCallFrame{$IFDEF SDAC}, MSDesign{$ENDIF}; + +procedure DoError(Sender: TDASQLEditorForm; E: EOLEDBError); +begin + Sender.ActivateFrame(Sender.SQLFrame); + Sender.ActiveControl := Sender.SQLFrame.meSQL; +end; + +{ TMSSQLEditorForm } + +procedure TMSSQLEditorForm.DoError(E: Exception); +begin + if E is EOLEDBError then + {$IFDEF CLR}CoreLab.SDac.Design.{$ENDIF}MSSQLEditor.DoError(Self, EOLEDBError(E)) + else + inherited; +end; + +procedure TMSSQLEditorForm.DoInit; +begin + FSQLFrame := AddTab(TDASQLFrame, shSQL) as TDASQLFrame; + FParamsFrame := AddTab(TMSParamsFrame, shParameters) as TDAParamsFrame; + FMacrosFrame := AddTab(TDAMacrosFrame, shMacros) as TDAMacrosFrame; + FSPCallFrame := AddTab(TMSSPCallFrame, shGeneratorSPC) as TDASPCallFrame; + + inherited; + +{$IFDEF SDAC} + btQueryAnalyzer.Visible := IsServerToolInstalled(stQueryAnalyser); + btManagementStudio.Visible := IsServerToolInstalled(stManagementStudio); + if btQueryAnalyzer.Visible and (SQL.Connection <> nil) then + btQueryAnalyzer.Visible := TMSConnection(SQL.Connection).Options.Provider <> prCompact; + if btManagementStudio.Visible and (SQL.Connection <> nil) then + btManagementStudio.Visible := TMSConnection(SQL.Connection).Options.Provider <> prCompact; +{$ENDIF} +end; + +procedure TMSSQLEditorForm.btQueryAnalyzerClick(Sender: TObject); +begin +{$IFDEF SDAC} + RunServerToolMSSQL(stQueryAnalyser, LocalComponent as TMSSQL); +{$ENDIF} +end; + +procedure TMSSQLEditorForm.btManagementStudioClick(Sender: TObject); +begin +{$IFDEF SDAC} + RunServerToolMSSQL(stManagementStudio, LocalComponent as TMSSQL); +{$ENDIF} +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/MSStoredProcEditor.dfm b/internal/4.10.0.10/1/Source/Design/MSStoredProcEditor.dfm new file mode 100644 index 0000000..c05eeb9 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSStoredProcEditor.dfm @@ -0,0 +1,48 @@ +inherited MSStoredProcEditorForm: TMSStoredProcEditorForm + Width = 619 + Caption = 'MSStoredProcEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Width = 611 + inherited imCorner: TImage + Left = 599 + end + inherited btOk: TBitBtn + Left = 447 + end + inherited btCancel: TBitBtn + Left = 528 + end + inherited btExecute: TButton + Width = 99 + end + inherited btnDataEditor: TBitBtn + Left = 110 + Width = 99 + end + object btnQuertAnalyzer: TBitBtn + Left = 212 + Top = 8 + Width = 99 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Query Analyzer' + TabOrder = 4 + OnClick = btnQuertAnalyzerClick + end + object btManagementStudio: TBitBtn + Left = 315 + Top = 8 + Width = 99 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Management Studio' + TabOrder = 5 + OnClick = btManagementStudioClick + end + end + inherited PageControl: TPageControl + Width = 595 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/MSStoredProcEditor.pas b/internal/4.10.0.10/1/Source/Design/MSStoredProcEditor.pas new file mode 100644 index 0000000..7c875b5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSStoredProcEditor.pas @@ -0,0 +1,80 @@ +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// MSStoredProc Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I SDac.inc} + +unit MSStoredProcEditor; +{$ENDIF} +interface +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, DAStoredProcEditor, ComCtrls, StdCtrls, Buttons, ExtCtrls; + +type + TMSStoredProcEditorForm = class(TDAStoredProcEditorForm) + btnQuertAnalyzer: TBitBtn; + btManagementStudio: TBitBtn; + procedure btnQuertAnalyzerClick(Sender: TObject); + procedure btManagementStudioClick(Sender: TObject); + protected + procedure DoInit; override; + public + property StoredProc; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R MSStoredProcEditor.dfm} +{$ENDIF} + +uses + MSAccess, DASQLFrame, DASPCallFrame, MSSPCallFrame, DAParamsFrame, MSParamsFrame, + DAMacrosFrame, DAUpdateSQLFrame, DASQLGeneratorFrame{$IFDEF SDAC}, MSDesign, OLEDBAccess{$ENDIF}; + +{ TMSStoredProcEditorForm } + +procedure TMSStoredProcEditorForm.DoInit; +begin + FSQLFrame := AddTab(TMSSPCallFrame, shSQL) as TDASQLFrame; + FParamsFrame := AddTab(TMSParamsFrame, shParameters) as TDAParamsFrame; + FMacrosFrame := AddTab(TDAMacrosFrame, shMacros) as TDAMacrosFrame; + FSPCallFrame := AddTab(TMSSPCallFrame, shGeneratorSPC) as TDASPCallFrame; + FUpdateSQLFrame := AddTab(TDAUpdateSQLFrame, shEditSQL) as TDAUpdateSQLFrame; + FSQLGeneratorFrame := AddTab(TDASQLGeneratorFrame, shGenerator) as TDASQLGeneratorFrame; + + inherited; +{$IFDEF SDAC} + btnQuertAnalyzer.Visible := IsServerToolInstalled(stQueryAnalyser); + if btnQuertAnalyzer.Visible and (StoredProc.Connection <> nil) then + btnQuertAnalyzer.Visible := TMSConnection(StoredProc.Connection).Options.Provider <> prCompact; + + btManagementStudio.Visible := IsServerToolInstalled(stManagementStudio); + if btManagementStudio.Visible and (StoredProc.Connection <> nil) then + btManagementStudio.Visible := TMSConnection(StoredProc.Connection).Options.Provider <> prCompact; +{$ENDIF} +end; + +procedure TMSStoredProcEditorForm.btnQuertAnalyzerClick(Sender: TObject); +begin +{$IFDEF SDAC} + RunServerToolDataSet(stQueryAnalyser, LocalComponent as TCustomMSDataSet); +{$ENDIF} +end; + +procedure TMSStoredProcEditorForm.btManagementStudioClick(Sender: TObject); +begin +{$IFDEF SDAC} + RunServerToolDataSet(stManagementStudio, LocalComponent as TCustomMSDataSet); +{$ENDIF} +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/MSUpdateSQLEditor.dfm b/internal/4.10.0.10/1/Source/Design/MSUpdateSQLEditor.dfm new file mode 100644 index 0000000..266ec15 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSUpdateSQLEditor.dfm @@ -0,0 +1,5 @@ +inherited MSUpdateSQLEditorForm: TMSUpdateSQLEditorForm + Caption = 'MSUpdateSQLEditorForm' + PixelsPerInch = 96 + TextHeight = 13 +end diff --git a/internal/4.10.0.10/1/Source/Design/MSUpdateSQLEditor.pas b/internal/4.10.0.10/1/Source/Design/MSUpdateSQLEditor.pas new file mode 100644 index 0000000..53fa479 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/MSUpdateSQLEditor.pas @@ -0,0 +1,43 @@ +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2005 Core Lab. All right reserved. +// MSStoredProc Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I SDac.inc} + +unit MSUpdateSQLEditor; +{$ENDIF} +interface +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, DAUpdateSQLEditor, ComCtrls, StdCtrls, Buttons, ExtCtrls; + +type + TMSUpdateSQLEditorForm = class(TDAUpdateSQLEditorForm) + protected + procedure DoInit; override; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R MSUpdateSQLEditor.dfm} +{$ENDIF} + +uses + DAUpdateSQLFrame, DASQLGeneratorFrame; + +procedure TMSUpdateSQLEditorForm.DoInit; +begin + FUpdateSQLFrame := AddTab(TDAUpdateSQLFrame, shEditSQL) as TDAUpdateSQLFrame; + FSQLGeneratorFrame := AddTab(TDASQLGeneratorFrame, shGenerator) as TDASQLGeneratorFrame; + inherited; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/SdacAbout.dfm b/internal/4.10.0.10/1/Source/Design/SdacAbout.dfm new file mode 100644 index 0000000..8653052 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/SdacAbout.dfm @@ -0,0 +1,3148 @@ +object SdacAboutForm: TSdacAboutForm + Left = 389 + Top = 167 + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'About SDAC' + ClientHeight = 280 + ClientWidth = 390 + Color = clBtnFace + ParentFont = True + OldCreateOrder = True + Position = poScreenCenter + OnMouseMove = FormMouseMove + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Bevel1: TBevel + Left = 8 + Top = 8 + Width = 123 + Height = 263 + end + object Image1: TImage + Left = 9 + Top = 9 + Width = 120 + Height = 260 + AutoSize = True + Picture.Data = { + 07544269746D6170D66D0100424DD66D01000000000036000000280000007800 + 0000040100000100180000000000A06D0100C30E0000C30E0000000000000000 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C26268C26268C26268C26268C27278D27278D27278D27278D27278D27278D27 + 278D26268C26268C26268C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C26268C26268C + 27278D28288D28288E29298E2A2A8F2B2B8F2C2C902D2D902D2D902E2E912E2E + 912E2E912E2E912E2E912D2D902C2C902B2B8F29298E28288E28288D27278D26 + 268C26268C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C26268C27278D28 + 288D28288E29298E2A2A8F2C2C902D2D902E2E91303092323293333393343494 + 3636953737953939963A3A973A3A973A3A973A3A973838963636953434943232 + 933030922E2E912B2B8F29298E28288D27278D26268C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C26268C26268C2727 + 8D28288D28288E29298E2A2A8F2B2B8F2C2C902D2D902E2E9130309232329334 + 34943737953A3A973C3C9840409A42429B45459D47479E49499F4A4A9F49499F + 48489E46469E43439C40409A3C3C983838963434943030922D2D902A2A8F2828 + 8E27278D26268C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C26268C + 26268C27278D27278D27278D26268C26268C25258C25258C25258C25258C2525 + 8C25258C26268C28288E2C2C902F2F913434943A3A9740409A45459D4B4BA051 + 51A35555A55858A75959A85A5AA85858A75555A55151A34B4BA046469E40409A + 3A3A973535953030922D2D9029298E28288D26268C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C26268C26268C26268C + 27278D27278D27278D27278D27278D27278D27278D26268C26268C25258C2525 + 8C2E2E9139399644449C4D4DA15757A65E5EAA6363AD6767AF6868AF6767AF63 + 63AD5E5EAA5757A75050A348489E40409A3A3A973434942E2E912B2B8F28288E + 27278D26268C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C26268C27278D27278D28288D28 + 288E29298E29298E2A2A8F2B2B8F2B2B8F2B2B8F2B2B8F2B2B8F2B2B8F2A2A8F + 2A2A8F29298E28288E28288D27278D25258C28288E39399648489E5656A66262 + AC6A6AB17171B47474B57373B56F6FB36969B06262AC5858A74F4FA245459D3D + 3D993535952F2F912B2B8F28288E27278D26268C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C26268C27278D28288D28288E2929 + 8E2B2B8F2C2C902D2D902E2E912F2F9130309231319231319232329332329331 + 31923131923030922F2F912E2E912E2E912D2D902B2B8F2A2A8F28288E27278D + 26268C2A2A8F3F3F9A5151A36262AC6F6FB37878B87C7CBA7D7DBA7A7AB97373 + B56969B05E5EAA5353A448489E3F3F9A3636953030922C2C9028288E27278D26 + 268C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C26268C27278D28288D28288E29298E + 2B2B8F2D2D902E2E913030923232933434943535953636953737953838963838 + 963838963838963838963737953636953535953434943333933232933030922F + 2F912E2E912C2C902A2A8F28288E27278D25258C3636954D4DA16262AC7272B5 + 7E7EBB8484BE8686BF8181BD7A7AB96F6FB36363AC5656A649499F3F3F9A3636 + 952F2F912B2B8F28288D26268C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C26268C27278D28288D29298E2B + 2B8F2D2D902F2F913131923434943636953838963A3A973B3B983C3C983E3E99 + 3E3E993E3E993E3E993E3E993D3D993C3C983B3B983A3A973A3A973838963737 + 953535953434943333933232933030922E2E912D2D902B2B8F29298E28288D26 + 268C3030924B4BA06363AC7575B68383BE8B8BC28C8CC28787C07E7EBB7272B5 + 6363AD5656A649499F3D3D993434942E2E912A2A8F28288D26268C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C26268C27278D28288D2929 + 8E2C2C902E2E913030923434943636953939963B3B983E3E9940409A41419B42 + 429B43439C43439C43439C3E3E963333872929772424711C1C651B1B6317175E + 12125612125617175E1919631A1A6520206F2323742A2A822F2F8F3030922E2E + 912E2E912C2C902A2A8F28288D26268C2E2E914C4CA16666AE7B7BBA8989C191 + 91C59191C58B8BC28080BC7272B56363AC5353A446469E3B3B983333932D2D90 + 29298E27278D26268C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C26268C27278D28288D + 29298E2C2C902E2E913131923434943838963B3B983E3E9941419B43439C4545 + 9D46469E46469E44449B35358725257119196012125612125612125612125612 + 1256121256121256121256121256121256121256121256121256121256121256 + 1212561717601F1F6F26267F2D2D902D2D902B2B8F29298E28288D26268C3333 + 935151A36D6DB28181BD9090C49696C89494C78C8CC38080BC6F6FB35F5FAB50 + 50A342429B3838963030922B2B8F28288D26268C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C26268C27278D28 + 288D29298E2B2B8F2E2E913131923535953939963D3D9940409A43439C46469E + 48489E49499F4A4A9F3A3A8A26267115155A1212561212561212561212561212 + 5612125612125612125612125612125612125612125612125612125612125612 + 125612125612125612125612125612125612125614145A1D1D6C2727822D2D90 + 2B2B8F29298E28288D25258C3A3A975A5AA87575B68A8AC19696C89A9ACA9696 + C88C8CC27C7CBA6B6BB15A5AA84B4BA03E3E993434942E2E9129298E27278D26 + 268C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2626 + 8C27278D28288E2B2B8F2E2E913131923434943939963D3D9941419B45459D48 + 489E4B4BA04B4BA048489B2E2E7A17175D121256121256121256121256121256 + 12125612125612125613135814145A15155B16165C16165D17175D17175D1616 + 5D16165C15155B14145A13135812125612125612125612125612125612125612 + 125612125615155C2020742B2B8D2A2A8F28288E27278D25258C45459D6464AD + 7F7FBB9292C69C9CCB9D9DCB9696C88888C07777B76464AD5353A444449C3939 + 963030922B2B8F28288D26268C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 26268C27278D28288E2A2A8F2D2D903030923434943838963D3D9941419B4545 + 9D49499F4C4CA14E4EA247479A2C2C7714145912125612125612125612125612 + 125612125714145A16165D1818601A1A621B1B641D1D661D1D671E1E681E1E69 + 1F1F691F1F691E1E691E1E681D1D671C1C651B1B6419196118186016165D1414 + 5A1212571212561212561212561212561212561313591E1E7129298B29298E28 + 288D26268C3030925252A47272B58B8BC29A9ACAA0A0CD9E9ECC9292C68282BD + 6F6FB35C5CA94B4BA03E3E993434942D2D9028288E27278D25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C26268C27278D28288D29298E2C2C902E2E913333933737953C3C9840409A + 45459D4A4A9F4D4DA14F4FA249499B2A2A731313571212561212561212561212 + 5612125715155B17175E1A1A621C1C651E1E6820206B21216D23236F24247125 + 257225257326267427277527277526267425257325257224247123236F21216D + 20206A1E1E681C1C651A1A6217175E15155B1212571212561212561212561212 + 561313581C1C6E28288A28288E27278D25258C40409A6363AC8080BC9696C8A1 + A1CDA3A3CE9B9BCA8C8CC27979B86565AE5252A443439C3737952F2F912A2A8F + 27278D26268C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C26268C27278D28288E2A2A8F2E2E913131923535953A3A9740 + 409A44449C49499F4C4CA15050A35050A1343480141459121256121256121256 + 12125614145917175D1919611D1D661F1F6921216D2323702525732727752929 + 782A2A7A2B2B7B2C2C7D2D2D7E2D2D7E2D2D7F2D2D7F2D2D7E2D2D7E2C2C7D2B + 2B7B2A2A7A29297827277525257323237021216D1F1F691C1C6519196117175D + 1313581212561212561212561212561313591F1F7429298D28288D26268C2E2E + 915252A47474B58E8EC39F9FCCA6A6D0A2A2CE9595C78282BD6E6EB25A5AA849 + 499F3B3B983232932C2C9028288D26268C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C26268C27278D28288D29298E2C2C902F2F913434943939 + 963E3E9943439C48489E4C4CA15050A35151A34343921D1D6312125612125612 + 125612125614145A18185F1B1B631E1E6821216C2323702626742828772B2B7B + 2D2D7E2E2E803030823131843232863333873434883434883434893434893434 + 883434883333873232863131843030822E2E802D2D7E2B2B7B28287726267423 + 237021216C1E1E681B1B6318185F14145A12125612125612125612125615155E + 22227D28288E27278D25258C43439C6767AF8686BF9B9BCAA6A6D0A6A6D09C9C + CB8B8BC27676B76262AC4F4FA240409A3434942E2E9128288E27278D25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C26268C27278D28288E2B2B8F2E2E91323293 + 3636953B3B9840409A46469E4B4BA04F4FA25151A34E4E9E2A2A721212561212 + 5612125612125614145A18185F1B1B641F1F6922226E2525722828762B2B7B2D + 2D7E2F2F8131318433338735358A36368C37378D39398F3939903A3A913A3A92 + 3B3B933B3B933A3A923A3A9139399039398F37378D36368C35358A3333873131 + 842F2F812E2E7E2C2C7B28287625257222226E1F1F691B1B6418185F14145A12 + 125612125612125612125618186525258728288D26268C3535955A5AA87B7BBA + 9595C7A5A5D0AAAAD2A2A2CE9292C67F7FBB6969B05555A545459D3838962F2F + 912A2A8F27278D26268C25258C25258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C26268C28288D29298E2C2C902F + 2F913434943939963F3F9A44449C49499F4E4EA25151A35353A43A3A8516165A + 12125612125612125614145918185F1B1B641F1F6923236F2626742929782C2C + 7D2F2F8131318434348836368B38388E3939903B3B933C3C953E3E973F3F983F + 3F9940409A41419B41419B41419B40409A40409A3F3F993F3F983E3E973C3C95 + 3B3B9339399038388E3C3C8D43438F3E3E8A3232822C2C7D2929782626742222 + 6E1F1F691B1B6418185F14145912125612125612125613135821217728288D27 + 278D28288E4C4CA17070B48E8EC3A2A2CEAAAAD2A7A7D19999C98686BF7070B4 + 5C5CA94A4A9F3B3B983232932C2C9028288D26268C25258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C25258C25258C26268C27278D28288D2A2A + 8F2E2E913131923636953B3B9841419B47479E4C4CA15151A35353A44949971F + 1F6612125612125612125613135817175D1A1A631F1F6922226E252574292979 + 2C2C7E2F2F8232328634348A37378D3939913B3B943D3D973F3F9940409C4242 + 9D43439F4343A04444A14545A24545A24545A34545A34545A24545A24444A143 + 43A042429E42429D40409C40409948489B54549F55559D505099474793383889 + 2F2F822C2C7D28287825257422226E1E1E691A1A6317175D1313581212561212 + 561616591D1D6825258527278D25258C40409A6565AE8686BF9E9ECCAAAAD2AA + AAD29F9FCC8D8DC37878B86363AC4F4FA240409A3434942E2E9128288E27278D + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C25258C26268C27278D + 28288E2B2B8F2E2E913333933838963E3E9944449C4A4A9F4F4FA25353A45454 + A332327C12125612125612125612125615155C1A1A621D1D6821216D25257328 + 28782C2C7E2F2F8232328735358B38388F3A3A933D3D963F3F9941419C43439F + 4444A14646A44747A54848A74848A74949A94A4AAA4A4AAA4A4AAA4A4AAA4A4A + AA4A4AAA4949A94848A74848A74646A54646A45151A76060AC6060AA4E4EA04B + 4B9C55559F4F4F9A3B3B8D3232872F2F822C2C7D28287825257221216D1D1D67 + 19196115155B12125616165919195C16165A1F1F7627278D26268C3434945959 + A87B7BBA9797C8A7A7D1ABABD3A4A4CF9494C78080BC6969B05555A544449C38 + 38962F2F912A2A8F27278D26268C25258C25258C25258C25258C25258C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C25258C25258C25258C25258C25258C26268C26 + 268C28288D29298E2C2C903030923434943A3A9740409A46469E4C4CA15151A3 + 5555A54E4E9C21216812125612125612125614145A1818601C1C6620206C2424 + 722828772B2B7D2F2F8232328735358B3838903B3B943E3E9840409C42429E44 + 44A14646A44848A74949A94A4AAA4B4BAC4C4CAD4D4DAF4E4EB04E4EB04E4EB1 + 4E4EB14E4EB14E4EB14E4EB04E4EB04D4DAF4C4CAD4B4BAC5757AF6B6BB76A6A + B55656AA4545A142429E5050A25A5AA452529E41419435358B3232872F2F822B + 2B7D28287724247121216C2020681C1C611C1C5F1A1A5D141458121256191968 + 27278A26268C29298E4D4DA17171B49090C4A4A4CFACACD3A8A8D19A9ACA8686 + BF7070B45B5BA849499F3A3A973131922B2B8F28288D26268C25258C25258C25 + 258C25258C25258C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C25258C25258C25258C25258C2525 + 8C26268C27278D28288E2A2A8F2E2E913232933737953D3D9943439C49499F4F + 4FA25353A45656A641418D16165A12125612125612125616165D1A1A631F1F69 + 2323702727752A2A7B2F2F8132328635358B3838903B3B943E3E9840409C4343 + A04545A34747A64949A94B4BAB4C4CAD4E4EAF4F4FB15050B35151B45252B552 + 52B65252B65353B75353B75353B75353B75252B65252B65252B55151B45A5AB7 + 7373C07474BF5B5BB34D4DAC4949A94747A64545A34F4FA45E5EA85757A44444 + 9738389035358B32328630308133337F34347C3131782C2C712424691B1B6013 + 135612125612125615155D23238127278D25258C42429B6666AE8787C09F9FCC + ABABD3ABABD3A0A0CD8D8DC37777B76161AC4D4DA13E3E993333932C2C902828 + 8E26268C25258C25258C25258C25258C25258C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C25258C25258C25258C + 25258C25258C26268C27278D28288E2B2B8F2E2E913434943939963F3F9A4545 + 9D4B4BA05151A35555A55555A42E2E7612125512125512125514145918185F1D + 1D6621216C2525722929782D2D7E30308334348938388E3B3B923E3E9740409B + 43439F4646A34848A64A4AA94C4CAC4E4EAE4F4FB15050B25252B55353B65454 + B75454B85555B95656BA5656BB5656BB5656BB5656BB5656BB5656BB5656BA55 + 55B95C5CBC7676C67C7CC76262BB5252B34F4FB14E4EAE4C4CAC4A4AA94848A6 + 5454A96262AC5A5AA649499B3E3E9440409248489346468E40408736367F2C2C + 7624246D1D1D6618185E1313571212551212551212561E1E7227278D26268C37 + 37955C5CA97E7EBB9999C9AAAAD2ADADD4A4A4CF9393C67E7EBB6767AF5252A4 + 41419B3535952E2E9129298E27278D25258C25258C25258C25258C25258C2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C25258C25 + 258C25258C25258C25258C26268C28288D29298E2C2C903030923535953A3A97 + 41419B47479E4D4DA15252A45656A64C4C991D1D631212551212551212551616 + 5B1A1A621F1F6823236F2727752B2B7C2F2F8133338736368C3A3A923D3D9640 + 409B43439F4646A34848A64A4AA94C4CAC4E4EAF5050B25252B55353B65454B8 + 5555BA5656BB5757BC5858BE5858BE5959BF5959BF5959C05959C05959C05959 + C05959BF5959BF5959BF6C6CC68787D06E6EC55555BA5454B85353B65252B450 + 50B24E4EAF4C4CAC4C4CAA5454AB6464B06161AC5757A45858A254549D464694 + 3A3A8A3131822B2B7A27277522226E1F1F681A1A6215155A1212561212551212 + 5518186526268A26268C2D2D905151A37575B69393C6A7A7D1AEAED4A9A9D199 + 99C98484BE6D6DB25757A745459D3838962F2F912A2A8F27278D26268C25258C + 25258C25258C25258C25258C25258C02000002000025258C25258C25258C2525 + 8C25258C25258C25258C25258C26268C27278D28288D2A2A8F2E2E9131319237 + 37953D3D9943439C4A4A9F5050A35454A55757A73C3C86141458121255121255 + 13135718185F1D1D6621216C2525722A2A792D2D7E32328535358A39398F3C3C + 943F3F9942429D4545A24848A64A4AA94D4DAD4E4EB05050B25252B55454B755 + 55BA5656BB5858BD5858BE5959C05A5AC15B5BC25B5BC35C5CC35C5CC45C5CC4 + 5C5CC45C5CC45C5CC45C5CC45C5CC35B5BC26E6EC98C8CD57474CA5A5ABF5858 + BD5656BB5555BA5454B75252B55050B24E4EB04D4DAD5656AE6666B36464AF58 + 58A745459B3F3F9638388F3535893131832D2D7E29297929297326266E222268 + 1C1C6016165916165915155816165E23238127278D25258C46469E6C6CB18C8C + C3A4A4CFAEAED4ABABD39E9ECC8A8AC17373B55D5DA94A4A9F3B3B983131922B + 2B8F28288D26268C25258C25258C25258C25258C25258C02000002000025258C + 25258C25258C25258C25258C25258C25258C26268C27278D28288E2B2B8F2E2E + 913333933939963F3F9A45459D4B4BA05151A35656A65454A229297012125512 + 125512125515155A1A1A611F1F6823236F2727752B2B7C30308233338737378D + 3B3B923E3E9742429C4444A04747A54A4AA94C4CAC4E4EB05050B25252B55454 + B85656BA5757BC5858BE5959C05A5AC15B5BC35C5CC45D5DC45D5DC65E5EC65E + 5EC75E5EC75E5EC75E5EC75E5EC75E5EC75E5EC75E5EC75E5EC66565C87E7ED2 + 8B8BD67373CC5E5EC25959C05858BE5757BC5656BA5454B85252B55050B24E4E + AF5454AF5656AE4A4AA64444A041419C3E3E973D3D933C3C8F3D3D8B3F3F8938 + 388233337B2E2E7527276D2222661B1B5F17175A17175A17175A1F1F7427278D + 25258C3D3D996363AC8585BF9F9FCCADADD4AEAED4A3A3CE9090C47979B86262 + AC4E4EA23F3F9A3434942D2D9028288E26268C25258C25258C25258C25258C02 + 000002000025258C25258C25258C25258C25258C25258C26268C27278D29298E + 2C2C902F2F913434943A3A9740409A47479E4D4DA15353A45757A64F4F9C1E1E + 6312125512125512125617175C1B1B6420206B2525712929782D2D7E32328535 + 358A3939903D3D9540409A43439F4646A34949A84C4CAC4E4EAF5050B25252B5 + 5454B85656BB5757BC5959BF5A5AC05B5BC25C5CC45D5DC45E5EC65E5EC75E5E + C75F5FC86060C96060C96060C96060C96060C96060C96060C96060C96060C960 + 60C95F5FC86565CA8181D49292DA7575CE5E5EC55B5BC25A5AC05858BE5757BC + 5656BA5454B85252B55050B24E4EAF4B4BAB4949A74848A44E4EA35252A25353 + 9E4F4F9942428F3C3C893535812D2D7929297322226B1E1E641A1A5E16165917 + 175A19195C1C1C6A26268A26268C3434945959A87D7DBA9999C9AAAAD2AFAFD5 + A6A6D09595C77F7FBB6868AF5353A442429B3636952E2E9129298E27278D2525 + 8C25258C25258C02000002000025258C25258C25258C25258C25258C26268C28 + 288D29298E2D2D903030923535953C3C9842429B49499F4F4FA25454A55757A7 + 43438E15155A11115511115514145918185F1D1D6722226D2626742A2A7A2E2E + 8133338736368C3A3A923D3D9741419D4444A14747A64A4AAA4D4DAE4F4FB151 + 51B55353B75555BA5656BC5A5AC05F5FC36161C46262C66363C76464C96363C9 + 6464CA6565CB6464CB6565CD6464CC6363CC6161CC6060CC6060CC6060CC6060 + CC6060CC6060CB6060CB6060CB5F5FC96464CB8080D68F8FDB7A7AD15F5FC75B + 5BC45A5AC25959C15757BE5656BC5555BA5353B75151B54F4FB15252B06161B3 + 6262B15D5DAC5050A34242993C3C9338388D3232862E2E802A2A792525732020 + 6C1C1C6518185F13135812125615155819196125258526268C2C2C905050A374 + 74B59292C6A7A7D1AFAFD5AAAAD29A9ACA8585BF6E6EB25858A746469E3A3A97 + 3030922A2A8F28288D26268C25258C02000002000025258C25258C25258C2626 + 8C27278D28288E2A2A8F2E2E913232933737953E3E9944449C4B4BA05151A356 + 56A65858A733337C11115511115511115515155B1A1A621F1F69232370282876 + 2C2C7D30308334348938388F3C3C943F3F9A43439F4646A44949A84B4BAC4E4E + B05050B35252B65454B95656BC5757BE5D5DC16262C56464C76565C86565C966 + 66CA6565CB6666CB6767CD6666CD6666CE6767CE6666CE6666CE6565CE6262CD + 6161CD6161CD6161CD6161CD6161CC6161CC6161CC6060CC6060CB6767CE7C7C + D59393DD7A7AD26262C95D5DC65B5BC45A5AC25959C05757BE5656BB5656BA5E + 5EBB6F6FC06B6BBB5D5DB35050AB4646A342429E3F3F993B3B9437378E343489 + 3030822B2B7C27277522226E1D1D6719196014145912125612125616165B2222 + 7C26268C25258C45459D6A6AB18B8BC2A3A3CEADADD4ABABD39E9ECC8B8BC275 + 75B65E5EAA4B4BA03D3D993333932C2C9028288E26268C02000002000025258C + 25258C26268C27278D28288E2B2B8F2E2E9134349439399640409A46469E4C4C + A15252A45757A65454A225256C11115511115512125617175D1C1C6420206B25 + 25722929792E2E8032328636368C3A3A923D3D9741419C4444A14747A64A4AAA + 4D4DAE4F4FB25151B55353B85555BB5757BE5959C05C5CC36464C76565C86666 + CA6767CB6767CC6767CB6868CD6767CD6868CE6868CE6767CE6767CF6868CF67 + 67CF6767CF6666CE6363CE6262CE6262CD6262CD6262CD6262CD6161CD6161CC + 6161CC6161CC6868CE8282D88F8FDC7B7BD46565CB5D5DC75C5CC55B5BC45A5A + C25959C06969C57A7AC96F6FC35C5CB94F4FB14C4CAD4A4AA94747A54444A040 + 409B3D3D9639399035358B3131852D2D7E2828772424711F1F691A1A6216165B + 1111551111551313561E1E7227278D25258C3B3B986060AB8282BD9D9DCBABAB + D3ACACD3A3A3CE9191C57B7BBA6565AE5151A341419B3636952E2E9129298E02 + 000002000025258C26268C28288D29298E2C2C903030923535953A3A9741419B + 48489E4E4EA25353A45757A74B4B971A1A5F11115511115514145918185F1D1D + 6722226E2626742B2B7B2F2F8233338837378E3B3B943F3F9942429E4545A348 + 48A84B4BAC4E4EB05050B35353B75454BA5656BC5858BF5959C15B5BC36060C6 + 6767CA6767CA6868CC6868CC6969CE6969CE6868CE6969CE6868CE6868CF6969 + CF6868CF6868D06868D06767D06767D06464CF6262CE6262CE6262CE6262CE62 + 62CE6262CD6262CD6161CD6161CC6161CC6666CE8080D89595DF7878D35F5FC9 + 5D5DC75D5DC65E5EC56A6AC88282D17474CA5A5ABE5454B95252B65050B34D4D + AF4B4BAC4848A74545A342429D3E3E983A3A9236368C3232862E2E802A2A7A25 + 257320206C1C1C6517175E1313571111551212561A1A6726268A26268C323293 + 5656A67979B89595C7A7A7D1ACACD3A6A6D09797C88282BD6C6CB15757A74646 + 9E3A3A9731319202000002000027278D28288D2A2A8F2E2E913232933737953D + 3D9943439C4A4A9F5050A35454A55757A73E3E8814145811115511115515155B + 1A1A621F1F692323702828772C2C7D30308335358A3939903C3C9640409B4444 + A04747A54A4AA94D4DAE4F4FB25151B55353B85555BB5757BE5959C05A5AC25B + 5BC45C5CC66464C96969CB6969CC6969CD6A6ACE6969CF6A6ACF6A6ACF6969CF + 6A6ACF6969CF6969D06969D06868D06868D06868D06767D06565CF6262CE6262 + CE6262CE6262CE6262CE6262CE6262CE6262CD6262CD6161CD6161CC7979D597 + 97E18080D75F5FCA5F5FC95E5EC86E6ECD8383D57676CE6060C45959C05757BE + 5555BB5353B85151B54E4EB14C4CAD4949A94646A443439F3F3F9A3C3C943838 + 8F3434893030822B2B7C27277522226E1D1D6718185F14145911115512125517 + 175F24248426268C28288D4A4A9F6E6EB28C8CC3A2A2CEAAAAD2A8A8D19C9CCB + 8989C17474B55E5EAA4C4CA13F3F9A02000002000028288E2B2B8F2E2E913333 + 933939963F3F9A45459D4B4BA05151A35656A65555A42E2E7611115511115512 + 125617175D1C1C6420206B2525722929792E2E8032328636368C3A3A923D3D97 + 41419D4545A24848A64B4BAB4D4DAF5050B35252B65454BA5656BC5858BF5959 + C15B5BC35C5CC55D5DC75E5EC86565CB6B6BCD6B6BCE6A6ACF6B6BCF6B6BCF68 + 68CF6868CF6969CF6868CF6868D06868D06969D06969D06868D06868D06868D0 + 6565CF6262CE6262CE6262CE6262CE6262CE6262CE6262CE6262CE6262CD6262 + CD6B6BD18B8BDD8D8DDD6D6DD16060CC6060CB6B6BCE8484D87F7FD56464CA5C + 5CC45B5BC35959C15757BE5656BC5454B95252B65050B24D4DAE4A4AAA4747A6 + 4444A140409C3D3D9639399035358B3131842D2D7E2828772424701F1F691A1A + 6215155B11115512125617175B22227C27278D25258C3E3E996262AC8282BD9A + 9ACAA7A7D1A9A9D19F9FCC8F8FC47B7BBA6767AF5454A50200000200002C2C90 + 3030923434943A3A9740409A47479E4D4DA15252A45757A64C4C991D1D631111 + 5511115514145918185F1D1D6722226D2626742B2B7B2F2F8233338837378E3B + 3B943F3F9942429F4646A44949A94C4CAD4E4EB15151B55353B85555BB5757BE + 5959C05A5AC25B5BC45C5CC65D5DC75E5EC85F5FC96666CC6C6CCF6C6CD06C6C + CF6B6BD06B6BD06464CE6262CD6262CE6262CE6262CE6464CF6969D06969D069 + 69D06868D06868D06565CF6262CE6262CE6262CE6262CE6262CE6262CE6262CE + 6262CE6262CE6262CE7E7ED89898E27A7AD76363CE6161CC6060CC8181D88585 + D96A6ACD5E5EC85D5DC75C5CC65B5BC45A5AC25858BF5757BD5555BA5353B750 + 50B34E4EB04B4BAC4848A74545A342429D3E3E983A3A9236368C3232862E2E80 + 2A2A7925257220206B1C1C6417175D1212561212561616591F1F7127278C2626 + 8C3131925454A57575B69191C5A2A2CEA7A7D1A2A2CE9595C78383BE6F6FB302 + 00000200003232933737953C3C9843439C49499F4F4FA25353A45757A641418C + 15155A11115511115515155B1A1A621F1F692323702828772C2C7D3030833434 + 8A3939903C3C9640409B4444A04747A54A4AAA4D4DAE4F4FB25151B55454B956 + 56BC5757BE5959C15B5BC35C5CC45D5DC75E5EC85F5FC95F5FC96060CB6767CE + 6D6DD06D6DD06D6DD16D6DD06C6CD06464CF6262CE6262CE6262CE6262CE6464 + CF6969D06969D06969D06969D06868D06666CF6262CE6262CE6262CE6262CE62 + 62CE6262CE6262CE6262CE6262CE6464CF8D8DDE9292E06969D06262CD6161CD + 7070D28F8FDE7272D36060CB5F5FC95F5FC95D5DC75D5DC65C5CC45A5AC35959 + C05757BE5555BB5353B85151B54F4FB14C4CAD4949A94646A443439F3F3F9A3C + 3C9438388F3434892F2F822B2B7B26267422226D1D1D6718185F141459131356 + 18185B1A1A6425258826268C25258C45459D6767AF8484BE9898C9A3A3CEA2A2 + CE9999C98A8AC10200000200003939963F3F9A45459D4B4BA05050A35454A555 + 55A42D2D7611115511115512125717175E1B1B6420206B2424722929792D2D80 + 31318635358C3939923D3D9741419D4545A24848A64B4BAC4D4DB04F4FB35252 + B75454BA5656BD5757BF5959C25A5AC45B5BC65C5CC75D5DC85E5EC95E5ECA5F + 5FCB6060CC6868CE6D6DD16C6CD16D6DD16D6DD16C6CD16363CF6161CE6161CE + 6161CE6161CE6363CF6969D06969D06868D06868D06868D06565CF6161CE6161 + CE6161CE6161CE6161CE6161CE6161CE6161CE6262CE7070D49696E27F7FDA61 + 61CE6161CD6666CF8282DA8686DB6262CD6060CC5F5FCB5E5ECA5E5EC95D5DC8 + 5C5CC75B5BC55A5AC35858C15757BF5555BC5454BA5353B75151B34D4DAE4B4B + AB4747A64343A03F3F9B3C3C9638389034348A3030832C2C7D2727762323701E + 1E681A1A6215155B16165918185B16165D22227E27278D26268C3434945555A5 + 7474B58C8CC29A9ACA9E9ECC9A9ACA02000002000040409A46469E4C4CA15151 + A35555A54B4B991D1D6311115511115514145A1818601D1D6722226E2626742A + 2A7B2F2F8233338837378E3B3B943E3E994444A04D4DA65555AC5858B15A5AB5 + 5858B75353B85454BB5656BE5858C05959C25B5BC45C5CC65D5DC75E5EC95E5E + C95F5FCB6060CC6060CC6060CC6868CF6E6ED16E6ED16D6DD26D6DD26C6CD163 + 63CF6161CE6161CE6161CE6161CE6363CF6969D06969D06969D06868D06868D0 + 6565CF6161CE6161CE6161CE6161CE6161CE6161CE6161CE6161CE6464CF7B7B + D89595E27272D46161CE6262CE7272D48A8ADD7676D56161CD6161CC6060CC5F + 5FCB5F5FCB5E5EC95D5DC85D5DC75B5BC65A5AC45959C25D5DC26868C46A6AC2 + 6A6AC16B6BBF6262B85959B14F4FAA4646A441419D3D3D9739399235358C3131 + 862D2D8029297924247220206B1B1B641A1A6019195C1616591212561C1C7028 + 288C27278D25258C41419B5F5FAB7979B88C8CC29595C702000002000048489E + 4D4DA15252A45555A53B3B8613135811115512125616165C1A1A631F1F692323 + 702828772C2C7D30308334348A3838903C3C963F3F9B4747A25555AA5A5AB05E + 5EB46060B86262BB6464BE6161C05858BF5858C15A5AC35B5BC55C5CC75D5DC8 + 5E5EC95E5ECA5F5FCB6060CC6060CC6060CC6060CD6969CF6F6FD16E6ED26E6E + D26D6DD26D6DD26363CF6161CE6161CE6161CE6161CE6363CF6A6AD16A6AD169 + 69D06969D06868D06565CF6262CE6363CF6161CE6161CE6161CE6161CE6464CF + 6262CE6868D18989DE8D8DDF6969D16161CE6565CF8080D98B8BDE6969D06262 + CD6161CD6161CC6060CC6060CC5F5FCB5E5EC95E5EC95D5DC85D5DC86565C879 + 79CF8484D18686D18383CD8080CA7A7AC57575C26868B85858AF4646A442429F + 3E3E993B3B9437378E3333882F2F822A2A7B26267422226E1E1E681E1E641C1C + 6012125611115517176226268628288D26268C29298E46469E6161AC7575B602 + 00000200004F4FA25252A44F4F9E27276F11115511115514145918185F1C1C66 + 21216C2525732929792E2E8031318535358B3939913D3D9741419C4848A35656 + AB5C5CB05F5FB46161B86464BC6767BF6868C36969C46666C55B5BC35B5BC55C + 5CC65D5DC75E5EC95F5FCA5F5FCA6060CB6060CB6060CC6161CC6161CC6A6AD0 + 6F6FD26F6FD16E6ED16E6ED16D6DD16464CE6161CD6161CD6161CD6161CD6363 + CE6A6AD06A6AD06A6AD06969D06969D06A6AD07272D47676D57B7BD87A7AD77A + 7AD77D7DD87C7CD87878D68383DB9A9AE48383DB6363CE6363CE6A6AD18686DC + 8181D96565CF6262CC6262CC6161CC6161CC6060CB6060CB5F5FCA5E5EC95E5E + C96C6CCD8383D58F8FD98C8CD78989D48585D08484CE8282CB7D7DC77979C36F + 6FBD5B5BB14646A54343A03F3F9A3C3C9538388F3434893030832C2C7D282877 + 23237024246C25256919195E12125611115516165B23237D28288E28288D2626 + 8C28288E40409A0200000200005151A339398415155911115512125716165C1A + 1A621E1E6923236F2727762B2B7C2F2F8233338837378E3B3B933E3E9942429E + 4949A45959AD5D5DB16161B66363BA6666BD6868C06A6AC36C6CC66D6DC86D6D + C96969CA5D5DC65E5EC85E5EC95F5FCA6060CB6060CB6060CB6060CC6161CC61 + 61CC6161CD6A6AD06F6FD26F6FD26F6FD16E6ED16D6DD16464CE6161CD6161CD + 6161CD6161CD6363CE6A6AD06A6AD06A6AD06A6AD06B6BD08282DA9292E19B9B + E49393E19494E19494E19595E29393E19393E19A9AE48F8FDF7474D56464CE64 + 64CE7272D48B8BDE7777D66464CF6363CE6262CD6262CC6262CC6161CC6060CB + 6060CB5F5FCA6666CD8181D69292DD9191DC8A8AD77E7ED17070CA6969C67272 + C87C7CCA7F7FC97B7BC46E6EBD5454AE4747A64444A141419C3D3D9739399135 + 358B3131852E2E802929792929752C2C7323236A181860141459121256151558 + 1A1A6726268828288E28288D27278D0200000200002020671111551111551515 + 5B1919601D1D6621216D2525732929782D2D7E31318535358A3838903C3C953F + 3F9B4343A04A4AA65959AE5F5FB46262B86565BA6767BE6969C16B6BC46D6DC7 + 6E6EC97070CB7070CC7070CD6C6CCD6060CA5F5FCA6060CB6060CB6060CC6060 + CC6161CC6161CC6262CD6464CE6C6CD07070D26F6FD26F6FD26F6FD16E6ED164 + 64CE6161CD6161CD6161CD6161CD6363CE6B6BD06B6BD06A6AD06A6AD07070D3 + 9B9BE49393E06A6AD07777D67777D67878D67070D37474D47474D56969D06F6F + D26868D06565CE6565CE7878D68B8BDE7070D36363CE6363CE6363CE6262CD62 + 62CC6262CC6161CC6060CB6060CB7474D39090DD9393DE8F8FDB7676D15F5FC6 + 5C5CC35B5BC25C5CC16868C47A7AC98080CA7C7CC66767BA4E4EAD4848A74545 + A242429E3E3E993B3B9337378E3333882F2F822E2E7D32327C2D2D752020691B + 1B6316165D1313571111551313581F1F7529298E29298E020000020000121256 + 15155A18185F1C1C651F1F6A2424702727762B2B7C2F2F8233338737378D3A3A + 923D3D9741419D4444A14C4CA75C5CB06060B56464B96666BC6868C06B6BC26D + 6DC56E6EC76F6FCA7070CB7171CC7272CE7272CF7272CF6D6DCF6161CB6060CB + 6060CC6161CC6161CC6464CE6A6AD06E6ED17070D27070D27070D27070D26F6F + D26F6FD26E6ED16464CE6161CD6161CD6161CD6161CD6363CE6B6BD06B6BD06B + 6BD06A6AD07777D59C9CE48484DB6767CF6767CF6262CD6161CD6161CD6161CD + 6161CD6262CD6464CE6565CE6565CE6666CE7777D68F8FE06868CF6363CE6363 + CE6363CE6363CE6262CD6262CC6262CC6161CC6464CE8383D99595E19595E082 + 82D86262CA5D5DC75C5CC65B5BC45A5AC25858C06969C57F7FCD8080CA7474C3 + 5656B44C4CAD4949A94646A54343A03F3F9B3C3C9538389035358A3232853939 + 8536368028287421216D1E1E6719196116165C12125711115515155F23237C02 + 00000200001818601C1C651F1F6A22226F2626742929792E2E8031318535358A + 38388F3B3B943F3F9A42429E4545A34E4EAA5E5EB26363B76565BB6868BE6A6A + C16C6CC46D6DC66C6CC76767C87272CC7272CD7373CF7373CF7373D17474D274 + 74D16E6ED06161CC6161CC6565CD6C6CD17272D27272D27272D27272D27171D2 + 7070D27070D27070D26F6FD26F6FD16464CE6161CD6161CD6161CD6161CD6464 + CE6C6CD06C6CD06B6BD06B6BD07D7DD79898E38888DC6969D06868CF6868CF65 + 65CE6363CE6161CD6262CD6565CE6666CF6666CF6565CE6666CF7878D68F8FDF + 6A6AD16363CE6363CE6363CE6363CE6363CE6262CD6262CD6262CC6A6ACF8C8C + DE9797E19292DF7272D25F5FCA5E5EC95D5DC75C5CC65B5BC55A5AC36060C37D + 7DCE8585D07F7FCB5D5DBB4F4FB24D4DAE4A4AAA4747A64444A141419D3D3D97 + 3A3A9237378D40408E3E3E8A2F2F7F28287724247120206B1C1C661919611616 + 5C1313581111550200000200001F1F6A22226F2525742929792C2C7D2F2F8233 + 338836368D3939923D3D9740409C4343A14646A54B4BAA5E5EB36363B86666BB + 6868BF6B6BC26D6DC56E6EC86C6CC85F5FC55B5BC66767CB7373CF7373D07474 + D17474D27474D27474D27474D26E6ED16C6CD07373D37373D37373D37272D371 + 71D27171D27171D27070D27070D27070D26F6FD26E6ED16262CE6060CD6060CD + 6060CD6060CD6262CE6B6BD16B6BD16B6BD06A6AD07D7DD89B9BE48484DB6B6B + D16868D06767CF6767CF6767CF6464CE6464CE6666CF6666CF6565CF6565CF66 + 66CF7B7BD78888DD6E6ED36060CD6161CD6262CE6262CE6262CE6262CE6161CD + 6161CD6C6CD08D8DDF9797E38E8EDE6B6BD05F5FCB5E5ECA5D5DC95D5DC85C5C + C65B5BC55C5CC47C7CD08888D48282CF6262C05252B74F4FB34D4DB04A4AAB48 + 48A84444A342429F3E3E9A3B3B954646974848943333872D2D802A2A7B262676 + 2323701F1F6B1D1D661A1A6217175F0200000200002626742929792C2C7D2F2F + 8232328735358B3838903C3C953E3E9A41419E4444A34747A74A4AAB5757B365 + 65BB6868BE6A6AC06C6CC36D6DC56F6FC86E6ECA6060C65B5BC65C5CC75D5DC9 + 6868CD7575D17575D27575D27575D37575D37575D37575D37575D37474D37373 + D37373D37373D37272D37171D27171D27171D27070D27070D27070D26969D060 + 60CD6060CD6060CD6060CD6060CD6060CD6767CF6B6BD16B6BD16B6BD07373D4 + 9E9EE58686DB6B6BD16969D06868D06767CF6767CF6767CF6767CF6666CF6666 + CF6666CF6565CF6565CF7D7DD88484DB6B6BD16060CD6060CD6161CD6262CE62 + 62CE6262CE6262CE6161CD6A6AD18C8CDE9898E39292E07474D46060CB5F5FCB + 5E5ECA5D5DC95D5DC85C5CC76868CB8484D58B8BD78181D16262C35454BA5252 + B85050B44E4EB14B4BAE4848A94646A54343A141419C49499D51519D38388F33 + 33893030842D2D7F29297A26267624247121216D1E1E690200000200002D2D7F + 2F2F8232328735358B37378F3A3A943D3D9840409D4343A14646A54848A94B4B + AD4E4EB16262BA6969BF6B6BC26D6DC56F6FC67171C96E6ECA6161C75C5CC65C + 5CC75D5DC95E5ECA5E5ECA6A6ACF7676D27676D37676D37676D37575D47575D4 + 7575D37474D37474D37373D37373D37373D37272D37171D27171D26F6FD26D6D + D16969D06161CD6060CD6060CD6060CD6060CD6060CD6060CD6161CD6767CF69 + 69D06A6AD07272D39E9EE58585DB6B6BD16969D06969D06868D06868D06767CF + 6767CF6767CF6666CF6666CF6666CF6565CF7979D78989DD6969D06060CD6060 + CD6060CD6161CD6262CE6262CE6262CE6262CE6565CF8585DB9999E49797E286 + 86DC6969D05F5FCB5F5FCB5E5ECA5D5DC96161CA7777D28F8FDB8E8ED98080D2 + 5F5FC35656BE5555BC5353B95151B64F4FB34C4CAF4A4AAB4747A74747A55353 + A75555A43E3E9839399136368D3333883030842D2D802B2B7C29297826267402 + 000002000033338835358C3838903A3A943D3D9840409C4242A04545A44747A7 + 4A4AAB4C4CAF4E4EB25151B56767BF6D6DC36F6FC67070C97272CA7373CB6A6A + CB5C5CC75D5DC85D5DC95E5ECA5F5FCB5F5FCB5F5FCB6A6AD07777D37777D376 + 76D47676D47575D47575D47575D37474D37474D37373D37373D37171D26B6BD1 + 6767CF6363CE6161CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060 + CD6060CD6060CD6060CD6262CE7272D49A9AE38D8DDE6A6AD06A6AD16C6CD16D + 6DD26C6CD16969D06B6BD16767CF6A6AD06666CF6666CF6262CE6A6AD18C8CDF + 6D6DD26060CD6060CD6060CD6060CD6262CE6262CE6262CE6262CE6262CE7575 + D59494E19999E49595E28383DA6C6CD16464CD6060CB6767CD7878D48D8DDB91 + 91DD9090DC7676D05B5BC45858C15757BF5555BD5353BA5252B75050B44E4EB1 + 4B4BAD4E4EAC5B5BAF5757AA43439E3E3E993D3D9641419543439341418F3F3F + 8C3B3B883838840200000200003939913B3B943D3D9840409C4242A04444A247 + 47A64949AA4B4BAE4E4EB15050B45252B75454BA6868C37171C77272C97373CB + 7474CD7575CE7575CF6969CC5D5DC95E5ECA5F5FCB5F5FCB5F5FCC5F5FCC6060 + CC6B6BD07777D47676D47676D47676D47575D47575D47575D37474D37070D268 + 68D06363CE6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD + 6060CD6060CD6060CD6060CD6060CD6060CD6060CD6C6CD29191E19393E18383 + DB8686DB8B8BDD8787DC8888DC8686DC8B8BDE8D8DDE8484DB7373D46363CE60 + 60CD6D6DD28989DD7676D66060CD6060CD6060CD6262CE6363CE6363CE6262CE + 6262CE6262CE6868D08181DA9797E39999E49797E38E8EDF8080D97D7DD78484 + DA9292E09595DF9292DE8888D96767CC5B5BC65A5AC35959C25858C05656BD54 + 54BB5252B85151B54E4EB25757B36666B75757AE4646A44343A04848A05757A5 + 5B5BA353539E4F4F9A4D4D974A4A940200000200003E3E9940409D4242A04444 + A24646A64848A94B4BAC4D4DB04F4FB35151B55252B85454BB5656BD6363C373 + 73CA7474CB7575CE7676CF7676D07777D17878D16A6ACE5F5FCB5F5FCB5F5FCC + 6060CC6060CC6060CD6060CD6B6BD17777D47676D47676D47676D47575D47272 + D36969D06161CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD60 + 60CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6262CE + 7575D58E8EDF9898E39797E39393E19898E39898E39E9EE59696E29797E29F9F + E58383DB6363CE6060CD6868D08484DB8181DA6161CE6060CD6262CE6464CE64 + 64CE6363CE6363CE6262CE6262CE6363CE6B6BD18787DD9595E29999E49898E3 + 9696E29696E29797E29696E19494E18A8ADC6E6ED05F5FC95C5CC75B5BC65A5A + C45959C35858C15656BE5555BC5353BA5252B75E5EBA7070C05555B24A4AAB47 + 47A75252AA6464AF5555A749499F48489C4747994242960200000200004343A1 + 4545A44747A64848A94A4AAC4C4CAF4E4EB25050B45252B75353BA5555BC5656 + BE5858C05B5BC36D6DCA7777CE7878D07878D17979D27878D27979D47A7AD36B + 6BCF5F5FCC6060CC6060CC6060CD6060CD6060CD6060CD6B6BD07676D47676D4 + 7575D46C6CD16262CE6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060 + CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD6060CD60 + 60CD6060CD6060CD6060CD6E6ED37171D46F6FD37171D47575D57676D67070D2 + 7373D47979D69393E18E8EDF6A6AD16060CD6363CE7B7BD88B8BDE6B6BD26262 + CE6464CE6464CE6464CE6363CE6363CE6363CE6262CE6161CD6161CD6C6CD27B + 7BD89090E09696E39999E49797E29696E28D8DDE8080D86B6BD05F5FCB5E5ECA + 5D5DC95C5CC75C5CC65B5BC55959C35959C25757C05656BD5656BC6A6AC26F6F + C25454B54D4DB04C4CAD6262B56767B54E4EA84343A141419E40409C3E3E9902 + 00000200004747A84848AA4A4AAC4C4CAF4D4DB24F4FB45151B75252B95454BC + 5555BD5757C05858C25858C35A5AC55C5CC77070CD7878D17979D27979D37979 + D47A7AD47A7AD57878D46C6CD05F5FCC5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F + 5FCD6363CE6565CF6363CE5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD + 5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5F + CD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD6060CD5F5FCD5F5FCD5F + 5FCD5F5FCD6161CE6262CE6161CD7A7AD89797E37575D65F5FCD5F5FCD6F6FD3 + 8C8CDF7C7CD86565CF6464CF6363CE6363CE6363CE6363CE6262CE6161CE5F5F + CD5F5FCD5F5FCD6161CE6767D07979D77B7BD87C7CD87A7AD66F6FD26363CE5E + 5ECB5E5ECB5E5ECB5D5DCA5C5CC95C5CC85B5BC75A5AC65959C45858C25858C1 + 6060C37979CB6666C25252B84F4FB55353B46F6FBE6969BB4C4CAD4747A84545 + A64343A24242A10200000200004B4BAE4C4CB04D4DB24F4FB45151B75252B953 + 53BB5454BD5656BF5757C15858C35959C45A5AC65B5BC75C5CC85F5FC97171D0 + 7A7AD47B7BD47A7AD47A7AD57B7BD57B7BD57A7AD56C6CD15F5FCD5F5FCD5F5F + CD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F + 5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD + 5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5F + CD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD6E6ED39696E38181DA63 + 63CF5F5FCD6363CE8484DC8C8CDE6F6FD46464CF6464CF6363CE6363CE6363CE + 6262CE5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD5F5FCD6060CE6363CE6363CF5F5F + CD5F5FCC5F5FCC5E5ECC5E5ECB5E5ECB5E5ECB5D5DCA5C5CC95C5CC95B5BC75A + 5AC65A5AC55C5CC57171CC7C7CCF5E5EC25454BC5353BA6262BE7B7BC76262BB + 4C4CB04B4BAE4949AB4848AA4747A80200000200004F4FB35050B55151B65252 + B95353BA5454BC5656BE5757BF5858C15959C35A5AC45B5BC55B5BC65C5CC85C + 5CC85D5DC96060CB7373D17B7BD37B7BD47B7BD47B7BD47B7BD57B7BD57A7AD5 + 6C6CD05F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC6565 + CE8787DC9393E16C6CD15F5FCC6262CD7171D39292E08080D86767CF6464CE64 + 64CE6363CD6262CD5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCB5F5FCB5E5ECB5E5ECA5E5ECA5E5E + CA5D5DC95C5CC85C5CC75B5BC66A6ACB8181D27272CB5858C05656BF5B5BBF74 + 74C87C7CCA5D5DBB5050B54F4FB34D4DB14C4CAF4B4BAD0200000200005252B7 + 5353B95454BB5555BC5656BE5757BF5858C15959C35A5AC45A5AC55B5BC65C5C + C75C5CC85D5DC95E5ECA5E5ECA5E5ECA6060CC7373D27C7CD47C7CD47B7BD57B + 7BD57B7BD57B7BD57A7AD56C6CD05F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC6060CD7171D39A9AE38080D96464CD6666CE6666CE8383DA9494 + E06F6FD26565CE6464CE6262CD5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCB5F5FCB + 5E5ECB5E5ECA5E5ECA5E5ECA5D5DC95C5CC86262C97E7ED47E7ED36363C85959 + C35858C16969C78383D07373C85858BD5353B95252B75151B64F4FB44F4FB302 + 00000200005454BC5555BD5656BF5757C05858C15959C35A5AC45A5AC55B5BC6 + 5C5CC75C5CC85D5DC95D5DC95E5ECA5E5ECA5E5ECA5E5ECB5F5FCB6262CC7474 + D37C7CD57C7CD57B7BD57B7BD57B7BD57B7BD57979D46464CE5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC6565CE8989DD9393E07676D46767CE + 6767CE6C6CD18888DC9090DE7171D36363CD6060CC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCB5F5FCB5E5ECB5E5ECB5E5ECA5E5ECA6161CB7C7CD58787DA + 6C6CCD5C5CC65A5AC55F5FC67E7ED28282D26464C65757BF5555BD5454BC5353 + BA5353B95252B80200000200005757C05858C15858C25959C35A5AC45A5AC55B + 5BC65C5CC75C5CC85C5CC85D5DC95E5ECA5E5ECA5E5ECA5E5ECB5E5ECB5F5FCB + 5F5FCB5F5FCC6262CD7474D37C7CD57C7CD57B7BD57B7BD57B7BD57B7BD56666 + CE5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC6060CC7373D496 + 96E18E8EDE6D6DD06767CE6767CE7272D39191DF8989DD6C6CD15F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCB5F5FCB5E5ECB6161CB7A + 7AD58C8CDC7272D15E5EC95C5CC85C5CC76868CB8E8ED97B7BD25D5DC55858C2 + 5858C15757BF5656BF5555BD5454BC0200000200005959C35A5AC45A5AC55B5B + C55B5BC65C5CC75C5CC85C5CC85D5DC95E5ECA5E5ECA5E5ECA5E5ECB5E5ECB5F + 5FCB5F5FCB5F5FCC5F5FCC5F5FCC5F5FCC7171D27C7CD57C7CD57C7CD57B7BD5 + 7B7BD57979D46464CE5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F + 5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC5F5FCC6B6BD19595E19898E27373D46767CF6767CE6767CE7676D58B8BDD89 + 89DC7272D36060CC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC + 5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CB6363CC7E7ED78A8ADC7777D45E5ECA5E5ECA5D5DC95D5DC96666CB8888D981 + 81D66E6ECD5A5AC55A5AC45959C35858C25858C15757C00200000200005A5AC5 + 5A5AC65B5BC75B5BC85B5BC85C5CC95C5CC95D5DCA5D5DCA5D5DCA5D5DCA5D5D + CB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC6565CE7B7BD57C7CD57C + 7CD57B7BD57B7BD57A7AD56E6ED15E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC6464CE8686DC9797E27E7ED86C6CD16767CF6666CF6666 + CE6767CE7272D38B8BDE8A8ADE7171D36060CD5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC6161CD6C6CD28282DA8B8BDD7676D55D5DCB5D5DCB5D5DCA5D5DCA5D5D + CA5E5ECA6A6ACE8484D98B8BDA6D6DCE5B5BC65A5AC55959C55959C45858C302 + 00000200005B5BC85B5BC85C5CC95C5CC95C5CC95D5DCA5D5DCA5D5DCA5D5DCB + 5D5DCB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC7171 + D27C7CD67C7CD67C7CD57C7CD57B7BD57777D46161CD5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CE8484DB9B9BE47A7AD76464CE6666CF + 6767CF6767CF6666CF6666CE6666CE7070D28181DA8E8EDF8383DA6E6ED26363 + CE5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC6C6CD17979D78989DD8686DC7171D46060CD5E5ECB5E5ECB + 5D5DCB5D5DCB5D5DCA5D5DCA5D5DCA6565CD8B8BDB8C8CDB7070D05E5EC95B5B + C75A5AC65A5AC60200000200005C5CC95D5DCA5D5DCA5D5DCA5D5DCA5D5DCA5D + 5DCB5D5DCB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC6363CE7B7BD57C7CD67C7CD67C7CD57C7CD57C7CD56B6BD05E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CE8282DA9696E27E7ED860 + 60CD5E5ECC6262CD6767CF6767CF6666CF6666CF6666CE6565CE6767CF7272D4 + 8D8DDF8A8ADD8080D97474D56A6AD16464CE5F5FCC5E5ECC5E5ECC6060CD6161 + CD6060CD5F5FCC6666CF6E6ED27C7CD88585DB8C8CDE7D7DD86A6AD15E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECB5E5ECB5D5DCB5D5DCB5D5DCA5D5DCA6666CD8787DB + 9191DF7474D35F5FCA5B5BC85B5BC80200000200005D5DCA5D5DCA5D5DCB5D5D + CB5D5DCB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC6E6ED17D7DD67D7DD67C7CD67C7CD67C7CD67777D4 + 5F5FCC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CE8181DA9898 + E37F7FD96161CD5E5ECC5E5ECC5F5FCC6666CF6767CF6767CF6767CF6666CF66 + 66CE6262CD5F5FCC6262CE7C7CD88484DB8A8ADD8585DB7F7FD97C7CD87272D4 + 7B7BD87979D67676D57373D48181DA8585DB8484DB8989DD7B7BD86F6FD36161 + CD5E5ECC5E5ECC5F5FCC6060CD5F5FCC5E5ECC5E5ECC5E5ECB5E5ECB5E5ECB5D + 5DCB5D5DCB6767CE8787DB8E8EDE7676D46161CC5D5DCA0200000200005E5ECB + 5E5ECB5E5ECB5E5ECB5E5ECB5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5F5FCC7777D47E7ED67D7DD67D7DD67C + 7CD67C7CD66B6BD05E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6363CE + 8282DA9595E28282DA6464CE5E5ECC5E5ECC5E5ECC5E5ECC6262CD6767CF6767 + CF6868D07373D47070D26464CE5F5FCC5E5ECC6161CD6868D07171D47B7BD781 + 81DA8282DA8888DC8282DA8282DA8282DA8989DD7F7FD97979D67676D66969D0 + 5E5ECC5E5ECC5E5ECC5E5ECC6060CD7878D67676D66868D05E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECB5E5ECB5E5ECB6969CF8282D99292E07171D35F5FCC02 + 00000200005E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6666CF7C7CD57E7E + D67E7ED67D7DD67D7DD67979D56262CD5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5F5FCC6161CD6363CE6363CE6161CD5F5F + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC7676D59999E38282DA6464CE5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5F5FCC6767CF6767CF7B7BD79696E29595E17A7AD66868D05E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC6060CD6565CF6565CF6868D06969D06969D16161CD6161CD64 + 64CE6060CD5E5ECC5E5ECC5F5FCC6262CD6F6FD38585DB9494E19898E38282DA + 6060CD5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6464CF9393 + E08484DA6363CD0200000200005E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC63 + 63CE6D6DD17272D27171D27171D27171D27171D27171D27171D27171D27070D2 + 7676D47E7ED67E7ED67E7ED67D7DD67D7DD67272D25F5FCC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC6262CD6969CF7070D27373D37373D3 + 7373D37272D26E6ED16767CF6161CD5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5E + CC5E5ECC5E5ECC5E5ECC6262CE8A8ADE9393E16C6CD25E5ECC5E5ECC5E5ECC5E + 5ECC5E5ECC5E5ECC5E5ECC6666CE7D7DD89797E29898E29898E29C9CE48E8EDE + 7A7AD66868CF6262CD6262CD6262CD6161CD6161CD6161CD6161CD6060CD5F5F + CC5E5ECC5E5ECC5E5ECC5E5ECC5F5FCC6666CF7070D38181DA9292E09595E281 + 81DA8383DB9393E18181DA6464CE5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC5E5ECC + 5F5FCC7272D49090E08181DA5E5ECC0200000200005D5DCC5D5DCC5D5DCC5D5D + CC5D5DCC6868D07A7AD57D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D + 7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67C7CD66969D05D5DCC + 5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5D + CC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6767CF7373D37575D475 + 75D37474D37474D37373D37373D37272D37272D36F6FD26565CF5D5DCC5D5DCC + 5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6262CE7F7FD99999E47B7BD86161 + CE5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5E5ECC7070D39D9DE49595E17575D574 + 74D58888DC9696E29C9CE49191E18787DC7A7AD77070D36767D06363CE6363CE + 6262CE6161CD6161CD5E5ECC5D5DCC6363CE6E6ED37A7AD78585DC9292E19494 + E18585DC7171D46161CD6060CD7676D69494E28888DD6464CF5D5DCC5D5DCC5D + 5DCC5D5DCC5D5DCC7171D48F8FE08C8CDF6C6CD25D5DCC0200000200005D5DCC + 5D5DCC5D5DCC5D5DCC6464CE7C7CD67D7DD67D7DD67D7DD67D7DD67D7DD67D7D + D67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67D7DD67A + 7AD56363CE5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC + 5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6A6AD07676 + D47676D47575D47575D37575D37474D37474D37373D37373D37373D37272D371 + 71D26868CF5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC5D5DCC6868D1 + 8B8BDE9696E27B7BD86565CF5D5DCC5D5DCC5D5DCC5E5ECC7070D49292E09696 + E17878D66767CF6767CF6767CF7272D48080D99090E09595E19595E19494E07F + 7FD96666CF6363CE6363CE6262CE6161CD6161CD5E5ECC7D7DD98E8EDF9191E1 + 8E8EDF8181DA7070D46464CF5D5DCC5D5DCC5D5DCC5F5FCD7A7AD79494E28787 + DD6868D05D5DCC5D5DCC5D5DCC7171D48F8FE09191E17272D45D5DCC5D5DCC02 + 00000200005D5DCB5D5DCB5D5DCB5D5DCB7171D27D7DD57D7DD57D7DD57D7DD5 + 7D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7D + D57D7DD57D7DD57777D35E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 6868CE7777D37676D37676D37676D37575D37272D26F6FD16E6ED17171D17373 + D27373D27272D27272D27171D26565CE5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5E5ECB6B6BD18A8ADE9898E37B7BD76060CC5D5DCB5D5DCB6F6FD3 + 8F8FDF9191E07373D36969CE6868CE6767CE6767CE6767CE6767CE6D6DD07676 + D58080D99B9BE39595E16C6CD16363CD6363CD6363CD6262CD6161CC6161CC87 + 87DC9696E37575D56363CD6262CD5E5ECC5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 6363CD7777D69393E18B8BDE6767CF5E5ECB6F6FD29090E09191E07373D45D5D + CB5D5DCB5D5DCB0200000200005D5DCB5D5DCB5D5DCB5D5DCB7A7AD47D7DD57D + 7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD5 + 7D7DD57D7DD57D7DD57D7DD57D7DD56F6FD15D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB6161CC7575D37777D37777D37676D37474D26868CF6161CC5D5DCB + 5D5DCB6161CC6868CE7171D17373D27272D27272D26F6FD16060CC5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6969D08B8BDE9999E47C7CD863 + 63CD7272D48F8FE08E8EDF6F6FD26464CD6868CF6868CE6868CE6767CE6767CE + 6767CE6666CE6565CE6767CF8888DC9696E16E6ED16363CD6363CD6363CD6363 + CD6262CD6868CF8888DC8D8DDF5E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB6060CC7979D69393E18686DC7B7BD78F8FDF9292E1 + 7272D45E5ECC5D5DCB5D5DCB5D5DCB0200000200005D5DCB5D5DCB5D5DCB5D5D + CB7B7BD57D7DD57D7DD57D7DD57D7DD57D7DD57C7CD57C7CD57C7CD57C7CD57C + 7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57272D26060CC5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB6A6ACF7878D47878D47777D37474D26464CD5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6363CD7171D27373D27272D27272D2 + 6767CE5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6666 + CF8787DC9999E48C8CDE9393E19090E06E6ED25D5DCB5E5ECB6565CD6868CE68 + 68CE6767CE6767CE6767CE6666CE6666CE6969D08686DB9494E17070D26464CD + 6363CD6363CD6363CD6262CD6969CF8787DC8989DD6161CD5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6262CD7474D58C8CDE98 + 98E38C8CDE7373D45D5DCB5D5DCB5D5DCB5D5DCB5D5DCB0200000200005D5DCB + 5D5DCB5D5DCB5D5DCB7B7BD57D7DD57D7DD57D7DD57D7DD57878D46565CE6565 + CD6565CD6565CD6565CD6565CD6565CD6565CD6565CD6565CE6262CD5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5E5ECB7373D27878D47878D47777 + D36969CF5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6868CE73 + 73D27373D27272D26E6ED05E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB6565CE7E7ED99090E08989DD6F6FD25D5DCB5D5DCB5D5D + CB5D5DCB5F5FCC6060CC6060CC6060CC6060CC6060CC5F5FCC6262CD8686DB8F + 8FDF6C6CD16363CD6464CD6363CD6363CD6363CD6565CE8787DC8C8CDE6464CE + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5E5ECB6B6BD17272D46D6DD15E5ECB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB02 + 00000200005D5DCB5D5DCB5D5DCB5D5DCB7B7BD57D7DD57D7DD57D7DD57D7DD5 + 7676D35D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6161CC7878D4 + 7878D47878D47575D36161CC5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB6161CC7171D17373D27373D27171D26060CC5D5DCB5D5DCB5D5DCB5D + 5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB6363CD6868CF6666CF5E5ECB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB8686DC8E8EDF6A6AD06363CD6565CD6464CD6363CD6363CD6363CD86 + 86DC8D8DDF6767CF5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB + 5D5DCB5D5DCB5D5DCB5D5DCB5D5DCB5E5ECC5E5ECB5D5DCB5D5DCB5D5DCB5D5D + CB5D5DCB5D5DCB0200000200005C5CCB5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D + 7DD57D7DD57D7DD57575D35D5DCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB6363CD7777D47878D47777D47171D25C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6D6DD17272D27272D27171D26161CD5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB8181DA8F8FE06868D06262CD6464CD6464CD6363 + CD6262CD6464CE8787DD8B8BDE6666CF5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005C5CCB5C5CCB5C5CCB5C5C + CB7B7BD57D7DD57D7DD57D7DD57D7DD57575D35D5DCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB6363CD7878D47979D47878D47171D25C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6E6ED17373D27272D2 + 7272D26161CD5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5F5FCC7D7DD99191E16969D06262CD + 6464CE6464CD6363CD6363CD6262CD8888DD8B8BDE6565CF5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005C5CCB + 5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D7DD57D7DD57D7DD57575D35C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6060CC7878D47979D47979D47575 + D36060CC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6060CC71 + 71D27474D37373D27272D25F5FCC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6161CD8181DA8E + 8EDF6868D06363CD6464CE6464CE6464CD6363CD6464CE7F7FDA9090E06363CE + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB02 + 00000200005C5CCB5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D7DD57D7DD57D7DD5 + 7777D46464CE6464CD6464CD6464CD6464CD6464CD6464CD6464CD6464CD6464 + CE6161CD5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5D5DCB7474D3 + 7979D47979D47878D46969CF5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB6868CF7474D37474D37474D36F6FD15D5DCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5E5ECC5F5FCC5F5FCC5F5FCC5F5FCC5F5FCC5F5F + CC6161CD8181DA9797E27474D56969D07171D36E6ED16F6FD16C6CD17373D489 + 89DE9090E06363CE5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB0200000200005C5CCB5C5CCB5C5CCB5C5CCB7B7BD57D7DD57D + 7DD57D7DD57D7DD57D7DD57B7BD57B7BD57B7BD57B7BD57B7BD57B7BD57B7BD5 + 7B7BD57B7BD57B7BD57B7BD57171D25F5FCC5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB6A6ACF7979D47979D47979D47676D36464CD5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB6363CD7272D27575D37474D37474D36767CE5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5D5DCB6666CE6A6ACF6A6ACF6969CF6969CF + 6868CF6868CF6868CF6767CE7A7AD69696E29999E49595E19090DF9191E09191 + E09797E39898E39393E17C7CD85E5ECC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005C5CCB5C5CCB5C5CCB5C5C + CB7979D47D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D + 7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD57D7DD56F6FD15C5CCB5C5CCB + 5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB6060CC7777D47979D47979D47979D47676D369 + 69CF6060CC5C5CCB5C5CCB6060CC6868CF7474D37676D37575D37575D37272D2 + 6060CC5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB6565CE6B6BD06B6BD06B + 6BD06A6ACF6969CF6969CF6969CF6868CF6868CF6A6AD07B7BD78989DC8B8BDD + 8C8CDE8F8FDF8E8EDF8282DA8787DD7878D66363CE5C5CCB5C5CCB5C5CCB5C5C + CB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C + 5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB5C5CCB0200000200005B5BCB + 5B5BCB5B5BCB5B5BCB7070D27C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7C + D57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD575 + 75D35C5CCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB + 5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB6767CF7979D47979 + D47979D47878D47777D47474D37070D27070D27373D37676D47575D37575D375 + 75D37474D36565CE5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB + 5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5C5CCB6969 + CF6B6BD06A6AD06A6AD06A6AD06969CF6969CF6969CF6868CF6767CF6767CF68 + 68CF6B6BD06A6AD06D6DD16666CE6464CE6969D06565CF5D5DCC5B5BCB5B5BCB + 5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5B + CB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB5B5BCB02 + 00000200005B5BCA5B5BCA5B5BCA5B5BCA6262CC7B7BD47C7CD57C7CD57C7CD5 + 7C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7C + D57C7CD57C7CD57979D46161CC5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA6B6BCF7979D47979D47878D37878D37777D37777D37777D37777D37676 + D37676D37575D37575D26969CE5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5E5ECB6A6ACF6C6CCF6B6BCF6A6ACF6A6ACF6A6ACF6969CF6969CE6969 + CE6868CE6767CE6767CE6767CE6666CE6666CE6565CD6565CD6464CD5D5DCB5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA0200000200005B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6767CE79 + 79D47C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD57C7CD5 + 7C7CD57C7CD57C7CD57C7CD57C7CD57B7BD46767CE5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA6767CE7575D37979D47878D37878D37777D3 + 7777D37777D37777D37676D37373D26666CE5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA6161CC6C6CCF6C6CCF6C6CCF6B6BCF6A6ACF6A6ACF + 6A6ACF6969CF6969CE6969CE6868CE6767CE6767CE6767CE6666CE6565CD6464 + CD5F5FCB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA0200000200005B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA6060CC6A6ACF6F6FD06E6ED06E6ED06E6ED06E6ED06E6ED06E + 6ED06E6ED06E6ED07373D27C7CD57C7CD57C7CD57C7CD57C7CD57070D15C5CCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6060CB6969CE73 + 73D27777D37777D37777D37676D37272D16868CE6060CB5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6767CE6D6DD06C6CD06C6CCF6C + 6CCF6B6BCF6767CE6363CD6464CD6363CD6363CD6363CC6363CC6262CC6262CC + 6262CC6060CC5D5DCB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA0200000200005B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA6464CD7A7AD47C7CD57C7CD57C7CD57C + 7CD57878D36060CB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5C5CCA5F5FCB6262CC6262CC5F5FCB5C5CCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5E5ECB6C6CCF6D6D + D06D6DD06C6CD06C6CCF6A6ACF6060CB5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA02 + 00000200005B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5C5CCA7575D27C7C + D57C7CD57C7CD57C7CD57C7CD56969CF5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 6363CD6E6ED06E6ED06D6DD06D6DD06C6CD06969CE5C5CCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B + 5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA + 5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5BCA5B5B + CA5B5BCA5B5BCA0200000200005A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA6B6BD07B7BD57B7BD57B7BD57B7BD57B7BD57575D35B5BCA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5B5BCA6B6BCF6D6DD06D6DD06D6DD06C6CD06C6CD06363CD5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA0200000200005A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5F5FCC7979D47B7BD57B7BD57B7BD57B7BD57B7BD5 + 6868CF5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA6363CD6F6FD16E6ED06E6ED06D6DD06D6DD06B + 6BD05D5DCB5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA0200000200005A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA6F6FD17B7BD57B7BD57B + 7BD57B7BD57B7BD57676D35D5DCB5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5D5DCB6C6CD06F6FD16F6FD16E6E + D06D6DD06D6DD06666CE5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA02 + 00000200005A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA6262 + CD7A7AD47B7BD57B7BD57B7BD57B7BD57B7BD56C6CD05A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5AC95959C85959C85959C75959C76565CC7070D0 + 6F6FD06F6FD16F6FD16E6ED06D6DD05F5FCC5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA0200000200005A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA + 5A5ACA5A5ACA5A5ACA6E6ED07B7BD57B7BD57B7BD57B7BD57B7BD57979D46060 + CC5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95A5AC95A5ACA5A5ACA + 5A5ACA5A5ACA5A5AC95A5AC95A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95959C75858C55757C45656C25A + 5AC36C6CCB6E6ECD6F6FCF6F6FD06F6FD16F6FD16666CE5A5AC95A5AC95A5ACA + 5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5AC95A5AC95A5AC95A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95A5AC95A5AC95A5AC9 + 5A5AC95A5AC95A5AC95A5ACA5A5ACA0200000200005A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A + 5ACA5A5ACA5A5ACA5A5ACA5A5ACA5D5DCB7171D17B7BD57B7BD57B7BD57B7BD5 + 7B7BD57B7BD56363CD5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5ACA5A5A + CA5A5ACA5A5ACA5A5ACA5A5ACA5A5AC95A5AC95959C85959C75858C55858C458 + 58C45858C55858C55858C55858C45858C45858C45858C55959C75959C75959C8 + 5959C85959C85959C85959C75959C75959C75959C85959C75858C45656C25555 + BF5353BB5252B95858BA6969C16A6AC56C6CC96D6DCC6D6DCE6D6DCE6666CB59 + 59C55858C45858C55858C65959C75959C85959C85959C85959C85959C85959C8 + 5959C85959C85959C75959C75858C55858C45858C45858C45858C45858C65959 + C75959C75959C75959C85959C85959C75959C75959C75959C75858C55858C458 + 58C45757C45757C35757C35757C45858C45858C55959C70200000200005959CA + 5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959CA5959 + CA5959CA5959CA5959CA5959CA5959CA5959CA5C5CCB7070D17A7AD57A7AD57A + 7AD57A7AD57A7AD57A7AD57878D45F5FCC5959CA5959CA5959CA5959CA5959CA + 5959CA5959CA5959CA5959CA5959CA5959CA5959C95858C85757C65656C25454 + C05353BD5353BD5353BD5353BD5353BD5353BD5353BC5353BC5353BD5353BD54 + 54BF5555C05656C25555C15555C15656C25555C15555C15555C15656C25555C1 + 5353BD5252BA5050B54D4DB04B4BAB5050AC6161B56464BA6666BF6969C56969 + C66868C66868C56060C15454BD5353BD5454BE5555C05656C25656C25656C256 + 56C25656C25656C25555C15555C15555C05454BF5353BD5353BD5353BC5353BC + 5353BD5454BF5454C05555C05555C05656C25656C25555C15555C15555C15454 + C05454BE5353BD5353BD5252BB5252BB5252BB5353BC5353BD5454BF5555C102 + 00000200005959C95959C95959C95959C95959C95959C95959C95959C95959C9 + 5959C95959C95959C95959C95959C95959C95959C95959C95B5BCA7070D17A7A + D47A7AD47A7AD47A7AD47A7AD47A7AD47A7AD46969CE5959C95959C95959C959 + 59C95959C95959C95959C95959C95959C95959C95959C95959C95858C75757C3 + 5555C05252BA5050B54F4FB34F4FB24F4FB14F4FB24F4FB34E4EB14E4EB04D4D + AF4E4EB14E4EB14F4FB35151B65151B85151B75151B75151B85151B85151B751 + 51B75151B85151B74F4FB34D4DAE4B4BA94848A245459B45459B5050A35C5CAB + 6060B36363B86565BC6363BA6161B86161B75A5AB54F4FB14F4FB35050B55151 + B85252B85151B85151B85252B85151B85151B75151B75151B64F4FB34E4EB14E + 4EB14E4EB14E4EB14F4FB25050B55151B65151B65151B65151B85151B85151B8 + 5151B85151B85050B54F4FB34F4FB24F4FB14E4EB14E4EB14E4EB04E4EB04E4E + B14F4FB35151B80200000200005959C95959C95959C95959C95959C95959C959 + 59C95959C95959C95959C95959C95959C95959C95959C95959C95959C95C5CCA + 7070D17A7AD47A7AD47A7AD47A7AD47A7AD47A7AD47A7AD46969CE5959C95959 + C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959C959 + 59C85757C55555C05252B94F4FB14B4BAA4A4AA84A4AA64949A64A4AA74A4AA7 + 4949A44848A24848A24848A24848A24949A64B4BA94C4CAB4B4BA94B4BAA4C4C + AC4C4CAC4B4BA94C4CAB4C4CAD4C4CAB4A4AA64848A246469E4242953E3E8D3E + 3E8D4141924C4C9A5757A35B5BAA5E5EAE5D5DAC5A5AA95959A85959A85454A7 + 4B4BA64B4BA94C4CAD4D4DAD4C4CAC4C4CAD4D4DAD4C4CAC4B4BA94B4BA94A4A + A84848A34747A04747A04747A04747A14848A34A4AA84B4BAA4B4BA94B4BA94C + 4CAC4C4CAC4C4CAB4C4CAB4C4CAC4B4BA94A4AA64949A54949A54949A44848A2 + 4747A14747A14848A24949A64D4DAD0200000200005959C95959C95959C95959 + C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959C959 + 59C95C5CCA7070D17A7AD47A7AD47A7AD47A7AD47A7AD47A7AD47A7AD46969CE + 5959C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959 + C95959C95959C95858C75656C25252BA4F4FB14A4AA646469E45459B44449A44 + 449944449A44449A42429540409141419241419241419242429444449A45459B + 44449A44449A46469E45459D44449A45459B46469E45459C4343974242944141 + 923D3D8A3939813939813B3B853C3C8846468F52529954549D53539A51519751 + 51975050985151994D4D9945459A46469E46469E45459D46469E46469E45459C + 4444994444994343974040913E3E8D3F3F8F40408F4040904141934444994545 + 9B44449944449A45459D45459D45459B45459B45459D44449A43439743439743 + 43984343974242944141924141924141934343984848A20200000200005959C9 + 5959C95959C95959C95959C95959C95959C95959C95959C95959C95959C95959 + C95959C95959C95C5CCA7070D17A7AD47A7AD47A7AD47A7AD47A7AD47A7AD47A + 7AD46969CE5959C95959C95959C95959C95959C95959C95959C95F5FCB6161CC + 5F5FCB5959C95959C95959C95959C95858C75454BF5050B54B4BAA46469E4242 + 9441419240409140408F4040914040903D3D8A3B3B853B3B853B3B863B3B853C + 3C883E3E8C3E3E8D3D3D8B3E3E8C3F3F8F3E3E8D3D3D8B3E3E8C40408F42428F + 4D4D926D6DA45D5D9A3A3A8236367A35357937377D37377D38387F4242874D4D + 8F4B4B8C4949884A4A8A4B4B8C4A4A8C4B4B8D4848914141924040913F3F8F40 + 408F4040913E3E8D3D3D8A3D3D8B3C3C883A3A8238387F3939813A3A843B3B84 + 3C3C883E3E8D40408F3E3E8C3E3E8C40408F3F3F8F3E3E8C3F3F8E40408F3E3E + 8D3D3D8B3E3E8C3F3F8F3E3E8D3D3D8B3C3C883C3C883C3C883F3F8E44449A02 + 00000200005959C95959C95959C95959C95959C95959C95959C95959C95959C9 + 5959C95959C95959C95959C95B5BCA7070D07A7AD47A7AD47A7AD47A7AD47A7A + D47A7AD47A7AD46969CE5959C95959C95959C95959C95959C95959C95959C969 + 69CE7878D37A7AD47878D36B6BCF5D5DCA5959C95959C95858C65454BE4F4FB3 + 4A4AA743439840408F3F3F8E3E3E8D3E3E8C3E3E8D3E3E8C3B3B8438387F3939 + 8039398038387F3939803B3B853B3B853939813939813B3B843A3A8338387F3B + 3B824646894C4C8A7777A3E8E8E8B7B7C939398035357835357736367A363679 + 35357837377D41418447478445458147478347478647478647478749498B4747 + 8E3D3D883B3B853B3B863C3C883A3A843939803A3A8239398036367934347636 + 367937377D37377D3939803C3C873C3C883A3A833A3A823B3B863B3B853A3A82 + 3A3A843C3C873A3A843A3A823B3B843C3C883C3C873A3A843939813939803939 + 813C3C884242950200000200005959C95959C95959C95959C95959C95959C959 + 59C95959C95959C95959C95959C95959C95959C96868CE7A7AD47A7AD47A7AD4 + 7A7AD47A7AD47A7AD47A7AD46969CE5959C95959C95959C95959C95959C95959 + C95959C96969CE7A7AD47A7AD47A7AD47A7AD47A7AD47575D26767CE5A5AC958 + 58C65454BD4F4FB35F5FAF6F6FAD6161A13E3E8D3E3E8D3E3E8C4949936A6AA3 + 67679D38387F38387F39398037377D38387F3A3A843A3A8438387F38387E3939 + 8138387E3E3E7D4747814C4C884C4C877777A2EBEBEBBBBBCC57579164649736 + 367A37377D36367A35357837377C5B5B946A6A9A5A5A8D464683484885474785 + 47478649498B4B4B8D4242893A3A823A3A833A3A8439398037377D3939805959 + 9262629362629135357735357936367A37377D3A3A843B3B8439398038387F3A + 3A8239398138387E39398068689D66669A4E4E8B39398051519167679C66669A + 38387E38387E3939803C3C884343970200000200005858C95858C95858C95858 + C95858C95858C95858C95858C95858C95858C95858C95858C95959C97070D179 + 79D47979D47979D47979D47979D47878D36868CE5858C95858C95858C95858C9 + 5858C95858C95858C96868CE7979D47979D47979D47979D47979D47979D47979 + D47979D47474D26464CB6363C5C5C5E0ECECECECECECEAEAEAB0B0CC3F3F8F83 + 83B4E6E6E6E3E3E3E3E3E3D7D7DC5B5B963A3A8466669DE3E3E3B4B4C93B3B88 + 66669DE2E2E2B6B6C848488573739DE9E9E9C0C0D04D4D8A7A7AA7F1F1F1E9E9 + E9E6E6E6E3E3E3C7C7D1505090393981434385C1C1CFE3E3E3E3E3E3E3E3E3A3 + A3BC4A4A8B4A4A8A9292B5E4E4E49393B848488E8A8AB2E3E3E38989B1393983 + 5B5B95CBCBD5E0E0E0E2E2E2E2E2E2E0E0E05A5A9366669BE4E4E4B5B5CA3C3C + 8967679EE3E3E3B5B5C9393983383880C4C4D3E7E7E7E9E9E9BCBCCEAFAFC7E9 + E9E9E6E6E6E4E4E4D6D6DB7D7DA93B3B883F3F8F44449C0200000200005858C9 + 5858C95858C95858C95858C95858C95858C95858C95858C95858C95858C95858 + C95959C97474D27979D47979D47979D47979D47979D46C6CD05858C95858C958 + 58C95858C95858C95858C95858C96868CE7979D37979D37979D37979D37979D3 + 7979D47979D47979D47979D47979D47878D2C6C6EAF8F8F8C0C0DE7979BA8A8A + BEB8B8D46666AAF6F6F6E5E5EB7B7BB49191BDECECECDDDDE23E3E8F6C6CA7E9 + E9E9BBBBD14949957676A8E7E7E7BDBDCE50508D7878A5EEEEEEC6C6D7525293 + 8080B1FBFBFBD5D5E38080B2B1B1CBE9E9E9ADADC83D3D8CB2B2CCECECECA7A7 + C76C6CA8CACADAE9E9E99696BB5050959999BFEAEAEA9999C04F4F999090BAE9 + E9E98E8EB83D3D8CD7D7E1EAEAEA8F8FBB6C6CA66B6BA59999BE60609F6D6DA7 + ECECECBBBBD14141946C6CA7E9E9E9BABACF3D3D8C6B6BA4ECECECD5D5DF4646 + 8C5252929090B860609E3D3D8C4A4A93E6E6E6D8D8DD4040924343984747A302 + 00000200005858C95858C95858C95858C95858C95858C95858C95858C95858C8 + 5858C85757C75757C65757C47070CD7676CF7676CF7777D07777D07777D07171 + CD5D5DC65656C45656C45656C55757C65757C66666CB7676CF7676CE7676CE76 + 76CE7676CE7676CE7676CE7676CE7777D07777D17878D27878D2FFFFFFFFFFFF + 7777C36464B45D5DAA5555A49D9DCBFFFFFFA7A7D14646A045459ED4D4E5F4F4 + F47474B27E7EB5F6F6F6C9C9DD5E5EA58484B7F2F2F2C6C6D857579A8080B1F7 + F7F7CDCDDF58589E8585BAFFFFFFD4D4E75C5CA56464A7F7F7F7F2F2F2424297 + FAFAFAF8F8F85151A344449B8282B9F5F5F5C9C9DC55559FA2A2CBF5F5F5A1A1 + CC5656A89999C8F5F5F59797C77575B5FBFBFBDEDEEA7575B77474B57373B472 + 72B25050A27474B5F7F7F7C4C4DD4747A27474B5F2F2F2C2C2DA44449B7272B2 + F2F2F2C2C2D83F3F913E3E8E3F3F8F8A8ABCBABAD6DCDCE7EFEFEFDFDFE54646 + 9F4848A54C4CAD0200000200005858C95858C95858C95858C95858C95858C958 + 58C95858C85757C75656C55555C35454BF5252BC6262C17171C67171C77171C7 + 7272C87272C87171C76D6DC45A5ABF5252BC5353BE5454BF6363C47373C97272 + C87171C77070C57070C57070C47070C47070C57171C77272C87373CA7575CD76 + 76CFFFFFFFFFFFFF6F6FC36A6AB96565B06262ABA6A6D0FFFFFF9D9DCE4848A6 + 4848A4CECEE6FFFFFF8585BE8A8AC0FFFFFFD5D5E96363AE8A8AC0FEFEFECFCF + E35B5BA28787BAFFFFFFD4D4E75D5DA58888BEFFFFFFD4D4E95F5FAA5E5EA9FF + FFFFFFFFFF5050A2FFFFFFFFFFFF4848A44C4CA58585BEFFFFFFD3D3E75A5AA7 + A8A8D2FFFFFFAAAAD75757B2A0A0D3FFFFFF9F9FD37B7BC2FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFDFDFD7B7BC27B7BC2FFFFFFCFCFE94D4DB17C7CC3FEFEFECC + CCE64B4BAB7A7AC0FBFBFBC9C9E246469F44449C9C9CCBFFFFFFFFFFFFFFFFFF + C0C0E06D6DBA4C4CAE4E4EB25050B80200000200005858C95858C95858C95858 + C95858C95858C95858C95858C85656C55555C15252BC5050B64E4EB25252B167 + 67B96A6ABA6B6BBB6C6CBD6B6BBC6A6ABA6A6AB96767B85454B34E4EB35E5EBA + 6E6EC06D6DBF6C6CBD6B6BBB6A6ABA6A6AB96969B86161B55E5EB46A6ABA6C6C + BD6E6EC17272C87474CBDADAF1FFFFFFB2B2DF6A6AB97979BAABABD29595C5FF + FFFFE6E6F35454AC6D6DB8FFFFFFFFFFFF6B6BB08C8CC1FFFFFFE0E0EF6E6EB4 + ABABD2FFFFFFDFDFEE6868ABA9A9CFFFFFFFD4D4E85555A48484BEFFFFFFDFDF + EE6B6BB28A8AC2FFFFFFE9E9F35C5CA7DCDCEDFFFFFFA0A0D05B5BAAC9C9E2FF + FFFFB2B2D55B5BA8A8A8D3FFFFFFC0C0E35353B8C5C5E7FFFFFFA2A2D95D5DBD + F3F3FAE8E8F65252BC5252BCDCDCF1FFFFFF6868C37F7FCCFFFFFFDCDCF25E5E + C0A2A2DAFFFFFFD1D1EC5050B87F7FC9FFFFFFD0D0EA4C4CAE4B4BACCFCFE9FF + FFFF9595D14F4FB55050B87E7ECB5151BA5252BC5454BF0200000200005858C9 + 5858C95858C95858C95858C95858C95858C95757C65555C15252BC4F4FB44B4B + AB4848A54747A24E4EA55E5EAA6262AC6464AF6262AC6060A96060A96161AA5E + 5EAA5959AA6666B26666B46666B36565B06363AE6262AC6262AB5959A647479E + 45459E4D4DA25959A96565B36D6DBE7070C58D8DD2F6F6FBFFFFFFFFFFFFFFFF + FFD4D4E65C5CA1B7B7D7FFFFFFFFFFFFFFFFFFFFFFFF9494C76060A88A8AC0FF + FFFFF5F5F9FFFFFFFFFFFFFFFFFFD4D4E7FFFFFFFFFFFFFFFFFF9E9ECB434399 + 7676B5FFFFFFF4F4F9FFFFFFFFFFFFFFFFFFA7A7CD5959A17A7AB4F3F3F9FFFF + FFFFFFFFFFFFFFDEDEEC6363A75858A2A7A7D0FFFFFFF4F4FAFFFFFFFFFFFFFF + FFFF7777CE5555C29A9ADBFFFFFFE8E8F7DDDDF3FFFFFFBBBBE75555C38282D3 + FFFFFFF4F4FBFFFFFFFFFFFFFFFFFFA4A4DE5555C1FFFFFFFFFFFFFFFFFFFFFF + FFD1D1EC8B8BD0FFFFFFF4F4FBD1D1EEF4F4FBD2D2EE5555C15555C35656C302 + 00000200005757C85757C85757C85757C85757C85757C85757C75555C35252BC + 4E4EB44949A944449D4040943F3F913F3F9145459256569A5B5B9E59599C5656 + 9756569656569757579759599B5C5CA15D5DA35D5DA35C5CA15C5CA05B5B9E52 + 52994141913D3D8C3D3D8C3E3E8F3F3F9147479D5959AE6565BB6D6DC07979C5 + A6A6D6ACACD3A8A8CC6D6DA554549543438E7E7EB49999C59A9AC76666A94747 + 975B5BA16767A78787B97D7DB47272AEA6A6CB9B9BC455559D6666A79C9CC88D + 8DC03F3F913D3D8C4A4A947272AC7171A96C6CA6A5A5CA9A9AC3535396535395 + 5252956969A3A4A4C8A4A4CA9898C15D5D9D5151965252986A6AAA7C7CBE6565 + BB7F7FCDA4A4DE8383D55757C75757C75757C76D6DCEA5A5E1A5A5E18F8FDA57 + 57C75757C76262CB8484D67979D26D6DCEA5A5E19A9ADD5757C75757C7A5A5E1 + FFFFFFDDDDF38282D37676CD5454C26C6CCBA4A4E0A5A5E0A5A5E16D6DCE5757 + C75757C75757C70200000200005757C85757C85757C85757C85757C85757C857 + 57C75454C25151B94C4CAE4646A23F3F923B3B883A3A85393984393983414189 + 52529352528F4F4F8A4F4F894F4F8A4F4F8951518D5454935656975656975555 + 955555954E4E923F3F8C3B3B873939823838813838813A3A853F3F914747A24C + 4CAD5656B66464BA6868B65F5FA656569651518D4E4E8A3D3D823838813B3B88 + 3C3C8A3C3C8942428E5656985757985757975858995656974E4E9043438E3F3F + 8F3E3E8F3E3E8E3D3D8D3B3B873838813838813939823B3B844A4A8C52529351 + 51914E4E8D4D4D8B4D4D8B4D4D8B4E4E8E5050924E4E8F4C4C8B4C4C8D4B4B8F + 43439145459E4B4BAD5050B85454C15656C65757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C857 + 57C85757C88484D7FFFFFFD2D2F05656C65656C65656C65757C75757C75757C7 + 5757C85757C85757C85757C85757C80200000200005757C85757C85757C85757 + C85757C85757C85757C75454C14F4FB74A4AAB44449D3D3D8C38388137377E36 + 367C36367B3838804040874C4C884B4B834A4A824A4A824A4A804B4B834F4F8A + 51518D51518D51518D4B4B8C3C3C883A3A8639398236367C35357A35357A3737 + 7D3C3C8A45459E4A4AAB4D4DB15E5EB76767B45D5DA35353914D4D8649498139 + 397934347837377F393983393982404088545494555594555594555594545492 + 47478A3B3B883C3C8B3C3C8B3C3C8A3B3B8838388135357935357935357A3636 + 7C39398148488A4D4D8A4A4A854949844949834949834A4A864C4C8B4A4A8648 + 48844646833D3D833C3C8A4343994A4AA94F4FB75454C05656C65757C85757C8 + 5757C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C857 + 57C85757C85757C85757C85757C85757C85757C85757C80200000200005757C8 + 5757C85757C85757C85757C85757C85757C75454C04F4FB77474BC5959A63C3C + 8B37377F36367B3535793434774D4D8B65659C3E3E834848824A4A814A4A8048 + 487E49497F56568C7777A27777A152528C3B3B845B5B975B5B9839398336367D + 35357A35357936367C3C3C8944449D4A4AAB4D4DB27575C18D8DC65E5EA45454 + 924C4C8548488038387734347737377E5E5E986A6AA057579553539355559454 + 549360609A8080AD7676A73B3B883C3C8B3C3C8A3C3C8A5E5E9C67679B656596 + 33337634347735357950508D6B6BA07272A14848814848824949834848826C6C + 9C7777A56B6B9B4545813B3B7F3939823C3C8A43439B4A4AAB5050B85454C156 + 56C65757C85757C85757C85757C85757C85757C85757C85757C85757C85757C8 + 5757C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C802 + 00000200005757C85757C85757C85757C85757C85757C85757C75454C2B2B2DC + ECECECE6E6E6B8B8CDE2E2E2B3B3C635357A70709EE7E7E7E3E3E3CCCCD6CBCB + D4DDDDDD7575A04C4C85616192DFDFE3EAEAEAECECEC8D8DB39999BCE8E8E8E3 + E3E3B4B4C9DDDDDDDBDBDB3838813939833E3E8F4646A14B4BAD8989CDFAFAFA + F2F2F2DADAE3D5D5DDE3E3E37575A13C3C7F5B5B94D4D4DEEFEFEFF1F1F1EFEF + EF9D9DC0565697A8A8C6EFEFEFF1F1F1F2F2F2E6E6EB3E3E8E6262A2D5D5DFE8 + E8E8E7E7E7E7E7E7E8E8E85B5B95B2B2CAEFEFEFECECECECECECDEDEE28B8BB0 + 4E4E8BE4E4E8EEEEEEECECECEAEAEAD0D0D95C5C983C3C893F3F914646A04C4C + AF5151BA5454C25757C75757C85757C85757C85757C85757C85757C85757C857 + 57C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C8 + 5757C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757 + C85757C85757C80200000200005757C85757C85757C85757C85757C85757C857 + 57C78282D3FDFDFDDFDFEC8080BE9D9DC5EAEAEABABACE383880C0C0D3F1F1F1 + 7878AC4A4A95D2D2DDE5E5E57373A74F4F909999BBEFEFEFB7B7CF3C3C885353 + 95F6F6F6F2F2F24B4B976161A3E5E5E5E0E0E03D3D8C3E3E9043439A4949A94E + 4EB4D1D1ECFFFFFF9B9BD16F6FB6D9D9E2E7E7E77B7BAB42428DD6D6E1EDEDED + 9393BF7070AD9797C2A1A1C69999C1F4F4F4D3D3E18E8EBA8686B6D0D0E14141 + 96DEDEE9F1F1F19191BE6D6DA96B6BA59999BE6161A09292BC6262A34040934B + 4B97EDEDEDE0E0E54E4E94A6A6C76666A44C4C997A7AB0E6E6E6ADADC9404093 + 43439A4848A64E4EB35252BC5555C35757C75757C85757C85757C85757C85757 + C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C857 + 57C85757C85757C85757C85757C85757C85757C85757C85757C85757C85757C8 + 5757C85757C85757C85757C85757C80200000200005656C85656C85656C85656 + C85656C85656C85656C8A4A4E0FFFFFFA1A1D94C4CB07575BAF3F3F3C1C1D63C + 3C8CBCBCD7FBFBFB9696C44E4EA1C5C5DDEFEFEF7171B343439B9595C4F4F4F4 + 9595C33F3F933E3E91F2F2F8FEFEFE8080BB44449EEFEFEFE6E6E643439C4444 + 9F4747A64D4DB25050BAC5C5E9FFFFFFB3B3E07474BFD0D0E4F2F2F28484B977 + 77B5F7F7F7D2D2E44646A44646A24C4CA46060ABD4D4E8FCFCFC9494C66262AC + 5555A64545A17676BBFFFFFFE3E3EF7575B97373B57272B27070B24F4FA14343 + 9B8C8CC2BBBBDADFDFEBF6F6F6E9E9EF45459E5151A49999CAC6C6DFE6E6EDEE + EEEEB3B3D14545A14747A64C4CB05050B95353C05555C55656C75656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C80200000200005656C8 + 5656C85656C85656C85656C85656C85656C8A4A4E1FFFFFFA3A3DD5050B97C7C + C5FBFBFBC8C8E04242995A5AA5CDCDE4FFFFFFFFFFFFFFFFFFFEFEFE7979C24A + 4AAB9D9DD0FBFBFB9A9ACD44449F44449E7777B9E6E6F3FFFFFFFFFFFFFCFCFC + F2F2F24A4AAC4B4BAE4D4DB35050BA5252BF6B6BCBD6D6F0FFFFFFFFFFFFFFFF + FFFFFFFF8F8FC97F7FC3FFFFFFCFCFE94D4DB24C4CB05151B16767B9D7D7ECFF + FFFF9191CC6969B95C5CB34B4BAD7B7BC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FDFDFD7A7AC19E9ED2FFFFFFFFFFFFFFFFFFC3C3E36E6EBD4B4BADCFCFE9FFFF + FFFFFFFFF3F3FAB3B3DB5656B24C4CB04D4DB35050B95252BF5454C35555C656 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C802 + 00000200005656C85656C85656C85656C85656C85656C85656C88E8EDAFFFFFF + E8E8F75E5EC47F7FCCFFFFFFCFCFE94848A85353AB5555AF4B4BAE7C7CC7E7E7 + F5FFFFFF7F7FCC4F4FB8A1A1D9FFFFFFA0A0D64B4BAE4A4AAD6363B84C4CB059 + 59B98A8ACFFFFFFFFEFEFE5050B95050BA5151BD5353C15454C46060C97272CE + 7575CE9898D9ECECF8FFFFFF9494D36363C0F3F3FAFFFFFF8080CE5252BB8585 + CFA7A7DBB2B2DEFFFFFFCFCFEB7979C76C6CC3ADADDE5B5BBDF3F3FAE8E8F650 + 50BA5050BADCDCF1FFFFFF6767C2D0D0ECFFFFFF9797D65050BB5050B97F7FCC + 5050B9FFFFFFFFFFFF6868C45050BA5C5CBE7272C65050BA5151BB5252BF5454 + C35555C55656C75656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C80200000200005656C85656C85656C85656C85656C85656C856 + 56C85656C8D2D2F0FFFFFFFFFFFFFFFFFFFFFFFFD0D0EC4E4EB57C7CC7FFFFFF + D0D0ECDCDCF1FFFFFFE8E8F75E5EC48181D1FFFFFFFFFFFFFFFFFFFFFFFFA1A1 + D9A2A2DAF3F3FAD1D1EDE8E8F6FFFFFFC6C6EA5353C15353C25454C35555C555 + 55C68383D6FFFFFFDBDBF3E4E4F5FFFFFFECECF87D7DCF6E6ECAA7A7DFFFFFFF + FFFFFFFFFFFFFFFFFFB5B5E47C7CCEE3E3F5FFFFFFFFFFFFFFFFFFFFFFFF5353 + C19898DAFFFFFFE8E8F7DDDDF3FFFFFFBABAE65353C28C8CD6FFFFFFF4F4FBD1 + D1EFF4F4FBD1D1EE5353C1AFAFE2FFFFFFE8E8F7D1D1EFFFFFFFA3A3DE5353C1 + 5454C35454C35555C55656C75656C75656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C80200000200005656C85656C85656C85656 + C85656C85656C85656C85656C85656C89A9ADEA5A5E1A4A4E1FFFFFFD1D1EE52 + 52BF5E5EC28C8CD4A3A3DDA4A4DF9898DC6060CA5656C76060CABBBBE8FFFFFF + BBBBE78282D36A6ACA6B6BCB9898DBA4A4E0A4A4E08E8ED95555C65656C75656 + C75656C75656C85656C86161CC9C9CDFB7B7E7B7B7E7AEAEE48181D57878D278 + 78D27878D28A8AD8B7B7E7B7B7E7AEAEE48181D57878D27878D2A5A5E1B7B7E7 + B0B0E57878D25656C75656C76D6DCEA5A5E1A5A5E18E8EDA5656C75656C75656 + C76D6DCEA5A5E1A5A5E1A5A5E16D6DCE5656C75656C77878D2A5A5E1A5A5E19A + 9ADD6161CB5656C75656C75656C75656C75656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C80200000200005656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C88383 + D6FFFFFFD2D2F05555C55454C45555C55555C55555C65656C75656C85656C856 + 56C8A5A5E2FFFFFFA5A5E15555C65555C65555C65656C75656C75656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C86666CD7878D37878D37878 + D37878D37878D37878D37878D37878D37878D37878D37878D37878D37878D378 + 78D37878D37878D36666CD5656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C856 + 56C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C8 + 5656C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656 + C85656C85656C85656C85656C85656C85656C85656C85656C85656C85656C802 + 00000200005555C75555C75555C75555C75555C75555C75555C75555C75555C7 + 5555C75555C76C6CCEA4A4E19898DC5555C55454C45454C45454C45454C55555 + C65555C65555C65555C75555C75555C75555C75555C75555C75555C75555C755 + 55C75555C75555C65555C65454C55454C55454C45454C45454C55454C55A5AC8 + 7474D07777D27777D27777D27777D27777D27777D27777D27777D27777D27777 + D27777D27777D27777D27777D27474D15A5AC95555C75555C75555C75555C755 + 55C75555C75555C75555C75555C75555C75555C65555C65555C75555C75555C7 + 5555C75555C75555C75555C75555C75555C75555C75555C75555C75555C75555 + C75555C65555C65454C55454C55454C45454C45454C55454C55555C65555C655 + 55C75555C75555C75555C75555C75555C75555C75555C75555C75555C75555C7 + 5555C75555C75555C75555C75555C75555C75555C75555C75555C75555C75555 + C75555C75555C70200000200005555C75555C75555C75555C75555C75555C755 + 55C75555C75555C75555C75555C65454C55454C45353C25252BF5151BE5151BD + 5151BD5151BD5151BE5252C05353C25454C45454C55555C65555C65555C75555 + C75555C75555C75555C65454C55353C35252C15151BE5151BD5050BB5050BB51 + 51BD5151BE5252C15F5FC77474D07777D17777D17777D17676D07575CF7575CE + 7575CE7575CE7474CD7474CD7575CE7575CE7373CE5F5FC85454C55555C65555 + C65555C75555C75555C75555C75555C75555C65454C55454C45353C35353C253 + 53C25353C35454C45454C55555C65555C75555C75555C75555C75555C75555C7 + 5555C75555C65454C55353C35252C15151BE5151BD5050BB5050BB5151BD5151 + BE5252C15353C35454C55555C65555C65555C65454C55454C45353C35353C353 + 53C35353C25353C25353C35353C35353C35454C45454C55555C65555C65555C7 + 5555C75555C75555C75555C75555C70200000200005555C75555C75555C75555 + C75555C75555C75555C75555C75555C75555C65454C45252C15151BD4F4FB84D + 4DB44C4CB24B4BB04B4BB04C4CB14D4DB34E4EB64F4FB85050BB5252BF5353C2 + 5454C45555C65555C65555C65454C55353C35252BF5050BB4E4EB74C4CB24B4B + AF4A4AAC4A4AAC4B4BAF4C4CB24E4EB75050BB5959C26767C87171CD7272CD71 + 71CB6F6FC86E6EC66E6EC56D6DC36C6CC26C6CC26B6BC26363C05858BE5151BE + 5252C15353C35454C55555C65555C75555C75555C75555C65454C55353C25252 + BF5050BB4F4FB94F4FB95050BB5151BE5353C25454C45555C65555C75555C755 + 55C75555C75555C65454C55353C35252BF5050BB4E4EB74C4CB24B4BAF4A4AAC + 4A4AAC4B4BAF4C4CB24E4EB75050BB5252BF5353C25353C35353C25252C15151 + BE5050BB5050BB4F4FB94F4FB84F4FB84F4FB94F4FBA5050BB5151BE5252C153 + 53C35454C55555C65555C75555C75555C75555C75555C70200000200005555C7 + 5555C75555C75555C75555C75555C75555C75555C75555C65454C45252BF4F4F + B94C4CB24949AB4747A54646A34545A24646A34646A54747A74848A94A4AAC4B + 4BB04D4DB54F4FBA5151BE5353C25454C45454C45353C25151BD4E4EB64B4BAF + 4747A64444A042429B41419942429A43439C4545A24848A84B4BAF4E4EB65050 + BB5151BD5151BD5050BB4E4EB64C4CB14A4AAE4949AB4848A94848A94949AB4A + 4AAD4C4CB14E4EB75050BC5252C15454C45555C65555C75555C75555C75454C5 + 5353C25151BD4E4EB64B4BAF4949AC4949AC4A4AAE4D4DB35050BB5252C05454 + C45555C65555C75555C75555C65454C55353C25151BD4E4EB64B4BAF4747A644 + 44A042429B41419942429A43439C4545A24848A84B4BAF4E4EB65050BB5151BD + 5151BD5050BB4E4EB64C4CB14A4AAE4949AB4848A94848A94949AB4A4AAD4C4C + B14E4EB75050BC5252C15454C45555C65555C75555C75555C75555C75555C702 + 00000200005555C75555C75555C75555C75555C75555C75555C75555C75454C5 + 5252C04F4FB94B4BB04646A542429B4040953E3E923E3E924040954141974242 + 9A43439C44449E4545A24848A84A4AAE4D4DB55050BB5151BE5151BE5050BB4C + 4CB24848A843439C3E3E913B3B893838833737823838843B3B893E3E9042429A + 4545A24949AB4C4CB14D4DB44D4DB54C4CB24949AC4747A544449E4141994040 + 9640409641419944449E4747A54B4BAF4E4EB75151BE5353C25454C55555C755 + 55C75555C65454C45151BD4D4DB54949AA44449F41419941419943439D4747A5 + 4C4CB15050BB5353C25454C55555C75555C65454C55353C25050BB4C4CB34848 + A843439C3E3E913B3B893838833737823838843B3B893E3E9042429A4545A249 + 49AB4C4CB14D4DB44D4DB54C4CB24949AC4747A544449E414199404096404096 + 41419944449E4747A54B4BAF4E4EB75151BE5353C25454C55555C75555C75555 + C75555C75555C70200000200005555C75555C75555C75555C75555C75555C755 + 55C75555C65353C35050BC4C4CB14646A44040953B3B8B393985383884393986 + 3B3B8B3D3D8E3E3E903E3E913E3E913F3F9341419744449E4747A74B4BAF4D4D + B44D4DB44B4BAF4646A34040953A3A8734347B3131722F2F6F30307031317334 + 347B3838833C3C8D4040974444A04747A74949AC4A4AAC4848A84545A1404097 + 3C3C8C38388336367E36367E3838833C3C8C4141994747A54C4CB15050BB5353 + C25454C55555C75555C75555C65252C14F4FB84949AB43439C3C3C8C38388338 + 38823A3A894040954747A54D4DB35151BD5454C45555C65454C55353C25050BB + 4C4CB14646A44040953A3A8734347B3131722F2F6F30307031317334347B3838 + 833C3C8D4040974444A04747A74949AC4A4AAC4848A84545A14040973C3C8C38 + 388336367E36367E3838833C3C8C4141994747A54C4CB15050BB5353C25454C5 + 5555C75555C75555C75555C75555C70200000200005454C75454C75454C75454 + C75454C75454C75454C75454C65151C14D4DB74848AA41419A3A3A8A36368035 + 357E36367F3838853B3B8C3D3D913E3E923C3C8F3B3B8B3939883939883C3C8D + 3F3F9643439F4646A54646A643439E3D3D913737823030722B2B672929622A2A + 622B2B672E2E6E3232773636803A3A893D3D904141994444A04646A54646A645 + 45A341419B3C3C8E3636803131732E2E6C2E2E6C3131733636813E3E924444A2 + 4A4AB04F4FBB5252C25353C55454C75454C75353C45050BD4B4BB14444A13C3C + 8D34347B2F2F702F2F7033337839398741419B4949AC4E4EB95252C25353C552 + 52C35050BD4C4CB34646A53E3E933737823030722B2B672929622A2A622B2B67 + 2E2E6E3232773636803A3A893D3D904141994444A04646A54646A64545A34141 + 9B3C3C8E3636803131732E2E6C2E2E6C3131733636813E3E924444A24A4AB04F + 4FBB5252C25353C55454C75454C75454C75454C75454C70200000200005454C7 + 5454C75454C75454C75454C75454C75454C75353C55050BE4C4CB34646A53E3E + 9338388535357E35357E3838853C3C8E40409742429C42429B3F3F953B3B8C37 + 378335357D35357E3838853B3B8C3E3E933F3F943B3B8C35357E2F2F6F292962 + 26265B26265B2929612D2D6A31317436367F3939873C3C8E3E3E934141994343 + 9E4545A24545A44545A241419A3B3B8C34347B2D2D6A2929622929622D2D6A34 + 347B3D3D904545A34B4BB35050BD5252C35454C65454C75454C65252C24E4EB8 + 4848AA3F3F953636802E2E6C2929622929622E2E6C35357E3E3E934646A54C4C + B55050BE5252C25151BF4D4DB74747A93F3F963737822F2F7029296226265B26 + 265B2929612D2D6A31317436367F3939873C3C8E3E3E9341419943439E4545A2 + 4545A44545A241419A3B3B8C34347B2D2D6A2929622929622D2D6A34347B3D3D + 904545A34B4BB35050BD5252C35454C65454C75454C75454C75454C75454C702 + 00000200005454C75454C75454C75454C75454C75454C75454C75353C55050BD + 4B4BB14444A26A6AA78888B18787AF8888B18B8BB87878B46666B24747A94646 + A643439E3D3D9037378232327630307231317433337936368036368033337839 + 39746F6F9084849BA7A7B4A7A7B69393AB75759E3838853D3D9040409742429C + 43439E4444A14545A34646A54646A64545A441419B3B3B8C3333782B2B652727 + 5B27275B2B2B6533337A3E3E924646A54C4CB55151BF5353C55454C65454C753 + 53C55151BF4C4CB37A7AB86565A03C3C7B2A2A6226265926265B2B2B67333379 + 3C3C8D4444A24B4BB14F4FBB5151BF4F4FBB4A4AAF43439E3939873C3C797070 + 9184849BA7A7B4A7A7B69393AB75759E3838853D3D9040409742429C43439E44 + 44A14545A34646A54646A64545A441419B3B3B8C3333782B2B6527275B27275B + 2B2B6533337A3E3E924646A54C4CB55151BF5353C55454C65454C75454C75454 + C75454C75454C70200000200005454C75454C75454C75454C75454C75454C754 + 54C75353C44F4FBC8E8ECBE4E4EAECECECECECECEFEFEFF2F2F2F5F5F5F5F5F5 + F2F2F2E1E1E8A7A7D05A5AAD4040973737833030722C2C692B2B662C2C692E2E + 6C2E2E6D8181A1D4D4D7E0E0E0E0E0E0E2E2E2E3E3E3E5E5E5E5E5E5CFCFDB85 + 85BD4747A94848AB4848AB4848AC7777C0F7F7F7F3F3F3CBCBDFB9B9D1B0B0C6 + AAAABDA7A7B6B4B4BEDDDDDDE5E5E56565993F3F954747A94E4EB85252C25454 + C65454C65454C65353C44F4FBB4949ACD2D2DEDDDDDDD5D5D5BABAC175759026 + 265B2C2C693333793B3B8C43439E4949AE4D4DB74F4FBB4D4DB64747A83E3E93 + 8686ABD4D4D8E0E0E0E0E0E0E2E2E2E3E3E3E5E5E5E5E5E5CFCFDB8585BD4747 + A94848AB4848AB4848AC7777C0F7F7F7F3F3F3CBCBDFB9B9D1B0B0C6AAAABDA7 + A7B6B4B4BEDDDDDDE5E5E56565993F3F954747A94E4EB85252C25454C65454C6 + 5454C75454C75454C75454C75454C70200000200005454C75454C75454C75454 + C75454C75454C75454C75353C46767C6FDFDFDFAFAFAFAFAFAFBFBFBF1F1F7B4 + B4D99D9DD2A0A0D8C5C5E9FEFEFEF2F2F2E5E5E59393BD42428A2F2F6F292962 + 26265B26265B27275D9C9CB1E9E9E9E9E9E9EBEBEBEFEFEFF3F3F3F7F7F7F8F8 + F8F9F9F9F7F7F7F4F4F4D1D1E67979C74D4DB74D4DB65959BB7C7CC9C4C4E7FC + FCFCF2F2F2E8E8E8E0E0E0DDDDDDDEDEDEA5A5B76C6C9543438841419A4949AE + 5050BD5353C55454C75454C75454C65151C14D4DB66A6AB6EFEFEFE5E5E5DDDD + DDD7D7D7BDBDC32929602F2F7036367F3C3C8D42429D4848AB4C4CB34D4DB64A + 4AB04444A1A5A5C4E9E9E9E9E9E9EBEBEBEFEFEFF3F3F3F7F7F7F8F8F8F9F9F9 + F7F7F7F4F4F4D1D1E67979C74D4DB74D4DB65959BB7C7CC9C4C4E7FCFCFCF2F2 + F2E8E8E8E0E0E0DDDDDDDEDEDEA5A5B76C6C9543438841419A4949AE5050BD53 + 53C55454C75454C75454C75454C75454C75454C75454C70200000200005353C6 + 5353C65353C65353C65353C65353C65353C65252C4A1A1DCFFFFFFFFFFFFFFFF + FF9B9BCC5151AB4848AC4C4CB54F4FBD5252C37474CEF3F3FAF2F2F2E2E2E2B7 + B7C638387126265C2323532222519A9AAEEDEDEDEFEFEFF2F2F2F6F6F6FCFCFC + FFFFFFF2F2F6BFBFDB9C9CCF9F9FD6B8B8E3E7E7F6FEFEFEB8B8E36666C34D4D + B94D4DB94D4DB9CFCFEBFFFFFFF5F5F5EBEBEBE4E4E4B1B1C028285F2D2D6A36 + 368241419B4A4AAF4F4FBD5252C45353C65353C65252C34F4FBC4949AFB1B1D6 + F6F6F6EFEFEFE6E6E6E0E0E0DCDCDC4F4F7F3232783838863D3D9041419B4646 + A74949AE4949AF4747A9ABABCFF1F1F1F0F0F0F2F2F2F6F6F6FCFCFCFFFFFFF2 + F2F6BFBFDB9C9CCF9F9FD6B8B8E3E7E7F6FEFEFEB8B8E36666C34D4DB94D4DB9 + 4D4DB9CFCFEBFFFFFFF5F5F5EBEBEBE4E4E4B1B1C028285F2D2D6A3636824141 + 9B4A4AAF4F4FBD5252C45353C65353C65353C65353C65353C65353C65353C602 + 00000200005353C65353C65353C65353C65353C65353C65353C65252C4A2A2DD + FFFFFFFFFFFF9292CE4848AC4A4AB04C4CB64E4EBB5151C15252C35050BE7C7C + C9FEFEFEECECECDEDEDEA9A9B824245722225070708BECECECF2F2F2F7F7F7FB + FBFBFFFFFFFFFFFF8F8FB13737833F3F974646A74A4AB14C4CB54C4CB69494D3 + E7E7F5FFFFFF4C4CB54C4CB64D4DB7A0A0D7FFFFFFFFFFFFF4F4F4EAEAEA8181 + 9E28285F2D2D6B37378241419C4A4AAF4F4FBD5353C55353C65353C55151C14D + 4DB75353AEF2F2F8FDFDFDF8F8F8F0F0F09B9BB0CDCDD58F8FAF3737833C3C8E + 3E3E9541419B4444A34747A94747A98D8DC6F8F8F8F7F7F7F8F8F8FBFBFBFFFF + FFFFFFFF8F8FB13737833F3F974646A74A4AB14C4CB54C4CB69494D3E7E7F5FF + FFFF4C4CB54C4CB64D4DB7A0A0D7FFFFFFFFFFFFF4F4F4EAEAEA81819E28285F + 2D2D6B37378241419C4A4AAF4F4FBD5353C55353C65353C65353C65353C65353 + C65353C65353C60200000200005353C65353C65353C65353C65353C65353C653 + 53C65353C5B9B9E7FFFFFFD0D0ED4D4DB74C4CB64D4DB94F4FBC5050BE5151C1 + 5050BE4D4DB74747AAE6E6F1F6F6F6E8E8E8DEDEDE6D6D8A222250CFCFD6F1F1 + F1F7F7F7FBFBFBFEFEFEFFFFFF51517C2E2E6E3838853F3F974545A44848AB48 + 48AC4848AB4747A85252ADC1C1E24747A94949AE4A4AB17A7AC5FFFFFFFFFFFF + FBFBFBEFEFEF5B5B842828602D2D6B37378341419C4A4AAF4F4FBD5252C45353 + C55252C34F4FBD4B4BB28E8EC6FFFFFFFFFFFFFFFFFFF9F9F9797999A3A3BCD4 + D4DD3B3B8D3F3F9740409A41419B43439F4545A44545A5E6E6F2FEFEFEFDFDFD + FDFDFDFEFEFEFFFFFF51517C2E2E6E3838853F3F974545A44848AB4848AC4848 + AB4747A85252ADC1C1E24747A94949AE4A4AB17A7AC5FFFFFFFFFFFFFBFBFBEF + EFEF5B5B842828602D2D6B37378341419C4A4AAF4F4FBD5252C45353C55353C5 + 5353C55353C65353C65353C65353C60200000200005353C65353C65353C65353 + C65353C65353C65353C65353C5D1D1EFFFFFFF8A8AD55050BE4F4FBD5050BE50 + 50BF5050BE4F4FBC4C4CB54747AA41419BCACAE0FEFEFEF2F2F2E9E9E99898AC + 666687F1F1F1F5F5F5F9F9F9FBFBFBFBFBFB8989A226265C2E2E6D3737833E3E + 9442429E4444A24343A141419C3F3F973E3E943E3E943F3F9742429E4646A678 + 78C0FFFFFFFFFFFFFEFEFEF1F1F15B5B8428285F2D2D6A37378241419B4949AE + 4E4EBB5151C25252C35050BF4D4DB74747A9D9D9EAFFFFFFFFFFFFFFFFFFFEFE + FE454576676798F4F4F46E6EAE42429E42429E41419B41419B42429E8181BEFF + FFFFFFFFFFFFFFFFFDFDFDFBFBFB8989A326265C2E2E6D3737833E3E9442429E + 4444A24343A141419C3F3F973E3E943E3E943F3F9742429E4646A67878C0FFFF + FFFFFFFFFEFEFEF1F1F15B5B8428285F2D2D6A37378241419B4949AE4E4EBB51 + 51C25252C35252C35252C45252C45353C55353C65353C60200000200005353C6 + 5353C65353C65353C65353C65353C65353C65353C6D1D1F0FFFFFF5252C45252 + C35151C15151C15050BE4E4EBA4B4BB24646A7404099393988E4E4EDFFFFFFFA + FAFAF3F3F3BBBBC98888A6F8F8F8F9F9F9F9F9F9F7F7F7E4E4E823235526265B + 2D2D6B35357F3B3B8D3F3F963F3F973E3E943A3A8B36368234347C34347B3636 + 803A3A8B3F3F977575B9FFFFFFFFFFFFFBFBFBEEEEEE5A5A8127275C2C2C6835 + 357F4040984747AA4C4CB64F4FBD4F4FBC4C4CB64949AE6868B1FFFFFFFFFFFF + FFFFFFFFFFFFD3D3DE2B2B6735357EE2E2EDADADD24545A54444A241419B3F3F + 963F3F979999C8FFFFFFFFFFFFFFFFFFF8F8F8E4E4E824245526265B2D2D6B35 + 357F3B3B8D3F3F963F3F973E3E943A3A8B36368234347C34347B3636803A3A8B + 3F3F977575B9FFFFFFFFFFFFFBFBFBEEEEEE5A5A8127275C2C2C6835357F4040 + 984747AA4C4CB64F4FBD4F4FBD5050BE5050C05151C15252C35353C55353C602 + 00000200005353C65353C65353C65353C65353C65353C65353C65353C69898DD + A3A3E15353C55252C45151C25050BE4D4DB74949AF4444A23E3E943737846767 + 99FFFFFFFFFFFFFFFFFFFEFEFEC5C5D5C8C8D9FFFFFFFEFEFEF9F9F9F3F3F39D + 9DB225255927275D2D2D6B35357E3B3B8D3E3E953E3E953C3C8E373782313174 + 2D2D6B2C2C6A2F2F6F34347B3B3B8C7272B3FFFFFFFFFFFFFAFAFAECECEC5858 + 7F26265A2A2A6533337B3D3D924444A24949AD4B4BB24949AF4747A843439FB1 + B1D3FFFFFFFFFFFFFEFEFEFEFEFE8B8BA82E2E6D3838869A9ACAECECF35252AE + 4545A44040993C3C903B3B8DCBCBE1FFFFFFFFFFFFFFFFFFF5F5F59E9EB42525 + 5927275D2D2D6B35357E3B3B8D3E3E953E3E953C3C8E3737823131742D2D6B2C + 2C6A2F2F6F34347B3B3B8C7272B3FFFFFFFFFFFFFAFAFAECECEC58587F26265A + 2A2A6533337B3D3D924444A24949AD4B4BB34B4BB34C4CB44D4DB74F4FBC5151 + C15252C45353C60200000200005252C65252C65252C65252C65252C65252C652 + 52C65252C65252C65252C65252C55151C34F4FBE4C4CB64747AC42429F3B3B90 + 35357F2E2E70D3D3DFFFFFFFFFFFFFFFFFFFFFFFFF9191B5C9C9DEFFFFFFFFFF + FFFBFBFBF2F2F28484A42828612929632E2E6E35357F3B3B8E3E3E963E3E953A + 3A8D34347D2D2D6C28286127275F2A2A653030733737846F6FAEFFFFFFFFFFFF + F8F8F8EAEAEA57577D24245728286131317639398A3F3F974242A04343A24141 + 9E3E3E96474795F2F2F6FFFFFFFEFEFEFBFBFBFBFBFB4444722F2F713A3A8B5B + 5BADFDFDFD9898CE4444A33E3E95393989373784CACADEFFFFFFFFFFFFFFFFFF + F2F2F28383A32828602929632E2E6E35357F3B3B8E3E3E963E3E953A3A8D3434 + 7D2D2D6C28286127275F2A2A653030733737846F6FAEFFFFFFFFFFFFF8F8F8EA + EAEA57577D24245728286131317639398A3F3F974242A04444A34444A34444A5 + 4747AC4B4BB44D4DBB5050C15252C50200000200005252C65252C65252C65252 + C65252C65252C65252C65252C65252C65252C55151C34F4FBE4C4CB64747AB41 + 419C3A3A8C33337B2D2D6CA3A3B9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFF60609E + CCCCE3FFFFFFFFFFFFFEFEFEF1F1F16161942D2D6D2C2C6B3030733535813B3B + 8E3D3D943D3D933939893232782B2B6727275D26265C2929632F2F723636836F + 6FABFFFFFFFFFFFFF7F7F7E8E8E856567B2424562828602F2F713636823A3A8D + 3C3C913C3C9139398A3636828585B0FFFFFFFFFFFFFCFCFCF8F8F8CECED82929 + 633232783C3C904444A5CECEE9E0E0ED4343A23D3D9437378434347DC9C9DCFF + FFFFFFFFFFFFFFFFF1F1F16060902C2C6A2C2C6A3030733535813B3B8E3D3D94 + 3D3D933939893232782B2B6727275D26265C2929632F2F723636836F6FABFFFF + FFFFFFFFF7F7F7E8E8E856567B2424562828602F2F713636823A3A8D3C3C913D + 3D933C3C923E3E9642429F4747AB4B4BB64F4FBE5151C40200000200005252C6 + 5252C65252C65252C65252C65252C65252C65252C65252C65151C44F4FBF4C4C + B74747AC40409B3939893232783838719F9FB5F5F5F5FCFCFCFFFFFFFFFFFFFF + FFFFCACAE03F3F999C9CD0FFFFFFFFFFFFFFFFFFF5F5F5C6C6D5B6B6C9B9B9CC + E3E3E8F4F4F4F4F4F4EFEFEFE6E6E6DDDDDDD4D4D4BBBBC3A4A4B3ABABBA2C2C + 6A3232793838886F6FAEFFFFFFFFFFFFF5F5F5E6E6E657577E26265B2929632F + 2F7234347E37378437378636368333337B303074D5D5E2FFFFFFFEFEFEF9F9F9 + F4F4F48787A52D2D6D3535813E3E974545A89292CFF8F8F88888C13D3D943737 + 8433337B9292B9FFFFFFFFFFFFFFFFFFF5F5F5C5C5D3B6B6C9B9B9CCE3E3E8F4 + F4F4F4F4F4EFEFEFE6E6E6DDDDDDD4D4D4BBBBC3A4A4B3ABABBA2C2C6A323279 + 3838886F6FAEFFFFFFFFFFFFF5F5F5E6E6E657577E26265B2929632F2F723434 + 7E3737843838863737863737843939893E3E954444A44949B14E4EBC5151C302 + 00000200005252C65252C65252C65252C65252C65252C65252C65252C65252C5 + 5050C14D4DBA4848AF41419E3A3A8B323278515181C4C4CFF2F2F2FAFAFAFFFF + FFFFFFFFFFFFFFF2F2F75A5AA94646A98787CDFFFFFFFFFFFFFFFFFFFDFDFDCD + CDDF9A9AC08F8FB99393BD9696C29898C5B1B1D5EAEAEFECECECE2E2E2DBDBDB + D8D8D8C6C6CF33337B3838863C3C917171B1FFFFFFFFFFFFF4F4F4E5E5E55959 + 852A2A662D2D6D32327835358036368235358033337B30307456568AFCFCFCFE + FEFEFBFBFBF5F5F5EFEFEF3A3A7632327939398A40409B4646AA5555B5F9F9F9 + D8D8E53E3E9638388735357F7878AAFFFFFFFFFFFFFFFFFFFCFCFCCCCCDC9999 + BE8F8FB89393BD9696C29898C5B1B1D5EAEAEFECECECE2E2E2DBDBDBD8D8D8C6 + C6CF33337B3838863C3C917171B1FFFFFFFFFFFFF4F4F4E5E5E55959852A2A66 + 2D2D6D32327835358036368235358134347F34347D3636823B3B904242A04848 + AF4D4DBA5151C30200000200005252C65252C65252C65252C65252C65252C652 + 52C65252C65151C44F4FBE4B4BB44444A53C3C9033337B77779CDEDEE1F1F1F1 + F9F9F9FFFFFFFFFFFFFFFFFFF2F2F86868B24747AC4B4BB54D4DBBE8E8F6FFFF + FFFFFFFFFFFFFF9898CC41419E3E3E963D3D933D3D943E3E973E3E97CBCBE2F8 + F8F8F0F0F0E9E9E9E4E4E4A0A0BF3B3B8D3E3E9741419E9A9ACBFFFFFFFFFFFF + F6F6F6E8E8E85F5F9232327834347D38388639398A8888B37C7CAB35357F3232 + 78A9A9C4FEFEFEFFFFFFFCFCFCF5F5F5B0B0C835358139398A3E3E974444A448 + 48AE4A4AB3CECEE9F3F3F39292C43C3C923A3A8B39398AE5E5F0FFFFFFFFFFFF + FFFFFF9696C73F3F993D3D943D3D933D3D943E3E973E3E97CBCBE2F8F8F8F0F0 + F0E9E9E9E4E4E4A0A0BF3B3B8D3E3E9741419E9A9ACBFFFFFFFFFFFFF6F6F6E8 + E8E85F5F9232327834347D38388639398A8787B27A7AA936368235357F373784 + 3C3C904242A04848AF4D4DBA5151C30200000200005252C65252C65252C65252 + C65252C65252C65252C65252C65151C34D4DBB4848AE40409B43438BABABC1EC + ECECF2F2F2FAFAFAFFFFFFFFFFFFFFFFFFF2F2F86969B54848AD4B4BB54D4DBA + 4E4EBC8A8AD4FFFFFFFFFFFFFFFFFFC3C3E64747AC4545A64343A242429F4141 + 9E41419DF2F2F8FFFFFFFFFFFFF8F8F8F2F2F27B7BB74242A04545A74747AC9C + 9CD2FFFFFFFFFFFFFEFEFEF0F0F0C5C5D54646933C3C913E3E973F3F999898C1 + D0D0DC3B3B8D515195FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA8585BA3F3F984141 + 9E4545A64848AE4B4BB64D4DB9CFCFECFBFBFBF5F5F56767B341419E41419C81 + 81BFFFFFFFFFFFFFFFFFFFC1C1E34646A94444A54343A242429F41419E41419D + F2F2F8FFFFFFFFFFFFF8F8F8F2F2F27B7BB74242A04545A74747AC9C9CD2FFFF + FFFFFFFFFEFEFEF0F0F0C5C5D54646933C3C913E3E973F3F999595BEC8C8D33B + 3B8F3A3A8D3B3B9040409A4545A74A4AB34E4EBD5151C30200000200005151C5 + 5151C55151C55151C55151C55151C55151C55151C54F4FC04B4BB64545A86060 + A5C8C8D6EFEFEFF5F5F5FBFBFBFFFFFFFFFFFFFFFFFFD8D8EA5D5DB24848AF4A + 4AB54B4BB74C4CB84C4CB84D4DBAB8B8E5FFFFFFFFFFFFFFFFFF6363C04949B2 + 4747AE4646AB4646A97777BEFFFFFFFFFFFFFFFFFFFFFFFFCDCDE74646AA4848 + AF4A4AB44A4AB5DBDBF0FFFFFFFFFFFFFFFFFFFEFEFED1D1E4E7E7EE8989C35C + 5CB17E7EC0E6E6EDF2F2F29696C8D9D9EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 6969B74646AA4747AD4949B24B4BB64D4DBB4D4DBCDBDBF1FFFFFFFFFFFFF2F2 + F96C6CBD4646AB4747ADB6B6DFFFFFFFFFFFFFFFFFFF6262BF4949B24747AE46 + 46AB4646A97777BEFFFFFFFFFFFFFFFFFFFFFFFFCDCDE74646AA4848AF4A4AB4 + 4A4AB5DBDBF0FFFFFFFFFFFFFFFFFFFEFEFED1D1E4E7E7EE8989C35C5CB17D7D + BFDEDEE5E4E4E48181BA40409D4242A04444A64848AF4C4CB84E4EBF5050C302 + 00000200005151C55151C55151C55151C55151C55151C55151C55151C44F4FC0 + 4A4AB46767B4E6E6EBF3F3F3F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFA4A4CE5151 + AD4A4AB34B4BB74B4BB74A4AB54949B24848B04A4AB34C4CB8ACACE0FFFFFFFF + FFFFDCDCF25959C04C4CB94B4BB65656B9DBDBF0FFFFFFFFFFFFFFFFFFF3F3FA + 5656B96363C1A0A0DAA0A0DBC4C4E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5252 + AFCECEE9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFC3C3E79E9ED74C4CB94D4DBB4E4EBD7E7ED1C4C4EAFFFFFF + FFFFFFFFFFFFFFFFFFF3F3FAABABDE4C4CB94D4DBBACACE0FFFFFFFFFFFFDCDC + F25959C04C4CB94B4BB65656B9DBDBF0FFFFFFFFFFFFFFFFFFF3F3FA5656B963 + 63C1A0A0DBA1A1DCC4C4E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5555B7CECEEA + FFFFFFFFFFFFFEFEFEF9F9F9F1F1F1E1E1E85252B14848AF4949B24C4CB94E4E + BD4F4FC15151C40200000200005151C55151C55151C55151C55151C55151C551 + 51C55151C44E4EBF5656B9E1E1EDF8F8F8FBFBFBFEFEFEFFFFFFFFFFFFF1F1F6 + 7B7BB24242A14949B14C4CB94C4CB94A4AB44747AE4545A84444A54646AA4949 + B24C4CB97D7DD0DCDCF3FFFFFFE8E8F7ADADE2A1A1DCE7E7F6FFFFFFFFFFFFFF + FFFFC4C4E85959C04E4EBD7171CAD0D0EDD0D0EDDBDBF1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF4646AA4747AC9D9DD4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFD0D0EDD0D0EDD0D0EDD0D0EED0D0EED0D0EED0D0EE5050C25050C25050C396 + 96DBD0D0EFD0D0EFD0D0EFD0D0EFD0D0EFD0D0EFD0D0EE5050C25050C25050C3 + 7F7FD3DCDCF3FFFFFFE8E8F7ADADE2A1A1DCE7E7F6FFFFFFFFFFFFFFFFFFC4C4 + E85A5AC14E4EBE7272CDD0D0EFD0D0EFDCDCF3FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFF4E4EBD4E4EBDA1A1DCFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA9B9BD64D4DBB + 4E4EBD4F4FC05050C25050C35151C40200000200005151C55151C55151C55151 + C55151C55151C55151C55151C44F4FC09E9ED7FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFD5D5E14D4D8B3B3B904343A44949B24B4BB74949B24646AB4343A240409B + 3F3F9A4242A14747AC4A4AB54E4EBE5151C47474D1A2A2E0C5C5EBD1D1EFD0D0 + EFC5C5EBA2A2DE6767CA5050C24F4FC14F4FC04E4EBD4C4CB94A4AB44848AF46 + 46AB5050AC7575BC9B9BCED9D9EC4343A44444A64646AB6060BAB7B7E2F3F3FA + F3F3FBA1A1DE5050C25050C25050C35151C45151C45151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C551 + 51C55151C55151C55151C55151C57474D1A2A2E0C5C5EBD1D1EFD0D0EFC5C5EB + A2A2DE6767CA5050C25050C35151C45151C45151C55151C55151C55151C55D5D + C97F7FD4A2A2E0DCDCF35151C45151C45151C46868CCB9B9E7F3F3FBF3F3FBA2 + A2DF5050C25050C25050C35151C45151C45151C55151C50200000200005151C5 + 5151C55151C55151C55151C55151C55151C55151C54F4FC0F3F3FAFFFFFFFFFF + FFFFFFFFFFFFFFAAAAC32C2C6C33337C3B3B8F41419F4646AB4848AF4545A841 + 419F3E3E963B3B903B3B9040409B4545A74A4AB34E4EBD5151C45151C55151C5 + 5151C55151C55151C55151C55151C55151C45050C34F4FC04D4DBB4A4AB44747 + AD4444A641419F3F3F9A3E3E973E3E963E3E963E3E963E3E973F3F9941419E44 + 44A54747AD4B4BB64E4EBD5050C25151C45151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C551 + 51C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C502 + 00000200005151C55151C55151C55151C55151C55151C55151C55151C57373CE + FFFFFFFFFFFFFFFFFFFFFFFFD4D4E33D3D7B2F2F7233337D3A3A8D3F3F9A4343 + A34444A541419E6C6CAD52529A38388839398B3E3E974444A64949B24E4EBD50 + 50C35151C45151C45050C35050C35151C45151C45050C34F4FC14E4EBD4C4CB8 + 4848AF4444A640409D3D3D943A3A8D39398A38388839398A39398A39398B3939 + 8B39398C3B3B8F3E3E964242A04747AC4B4BB64E4EBF5050C35151C55151C551 + 51C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C551 + 51C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151C5 + 5151C55151C55151C55151C55151C55151C55151C55151C55151C55151C55151 + C55151C55151C50200000200005050C55050C55050C55050C55050C55050C550 + 50C55050C57E7ED3FFFFFFFFFFFFFFFFFFFDFDFD7676AC33337E32327C343481 + 38388A3C3C943F3F9B3F3F9B5555A2E9E9E97D7DAE37378639398C3E3E994444 + A84949B44D4DBD4F4FC24F4FC24E4EC04E4EC04D4DBF4E4EC04E4EC04D4DBE4C + 4CBB4949B54646AC4242A13D3D9639398C35358334347F34347F353583373788 + 38388A38388B37378836368636368638388B3D3D964343A44848B24D4DBD4F4F + C25050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C50200000200005050C55050C55050C55050 + C55050C55050C55050C55050C57F7FD4FFFFFFFFFFFFFFFFFFFBFBFB3E3E9839 + 398D37378837378839398C3B3B913C3C943D3D958282B6E9E9E96666A338388B + 3B3B9141419F4646AC4A4AB74D4DBE4E4EC04D4DBF4C4CBB4B4BB94A4AB64A4A + B64A4AB64949B44747AF4444A840409D3B3B9137378733337F32327B32327B34 + 34803737873A3A8F3C3C943C3C9339398D3737883535833737863B3B9141419F + 4747AE4C4CBA4F4FC25050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C50200000200005050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C5F3F3FBFFFFFFFFFF + FFFFFFFF4F4FAD41419F3E3E983D3D963D3D963D3D973E3E983E3E98C1C1D9EC + ECEC6A6AAB3D3D9740409E4444A84848B24C4CBB4E4EC04E4EC04C4CBB4A4AB6 + 4848B14646AD4646AD4646AC4444A84343A43F3F9B3B3B9137378633337F3232 + 7A3E3E8263639B8A8AB58C8CBA8D8DBE7777B640409D3D3D963A3A8E37378738 + 38893B3B9141419F4646AD4B4BB94F4FC25050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C502 + 00000200005050C55050C55050C55050C55050C55050C55050C55050C55050C5 + A2A2E0FFFFFFFFFFFFFFFFFF9A9AD34646AD4444A74242A34242A14242A14242 + A17F7FBFF7F7F7F2F2F27070B74343A64545AB4848B24B4BB94D4DBF4E4EC04D + 4DBD4B4BB94848B24545AB4343A54343A44242A140409E3E3E983B3B90373787 + 3434807B7BA6B8B8CBEBEBEBEFEFEFF3F3F3F4F4F4F1F1F1EBEBEBD9D9E08080 + B93E3E983B3B913B3B913E3E984343A44848B04C4CBB4F4FC25050C55050C550 + 50C55050C55050C55050C45050C45050C44F4FC34F4FC34F4FC34F4FC34F4FC3 + 5050C45050C45050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C50200000200005050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55C5CC8DCDCF3FFFFFFFFFFFFFFFFFF9999D14646AC4444A8 + 4343A64343A58E8EC9F3F3F9FFFFFFFBFBFB7676C14848B24A4AB64C4CBB4D4D + BF4F4FC24E4EC14D4DBD4A4AB64747AF4343A641419F3F3F9B3D3D973B3B9239 + 398D36368665659DD4D4DEF0F0F0F4F4F4F9F9F9FFFFFFB3B3DA7777C38686CE + DADAF0F3F3F3E9E9E97878BA41419F40409E4242A14444A84848B24B4BB94D4D + BE4E4EC04E4EC04E4EC04E4EC04E4EC04D4DBF4D4DBD4D4DBD4C4CBC4C4CBB4C + 4CBB4C4CBC4D4DBD4D4DBF4E4EC14F4FC35050C45050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C50200000200005050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C44F4FC2A0A0DCFFFFFFFFFFFFFF + FFFFF2F2F8CBCBE6CDCDE7F2F2F9FFFFFFFFFFFFFFFFFFFFFFFF7979C74A4AB7 + 4C4CBB4E4EC04F4FC24F4FC34F4FC34D4DBE4B4BB84747AF4343A53F3F9C3D3D + 953A3A8E37378842428AA6A6C4F5F5F5F9F9F9FDFDFDFFFFFFD8D8E95959AA44 + 44A84848B24B4BB95858C0FFFFFFF6F6F6E3E3EA4545AB4444A84444A84646AC + 4747AF4848B24949B54A4AB64A4AB64A4AB64A4AB64949B44949B44848B24848 + B24848B04747AF4747AF4747AF4848B24A4AB64B4BB94D4DBE4E4EC15050C450 + 50C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C5 + 5050C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050 + C55050C55050C55050C55050C55050C55050C55050C55050C55050C55050C550 + 50C55050C55050C55050C55050C55050C55050C55050C50200000200005050C4 + 5050C45050C45050C45050C45050C45050C45050C45050C34F4FC14D4DBC4A4A + B65454B48F8FCBA7A7D4CCCCE5CCCCE5CCCCE5C0C0DF9A9ACD9B9BCE8F8FCA77 + 77C15454B44A4AB54C4CBA4E4EBF4F4FC15050C34F4FC24E4EBF8383CB4848B1 + 4444A63F3F9B3C3C9338388A5C5C9ADEDEE8FCFCFCFFFFFFFFFFFFFFFFFF9595 + C13C3C933F3F9A4343A34646AB4848B14A4AB5FFFFFFFFFFFFFAFAFA7777C448 + 48AF4646AC4545AA4545A84444A84444A74444A64343A54343A54343A54343A5 + 4444A64343A54343A54343A44242A24242A14242A14343A44545A84747AE4A4A + B64D4DBC4F4FC15050C35050C45050C45050C45050C45050C45050C45050C450 + 50C45050C45050C45050C45050C45050C45050C45050C45050C45050C45050C4 + 5050C45050C45050C45050C45050C45050C45050C45050C45050C45050C45050 + C45050C45050C45050C45050C45050C45050C45050C45050C45050C45050C402 + 00000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44E4EC2 + 4C4CBD4949B64646AD4141A23E3E993B3B933A3A903A3A903B3B933C3C953D3D + 973E3E9A3F3F9C4040A04343A54545AB4848B24A4AB84D4DBE4E4EC14E4EC1AA + AADFBCBCE14747AF4242A43D3D9839398D8282B1EBEBF0FCFCFCFFFFFFFFFFFF + C9C9DD5E5E9D37378A39398E3B3B933D3D9740409E4242A45E5EB6FFFFFFFFFF + FFCFCFEC6D6DC54848B34646AE4343A74040A03E3E9A3C3C953B3B923B3B913B + 3B923B3B933C3C953D3D973E3E993E3E9A3D3D983C3C963B3B943B3B933C3C95 + 3E3E9A4242A34646AE4A4AB74D4DBE4E4EC24F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC40200000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC34D4DC04B4BB94646AE4141A13B3B93373789353583343482353584 + 37378938388C39398E3A3A8F3A3A8F3A3A913C3C953F3F9C4343A54646AE4A4A + B74C4CBC7C7CD0FFFFFFFCFCFC9898CE40409E52529EB3B3CEF6F6F6FBFBFBFE + FEFEC8C8DB6969A034348236368537378737378737378737378939398D3B3B93 + 9999CACDCDE77777C44949B54949B64848B34545AB4040A03C3C943737893333 + 8031317A31317931317933337E35358337378A39398D3A3A913A3A9139398E38 + 388A37378837378939398D3D3D974242A44747B04B4BBA4E4EC14F4FC34F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC40200000200004F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC34D4DBE4949B54444A83D3D9737378833337E32 + 327C32327D35358338388A3A3A8F3A3A9039398D37378936368636368638388B + 3C3C954141A14545AC4949B54A4AB89292D3E6E6F4FFFFFFFBFBFBF8F8F8F9F9 + F9E0E0E9ABABC768689D33337F36368538388A39398D38388C37378735358333 + 337E33337E3434814444923C3C954141A24545AC4848B24747B14444AA3F3F9C + 39398D32327D2D2D6F2A2A672929652A2A682D2D6F31317A36368539398D3B3B + 933C3C943B3B9238388C3737873636853737873A3A8F3F3F9C4444AA4949B54D + 4DBF4F4FC34F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC40200000200004F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44E4EC24C4CBC4747B14141A23A3A + 9135358332327C32327C35358338388C3C3C953E3E9A3E3E993B3B9338388A34 + 348132327B32327C3535843B3B914040A04545AB4646AE4545AB4040A05555A0 + 6B6BA467679B3C3C7B2E2E7330307834348038388A3B3B933D3D983E3E9A3D3D + 973A3A9036368732327D3030762F2F743131793535833B3B9140409F4444AA46 + 46AE4444A93F3F9D38388C30307829296625255B24245825255D2A2A69313179 + 3737893C3C943F3F9C40409F3F3F9D3C3C963A3A8F38388A37378939398D3E3E + 994343A74848B34C4CBC4E4EC24F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC402 + 00000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44E4EC24B4BBA + 4646AE40409F6868A68787B08686AF8888B28C8CB87777B36363B04343A74242 + A43F3F9B39398E3434802F2F742D2D702F2F763434823A3A9140409E4141A13F + 3F9C3A3A8F3333802E2E732B2B6B3939756565979191B99393C09696C69595C9 + 7171B94E4EAA4242A33F3F9B3A3A903434822F2F752C2C6D2B2B6C2E2E733333 + 803A3A9040409F4444A84444A840409E39398D30307727276222225521215123 + 235850508063639A7676AE9191C39191C79090C78D8DC36060AE3E3E9A3B3B94 + 3A3A903A3A913E3E9A4343A64848B24C4CBC4E4EC24F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC40200000200004F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44E4EC14B4BB98B8BCAE3E3EAECECECECECECEFEFEFF2F2F2F5F5F5F5F5F5 + F2F2F2E1E1E8A5A5CE5757AC3C3C943434812D2D702A2A682A2A692F2F743535 + 833A3A8F3B3B9138388A32327D2D2D6F7C7CA0C1C1D1FBFBFBFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF8F8F8EFEFEFC6C6DB8181BD3F3F9C38388C32327B2B2B6C + 2828642929652D2D6F6969A2FFFFFFF8F8F8D7D7E4B8B8D1AFAFC6A9A9BCA5A5 + B5B3B3BDDDDDDDE6E6E6EFEFEFF7F7F7FCFCFCFEFEFEFBFBFBF5F5F5EEEEEEE6 + E6E68D8DC34141A13E3E9A3E3E9940409E4444A94848B34C4CBC4E4EC24F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4F + C44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F + 4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC44F4FC4 + 4F4FC44F4FC44F4FC44F4FC44F4FC40200000200004E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44D4DC16262C3FDFDFDFAFAFAFAFAFAFBFBFBF1F1F7B2 + B2D89B9BD19D9DD6C3C3E9FEFEFEF2F2F2E5E5E59191BC3F3F882B2B6D272762 + 2727612A2A692E2E753333803434823030796F6F9BDADAE1F9F9F9FEFEFEFFFF + FFFFFFFFD8D8EAA7A7D69D9DD6B7B7E3F3F3FBFFFFFFF7F7F7E9E9E9C8C8D56F + 6FAD3535852D2D7127276225255D272762494984A1A1C6D8D8EBFEFEFEF3F3F3 + E7E7E7E0E0E0DEDEDEE0E0E0E9E9E9D8D8E0B8B8CE9494C19999CD9C9CD5ABAB + E0E7E7F7FFFFFFF6F6F6E1E1E84545AE4343A84141A44242A74545AE4848B54B + 4BBC4D4DC24E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC40200000200004E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44D4DC29E9EDBFFFFFFFFFFFFFFFF + FF9999CB4E4EA94444AA4747B34B4BBC4D4DC17070CDF3F3FAF2F2F2E2E2E2B6 + B6C635357025255D24245B2626602B2B6B2E2E742E2E739393B1F0F0F0F4F4F4 + F9F9F9FFFFFFD6D6E56F6FAE4242A54747B34B4BBC4D4DC14E4EC3A1A1DFFFFF + FFFCFCFCEBEBEBDBDBDB9494B730307928286423235923235928286530307939 + 398ECCCCE5FFFFFFF5F5F5ECECECE8E8E8E8E8E89D9DB125255E2E2E7339398E + 4141A44848B54C4CBF4E4EC4A1A1DFFFFFFFF9F9F97575C74747B34646AF4646 + B04848B54A4ABA4C4CBF4D4DC24E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC402 + 00000200004E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44D4DC29F9FDC + FFFFFFFFFFFF8F8FCD4444AA4545AE4848B44A4AB94C4CBF4D4DC14B4BBC7878 + C7FEFEFEECECECDDDDDDA6A6B623235923235724245B2828652B2B6B9F9FB7EF + EFEFF1F1F1F5F5F5FBFBFBABABC53636873E3E9D4545AE4A4ABB4D4DC14E4EC3 + 4E4EC44E4EC49595DBFFFFFFFEFEFEE9E9E9D9D9D99191B02A2A692323582222 + 5524245B2B2B6D3434839696C6FFFFFFFFFFFFF6F6F6EFEFEFECECEC30306026 + 265F2E2E733939904242A54848B54C4CC04E4EC44E4EC4C4C4EBFFFFFF9D9DD9 + 4A4ABA4949B84949B84A4ABB4C4CBE4D4DC14E4EC34E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC40200000200004E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC3B7B7E6FFFFFFCECEEC4848B54848B54949B74A4ABA4B4BBC4C4CBF + 4B4BBC4848B54343A8E5E5F1F5F5F5E5E5E5D9D9D96A6A8822225624245B2727 + 629E9EB7F0F0F0F2F2F2F5F5F5F9F9F9A8A8C03030783A3A914242A54848B54C + 4CBF4E4EC34E4EC44E4EC44E4EC44E4EC4A1A1DFFFFFFFFBFBFBE6E6E6D6D6D6 + 8383A224245A20205122225528286431317A6D6DABFFFFFFFFFFFFFEFEFEF5F5 + F5B8B8C622225626265F2E2E743939904242A54848B54C4CC04E4EC44E4EC45A + 5AC7F3F3FBD0D0EE4C4CBF4C4CBF4C4CBE4C4CBF4D4DC14D4DC24E4EC34E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC40200000200004E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC3D0D0EFFFFFFF8888D44B4BBC4B4BBC4B4BBC4B + 4BBD4B4BBC4A4ABA4747B34343A83D3D99C9C9DFFBFBFBECECECE0E0E09090A5 + 23235826265F696992F0F0F0F4F4F4F6F6F6F8F8F8DEDEE53737703333803D3D + 984545AC4A4ABA4D4DC24E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4E7E7F6FF + FFFFF4F4F4E0E0E0D3D3D352527A20205020205125255E2E2E736C6CA7FFFFFF + FFFFFFFFFFFFF5F5F5B6B6C522225626265F2E2E743939904242A54848B54C4C + C04E4EC44E4EC44E4EC4B8B8E7FFFFFF4D4DC24D4DC24D4DC24D4DC24E4EC34E + 4EC34E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC4 + 4E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4E + C44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E + 4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC44E4EC40200000200004E4EC3 + 4E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC3D0D0EFFFFFFF4D4DC14D4D + C04C4CBE4C4CBE4B4BBB4949B74646AF4242A43C3C97363686E3E3ECFDFDFDF2 + F2F2E9E9E9B0B0BE26265F36366FE3E3E7F4F4F4F7F7F7F8F8F8F8F8F8797999 + 2B2B6A3535853F3F9D4646AF4B4BBB4E4EC24E4EC34E4EC34E4EC34E4EC34E4E + C34E4EC3A0A0DDFFFFFFFFFFFFECECECDADADAAFAFBA2020501F1F4E2323592B + 2B6D6969A2FFFFFFFFFFFFFFFFFFF2F2F2B3B3C122225626265F2E2E7339398F + 4242A44848B44C4CBF4E4EC34E4EC34E4EC35A5AC77D7DD34E4EC34E4EC35858 + C69999DC8383D55656C64E4EC34E4EC34E4EC34E4EC34E4EC34E4EC35F5FC97A + 7AD26565CB4E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC3 + 4E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4E + C34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC34E4EC302 + 00000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC39494DB + A0A0DF4D4DC24C4CC14B4BBF4A4ABB4747B44444AC3F3FA03A3A923333826565 + 98FFFFFFFEFEFEF8F8F8F2F2F2B8B8C82A2A6A8989AEF6F6F6F8F8F8F8F8F8F7 + F7F7D8D8DF2323592B2B6D3636893F3FA14646B24B4BBE4D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC36464C8FFFFFFFFFFFFF6F6F6E3E3E3D5D5D55050 + 741E1E4D2222562929696969A0FFFFFFFFFFFFFEFEFEEFEFEFB0B0BE22225625 + 255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC35757C79A9ADD9B9BDD8F8FD95D5DC84E4EC34D4DC34D4DC34D4D + C34D4DC35E5EC97979D27878D26B6BCD4F4FC44D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC30200000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC24C4CC04A4ABB4747B44343A93E3E9D38388D + 32327D2B2B6ED3D3DFFFFFFFFEFEFEFCFCFCF9F9F98B8BAF303079E2E2ECFBFB + FBFAFAFAF8F8F8F3F3F381819B24245A2C2C7037378C4040A24747B34B4BBE4D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34C4CC0F3F3FAFFFFFFFEFEFE + EBEBEBDBDBDB8E8EA21E1E4C21215428286668689EFFFFFFFFFFFFFCFCFCEFEF + EFB0B0BE22225625255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC35757C79B9BDD8E8ED99D9DDE9A9ADD7272CF + 5252C54D4DC34D4DC34D4DC35F5FC97A7AD27373D07A7AD27373D05A5AC74E4E + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC30200000200004D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC24C4CC04A4ABB4747B44242A83D + 3D9A36368A3030792A2A6AA2A2B9FBFBFBFEFEFEFFFFFFFFFFFFFFFFFF5C5C9B + 5E5EA1FFFFFFFFFFFFFBFBFBF6F6F6EFEFEF48486F24245B2C2C7038388D4040 + A34747B44B4BBE4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34C4CC0CE + CEECFFFFFFFFFFFFF2F2F2E2E2E2C3C3C91E1E4C22225529296768689FFFFFFF + FFFFFFFCFCFCEEEEEEAFAFBD22225625255F2E2E7338388F4141A44747B44B4B + BF4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC35858C79C9CDE7878D265 + 65CB9494DB9E9EDE8383D55A5AC74D4DC34D4DC36060C97979D26161CA6060C9 + 7B7BD37878D16565CB4E4EC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC30200000200004D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34C4CC14A4ABC4747 + B44343A93C3C993535872F2F7735356F9E9EB4F5F5F5FCFCFCFFFFFFFFFFFFFF + FFFFC9C9DF3B3B949797C9FFFFFFFFFFFFFCFCFCF4F4F4ECECEC1F1F5024245A + 2C2C7037378C4040A34747B44B4BBE4D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34C4CC0AAAADDFFFFFFFFFFFFF7F7F7E7E7E7E0E0E02B2B5722225629 + 29696969A0FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD22225625255F2E2E7338388F + 4141A44747B44B4BBF4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC35858 + C79C9CDE7474D04E4EC35B5BC88585D6A0A0DF9191DA6363CA4D4DC36161CA79 + 79D25B5BC84D4DC35C5CC87373D07C7CD36D6DCE5353C54D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC302 + 00000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC2 + 4B4BBE4848B84444AC3D3D9B3636892F2F764F4F80C4C4CFF2F2F2FAFAFAFFFF + FFFFFFFFFFFFFFF2F2F75757A74141A4A7A7D6FFFFFFFFFFFFFBFBFBF1F1F1BF + BFC92020502323592B2B6E37378A4040A14646B24B4BBE4D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34B4BBE9D9DD7FFFFFFFFFFFFFAFAFAECECECE3E3 + E35555772323592B2B6D6969A3FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD22225625 + 255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC35858C79C9CDE7575D14F4FC44D4DC35656C67676D19B9BDD9A9A + DD7373D06666CC7979D25C5CC84D4DC34E4EC35757C66A6ACD7C7CD37474D05D + 5DC84E4EC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4D + C34D4DC34D4DC30200000200004D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34C4CC14A4ABB4646B14040A238388E30307975759BDEDEE1F1F1F1 + F9F9F9FFFFFFFFFFFFFFFFFFF2F2F76565B14343A94545B0CDCDE9FFFFFFFFFF + FFFBFBFBEEEEEEB0B0BE2020512323592A2A6B3535873F3F9E4545B04A4ABC4D + 4DC24D4DC34D4DC34D4DC34D4DC34D4DC34D4DC24B4BBD9C9CD5FFFFFFFFFFFF + FCFCFCEFEFEFE6E6E656567A25255D2E2E736B6BA7FFFFFFFFFFFFFCFCFCEEEE + EEAFAFBD22225625255F2E2E7338388F4141A44747B44B4BBF4D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC35858C79D9DDE7575D14F4FC44D4DC34D4DC3 + 4E4EC36868CC9595DBA3A3E09292DA8585D65C5CC84D4DC34D4DC34D4DC35050 + C46363CB7B7BD37A7AD26767CC5252C54D4DC34D4DC34D4DC34D4DC34D4DC34D + 4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC34D4DC3 + 4D4DC34D4DC34D4DC34D4DC34D4DC30200000200004C4CC34C4CC34C4CC34C4C + C34C4CC34C4CC34C4CC34C4CC34B4BC04848B84343AB3C3C993F3F89AAAAC0EC + ECECF2F2F2FAFAFAFFFFFFFFFFFFFFFFFFF2F2F86565B44242AB4545B24747B5 + CDCDEAFFFFFFFFFFFFFBFBFBECECECAEAEBD2020532222572929683333823C3C + 9A4444AE4949BB4B4BC14C4CC34C4CC34C4CC34C4CC34C4CC34B4BC14848BA9B + 9BD4FFFFFFFFFFFFFDFDFDF1F1F1EAEAEA58587D27276430307B6C6CABFFFFFF + FFFFFFFCFCFCEEEEEEAFAFBD21215625255F2D2D7338388F4040A44646B44B4B + BF4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC35757C79D9DDE7575D14E + 4EC44C4CC34C4CC34C4CC34C4CC35E5EC98A8AD8ADADE4AEAEE47171CF4C4CC3 + 4C4CC34C4CC34C4CC34C4CC35C5CC87575D17E7ED46D6DCE5454C64C4CC34C4C + C34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C + 4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC30200000200004C4CC3 + 4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34A4ABE4646B44141A65D5D + A4C7C7D6EFEFEFF5F5F5FBFBFBFFFFFFFFFFFFFFFFFFD8D8EA5959B04444AE46 + 46B34747B54646B4CDCDEAFFFFFFFFFFFFFBFBFBECECECAEAEBE222256222257 + 27276430307C3A3A944242A84747B74B4BC04C4CC24C4CC34C4CC34C4CC34C4C + C24A4ABE4747B59A9AD0FFFFFFFFFFFFFDFDFDF2F2F2ECECEC4C4C782B2B6D34 + 34846F6FB1FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD21215625255F2D2D7338388F + 4040A44646B44B4BBF4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC35757 + C79D9DDE7575D14E4EC44C4CC34C4CC34C4CC34C4CC34C4CC35656C68989D8B8 + B8E7A6A6E17171CF5454C64C4CC34C4CC34C4CC34C4CC35555C66C6CCE7E7ED4 + 7474D05B5BC84E4EC44C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4C + C34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC302 + 00000200004D4DC34D4DC34D4DC34D4DC34E4EC34E4EC34E4EC34E4EC24C4CBE + 4747B26464B3E6E6EBF3F3F3F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFA4A4CD4F4F + AB4646B14848B54848B54747B34646B0C1C1E3FFFFFFFFFFFFFDFDFDECECECBA + BAC725255D2323592727622E2E7538388C4141A14747B14B4BBC4D4DC14E4EC3 + 4D4DC34D4DC24C4CC04949BA4646AEBFBFDFFFFFFFFFFFFFFDFDFDF3F3F3EFEF + EF2828643131793A3A8F7272B6FFFFFFFFFFFFFCFCFCEEEEEEAFAFBD22225526 + 265F2F2F743A3A904343A54A4AB54E4EC05050C45050C45050C45050C45050C4 + 5050C44E4EC35A5AC79E9EDE7676D14F4FC44D4DC34D4DC34D4DC34D4DC34D4D + C34C4CC36262CA9090DAA2A2E0A3A3E08080D45959C74D4DC34C4CC34C4CC34C + 4CC34E4EC46565CB7D7DD37B7BD36363CB5050C44C4CC34C4CC34C4CC34C4CC3 + 4C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4C + C34C4CC34C4CC30200000200005656C65757C75858C75B5BC85D5DC95D5DC95E + 5EC95E5EC85C5CC36161BDE1E1EEF8F8F8FBFBFBFEFEFEFFFFFFFFFFFFF2F2F6 + 8484B45151A65858B55858BD5858BC5656B85454B15656AEA4A4D1FFFFFFFFFF + FFFFFFFFEEEEEEDEDEDE3030692A2A602C2C643333724646895454A05E5EB366 + 66C06A6AC86969CB6464C96363C76161C36060BB5E5EAFDDDDEBFFFFFFFFFFFF + FDFDFDF5F5F5D9D9DF42427850508F5C5CA48C8CC4FFFFFFFFFFFFFCFCFCEEEE + EEB4B4BF34345B3A3A6447477B5959996767B17171C27878CE7C7CD37D7DD37D + 7DD37D7DD37E7ED47E7ED47E7ED38585D6A8A8E28585D66161CA6060CA6060CA + 6060CA6060CA6060CA5E5EC96C6CCE7878D26868CC8F8FDAA7A7E19696DC6262 + CB4F4FC44C4CC34C4CC34C4CC34C4CC35C5CC87878D28080D46E6ECE5252C54C + 4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC3 + 4C4CC34C4CC34C4CC34C4CC34C4CC30200000200006262CB6464CB6868CC6F6F + CF6F6FCF7070CF7171D07272CF7070CAB0B0DCFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFD9D9E26464935A5A9A6868B07070BE6E6EC26868BC6464B46363AD6767A8 + 8F8FBDFFFFFFFFFFFFFFFFFFF2F2F2E0E0E059598835356D33336A3B3B725A5A + 8A68689D7474B07F7FBF8787CB8A8ACE7F7FCB7A7AC87676C07777B77E7EB0FF + FFFFFFFFFFFFFFFFFDFDFDF6F6F6ACACBD66668F7777A68484B9A8A8CFFFFFFF + FFFFFFFCFCFCEEEEEEB9B9C046465E4E4E696060817777A08B8BB99A9ACDA5A5 + DAABABE1ADADE3AEAEE4AEAEE4AFAFE4B0B0E4B1B1E5B2B2E5ACACE39191DA77 + 77D17777D17777D17777D17878D27878D27979D27979D27171CF5A5AC85252C5 + 7C7CD3A4A4E0A7A7E16F6FCF5454C64D4DC34C4CC34C4CC34C4CC35454C66F6F + CF8080D47878D25858C74E4EC44C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C + 4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC34C4CC30200000200005151C4 + 5151C45656C65B5BC75757C65353C45555C55555C55656C1F5F5FBFFFFFFFFFF + FFFFFFFFFFFFFFB0B0C439396F38387C3E3E8F4B4BA25858AF4F4FB04848A844 + 449F4444974C4C95454592F3F3F8FFFFFFFFFFFFFAFAFAE5E5E57676A4313177 + 2E2E6F3434725050824B4B8C4646974A4AA25B5BB06161B65353B24D4DAC4949 + A54E4E9D9797BDFFFFFFFFFFFFFFFFFFFDFDFDF8F8F86363974646914E4EA253 + 53AE8181C4FFFFFFFFFFFFFBFBFBEDEDEDB1B1BE2A2A572F2F6038387345458C + 4F4FA25858B45E5EC06161C76363C96363CA6363CA6363CA6464CA6565CA6666 + CB6464CA5858C65555C55555C55555C55555C55555C55656C55656C55757C654 + 54C54D4DC24C4CC24E4EC36767CB9D9DDEA9A9E28686D65757C64C4CC24C4CC2 + 4C4CC24C4CC24F4FC36565CB8181D47F7FD36464CA4D4DC24C4CC24C4CC24C4C + C24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC202 + 00000200004C4CC24C4CC25151C45757C65151C44C4CC24C4CC24C4CC27272CD + FFFFFFFFFFFFFFFFFFFFFFFFD4D4E24A4A7F38387531317B36368A42429A4E4E + A54444A43D3D9B6D6DAE55559B42428B3B3B8A9696C6FFFFFFFFFFFFFFFFFFED + EDEDA1A1C234348631317C3434794F4F8442428637378A3A3A944C4CA25252A8 + 4444A33D3D9D3B3B9641418ECDCDDFFFFFFFFFFFFFFFFFFFFEFEFEC5C5D93737 + 8D3D3D9C4242A84444AD7474C1FFFFFFFFFFFFFAFAFAECECECAEAEBD23235B26 + 26612C2C713535873C3C9A4242AA4747B64A4ABD4B4BC04C4CC24C4CC24C4CC2 + 4C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4C + C24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24D4DC25656C59292DAAAAAE29B + 9BDD6565CA4C4CC24C4CC24C4CC24C4CC24C4CC25A5AC77C7CD28181D47171CF + 5151C44C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4CC24C4C + C24C4CC24C4CC20200000200004B4BC24B4BC25050C45656C65050C44B4BC24B + 4BC24B4BC27D7DD2FFFFFFFFFFFFFFFFFFFDFDFD7676AB4444833D3D7E32327F + 3535883E3E9449499D40409A5252A0F1F1F18585B44141893B3B8C48489DE5E5 + F3FFFFFFFFFFFFFAFAFAE5E5E546469C36368D39398655558D43438835358737 + 378E4747984C4C9C3F3F9738389236368B7171A7FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF6D6DAD3D3D9D4242AA4444B14545B17474C1FFFFFFFFFFFFF8F8F8EAEA + EAADADBF2828672A2A6D2E2E783535893B3B994141A84545B44949BC4A4AC04B + 4BC14B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24C4C + C24C4CC27979D2A5A5E1AAAAE27474D04C4CC24B4BC24B4BC24B4BC24B4BC251 + 51C46E6ECE8181D47B7BD25858C74C4CC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC20200000200004B4BC24B4BC25151C45656 + C65151C44B4BC24B4BC24B4BC27E7ED2FFFFFFFFFFFFFFFFFFFBFBFB3D3D974D + 4D9343438B34348635358A3D3D914646973D3D948181B5EEEEEE6B6BA643438E + 3D3D913D3D9D7474C0FFFFFFFFFFFFFFFFFFF4F4F49797C73D3D9F4141985E5E + 9C49499337378C37378E4545934949963C3C9136368C424290E5E5EFFFFFFFFF + FFFFFFFFFFFFFFFFA3A3CE3E3EA14343AD4545B44747B74646B48282C8FFFFFF + FFFFFFFCFCFCEEEEEEB2B2C62F2F7A30307D3333853838913D3D9D4141A84545 + B44848BA4A4ABF4B4BC14B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24C4CC26767CC9D9DDEACACE38888D75858C64B4B + C24B4BC24B4BC24B4BC24F4FC36363CA8181D48181D46666CB4F4FC34B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC20200000200004B4BC2 + 4B4BC25151C45656C65151C44B4BC24B4BC24B4BC24F4FC3F5F5FCFFFFFFFFFF + FFFFFFFF4E4EAB5656A64B4B9B3B3B9439399440409749499B3F3F97C1C1D9EF + EFEF6D6DAD4A4A9A42429E4141A64444B09191D4FFFFFFFFFFFFFFFFFFF2F2F2 + 6E6EBC4848A86A6AAF5050A23C3C983A3A9748489B4C4C9B3E3E95383891BCBC + DAFFFFFFFFFFFFFFFFFFFFFFFFD8D8EC4141A74444B04747B74848BA4848BB47 + 47B89C9CD6FFFFFFFFFFFFFFFFFFF7F7F7BABAD23838913939933B3B973D3D9E + 4040A64343AE4646B64949BC4A4AC04B4BC14B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24C4CC25959C79090D9 + ADADE39B9BDD6767CC4B4BC24B4BC24B4BC24B4BC24D4DC35959C77C7CD38383 + D57272CF5454C54B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC202 + 00000200004B4BC24B4BC25151C45656C65151C44B4BC24B4BC24B4BC24F4FC3 + B1B1E4FFFFFFFFFFFFFFFFFF9999D25E5EB55454AD4141A43E3EA14545A44E4E + A67F7FBFF8F8F8F4F4F47272B85151A94848AB4545B04747B74949BC9E9EDDF6 + F6FCFFFFFFFFFFFFE9E9F18282C87474BE5757B14141A63F3FA44D4DA65252A7 + 4E4EA7CBCBE5FFFFFFFFFFFFFFFFFFFFFFFFCCCCE85050B44646B44848BA4949 + BD4A4ABF4A4ABE4848BBC2C2E7FFFFFFFFFFFFFFFFFFFFFFFFE7E7EE4B4BA940 + 40A54141A74242AA4444AF4646B44848BA4949BD4A4AC04B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC25353C57F7FD3ABABE3A7A7E17575D04B4BC24B4BC24B4BC24B4BC2 + 4B4BC25353C57070CF8383D57B7BD25B5BC74B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC20200000200004B4BC24B4BC25151C45656C65151C44B4BC24B + 4BC24B4BC24F4FC37676D0DEDEF4FFFFFFFFFFFFFFFFFFA8A8D95A5ABA4646B1 + 4343AD4A4AAF9797D0F3F3FAFFFFFFFBFBFB7777C35757B64D4DB64848B84949 + BC4A4ABF6060C88A8AD7D5D5F0FFFFFFFFFFFFFBFBFBC3C3E38E8ECE4646B244 + 44AF7373BFA4A4D4F3F3F9FFFFFFFFFFFFFFFFFFFFFFFFA0A0D74646B64848BA + 4949BD4A4ABF4B4BC14B4BC17A7AD19E9EDCFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFBCBCE17373C55C5CBC4646B54747B74848BA4949BD4A4ABF4B4BC14B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC25050C46E6ECE9D9DDEAFAFE48888D755 + 55C54B4BC24B4BC24B4BC24B4BC25151C46666CB7F7FD48181D46666CB4D4DC3 + 4B4BC24B4BC24B4BC24B4BC24B4BC20200000200004B4BC24B4BC25151C45656 + C65151C44B4BC24B4BC24B4BC24F4FC36D6DCD5D5DC8A0A0DEFFFFFFFFFFFFFF + FFFFF3F3FACDCDEBCECEECF3F3FAFFFFFFFFFFFFFFFFFFFFFFFF7C7CCC5C5CC1 + 5050BF4B4BBE4A4AC04B4BC16060C97878D16161C97B7BD2C3C3EAFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3FABBBBE57979CB52 + 52BF4A4ABE4A4AC04B4BC14B4BC14B4BC24B4BC2FFFFFFFFFFFFF3F3FBCFCFEE + CECEEDCECEEDCECEEDDBDBF2FFFFFFFEFEFE9C9CD94949BD4949BD4A4ABF4A4A + C04B4BC14B4BC14B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC26161 + C99494DBB0B0E49494DB6868CC4B4BC24B4BC24B4BC24B4BC24C4CC25D5DC87C + 7CD38585D66E6ECE5454C54B4BC24B4BC24B4BC24B4BC20200000200004B4BC2 + 4B4BC25151C45656C65151C44B4BC24B4BC24B4BC24F4FC36E6ECE5D5DC84C4C + C25757C69595DBBABAE7D5D5F1CFCFEECFCFEEC5C5EBA9A9E1A2A2DE9292D97A + 7AD05C5CC66060C75353C44C4CC14B4BC24B4BC26060C97878D16161C94B4BC2 + 4B4BC25F5FC9ABABE2ACACE3C3C3EACFCFEED4D4F0D5D5F0A2A2DE8686D45656 + C35A5AC66868CA5555C44B4BC14B4BC24B4BC24B4BC24B4BC24B4BC27B7BD26F + 6FCE4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC26363CA7B7BD26363CA4B4BC2 + 4B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4B + C24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B + 4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC24B4BC2 + 4B4BC24B4BC24B4BC25858C78787D6AFAFE4A6A6E17575D05050C44B4BC24B4B + C24B4BC24B4BC25858C67575D08585D67777D15B5BC74B4BC24B4BC24B4BC202 + 00000200004A4AC24A4AC25050C45656C65050C44A4AC24A4AC24A4AC24E4EC3 + 6D6DCE5C5CC84B4BC24A4AC24E4EC36C6CCD6161CA4C4CC34A4AC25353C55E5E + C95151C44A4AC24A4AC25050C46060C95353C54B4BC24A4AC24A4AC26060C978 + 78D26161CA4A4AC24A4AC25353C58181D56464CB4B4BC24A4AC25D5DC86363CA + 5050C44A4AC24A4AC25A5AC86969CC5454C54A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24F4FC47676D1A2A2E0B1B1E5 + 8383D55A5AC84B4BC24A4AC24A4AC24A4AC25050C46B6BCD8282D58080D46161 + CA4E4EC34A4AC20200000200004A4AC24A4AC25050C45656C65050C44A4AC24A + 4AC24A4AC24E4EC36D6DCE5C5CC84B4BC24A4AC24E4EC36D6DCE6262CA4C4CC3 + 4A4AC25353C55F5FC95151C44A4AC24A4AC25050C46161CA5353C54B4BC24A4A + C24A4AC26060C97878D26161CA4A4AC24A4AC25353C58282D56464CB4B4BC24A + 4AC25D5DC86464CB5050C44A4AC24A4AC25A5AC86969CD5454C54A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24B + 4BC26060C99191DAB2B2E59696DC6363CA4A4AC24A4AC24A4AC24A4AC24C4CC3 + 5F5FC97A7AD28484D66B6BCD5252C50200000200004A4AC24A4AC25050C45656 + C65050C44A4AC24A4AC24A4AC24E4EC36E6ECE5C5CC84B4BC24A4AC24E4EC36D + 6DCE6262CA4C4CC34A4AC25353C55F5FC95151C44A4AC24A4AC25050C46161CA + 5353C54B4BC24A4AC24A4AC26060C97979D26161CA4A4AC24A4AC25454C58383 + D56464CB4B4BC24A4AC25D5DC86464CB5050C44A4AC24A4AC25A5AC86969CD54 + 54C54A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24B4BC26060C9ABABE3B3B3E58080D44A4AC24A4AC24A + 4AC24A4AC24A4AC24B4BC26262CA8686D68282D55E5EC90200000200004A4AC2 + 4A4AC25050C45656C65050C44A4AC24A4AC24A4AC24E4EC36E6ECE5C5CC84B4B + C24A4AC24E4EC36D6DCE6262CA4C4CC34A4AC25353C55F5FC95151C44A4AC24A + 4AC25050C46161CA5353C54B4BC24A4AC24A4AC26161CA7A7AD26161CA4A4AC2 + 4A4AC25454C58383D56464CB4B4BC24A4AC25D5DC86464CB5151C44A4AC24A4A + C25A5AC86969CD5454C54A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24D4DC36262CA9E9EDEAEAEE49999DD5959 + C74A4AC24A4AC24A4AC24A4AC24C4CC36262CA8080D48181D56C6CCD4B4BC202 + 00000200004A4AC24A4AC25050C45757C65050C44A4AC24A4AC24A4AC24E4EC3 + 6F6FCE5C5CC84B4BC24A4AC24F4FC46D6DCE6363CA4C4CC34A4AC25353C55F5F + C95151C44A4AC24A4AC25050C46161CA5353C54B4BC24A4AC24A4AC26161CA7A + 7AD26161CA4A4AC24A4AC25454C58383D56464CB4B4BC24A4AC25E5EC96464CB + 5151C44A4AC24A4AC25B5BC86A6ACD5454C54A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC2 + 4A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4A + C24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A + 4AC24A4AC24A4AC24A4AC24A4AC24A4AC24A4AC25050C47070CFAEAEE4B0B0E4 + 8383D55050C44A4AC24A4AC24A4AC24A4AC24F4FC46B6BCD8686D67F7FD46060 + C94A4AC24A4AC20200000200004A4AC14A4AC15050C35757C55050C34A4AC14A + 4AC14A4AC14E4EC27070CE5D5DC84B4BC14A4AC14F4FC36D6DCD6363CA4C4CC2 + 4A4AC15353C45F5FC85151C34A4AC14A4AC15050C36161C95353C44B4BC14A4A + C14A4AC16161C97A7AD26161C94A4AC14A4AC15454C48484D56565CA4B4BC14A + 4AC15E5EC86464CA5151C34A4AC14A4AC15B5BC76A6ACC5454C44A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4A + C14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A + 4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4A + C14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC15656C58A8AD7B2 + B2E4A6A6E16969CB4B4BC14A4AC14A4AC14A4AC14A4AC15757C57777D08585D5 + 7575D05353C44A4AC14A4AC14A4AC10200000200004A4AC14A4AC15050C35757 + C55050C34A4AC14A4AC14A4AC14E4EC27070CE5E5EC84B4BC14A4AC14F4FC36F + 6FCE6464CA4C4CC24A4AC15353C45F5FC85252C44A4AC14A4AC15050C36262C9 + 5353C44B4BC14A4AC14A4AC16161C97B7BD26262C94A4AC14A4AC15454C48585 + D56565CA4B4BC14A4AC15E5EC86565CA5151C34A4AC14A4AC15B5BC76B6BCC54 + 54C44A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4A + C14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A + 4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC1 + 4A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC14A4AC16464 + CAA1A1DFB2B2E49797DB5656C54B4BC14A4AC14A4AC14A4AC14A4AC16161C980 + 80D38585D56B6BCC4B4BC14A4AC14A4AC14A4AC14A4AC10200000200004949C1 + 4949C14F4FC35757C64F4FC34949C14949C14949C14D4DC27070CE5D5DC84A4A + C14949C14E4EC36E6ECE6363CA4B4BC24949C15252C45F5FC95151C44949C14A + 4AC14F4FC36161C95252C44A4AC14949C14949C16060C97B7BD26161C94949C1 + 4949C15353C48484D56464CA4A4AC14949C15D5DC86464CA5050C34949C14949 + C15A5AC76A6ACC5454C54949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C17272CFADADE3ACACE37E7ED34C4CC24949C14949C14949C14949C14A4A + C16C6CCD8484D57D7DD35E5EC84949C14949C14949C14949C14949C14949C102 + 00000200004949C14949C15050C35757C65050C34949C14949C14949C14D4DC2 + 7070CE5D5DC84A4AC14949C14E4EC36F6FCE6363CA4B4BC24949C15252C45F5F + C95151C44949C14A4AC14F4FC36161C95252C44A4AC14949C14949C16161C97B + 7BD26161C94949C14949C15353C48585D56565CA4A4AC14949C15E5EC86464CA + 5050C34949C14949C15A5AC76A6ACC5454C54949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C15757C68B8BD7B0B0E4A0A0DF6868CC4C4CC24949C14949C14949C1 + 4949C15656C57777D18484D57272CF5656C54A4AC14949C14949C14949C14949 + C14949C14949C10200000200004949C14949C15050C35757C65050C34949C149 + 49C14949C14D4DC27070CE5D5DC84A4AC14949C14E4EC36F6FCE6363CA4B4BC2 + 4949C15252C45F5FC95151C44949C14A4AC14F4FC36262CA5252C44A4AC14949 + C14949C16161C97C7CD26161C94949C14949C15353C48686D66565CA4A4AC149 + 49C15E5EC86565CA5050C34949C14949C15A5AC76B6BCC5454C54949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C16565CA9999DCB0B0E49696DB5C5CC74A4AC14949C149 + 49C14949C14949C16262CA7C7CD28484D56A6ACC5050C34949C14949C14949C1 + 4949C14949C14949C14949C14949C10200000200004949C14949C15050C35757 + C65050C34949C14949C14949C14D4DC27171CF5E5EC84A4AC14949C14E4EC370 + 70CE6363CA4B4BC24949C15353C46060C95151C44949C14A4AC15050C36262CA + 5252C44A4AC14949C14949C16161C97C7CD26262CA4949C14949C15353C48686 + D66666CB4A4AC14949C15E5EC86565CA5050C34949C14949C15B5BC76B6BCC54 + 54C54949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C17676D0A9A9E2ADADE37F7FD35252C44949 + C14949C14949C14949C14D4DC26C6CCD8484D57D7DD35F5FC94C4CC24949C149 + 49C14949C14949C14949C14949C14949C14949C14949C10200000200004949C1 + 4949C15050C35757C65050C34949C14949C14949C14D4DC27171CF5E5EC84A4A + C14949C14E4EC37070CE6363CA4B4BC24949C15353C46060C95151C44949C14A + 4AC15050C36262CA5252C44A4AC14949C14949C16161C97C7CD26262CA4949C1 + 4949C15353C48686D66666CB4A4AC14949C15E5EC86565CA5050C34949C14949 + C15B5BC76B6BCC5454C54949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C15959C78787D6AEAEE49E9EDE6E6ECE + 4E4EC34949C14949C14949C14A4AC15959C77575D08484D57171CF5858C64A4A + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C102 + 00000200004949C14949C15050C35757C65050C34949C14949C14949C14D4DC2 + 7272CF5E5EC84A4AC14949C14E4EC37171CF6262CA4A4AC14949C15353C46060 + C95151C44949C14A4AC15050C36363CA5151C44A4AC14949C14949C16161C97C + 7CD26262CA4949C14949C15454C58686D66363CA4A4AC14949C15E5EC86565CA + 5050C34949C14949C15B5BC76B6BCC5353C44949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C149 + 49C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C14949C14949C14949C14949C14A4AC16666CB9595DBAFAFE492 + 92DA6161C94A4AC14949C14949C14949C14D4DC26262CA7C7CD28383D56969CC + 5050C34949C14949C14949C14949C14949C14949C14949C14949C14949C14949 + C14949C14949C10200000200005454C55454C55C5CC86262CA5F5FC95959C65B + 5BC75B5BC75F5FC87777D16464CA5050C34F4FC35555C57676D07171CE6060C8 + 5D5DC86565CB6E6ECE6262C95959C75A5AC76060C87272CF6868CC6363CA6363 + CA6060C97474D08686D66B6BCD5252C45353C45D5DC78E8ED87979D16767CB66 + 66CB7575D07979D16565CB5F5FC95F5FC96F6FCE7F7FD37070CF6969CC6B6BCD + 6B6BCD6C6CCD6C6CCD6C6CCD6C6CCD6D6DCD6D6DCD6D6DCD6E6ECD6F6FCE6F6F + CE6F6FCE6F6FCE7070CE7070CE7070CE7070CE7171CF7171CF7171CF7272CF72 + 72CF7373CF7373CF7373CF7373CF7474CF7171CE6363CA5A5AC75959C75959C7 + 5959C75959C75959C75A5AC75A5AC75656C54D4DC24949C14E4EC37575D0A8A8 + E1AAAAE28383D55252C44949C14949C14949C14949C15050C36C6CCD8383D57B + 7BD26161C94949C14949C14949C14949C14949C14949C14949C14949C14949C1 + 4949C14949C14949C14949C14949C10200000200006767CB6767CB6D6DCE7474 + D07878D17777D17878D17979D27A7AD27C7CD36969CC5B5BC75B5BC75E5EC979 + 79D28383D58282D58282D58585D68282D57979D27676D17777D17B7BD28989D7 + 8A8AD78B8BD88C8CD88C8CD89191DA8C8CD97373CF6363CA6363CA6B6BCD9898 + DC9696DB9595DB9595DB9999DC9494DB8888D78484D58585D69090D99F9FDE9D + 9DDE9D9DDE9E9EDE9F9FDEA0A0DEA0A0DFA1A1DFA2A2E0A3A3E0A4A4E0A4A4E0 + A6A6E1A7A7E1A7A7E1A7A7E1A8A8E2A9A9E2AAAAE2ABABE2ABABE3ACACE3ADAD + E3AEAEE4AEAEE4AFAFE4AFAFE4B0B0E4B0B0E4B2B2E5B2B2E5B3B3E59292DA75 + 75D07575D07575D07575D07676D17676D17676D17A7AD27272CF5757C65B5BC7 + 8484D5AEAEE49C9CDD6D6DCE4C4CC24848C14848C14848C14949C15757C67373 + D08282D57171CF5555C54848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C10200000200005B5BC8 + 5C5CC85D5DC86262CA6666CB6767CB6767CB6868CB6969CC6565CB5858C75454 + C55353C55454C56363CA6C6CCD6E6ECE6E6ECE6E6ECE6C6CCD6666CB6565CB65 + 65CB6767CC7171CF7272D07474D07474D07575D07878D16D6DCE5D5DC85959C7 + 5959C75D5DC87575D07A7AD27B7BD27C7CD27C7CD27474D06F6FCE6F6FCE6F6F + CE7474D07E7ED38181D48181D48181D48383D58383D58383D58484D68484D685 + 85D68585D68686D68787D68787D68888D78989D78989D78989D78989D78B8BD8 + 8B8BD88B8BD88C8CD88C8CD88E8ED98E8ED98E8ED98E8ED98E8ED98E8ED99595 + DBB3B3E58D8DD86666CB6565CB6565CB6565CB6565CB6565CB6363CA7171CF7C + 7CD37474D09595DBAEAEE49191DA5A5AC74949C14848C14848C14848C14B4BC2 + 5F5FC97A7AD28181D46868CC4C4CC24848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C102 + 00000200004848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C15656C6A6A6E17777D14A4AC24848C14848C14848C14848C14848 + C14848C16464CB9B9BDEB0B0E4A9A9E27F7FD44949C14848C14848C14848C148 + 48C14D4DC36A6ACC8181D47C7CD35E5EC84848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C10200000200004848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C15656C6A7A7E17878D14A4AC24848C14848C1 + 4848C14848C14848C15252C49191DAC4C4EBA9A9E26B6BCD4848C14848C14848 + C14848C14949C15151C47373D08181D47272CF5555C54848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C10200000200004848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C1 + 4848C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848 + C14848C14848C14848C14848C14848C14848C14848C15656C6A7A7E17878D14A + 4AC24848C14848C14848C14848C16060C99898DCB7B7E7AFAFE46868CB4848C1 + 4848C14848C14848C14848C15D5DC87C7CD38181D46767CB4C4CC24848C14848 + C14848C14848C14848C14848C14848C14848C14848C14848C14848C14848C148 + 48C14848C14848C14848C14848C14848C14848C14848C10200000200004848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C05656 + C5A7A7E17878D14A4AC14848C04848C04848C07272CFA5A5E0ACACE38D8DD87E + 7ED25B5BC64848C04848C04848C04B4BC16B6BCC7F7FD37E7ED35C5CC74848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C002 + 00000200004848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C05656C5A7A7E17878D14A4AC14848C04B4BC18585D5ABABE29E9E + DE6868CB5F5FC87D7DD25B5BC64848C04949C05050C37474CF8181D47373CF53 + 53C44848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C00200000200004848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848 + C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C05656C5A8A8E17878D14949C05F5FC89797DB + ACACE28C8CD75B5BC64848C06060C87E7ED35A5AC64848C05F5FC87C7CD28181 + D46565CA4F4FC24848C04848C04848C04848C04848C04848C04848C04848C048 + 48C04848C04848C04848C04848C04848C04848C04848C04848C04848C04848C0 + 4848C04848C04848C04848C04848C00200000200004747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C05555C5A8A8E17878D178 + 78D19F9FDEABABE27878D15151C34747C04747C05F5FC87C7CD26060C86868CB + 7F7FD37C7CD25959C64B4BC14747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C00200000200004747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C05555 + C5A8A8E19E9EDEAAAAE29D9DDD6A6ACC4B4BC14747C04747C04747C05D5DC87F + 7FD37A7AD17F7FD36F6FCE5353C44747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C002 + 00000200004747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C05454C4A9A9E2A9A9E28888D65F5FC84949C14747C04747C04747 + C04747C05D5DC87F7FD37B7BD26464CA4E4EC24747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C00200000200004747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C05050C38F8FD97A7AD15252C44848C04747C0 + 4747C04747C04747C04747C05858C67070CE5D5DC84848C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C00200000200004747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04848C05555C54747C047 + 47C04747C04747C04747C04747C04747C04747C04B4BC14D4DC24747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C00200000200004747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C002 + 00000200004747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C00200000200004747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747 + C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C047 + 47C04747C04747C04747C04747C04747C04747C04747C04747C04747C04747C0 + 4747C04747C04747C04747C04747C00200000200004646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C00200000200004646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C046 + 46C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C0 + 4646C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646 + C04646C04646C04646C04646C04646C04646C04646C04646C04646C04646C002 + 00000200004545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD45 + 45BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD45 + 45BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD45 + 45BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD + 4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545BD4545 + BD4545BD4545BD0200000200004242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242 + B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242 + B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242 + B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B842 + 42B84242B84242B84242B84242B84242B84242B84242B84242B84242B84242B8 + 4242B84242B84242B84242B84242B80200000200003F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB1 + 3F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB1 + 3F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB1 + 3F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3F + B13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F + 3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB13F3FB10200000200003A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A + 3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A + 3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A + 3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA6 + 3A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3A + A63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA63A3AA602 + 0000020000333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 9933339933339933339933339933339933339933339933339933339933339933 + 3399333399333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 9933339933339933339933339933339933339933339933339933339933339933 + 3399333399333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 9933339933339933339933339933339933339933339933339933339933339933 + 3399333399333399333399333399333399333399333399333399333399333399 + 3333993333993333993333993333993333993333993333993333993333993333 + 993333993333990200000200002C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C + 8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C + 8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C + 8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C + 2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A + 2C2C8A2C2C8A2C2C8A2C2C8A2C2C8A0200000200002323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378232378232378232378 + 2323782323782323782323782323782323782323782323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378232378232378232378 + 2323782323782323782323782323782323782323782323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378232378232378232378 + 2323782323782323782323782323782323782323782323782323782323782323 + 7823237823237823237823237823237823237823237823237823237823237823 + 2378232378232378232378232378232378232378232378020000020000191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196419 + 1964191964191964191964191964191964191964191964191964191964191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196419 + 1964191964191964191964191964191964191964191964191964191964191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196419 + 1964191964191964191964191964191964191964191964191964191964191964 + 1919641919641919641919641919641919641919641919641919641919641919 + 6419196419196419196419196419196419196419196419196419196419196402 + 00000200000E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E + 0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E + 0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E + 0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C + 0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E4C0E0E + 4C0E0E4C0E0E4C02000002000008083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F02000002000008083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F02000002000008083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08 + 083F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F + 08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F0808 + 3F08083F08083F08083F08083F08083F08083F08083F08083F08083F08083F02 + 00000200005E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E + 5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E + 5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E + 5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB0 + 5E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5EB05E5E + B05E5EB05E5EB00200000200005757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757 + AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757 + AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757 + AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC57 + 57AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC5757AC + 5757AC5757AC5757AC5757AC5757AC0200000200004A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA6 + 4A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA6 + 4A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA6 + 4A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4A + A64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A + 4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA64A4AA60200000200003B3B9F + 3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B + 9E3A3A9C39399A38389838389738389738389738389839399B3A3A9D3B3B9E3B + 3B9F3B3B9F3B3B9F3B3B9F3B3B9F3B3B9E3A3A9C39399A383898383898383898 + 39399A3A3A9D3B3B9E3B3B9F3B3B9E3B3B9E3A3A9C39399B39399A39399A3939 + 9A39399A39399B3A3A9C3B3B9E3B3B9E3B3B9F3B3B9F3B3B9F3B3B9F3B3B9E3A + 3A9D39399A38389838389738389839399A39399B3A3A9D3B3B9E3B3B9F3B3B9F + 3B3B9F3B3B9F3B3B9E3A3A9D39399B39399A39399A39399A39399A39399A3939 + 9A39399A39399A39399A39399A39399A39399A39399A39399B3A3A9C3A3A9D3B + 3B9E3A3A9D39399A38389838389838389939399A39399B39399B39399A39399A + 39399A3A3A9C3B3B9E3B3B9E3B3B9E3A3A9D3A3A9D3A3A9D3A3A9D3A3A9C3939 + 9A38389838389838389939399B3A3A9D3B3B9E3B3B9F3B3B9F3B3B9F3B3B9F02 + 00000200002C2C972C2C972C2C972C2C972C2C972C2C972C2C972C2C972C2C96 + 2B2B952A2A9229298D2727872525832525812424802525812525822525832626 + 8628288B2A2A902B2B952C2C962C2C972B2B952A2A9229298D27278725258225 + 258125258125258226268427278829298D2A2A922B2B942A2A9229298D272787 + 25258325258225258225258327278729298D2A2A922C2C962C2C972C2C972C2C + 962B2B9429298F27278926268425258124248025258126268427278729298D2A + 2A922B2B952C2C972C2C972C2C962B2B942A2A9028288A262686252583252582 + 2525812525822525832626842626852626852626842525822525822525822626 + 8528288A29298F29298F28288A26268424248024248025258226268526268626 + 268525258225258125258327278829298F2A2A922A2A9229298E28288A28288A + 28288927278726268425258124247F25258126268528288B2A2A912B2B952C2C + 972C2C972C2C970200000200001F1F911F1F911F1F911F1F911F1F911F1F911F + 1F911F1F901E1E8D1D1D871B1B7E18187416166C15156815156916166B16166D + 17176E17176F1717711818751A1A7D1C1C861E1E8C1E1E8D1D1D881B1B7F1818 + 7416166C15156815156916166A16166A16166A16166E1818751B1B801D1D871D + 1D871B1B7E1818731515691414631414631515691818731B1B7F1D1D891F1F8F + 1F1F911F1F901E1E8D1C1C8519197A17176E15156715156615156916166C1717 + 701818731919791B1B811D1D891F1F8F1F1F911F1F901E1E8D1C1C861A1A7C18 + 187216166A14146514146214146315156817176F18187318187417177116166C + 15156814146516166A1818741A1A7D1A1A7B1717711515661313611414631616 + 6A17176F17176F16166A1414641414621515681818731B1B801D1D871C1C841A + 1A7B18187317177017177017177016166E16166A151566141463151568181872 + 1B1B7F1D1D8A1F1F8F1F1F911F1F9102000002000016168C16168C16168C1616 + 8C16168C16168C16168C1515881414801212730F0F630D0D570C0C520C0C550E + 0E5D0F0F6610106B10106B1010690F0F640F0F6310106812127313137D141480 + 1212760F0F660D0D570C0C510C0C560E0E5E0F0F630E0E5F0C0C560C0C530D0D + 580F0F6712127613137D1212760F0F670C0C540A0A490A0A490C0C540F0F6712 + 127815158516168A16168C1515891414811111710E0E5F0C0C520B0B4E0C0C55 + 0E0E5E0F0F650F0F660F0F6610106911117113137D15158716168C16168C1515 + 881414811212761010680D0D580B0B4C0909450A0A490C0C530F0F6210106B11 + 116E1010690E0E620D0D580B0B500C0C540E0E6010106D1010690D0D5A0A0A4B + 0A0A470B0B4E0D0D5A0E0E5E0D0D5A0B0B500A0A480A0A490C0C530F0F641212 + 7413137E13137910106A0D0D5A0C0C530C0C560D0D5C0E0E610E0E600D0D580B + 0B4E0B0B4D0D0D5710106913137A15158616168C16168C0200000200000F0F89 + 0F0F890F0F890F0F890F0F890F0F890F0F860E0E7E0C0C6E09095B4545778383 + A1A3A3BAC2C2D5C2C2D9C3C3DCA5A5CC7777B22A2A840B0B6A0A0A610A0A5E0B + 0B660C0C710C0C710A0A635555868383A1C1C1D1C2C2D4A4A4C58585B5383881 + 0808510606440606430808516767A08686BB8686BA8585B28383A582829D8282 + 9D64648F0B0B650D0D780E0E850F0F880F0F890E0E820C0C7438387C8383A4A2 + A2B7C1C1D0C2C2D49494B867679F0A0A640A0A5F0A0A5D0A0A640C0C720E0E80 + 0F0F882D2D988787C38787C18686BC8585B58484AA8383A182829B82829D8383 + A58585B18686B88686BB8686B98585B58585AF65659308085009095B39398485 + 85B2A3A3BFC1C1D19393AB8383A336367328286C8484A8C1C1D082829C54547A + 08084D0A0A640C0C754A4A9E7777B119196907074A54547D8383A4A3A3C1C3C3 + D9A4A4C77575A426266006063F0606420808540B0B6B0E0E7D0F0F870F0F8902 + 00000200000C0C870C0C870C0C870C0C870C0C870C0C870B0B800A0A7265659A + E1E1E9FFFFFFFFFFFFF0F0F4A3A3C38585B88585BEA4A4D0F1F1F8FFFFFF7676 + B209096B08086409096709096B565697F0F0F5FFFFFFFFFFFFE1E1E87474A0C2 + C2DBFFFFFFFFFFFFE1E1EA53537B0404380505436464989494C2FFFFFFFFFFFF + FFFFFFFFFFFF9292A864648E0909650A0A770B0B800B0B800B0B800B0B7AA3A3 + C7FFFFFFFFFFFFFFFFFFC1C1D08383A8B2B2CDF0F0F6E1E1EC55558C07075408 + 085C09096D0B0B7C0C0C852A2A968686C39595CAF1F1F7FFFFFFFFFFFFFFFFFF + FFFFFF9292A88383A59494BCC3C3DEF1F1F8FFFFFFFFFFFFFFFFFFC2C2D70808 + 5B555593FFFFFFFFFFFFFFFFFFFFFFFFA2A2B8B2B2C6FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFE0E0E7B2B2C81818710B0B798585BFFFFFFFD1D1E1C1C1D0FFFFFF + E1E1E8A3A3C2FFFFFFFFFFFFFFFFFFF0F0F433335F04043705054608085E0A0A + 760C0C830C0C870200000200000B0B870B0B870B0B870B0B870B0B870B0B8619 + 1984B2B2D1FFFFFFFFFFFFFFFFFFD1D1DB1616580808680A0A7B0B0B860B0B87 + 1A1A8FD2D2E9FFFFFFC2C2DE18187E0909756666A8FFFFFFFFFFFFFFFFFFB1B1 + C0040441070758090971E1E1EFFFFFFFFFFFFFFFFFFF52527504044107075809 + 0972FFFFFFFFFFFFFFFFFFFFFFFF04043705054807076109096F090973090972 + 090973A3A3CAFFFFFFFFFFFFFFFFFF81819A04044006065307075E171769B2B2 + CAFFFFFF44447706065508086A0A0A7B0B0B850B0B870B0B870B0B879595C9FF + FFFFFFFFFFFFFFFFFFFFFF04043806064C0808690A0A7D1A1A8F6767B4FFFFFF + FFFFFFC2C2DD0909707575B0FFFFFFFFFFFFFFFFFFE1E1EA05054805054B7373 + 9FFFFFFFFFFFFFFFFFFFC1C1CD14144944447E09096E0A0A7F8585C1FFFFFFFF + FFFFFFFFFFA1A1B505054307075C282884FFFFFFFFFFFFFFFFFFF0F0F323234E + 05054307075C0909740B0B820B0B870200000200000B0B870B0B870B0B870B0B + 870B0B870B0B859494C5FFFFFFFFFFFFFFFFFFFFFFFF43436D06065109096D0A + 0A7F0B0B870B0B870B0B871A1A8FD2D2E9FFFFFF8585BF0A0A7DF1F1F7FFFFFF + FFFFFFFFFFFF82829D0404400606520808668484B7FFFFFFFFFFFFFFFFFFC1C1 + CF05054807075E090972FFFFFFFFFFFFFFFFFFFFFFFF03033505054306065507 + 075D07075B07075836367DFFFFFFFFFFFFFFFFFFFFFFFF62628444447144447F + 45458645458344447763638924245C07075709096E0A0A7E0B0B860B0B870B0B + 870B0B878585C1FFFFFFFFFFFFFFFFFFFFFFFF04043806064C0808690A0A7D0B + 0B870B0B878585C3FFFFFFC2C2E00A0A7F191988C2C2E0FFFFFFFFFFFFFFFFFF + B2B2C744447A454581FFFFFFFFFFFFFFFFFFC1C1CE0505410707580909720A0A + 818585C1FFFFFFFFFFFFFFFFFF53537604043F060654080866D1D1E4FFFFFFFF + FFFFFFFFFFA1A1B605054A0808630A0A780B0B840B0B870200000200000B0B87 + 0B0B870B0B870B0B870B0B872A2A93FFFFFFFFFFFFFFFFFFFFFFFFD1D1D90404 + 3C06065209096D0A0A800B0B870B0B870B0B870B0B870B0B840A0A7E0A0A790A + 0A79FFFFFFFFFFFFFFFFFFFFFFFF63638D05054606064F07075D8484B1FFFFFF + FFFFFFFFFFFFC1C1D207075908086B090977FFFFFFFFFFFFFFFFFFFFFFFF0404 + 3C05054506064F06065106064D06064C444480FFFFFFFFFFFFFFFFFFFFFFFFC1 + C1D2C1C1D2C1C1D5FFFFFFFFFFFFFFFFFFFFFFFF73739B0808610909750B0B82 + 0B0B870B0B870B0B870B0B878585C1FFFFFFFFFFFFFFFFFFFFFFFF0404380606 + 4C0808690A0A7D0B0B870B0B870B0B874848A539399E0B0B860B0B860B0B8438 + 38959393BFC2C2D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1C1D006064D + 0808620A0A770B0B838585C1FFFFFFFFFFFFFFFFFF43436804043B06064C0707 + 5AC2C2D7FFFFFFFFFFFFFFFFFFC1C1D207075A09096F0A0A7E0B0B860B0B8702 + 00000200000B0B870B0B870B0B870B0B870B0B876767B3FFFFFFFFFFFFFFFFFF + FFFFFFC1C1CC04043A06064F08086B0A0A7D0B0B870B0B870B0B870B0B840A0A + 7C09096F080866080869C2C2DDFFFFFFFFFFFFFFFFFF9393B907075706065607 + 075AB2B2CDFFFFFFFFFFFFFFFFFFA3A3C409096E0A0A780A0A7AFFFFFFFFFFFF + FFFFFFFFFFFF35356F252569C2C2D5E1E1EAB2B2C9353572171766F0F0F6FFFF + FFFFFFFFFFFFFF17176707075907075CC2C2D7FFFFFFFFFFFFE1E1EB17176C09 + 09720A0A7E0B0B850B0B870B0B870B0B870B0B878585C1FFFFFFFFFFFFFFFFFF + FFFFFF04043806064C0808690A0A7D0B0B870B0B870B0B870B0B870B0B870B0B + 870B0B875858ACC2C2E0E1E1EE9393BC07075B07075B64649CFFFFFFFFFFFFFF + FFFFC1C1D50707600909700A0A7E0B0B858585C1FFFFFFFFFFFFFFFFFF72728E + 04043A050549060656F0F0F5FFFFFFFFFFFFFFFFFF64649A09096C0A0A7B0B0B + 840B0B870B0B870200000200000B0B870B0B870B0B870B0B870B0B877676BCFF + FFFFFFFFFFFFFFFFFFFFFFC1C1CE04043A0505480707610909740A0A800B0B83 + 0A0A810A0A7A09096D07075B06065307075A282881D2D2E7FFFFFFFFFFFFF1F1 + F76666A508086B6565A1FFFFFFFFFFFFFFFFFFD2D2E51818800A0A7E0B0B8229 + 2990FFFFFFFFFFFFFFFFFFFFFFFFD1D1E3B2B2D1FFFFFFFFFFFFFFFFFFA3A3C7 + 0909706666ABFFFFFFFFFFFFFFFFFF7575B009096E27277EFFFFFFFFFFFFFFFF + FF6666A50909760A0A7F0B0B840B0B870B0B870B0B870B0B870B0B858585BFFF + FFFFFFFFFFFFFFFFFFFFFF0404370505490808650A0A790B0B850B0B860B0B87 + 0B0B870B0B870B0B870B0B879595CBFFFFFFFFFFFFF1F1F709097009096D7575 + ADFFFFFFFFFFFFFFFFFF9494BF0909750A0A7E0B0B840B0B868585C0FFFFFFFF + FFFFFFFFFFE0E0E7727292545486C2C2D8FFFFFFFFFFFFFFFFFFB2B2D1090974 + 0A0A7C0B0B830B0B870B0B870B0B870200000200000B0B870B0B870B0B870B0B + 870B0B8739399EFFFFFFFFFFFFFFFFFFFFFFFFC1C1D104044005054606065608 + 08670909730A0A7709097509096DB2B2CDC1C1D405054906065409096C191986 + 8585C3E1E1F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2E66666AE0A0A800B0B + 830B0B86C3C3E1FFFFFFFFFFFFFFFFFFFFFFFFB3B3D7C2C2DFFFFFFFFFFFFFFF + FFFFF1F1F747479D0A0A7F0B0B832A2A95A4A4D2F1F1F8FFFFFFD2D2E7FFFFFF + FFFFFFE1E1EF8585BE0A0A7F0B0B820B0B850B0B870B0B870B0B870B0B870B0B + 850A0A818585BBFFFFFFFFFFFFFFFFFFFFFFFF04043A0505490707600909730A + 0A800B0B840B0B870B0B870B0B870B0B870B0B870B0B877676BCE1E1F0FFFFFF + C2C2E0D2D2E7FFFFFFFFFFFFFFFFFF8585BD0A0A7E0B0B820B0B850B0B860B0B + 858585BEFFFFFFFFFFFFFFFFFFD1D1DAF0F0F4FFFFFFFFFFFFFFFFFFFFFFFFA4 + A4CE1919860A0A810B0B850B0B870B0B870B0B870B0B870200000200000B0B87 + 0B0B870B0B870B0B870B0B870B0B87C3C3E1FFFFFFFFFFFFFFFFFFFFFFFF1616 + 5C06064E06065307075D08086708086B08086B8484B2FFFFFFFFFFFF06065107 + 075D0909710A0A800B0B870B0B871A1A8F4848A54848A54848A40B0B850B0B86 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B8739399E2A2A960B0B + 870B0B8739399E39399E0B0B870B0B870B0B870B0B870B0B870B0B870B0B8739 + 399E4848A54848A42A2A940B0B850B0B860B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B830A0A7D8484B8FFFFFFFFFFFFFFFFFFFFFFFF0505460606 + 4F07075E09096D0A0A7A0B0B820B0B860B0B870B0B870B0B870B0B870B0B870B + 0B870B0B871A1A8F4848A54848A54848A439399C0B0B850B0B860B0B870B0B87 + 0B0B870B0B860B0B828585BCFFFFFFFFFFFFFFFFFF8282A106064C0707604747 + 982A2A920B0B860B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B8702 + 00000200000B0B870B0B870B0B870B0B870B0B870B0B871A1A8FD2D2E9FFFFFF + FFFFFFFFFFFFA3A3C70808620707600808620808660808697474ABFFFFFFFFFF + FFFFFFFF08086609096D0A0A7A0B0B830B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B830A0A7D9494C2FFFFFFFFFFFFFFFFFF + FFFFFF07075D0707600808680909710A0A7A0B0B820B0B860B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B860A0A818585BCFFFFFFFFFFFFFFFFFF8383AB + 07075C08086B0A0A7A0B0B840B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870200000200000B0B870B0B870B0B870B0B870B0B870B0B870B + 0B871A1A8F9595CBFFFFFFFFFFFFFFFFFFE1E1EE7575B14747956666A8C2C2DD + FFFFFFFFFFFFFFFFFFF1F1F70A0A790A0A7D0A0A810B0B850B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B872A2A968585C2A4A4D0F1F1F7FF + FFFFFFFFFFFFFFFFFFFFFFC2C2DC8484BA4747990A0A7A0A0A800B0B840B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B872A2A964848A2C2C2DFFFFFFFFF + FFFFFFFFFF8484B70909720A0A790A0A810B0B860B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870200000200000B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B871A1A8F6767B49595CAC3C3E1C3C3E0C2 + C2E0C2C2E08585C05757A90B0B827676BA6767B30B0B850B0B850B0B860B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B872A2A968585 + C38585C28585C28585C18585C18585C18585C18585C18585C14848A10B0B830B + 0B850B0B860B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B876767B4C3C3 + E1C3C3E1C2C2E0C2C2E0F1F1F88585C00A0A800B0B820B0B850B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870200000200000B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B8702 + 00000200000B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870200000200000B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870200000200000B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87 + 0B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B + 870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B870B + 0B870B0B870B0B870B0B870B0B870B0B870B0B870B0B87020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000020000020000020000020000020000020000020000020000020000020000 + 0200000200000200000200000200000200000200000200000200000200000200 + 0002000002000002000002000002000002000002000002000002000002000002 + 0000} + end + object Label1: TLabel + Left = 138 + Top = 6 + Width = 225 + Height = 23 + Caption = 'SQL Server Data Access' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -19 + Font.Name = 'Tahoma' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + end + object Label2: TLabel + Left = 146 + Top = 92 + Width = 38 + Height = 13 + Caption = 'Version ' + end + object lbVersion: TLabel + Left = 232 + Top = 92 + Width = 43 + Height = 13 + Caption = 'lbVersion' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + end + object lbIDE: TLabel + Left = 286 + Top = 92 + Width = 54 + Height = 13 + Caption = 'for Delphi 6' + end + object Label3: TLabel + Left = 146 + Top = 112 + Width = 156 + Height = 13 + Caption = 'Copyright '#169' 1997-2007 Core Lab' + end + object Label5: TLabel + Left = 146 + Top = 132 + Width = 26 + Height = 13 + Caption = 'Web:' + end + object Label6: TLabel + Left = 146 + Top = 153 + Width = 31 + Height = 13 + Caption = 'E-mail:' + end + object lbMail: TLabel + Left = 232 + Top = 153 + Width = 80 + Height = 13 + Cursor = crHandPoint + Caption = 'sdac@crlab.com' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentColor = False + ParentFont = False + OnClick = lbMailClick + OnMouseMove = lbMailMouseMove + end + object lbWeb: TLabel + Left = 232 + Top = 132 + Width = 101 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com/sdac' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbWebClick + OnMouseMove = lbWebMouseMove + end + object Label4: TLabel + Left = 139 + Top = 29 + Width = 120 + Height = 23 + Caption = 'Components' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -19 + Font.Name = 'Tahoma' + Font.Pitch = fpVariable + Font.Style = [fsBold] + ParentFont = False + end + object Label8: TLabel + Left = 146 + Top = 195 + Width = 50 + Height = 13 + Caption = 'DBMonitor' + end + object lblDBMonitorVer: TLabel + Left = 232 + Top = 195 + Width = 60 + Height = 13 + Caption = 'not available' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object lbForum: TLabel + Left = 232 + Top = 174 + Width = 109 + Height = 13 + Cursor = crHandPoint + Caption = 'www.crlab.com/forums' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = 13 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [fsUnderline] + ParentFont = False + OnClick = lbForumClick + OnMouseMove = lbForumMouseMove + end + object Label10: TLabel + Left = 146 + Top = 174 + Width = 32 + Height = 13 + Caption = 'Forum:' + end + object lbEdition: TLabel + Left = 159 + Top = 55 + Width = 121 + Height = 18 + Caption = 'Standard Edition' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -15 + Font.Name = 'Verdana' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + end + object Bevel2: TBevel + Left = 130 + Top = 240 + Width = 260 + Height = 9 + Shape = bsTopLine + end + object OKBtn: TButton + Left = 308 + Top = 248 + Width = 75 + Height = 24 + Cancel = True + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/SdacAbout.pas b/internal/4.10.0.10/1/Source/Design/SdacAbout.pas new file mode 100644 index 0000000..9569ec4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/SdacAbout.pas @@ -0,0 +1,181 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SDAC About Window +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit SdacAbout; +{$ENDIF} +interface +uses + Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, HelpUtils; + +type + TSdacAboutForm = class(TForm) + OKBtn: TButton; + Image1: TImage; + Label1: TLabel; + Label2: TLabel; + lbVersion: TLabel; + lbIDE: TLabel; + Label3: TLabel; + Label5: TLabel; + Label6: TLabel; + lbMail: TLabel; + lbWeb: TLabel; + Label4: TLabel; + Bevel1: TBevel; + Label8: TLabel; + lblDBMonitorVer: TLabel; + lbForum: TLabel; + Label10: TLabel; + lbEdition: TLabel; + Bevel2: TBevel; + procedure FormShow(Sender: TObject); + procedure lbWebClick(Sender: TObject); + procedure lbMailClick(Sender: TObject); + procedure lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbMailMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure lbForumClick(Sender: TObject); + procedure lbForumMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + private + { Private declarations } + public + { Public declarations } + end; + +procedure ShowAbout; + +implementation + +uses + ShellApi, MSDesign, DBMonitorClient; + +{$I SdacVer.inc} + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R SdacAbout.dfm} +{$ENDIF} + +procedure ShowAbout; +begin + with TSdacAboutForm.Create(Application) do + try + ShowModal; + finally + Free; + end; +end; + +procedure TSdacAboutForm.FormShow(Sender: TObject); +var + IDE: string; +begin +{$IFDEF D3} + IDE := 'Delphi 3'; +{$ENDIF} +{$IFDEF D4} + IDE := 'Delphi 4'; +{$ENDIF} +{$IFDEF D5} + IDE := 'Delphi 5'; +{$ENDIF} +{$IFDEF D6} + IDE := 'Delphi 6'; +{$ENDIF} +{$IFDEF D7} + IDE := 'Delphi 7'; +{$ENDIF} +{$IFDEF D8} + IDE := 'Delphi 8'; +{$ENDIF} +{$IFDEF D9} + IDE := 'Delphi 2005'; +{$ENDIF} +{$IFDEF D10} + IDE := 'Delphi 2006'; +{$ENDIF} +{$IFDEF D11} + IDE := 'Delphi 2007'; +{$ENDIF} +{$IFDEF CB3} + IDE := 'C++Builder 3'; +{$ENDIF} +{$IFDEF CB4} + IDE := 'C++Builder 4'; +{$ENDIF} +{$IFDEF CB5} + IDE := 'C++Builder 5'; +{$ENDIF} +{$IFDEF CB6} + IDE := 'C++Builder 6'; +{$ENDIF} + lbVersion.Caption := SDACVersion + ' '; + lbIDE.Caption := ' for ' + IDE; + lbIDE.Left := lbVersion.Left + lbVersion.Width; + + + lblDBMonitorVer.Caption := GetDBMonitorVersion; +end; + +procedure TSdacAboutForm.lbWebClick(Sender: TObject); +begin + OpenUrl('http://www.crlab.com/sdac'); + lbWeb.Font.Color := $FF0000; +end; + +procedure TSdacAboutForm.lbMailClick(Sender: TObject); +begin + MailTo('sdac@crlab.com'); + lbMail.Font.Color := $FF0000; +end; + +procedure TSdacAboutForm.lbWebMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $4080FF; +end; + +procedure TSdacAboutForm.lbMailMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +begin + lbMail.Font.Color := $4080FF; +end; + +procedure TSdacAboutForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +begin + lbWeb.Font.Color := $FF0000; + lbMail.Font.Color := $FF0000; + lbForum.Font.Color := $FF0000; +end; + +procedure TSdacAboutForm.lbForumClick(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + OpenUrl('http://crlab.com/forums/viewforum.php?f=6'); + lbForum.Font.Color := $FF0000; +{$ENDIF} +end; + +procedure TSdacAboutForm.lbForumMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +begin + lbForum.Font.Color := $4080FF; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Design/VTDataEditor.dfm b/internal/4.10.0.10/1/Source/Design/VTDataEditor.dfm new file mode 100644 index 0000000..3092b43 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/VTDataEditor.dfm @@ -0,0 +1,81 @@ +inherited VTDataEditorForm: TVTDataEditorForm + Width = 671 + Caption = 'VTDataEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Width = 663 + inherited imCorner: TImage + Left = 651 + end + inherited btOk: TBitBtn + Left = 499 + end + inherited btCancel: TBitBtn + Left = 580 + end + end + inherited StatusBar: TStatusBar + Width = 663 + end + inherited pnlToolBar: TPanel + Width = 663 + inherited btClose: TSpeedButton + OnClick = CloseClick + end + object btSave: TSpeedButton [1] + Left = 0 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Save' + OnClick = SaveClick + end + object btClear: TSpeedButton [2] + Left = 162 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Clear' + OnClick = btClearClick + end + object btLoadFromFile: TSpeedButton [3] + Left = 237 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Load from file' + OnClick = btLoadFromFileClick + end + object btSaveToFile: TSpeedButton [4] + Left = 312 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Save to file' + OnClick = btSaveToFileClick + end + inherited DBNavigator: TDBNavigator + Left = 399 + Hints.Strings = () + end + end + inherited DBGrid: TDBGrid + Width = 663 + end + object OpenDialog: TOpenDialog + Filter = + 'Virtual Table Data (*.vtd)|*.vtd|XML (*.xml)|*.xml|Any File (*.*' + + ')|*.*' + Left = 352 + Top = 34 + end + object SaveDialog: TSaveDialog + FileName = 'Data1' + Filter = + 'Virtual Table Data (*.vtd)|*.vtd|XML (*.xml)|*.xml|Any File (*.*' + + ')|*.*' + Left = 384 + Top = 34 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/VTDataEditor.pas b/internal/4.10.0.10/1/Source/Design/VTDataEditor.pas new file mode 100644 index 0000000..b532714 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/VTDataEditor.pas @@ -0,0 +1,223 @@ +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Base Component Editor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit VTDataEditor; +{$ENDIF} + +interface +uses +{$IFDEF MSWINDOWS} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, DBGrids, Dialogs, + StdCtrls, ExtCtrls, Buttons, ComCtrls, Grids, DBCtrls, +{$ENDIF} +{$IFDEF LINUX} + SysUtils, Types, Classes, QGraphics, QControls, QForms, QDBGrids, QDialogs, QStdCtrls, + QExtCtrls, QButtons, QDBCtrls, QComCtrls, QGrids, +{$ENDIF} + DB, CRDataEditor, DADesignUtils, VirtualTable; + +type + TVTDataEditorForm = class(TCRDataEditorForm) + btSave: TSpeedButton; + btClear: TSpeedButton; + btLoadFromFile: TSpeedButton; + btSaveToFile: TSpeedButton; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + procedure btLoadFromFileClick(Sender: TObject); + procedure btSaveToFileClick(Sender: TObject); + procedure btClearClick(Sender: TObject); + procedure DataSourceDataChange(Sender: TObject; Field: TField); + private + LocalDataSet: TVirtualTable; + + procedure AfterPost(DataSet: TDataSet); + procedure AfterDelete(DataSet: TDataSet); + + function LoadDefaultExt: integer; + procedure SaveDefaultExt(Value: integer); + protected + procedure DoInit; override; + procedure DoSave; override; + procedure DoFinish; override; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$IFDEF MSWINDOWS} +{$R VTDataEditor.dfm} +{$ENDIF} +{$IFDEF LINUX} +{$R *.xfm} +{$ENDIF} + +uses +{$IFDEF CLR} + Variants, +{$ENDIF} +{$IFDEF MSWINDOWS} + Registry, +{$ENDIF} + TypInfo; + +{ TDADataEditorForm } + +procedure TVTDataEditorForm.DoInit; +var + Filtered: boolean; +begin + inherited; + + DataSource.DataSet := nil; + + LocalDataSet:= TVirtualTable.Create(Self); + Filtered := FDataSet.Filtered; + try + FDataSet.Filtered := False; + LocalDataSet.Assign(FDataSet); + finally + FDataSet.Filtered := Filtered; + end; + + LocalDataSet.Filter := FDataSet.Filter; + LocalDataSet.Filtered := Filtered; + Caption := FDataSet.Owner.Name + '.' + FDataSet.Name; + + DataSource.DataSet:= LocalDataSet; + LocalDataSet.Open; + LocalDataSet.AfterPost := AfterPost; + LocalDataSet.AfterDelete:= AfterDelete; + + Modified:= False; +end; + +procedure TVTDataEditorForm.DoSave; +var + OldFiltered: boolean; +begin + OldFiltered := LocalDataSet.Filtered; + try + LocalDataSet.Filtered := False; + FDataSet.Assign(LocalDataSet); + LocalDataSet.Close; + finally + LocalDataSet.Filtered := OldFiltered; + end; +end; + +procedure TVTDataEditorForm.DoFinish; +begin + LocalDataSet.Free; + inherited; +end; + +procedure TVTDataEditorForm.AfterDelete(DataSet: TDataSet); +begin + Modified := True; +end; + +procedure TVTDataEditorForm.AfterPost(DataSet: TDataSet); +begin + Modified := True; +end; + +function TVTDataEditorForm.LoadDefaultExt: integer; +{$IFDEF MSWINDOWS} +var + Registry: TRegistry; +{$ENDIF} +begin + Result := 1; +{$IFDEF MSWINDOWS} + Registry := TRegistry.Create; + try + with Registry do begin + OpenKey(KeyPath + '\' + FolderName, True); + if ValueExists('DefaultExt') then + Result := ReadInteger('DefaultExt'); + end; + finally + Registry.Free; + end; +{$ENDIF} +end; + +procedure TVTDataEditorForm.SaveDefaultExt(Value: integer); +{$IFDEF MSWINDOWS} +var + Registry: TRegistry; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + Registry := TRegistry.Create; + try + with Registry do begin + OpenKey(KeyPath + '\' + FolderName, True); + WriteInteger('DefaultExt', Value); + end; + finally + Registry.Free; + end; +{$ENDIF} +end; + +procedure TVTDataEditorForm.btLoadFromFileClick(Sender: TObject); +begin + OpenDialog.FilterIndex := LoadDefaultExt; + if OpenDialog.Execute then + LocalDataSet.LoadFromFile(OpenDialog.FileName); +end; + +procedure TVTDataEditorForm.btSaveToFileClick(Sender: TObject); +var + FileName: string; +begin + SaveDialog.FilterIndex := LoadDefaultExt; + if SaveDialog.Execute then begin + FileName := SaveDialog.FileName; + SaveDefaultExt(SaveDialog.FilterIndex); + if ExtractFileExt(FileName) = '' then + case SaveDialog.FilterIndex of + 1: FileName := FileName + '.vtd'; + 2: FileName := FileName + '.xml'; + end; + case SaveDialog.FilterIndex of + 1: LocalDataSet.SaveToFile(FileName); + 2: LocalDataSet.SaveToXML(FileName); + end; + end; +end; + +procedure TVTDataEditorForm.btClearClick(Sender: TObject); +begin + LocalDataSet.Clear; + Modified:= True; +end; + +procedure TVTDataEditorForm.DataSourceDataChange(Sender: TObject; + Field: TField); +begin + if LocalDataSet <> nil then begin // event first occurs before assigning value to LocalDataSet + StatusBar.Panels[0].Text := 'RecordCount: ' + IntToStr(LocalDataSet.RecordCount); + StatusBar.Panels[1].Text := 'RecordNo: ' + IntToStr(LocalDataSet.RecNo); + end; +end; + +{$IFDEF CLR} + +initialization + + RegisterClass(TDBGrid); +{$ENDIF} + +end. diff --git a/internal/4.10.0.10/1/Source/Design/VTDataEditor.xfm b/internal/4.10.0.10/1/Source/Design/VTDataEditor.xfm new file mode 100644 index 0000000..15dbd7e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/VTDataEditor.xfm @@ -0,0 +1,80 @@ +inherited VTDataEditorForm: TVTDataEditorForm + Width = 671 + Caption = 'VTDataEditorForm' + PixelsPerInch = 96 + TextHeight = 13 + inherited BtnPanel: TPanel + Width = 663 + inherited imCorner: TImage + Left = 651 + end + inherited btOk: TBitBtn + Left = 499 + end + inherited btCancel: TBitBtn + Left = 580 + end + end + inherited StatusBar: TStatusBar + Width = 663 + end + inherited pnlToolBar: TPanel + Width = 663 + inherited btClose: TSpeedButton + OnClick = CloseClick + end + object btSave: TSpeedButton [1] + Left = 0 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Save' + OnClick = SaveClick + end + object btClear: TSpeedButton [2] + Left = 162 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Clear' + OnClick = btClearClick + end + object btLoadFromFile: TSpeedButton [3] + Left = 237 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Load from file' + OnClick = btLoadFromFileClick + end + object btSaveToFile: TSpeedButton [4] + Left = 312 + Top = 0 + Width = 75 + Height = 23 + Caption = 'Save to file' + OnClick = btSaveToFileClick + end + inherited DBNavigator: TDBNavigator + Left = 399 + Hints.Strings = () + end + end + inherited DBGrid: TDBGrid + Width = 663 + end + object OpenDialog: TOpenDialog + DefaultExt = '' + FileName = '' + Filter = 'Virtual Table Data (*.vtd)|*.vtd|Any File (*.*)|*.*' + Left = 352 + Top = 34 + end + object SaveDialog: TSaveDialog + DefaultExt = '' + FileName = 'Data1' + Filter = 'Virtual Table Data (*.vtd)|*.vtd|Any File (*.*)|*.*' + Left = 384 + Top = 34 + end +end diff --git a/internal/4.10.0.10/1/Source/Design/VTDesign.pas b/internal/4.10.0.10/1/Source/Design/VTDesign.pas new file mode 100644 index 0000000..b899fab --- /dev/null +++ b/internal/4.10.0.10/1/Source/Design/VTDesign.pas @@ -0,0 +1,275 @@ + +////////////////////////////////////////////////// +// Copyright © 1998-2007 Core Lab. All right reserved. +// Virtual table design +// Created: 23.08.99 +////////////////////////////////////////////////// + +{$IFNDEF CLR} +{$I Dac.inc} + +unit VTDesign; +{$ENDIF} +interface +uses + Classes, Forms, +{$IFDEF CLR} + Borland.Vcl.Design.DesignIntf, Borland.Vcl.Design.DesignEditors, +{$ELSE} +{$IFDEF VER6P} + DesignIntf, DesignEditors, +{$ELSE} + DsgnIntf, +{$ENDIF} +{$ENDIF} + DADesign, DADesignUtils; + +type + TVTFieldsEditor = class(TDAFieldsEditor); + + TVirtualTableEditor = class (TDADataSetEditor) + private + Items: TStrings; + + procedure StrProc(const S: string); + procedure DataSetsDblClick(Sender: TObject); + + procedure ShowVTDataEditor; + procedure ShowAssignDataSet; + procedure LoadData; + procedure SaveData; + procedure ShowAbout; + protected + procedure InitVerbs; override; + public + procedure Edit; override; + end; + +procedure Register; + +implementation +uses +{$IFDEF CLR} + Borland.VCL.Design.DSDesign, +{$ELSE} +{$IFNDEF BCB} +{$IFNDEF LINUX} + DSDesign, +{$ENDIF} +{$ENDIF} +{$ENDIF} + Windows, DB, VirtualTable, Controls, Dialogs, Buttons, StdCtrls, + TypInfo, Graphics, VTDataEditor, SysUtils; + +//{$R DADesign.res} + +{$IFDEF LINUX} + {$DEFINE OLDDESIGNER} +{$ENDIF} +{$IFDEF BCB} + {$DEFINE OLDDESIGNER} +{$ENDIF} + +{$I DacVer.inc} + +{$IFDEF OLDDESIGNER} +var + DataSetEditorClass: TComponentEditorClass; +{$ENDIF} + + + +procedure TVirtualTableEditor.InitVerbs; +begin + AddVerb('Fields &Editor...', ShowFieldsEditor); + AddVerb('VirtualTable E&ditor...', ShowVTDataEditor); + AddVerb('Assign DataSet...', ShowAssignDataSet); + AddVerb('Load from file...', LoadData); + AddVerb('Save to file...', SaveData); + AddVerb('&About...', ShowAbout); + + inherited; +end; + +procedure TVirtualTableEditor.Edit; +begin + if GetVerbCount > 1 then + ExecuteVerb(1); +end; + +procedure TVirtualTableEditor.ShowVTDataEditor; +begin + {$IFDEF CLR}CoreLab.Dac.Design.{$ENDIF}DADesign.ShowEditor(TVTDataEditorForm, TDADesignUtils, Component, Designer); +end; + +procedure TVirtualTableEditor.LoadData; +var + OpenDialog: TOpenDialog; +begin + OpenDialog := TOpenDialog.Create(nil); + try + OpenDialog.DefaultExt := 'vtd'; + OpenDialog.Filter := + 'Virtual Table Data (*.vtd)|*.vtd|' + + 'XML File (*.xml)|*.xml|' + + 'Any File (*.*)|*.*'; + OpenDialog.FileName := '*.vtd'; + if OpenDialog.Execute then + TVirtualTable(Component).LoadFromFile(OpenDialog.FileName); + finally + OpenDialog.Free; + end; +end; + +procedure TVirtualTableEditor.SaveData; +var + SaveDialog: TSaveDialog; +begin + SaveDialog := TSaveDialog.Create(nil); + try + SaveDialog.DefaultExt := 'vtd'; + SaveDialog.Filter := + 'Virtual Table Data (*.vtd)|*.vtd|' + + 'XML File (*.xml)|*.xml|' + + 'Any File (*.*)|*.*'; + SaveDialog.FileName := 'Data1'; + if SaveDialog.Execute then + if LowerCase(ExtractFileExt(SaveDialog.FileName)) = '.xml' then + TVirtualTable(Component).SaveToXML(SaveDialog.FileName) + else + TVirtualTable(Component).SaveToFile(SaveDialog.FileName); + finally + SaveDialog.Free; + end; +end; + +procedure TVirtualTableEditor.ShowAbout; +begin + Application.MessageBox( + 'VirtualTable component'#13 + + 'Version ' + DacVersion + ' free'#13 + + 'Copyright © 1998-2007 Core Lab.'#13 + + 'All right reserved.'#13#13 + + + 'Web: www.crlab.com'#13 + + 'eMail: support@crlab.com'#13#13 + , 'About', MB_OK or MB_ICONINFORMATION); +end; + +procedure TVirtualTableEditor.DataSetsDblClick(Sender: TObject); +begin + TForm(TListBox(Sender).Owner).ModalResult := mrOk; +end; + +procedure TVirtualTableEditor.StrProc(const S: string); +begin + if S <> Component.Name then + Items.Add(S); +end; + +procedure TVirtualTableEditor.ShowAssignDataSet; +var + Form: TForm; + List: TListBox; + TypeData: TTypeData; +begin + Form := TForm.Create(nil); + try + Form.BorderStyle := bsDialog; + Form.Height := 250; + Form.Width := 300; + Form.Position := poScreenCenter; + Form.Caption := 'Available DataSets'; + + List := TListBox.Create(Form); + with List do begin + Parent := Form; + Left := 8; + Top := 8; + Width := Form.ClientWidth - 16; + Height := Form.ClientHeight - 53; + Sorted := True; + OnDblClick := DataSetsDblClick; + end; + Items := List.Items; + + with TButton.Create(Form) do begin + Parent := Form; + Left := 128; + Top := 192; + Caption := 'Ok'; + Font.Style := [fsBold]; + ModalResult := mrOk; + Default := True; + end; + + with TButton.Create(Form) do begin + Parent := Form; + Left := 208; + Top := 192; + Caption := 'Cancel'; + Font.Style := [fsBold]; + ModalResult := mrCancel; + Cancel := True; + end; + + {$IFDEF CLR} + TypeData := TTypeData.Create(TypeOf(TDataSet)); + Designer.GetComponentNames(TypeData, StrProc); + {$ELSE} + TypeData.ClassType := TDataSet; + Designer.GetComponentNames(@TypeData, StrProc); + {$ENDIF} + if List.Items.Count > 0 then + List.ItemIndex := 0; + + if (Form.ShowModal = mrOk) and (List.ItemIndex >= 0) then + TVirtualTable(Component).Assign( + TDataSet(Designer.GetComponent(List.Items[List.ItemIndex]))); + finally + Form.Free; + end; +end; + +procedure Register; +{$IFDEF OLDDESIGNER} +var + DataSet: TDataSet; + DataSetEditor: TComponentEditor; +{$ENDIF} +begin +// WAR need before register TOraQuery, TOraSmartQuery + +{$IFDEF OLDDESIGNER} +{$WARNINGS OFF} +{$IFDEF VER6P} + DataSet := nil; + try + DataSet := TDataSet.Create(nil); + DataSetEditor := Pointer(Integer(GetComponentEditor(DataSet, nil)) - 20); + DataSetEditorClass := TComponentEditorClass(DataSetEditor.ClassType); + finally + DataSet.Free; + end; +{$ELSE} + DataSet := nil; + DataSetEditor := nil; + try + DataSet := TDataSet.Create(nil); + DataSetEditor := GetComponentEditor(DataSet, nil); + DataSetEditorClass := TComponentEditorClass(DataSetEditor.ClassType); + finally + DataSetEditor.Free; + DataSet.Free; + end; +{$ENDIF} +{$WARNINGS ON} +{$ENDIF} + + RegisterPropertyEditor(TypeInfo(DB.TFields), TVirtualTable, 'Fields', + TVTFieldsEditor); + + RegisterComponentEditor(TVirtualTable, TVirtualTableEditor); +end; + +end. diff --git a/internal/4.10.0.10/1/Source/MSAccess.pas b/internal/4.10.0.10/1/Source/MSAccess.pas new file mode 100644 index 0000000..acbc440 --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSAccess.pas @@ -0,0 +1,5787 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// MSAccess +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSAccess; +{$ENDIF} + +{ $R MSAccess.res} + +interface + +uses +{$IFDEF CLR} + Variants, System.XML, System.Text, +{$ELSE} + CLRClasses, CRXml, +{$ENDIF} + Classes, MemDS, DBAccess, MemData, CRAccess, OLEDBAccess, SysUtils, DB, CRParser, + OLEDBC, OLEDBIntf, MSConsts, MemUtils, DASQLMonitor, Windows, DAConsts, Win32Timer; + +{$I SdacVer.inc} + +const + ftMSXML = 50; + +{ TMSParam } +const + /// WAR Need to sync with EdMSParams.FieldTypesWithSize on change + FieldTypesWithSize: set of TFieldType = [ftString, ftFixedChar, {ftMemo - BLOB, }ftBytes, ftVarBytes, ftWideString]; + +type + TMSParam = class (TDAParam) + private + FOLEDBType: DBTYPE; + protected + function GetSize: integer; override; + procedure SetSize(Value: integer); override; + + procedure SetAsString(Value: string); override; + procedure SetAsWideString(Value: WideString); override; + procedure SetAsVariant(const Value: Variant); override; + + procedure CreateObject; override; + + function IsObjectDataType: boolean; overload; + property ParamObject; + property OLEDBType: DBTYPE read FOLEDBType write FOLEDBType; + public + constructor Create(Collection: TCollection); override; + + procedure AssignFieldValue(Field: TField; const Value: Variant); override; + + property AsString: string read GetAsString write SetAsString; + property AsWideString: WideString read GetAsWideString write SetAsWideString; + + end; + +{ TMSParams } + TMSParams = class (TDAParams) + private + function GetItem(Index: Integer): TMSParam; + procedure SetItem(Index: Integer; Value: TMSParam); + + public + constructor Create(Owner: TPersistent); + + procedure Assign(Source: TPersistent); override; + + function ParamByName(const Value: string): TMSParam; + function FindParam(const Value: string): TMSParam; + property Items[Index: integer]: TMSParam read GetItem write SetItem; default; + + end; + +{ TMSConnection } + + TMSConnection = class; + TMSConnectionOptions = class (TDAConnectionOptions) + protected + FQuotedIdentifier: boolean; + FLanguage: string; + FEncrypt: boolean; + FPersistSecurityInfo: boolean; + FAutoTranslate: boolean; + FNetworkLibrary: string; + FApplicationName: string; + FWorkstationID: string; + FPacketSize: integer; + FNumericType: TDANumericType; + FProvider: TOLEDBProvider; + FInitialFileName: string; + FMultipleActiveResultSets: boolean; + //FMaxDatabaseSize: integer; + FFailoverPartner: string; + + procedure SetQuotedIdentifier(const Value: boolean); + procedure SetLanguage(const Value: string); + procedure SetEncrypt(const Value: boolean); + procedure SetPersistSecurityInfo(const Value: boolean); + procedure SetAutoTranslate(const Value: boolean); + procedure SetNetworkLibrary(const Value: string); + procedure SetApplicationName(const Value: string); + procedure SetWorkstationID(const Value: string); + procedure SetPacketSize(const Value: integer); + procedure SetNumericType(Value: TDANumericType); + procedure SetProvider(const Value: TOLEDBProvider); + procedure SetInitialFileName(const Value: string); + procedure SetMultipleActiveResultSets(const Value: boolean); + //procedure SetMaxDatabaseFile(const Value: integer); + procedure SetFailoverPartner(const Value: string); + + protected + procedure AssignTo(Dest: TPersistent); override; + + public + constructor Create(Owner: TMSConnection); + + published + property QuotedIdentifier: boolean read FQuotedIdentifier write SetQuotedIdentifier default True; + property Language: string read FLanguage write SetLanguage; + property Encrypt: boolean read FEncrypt write SetEncrypt default False; + property PersistSecurityInfo: boolean read FPersistSecurityInfo write SetPersistSecurityInfo default False; + property AutoTranslate: boolean read FAutoTranslate write SetAutoTranslate default True; + property NetworkLibrary: string read FNetworkLibrary write SetNetworkLibrary; + property ApplicationName: string read FApplicationName write SetApplicationName; + property WorkstationID: string read FWorkstationID write SetWorkstationID; + property PacketSize: integer read FPacketSize write SetPacketSize default 4096; + property NumericType: TDANumericType read FNumericType write SetNumericType default ntFloat; + property Provider: TOLEDBProvider read FProvider write SetProvider default prAuto; + property InitialFileName: string read FInitialFileName write SetInitialFileName; + property MultipleActiveResultSets: boolean read FMultipleActiveResultSets write SetMultipleActiveResultSets default False; + //property MaxDatabaseSize: integer read FMaxDatabaseSize write SetMaxDatabaseFile default 128; + property FailoverPartner: string read FFailoverPartner write SetFailoverPartner; + property KeepDesignConnected; + property DisconnectedMode; + property LocalFailover; + end; + + TMSConnectionInfoMessageEvent = procedure (Sender: TObject; E: EMSError) of object; + TMSSQL = class; + + TMSConnection = class (TCustomDAConnection) + protected + FLoginPrompt: boolean; + FLockLoginPrompt: boolean; + + FDatabase: string; + FIsolationLevel: TIsolationLevel; + FAuthentication: TMSAuthentication; + + FConnectionTimeout: integer; + // FMultipleConnections: boolean; + FOptions: TMSConnectionOptions; + + FMSSQL: TMSSQL; + + FOnInfoMessage: TMSConnectionInfoMessageEvent; + + function GetIConnectionClass: TCRConnectionClass; override; + function GetICommandClass: TCRCommandClass; override; + function GetIRecordSetClass: TCRRecordSetClass; override; + + procedure CreateIConnection; override; + procedure SetIConnection(Value: TCRConnection); override; + procedure SetOptions(Value: TMSConnectionOptions); + + function GetOLEDBConnection: TOLEDBConnection; + + function SQLMonitorClass: TClass; override; + function ConnectDialogClass: TConnectDialogClass; override; + + procedure AssignTo(Dest: TPersistent); override; + + procedure SetDatabase(Value: string); + + procedure SetIsolationLevel(const Value: TIsolationLevel); + // procedure SetMultipleConnections(const Value: boolean); + + procedure SetAuthentication(const Value: TMSAuthentication); + procedure SetConnectionTimeout(const Value: integer); + function NeedPrompt: boolean; override; + + function IsFatalError(E: EDAError): boolean; override; + procedure DoError(E: Exception; var Fail, Reconnect, Reexecute: boolean; ReconnectAttempt: integer; + var ConnLostCause: TConnLostCause); override; + procedure DoInfoMessage(E: EMSError); + function IsKeyViolation(E: EDAError): boolean; override; + + procedure Check(const Status: HRESULT; Sender: TObject); + procedure CheckInactive; + + { Transaction control } + procedure InternalStartTransaction; override; + + function CommitOnDisconnect: boolean; override; + + function GetConnectString: string; override; + procedure SetConnectString(Value: string); override; + function GetClientVersion: string; + function GetServerVersion: string; + + + function CreateOptions: TDAConnectionOptions; override; + + function IConnection: TOLEDBConnection; + function IsCaseSensitive: boolean; override; + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + + function CreateDataSet: TCustomDADataSet; override; + function CreateSQL: TCustomDASQL; override; + + procedure ChangePassword(NewPassword: string); + function ExecSQL(Text: string; const Params: array of variant): variant; override; + + procedure GetTableNames(List: TStrings); override; + procedure GetDatabaseNames(List: TStrings); override; + procedure GetStoredProcNames(List: TStrings); overload; override; + procedure GetStoredProcNames(List: TStrings; System: boolean); reintroduce; overload; + + property ClientVersion: string read GetClientVersion; + property ServerVersion: string read GetServerVersion; + + published + property Database: string read FDatabase write SetDatabase; + property IsolationLevel: TIsolationLevel read FIsolationLevel write SetIsolationLevel default ilReadCommitted; + property Authentication: TMSAuthentication read FAuthentication write SetAuthentication default auServer; + property ConnectionTimeout: integer read FConnectionTimeout write SetConnectionTimeout default 15; + // property MultipleConnections: boolean read FMultipleConnections write SetMultipleConnections; {without default!} + + property Options: TMSConnectionOptions read FOptions write SetOptions; + + property PoolingOptions; + property Pooling; + + property Username; + property Password; + property Server; + property Connected stored IsConnectedStored; + + property AfterConnect; + property BeforeConnect; + property AfterDisconnect; + property BeforeDisconnect; + property OnLogin; + property OnError; + property ConnectDialog; + property LoginPrompt; + property ConnectString; + + property OnInfoMessage: TMSConnectionInfoMessageEvent read FOnInfoMessage write FOnInfoMessage; + property OnConnectionLost; + end; + +{ TCustomMSDataSet } + + TMSDataSetOptions = class (TDADataSetOptions) + private + FEnableBCD: boolean; + FUniqueRecords: boolean; + FCursorUpdate: boolean; + FQueryIdentity: boolean; + FCheckRowVersion: boolean; + FDMLRefresh: boolean; + FAutoRefresh: boolean; + FAutoRefreshInterval: integer; + FSmartRefresh: boolean; + FDefaultValues: boolean; + FNonBlocking: boolean; + + procedure SetEnableBCD(Value: boolean); + procedure SetUniqueRecords(Value: boolean); + procedure SetCursorUpdate(Value: boolean); + function GetAllFieldsEditable: boolean; + procedure SetAllFieldsEditable(const Value: boolean); + procedure SetAutoRefresh(Value: boolean); + procedure SetAutoRefreshInterval(Value: integer); + //procedure SetSmartRefresh(Value: boolean); + procedure SetNonBlocking(Value: boolean); + protected + procedure AssignTo(Dest: TPersistent); override; + + public + constructor Create(Owner: TCustomDADataSet); + + published + property AllFieldsEditable: boolean read GetAllFieldsEditable write SetAllFieldsEditable stored False; + property EnableBCD: boolean read FEnableBCD write SetEnableBCD default False; + property UniqueRecords: boolean read FUniqueRecords write SetUniqueRecords default False; + property CursorUpdate: boolean read FCursorUpdate write SetCursorUpdate default True; + property QueryIdentity: boolean read FQueryIdentity write FQueryIdentity default True; + property CheckRowVersion: boolean read FCheckRowVersion write FCheckRowVersion default False; + property FullRefresh default False; + property DMLRefresh: boolean read FDMLRefresh write FDMLRefresh default False; + property AutoRefresh: boolean read FAutoRefresh write SetAutoRefresh default False; + property AutoRefreshInterval: integer read FAutoRefreshInterval write SetAutoRefreshInterval default 60; /// Seconds dac6.txt + //property SmartRefresh: boolean read FSmartRefresh write SetSmartRefresh default False; + property DefaultValues: boolean read FDefaultValues write FDefaultValues default False; + property NonBlocking: boolean read FNonBlocking write SetNonBlocking default False; + + property LongStrings; + property RequiredFields default False; + property StrictUpdate; + property NumberRange; + property ReturnParams; + property TrimFixedChar; + property TrimVarChar; + property QueryRecCount; + property AutoPrepare; + property RemoveOnRefresh; + property FlatBuffers; + property QuoteNames; + property DetailDelay; + {$IFDEF HAVE_COMPRESS} + property CompressBlobMode; + {$ENDIF} + property LocalMasterDetail; + property CacheCalcFields; + property UpdateBatchSize; + property UpdateAllFields; + end; + + TCustomMSDataSet = class; + TMSUpdateExecuteEvent = procedure (Sender: TCustomMSDataSet; + StatementTypes: TStatementTypes; Params: TMSParams) of object; + + TMSSQLGenerator = class (TDASQLGenerator) + protected + function AssembleSB(const StatementType: TStatementType): string; override; + function GetActualFieldNameEx(FieldDesc: TCRFieldDesc; TableInfo: TCRTableInfo): string; overload; override; + procedure GenerateInsertSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); override; + procedure GenerateUpdateSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); override; + procedure GenerateRefreshSQLSelectPart(const KeyAndDataFields: TKeyAndDataFields); override; + procedure GenerateRefreshSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean); override; + function GetActualFieldName(FldDesc: TCRFieldDesc; IsRefresh: boolean): string; override; + procedure AddFieldToCondition(SB: StringBuilder; FieldDesc: TCRFieldDesc; + const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); override; + + procedure GenerateConditions(SB: StringBuilder; const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + const KeyAndDataFields: TKeyAndDataFields; + const Index: integer = -1); override; + end; + + TMSUpdateSQL = class; + + TCustomMSDataSet = class (TCustomDADataSet) + private + function GetConnection: TMSConnection; + procedure SetConnection(Value: TMSConnection); + procedure SetCursorType(const Value: TMSCursorType); + procedure SetCommandTimeout(const Value: integer); + + function GetUpdateObject: TMSUpdateSQL; + procedure SetUpdateObject(Value: TMSUpdateSQL); + protected + { IProviderSupport } + function PSGetKeyFields: string; override; + + protected + FIRecordSet: TOLEDBRecordSet; + FICommand: TOLEDBCommand; + + FLockInitFieldDefs: boolean; //Used to prevent multiple calls to OLE DB Execute on FieldDefs.Update in DT generators + + FBeforeUpdateExecute: TMSUpdateExecuteEvent; + FAfterUpdateExecute: TMSUpdateExecuteEvent; + + FIsAnyFieldDescCanBeModified: boolean; + FTimestampField: TField; + + FOptions: TMSDataSetOptions; + FCursorType: TMSCursorType; + + FCommandTimeout: integer; + + FIsInInitFieldDefs: boolean; + FUseParamType: boolean; + + FCanOpenNext: boolean; + + FAutoRefreshTimer: TWin32Timer; + + { Smart Refresh} + {$IFNDEF STD} + FRefreshServiceBroker: TComponent; + FRefreshQueue: string; + FRefreshService: string; + FAfterSmartRefresh: TDataSetNotifyEvent; + FNeedSmartRefresh: boolean; + {$ENDIF} + + procedure AutoRefreshTimer(Sender: TObject); + + function QuoteName(const AName: string): string; overload; override; + function QuoteName(const AName: string; const LeftQuote, RightQuote: string): string; reintroduce; overload; + + function GetParams: TMSParams; + procedure SetParams(Value: TMSParams); + + procedure CreateIRecordSet; override; + procedure SetIRecordSet(Value: TData); override; + procedure SetNumericType; + + procedure CreateCommand; override; + + function CreateOptions: TDADataSetOptions; override; + procedure SetOptions(Value: TMSDataSetOptions); + + procedure AssignTo(Dest: TPersistent); override; + + procedure BeginConnection(NoConnectCheck: boolean = True); override; + procedure EndConnection; override; + + { Smart Refresh} + {$IFDEF SMART_REFRESH} + {$IFNDEF STD} + procedure RegisterNotification; + procedure UnregisterNotification; + {$ENDIF} + {$ENDIF} + + { Open/Close } + procedure SetActive(Value: Boolean); override; + procedure DataReopen; override; + procedure InternalExecute; override; + procedure InternalOpen; override; + procedure InternalClose; override; + procedure OpenCursor(InfoQuery: boolean); override; + procedure GetFieldsInfo; + function GetRecCount: longint; override; + function GetRecordCount: integer; override; + procedure DoCursorTypeChanged; // Callback from internal level. Called if CursorType or ReadOnly is changed on OLEDB execute + procedure SetFetchAll(Value: boolean); override; + procedure UpdateExecute(const StatementTypes: TStatementTypes); override; + + procedure CheckInactive; override; + + { Fields } + procedure InitFieldDefs; override; + procedure InternalInitFieldDefs; override; + function GetFieldType(DataType: word): TFieldType; override; + function GetFieldClass(FieldType: TFieldType): TFieldClass; override; + {$IFDEF USE_FTAUTOINC} + function GetFieldType(FieldDesc: TFieldDesc): TFieldType; override; + {$ENDIF} + procedure SetNumberRange(FieldDef: TFieldDef); override; + procedure DetectIdentityField; override; + + { Edit } + procedure CreateSQLGenerator; override; + procedure SetReadOnly(Value: boolean); override; + procedure InternalBeforeEdit; override; + procedure GetKeyAndDataFields( + out KeyAndDataFields: TKeyAndDataFields; + const ForceUseAllKeyFields: boolean); override; + + procedure InternalRefreshRecord; override; + procedure CheckUpdateQuery(const StatementType: TStatementType); override; + function UseParamType: boolean; override; //This function indicates ParamType using in PerformSQL + function PerformSQL(const SQL: string; const StatementTypes: TStatementTypes): boolean; override; + + procedure InternalCreateProcCall(Name: string; NeedDescribe: boolean); + + { RefreshQuick} + function IsRefreshQuickField(FieldDesc: TFieldDesc): boolean; override; + procedure SaveMaxRefreshQuickValue(FieldDesc: TFieldDesc; const Value: variant); override; + + function GetCanModify: boolean; override; + + function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: boolean): TGetResult; override; + + function NeedReturnParams: boolean; override; + + procedure AssignFieldValue(Param: TDAParam; Field: TField; Old: boolean); override; + { Smart Refresh} + {$IFNDEF STD} + procedure DoSmartRefresh; + {$ENDIF} + + { Navigation } + procedure InternalSetToRecord(Buffer: TRecordBuffer); override; + + procedure DoAfterExecute(Result: boolean); override; + + { Before / After UpdateExecute } + function AssignedBeforeUpdateExecute: boolean; override; + procedure DoBeforeUpdateExecute(Sender: TDataSet; StatementTypes: TStatementTypes; + Params: TDAParams); override; + function AssignedAfterUpdateExecute: boolean; override; + procedure DoAfterUpdateExecute(Sender: TDataSet; StatementTypes: TStatementTypes; + Params: TDAParams); override; + + { SQL Modifications } + function SQLAddWhere(SQLText, Condition: string): string; override; + function SQLDeleteWhere(SQLText: string): string; override; + function SQLGetWhere(SQLText: string): string; override; + function SQLSetOrderBy(SQLText: string; Fields: string): string; override; + function SQLGetOrderBy(SQLText: string): string; override; + +(* procedure SetBeforeFetch(Value: TBeforeFetchEvent); override; + procedure SetAfterFetch(Value: TAfterFetchEvent); override;*) + + procedure SetRefreshOptions(Value: TRefreshOptions); override; + + { XML } + procedure WriteFieldXMLDataType(Field: TField; FieldDesc: TFieldDesc; const FieldAlias: string; + XMLWriter: XMLTextWriter); override; + procedure WriteFieldXMLAttributeType(Field: TField; FieldDesc: TFieldDesc; const FieldAlias: string; + XMLWriter: XMLTextWriter); override; + + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + + { Open/Close } + function Fetched: boolean; override; + procedure UnPrepare; override; + function OpenNext: boolean; // Open next rowset in statement. if rowset not returne theh OpenNext return False. If statement has error, then raised exception + procedure BreakExec; + procedure RefreshQuick(const CheckDeleted: boolean); + + function FindParam(const Value: string): TMSParam; + function ParamByName(const Value: string): TMSParam; + + { Edit} + procedure CreateProcCall(Name: string); + + procedure Post; override; + procedure Cancel; override; + + { SQL Modify } + property Connection: TMSConnection read GetConnection write SetConnection; + + property Options: TMSDataSetOptions read FOptions write SetOptions; + + { Edit } + property Params: TMSParams read GetParams write SetParams stored False; + + property CursorType: TMSCursorType read FCursorType write SetCursorType default ctDefaultResultSet; + property CommandTimeout: integer read FCommandTimeout write SetCommandTimeout default 0; + + property BeforeUpdateExecute: TMSUpdateExecuteEvent read FBeforeUpdateExecute write FBeforeUpdateExecute; + property AfterUpdateExecute: TMSUpdateExecuteEvent read FAfterUpdateExecute write FAfterUpdateExecute; + property BeforeFetch; + property AfterFetch; + + property FetchAll: boolean read FFetchAll write SetFetchAll default True; + + property UpdateObject: TMSUpdateSQL read GetUpdateObject write SetUpdateObject; + end; + +{ TMSUpdateSQL } + + TMSUpdateSQL = class (TCustomDAUpdateSQL) + protected + function DataSetClass: TCustomDADataSetClass; override; + function SQLClass: TCustomDASQLClass; override; + end; + +{ TMSQuery } + + TMSQuery = class (TCustomMSDataSet) + protected + procedure SetIRecordSet(Value: TData); override; + + published + property SQLInsert; + property SQLDelete; + property SQLUpdate; + property SQLRefresh; + + property Connection; + property ParamCheck; + property SQL; + property Debug; + property Macros; + property Params; + property FetchRows; + property ReadOnly; + property UniDirectional; + property CachedUpdates; + + property AfterExecute; + property BeforeUpdateExecute; + property AfterUpdateExecute; + property OnUpdateError; + property OnUpdateRecord; + + property UpdateObject; + property RefreshOptions; + + property AutoCalcFields; + property Filtered; + property Filter; + property FilterOptions; + + property BeforeOpen; + property AfterOpen; + property BeforeClose; + property AfterClose; + property BeforeInsert; + property AfterInsert; + property BeforeEdit; + property AfterEdit; + property BeforePost; + property AfterPost; + property BeforeCancel; + property AfterCancel; + property BeforeDelete; + property AfterDelete; + property BeforeScroll; + property AfterScroll; + property OnCalcFields; + property OnDeleteError; + property OnEditError; + property OnFilterRecord; + property OnNewRecord; + property OnPostError; + {$IFNDEF VER4} + property AfterRefresh; + property BeforeRefresh; + {$ENDIF} + + property Options; + property FilterSQL; + + property MasterSource; + property MasterFields; + property DetailFields; + + property UpdatingTable; + + property FetchAll; + property CursorType; + property CommandTimeout; + + property IndexFieldNames; + property Active; /// CR DAC 13049 + property BeforeFetch; + property AfterFetch; + end; + +{ TMSTable } + + TCustomMSTable = class (TCustomMSDataSet) + protected + { IProviderSupport } + function PSGetTableName: string; override; + procedure PSSetParams(AParams: DB.TParams); override; + {$IFDEF VER5P} + procedure PSSetCommandText(const CommandText: string); override; + {$ENDIF} + + protected + FTableName: string; + FOrderFields: string; + + procedure SetTableName(const Value: string); + + procedure SetOrderFields(Value: string); + procedure AssignTo(Dest: TPersistent); override; + + { Open/Close } + procedure OpenCursor(InfoQuery: boolean); override; + + public + { Open/Close } + procedure Prepare; override; + procedure PrepareSQL; + procedure Execute; override; + + property TableName: string read FTableName write SetTableName; + property OrderFields: string read FOrderFields write SetOrderFields; + end; + + TMSTable = class (TCustomMSTable) + published + property TableName; + property OrderFields; + property MasterFields; + property DetailFields; + property MasterSource; + property ReadOnly; + + property Connection; + + property Debug; + property FetchRows; + property UniDirectional; + property CachedUpdates; + + property OnUpdateError; + property OnUpdateRecord; + + property UpdateObject; + property RefreshOptions; + + property Active; + property AutoCalcFields; + property Filtered; + property Filter; + property FilterOptions; + + property BeforeOpen; + property AfterOpen; + property BeforeClose; + property AfterClose; + property BeforeInsert; + property AfterInsert; + property BeforeEdit; + property AfterEdit; + property BeforePost; + property AfterPost; + property BeforeCancel; + property AfterCancel; + property BeforeDelete; + property AfterDelete; + property BeforeScroll; + property AfterScroll; + property OnCalcFields; + property OnDeleteError; + property OnEditError; + property OnFilterRecord; + property OnNewRecord; + property OnPostError; + {$IFNDEF VER4} + property AfterRefresh; + property BeforeRefresh; + {$ENDIF} + property Options; + property FilterSQL; + + property FetchAll; + property CursorType; + property CommandTimeout; + + property IndexFieldNames; + + property BeforeFetch; + property AfterFetch; + end; + +{ TMSStoredProc } + + TCustomMSStoredProc = class (TCustomMSDataSet) + protected + { IProviderSupport } + {$IFDEF VER5P} + procedure PSSetCommandText(const CommandText: string); override; + {$ENDIF} + + protected + FStoredProcName: string; + FIsInPrepare: boolean; + + procedure SetIRecordSet(Value: TData); override; + procedure SetStoredProcName(const Value: string); + procedure AssignTo(Dest: TPersistent); override; + + procedure BeforeOpenCursor(InfoQuery: boolean); override; + procedure BeforeExecute; override; + procedure CreateFieldDefs; override; + + public + procedure ExecProc; // for BDE compatibility + + procedure Prepare; override; + procedure PrepareSQL; + + property UpdatingTable; + property StoredProcName: string read FStoredProcName write SetStoredProcName; + end; + + TMSStoredProc = class(TCustomMSStoredProc) + published + property StoredProcName; + + property SQLInsert; + property SQLDelete; + property SQLUpdate; + property SQLRefresh; + + property Connection; + property ParamCheck stored False; + property SQL; + property Debug; + property Params; + property FetchRows; + property ReadOnly; + property UniDirectional; + property CachedUpdates; + + property AfterExecute; + property BeforeUpdateExecute; + property AfterUpdateExecute; + property OnUpdateError; + property OnUpdateRecord; + + property Options; + property UpdateObject; + property RefreshOptions; + + property Active; + property AutoCalcFields; + property Filtered; + property Filter; + property FilterOptions; + property BeforeOpen; + property AfterOpen; + property BeforeClose; + property AfterClose; + property BeforeInsert; + property AfterInsert; + property BeforeEdit; + property AfterEdit; + property BeforePost; + property AfterPost; + property BeforeCancel; + property AfterCancel; + property BeforeDelete; + property AfterDelete; + property BeforeScroll; + property AfterScroll; + property OnCalcFields; + property OnDeleteError; + property OnEditError; + property OnFilterRecord; + property OnNewRecord; + property OnPostError; + {$IFNDEF VER4} + property AfterRefresh; + property BeforeRefresh; + {$ENDIF} + + property UpdatingTable; + + property FetchAll; + property CursorType; + property CommandTimeout; + end; + +{ TMSSQL } + + TMSSQL = class (TCustomDASQL) + private + function GetConnection: TMSConnection; + procedure SetConnection(Value: TMSConnection); + + function GetParams: TMSParams; + procedure SetParams(Value: TMSParams); + + protected + FICommand: TOLEDBCommand; + FCommandTimeout: integer; + FNonBlocking: boolean; + + function GetPermitPrepare: boolean; + procedure SetPermitPrepare(Value: boolean); + + procedure CreateICommand; override; + procedure SetICommand(Value: TCRCommand); override; + procedure InternalPrepare; override; + procedure InternalExecute(Iters: integer); override; + procedure AssignTo(Dest: TPersistent); override; + + function ParseSQL(const SQL: string; Params: TDAParams; RenamePrefix: string = ''): string; override; + function CreateParser(const Text: string): TParser; override; + procedure AssembleSQL; override; + function CreateParamsObject: TDAParams; override; + procedure CreateParams; override; + procedure WriteParams(WriteValue: boolean = True); override; + procedure ReadParams; override; + + procedure SetCommandTimeout(const Value: integer); + procedure SetNonBlocking(const Value: boolean); + public + constructor Create(Owner: TComponent); override; + procedure Execute(Iters: integer); override; + procedure BreakExec; + + procedure CreateProcCall(Name: string); + published + function FindParam(const Value: string): TMSParam; + function ParamByName(const Value: string): TMSParam; + + property Connection: TMSConnection read GetConnection write SetConnection; + property Params: TMSParams read GetParams write SetParams stored False; + + property ParamCheck; + property SQL; + property Macros; + property Debug; + + property AfterExecute; + property CommandTimeout: integer read FCommandTimeout write SetCommandTimeout; + property NonBlocking: boolean read FNonBlocking write SetNonBlocking default False; + + property PermitPrepare: boolean write SetPermitPrepare stored False; + + end; + +{ TMSMetadata } + + TMSObjectType = (otDatabases, + otColumnPrivileges, otColumns, + otForeignKeys, otPrimaryKeys, + otIndexes, + otServerTypes, + otSchemata, otStatistics, + otStoredProcs, otStoredProcParams, + otAliases, otTables, otSynonyms, otSystemTables, otViews, otGlobalTempTables, otLocalTempTables, otSystemViews, + otAliasesInfo, otTablesInfo, otSynonymsInfo, otSystemTablesInfo, otViewsInfo, otGlobalTempTablesInfo, otLocalTempTablesInfo, otExternalTablesInfo, otSystemViewsInfo, + otTableConstraints, otTablePrivileges, + otLinkedServers, + otAssemblies, + otAssemblyDependencies, + otUserTypes, + otXMLCollections); + + TMSMetadata = class (TCustomMSDataSet) + protected + FObjectType: TMSObjectType; + + FDatabaseName: string; + FSchemaName: string; + FTableName: string; + FStoredProcName: string; + FColumnName: string; + FIndexName: string; + FConstraintName: string; + FLinkedServer: string; + FAssemblyName: string; + FAssemblyID: integer; + FReferencedAssemblyID: integer; + FUDTName: string; + FSchemaCollectionName: string; + FTargetNamespaceURI: string; + + procedure SetDatabaseName(Value: string); + procedure SetSchemaName(Value: string); + procedure SetObjectType(Value: TMSObjectType); + procedure SetTableName(Value: string); + procedure SetStoredProcName(Value: string); + procedure SetColumnName(Value: string); + procedure SetIndexName(Value: string); + procedure SetConstraintName(Value: string); + procedure SetLinkedServer(Value: string); + procedure SetAssemblyName(Value: string); + procedure SetAssemblyID(Value: integer); + procedure SetReferencedAssemblyID(Value: integer); + procedure SetUDTName(Value: string); + procedure SetSchemaCollectionName(Value: string); + procedure SetTargetNamespaceURI(Value: string); + + function RequestIRowset: IRowset; + procedure InternalExecute; override; + procedure OpenCursor(InfoQuery: boolean); override; + + public + constructor Create(Owner: TComponent); override; + + published + property ObjectType: TMSObjectType read FObjectType write SetObjectType default otDatabases; + + property DatabaseName: string read FDatabaseName write SetDatabaseName; + property SchemaName: string read FSchemaName write SetSchemaName; + property TableName: string read FTableName write SetTableName; + property StoredProcName: string read FStoredProcName write SetStoredProcName; + property ColumnName: string read FColumnName write SetColumnName; + property IndexName: string read FIndexName write SetIndexName; + property ConstraintName: string read FConstraintName write SetConstraintName; + + property LinkedServer: string read FLinkedServer write SetLinkedServer; + property AssemblyName: string read FAssemblyName write SetAssemblyName; + property AssemblyID: integer read FAssemblyID write SetAssemblyID default 0; + property ReferencedAssemblyID: integer read FReferencedAssemblyID write SetReferencedAssemblyID default 0; + property UDTName: string read FUDTName write SetUDTName; + property SchemaCollectionName: string read FSchemaCollectionName write SetSchemaCollectionName; + property TargetNamespaceURI: string read FTargetNamespaceURI write SetTargetNamespaceURI; + + property Active; + property Connection; + end; + + TMSSchemaCollection = record + Name: string; + CatalogName: string; + SchemaName: string; + end; + + TMSXMLField = class(TField) + protected + FTyped: boolean; + FSchemaCollection: TMSSchemaCollection; + procedure GetText(var Text: string; DisplayText: Boolean); override; + procedure SetSchemaCollection(Name, CatalogName, SchemaName: string); + + function GetBlobSize: Integer; + // function GetModified: Boolean; + // procedure SetModified(Value: Boolean); + public + constructor Create(AOwner: TComponent); override; + + // Copied from TBlobField + // procedure Assign(Source: TPersistent); override; + procedure Clear; override; + class function IsBlob: Boolean; override; + procedure LoadFromFile(const FileName: string); + procedure LoadFromStream(Stream: TStream); + procedure SaveToFile(const FileName: string); + procedure SaveToStream(Stream: TStream); + procedure SetFieldType(Value: TFieldType); override; + property BlobSize: Integer read GetBlobSize; + // property Modified: Boolean read GetModified write SetModified; + property Value: string read GetAsString write SetAsString; + + property XML: string read GetAsString write SetAsString; + property Typed: boolean read FTyped; + property SchemaCollection: TMSSchemaCollection read FSchemaCollection; + published + // property Transliterate: Boolean read FTransliterate write FTransliterate default True; + // property Size default 0; + end; + +{ TMSDataSource } + + TMSDataSource = class(TCRDataSource) + end; + + TMSAccessUtils = class + public + class procedure GetKeyAndDataFields( + Obj: TCustomMSDataSet; + out KeyAndDataFields: TKeyAndDataFields; + const ForceUseAllKeyFields: boolean); + class procedure SetDesigning(Obj: TCustomMSDataSet; Value: Boolean; SetChildren: Boolean = True); + class procedure SetLockLoginPromt(Obj: TMSConnection; Value: Boolean); + + class function FIConnection(Obj: TMSConnection): TOLEDBConnection; + class function FIRecordSet(Obj: TCustomMSDataSet): TOLEDBRecordSet; + + class function GetOLEDBSQL(Obj: TCustomMSDataSet): string; overload; + class function GetOLEDBSQL(Obj: TMSSQL): string; overload; + + class function FIDBCreateSession(Obj: TOLEDBConnection): IDBCreateSession; + + class procedure DoError(Obj: TMSConnection; E: Exception; var Fail: boolean); + end; + + procedure GetServerList(List: TStrings); + procedure GetDatabasesList(const Connection: TMSconnection; List: TStrings); + procedure GetTablesList(const Connection: TMSconnection; List: TStrings); + + function IsLargeDataTypeUsed(const Field: TField): boolean; overload; + + function TableNamesFromList(List: TStrings): string; + procedure TableNamesToList(Value: string; List: TStrings); + +var + DefConnectDialogClassProc: function: TClass = nil; + CurrentProjectOutputDir: string; + __UseUpdateOptimization: boolean; + + +implementation + +{ $DEFINE SMART_REFRESH} + +uses +{$IFDEF CLR} + System.Runtime.InteropServices, System.Reflection, +{$ENDIF} +{$IFDEF VER7P} + StrUtils, +{$ENDIF} +{$IFDEF VER6P} +{$IFNDEF CLR} + Variants, +{$ENDIF} +{$ELSE} + comobj, +{$ENDIF} + DBCommon, DBConsts, MSParser, Registry, ActiveX, MSSQLMonitor, Math, DBMonitorIntf, + MSConnectionPool, CRConnectionPool, +{$IFDEF SMART_REFRESH} +{$IFNDEF STD} + MSServiceBroker, +{$ENDIF} +{$ENDIF} + Messages; + +{$IFDEF SMART_REFRESH} +{$IFNDEF STD} +const + sSdacService = '__SdacNotificationService'; + sSdacQueue = '__SdacNotificationQueue'; + +type + TMSRefreshServiceBroker = class(TMSServiceBroker) + private + FDataSet: TCustomMSDataSet; + FErrorCount: integer; + protected + procedure OnThreadEvent(Sender: TObject; Event: TObject; var Cancel: boolean); override; + procedure OnThreadMessage(Sender: TObject; Event: TObject); override; + public + procedure Start; override; + end; + +{ TMSRefreshServiceBroker } + +procedure TMSRefreshServiceBroker.OnThreadEvent(Sender: TObject; Event: TObject; var Cancel: boolean); + + procedure CheckQNError(Source, Info: string); + begin + if Source = 'statement' then begin + if Info = 'query' then + DatabaseError(SInvalidQNStatement) + else + if Info = 'invalid' then + DatabaseError(SStatementNotSupported) + else + if Info = 'set options' then + DatabaseError(SInvalidQNSetOptions) + else + if Info = 'isolation' then + DatabaseError(SInvalidQNIsolation) + else + if Info = 'query template limit' then + DatabaseError(STemplateLimit); + end + else + if Source = 'timeout' then + DatabaseError(SSubscriptionTimedOut) + else + if Source = 'object' then begin + if Info = 'drop' then + DatabaseError(SQNObjectDropped) + else + if Info = 'alter' then + DatabaseError(SQNObjectAltered) + end + else + if Source = 'system' then begin + if Info = 'restart' then + DatabaseError(SSQLServerStarted) + else + if Info = 'error' then + DatabaseError(SSQLInternalError) + else + if Info = 'resource' then + DatabaseError(SSubscriptionRemoved) + end; + end; + +begin + inherited; + + if TMSServiceBrokerMsg(Event).MessageProperties.QNMessage <> GetComponentName(FDataSet) then + Cancel := True + else + try + // Check Query Notification Error + CheckQNError(TMSServiceBrokerMsg(Event).MessageProperties.QNSource, TMSServiceBrokerMsg(Event).MessageProperties.QNInfo); + except + if FErrorCount >= 1 then begin + // FDataSet.UnregisterNotification + raise; + end + else + Inc(FErrorCount); + Cancel := True; + end; +end; + +procedure TMSRefreshServiceBroker.OnThreadMessage(Sender: TObject; Event: TObject); +begin + Event.Free; + FDataSet.DoSmartRefresh; +end; + +procedure TMSRefreshServiceBroker.Start; +begin + FErrorCount := 0; + inherited; +end; +{$ENDIF} +{$ENDIF} + +{$IFNDEF VER6P} +const + varShortInt = $0010; { vt_i1 } + varWord = $0012; { vt_ui2 } + varLongWord = $0013; { vt_ui4 } + varInt64 = $0014; { vt_i8 } +{$ENDIF} + +function IsLargeDataTypeUsed(const Field: TField): boolean; overload; +begin + Result := + (Field is TBlobField) or + ((Field is TMemoField) and (TMemoField(Field).BlobSize > MaxNonBlobFieldLen)); +end; + +function IsLargeDataTypeUsed(const Param: TParam): boolean; overload; +begin + Result := + (Param.DataType = ftBlob) + or (Param.DataType = ftMemo) + {$IFDEF VER10P} + or (Param.DataType = ftWideMemo) + {$ENDIF}; +end; + +function TableNamesFromList(List: TStrings): string; +var + i: integer; +begin + for i := 0 to List.Count - 1 do + if i = 0 then + Result := BracketIfNeed(List[i]) + else + Result := Result + ', ' + BracketIfNeed(List[i]); +end; + +procedure TableNamesToList(Value: string; List: TStrings); +var + St: string; + i: integer; +begin + Value := Trim(Value); + List.Clear; + + St := ''; + for i := 1 to Length(Value) do + if (Value[i] = ',') or (Value[i] = ';') then begin + St := UnbracketIfPossible(Trim(St)); + if St <> '' then + List.Add(St); + St := ''; + end + else + St := St + Value[i]; + + St := UnbracketIfPossible(Trim(St)); + if St <> '' then + List.Add(St); +end; + +function GetFieldType(DataType: word): TFieldType; +begin + case DataType of + dtInt64: + Result := ftLargeInt; + dtWord: + Result := ftWord; + dtBoolean: + Result := ftBoolean; + dtCurrency: + Result := ftCurrency; + dtBytes: + Result := ftBytes; + dtVarBytes: + Result := ftVarBytes; + dtMSXML: + Result := TFieldType(ftMSXML); + {$IFDEF VER5P} +{ dtVariant: + Result := ftVariant;} +{ dtIUnknown: + Result := ftInterface;} + {$ENDIF} + else + Result := MemDS.GetFieldType(DataType); + end; +end; + +function GetDataType(FieldType: TFieldType): word; +begin + if Integer(FieldType) = ftMSXML then + Result := dtMSXML + else + Result := MemDS.GetDataType(FieldType); +end; + +function SetWhere(SQL: string; Condition: string): string; +begin + Result := _SetWhere(SQL, Condition, TMSParser, True, lxSELECT, lxWHERE); +end; + +function AddWhere(SQL: string; Condition: string): string; +begin + Result := _AddWhere(SQL, Condition, TMSParser, False, lxSELECT, lxWHERE); +end; + +function DeleteWhere(SQL: string): string; +begin + Result := SetWhere(SQL, ''); +end; + +function GetWhere(SQL: string): string; +begin + Result := _GetWhere(SQL, TMSParser, False, lxSELECT, lxWHERE); +end; + +function SetOrderBy(SQL: string; Fields: string): string; +begin + Result := _SetOrderBy(SQL, Fields, TMSParser, lxSELECT, lxORDER, lxBY); +end; + +function GetOrderBy(SQL: string): string; +begin + Result := _GetOrderBy(SQL, TMSParser, lxSELECT, lxORDER, lxBY); +end; + +procedure GetServerList(List: TStrings); + procedure GetServerListByReg; + var + Reg: TRegistry; + i: integer; + Value: string; + sl: tstringlist; + begin + Reg := TRegistry.Create; + sl := TStringList.Create; + try + Reg.RootKey := HKEY_Local_Machine; + if Reg.OpenKeyReadOnly('SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo') then begin + Reg.GetValueNames(sl); + + // Delete non-server occurences + for i := sl.Count - 1 downto 0 do begin + Value := Reg.ReadString(sl[i]); + if Pos(',', Value) = 0 then + sl.Delete(i); + end; + + sl.Sort; + List.AddStrings(sl); + end; + finally + Reg.Free; + sl.Free; + end; + end; + + procedure GetServerListByOleDBEnum; + var + SourcesRowset: ISourcesRowset; + Rowset: IRowset; + ds: TCustomMSDataset; + iu: IUnknown; + begin + if CoCreateInstance(CLSID_SQLOLEDB_ENUMERATOR, + nil, + CLSCTX_INPROC_SERVER, + IID_ISourcesRowset, + SourcesRowset) <> S_OK then + Exit; + + if SourcesRowset.GetSourcesRowset(nil, IID_IRowset, 0, nil, iu) <> S_OK then + Exit; + + Rowset := IRowset(iu); + ds := TCustomMSDataSet.Create(nil); + try + TDBAccessUtils.SetLockDebug(ds, True); // To prevent AV on TCustomDADataSet.OpenCursor -> UsedConnection.SQLMonitorClass + ds.FIRecordSet.SetIRowset(Rowset, False); + ds.Open; + + while not ds.Eof do begin + List.Add(ds.Fields[0].AsString); + ds.Next; + end; + finally + ds.Free; + end; + end; + +begin + List.Clear; + GetServerListByOleDBEnum; + GetServerListByReg; +end; + +procedure GetDatabasesList(const Connection: TMSconnection; List: TStrings); +begin + if Connection = nil then + Exit; + + Connection.GetDatabaseNames(List); +end; + +procedure GetTablesList(const Connection: TMSconnection; List: TStrings); +begin + if Connection = nil then + Exit; + + Connection.GetTableNames(List); +end; + +{ TMSParam } + +constructor TMSParam.Create(Collection: TCollection); +begin + inherited Create(Collection); + + Bound := True; +end; + +procedure TMSParam.SetAsString(Value: string); +begin + if not (DataType in [ftBytes, ftVarBytes]) then + inherited + else + Self.Value := Value; +end; + +procedure TMSParam.SetAsWideString(Value: WideString); +begin + if not (DataType in [ftBytes, ftVarBytes]) then + inherited + else + Self.Value := Value; +end; + +function TMSParam.GetSize: integer; +begin + if DataType in FieldTypesWithSize then begin + if inherited GetSize > 0 then + Result := inherited GetSize + else + if (DataType in [ftBytes, ftVarBytes]) and VarIsArray(Value) then + {$IFDEF CLR} + Result := VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1) + 1 + {$ELSE} + Result := TVarData(Value).VArray.Bounds[0].ElementCount + {$ENDIF} + else + Result := Length(GetAsString); + end + else + Result := 0; +end; + +procedure TMSParam.SetSize(Value: integer); +begin + if DataType in FieldTypesWithSize then + inherited; +end; + +procedure TMSParam.SetAsVariant(const Value: Variant); +var + l, lold: integer; +begin + inherited; + if (DataType in FieldTypesWithSize) and not (VarIsNull(Value) or VarIsEmpty(Value)) then begin + lold := inherited GetSize; + if lold > 0 then begin + {$IFDEF CLR} + if VarType(Value) = varArray + varByte then + l := Length(TBytes(Value)) + else + {$ENDIF} + l := Length(Value); + if l > lold then + inherited SetSize(l); + end; + end; + Bound := True; +end; + +procedure TMSParam.CreateObject; +begin + Assert(FParamObject = nil); + if (DataType in [ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}]) or (DataType = TFieldType(ftMSXML)) then + {$IFDEF HAVE_COMPRESS} + FParamObject := TCompressedBlob.Create; + {$ELSE} + FParamObject := {$IFDEF CLR}CoreLab.Dac.MemData.{$ENDIF}TBlob.Create; + {$ENDIF} +end; + +function TMSParam.IsObjectDataType: boolean; +begin + Result := inherited IsObjectDataType; +end; + +procedure TMSParam.AssignFieldValue(Field: TField; const Value: Variant); +var + FieldDesc: TOLEDBFieldDesc; +begin + inherited AssignFieldValue(Field, Value); + + if IsClass(Field.DataSet, TCustomMSDataSet) then begin + FieldDesc := TOLEDBFieldDesc(TCustomDADataSet(Field.DataSet).GetFieldDesc(Field)); + OLEDBType := FieldDesc.OLEDBType; + end; +end; + +{ TMSParams } + +constructor TMSParams.Create(Owner: TPersistent); +begin + inherited Create(TMSParam); + + FOwner := Owner; + FNeedsUpdateItem := True; +end; + +procedure TMSParams.Assign(Source: TPersistent); +var + i: integer; +begin + inherited; + + if Source is TMSParams then + for i := 0 to Count - 1 do + TMSParams(Source)[i].Assign(Items[i]); +end; + +function TMSParams.GetItem(Index: Integer): TMSParam; +begin + Result := inherited Items[Index] as TMSParam; +end; + +procedure TMSParams.SetItem(Index: Integer; Value: TMSParam); +begin + inherited SetItem(Index, Value); +end; + +function TMSParams.ParamByName(const Value: string): TMSParam; +begin + Result := TMSParam(inherited ParamByName(GetParamNameWODog(Value))); +end; + +function TMSParams.FindParam(const Value: string): TMSParam; +begin + Result := TMSParam(inherited FindParam(GetParamNameWODog(Value))); +end; + +{ TMSConnectionOptions } + +procedure TMSConnectionOptions.AssignTo(Dest: TPersistent); +begin + inherited; + + if Dest is TMSConnectionOptions then begin + TMSConnectionOptions(Dest).QuotedIdentifier := QuotedIdentifier; + TMSConnectionOptions(Dest).Language := Language; + TMSConnectionOptions(Dest).Encrypt := Encrypt; + TMSConnectionOptions(Dest).PersistSecurityInfo := PersistSecurityInfo; + TMSConnectionOptions(Dest).AutoTranslate := AutoTranslate; + TMSConnectionOptions(Dest).NetworkLibrary := NetworkLibrary; + TMSConnectionOptions(Dest).PacketSize := PacketSize; + TMSConnectionOptions(Dest).ApplicationName := ApplicationName; + TMSConnectionOptions(Dest).WorkstationID := WorkstationID; + TMSConnectionOptions(Dest).Provider := Provider; + TMSConnectionOptions(Dest).FailoverPartner := FailoverPartner; + end; +end; + +constructor TMSConnectionOptions.Create(Owner: TMSConnection); +begin + inherited Create(Owner); + + FQuotedIdentifier := True; + FPacketSize := DefaultPacketSize; + FAutoTranslate := True; + FProvider := prAuto; + //FMaxDatabaseSize := 128; + FFailoverPartner := ''; +end; + +procedure TMSConnectionOptions.SetEncrypt(const Value: boolean); +begin + if FEncrypt <> Value then begin + TMSConnection(FOwner).CheckInactive; + FEncrypt := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prEncrypt, Value); + end; +end; + +procedure TMSConnectionOptions.SetPersistSecurityInfo(const Value: boolean); +begin + if FPersistSecurityInfo <> Value then begin + TMSConnection(FOwner).CheckInactive; + FPersistSecurityInfo := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prPersistSecurityInfo, Value); + end; +end; + +procedure TMSConnectionOptions.SetAutoTranslate(const Value: boolean); +begin + if FAutoTranslate <> Value then begin + TMSConnection(FOwner).CheckInactive; + FAutoTranslate := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prAutoTranslate, Value); + end; +end; + +procedure TMSConnectionOptions.SetLanguage(const Value: string); +begin + if FLanguage <> Value then begin + TMSConnection(FOwner).CheckInactive; + FLanguage := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prLanguage, Value); + end; +end; + +procedure TMSConnectionOptions.SetNetworkLibrary( + const Value: string); +begin + if FNetworkLibrary <> Value then begin + TMSConnection(FOwner).CheckInactive; + FNetworkLibrary := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prNetworkLibrary, Value); + end; +end; + +procedure TMSConnectionOptions.SetApplicationName( + const Value: string); +begin + if FApplicationName <> Value then begin + TMSConnection(FOwner).CheckInactive; + FApplicationName := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prApplicationName, Value); + end; +end; + +procedure TMSConnectionOptions.SetWorkstationID( + const Value: string); +begin + if FWorkstationID <> Value then begin + TMSConnection(FOwner).CheckInactive; + FWorkstationID := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prWorkstationID, Value); + end; +end; + +procedure TMSConnectionOptions.SetPacketSize(const Value: integer); +begin + if FPacketSize <> Value then begin + TMSConnection(FOwner).CheckInactive; + FPacketSize := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prPacketSize, Value); + end; +end; + +procedure TMSConnectionOptions.SetProvider(const Value: TOLEDBProvider); +begin + if FProvider <> Value then begin + TMSConnection(FOwner).CheckInactive; + FProvider := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prProvider, Integer(Value)); + if (Value = prCompact) and (TMSConnection(FOwner).Database = DefaultSDACDatabase) then + TMSConnection(FOwner).Database := '' + else + if (Value <> prCompact) and (TMSConnection(FOwner).Database = '') then + TMSConnection(FOwner).Database := DefaultSDACDatabase; + end; +end; + +procedure TMSConnectionOptions.SetNumericType(Value: TDANumericType); +begin + if FNumericType <> Value then begin + TMSConnection(FOwner).CheckInactive; + FNumericType := Value; + end; +end; + +procedure TMSConnectionOptions.SetQuotedIdentifier(const Value: boolean); +begin + if FQuotedIdentifier <> Value then begin + // CheckInactive is not need + + FQuotedIdentifier := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prQuotedIdentifier, Value); + end; +end; + +procedure TMSConnectionOptions.SetInitialFileName(const Value: string); +begin + if FInitialFileName <> Value then begin + TMSConnection(FOwner).CheckInactive; + FInitialFileName := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prInitialFileName, Value); + end; +end; + +procedure TMSConnectionOptions.SetMultipleActiveResultSets(const Value: boolean); +begin + if FMultipleActiveResultSets <> Value then begin + TMSConnection(FOwner).CheckInactive; + FMultipleActiveResultSets := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prMARS, Value); + end; +end; + +(*procedure TMSConnectionOptions.SetMaxDatabaseFile(const Value: integer); +begin + if FMaxDatabaseSize <> Value then begin + TMSConnection(FOwner).CheckInactive; + FMaxDatabaseSize := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prMaxDatabaseSize, Value); + end; +end;*) + +procedure TMSConnectionOptions.SetFailoverPartner(const Value: string); +begin + if FFailoverPartner <> Value then begin + TMSConnection(FOwner).CheckInactive; + FFailoverPartner := Value; + if TMSConnection(FOwner).IConnection <> nil then + TMSConnection(FOwner).IConnection.SetProp(prFailoverPartner, Value); + end; +end; + +{ TMSConnection } + +constructor TMSConnection.Create(Owner: TComponent); +begin + inherited; + + FLockLoginPrompt := False; + + Database := DefaultSDACDatabase; + IsolationLevel := ilReadCommitted; + Authentication := auServer; + // MultipleConnections := True; + + ConnectionTimeout := DefaultConnectionTimeout; + FOptions := inherited Options as TMSConnectionOptions; +end; + +destructor TMSConnection.Destroy; +begin + FMSSQL.Free; + + inherited; +end; + +function TMSConnection.CreateOptions: TDAConnectionOptions; +begin + Result := TMSConnectionOptions.Create(Self); +end; + +function TMSConnection.IConnection: TOLEDBConnection; +begin + Result := TOLEDBConnection(FIConnection); +end; + +function TMSConnection.IsCaseSensitive: boolean; +begin + Result := False; +end; + +procedure TMSConnection.Check(const Status: HRESULT; Sender: TObject); +begin + Assert(FIConnection <> nil); + TOLEDBConnection(FIConnection).Check(Status, Sender); +end; + +procedure TMSConnection.CheckInactive; +begin + if Connected then + if ([csUpdating, csDesigning] * ComponentState) <> [] then + Close + else + DatabaseError(SConnectionOpen, Self); +end; + +procedure TMSConnection.InternalStartTransaction; +begin + inherited; + + if {Assigned(OnConnectionLost) and} + ((TOLEDBCOnnection(FIConnection).DBMSPrimaryVer <= 8) or (TOLEDBCOnnection(FIConnection).ProviderPrimaryVer <= 8))and + not (Options.Provider = prCompact) then begin + FTransactionID := ''; + ExecSQL(SCheckConnection, []); + end; + FTransactionID := 'Local'; +end; + + +function TMSConnection.CommitOnDisconnect: boolean; +begin + Result := False; +end; + +function TMSConnection.GetConnectString: string; + + procedure AddParam(const ParamName: string; const Value: string; const DefValue: string); + begin + if Value <> DefValue then begin + if Result <> '' then + Result := Result + ';'; + Result := Result + ParamName + '=' + Value; + end; + end; + +begin + Result := ''; + + /// list of supported parameters must be syncronized with SetConnectString (ProcessParam and set param to default) + if Options.FProvider <> prAuto then + AddParam('Provider', GetProviderName(Options.FProvider), ''); + AddParam('User ID', UserName, ''); + AddParam('Password', Password, ''); + if Options.Provider <> prCompact then begin + AddParam('Data Source', Server, ''); + AddParam('Initial Catalog', Database, DefaultSDACDatabase); + end + else + AddParam('Data Source', '"' + Database + '"', ''); + AddParam('Connect Timeout', IntToStr(ConnectionTimeout), IntToStr(DefaultConnectionTimeout)); + AddParam('Use Encryption for Data', BoolToStr(Options.Encrypt, True), 'False'); + AddParam('Persist Security Info', BoolToStr(Options.PersistSecurityInfo, True), 'False'); + AddParam('Auto Translate', BoolToStr(Options.AutoTranslate, True), 'True'); + AddParam('Packet Size', IntToStr(Options.PacketSize), IntToStr(DefaultPacketSize)); + AddParam('Application Name', Options.ApplicationName, ''); + AddParam('Workstation ID', Options.WorkstationID, ''); + AddParam('Current Language', Options.Language, ''); + AddParam('Network Library', Options.NetworkLibrary, ''); + if Options.InitialFileName <> '' then + AddParam('AttachDBFileName', Options.InitialFileName, ''); + AddParam('MultipleActiveResultSets', BoolToStr(Options.MultipleActiveResultSets, True), 'False'); + //AddParam('Max Database Size', IntToStr(Options.MaxDatabaseSize), '128'); + if Options.FailoverPartner <> '' then + AddParam('Failover Partner', Options.FailoverPartner, ''); + + if Authentication = auWindows then + Result := Result + ';Integrated Security=SSPI'; + +{ if Password <> '' then + Result := Result + ';Persist Security Info=True';} + +end; + +procedure TMSConnection.SetConnectString(Value: string); +var + IntegratedSecuritySSPI: boolean; + + procedure ParseIniString; + procedure ProcessParam(const paramName, paramValue: string); + function Recognized(const Args: array of string): boolean; + var + i: integer; + begin + Result := False; + for i := 0 to Length(Args) - 1 do begin + Result := SameText(paramName, Args[i]); + if Result then + Break; + end; + end; + + var + s: string; + + begin + /// list of supported parameters must be syncronized with GetConnectString and dbxsda.ParseIniString + if Recognized(['Provider']) then begin + s := UpperCase(paramValue); + if (s <> SSQLOLEDB) and (s <> SSQLNativeClient) and (s <> SSQLEverywhere) then + raise Exception.CreateFmt(SBadParamValue, [paramName, paramValue]); + Options.Provider := GetProvider(s); + end + else + if Recognized(['User ID', 'UID', 'Username']) then + UserName := paramValue + else + if Recognized(['Password', 'PWD']) then + Password := paramValue + else + if Recognized(['Data Source', 'Server']) then begin + if Options.Provider <> prCompact then + Server := paramValue + else + Database := paramValue; + end + else + if Recognized(['Initial Catalog', 'Database']) then + Database := paramValue + else + if Recognized(['Connect Timeout', 'ConnectTimeout', 'Timeout']) then + ConnectionTimeout := StrToInt(paramValue) + else + if Recognized(['Use Encryption for Data', 'Encryption', 'Encrypt']) then + Options.Encrypt := {$IFDEF VER6}MemUtils.{$ENDIF}StrToBool(paramValue) + else + if Recognized(['PersistSecurityInfo', 'Persist Security Info']) then + Options.PersistSecurityInfo := {$IFDEF VER6}MemUtils.{$ENDIF}StrToBool(paramValue) + else + if Recognized(['AutoTranslate', 'Auto Translate']) then + Options.AutoTranslate := {$IFDEF VER6}MemUtils.{$ENDIF}StrToBool(paramValue) + else + if Recognized(['Packet Size', 'PacketSize']) then + Options.PacketSize := StrToInt(paramValue) + else + if Recognized(['Current Language', 'Language']) then + Options.Language := paramValue + else + if Recognized(['Network Library', 'Network', 'NetworkLibrary', 'NetLibrary']) then + Options.NetworkLibrary := paramValue + else + if Recognized(['ApplicationName', 'Application Name', 'AppName']) then + Options.ApplicationName := paramValue + else + if Recognized(['WorkstationID', 'Workstation ID', 'WSID']) then + Options.WorkstationID := paramValue + else + if Recognized(['Integrated Security', 'Trusted_Connection']) then begin + if paramValue = 'SSPI' then + IntegratedSecuritySSPI := True + else + if not TryStrToBool(paramValue, IntegratedSecuritySSPI) then + raise Exception.CreateFmt(SBadParamValue, [paramName, paramValue]); + end + else + if Recognized(['AttachDBFileName', 'InitialFileName', 'InitFileName']) then + Options.InitialFileName := paramValue + else + if Recognized(['MultipleActiveResultSets', 'Multiple Active Result Sets', 'MARS Connection', 'MARS']) then + Options.MultipleActiveResultSets := {$IFDEF VER6}MemUtils.{$ENDIF}StrToBool(paramValue) + else + //if Recognized(['Max Database Size']) then + // Options.MaxDatabaseSize := StrToInt(paramValue) + //else + if Recognized(['Failover Partner', 'Failover_Partner']) then + Options.FailoverPartner := paramValue + else + if Recognized([ + 'Persist Security Info', + 'Use Procedure for Prepare', + 'Asynchronous Connection', + 'Client Failover', + 'Tag with column collation when possible']) then + // ignored + else + raise Exception.CreateFmt(SParamNameUnknown, [paramName]); + end; + + var + i, l: integer; + cs: string; + inString, inValue, allowSpaces: boolean; + newIndex, startIndex: integer; + paramName, paramValue: string; + csLength: integer; + + begin + cs := Trim(Value); + + // parse connection string + startIndex := 1; + paramName := ''; + paramValue := ''; + + csLength := Length(cs); + + while startIndex < csLength do begin + // look for param name + newIndex := PosEx('=', cs, startIndex); + if newIndex > 0 then begin + paramName := Trim(Copy(cs, startIndex, newIndex - startIndex)); + if paramName = '' then + raise Exception.Create(SParamNameMissing); + end; + + // look for param value + inString := False; + inValue := False; // Shows that we are parsing non-quoted value. Must be single word. + allowSpaces := True; // Brought in to avoid two-word non-quoted values. + + for i := newIndex + 1 to csLength do begin + if cs[i] = '"' then + inString := not inString + else + if not inString then begin + if cs[i] = ';' then begin + paramValue := Trim(Copy(cs, newIndex + 1, i - newIndex - 1)); + break; + end + else + if cs[i] <= ' ' then begin + if inValue then + // no more spaces are allowed + allowSpaces := False; + end + else + // check whether char is valid for non-quoted param value + case cs[i] of + '!'..'/', '\', '_', '@', '0'..'9', 'a'..'z', 'A'..'Z': + begin + inValue := True; + if not allowSpaces then + raise Exception.Create(SInvalidChar); + end + else + raise Exception.Create(SInvalidChar); + end; + end; + + if i = csLength then + paramValue := Trim(Copy(cs, newIndex + 1, i - newIndex)); + end; + + if paramValue = '' then + raise Exception.Create(SParamValueMissing); + + l := Length(paramValue); + if (l >= 2) and (paramValue[1] = '"') and (paramValue[l] = '"') then + paramValue := Trim(Copy(paramValue, 2, l - 2)); + + ProcessParam(paramName, paramValue); + + startIndex := i + 1; + end; + end; + +var + OldCS: string; + +begin + OldCS := ConnectString; + try + UserName := ''; + Password := ''; + Server := ''; + Database := DefaultSDACDatabase; + // bug in editor - ConnectionTimeout is not returned; + // ConnectionTimeout := DefaultConnectionTimeout; + Options.Encrypt := False; + Options.PersistSecurityInfo := False; + Options.AutoTranslate := True; + Options.PacketSize := DefaultPacketSize; + Options.Language := ''; + Options.NetworkLibrary := ''; + Options.Provider := prAuto; + Options.InitialFileName := ''; + Options.MultipleActiveResultSets := False; + Authentication := auServer; + //Options.MaxDatabaseSize := 128; + Options.FailoverPartner := ''; + + IntegratedSecuritySSPI := False; + ParseIniString; + + if IntegratedSecuritySSPI then + Authentication := auWindows; + except + ConnectString := OldCS; + raise; + end; +end; + +procedure TMSConnection.CreateIConnection; +var + CRConnection: TCRConnection; +begin + if FIConnection <> nil then + Exit; + + CRConnection := GetOLEDBConnection; + SetIConnection(CRConnection); +end; + +procedure TMSConnection.SetIConnection(Value: TCRConnection); +begin + inherited; + + FIConnection := Value as TOLEDBConnection; + + Database := FDatabase; // To prevent empty value + if FIConnection <> nil then + TOLEDBConnection(FIConnection).OnInfoMessage := DoInfoMessage; +end; + +function TMSConnection.GetIConnectionClass: TCRConnectionClass; +begin + Result := TOLEDBConnection; +end; + +function TMSConnection.GetICommandClass: TCRCommandClass; +begin + Result := TOLEDBCommand; +end; + +function TMSConnection.GetIRecordSetClass: TCRRecordSetClass; +begin + Result := TOLEDBRecordSet; +end; + +procedure TMSConnection.SetOptions(Value: TMSConnectionOptions); +begin + FOptions.Assign(Value); +end; + +function TMSConnection.GetOLEDBConnection: TOLEDBConnection; +var + ConnectionParameters: TMSConnectionParameters; +begin + if Pooling then begin + ConnectionParameters := TMSConnectionParameters.Create; + try + ConnectionParameters.MinPoolSize := PoolingOptions.MinPoolSize; + ConnectionParameters.MaxPoolSize := PoolingOptions.MaxPoolSize; + ConnectionParameters.ConnectionLifeTime := PoolingOptions.ConnectionLifetime; + ConnectionParameters.Validate := PoolingOptions.Validate; + ConnectionParameters.Username := Username; + ConnectionParameters.Server := Server; + ConnectionParameters.Password := Password; + + ConnectionParameters.Database := Database; + ConnectionParameters.IsolationLevel := IsolationLevel; + ConnectionParameters.Authentication := Authentication; + + ConnectionParameters.QuotedIdentifier := Options.QuotedIdentifier; + ConnectionParameters.Language := Options.Language; + ConnectionParameters.Encrypt := Options.Encrypt; + ConnectionParameters.PersistSecurityInfo := Options.PersistSecurityInfo; + ConnectionParameters.AutoTranslate := Options.AutoTranslate; + ConnectionParameters.NetworkLibrary := Options.NetworkLibrary; + ConnectionParameters.ApplicationName := Options.ApplicationName; + ConnectionParameters.WorkstationID := Options.WorkstationID; + ConnectionParameters.PacketSize := Options.PacketSize; + ConnectionParameters.Provider := Options.FProvider; + Result := TMSConnectionPoolManager.GetConnection(ConnectionParameters) as TOLEDBConnection; + finally + ConnectionParameters.Free; + end; + end + else + begin + Result := TOLEDBConnection.Create; + Result.SetProp(prDatabase, FDatabase); + Result.SetProp(prIsolationLevel, Integer(FIsolationLevel)); + Result.SetProp(prAuthentication, Integer(FAuthentication)); + Result.SetProp(prConnectionTimeout, FConnectionTimeout); + + if FOptions <> nil then begin + Result.SetProp(prQuotedIdentifier, FOptions.FQuotedIdentifier); + Result.SetProp(prLanguage, FOptions.FLanguage); + Result.SetProp(prEncrypt, FOptions.FEncrypt); + Result.SetProp(prPersistSecurityInfo, FOptions.FPersistSecurityInfo); + Result.SetProp(prAutoTranslate, FOptions.FAutoTranslate); + Result.SetProp(prNetworkLibrary, FOptions.FNetworkLibrary); + Result.SetProp(prApplicationName, FOptions.FApplicationName); + Result.SetProp(prWorkstationID, FOptions.FWorkstationID); + Result.SetProp(prPacketSize, FOptions.FPacketSize); + Result.SetProp(prProvider, Integer(FOptions.FProvider)); + Result.SetProp(prInitialFileName, FOptions.FInitialFileName); + Result.SetProp(prMARS, FOptions.FMultipleActiveResultSets); + //Result.SetProp(prMaxDatabaseSize, FOptions.FMaxDatabaseSize); + Result.SetProp(prFailoverPartner, FOptions.FFailoverPartner); + end; + + // FIConnection.SetProp(prMultipleConnections, @FMultipleConnections); + end; + + if FIConnection <> nil then + Result.Assign(FIConnection as TOLEDBConnection); +end; + +procedure TMSConnection.AssignTo(Dest: TPersistent); +begin + inherited AssignTo(Dest); + + if Dest is TMSConnection then begin + TMSConnection(Dest).Database := Database; + TMSConnection(Dest).IsolationLevel := IsolationLevel; + TMSConnection(Dest).Authentication := Authentication; + end; +end; + +procedure TMSConnection.SetDatabase(Value: string); +begin + if (Value <> Database) and (Options <> nil) and (Options.Provider = prCompact) then + Disconnect; + + if Value = '' then + if (Options <> nil) and (Options.Provider = prCompact) then + Value := '' + else + Value := DefaultSDACDatabase; + + if Value <> Database then begin + FDatabase := Value; + + if (Options <> nil) and (Options.Provider = prCompact) and + (csDesigning in ComponentState) and (Value <> '') and (Value[1] = '.') and (CurrentProjectOutputDir <> '') then + Value := IncludeTrailingBackslash(CurrentProjectOutputDir) + Value; + + if FIConnection <> nil then + FIConnection.SetProp(prDatabase, Value); + end; +end; + +function TMSConnection.CreateDataSet: TCustomDADataSet; +begin + Result := TCustomMSDataSet.Create(nil); + TCustomMSDataSet(Result).SetDesigning(csDesigning in ComponentState); + Result.Connection := Self; +end; + +function TMSConnection.CreateSQL: TCustomDASQL; +begin + Result := TMSSQL.Create(nil); + TMSSQL(Result).SetDesigning(csDesigning in ComponentState); + Result.Connection := Self; +end; + +function TMSConnection.GetClientVersion: string; +begin + Connect; + Assert(FIConnection <> nil); + Result := IConnection.ProviderVer; +end; + +function TMSConnection.GetServerVersion: string; +begin + Connect; + Assert(FIConnection <> nil); + Result := IConnection.DBMSVer; +end; + +procedure TMSConnection.ChangePassword(NewPassword: string); +var + OldConnected: boolean; + OldPassword: string; + OldLoginPrompt: boolean; +begin + OldConnected := Connected; + OldPassword := Password; + OldLoginPrompt := LoginPrompt; + try + if not Connected then + CreateIConnection + else + Disconnect; + LoginPrompt := False; + Assert(FIConnection <> nil); + FIConnection.SetProp(prOldPassword, Password); + Password := NewPassword; + try + Connect; + except + Password := OldPassword; + raise; + end; + finally + Assert(FIConnection <> nil); + FIConnection.SetProp(prOldPassword, ''); + LoginPrompt := OldLoginPrompt; + if not OldConnected then + Disconnect; + end; +end; + +function TMSConnection.ExecSQL(Text: string; const Params: array of variant): variant; +var + i: integer; + Param: TParam; +begin + if FMSSQL = nil then + FMSSQL := CreateSQL as TMSSQL; + + FMSSQL.SQL.Text := ''; // drop params from previous sql + FMSSQL.SQL.Text := Text; + + for i := 0 to FMSSQL.ParamCount - 1 do + if i <= High(Params) then + FMSSQL.Params[i].Value := Params[i] + else + FMSSQL.Params[i].Value := Null; + + Param := FMSSQL.FindParam('Result'); + if Param <> nil then + if Param.DataType = ftUnknown then + Param.DataType := ftInteger; + + FMSSQL.Execute; + + if Param <> nil then + Result := Param.Value + else + Result := Null; +end; + +procedure TMSConnection.GetTableNames(List: TStrings); +var + MDDS: TMSMetadata; + + procedure AddNamesToList; + var + NameFld: TStringField; + SchemaFld: TStringField; + begin + MDDS.Open; + + NameFld := MDDS.FieldByName('TABLE_NAME') as TStringField; + SchemaFld := nil; + if Options.Provider <> prCompact then + SchemaFld := MDDS.FieldByName('TABLE_SCHEMA') as TStringField; + while not MDDS.Eof do begin + if (SchemaFld <> nil) and (SchemaFld.Value <> '') then + List.Add(SchemaFld.Value + '.' + NameFld.Value) + else + List.Add(NameFld.Value); + MDDS.Next; + end; + end; + +begin + List.Clear; + MDDS := nil; + try + MDDS := TMSMetadata.Create(nil); + MDDS.Connection := Self; + MDDS.DatabaseName := MDDS.Connection.Database; + + MDDS.ObjectType := otTables; + AddNamesToList; + + if Options.Provider <> prCompact then begin + MDDS.ObjectType := otViews; + AddNamesToList; + end; + + if List is TStringList then + TStringList(List).Sort; + finally + MDDS.Free; + end; +end; + +procedure TMSConnection.GetDatabaseNames(List: TStrings); +var + MDDS: TMSMetadata; + NameFld: TStringField; +begin + List.Clear; + + if Options.Provider = prCompact then + Exit; + + MDDS := nil; + try + MDDS := TMSMetadata.Create(nil); + MDDS.Connection := Self; + MDDS.ObjectType := otDatabases; + + try + MDDS.Open; + except + on E: EMSError do begin + if E.ErrorCode = 4060 then + Database := ''; + raise; + end; + end; + + NameFld := MDDS.FieldByName('CATALOG_NAME') as TStringField; + while not MDDS.Eof do begin + List.Add(NameFld.Value); + MDDS.Next + end; + + if List is TStringList then + TStringList(List).Sort; + finally + MDDS.Free; + end; +end; + +procedure TMSConnection.GetStoredProcNames(List: TStrings); +var + MDDS: TMSMetadata; + NameFld: TStringField; +begin + List.Clear; + + if Options.Provider = prCompact then + Exit; + + MDDS := nil; + try + MDDS := TMSMetadata.Create(nil); + MDDS.Connection := Self; + MDDS.ObjectType := otStoredProcs; + + try + MDDS.Open; + except + on E: EMSError do begin + if E.ErrorCode = 4060 then + Database := ''; + raise; + end; + end; + + NameFld := MDDS.FieldByName('PROCEDURE_NAME') as TStringField; + while not MDDS.Eof do begin + List.Add(NameFld.Value); + MDDS.Next + end; + + if List is TStringList then + TStringList(List).Sort; + finally + MDDS.Free; + end; +end; + +procedure TMSConnection.GetStoredProcNames(List: TStrings; System: boolean); +var + Query: TMSQuery; + NameFld: TStringField; +begin + if System then + GetStoredProcNames(List) + else + begin + List.Clear; + + if Options.Provider = prCompact then + Exit; + + Query := TMSQuery.Create(nil); + try + Query.Connection := Self; + Query.SQL.Clear; + Query.SQL.Add('SELECT name FROM sysobjects'); + Query.SQL.Add('WHERE OBJECTPROPERTY(id, N''IsProcedure'') = 1 or OBJECTPROPERTY(id, N''IsExtendedProc'') = 1'); + Query.SQL.Add('ORDER BY name'); + try + Query.Open; + except + on E: EMSError do begin + if E.ErrorCode = 4060 then + Database := ''; + raise; + end; + end; + + NameFld := Query.FieldByName('name') as TStringField; + while not Query.Eof do begin + List.Add(NameFld.Value); + Query.Next; + end; + finally + Query.Free; + end; + end; +end; + +function TMSConnection.SQLMonitorClass: TClass; +begin + Result := TMSSQLMonitor; +end; + +function TMSConnection.ConnectDialogClass: TConnectDialogClass; +begin + if Assigned(DefConnectDialogClassProc) then + Result := TConnectDialogClass(DefConnectDialogClassProc) + else + Result := nil; +end; + +procedure TMSConnection.SetIsolationLevel(const Value: TIsolationLevel); +begin + if FIsolationLevel <> Value then begin + FIsolationLevel := Value; + if FIConnection <> nil then + FIConnection.SetProp(prIsolationLevel, Integer(Value)); + end; +end; +{ +procedure TMSConnection.SetMultipleConnections(const Value: boolean); +begin + if FMultipleConnections <> Value then begin + FMultipleConnections := Value; + Assert(TOLEDBConnection(FIConnection) <> nil); + FIConnection.SetProp(prMultipleConnections, @Value); + end; +end;} + +procedure TMSConnection.SetAuthentication(const Value: TMSAuthentication); +begin + if FAuthentication <> Value then begin + Disconnect; + FAuthentication := Value; + if FIConnection <> nil then + FIConnection.SetProp(prAuthentication, Integer(Value)); + end; +end; + +procedure TMSConnection.SetConnectionTimeout(const Value: integer); +begin + if FConnectionTimeout <> Value then begin + FConnectionTimeout := Value; + if FIConnection <> nil then + FIConnection.SetProp(prConnectionTimeout, Value); + end; +end; + +function TMSConnection.NeedPrompt: boolean; +begin + Result := False; + if Authentication = auWindows then + Exit; + + if Options.Provider = prCompact then + Exit; + + Result := not FLockLoginPrompt and + (LoginPrompt or (csDesigning in ComponentState) and + ((Username = '') and (Password = ''))) and + not ((csDesigning in ComponentState) and ((csReading in ComponentState) or FStreamedConnected)) +end; + +function TMSConnection.IsFatalError(E: EDAError): boolean; +begin + if E is EMSError then + with EMSError(E) do begin + Result := SeverityClass >= 20; {fatal error} + if not Result then + Result := + ((SeverityClass = 16) and (State = 1) and (MSSQLErrorCode <= NE_MAX_NETERROR)) // Network Library + or + ((SeverityClass = 10) and (State = 1) and (MSSQLErrorCode = WSAECONNRESET)) // Win sockets + or + ((SeverityClass = 16) and (State = 1) and (MSSQLErrorCode = WSAECONNRESET)) // Win sockets + or + ((SeverityClass = 16) and (State = 1) and (MSSQLErrorCode = ERROR_PIPE_NOT_CONNECTED)) // Named pipes + or + ((SeverityClass = 16) and (State = 1) and (MSSQLErrorCode = ERROR_NETNAME_DELETED)); // Named pipes + end + else + Result := inherited IsFatalError(E); +end; + +procedure TMSConnection.DoError(E: Exception; var Fail, Reconnect, Reexecute: boolean; + ReconnectAttempt: integer; var ConnLostCause: TConnLostCause); +var + i: integer; +begin + inherited; + + if Reconnect then + for i := 0 to DataSetCount - 1 do begin // Check underfetched data + Assert(DataSets[i] is TCustomMSDataSet); + if TCustomMSDataSet(DataSets[i]).FIRecordSet.GetIRowset <> nil then begin + Reconnect := False; + Exit; + end; + end; +end; + +procedure TMSConnection.DoInfoMessage(E: EMSError); +begin + TMSSQLMonitorClass(SQLMonitorClass).InfoMessage(Self, E.Message); + + if Assigned(FOnInfoMessage) then + FOnInfoMessage(Self, E); +end; + +function TMSConnection.IsKeyViolation(E: EDAError): boolean; +begin + if E is EMSError then + Result := (E.ErrorCode = 2627{Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'.}) + else + Result := inherited IsKeyViolation(E); +end; + +{TMSDataSetOptions} + +constructor TMSDataSetOptions.Create(Owner: TCustomDADataSet); +begin + inherited Create(Owner); + + LongStrings := True; + RequiredFields := False; + EnableBCD := False; + UniqueRecords := False; + CursorUpdate := True; + QueryIdentity := True; + CheckRowVersion := False; + FullRefresh := False; + DMLRefresh := False; + FAutoRefresh := False; + FAutoRefreshInterval := 60; + FSmartRefresh := False; + FDefaultValues := False; + FNonBlocking := False; +end; + +procedure TMSDataSetOptions.SetEnableBCD(Value: boolean); +begin + if FEnableBCD <> Value then begin + TCustomMSDataSet(FOwner).CheckInactive; + FEnableBCD := Value; + TCustomMSDataSet(FOwner).SetNumericType; + end; +end; + +procedure TMSDataSetOptions.SetUniqueRecords(Value: boolean); +begin + if FUniqueRecords <> Value then begin + TCustomMSDataSet(FOwner).CheckInactive; + TCustomMSDataSet(FOwner).FieldDefs.Updated := False; + FUniqueRecords := Value; + TCustomMSDataSet(FOwner).FIRecordSet.SetProp(prUniqueRecords, FUniqueRecords); + TCustomMSDataSet(FOwner).FIRecordSet.SetProp(prRequestSQLObjects, FUniqueRecords or not FOwner.ReadOnly); + FOwner.FieldDefs.Updated := False; + end; +end; + +procedure TMSDataSetOptions.SetCursorUpdate(Value: boolean); +begin + if FCursorUpdate <> Value then begin + TCustomMSDataSet(FOwner).CheckInactive; + TCustomMSDataSet(FOwner).FieldDefs.Updated := False; + FCursorUpdate := Value; + TCustomMSDataSet(FOwner).FIRecordSet.SetProp(prCursorUpdate, FCursorUpdate); + end; +end; + +function TMSDataSetOptions.GetAllFieldsEditable: boolean; +begin + Result := not SetFieldsReadOnly; +end; + +procedure TMSDataSetOptions.SetAllFieldsEditable(const Value: boolean); +begin + SetFieldsReadOnly := not Value; +end; + +procedure TMSDataSetOptions.SetAutoRefresh(Value: boolean); +begin + if FAutoRefresh <> Value then begin + FAutoRefresh := Value; + if not (csDesigning in FOwner.ComponentState) then + TCustomMSDataSet(FOwner).FAutoRefreshTimer.Enabled := Value; + end; +end; + +procedure TMSDataSetOptions.SetAutoRefreshInterval(Value: integer); +begin + if FAutoRefreshInterval <> Value then begin + FAutoRefreshInterval := Value; + TCustomMSDataSet(FOwner).FAutoRefreshTimer.Interval := Value * MSecsPerSec; + end; +end; + +(*procedure TMSDataSetOptions.SetSmartRefresh(Value: boolean); +begin + if FSmartRefresh <> Value then begin + TCustomMSDataSet(FOwner).CheckInactive; + + FSmartRefresh := Value; + + TCustomMSDataSet(FOwner).FIRecordSet.SetProp(prSmartRefresh, FSmartRefresh); + if FSmartRefresh then + TCustomMSDataSet(FOwner).FIRecordSet.SetProp(prSmartRefreshMsg, GetComponentName(FOwner)); + end; +end;*) + +procedure TMSDataSetOptions.SetNonBlocking(Value: boolean); +begin + if FNonBlocking <> Value then begin + TCustomMSDataSet(FOwner).CheckInactive; + FNonBlocking := Value; + TCustomMSDataSet(FOwner).FIRecordSet.SetProp(prNonBlocking, FNonBlocking); + end; +end; + +procedure TMSDataSetOptions.AssignTo(Dest: TPersistent); +begin + inherited; + + if Dest is TMSDataSetOptions then begin + TMSDataSetOptions(Dest).LongStrings := LongStrings; + TMSDataSetOptions(Dest).EnableBCD := EnableBCD; + TMSDataSetOptions(Dest).UniqueRecords := UniqueRecords; + TMSDataSetOptions(Dest).AllFieldsEditable := AllFieldsEditable; + TMSDataSetOptions(Dest).CursorUpdate := CursorUpdate; + TMSDataSetOptions(Dest).FullRefresh := FullRefresh; + TMSDataSetOptions(Dest).DMLRefresh := DMLRefresh; + TMSDataSetOptions(Dest).AutoRefresh := AutoRefresh; + TMSDataSetOptions(Dest).AutoRefreshInterval := AutoRefreshInterval; + //TMSDataSetOptions(Dest).SmartRefresh := SmartRefresh; + end; +end; + +{ TMSSQLGenerator } + +function TMSSQLGenerator.GetActualFieldNameEx(FieldDesc: TCRFieldDesc; TableInfo: TCRTableInfo): string; +var + p: integer; +begin + Result := TOLEDBFieldDesc(FieldDesc).BaseColumnName; + if (FieldDesc.TableInfo = TableInfo) or (FieldDesc.TableInfo.TableName = TableInfo.TableName) then begin + p := Pos('.', Result); + if p <> 0 then + Result := Copy(Result, p + 1, MaxInt);{Delete table name from fieldname} + end; +end; + +function TMSSQLGenerator.AssembleSB(const StatementType: TStatementType): string; +begin + if TCustomMSDataSet(FOwner).Options.DMLRefresh and (StatementType = stInsert) then + Result := + FHeaderSB.ToString + + FFldSB.ToString + + FMiddleSB.ToString + + FFldParamSB.ToString + + FFooterSB.ToString + + FCondSB.ToString + else + Result := inherited AssembleSB(StatementType); +end; + +procedure TMSSQLGenerator.GenerateInsertSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); +var + Field, IdentityField: TField; + FieldDesc: TCRFieldDesc; + i: integer; + ActualName: string; + AIConnection: TOLEDBConnection; + IsFirstParam: boolean; +begin + inherited; + + if FFldSB.Length = 0 then begin + AIConnection := TMSAccessUtils.FIConnection(TMSConnection(FOwner.Connection)); + if (AIConnection <> nil) and (AIConnection.ProviderPrimaryVer <> 3) then begin + Clear; + FHeaderSB.Append('INSERT INTO '); + FHeaderSB.Append(FTableInfo.NormalizeName(FTableInfo.TableNameFull, FOwner.Options.QuoteNames)); + FHeaderSB.Append(' DEFAULT VALUES'); + end + else begin + for i := 0 to High(KeyAndDataFields.DataFieldDescs) do begin + FieldDesc := KeyAndDataFields.DataFieldDescs[i]; + Field := FOwner.GetField(FieldDesc); + Assert(Field <> nil); + if not Field.ReadOnly then begin + ActualName := GetActualFieldName(FieldDesc, False); + + if FFldSB.Length > 0 then begin + FFldSB.Append(', '); + FFldParamSB.Append(', '); + end; + FFldSB.Append(ActualName); + FFldParamSB.Append('DEFAULT'); + end; + end; + end; + end; + + if TCustomMSDataSet(FOwner).CursorType = ctDefaultResultSet then begin + { Getting Identity value } + if TCustomMSDataSet(FOwner).Options.QueryIdentity and (TOLEDBConnection(TCustomMSDataSet(FOwner).Connection.IConnection).DBMSPrimaryVer <> 3) then begin + IdentityField := TDBAccessUtils.GetIdentityField(FOwner); + if IdentityField <> nil then begin + // Warning - Identity param must be last in param list, see SetIdentityParam + // Warning - If in 'INSERT ...' statement present sql_variant value then adding 'SET ...' fails statement + // Warning - TOLEDBFieldDesc(GetFieldDescByField(FIdentityField)).BaseColumnName cannot be used (for example see gettting identity on INSERT into View) + + FFooterSB.Append(#$D#$A'SET '); + TCustomMSDataSet(FOwner).FUseParamType := True; + AddParam(FFooterSB, FOwner.GetFieldDesc(IdentityField), stInsert, ptInputOutput); + + if TOLEDBConnection(TCustomMSDataSet(FOwner).Connection.IConnection).DBMSPrimaryVer > 7 then + FFooterSB.Append(' = SCOPE_IDENTITY()') + else + FFooterSB.Append(' = @@Identity'); + end; + end; + + { DMLRefresh } + if TCustomMSDataSet(FOwner).Options.DMLRefresh then begin + IsFirstParam := True; + for i := 0 to High(KeyAndDataFields.DataFieldDescs) do begin + FieldDesc := KeyAndDataFields.DataFieldDescs[i]; + Field := FOwner.GetField(FieldDesc); + Assert(Field <> nil); + if not Field.ReadOnly then begin + if not IsFirstParam then + FFooterSB.Append(', ') + else + FFooterSB.Append(LineSeparator + 'SELECT '); + IsFirstParam := False; + TCustomMSDataSet(FOwner).FUseParamType := True; + AddParam(FFooterSB, FieldDesc, stRefresh, ptInputOutput); + FFooterSB.Append(' = ' + QuoteName(TOLEDBFieldDesc(FieldDesc).BaseColumnName)); + end; + end; + if not IsFirstParam then begin + FFooterSB.Append(' FROM ' + FTableInfo.NormalizeName(FTableInfo.TableNameFull, FOwner.Options.QuoteNames) + + LineSeparator + 'WHERE' + LineSeparator + ' '); + GenerateConditions(FCondSB, stInsert, ModifiedFieldsOnly, KeyAndDataFields); + end; + end; + end; +end; + +procedure TMSSQLGenerator.GenerateUpdateSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); +var + Field: TField; + FieldDesc: TCRFieldDesc; + i: integer; + IsFirstParam: boolean; + OldCondSB: StringBuilder; +begin + inherited; + + if TCustomMSDataSet(FOwner).CursorType = ctDefaultResultSet then begin + { DMLRefresh } + if (FFldSB.Length > 0) and TCustomMSDataSet(FOwner).Options.DMLRefresh then begin + FFooterSB.Append(LineSeparator); + FFooterSB.Append('SELECT '); + IsFirstParam := True; + for i := 0 to High(KeyAndDataFields.DataFieldDescs) do begin + FieldDesc := KeyAndDataFields.DataFieldDescs[i]; + Field := FOwner.GetField(FieldDesc); + if not Field.ReadOnly then begin + if not IsFirstParam then + FFooterSB.Append(', '); + IsFirstParam := False; + TCustomMSDataSet(FOwner).FUseParamType := True; + AddParam(FFooterSB, FieldDesc, stRefresh, ptInputOutput); + FFooterSB.Append(' = ' + QuoteName(TOLEDBFieldDesc(FieldDesc).BaseColumnName)); + end; + end; + FFooterSB.Append(' FROM '); + FFooterSB.Append(FTableInfo.NormalizeName(FTableInfo.TableNameFull, FOwner.Options.QuoteNames)); + FFooterSB.Append(LineSeparator); + FFooterSB.Append('WHERE'); + FFooterSB.Append(LineSeparator); + FFooterSB.Append(' '); + OldCondSB := FCondSB; + try + FCondSB := StringBuilder.Create; + try + GenerateConditions(FCondSB, stUpdate, ModifiedFieldsOnly, KeyAndDataFields); + FFooterSB.Append(FCondSB.ToString); + finally + FCondSB.Free; + end; + finally + FCondSB := OldCondSB; + end; + end; + end; +end; + +procedure TMSSQLGenerator.GenerateRefreshSQLSelectPart(const KeyAndDataFields: TKeyAndDataFields); +var + Field: TField; + FieldDesc: TOLEDBFieldDesc; + TableName: string; + UseDataFields: boolean; + FieldArrHigh: integer; +begin + inherited; + + if TCustomMSDataSet(FOwner).FTimestampField <> nil then begin + UseDataFields := Length(KeyAndDataFields.DataFieldDescs) + Length(KeyAndDataFields.DataFieldDescs) > 0; + if UseDataFields then + FieldArrHigh := Length(KeyAndDataFields.DataFieldDescs) + Length(KeyAndDataFields.DataFieldDescs) - 1 + else + FieldArrHigh := High(KeyAndDataFields.KeyFieldDescs); + + if FieldArrHigh >= 0 then + FFldSB.Append(', '); + Field := TCustomMSDataSet(FOwner).FTimestampField; + FieldDesc := TOLEDBFieldDesc(FOwner.GetFieldDesc(Field)); + TableName := GenerateTableName(FieldDesc.BaseCatalogName, FieldDesc.BaseSchemaName, FieldDesc.BaseTableName, TCustomMSDataSet(FOwner).Connection.Database); + if TableName = '' then + FFldSB.Append(QuoteName(FieldDesc.ActualName)) + else + if FieldDesc.TableInfo.TableAlias <> '' then + FFldSB.Append(FieldDesc.TableInfo.NormalizeName(FieldDesc.TableInfo.TableAlias, FOwner.Options.QuoteNames) + + '.' + QuoteName(FieldDesc.BaseColumnName)) + else + FFldSB.Append(FieldDesc.TableInfo.NormalizeName(FieldDesc.TableInfo.TableName, FOwner.Options.QuoteNames) + + '.' + QuoteName(FieldDesc.BaseColumnName)); + + if not (csDesigning in FOwner.ComponentState) then + FFldSB.Append(' AS ' + GenerateIndexName(IntToStr(TCustomMSDataSet(FOwner).FIRecordSet.Fields.IndexOf(FieldDesc)))); + end; +end; + +procedure TMSSQLGenerator.GenerateRefreshSQL( + const KeyAndDataFields: TKeyAndDataFields; + const ModifiedFieldsOnly: boolean); + + procedure GenerateSPFullRefreshSQL; + var + i: integer; + Field: TField; + FieldDesc: TOLEDBFieldDesc; + TableName: string; + TblNames: TStringList; + begin + TblNames := TStringList.Create; + try + // SELECT ... FROM ... WHERE ... {WITH NOLOCK} + // Add SELECT section + FHeaderSB.Append('SELECT '); + for i := 0 to FOwner.Fields.Count - 1 do begin + Field := FOwner.Fields[i]; + if Field.FieldKind = fkData then begin + FieldDesc := TOLEDBFieldDesc(FOwner.GetFieldDesc(Field)); + + TableName := GenerateTableName(FieldDesc.BaseCatalogName, FieldDesc.BaseSchemaName, FieldDesc.BaseTableName, TCustomMSDataSet(FOwner).Connection.Database); + if TblNames.IndexOf(TableName) = - 1 then + TblNames.Add(TableName); + + FHeaderSB.Append(TableName + '.' + FieldDesc.Name); + if not (csDesigning in FOwner.ComponentState) then + FHeaderSB.Append(' AS _' + IntToStr(TCustomMSDataSet(FOwner).FIRecordSet.Fields.IndexOf(FieldDesc))); + FHeaderSB.Append(', '); + end; + end; + FHeaderSB.Length := FHeaderSB.Length - 2; + + // Add FROM section + FHeaderSB.Append(' FROM '); + for i := 0 to TblNames.Count - 1 do + FHeaderSB.Append(QuoteName(TblNames[i]) + ', '); // Table name without aliases + FHeaderSB.Length := FHeaderSB.Length - 2; + + // Add WHERE section + GenerateConditions(FCondSB, stRefresh, ModifiedFieldsOnly, (*False {Refresh does not need to testing changes applied by other users},*) KeyAndDataFields); + if FCondSB.Length > 0 then + FMiddleSB.Append(' WHERE '); + finally + TblNames.Free; + end; + end; + +begin + if (FOwner is TCustomMSStoredProc) and TCustomMSDataSet(FOwner).Options.FullRefresh then + GenerateSPFullRefreshSQL + else + if TCustomMSDataSet(FOwner).Options.FullRefresh or (FOwner.ReadOnly and not TCustomMSDataSet(FOwner).Options.UniqueRecords) then begin + GenerateConditions(FCondSB, stRefresh, ModifiedFieldsOnly, KeyAndDataFields); + if FCondSB.Length = 0 then + FHeaderSB.Append(FOwner.SQL.Text) + else begin + FHeaderSB.Append(AddWhere(FOwner.SQL.Text, FCondSB.ToString)); + FCondSB.Length := 0; // WHERE clause already added to FHeaderSB + end; + end + else + inherited; +end; + +function TMSSQLGenerator.GetActualFieldName(FldDesc: TCRFieldDesc; IsRefresh: boolean): string; +var + TablesInfo: TCRTablesInfo; + TableInfo: TCRTableInfo; + IsView: boolean; + UpdatingTableIdx: integer; +begin + if not (((FldDesc.TableInfo <> nil) and (FldDesc.TableInfo.IsView)) or IsRefresh) then begin + Result := TOLEDBFieldDesc(FldDesc).BaseColumnName; + if Result = '' then + Result := FldDesc.ActualName; + Result := QuoteName(Result); + Exit; + end; + + IsView := False; + UpdatingTableIdx := TDBAccessUtils.GetUpdatingTableIdx(FOwner); + TablesInfo := TDBAccessUtils.GetTablesInfo(FOwner); + if (UpdatingTableIdx >= 0) and (UpdatingTableIdx < TablesInfo.Count) then begin + TableInfo := TablesInfo[UpdatingTableIdx]; + if TableInfo <> nil then + IsView := TableInfo.IsView; + end; + + if (FldDesc.TableInfo <> nil) and (not IsView) then + Result := inherited GetActualFieldName(FldDesc, IsRefresh) + else + Result := QuoteName(FldDesc.ActualName); +end; + +procedure TMSSQLGenerator.AddFieldToCondition(SB: StringBuilder; FieldDesc: TCRFieldDesc; + const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + const Index: integer = -1); +var + ActualName: string; + IsIdentityField: boolean; + Field: TField; +begin + Assert(FieldDesc <> nil); + + if ModifiedFieldsOnly then begin + Field := FOwner.GetField(FieldDesc); + IsIdentityField := Field = TDBAccessUtils.GetIdentityField(FOwner); + if (StatementType = stInsert) and IsIdentityField then begin // DMLRefresh ? + ActualName := GetActualFieldName(FieldDesc, False); + FCondSB.Append(ActualName); + FCondSB.Append(' = '); + if TOLEDBConnection(TCustomMSDataSet(FOwner).Connection.IConnection).DBMSPrimaryVer > 7 then + FCondSB.Append('SCOPE_IDENTITY()') + else + FCondSB.Append('@@Identity'); + Exit; + end; + end; + + inherited; +end; + +procedure TMSSQLGenerator.GenerateConditions(SB: StringBuilder; + const StatementType: TStatementType; + const ModifiedFieldsOnly: boolean; + const KeyAndDataFields: TKeyAndDataFields; + const Index: integer = -1); + + procedure GenerateCondForRQ; + {SQL Server Books Online -> Accessing and Changing Relational Data -> + Transact-SQL Syntax Elements -> Using Data Types -> Using Special Data: + + In SQL Server version 7.0 and SQL Server 2000, @@DBTS is only incremented for use + in timestamp columns. If a table contains a timestamp column, every time a row is + modified by an INSERT, UPDATE, or DELETE statement, the timestamp value in the row + is set to the current @@DBTS value, and then @@DBTS is incremented by one...} + var + TimestampField: TField; + MaxTimestamp: Int64; + FieldDesc: TOLEDBFieldDesc; + begin + TimestampField := TCustomMSDataSet(FOwner).FTimestampField; + if TimestampField = nil then + DatabaseError(STimestampFieldRequired); + + FieldDesc := TOLEDBFieldDesc(FOwner.GetFieldDesc(TimestampField)); + MaxTimestamp := TOLEDBTableInfo(FieldDesc.TableInfo).MaxTimestamp; + FCondSB.Append(GetActualFieldName(FOwner.GetFieldDesc(TimestampField) as TCRFieldDesc, True) + ' > ' + '0x' + IntToHex(MaxTimestamp, SizeOf(MaxTimestamp) * 2)); + end; + +var + i: integer; + FldUsed: set of byte; + TestChanges: boolean; +begin + Assert(FOwner <> nil); + Assert(FOwner.Connection <> nil); + Assert(IsClass(FOwner.Connection, TMSConnection)); + + FCondSB.Length := 0; + + if StatementType = stRefreshQuick then + GenerateCondForRQ + else + begin + TestChanges := (StatementType = stInsert) and TCustomMSDataSet(FOwner).Options.DMLRefresh and + (TCustomMSDataSet(FOwner).CursorType = ctDefaultResultSet) and TCustomMSDataSet(FOwner).Options.CheckRowVersion; + + TestChanges := TestChanges or ((StatementType = stUpdate) and TCustomMSDataSet(FOwner).Options.DMLRefresh and + (TCustomMSDataSet(FOwner).CursorType = ctDefaultResultSet) and TCustomMSDataSet(FOwner).Options.CheckRowVersion); + + if not TestChanges then + inherited + else + begin + if (TCustomMSDataSet(FOwner).FTimestampField <> nil) and not TCustomMSDataSet(FOwner).FTimestampField.IsNull then + AddFieldToCondition(FCondSB, FOwner.GetFieldDesc(TCustomMSDataSet(FOwner).FTimestampField) as TCRFieldDesc, StatementType, ModifiedFieldsOnly, Index) + else + begin + FldUsed := []; + if Length(KeyAndDataFields.KeyFieldDescs) > 0 then + for i := 0 to High(KeyAndDataFields.KeyFieldDescs) do begin + AddFieldToCondition(FCondSB, KeyAndDataFields.KeyFieldDescs[i], StatementType, ModifiedFieldsOnly, Index); + FldUsed := FldUsed + [KeyAndDataFields.KeyFieldDescs[i].FieldNo]; + end; + + if Length(KeyAndDataFields.DataFieldDescs) = 0 then + DatabaseError(SNoKeyFields); + for i := 0 to High(KeyAndDataFields.DataFieldDescs) do + if not IsBlobDataType(KeyAndDataFields.DataFieldDescs[i].DataType) // not "text", "ntext", "image" + and not (KeyAndDataFields.DataFieldDescs[i].FieldNo in FldUsed) then + AddFieldToCondition(FCondSB, KeyAndDataFields.DataFieldDescs[i], StatementType, ModifiedFieldsOnly, Index); + end; + end; + end; +end; + +{ TCustomMSDataSet} + +procedure TCustomMSDataSet.AutoRefreshTimer(Sender: TObject); +begin + if State = dsBrowse then begin + try + if FTimestampField <> nil then + RefreshQuick(True) + else + Refresh; + except + Options.AutoRefresh := False; + raise; + end; + + // Reset timer + FAutoRefreshTimer.Enabled := False; + FAutoRefreshTimer.Enabled := True; + end; +end; + +function TCustomMSDataSet.QuoteName(const AName: string): string; +begin + Result := QuoteName(AName, FLeftQuote, FRightQuote); +end; + +function TCustomMSDataSet.QuoteName(const AName: string; const LeftQuote, RightQuote: string): string; +begin + if FOptions.QuoteNames and (AName <> '') + and ((AName[1] <> LeftQuote) and (AName[Length(AName)] <> RightQuote)) then + Result := Concat(LeftQuote, AName, RightQuote) + else + Result := BracketIfNeed(AName); +end; + +function TCustomMSDataSet.GetParams: TMSParams; +begin + Result := TMSParams(inherited Params); +end; + +procedure TCustomMSDataSet.SetParams(Value: TMSParams); +begin + inherited Params := Value; +end; + +constructor TCustomMSDataSet.Create(Owner: TComponent); +begin + inherited Create(Owner); + + FOptions := inherited Options as TMSDataSetOptions; + + FLeftQuote := OLEDBAccess.LeftQuote; + FRightQuote := OLEDBAccess.RightQuote; + + FLockInitFieldDefs := False; + CursorType := ctDefaultResultSet; + + FIdentityField := nil; + + FIsInInitFieldDefs := False; + + FCommandTimeout := 0; + FetchAll := True; + + FAutoRefreshTimer := TWin32Timer.Create(nil); + FAutoRefreshTimer.OnTimer := AutoRefreshTimer; + FAutoRefreshTimer.Interval := Options.AutoRefreshInterval * MSecsPerSec; + FAutoRefreshTimer.Enabled := Options.AutoRefresh; + +{$IFNDEF STD} + FNeedSmartRefresh := False; +{$ENDIF} +end; + +destructor TCustomMSDataSet.Destroy; +begin + if FAutoRefreshTimer <> nil then begin + FAutoRefreshTimer.Enabled := False; + FAutoRefreshTimer.Free; + end; + + inherited; +end; + +procedure TCustomMSDataSet.AssignTo(Dest: TPersistent); +begin + inherited; + + if Dest is TCustomMSDataSet then begin + TCustomMSDataSet(Dest).SQLInsert := SQLInsert; + TCustomMSDataSet(Dest).SQLDelete := SQLDelete; + TCustomMSDataSet(Dest).SQLUpdate := SQLUpdate; + TCustomMSDataSet(Dest).SQLRefresh := SQLRefresh; + TCustomMSDataSet(Dest).CursorType := CursorType; + + TCustomMSDataSet(Dest).Params.Assign(Params); + end; +end; + +{ Smart Refresh } +{$IFDEF SMART_REFRESH} +{$IFNDEF STD} +procedure TCustomMSDataSet.RegisterNotification; +var + CreateDML: string; + Guid: TGUID; + + function PrepareGuid(const Guid: string): string; + var + i: integer; + begin + Result := ''; //+++ StringBuilder + for i := 1 to Length(Guid) - 1 do + case Guid[i] of + '0'..'9', 'A'..'F', 'a'..'f': + Result := Result + Guid[i]; + end; + end; + +begin + Assert(FRefreshServiceBroker = nil); + + BeginConnection; + + if TOLEDBConnection(Connection.IConnection).DBMSPrimaryVer <= 8 then + DatabaseError(SInvalidServerVersion); + +{$IFDEF VER6P} + if CreateGuid(Guid) <> 0 then + RaiseLastOSError; +{$ELSE} + if CoCreateGuid(Guid) <> 0 then + RaiseLastWin32Error; +{$ENDIF} + + FRefreshQueue := sSdacQueue + PrepareGuid(GuidToString(Guid)); + FRefreshService := sSdacService + PrepareGuid(GuidToString(Guid)); + + CreateDML := 'IF NOT EXISTS (SELECT * FROM sys.service_queues WHERE name = N''' + FRefreshQueue + ''') ' + + 'CREATE QUEUE ' + FRefreshQueue + ';' + LineSeparator; + CreateDML := CreateDML + 'IF NOT EXISTS (SELECT * FROM sys.services WHERE name = N''' + FRefreshService + ''') ' + + 'CREATE SERVICE ' + FRefreshService + ' ON QUEUE ' + FRefreshQueue + ' ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])'; + Connection.ExecSQL(CreateDML, []); + + FIRecordSet.SetProp(prSmartRefreshService, FRefreshService); + + FRefreshServiceBroker := TMSRefreshServiceBroker.Create(nil); + TMSRefreshServiceBroker(FRefreshServiceBroker).FDataSet := Self; + TMSRefreshServiceBroker(FRefreshServiceBroker).Service := FRefreshService; + TMSRefreshServiceBroker(FRefreshServiceBroker).Connection := Connection; +end; + +procedure TCustomMSDataSet.UnregisterNotification; +var + DropDML: string; +begin + try + TMSRefreshServiceBroker(FRefreshServiceBroker).Free; + FRefreshServiceBroker := nil; + finally + try + DropDML := 'IF EXISTS (SELECT * FROM sys.services WHERE name = N''' + FRefreshService + ''') ' + + 'DROP SERVICE ' + FRefreshService + ';' + LineSeparator; + DropDML := DropDML + 'IF EXISTS (SELECT * FROM sys.service_queues WHERE name = N''' + FRefreshQueue + ''') ' + + 'DROP QUEUE ' + FRefreshQueue + ';'; + try + Connection.ExecSQL(DropDML, []); + except + on E: EOLEDBError do; // silent + end; + finally + EndConnection; + end; + end; +end; +{$ENDIF} +{$ENDIF} + +{ Open/Close } + +procedure TCustomMSDataSet.SetActive(Value: Boolean); +begin + if Value <> Active then begin + if Value then + SetNumericType; + + {$IFDEF SMART_REFRESH} + {$IFNDEF STD} + if Active and FOptions.FSmartRefresh then + UnregisterNotification; + {$ENDIF} + {$ENDIF} + end; + + try + + inherited; + + if Value and (FIRecordSet.FetchExecutor <> nil) then + FIRecordSet.FetchExecutor.Resume; + + except + on E: EDAError do begin + if (E.Message = SCursorTypeChanged) then + Unprepare; + raise; + end; + end; +end; + +procedure TCustomMSDataSet.DataReopen; +begin + if FCursorType in ServerCursorTypes then + ClearBuffers; + inherited; +end; + +procedure TCustomMSDataSet.InternalExecute; +begin + SetNumericType; + inherited; + if TCRRecordSet(Data).CommandType = ctCursor then + InternalInitFieldDefs + else + TCRRecordSet(Data).GetCommand.SetCursorState(csInactive); // To prevent blocking execute on second exec +end; + +procedure TCustomMSDataSet.InternalOpen; + function IsAnyFieldDescCanBeModified: boolean; + var + i: integer; + begin + Result := False; + for i := 0 to FIRecordSet.Fields.Count - 1 do + if not FIRecordSet.Fields[i].ReadOnly then begin + Result := True; + Break; + end; + end; + + procedure FillFieldsOrigin; + var + Field: TField; + FieldDesc: TOLEDBFieldDesc; + + TableName: string; + + i: integer; + begin + /// downto to correct set FIdentityField + for i := Fields.Count - 1 downto 0 do begin + Field := Fields[i]; + + if Field.FieldKind = fkData then begin + FieldDesc := TOLEDBFieldDesc(GetFieldDesc(Field)); + + if not (Self is TCustomMSTable) then begin + TableName := GenerateTableName(FieldDesc.BaseCatalogName, FieldDesc.BaseSchemaName, FieldDesc.BaseTableName, Connection.Database); + Field.Origin := TableName + '.' + BracketIfNeed(FieldDesc.BaseColumnName); + end + else + Field.Origin := TCustomMSTable(Self).FTableName + '.' + Field.FieldName; + + if FieldDesc.IsAutoIncrement then begin + if Options.SetFieldsReadOnly then + Field.ReadOnly := True; + + Assert((FUpdatingTableInfoIdx >= - 1) and (FUpdatingTableInfoIdx < TablesInfo.Count)); + + if (FUpdatingTableInfoIdx >= 0) + and (FIRecordSet.TablesInfo.IndexByName(GenerateTableName(FieldDesc.BaseCatalogName, FieldDesc.BaseSchemaName, FieldDesc.BaseTableName, Connection.Database)) = FUpdatingTableInfoIdx) then + FIdentityField := Field; + {$IFDEF VER5P} + Field.AutoGenerateValue := arAutoInc; + {$ENDIF} + end; + + if FieldDesc.IsTimestamp + and (FUpdatingTableInfoIdx >= 0) + and (FieldDesc.BaseTableName = FIRecordSet.TablesInfo[FUpdatingTableInfoIdx].TableName) then + FTimestampField := Field; + end; + if Field.DataType = TFieldType(ftMSXML) then begin + FieldDesc := TOLEDBFieldDesc(GetFieldDesc(Field)); + Assert(Field is TMSXMLField); + TMSXMLField(Field).SetSchemaCollection(FieldDesc.XMLSchemaCollectionName, + FieldDesc.XMLSchemaCollectionCatalogName, FieldDesc.XMLSchemaCollectionSchemaName); + end; + end; + end; + +var + i: integer; + FieldDesc: TFieldDesc; +begin + try + {$IFDEF SMART_REFRESH} + {$IFNDEF STD} + if FOptions.FSmartRefresh then + RegisterNotification; + {$ENDIF} + {$ENDIF} + finally + + if CachedUpdates and (FCursorType in ServerCursorTypes) then + DatabaseError(SCUandServerCursors); + + inherited; + //Assert(not FIRecordSet.NativeRowset or (Length(FSQLObjects) <> 0)); + + FNeedAddRef := FCursorType in ServerCursorTypes; + + FCanOpenNext := not FICommand.IUnknownNextIsNull; + + if FIRecordSet.NativeRowset then begin + FIsAnyFieldDescCanBeModified := IsAnyFieldDescCanBeModified; + + if Fields.Count > 0 then + FillFieldsOrigin; + end + else + FIsAnyFieldDescCanBeModified := False; + + // Set right precision for TFloatField + for i := 0 to Fields.Count - 1 do + if (Fields[i] is TFloatField) + and (TFloatField(Fields[i]).Precision = 15 {Default}) + and (Fields[i].FieldKind = fkData) then begin + FieldDesc := GetFieldDesc(Fields[i]); + case FieldDesc.DataType of + dtFloat, dtCurrency: // Precision cannot be greater then 15 + TFloatField(Fields[i]).Precision := FieldDesc.Length; + end; + end; + end; +end; + +procedure TCustomMSDataSet.InternalClose; +var + LockClearMultipleResults: boolean; + v: Variant; +begin + inherited; + + FTimestampField := nil; + + if FIsInInitFieldDefs then begin + FICommand.ClearIUnknown; + FIRecordSet.GetProp(prLockClearMultipleResults, v); + LockClearMultipleResults := v; + if not LockClearMultipleResults then begin + FICommand.ClearIMultipleResults; + FICommand.ClearIUnknownNext; + FCanOpenNext := True; + end; + end; +end; + +procedure TCustomMSDataSet.OpenCursor(InfoQuery: boolean); +begin + + FIRecordSet.SetProp(prReadOnly, ReadOnly); + + if FIRecordSet.NativeRowset and (SQL.Count = 0) then + DatabaseError(SEmptySQLStatement, Self); + + inherited; + + if Options.DefaultValues then + GetFieldsInfo; + + if InfoQuery then begin + TCRRecordSet(Data).GetCommand.SetCursorState(csInactive); // To prevent blocking excute on second exec + TCRRecordSet(Data).CommandType := CRAccess.ctUnknown; + end; +end; + +procedure TCustomMSDataSet.GetFieldsInfo; +var + MetaData: TMSMetadata; + Field: TField; + DefValue: string; +begin + MetaData := TMSMetadata.Create(nil); + try + MetaData.Connection := Connection; + MetaData.DatabaseName := Connection.Database; + MetaData.ObjectType := otColumns; + MetaData.TableName := TablesInfo[FUpdatingTableInfoIdx].TableName; + MetaData.Open; + while not MetaData.EOF do begin + Field := FindField(MetaData.FieldByName('COLUMN_NAME').AsString); + if (Field <> nil) and MetaData.FieldByName('COLUMN_HASDEFAULT').AsBoolean and not MetaData.FieldByName('COLUMN_DEFAULT').IsNull then begin + DefValue := MetaData.FieldByName('COLUMN_DEFAULT').AsString; + case Field.DataType of + ftBoolean: + Field.DefaultExpression := BoolToStr(DefValue <> '0', True); + ftFloat, ftBCD{$IFDEF VER6P}, ftFMTBCD{$ENDIF}: + Field.DefaultExpression := StringReplace(DefValue, '.', DecimalSeparator, [rfReplaceAll]); + else + Field.DefaultExpression := DefValue; + end; + end; + MetaData.Next; + end; + finally + MetaData.Free; + end; +end; + +procedure TCustomMSDataSet.InitFieldDefs; +begin + FIsInInitFieldDefs := True; + try + inherited; + finally + FIsInInitFieldDefs := False; + end; +end; + +procedure TCustomMSDataSet.InternalInitFieldDefs; +begin + if not FLockInitFieldDefs then + inherited; +end; + +function TCustomMSDataSet.GetFieldType(DataType: word): TFieldType; +begin + Result := {$IFDEF CLR}CoreLab.Sdac.{$ENDIF}MSAccess.GetFieldType(DataType); +end; + +function TCustomMSDataSet.GetFieldClass(FieldType: TFieldType): TFieldClass; +begin + if Integer(FieldType) = ftMSXML then + Result := TMSXMLField + else + Result := inherited GetFieldClass(Fieldtype); +end; + +{$IFDEF USE_FTAUTOINC} +function TCustomMSDataSet.GetFieldType(FieldDesc: TFieldDesc): TFieldType; +begin + Result := inherited GetFieldType(FieldDesc); + Assert(FieldDesc is TOLEDBFieldDesc); + if (Result = ftInteger) and TOLEDBFieldDesc(FieldDesc).IsAutoIncrement then + Result := ftAutoInc; +end; +{$ENDIF} + +procedure TCustomMSDataSet.CreateIRecordSet; +begin + inherited; + + if FIRecordSet = nil then + SetIRecordSet(TOLEDBRecordSet.Create); +end; + +procedure TCustomMSDataSet.SetIRecordSet(Value: TData); +begin + inherited; + + FIRecordSet := TOLEDBRecordSet(Value); + + if FIRecordSet <> nil then begin + FICommand := TOLEDBCommand(FIRecordSet.GetCommand); + if FOptions <> nil then begin + SetNumericType; + FIRecordSet.SetProp(prUniqueRecords, FOptions.FUniqueRecords); + FIRecordSet.SetProp(prCursorUpdate, FOptions.FCursorUpdate); + end; + + FIRecordSet.SetProp(prEnableEmptyStrings, True); + FIRecordSet.SetProp(prReadOnly, ReadOnly); + FIRecordSet.SetProp(prCursorType, Integer(CursorType)); + FIRecordSet.SetProp(prCommandTimeout, CommandTimeout); + FIRecordSet.SetProp(prRequestSQLObjects, True); + + FIRecordSet.SetProp(prRoAfterUpdate, roAfterUpdate in RefreshOptions); + + TOLEDBRecordSet(FIRecordSet).CursorTypeChanged := DoCursorTypeChanged; + end + else + FICommand := nil; +end; + +procedure TCustomMSDataSet.SetNumericType; +begin + if (FIRecordSet <> nil) and (FOptions <> nil) then begin + if FOptions.EnableBCD or (Connection = nil) or (Connection.Options = nil) then begin + Assert(FIRecordSet <> nil); + FIRecordSet.SetProp(prEnableBCD, FOptions.FEnableBCD); + {$IFDEF VER6P} + FIRecordSet.SetProp(prEnableFMTBCD, False); + {$ENDIF} + end + else + case Connection.Options.NumericType of + ntFloat: begin + FIRecordSet.SetProp(prEnableBCD, False); + {$IFDEF VER6P} + FIRecordSet.SetProp(prEnableFMTBCD, False); + {$ENDIF} + end; + ntBCD: begin + FIRecordSet.SetProp(prEnableBCD, True); + {$IFDEF VER6P} + FIRecordSet.SetProp(prEnableFMTBCD, False); + {$ENDIF} + end; + {$IFDEF VER6P} + ntFMTBCD: begin + FIRecordSet.SetProp(prEnableBCD, True); + FIRecordSet.SetProp(prEnableFMTBCD, True); + end; + {$ENDIF} + end; + end; + if FieldDefs <> nil then + FieldDefs.Updated := False; +end; + +function TCustomMSDataSet.GetCanModify: boolean; +begin + Assert(FIRecordSet <> nil, 'FIRecordSet must be setted to this time'); + + Result := inherited GetCanModify or + not (ReadOnly or UniDirectional) and + (FIsAnyFieldDescCanBeModified or + (SQLInsert.Count > 0) or + (SQLUpdate.Count > 0) or + (SQLDelete.Count > 0)) + and (FCursorType <> ctStatic); +end; + +procedure TCustomMSDataSet.CreateCommand; +begin + SetCommand(TMSSQL.Create(Self)); +end; + +function TCustomMSDataSet.CreateOptions: TDADataSetOptions; +begin + Result := TMSDataSetOptions.Create(Self); +end; + +function TCustomMSDataSet.GetConnection: TMSConnection; +begin + Result := TMSConnection(inherited Connection); +end; + +procedure TCustomMSDataSet.SetConnection(Value: TMSConnection); +begin + inherited Connection := Value; +end; + +function TCustomMSDataSet.PSGetKeyFields: string; +begin + if FIRecordSet.NativeRowset then + Result := inherited PSGetKeyFields + else + Result := ''; +end; + +procedure TCustomMSDataSet.CreateSQLGenerator; +begin + SetSQLGenerator(TMSSQLGenerator.Create(Self)); +end; + +procedure TCustomMSDataSet.SetReadOnly(Value: boolean); +begin + if ReadOnly <> Value then begin + if CursorType in ServerCursorTypes then + CheckInactive; + FieldDefs.Updated := False; + FIRecordSet.SetProp(prReadOnly, Value); + FIRecordSet.SetProp(prRequestSQLObjects, FOptions.FUniqueRecords or not Value); + inherited; + end; +end; + +procedure TCustomMSDataSet.InternalBeforeEdit; +begin + if roBeforeEdit in RefreshOptions then begin + InternalRefreshRecord; + if CursorType in ServerCursorTypes then + Resync([]); // CR 9097 + end; + + inherited; +end; + +procedure TCustomMSDataSet.UnPrepare; +var + v: variant; + LockClearMultipleResults: boolean; +begin + Close; + + if FICommand <> nil then begin + FICommand.ClearIUnknown; + FIRecordSet.GetProp(prLockClearMultipleResults, v); + LockClearMultipleResults := v; + if not LockClearMultipleResults then begin + FICommand.ClearIMultipleResults; + FICommand.ClearIUnknownNext; + FCanOpenNext := True; + end; + end; + + inherited; +end; + +function TCustomMSDataSet.OpenNext: boolean; // Open next rowset in statement. if rowset is not provided then OpenNext return False. If statement has error, then raised exception +begin + if Prepared then + DatabaseError(SOpenNextPreparedSQL); + + Result := FCanOpenNext; + if Result then + BeginConnection; + try + FIRecordSet.SetProp(prLockClearMultipleResults, True); + try + Close; + Unprepare; + finally + FIRecordSet.SetProp(prLockClearMultipleResults, False); + end; + + if Result then begin + FieldDefs.Updated := False; + Open; + end; + finally + if Result then + EndConnection; + end; +end; + +function TCustomMSDataSet.FindParam(const Value: string): TMSParam; +begin + Result := inherited FindParam(GetParamNameWODog(Value)) as TMSParam; +end; + +function TCustomMSDataSet.ParamByName(const Value: string): TMSParam; +begin + Result := inherited ParamByName(GetParamNameWODog(Value)) as TMSParam; +end; + +procedure TCustomMSDataSet.CreateProcCall(Name: string); +begin + InternalCreateProcCall(Name, True); +end; + +procedure TCustomMSDataSet.Post; +begin + inherited; + +{$IFNDEF STD} + if FNeedSmartRefresh then + DoSmartRefresh; +{$ENDIF} +end; + +procedure TCustomMSDataSet.Cancel; +begin + inherited; + +{$IFNDEF STD} + if FNeedSmartRefresh then + DoSmartRefresh; +{$ENDIF} +end; + +function TCustomMSDataSet.SQLAddWhere(SQLText, Condition: string): string; +begin + Result := {$IFDEF CLR}CoreLab.Sdac.{$ENDIF}MSAccess.AddWhere(SQLText, Condition); +end; + +function TCustomMSDataSet.SQLDeleteWhere(SQLText: string): string; +begin + Result := {$IFDEF CLR}CoreLab.Sdac.{$ENDIF}MSAccess.DeleteWhere(SQLText); +end; + +function TCustomMSDataSet.SQLGetWhere(SQLText: string): string; +begin + Result := {$IFDEF CLR}CoreLab.Sdac.{$ENDIF}MSAccess.GetWhere(SQLText); +end; + +function TCustomMSDataSet.SQLSetOrderBy(SQLText: string; Fields: string): string; +begin + Result := {$IFDEF CLR}CoreLab.Sdac.{$ENDIF}MSAccess.SetOrderBy(SQLText, Fields); +end; + +function TCustomMSDataSet.SQLGetOrderBy(SQLText: string): string; +begin + Result := {$IFDEF CLR}CoreLab.Sdac.{$ENDIF}MSAccess.GetOrderBy(SQLText); +end; + +(*procedure TCustomMSDataSet.SetBeforeFetch(Value: TBeforeFetchEvent); +begin + inherited; + FIRecordSet.SetProp(prBeforeFetch, Assigned(BeforeFetch)); +end; + +procedure TCustomMSDataSet.SetAfterFetch(Value: TAfterFetchEvent); +begin + inherited; + FIRecordSet.SetProp(prAfterFetch, Assigned(AfterFetch)); +end;*) + +procedure TCustomMSDataSet.SetRefreshOptions(Value: TRefreshOptions); +begin + inherited SetRefreshOptions(Value); + if FIRecordSet <> nil then + FIRecordSet.SetProp(prRoAfterUpdate, roAfterUpdate in RefreshOptions); +end; + +procedure TCustomMSDataSet.WriteFieldXMLDataType(Field: TField; FieldDesc: TFieldDesc; + const FieldAlias: string; XMLWriter: XMLTextWriter); +begin + inherited; + + if FieldDesc is TOLEDBFieldDesc then begin + if TOLEDBFieldDesc(FieldDesc).IsAutoIncrement + and not (Field.Required and not Field.ReadOnly) // Already writed in MemDS + then + XmlWriter.WriteAttributeString('rs:maybenull', 'false'); + end; +end; + +procedure TCustomMSDataSet.WriteFieldXMLAttributeType(Field: TField; FieldDesc: TFieldDesc; + const FieldAlias: string; XMLWriter: XMLTextWriter); +begin + inherited; + + if FieldDesc is TOLEDBFieldDesc then begin + if TOLEDBFieldDesc(FieldDesc).BaseCatalogName <> '' then + XmlWriter.WriteAttributeString('rs:basecatalog', XMLEncode(TOLEDBFieldDesc(FieldDesc).BaseCatalogName)); + + if TOLEDBFieldDesc(FieldDesc).BaseSchemaName <> '' then + XmlWriter.WriteAttributeString('rs:baseschema', XMLEncode(TOLEDBFieldDesc(FieldDesc).BaseSchemaName)); + + if TOLEDBFieldDesc(FieldDesc).IsTimestamp then + XmlWriter.WriteAttributeString('rs:rowver', 'true'); + end; +end; + +procedure TCustomMSDataSet.GetKeyAndDataFields( + out KeyAndDataFields: TKeyAndDataFields; + const ForceUseAllKeyFields: boolean); + + procedure ProcessField(FieldDesc: TOLEDBFieldDesc); + begin + if FieldDesc.IsKey or FieldDesc.IsAutoIncrement then begin + SetLength(KeyAndDataFields.KeyFieldDescs, Length(KeyAndDataFields.KeyFieldDescs) + 1); + KeyAndDataFields.KeyFieldDescs[High(KeyAndDataFields.KeyFieldDescs)] := FieldDesc; + end; + + if not FieldDesc.ReadOnly then begin + SetLength(KeyAndDataFields.DataFieldDescs, Length(KeyAndDataFields.DataFieldDescs) + 1); + KeyAndDataFields.DataFieldDescs[High(KeyAndDataFields.DataFieldDescs)] := FieldDesc; + end; + end; + +var + ByTable: boolean; + Field: TField; + FieldDesc: TOLEDBFieldDesc; + i: integer; + IsNeedProcessField: boolean; + +begin + if (Length(FCachedKeyAndDataFields[ForceUseAllKeyFields].KeyFieldDescs) = 0) and (Length(FCachedKeyAndDataFields[ForceUseAllKeyFields].DataFieldDescs) = 0) then begin + // Search fields + + SetLength(KeyAndDataFields.KeyFieldDescs, 0); + SetLength(KeyAndDataFields.DataFieldDescs, 0); + + if (Fields.Count = 0) or (FIRecordSet.Fields.Count = 0) then + Exit; + + ByTable := False; + if FUpdatingTableInfoIdx >= 0 then + if Self is TCustomMSTable then + ByTable := True + else + if not ForceUseAllKeyFields or not Options.FullRefresh then + ByTable := True; + + for i := 0 to Fields.Count - 1 do begin + Field := Fields[i]; + if Field.FieldKind = fkData then begin + FieldDesc := GetFieldDesc(Field) as TOLEDBFieldDesc; + if ByTable then + IsNeedProcessField := (Self is TCustomMSTable) or (FieldDesc.TableInfo = TablesInfo[FUpdatingTableInfoIdx]) + else + IsNeedProcessField := True; + if IsNeedProcessField then + ProcessField(FieldDesc); + end; + end; + + // Cache result + FCachedKeyAndDataFields[ForceUseAllKeyFields] := KeyAndDataFields; + end + else // Get fields from cache + KeyAndDataFields := FCachedKeyAndDataFields[ForceUseAllKeyFields]; +end; + +procedure TCustomMSDataSet.BeginConnection(NoConnectCheck: boolean = True); +begin + if FIRecordSet.NativeRowset then + inherited; +end; + +procedure TCustomMSDataSet.EndConnection; +begin + if FIRecordSet.NativeRowset then + inherited; +end; + +procedure TCustomMSDataSet.SetNumberRange(FieldDef: TFieldDef); +var + Field: TField; + FieldDesc: TOLEDBFieldDesc; +{$IFDEF VER6P} + mv: Extended; +{$ENDIF} + AIConnection: TOLEDBConnection; + ServerVersion: integer; +begin + AIConnection := TMSAccessUtils.FIConnection(Connection); + ServerVersion := 0; + if AIConnection <> nil then + ServerVersion := AIConnection.ProviderPrimaryVer; + Field := FindField(FieldDef.Name); + if Field <> nil then begin + FieldDesc := GetFieldDesc(Field) as TOLEDBFieldDesc; + case FieldDesc.OLEDBType of + DBTYPE_UI1: + begin + Assert(Field is TWordField); + TWordField(Field).MinValue := 0; + TWordField(Field).MaxValue := 255; + end; + else + case FieldDesc.DataType of + dtInt8: + begin + TIntegerField(Field).MinValue := -128; + TIntegerField(Field).MaxValue := 127; + end; + dtInt16: + begin + if ServerVersion = 3 then begin + TSmallIntField(Field).MinValue := -32768; + TSmallIntField(Field).MaxValue := 32767; + end + else begin + TIntegerField(Field).MinValue := -32768; + TIntegerField(Field).MaxValue := 32767; + end; + end; + dtInt32: + begin + TIntegerField(Field).MinValue := -2147483647; + TIntegerField(Field).MaxValue := 2147483647; + end; + dtInt64: + begin + TLargeintField(Field).MinValue := -9223372036854775807; + TLargeintField(Field).MaxValue := 9223372036854775807; + end; + dtWord: + begin + TWordField(Field).MinValue := 0; + TWordField(Field).MaxValue := 65535; + end; + dtFloat: + begin + if FieldDesc.Scale = 255 then begin + if FieldDesc.Length = 7 then begin + TFloatField(Field).MinValue := -3.40E38; + TFloatField(Field).MaxValue := 3.40E38; + end + else + begin + TFloatField(Field).MinValue := -1.79E308; + TFloatField(Field).MaxValue := 1.79E308; + end; + end + else + if (FieldDesc.Length > 0) then begin + TFloatField(Field).Precision := FieldDesc.Length; + TFloatField(Field).MaxValue := + IntPower(10, FieldDesc.Length - FieldDesc.Scale) - + IntPower(10, - Integer(FieldDesc.Scale)); + TFloatField(Field).MinValue := -TFloatField(Field).MaxValue; + end; + end; + dtBCD: + begin + TBCDField(Field).Precision := FieldDesc.Length; + if (FieldDesc.Length > 0) and (FieldDesc.Length <= 15) then begin + TBCDField(Field).MaxValue := + IntPower(10, FieldDesc.Length - FieldDesc.Scale) - + IntPower(10, - Integer(FieldDesc.Scale)); + TBCDField(Field).MinValue := -TBCDField(Field).MaxValue; + end; + end; + {$IFDEF VER6P} + dtFmtBCD: + begin + TFMTBCDField(Field).Precision := FieldDesc.Length; + if (FieldDesc.Length > 0) and (FieldDesc.Length <= 15) then begin + mv := + IntPower(10, FieldDesc.Length - FieldDesc.Scale) - + IntPower(10, - Integer(FieldDesc.Scale)); + TFMTBCDField(Field).MaxValue := FloatToStr(mv); + TFMTBCDField(Field).MinValue := FloatToStr(-mv); + end; + end; + {$ENDIF} + dtCurrency: + if ServerVersion <> 3 then begin + if FieldDesc.Length = 10 then begin + TFloatField(Field).MinValue := -214748.3648 ; + TFloatField(Field).MaxValue := 214748.3647; + end + else + if FieldDesc.Length = 19 then begin + TFloatField(Field).MinValue := -922337203685477.5808; + TFloatField(Field).MaxValue := 922337203685477.5807; + end; + end + else begin + TCurrencyField(Field).MinValue := -922337203685477.5808; + TCurrencyField(Field).MaxValue := 922337203685477.5807; + end; + end; + end; + end; +end; + +procedure TCustomMSDataSet.DetectIdentityField; +var + i: integer; + Field: TField; + FieldDesc: TOLEDBFieldDesc; +begin + inherited; + + //Search Identity Field + for i := FieldCount - 1 downto 0 do begin + Field := Fields[i]; + + if Field.FieldKind = fkData then begin + FieldDesc := TOLEDBFieldDesc(GetFieldDesc(Field)); + + if FieldDesc.IsAutoIncrement then begin + + Assert((FUpdatingTableInfoIdx >= - 1) and (FUpdatingTableInfoIdx < TablesInfo.Count)); + + if (FUpdatingTableInfoIdx >= 0) + and (FIRecordSet.TablesInfo.IndexByName(GenerateTableName(FieldDesc.BaseCatalogName, FieldDesc.BaseSchemaName, FieldDesc.BaseTableName, Connection.Database)) = FUpdatingTableInfoIdx) then + FIdentityField := Field; + end; + end; + end; +end; + +procedure TCustomMSDataSet.SetOptions(Value: TMSDataSetOptions); +begin + Options.Assign(Value); +end; + +{ +procedure TCustomMSDataSet.AssignFieldValue(Param: TParam; Field: TField; Old: boolean); +begin + inherited; + if Field.IsNull then + Param.Clear; +end; +} + +function TCustomMSDataSet.NeedReturnParams: boolean; +begin + Result := inherited NeedReturnParams or FOptions.FDMLRefresh; +end; + +procedure TCustomMSDataSet.AssignFieldValue(Param: TDAParam; Field: TField; Old: boolean); +var + FieldDesc: TOLEDBFieldDesc; +begin + if TDBAccessUtils.IsObjectDataType(Param, Field.DataType) then begin + FieldDesc := TOLEDBFieldDesc(GetFieldDesc(Field)); + TMSParam(Param).OLEDBType := FieldDesc.OLEDBType; + end; + + inherited AssignFieldValue(Param, Field, Old); +end; + +function TCustomMSDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: boolean): TGetResult; +begin + Result := grError; + if (FCursorType = ctDynamic) and (BufferCount > 1) then + DatabaseError(SBookmarksRequired) + else + Result := inherited GetRecord(Buffer, GetMode, DoCheck); +end; + +procedure TCustomMSDataSet.InternalSetToRecord(Buffer: TRecordBuffer); +begin + inherited; + + if (FCursorType in ServerCursorTypes) and (GetBookmarkFlag(Buffer) <> bfInserted) then + GetRecord(Buffer, gmCurrent, True); +end; + +procedure TCustomMSDataSet.DoAfterExecute(Result: boolean); +begin + inherited; +{$IFDEF SMART_REFRESH} +{$IFNDEF STD} + if (FRefreshServiceBroker <> nil) and (not TMSServiceBroker(FRefreshServiceBroker).Active) then + TMSServiceBroker(FRefreshServiceBroker).Start; +{$ENDIF} +{$ENDIF} +end; + +{ Smart Refresh} +{$IFNDEF STD} +procedure TCustomMSDataSet.DoSmartRefresh; +begin + if State in [dsInsert,dsEdit] then + FNeedSmartRefresh := True + else begin + Refresh; + if Assigned(FAfterSmartRefresh) then + FAfterSmartRefresh(Self); + FNeedSmartRefresh := False; + end; +end; +{$ENDIF} + +{ Before / After UpdateExecute } + +function TCustomMSDataSet.AssignedBeforeUpdateExecute: boolean; +begin + Result := Assigned(FBeforeUpdateExecute); +end; + +procedure TCustomMSDataSet.DoBeforeUpdateExecute(Sender: TDataSet; StatementTypes: TStatementTypes; + Params: TDAParams); +begin + if AssignedBeforeUpdateExecute then + FBeforeUpdateExecute(Sender as TCustomMSDataSet, StatementTypes, Params as TMSParams); +end; + +function TCustomMSDataSet.AssignedAfterUpdateExecute: boolean; +begin + Result := Assigned(FAfterUpdateExecute); +end; + +procedure TCustomMSDataSet.DoAfterUpdateExecute(Sender: TDataSet; StatementTypes: TStatementTypes; + Params: TDAParams); +begin + if AssignedAfterUpdateExecute then + FAfterUpdateExecute(Sender as TCustomMSDataSet, StatementTypes, Params as TMSParams); +end; + +function TCustomMSDataSet.GetRecCount: longint; + function GetCount(const s: string): longint; + var + i: integer; + OldParamCheck: boolean; + UQ: TCustomMSDataSet; + AIConnection: TOLEDBConnection; + begin + CheckUpdateQuery(stCustom); + UQ := FUpdateQuery as TCustomMSDataSet; + + OldParamCheck := UQ.ParamCheck; + try + UQ.ParamCheck := ParamCheck; + UQ.SQL.Text := s; + if not ParamCheck then + for i := 0 to Params.Count {without -1!} do + UQ.Params.Add; + + if UQ.ParamCount > 0 then begin + UQ.Params[0].DataType := ftLargeint; + UQ.Params[0].ParamType := ptOutput; + end; + + UQ.Macros.Assign(Macros); + for i := 0 to Params.Count - 1 do + UQ.Params[i + 1].Assign(Params[i]); + + AIConnection := TMSAccessUtils.FIConnection(Connection); + if (AIConnection <> nil) and (AIConnection.ProviderPrimaryVer <> 3) then begin + UQ.Execute; + Result := UQ.Params[0].Value; + end + else begin + UQ.Open; + Result := UQ.Fields[0].Value; + end; + finally + UQ.ParamCheck := OldParamCheck; + end; + end; + +var + Parser: TMSParser; + SelectPos: integer; + FromPos: integer; + s: string; + CountParamName: string; + +begin + if ((not FetchAll or Options.NonBlocking) and FOptions.QueryRecCount) // Server cursors or DefaultResultSet with FetchAll = False + and not ((Params.Count > 0) and (Params[0].ParamType = ptResult)) then begin // Current SQL does not have RETURN parameter + s := FinalSQL; + s := {$IFDEF CLR}CoreLab.Sdac.{$ENDIF}MSAccess.SetOrderBy(s, ''); + Parser := TMSParser.Create(s); + Parser.OmitBlank := False; + Parser.OmitComment := True; + try + if Parser.ToLexem(lxSELECT) <> lcEnd then begin + SelectPos := Parser.CurrPos; + if Parser.ToLexem(lxFROM) <> lcEnd then begin + FromPos := Parser.CurrPos; + + if Connection.Options.Provider <> prCompact then begin + if ParamCheck then + CountParamName := ':SDAC_COUNT' + else + CountParamName := '?'; + s := 'SET ' + CountParamName + ' = (' + Copy(s, 1, SelectPos) + ' COUNT(*)' + Copy(s, FromPos - 4 {length('FROM')}, MaxInt) + ')'; + end + else begin + CountParamName := 'SDAC_COUNT'; + s := Copy(s, 1, SelectPos) + ' COUNT(*) AS ' + CountParamName + ' ' + Copy(s, FromPos - 4 {length('FROM')}, MaxInt); + end; + end; + end; + finally + Parser.Free; + end; + + if s <> '' then + Result := GetCount(s) + else + Result := 0; + end + else + Result := inherited GetRecCount; +end; + +function TCustomMSDataSet.GetRecordCount: integer; +begin + if (not FetchAll or Options.NonBlocking) and FOptions.QueryRecCount then // Server cursors or DefaultResultSet with FetchAll = False + Result := FRecordCount + else + Result := inherited GetRecordCount; +end; + +function TCustomMSDataSet.Fetched: boolean; +begin + if FCursorType in ServerCursorTypes then + Result := False + else + Result := inherited Fetched; +end; + +procedure TCustomMSDataSet.DoCursorTypeChanged; +var + v: Variant; +begin + // Does not need to read ReadOnly property (for changes to static cursor) + // FIRecordSet.GetProp(prReadOnly, @ReadOnly); + + FIRecordSet.GetProp(prCursorType, v); + FCursorType := TMSCursorType(v); + raise EDAError.Create(0, SCursorTypeChanged); +end; + +procedure TCustomMSDataSet.SetFetchAll(Value: boolean); +begin + if FetchAll <> Value then + UnPrepare; + + inherited; +end; + +procedure TCustomMSDataSet.UpdateExecute(const StatementTypes: TStatementTypes); +var + UserSQL, ROnly: boolean; + IdentityParamIdx: integer; + UQParams: TDAParams; + NewIdentityValue: variant; + AIConnection: TOLEDBConnection; +begin + IdentityParamIdx := - 1; + UQParams := TDBAccessUtils.GetParams(FUpdateQuery); + AIConnection := TMSAccessUtils.FIConnection(Connection); + if stInsert in StatementTypes then begin + if Assigned(UpdateObject) then + UserSQL := UpdateObject.SQL[DB.ukInsert].Count > 0 + else + UserSQL := FUpdateSQL[stInsert].Count > 0; + + if not UserSQL then begin // This is not custom user statement and last parameter is used for Identity + if Options.QueryIdentity and (FIdentityField <> nil) and (CursorType = ctDefaultResultSet) then begin + if (AIConnection <> nil) and (AIConnection.ProviderPrimaryVer = 3) then + IdentityParamIdx := 0 + else begin + IdentityParamIdx := UQParams.Count - 1; + Assert(IdentityParamIdx >= 0); + // UQParams[IdentityParamIdx].ParamType := ptInputOutput; - already setted by AddParam + end; + end; + end; + end; + + inherited; + + if (IdentityParamIdx >= 0) and not NeedReturnParams then begin + ROnly := FIdentityField.ReadOnly; + if ROnly then begin + SetTempState(State); // DisableControls + FIdentityField.ReadOnly := False; + end; + if (AIConnection <> nil) and (AIConnection.ProviderPrimaryVer = 3) then begin + TDBAccessUtils.GetSQL(FUpdateQuery).Text := 'SELECT @@IDENTITY'; + TDBAccessUtils.Open(FUpdateQuery); + NewIdentityValue := TCustomMSDataSet(FUpdateQuery).Fields[IdentityParamIdx].Value; + end + else + NewIdentityValue := UQParams[IdentityParamIdx].Value; + + FIdentityField.NewValue := NewIdentityValue; + + if ROnly then begin + FIdentityField.ReadOnly := True; + RestoreState(State); + end + end; +end; + +procedure TCustomMSDataSet.InternalRefreshRecord; +var + Bookmark: TBookmark; +begin + case FCursorType of + ctDefaultResultSet: + inherited; + ctStatic, ctKeySet: + begin + Bookmark := GetBookmark; + try + FIRecordSet.SetToBookmark(Bookmark); // ReFetch + finally + FreeBookmark(Bookmark); + end; + FRowsAffected := 1; // Must be always OK + end; + ctDynamic: + begin + if FIRecordSet.FetchToBookmarkValue then + FRowsAffected := 1 + else + FRowsAffected := 0; + end; + end; +end; + +procedure TCustomMSDataSet.CheckUpdateQuery(const StatementType: TStatementType); +var + UseMSSQL: boolean; +begin + FUpdateQuery := FUpdateComponents[StatementType]; + if FUpdateQuery = nil then begin + if not __UseUpdateOptimization then + UseMSSQL := False + else + case StatementType of + stInsert, stUpdate: + UseMSSQL := not Options.DMLRefresh; + stDelete: + UseMSSQL := True; + else + UseMSSQL := False; + end; + if UseMSSQL and (Connection.Options.Provider = prCompact) then + UseMSSQL := not (Options.QueryIdentity and (FIdentityField <> nil)); + if UseMSSQL then begin + Assert(UsedConnection <> nil); + FUpdateQuery := TMSSQL.Create(nil); + TMSSQL(FUpdateQuery).Connection := TMSConnection(UsedConnection); + end; + end; + FUpdateComponents[StatementType] := FUpdateQuery; + + inherited; + + Assert(FUpdateComponents[StatementType] = FUpdateQuery); + + if FUpdateQuery is TCustomMSDataSet then begin + TCustomMSDataSet(FUpdateQuery).FetchAll := True; + TCustomMSDataSet(FUpdateQuery).ReadOnly := True; + TCustomMSDataSet(FUpdateQuery).Options.FlatBuffers := True; + TCustomMSDataSet(FUpdateQuery).Options.NumberRange := False; + TCustomMSDataSet(FUpdateQuery).Options.QueryRecCount := False; + TCustomMSDataSet(FUpdateQuery).Options.QuoteNames := False; + TCustomMSDataSet(FUpdateQuery).Options.UniqueRecords := False; + TCustomMSDataSet(FUpdateQuery).Options.FullRefresh := Options.FullRefresh; + + TCustomMSDataSet(FUpdateQuery).FIRecordSet.SetProp(prRequestSQLObjects, False); + end; +end; + +function TCustomMSDataSet.UseParamType: boolean; +begin + Result := FUseParamType; +end; + +function TCustomMSDataSet.PerformSQL(const SQL: string; const StatementTypes: TStatementTypes): boolean; +begin + try + Result := inherited PerformSQL(SQL, StatementTypes); + finally + FUseParamType := False; + end; +end; + +function ConvertCRParamTypeToBDE(const Value: TParamDirection): TParamType; +begin + case Value of + pdInput: + Result := ptInput; + pdInputOutput: + Result := ptInputOutput; + pdResult: + Result := ptResult; + else + Assert(False, 'Invalid value in ConvertCRParamTypeToBDE(const Value: TParamDirection): TParamType'); + Result := ptUnknown; // To prevent compiler warning + end; +end; + +procedure TCustomMSDataSet.InternalCreateProcCall(Name: string; NeedDescribe: boolean); +var + i: integer; + ParamDescs: TParamDescs; + ParamDesc: CRAccess.TParamDesc; + + Param: TMSParam; + ParamType: TParamType; + IsNewParam: boolean; + ft: TFieldType; + + ProcCallSQL: string; +{$IFDEF VER6P} + EnableFmtBcd: variant; +{$ENDIF} +begin + BeginConnection; + try + if not NeedDescribe then + TMSSQL(FCommand).WriteParams(False); + + {$IFDEF VER6P} + EnableFmtBcd := FIRecordSet.GetProp(prEnableFMTBCD, EnableFmtBcd); + {$ENDIF} + ProcCallSQL := FICommand.CreateProcCall(Name, NeedDescribe, True, Options.EnableBCD, {$IFDEF VER6P}Boolean(EnableFmtBcd){$ELSE}False{$ENDIF}); + + if NeedDescribe then + TMSSQL(FCommand).CreateParams; + + if NeedDescribe and (Params <> nil) then begin + ParamDescs := TOLEDBCommand(FICommand).Params; + for i := 0 to ParamDescs.Count - 1 do begin + ParamDesc := ParamDescs[i]; + ParamType := ConvertCRParamTypeToBDE(ParamDesc.GetParamType); + + Param := Params.FindParam(ParamDesc.GetName); + IsNewParam := Param = nil; + if IsNewParam then + Param := TMSParam.Create(Params, ParamType); + + Param.ParamType := ParamType; + ft := GetFieldType(ParamDesc.GetDataType); + if ft <> Param.DataType then + Param.DataType := ft; // To prevent clearing Param.Value on set DataType + Param.Name := ParamDesc.GetName; + if IsNewParam then + Param.Value := ParamDesc.GetValue; + Param.Size := ParamDesc.GetSize; + end; + + FICommand.SetProp(prDisableParamScan, True); + try + FCommand.SQL.Text := ProcCallSQL; + finally + FICommand.SetProp(prDisableParamScan, False); + end; + end; + finally + EndConnection; + end; +end; + +function TCustomMSDataSet.IsRefreshQuickField(FieldDesc: TFieldDesc): boolean; +begin + Result := TOLEDBFieldDesc(FieldDesc).IsTimestamp; +end; + +procedure TCustomMSDataSet.SaveMaxRefreshQuickValue(FieldDesc: TFieldDesc; const Value: variant); +var + Field: TOLEDBFieldDesc; + Val: Int64; +{$IFDEF CLR} + Data: TBytes; +{$ENDIF} +begin + Field := TOLEDBFieldDesc(FIRecordSet.FindField(FieldDesc.Name)); + if (Field <> nil) and Field.IsTimestamp and (Field.TableInfo <> nil) then begin + {$IFDEF CLR} + Data := TBytes(Value); + System.Array.Reverse(Data, 0, SizeOf(Int64)); + Val := BitConverter.ToInt64(Data, 0); + {$ELSE} + Val := Int64(TVarData(Value).VArray.Data^); + Reverse8(@Val); + {$ENDIF} + if {$IFDEF VER7P}UInt64{$ENDIF}(TOLEDBTableInfo(Field.TableInfo).MaxTimestamp) < {$IFDEF VER7P}UInt64{$ENDIF}(Val) then + TOLEDBTableInfo(Field.TableInfo).MaxTimestamp := Val; + end; +end; + +{ TMSUpdateSQL } + +function TMSUpdateSQL.DataSetClass: TCustomDADataSetClass; +begin + Result := TCustomMSDataSet; +end; + +function TMSUpdateSQL.SQLClass: TCustomDASQLClass; +begin + Result := TMSSQL; +end; + +{ TMSQuery } + +procedure TMSQuery.SetIRecordSet(Value: TData); +begin + inherited; + + FIRecordSet := TOLEDBRecordSet(Value); +end; + +procedure TCustomMSDataSet.SetCursorType(const Value: TMSCursorType); +begin + if FCursorType <> Value then begin + CheckInactive; + FieldDefs.Updated := False; + FCursorType := Value; + if FIRecordSet <> nil then + FIRecordSet.SetProp(prCursorType, Integer(CursorType)); + end; +end; + +procedure TCustomMSDataSet.SetCommandTimeout(const Value: integer); +begin + if FCommandTimeout <> Value then begin + FCommandTimeout := Value; + if FIRecordSet <> nil then + FIRecordSet.SetProp(prCommandTimeout, FCommandTimeout); + end; +end; + +procedure TCustomMSDataSet.BreakExec; +begin + Assert(FICommand <> nil); + if FICommand.Executing then + FICommand.BreakExec; + FIRecordSet.BreakFetch; +end; + +procedure TCustomMSDataSet.RefreshQuick(const CheckDeleted: boolean); +begin + InternalRefreshQuick(CheckDeleted); +end; + +procedure TCustomMSDataSet.CheckInactive; +begin + inherited; +end; + +function TCustomMSDataSet.GetUpdateObject: TMSUpdateSQL; +begin + Result := TMSUpdateSQL(inherited UpdateObject); +end; + +procedure TCustomMSDataSet.SetUpdateObject(Value: TMSUpdateSQL); +begin + inherited UpdateObject := Value; +end; + +{ TMSTable } + +function TCustomMSTable.PSGetTableName: string; +begin + Result := TableName; +end; + +procedure TCustomMSTable.PSSetParams(AParams: DB.TParams); +var + St: string; + i: integer; +begin + if (Params.Count <> AParams.Count) then begin + SQL.Text := ''; + St := ''; + + for i := 0 to AParams.count - 1 do begin + if St <> '' then + St := St + ' AND '; + St := AParams[i].Name + ' = :' + AParams[i].Name; + end; + + PrepareSQL; + + if St <> '' then + AddWhere(St); + end; + + inherited; +end; + +{$IFDEF VER5P} + +procedure TCustomMSTable.PSSetCommandText(const CommandText: string); +begin + if CommandText <> '' then + TableName := CommandText; +end; + +{$ENDIF} + +procedure TCustomMSTable.SetTableName(const Value: string); +begin + if not (csReading in ComponentState) then + Active := False; + FTableName := UnbracketIfPossible(Trim(Value)); + + SQL.Clear; +end; + +procedure TCustomMSTable.SetOrderFields(Value: string); +var + OldActive: boolean; +begin + Value := Trim(Value); + if Value <> FOrderFields then begin + FOrderFields := Value; + OldActive := Active; + if not (csLoading in ComponentState) then + SQL.Text := ''; + + if OldActive then + Open; + end; +end; + +procedure TCustomMSTable.PrepareSQL; +var + St: string; + MasterPos: integer; + MasterName: string; + Param: TDAParam; +begin + //WAR TCustomMSStoredProc.PrepareSQL and TCustomMSTable.PrepareSQL is based on different principies and work in different ways + if TableName = '' then + DatabaseError(STableNameNotDefined); + + if SQL.Count = 0 then begin + St := 'SELECT * FROM ' + BracketIfNeed(TableName); + + if OrderFields <> '' then + St := St + ' ORDER BY ' + OrderFields; + + SQL.Text := St; + end; + + // CR 8883 + // for TMSQuery second MD-way is more useful + if (DataSource <> nil) and (FMasterFields <> '') and (FDetailFields <> '') and not DataSource.DataSet.Active// see TCustomDADataSet.GetFinalSQL + then begin + MasterPos := 1; + while True do begin + MasterName := ExtractFieldName(FMasterFields, MasterPos); + if MasterName <> '' then begin + Param := Params.FindParam(MasterName); + if Param <> nil then + Param.DataType := ftString; + end + else + break; + end; + end; +end; + +procedure TCustomMSTable.Prepare; +begin + PrepareSQL; + + inherited; +end; + +procedure TCustomMSTable.OpenCursor(InfoQuery: boolean); +begin + PrepareSQL; + + inherited; +end; + +procedure TCustomMSTable.Execute; +begin + PrepareSQL; + + inherited; +end; + +procedure TCustomMSTable.AssignTo(Dest: TPersistent); +begin + inherited; + + if Dest is TCustomMSTable then begin + TCustomMSTable(Dest).OrderFields := OrderFields; + TCustomMSTable(Dest).TableName := TableName; + TCustomMSTable(Dest).MasterSource := MasterSource; + TCustomMSTable(Dest).MasterFields := MasterFields; + TCustomMSTable(Dest).DetailFields := DetailFields; + end; +end; + +{ TCustomMSStoredProc } + +{$IFDEF VER5P} + +procedure TCustomMSStoredProc.PSSetCommandText(const CommandText: string); +begin + if CommandText <> '' then + StoredProcName := CommandText; +end; + +{$ENDIF} + +procedure TCustomMSStoredProc.SetIRecordSet(Value: TData); +begin + inherited; + + if FICommand <> nil then + FICommand.SetProp(prIsSProc, True); +end; + +procedure TCustomMSStoredProc.SetStoredProcName(const Value: string); +begin + if Value <> FStoredProcName then begin + SQL.Text := ''; + + FStoredProcName := Trim(Value); + + if (Connection <> nil) and Connection.Connected and (FStoredProcName <> '') then + PrepareSQL; + + if FICommand <> nil then + FICommand.SetProp(prIsSProc, True); + end; +end; + +procedure TCustomMSStoredProc.PrepareSQL; +begin + //WAR TCustomMSStoredProc.PrepareSQL and TCustomMSTable.PrepareSQL is based on different principies and work in different ways + + if SQL.Text = '' then begin + if StoredProcName = '' then + DatabaseError(SStoredProcNotDefined); + + InternalCreateProcCall(StoredProcName, Params.Count = 0); + end; +end; + +procedure TCustomMSStoredProc.Prepare; +begin + PrepareSQL; + + FIsInPrepare := True; + try + inherited; + finally + FIsInPrepare := False; + end; +end; + +procedure TCustomMSStoredProc.BeforeExecute; +begin + if not Prepared then + PrepareSQL; + + inherited; +end; + +procedure TCustomMSStoredProc.BeforeOpenCursor(InfoQuery: boolean); +begin + PrepareSQL; + + inherited; +end; + +procedure TCustomMSStoredProc.CreateFieldDefs; +begin + if not FIsInPrepare then + inherited; +end; + +procedure TCustomMSStoredProc.ExecProc; +begin + Execute; +end; + +procedure TCustomMSStoredProc.AssignTo(Dest:TPersistent); +var + I: Integer; + P: TMSParam; +begin + inherited; + + if Dest is TCustomMSStoredProc then begin + TCustomMSStoredProc(Dest).StoredProcName := FStoredProcName; + + for I := 0 to Params.Count - 1 do begin + P := TCustomMSStoredProc(Dest).FindParam(Params[I].Name); + if (P <> nil) and (P.DataType = Params[I].DataType) then begin + P.Assign(Params[I]); + end; + end; + end; +end; + +{ TMSMetadata } + +constructor TMSMetadata.Create(Owner: TComponent); +begin + inherited; + + Debug := False; + + ReadOnly := True; +end; + + +procedure TMSMetadata.SetDatabaseName(Value: string); +begin + Active := False; + FDatabaseName := Value; +end; + +procedure TMSMetadata.SetSchemaName(Value: string); +begin + Active := False; + FSchemaName := Value; +end; + +procedure TMSMetadata.SetObjectType(Value: TMSObjectType); +begin + Active := False; + FieldDefs.Updated := False; + FObjectType := Value; +end; + +procedure TMSMetadata.SetTableName(Value: string); +begin + Active := False; + FTableName := Value; +end; + +procedure TMSMetadata.SetStoredProcName(Value: string); +begin + Active := False; + FStoredProcName := Value; +end; + +procedure TMSMetadata.SetColumnName(Value: string); +begin + Active := False; + FColumnName := Value; +end; + +procedure TMSMetadata.SetIndexName(Value: string); +begin + Active := False; + FIndexName := Value; +end; + +procedure TMSMetadata.SetConstraintName(Value: string); +begin + Active := False; + FConstraintName := Value; +end; + +procedure TMSMetadata.SetLinkedServer(Value: string); +begin + Active := False; + FLinkedServer := Value; +end; + +procedure TMSMetadata.SetAssemblyName(Value: string); +begin + Active := False; + FAssemblyName := Value; +end; + +procedure TMSMetadata.SetAssemblyID(Value: integer); +begin + Active := False; + FAssemblyID := Value; +end; + +procedure TMSMetadata.SetReferencedAssemblyID(Value: integer); +begin + Active := False; + FReferencedAssemblyID := Value; +end; + +procedure TMSMetadata.SetUDTName(Value: string); +begin + Active := False; + FUDTName := Value; +end; + +procedure TMSMetadata.SetSchemaCollectionName(Value: string); +begin + Active := False; + FSchemaCollectionName := Value; +end; + +procedure TMSMetadata.SetTargetNamespaceURI(Value: string); +begin + Active := False; + FTargetNamespaceURI := Value; +end; + +function TMSMetadata.RequestIRowset: IRowset; + function GetTableType: string; + begin + case ObjectType of + otAliases, otAliasesInfo: + Result := 'ALIAS'; + otTables, otTablesInfo: + Result := 'TABLE'; + otSynonyms, otSynonymsInfo: + Result := 'SYNONYM'; + otSystemTables, otSystemTablesInfo: + Result := 'SYSTEM TABLE'; + otViews, otViewsInfo: + Result := 'VIEW'; + otGlobalTempTables, otGlobalTempTablesInfo: + Result := 'GLOBAL TEMPORARY'; + otLocalTempTables, otLocalTempTablesInfo: + Result := 'LOCAL TEMPORARY'; + otSystemViews, otSystemViewsInfo: + Result := 'SYSTEM VIEW'; + otExternalTablesInfo: + Result := 'EXTERNAL TABLE'; + end; + end; + +var + Schema: TGUID; + rgRestrictions: TRestrictions; +begin + BeginConnection; + try + case ObjectType of + otDatabases: + begin + SetLength(rgRestrictions, 1); + Schema := DBSCHEMA_CATALOGS; + rgRestrictions[0] := DatabaseName; + end; + otColumnPrivileges: + begin + SetLength(rgRestrictions, 6); + Schema := DBSCHEMA_COLUMN_PRIVILEGES; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + rgRestrictions[2] := TableName; + rgRestrictions[4 - 1] := ColumnName; + end; + otColumns: + begin + SetLength(rgRestrictions, 4); + Schema := DBSCHEMA_COLUMNS; + if Connection.Options.Provider <> prCompact then begin + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + end; + rgRestrictions[2] := TableName; + rgRestrictions[4 - 1] := ColumnName; + end; + otForeignKeys: + begin + SetLength(rgRestrictions, 6); + rgRestrictions[3] := DatabaseName; + rgRestrictions[4] := SchemaName; + rgRestrictions[5] := TableName; + Schema := DBSCHEMA_FOREIGN_KEYS; + end; + otPrimaryKeys: + begin + if Connection.Options.Provider <> prCompact then begin + SetLength(rgRestrictions, 3); + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + rgRestrictions[2] := TableName; + Schema := DBSCHEMA_PRIMARY_KEYS; + end + else begin + SetLength(rgRestrictions, 7); + rgRestrictions[2] := ConstraintName; + rgRestrictions[5] := TableName; + // Other Restriction columns not supported + Schema := DBSCHEMA_KEY_COLUMN_USAGE; + end; + end; + otIndexes: + begin + SetLength(rgRestrictions, 5); + if Connection.Options.Provider <> prCompact then begin + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + end; + rgRestrictions[2] := IndexName; + rgRestrictions[4] := TableName; + Schema := DBSCHEMA_INDEXES; + end; + otServerTypes: + begin + SetLength(rgRestrictions, 0); + Schema := DBSCHEMA_PROVIDER_TYPES; + end; + otSchemata: + begin + SetLength(rgRestrictions, 2); + Schema := DBSCHEMA_SCHEMATA; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + end; + otStatistics: + begin + SetLength(rgRestrictions, 3); + Schema := DBSCHEMA_STATISTICS; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + rgRestrictions[2] := TableName; + end; + otStoredProcs: + begin + SetLength(rgRestrictions, 3); + Schema := DBSCHEMA_PROCEDURES; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + rgRestrictions[2] := StoredProcName; + end; + otStoredProcParams: + begin + SetLength(rgRestrictions, 3); + Schema := DBSCHEMA_PROCEDURE_PARAMETERS; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + rgRestrictions[2] := StoredProcName; + end; + otAliases, otTables, otSynonyms, otSystemTables, otViews, otGlobalTempTables, otLocalTempTables, otSystemViews, + otAliasesInfo, otTablesInfo, otSynonymsInfo, otSystemTablesInfo, otViewsInfo, otGlobalTempTablesInfo, otLocalTempTablesInfo, otExternalTablesInfo, otSystemViewsInfo: + begin + SetLength(rgRestrictions, 4); + + if ObjectType in [otAliases, otTables, otSynonyms, otSystemTables, otViews, otGlobalTempTables, otLocalTempTables, otSystemViews] then + Schema := DBSCHEMA_TABLES + else + Schema := DBSCHEMA_TABLES_INFO; + if Connection.Options.Provider <> prCompact then begin + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + end; + rgRestrictions[2] := TableName; + rgRestrictions[3] := GetTableType; + end; + otTableConstraints: + begin + SetLength(rgRestrictions, 6); + Schema := DBSCHEMA_TABLE_CONSTRAINTS; + if Connection.Options.Provider <> prCompact then begin + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + end; + rgRestrictions[2] := ConstraintName; + rgRestrictions[5] := TableName; + end; + otTablePrivileges: + begin + SetLength(rgRestrictions, 3); + Schema := DBSCHEMA_TABLE_PRIVILEGES; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + rgRestrictions[2] := TableName; + end; + otLinkedServers: begin + SetLength(rgRestrictions, CRESTRICTIONS_DBSCHEMA_LINKEDSERVERS{1}); + Schema := DBSCHEMA_LINKEDSERVERS; + rgRestrictions[0] := LinkedServer; + end; + otAssemblies: begin + SetLength(rgRestrictions, CRESTRICTIONS_DBSCHEMA_SQL_ASSEMBLIES{4}); + Schema := DBSCHEMA_SQL_ASSEMBLIES; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + rgRestrictions[2] := AssemblyName; + if AssemblyID <> 0 then + rgRestrictions[3] := AssemblyID; + end; + otAssemblyDependencies: begin + SetLength(rgRestrictions, CRESTRICTIONS_DBSCHEMA_SQL_ASSEMBLY_DEPENDENCIES{4}); + Schema := DBSCHEMA_SQL_ASSEMBLY_DEPENDENCIES; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + if AssemblyID <> 0 then + rgRestrictions[2] := AssemblyID; + if ReferencedAssemblyID <> 0 then + rgRestrictions[3] := ReferencedAssemblyID; + end; + otUserTypes: begin + SetLength(rgRestrictions, CRESTRICTIONS_DBSCHEMA_SQL_USER_TYPES{3}); + Schema := DBSCHEMA_SQL_USER_TYPES; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + rgRestrictions[2] := UDTName; + end; + otXMLCollections: begin + SetLength(rgRestrictions, CRESTRICTIONS_DBSCHEMA_XML_COLLECTIONS{4}); + Schema := DBSCHEMA_XML_COLLECTIONS; + rgRestrictions[0] := DatabaseName; + rgRestrictions[1] := SchemaName; + rgRestrictions[2] := SchemaCollectionName; + rgRestrictions[3] := TargetNamespaceURI; + end; + end; + + Result := FIRecordSet.GetSchemaRowset(Schema, rgRestrictions); + finally + EndConnection; + end; +end; + +procedure TMSMetadata.InternalExecute; +var + Rowset: IRowset; +begin + Rowset := RequestIRowset; + FIRecordSet.SetIRowset(Rowset, False); + inherited; +end; + +procedure TMSMetadata.OpenCursor(InfoQuery: boolean); +var + Rowset: IRowset; +begin + Rowset := RequestIRowset; + FIRecordSet.SetIRowset(Rowset, False); + inherited; +end; + +{ TMSSQL } + +constructor TMSSQL.Create(Owner: TComponent); +begin + inherited; + + FAutoCommit := True; + FCommandTimeout := 0; + Macros.SetParserClass(TMSParser); +end; + +function TMSSQL.GetPermitPrepare: boolean; +begin + Result := False; +end; + +procedure TMSSQL.SetPermitPrepare(Value: boolean); +begin +end; + +procedure TMSSQL.CreateICommand; +begin + inherited; + + if FICommand = nil then + SetICommand(TOLEDBCommand.Create); +end; + +procedure TMSSQL.SetICommand(Value: TCRCommand); +begin + FICommand := TOLEDBCommand(Value); + + if FICommand <> nil then begin + FICommand.SetProp(prCommandTimeout, CommandTimeout); + FICommand.ReadParams := ReadParams; + end; + + inherited; +end; + +procedure TMSSQL.InternalPrepare; +begin + if SQL.Count = 0 then + DatabaseError(SEmptySQLStatement, Self); + + WriteParams; + + inherited; +end; + +procedure TMSSQL.InternalExecute(Iters: integer); +begin + inherited; + FICommand.SetCursorState(csInactive); // To prevent blocking execute on second exec +end; + +function TMSSQL.GetConnection: TMSConnection; +begin + Result := TMSConnection(inherited Connection); +end; + +procedure TMSSQL.SetConnection(Value: TMSConnection); +begin + inherited Connection := Value; +end; + +function TMSSQL.GetParams: TMSParams; +begin + Result := TMSParams(inherited Params); +end; + +procedure TMSSQL.SetParams(Value: TMSParams); +begin + inherited Params := Value; +end; + +procedure TMSSQL.AssignTo(Dest: TPersistent); +begin + inherited; + + if Dest is TMSSQL then begin + TMSSQL(Dest).Params.Assign(Params); + TMSSQL(Dest).NonBlocking := NonBlocking; + TMSSQL(Dest).AfterExecute := AfterExecute; + end; +end; + +function TMSSQL.ParseSQL(const SQL: string; Params: TDAParams; RenamePrefix: string = ''): string; +begin +{$IFDEF CLR} + if SQL.IndexOf(Char(':')) = -1 then +{$ELSE} + if StrScan(PChar(SQL), ':') = nil then +{$ENDIF} + Result := SQL // query without parameters + else + Result := inherited ParseSQL(SQL, Params, RenamePrefix); +end; + +function TMSSQL.CreateParser(const Text: string): TParser; +begin + Result := TMSParser.Create(Text); +end; + +procedure TMSSQL.AssembleSQL; +begin + if ParamCheck or (csDesigning in ComponentState) then + inherited + else begin + FNativeSQL := SQL.Text; + FNativeSQL := ParseSQL(nil); + FICommand.SetSQL(FNativeSQL); + end; +end; + +function TMSSQL.CreateParamsObject: TDAParams; +begin + Result := TMSParams.Create(Self); +end; + +procedure TMSSQL.CreateParams; +var + ParamDesc: TOLEDBParamDesc; + i: integer; +begin + Params.BeginUpdate; + try + Params.Clear; + for i := 0 to FICommand.GetParamCount - 1 do begin + ParamDesc := FICommand.GetParam(i); + with Params.Add as TDAParam do begin + Name := ParamDesc.GetName; + DataType := GetFieldType(ParamDesc.GetDataType); + ParamType := TParamType(ParamDesc.GetParamType); + end; + end; + finally + Params.EndUpdate; + end; +end; + +procedure TMSSQL.WriteParams(WriteValue: boolean = True); +var + Param: TMSParam; + ParamDesc: TOLEDBParamDesc; + dt: word; + + procedure WriteParamValue; + var + Value: Variant; + {$IFDEF CLR} + Value1, Value2: TBytes; + {$ELSE} + Value1: Variant; + {$ENDIF} + i, l: integer; + s: string; + CurrentConnection: TMSConnection; + begin + if not Param.Bound then + TOLEDBParamDesc(ParamDesc).SetUseDefaultValue(True); + + if Param.IsObjectDataType then begin + ParamDesc.SetNull(Param.IsNull); + ParamDesc.SetObject(Param.ParamObject); + Exit; + end; + + Value := Param.Value; + if (Param.DataType = ftDate) and not (VarIsEmpty(Value) or VarIsNull(Value)) then + Value := Int(Value); // drop time info + + // SQL Server Everywhere + CurrentConnection := Connection; + if (CurrentConnection = nil) and (FDataSet <> nil) then + CurrentConnection := TMSConnection(FDataSet.Connection); + + Assert(CurrentConnection <> nil); + + if (CurrentConnection.Options.Provider = prCompact) and (Param.OLEDBType = DBTYPE_UI1) then + ParamDesc.SetDataType(dtInt8); + + // Convert param values if need + if (dt in [dtBytes, dtVarBytes, dtBlob]) + and (VarType(Value) <> varArray + varByte) then + case VarType(Value) of + varEmpty, varNull:; + varShortInt {1 byte}, + varSmallint {2 bytes}, + varInteger {4 bytes}, + varInt64 {8 bytes}, + varByte {1 byte}, + varWord {2 bytes}, + varLongWord {4 bytes}: begin + case VarType(Value) of + varShortInt, varByte: + l := 1; + varSmallint, varWord: + l := 2; + varInteger, varLongWord: + l := 4; + varInt64: + l := 8; + else + begin + Assert(False); + l := - 1; + end; + end; + + // reverse bytes order + {$IFDEF CLR} + Value1 := BitConverter.GetBytes(Int64(Value)); + //Assert(l = Length(Value1)); + SetLength(Value2, l); + for i := 0 to l - 1 do + Value2[i] := Value1[l - 1 - i]; + Value := Value2; + {$ELSE} + Value1 := VarArrayCreate([0, l - 1], varByte); + + for i := 0 to l - 1 do + PChar(TVarData(Value1).VArray.Data)[i] := PChar(@TVarData(Value).VInteger)[l - 1 - i]; + Value := Unassigned; + Value := Value1; + {$ENDIF} + end; + varString{$IFDEF CLR}, varChar{$ENDIF}: begin + s := Value; + Value := Encoding.Default.GetBytes(s); + end; + end; + ParamDesc.SetValue(Unassigned); + ParamDesc.SetValue(Value); + end; + +var + ft: TFieldType; + i, l: integer; +begin + for i := 0 to Params.Count - 1 do begin + Param := Params[i] as TMSParam; + if i < FICommand.GetParamCount then + ParamDesc := TOLEDBParamDesc(FICommand.GetParam(i)) + else + ParamDesc := TOLEDBParamDesc(FICommand.AddParam); + ParamDesc.SetName(Param.Name); + + ft := Param.DataType; + dt := GetDataType(ft); + if dt = dtUnknown then + case ft of + {$IFDEF VER5P} + ftGuid: + dt := dtGuid; + {$ENDIF} + ftUnknown: + dt := dtUnknown; + ftBCD: + dt := dtBCD; + ftWideString: + dt := dtWideString; + else + dt := dtString; + // Assert(False, Format('Invalid Param.DataType - %d', [Integer(ft)])); + end; + + Assert(Param is TMSParam, 'Param must be TMSParam'); + l := TMSParam(Param).Size; + ParamDesc.SetSize(l); + + ParamDesc.SetDataType(dt); + ParamDesc.SetParamType(TParamDirection(Param.ParamType)); + ParamDesc.SetOLEDBType(Param.OLEDBType); + + if WriteValue then + WriteParamValue; + end; + while Params.Count < FICommand.GetParamCount do + FICommand.DeleteParam(FICommand.GetParamCount - 1); +end; + +procedure TMSSQL.ReadParams; +var + v: Variant; +begin + if FICommand.IUnknownIsNull and FICommand.IMultipleResultsIsNull then begin + FICommand.GetProp(prCanReadParams, v); + if Boolean(v) then begin + inherited; + FICommand.SetProp(prCanReadParams, False); + end; + end; +end; + +function TMSSQL.FindParam(const Value: string): TMSParam; +begin + Result := inherited FindParam(GetParamNameWODog(Value)) as TMSParam; +end; + +function TMSSQL.ParamByName(const Value: string): TMSParam; +begin + Result := inherited ParamByName(GetParamNameWODog(Value)) as TMSParam; +end; + +procedure TMSSQL.SetCommandTimeout(const Value: integer); +begin + if FCommandTimeout <> Value then begin + FCommandTimeout := Value; + if FICommand <> nil then + FICommand.SetProp(prCommandTimeout, FCommandTimeout); + end; +end; + +procedure TMSSQL.SetNonBlocking(const Value: boolean); +begin + if FNonBlocking <> Value then begin + FNonBlocking := Value; + if FICommand <> nil then + FICommand.SetProp(prNonBlocking, FNonBlocking); + end; +end; + +procedure TMSSQL.Execute(Iters: integer); +begin + if NonBlocking and Executing then + DatabaseError(SAsynchExecuting); + + inherited Execute(Iters); +end; + +procedure TMSSQL.BreakExec; +begin + Assert(FICommand <> nil); + FICommand.BreakExec; +end; + +procedure TMSSQL.CreateProcCall(Name: string); +var + NeedDescribe: boolean; + ParamDescs: TParamDescs; + ParamDesc: CRAccess.TParamDesc; + + Param: TMSParam; + ParamType: TParamType; + IsNewParam: boolean; + ft: TFieldType; + i: integer; + + ProcCallSQL: string; +begin + BeginConnection; + try + NeedDescribe := Params.Count = 0; + if NeedDescribe then begin + ProcCallSQL := FICommand.CreateProcCall(Name, True, True, False, False); + CreateParams; + end + else begin + WriteParams(False); + ProcCallSQL := FICommand.CreateProcCall(Name, False, True, False, False); + end; + + if NeedDescribe and (Params <> nil) then begin + ParamDescs := TOLEDBCommand(FICommand).Params; + for i := 0 to ParamDescs.Count - 1 do begin + ParamDesc := ParamDescs[i]; + ParamType := ConvertCRParamTypeToBDE(ParamDesc.GetParamType); + + Param := Params.FindParam(ParamDesc.GetName); + IsNewParam := Param = nil; + if IsNewParam then + Param := TMSParam.Create(Params, ParamType); + + Param.ParamType := ParamType; + ft := GetFieldType(ParamDesc.GetDataType); + if ft <> Param.DataType then + Param.DataType := ft; // To prevent clearing Param.Value on set DataType + Param.Name := ParamDesc.GetName; + if IsNewParam then + Param.Value := ParamDesc.GetValue; + Param.Size := ParamDesc.GetSize; + end; + + FICommand.SetProp(prDisableParamScan, True); + try + SQL.Text := ProcCallSQL; + finally + FICommand.SetProp(prDisableParamScan, False); + end; + end; + finally + EndConnection; + end; +end; + +{ TMSXMLField } + +constructor TMSXMLField.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + + SetDataType(TFieldType(ftMSXML)); +end; + +procedure TMSXMLField.GetText(var Text: string; DisplayText: Boolean); +begin + Text := '(xml)'; + if not GetIsNull then + Text := AnsiUpperCase(Text); +end; + +procedure TMSXMLField.SetSchemaCollection(Name, CatalogName, SchemaName: string); +begin + FSchemaCollection.Name := Name; + FSchemaCollection.CatalogName := CatalogName; + FSchemaCollection.SchemaName := SchemaName; + FTyped := (FSchemaCollection.Name <> '') or (FSchemaCollection.CatalogName <> '') or + (FSchemaCollection.SchemaName <> ''); +end; + +function TMSXMLField.GetBlobSize: Integer; +begin + with DataSet.CreateBlobStream(Self, bmRead) do + try + Result := Size; + finally + Free; + end; +end; + +procedure TMSXMLField.Clear; +begin + DataSet.CreateBlobStream(Self, bmWrite).Free; +end; + +class function TMSXMLField.IsBlob: Boolean; +begin + Result := True; +end; + +procedure TMSXMLField.LoadFromFile(const FileName: string); +var + Stream: TStream; +begin + Stream := TFileStream.Create(FileName, fmOpenRead); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TMSXMLField.LoadFromStream(Stream: TStream); +begin + with DataSet.CreateBlobStream(Self, bmWrite) do + try + CopyFrom(Stream, 0); + finally + Free; + end; +end; + +procedure TMSXMLField.SaveToFile(const FileName: string); +var + Stream: TStream; +begin + Stream := TFileStream.Create(FileName, fmCreate); + try + SaveToStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TMSXMLField.SaveToStream(Stream: TStream); +var + BlobStream: TStream; +begin + BlobStream := DataSet.CreateBlobStream(Self, bmRead); + try + Stream.CopyFrom(BlobStream, 0); + finally + BlobStream.Free; + end; +end; + +procedure TMSXMLField.SetFieldType(Value: TFieldType); +begin + SetDataType(Value); +end; + +{ TMSAccessUtils } + +class procedure TMSAccessUtils.GetKeyAndDataFields( + Obj: TCustomMSDataSet; + out KeyAndDataFields: TKeyAndDataFields; + const ForceUseAllKeyFields: boolean); +begin + Obj.GetKeyAndDataFields(KeyAndDataFields, ForceUseAllKeyFields); +end; + +class procedure TMSAccessUtils.SetDesigning(Obj: TCustomMSDataSet; Value: Boolean; SetChildren: Boolean = True); +begin + Obj.SetDesigning(Value, SetChildren); +end; + +class procedure TMSAccessUtils.SetLockLoginPromt(Obj: TMSConnection; Value: Boolean); +begin + Obj.FLockLoginPrompt := Value; +end; + +class function TMSAccessUtils.FIConnection(Obj: TMSConnection): TOLEDBConnection; +begin + Result := Obj.IConnection; +end; + +class function TMSAccessUtils.FIRecordSet(Obj: TCustomMSDataSet): TOLEDBRecordSet; +begin + Result := Obj.FIRecordSet; +end; + +class function TMSAccessUtils.GetOLEDBSQL(Obj: TCustomMSDataSet): string; +begin + Result := Obj.FICommand.SQL; +end; + +class function TMSAccessUtils.GetOLEDBSQL(Obj: TMSSQL): string; +begin + Result := Obj.FICommand.SQL; +end; + +type + _TOLEDBConnection = class(TOLEDBConnection); + +class function TMSAccessUtils.FIDBCreateSession(Obj: TOLEDBConnection): IDBCreateSession; +begin + Result := _TOLEDBConnection(Obj).FIDBCreateSession; +end; + +class procedure TMSAccessUtils.DoError(Obj: TMSConnection; E: Exception; var Fail: boolean); +begin + Assert(Obj.IConnection <> nil); + _TOLEDBConnection(Obj.IConnection).DoError(E, Fail); +end; + +initialization + __UseUpdateOptimization := True; + + try + TMSConnectionPoolManager.Clear; + except + end; + + if + {$IFDEF CLR} + CompareText(Assembly.GetCallingAssembly.GetName.Name, 'CoreLab.Sdac') = 0 + {$ELSE} + not IsLibrary + {$ENDIF} + then + Classes.RegisterClass(TMSXMLField); + +finalization + +end. diff --git a/internal/4.10.0.10/1/Source/MSConnectForm.dfm b/internal/4.10.0.10/1/Source/MSConnectForm.dfm new file mode 100644 index 0000000..b652187 --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSConnectForm.dfm @@ -0,0 +1,132 @@ +object MSConnectForm: TMSConnectForm + Left = 269 + Top = 112 + ActiveControl = edUsername + BorderIcons = [] + BorderStyle = bsDialog + Caption = 'Connect' + ClientHeight = 210 + ClientWidth = 291 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + Scaled = False + PixelsPerInch = 96 + TextHeight = 13 + object Panel: TPanel + Left = 8 + Top = 8 + Width = 273 + Height = 156 + BevelInner = bvRaised + BevelOuter = bvLowered + FullRepaint = False + TabOrder = 0 + object lbUsername: TLabel + Left = 16 + Top = 20 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Username' + Layout = tlCenter + end + object lbPassword: TLabel + Left = 16 + Top = 54 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Password' + Layout = tlCenter + end + object lbServer: TLabel + Left = 16 + Top = 88 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Server' + Layout = tlCenter + end + object lbDatabase: TLabel + Left = 16 + Top = 123 + Width = 73 + Height = 13 + AutoSize = False + Caption = 'Database' + Layout = tlCenter + end + object edUsername: TEdit + Left = 104 + Top = 16 + Width = 153 + Height = 21 + AutoSelect = False + MaxLength = 32767 + TabOrder = 0 + end + object edPassword: TEdit + Left = 104 + Top = 50 + Width = 153 + Height = 21 + AutoSelect = False + MaxLength = 32767 + PasswordChar = '*' + TabOrder = 1 + end + object edServer: TComboBox + Left = 104 + Top = 84 + Width = 153 + Height = 21 + DropDownCount = 10 + ItemHeight = 13 + TabOrder = 2 + OnDropDown = edServerDropDown + end + object edDatabase: TComboBox + Left = 104 + Top = 119 + Width = 153 + Height = 21 + DropDownCount = 10 + ItemHeight = 13 + TabOrder = 3 + OnDropDown = edDatabaseDropDown + end + end + object btConnect: TButton + Left = 52 + Top = 176 + Width = 89 + Height = 25 + Caption = 'Connect' + Default = True + TabOrder = 1 + OnClick = btConnectClick + end + object btCancel: TButton + Left = 148 + Top = 176 + Width = 89 + Height = 25 + Cancel = True + Caption = 'Cancel' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ModalResult = 2 + ParentFont = False + TabOrder = 2 + end +end diff --git a/internal/4.10.0.10/1/Source/MSConnectForm.pas b/internal/4.10.0.10/1/Source/MSConnectForm.pas new file mode 100644 index 0000000..26a186f --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSConnectForm.pas @@ -0,0 +1,185 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Connect Form +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +unit MSConnectForm; +{$ENDIF} +interface +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + StdCtrls, ExtCtrls, DBAccess, OLEDBAccess, OLEDBC, MSAccess, TypInfo; + +type + TMSConnectForm = class(TForm) + Panel: TPanel; + lbUsername: TLabel; + lbPassword: TLabel; + lbServer: TLabel; + edUsername: TEdit; + btConnect: TButton; + btCancel: TButton; + edPassword: TEdit; + edServer: TComboBox; + edDatabase: TComboBox; + lbDatabase: TLabel; + procedure btConnectClick(Sender: TObject); + procedure edServerDropDown(Sender: TObject); + procedure edDatabaseDropDown(Sender: TObject); + + private + FConnectDialog: TCustomConnectDialog; + FRetries: integer; + FOldCreateOrder: boolean; + FRetry: boolean; + + FListGot: boolean; + + procedure SetConnectDialog(Value: TCustomConnectDialog); + + protected + procedure DoInit; virtual; + procedure DoConnect; virtual; + + public + + published + property ConnectDialog: TCustomConnectDialog read FConnectDialog write SetConnectDialog; + + property OldCreateOrder: boolean read FOldCreateOrder write FOldCreateOrder; + end; + +implementation + +{$IFDEF IDE} +{$R *.dfm} +{$ENDIF} +{$R MSConnectForm.dfm} + +procedure TMSConnectForm.DoInit; +var + PropInfo: PPropInfo; +begin + FRetry := False; + FRetries := FConnectDialog.Retries; + Caption := FConnectDialog.Caption; + FListGot := False; + + with FConnectDialog do begin + lbUsername.Caption := UsernameLabel; + lbPassword.Caption := PasswordLabel; + lbServer.Caption := ServerLabel; + btConnect.Caption := ConnectButton; + btCancel.Caption := CancelButton; + + edUsername.Text := Connection.Username; + edPassword.Text := Connection.Password; + edServer.Text := Connection.Server; + + if (edUsername.Text <> '') and (edPassword.Text = '') then + ActiveControl := edPassword; + end; + + PropInfo := GetPropInfo(FConnectDialog, 'DatabaseLabel'); + if PropInfo <> nil then + lbDatabase.Caption := GetStrProp(FConnectDialog, PropInfo); + if FConnectDialog.Connection is TMSConnection then + edDatabase.Text := TMSConnection(FConnectDialog.Connection).Database; +end; + +procedure TMSConnectForm.DoConnect; +begin + FConnectDialog.Connection.Password := edPassword.Text; + FConnectDialog.Connection.Server := edServer.Text; + FConnectDialog.Connection.UserName := edUsername.Text; + if (FConnectDialog.Connection is TMSConnection) then + TMSConnection(FConnectDialog.Connection).Database := edDatabase.Text; + try + FConnectDialog.Connection.PerformConnect(FRetry); + ModalResult := mrOk; + except + on E: EMSError do begin + Dec(FRetries); + FRetry := True; + if FRetries = 0 then + ModalResult := mrCancel; + + if E.MSSQLErrorCode <= NE_MAX_NETERROR then + ActiveControl := edServer + else + if E.OLEDBErrorCode = DB_SEC_E_AUTH_FAILED then + if ActiveControl <> edUsername then + ActiveControl := edPassword; + raise; + end + else + raise; + end; +end; + +procedure TMSConnectForm.SetConnectDialog(Value: TCustomConnectDialog); +begin + FConnectDialog := Value; + DoInit; +end; + +procedure TMSConnectForm.btConnectClick(Sender: TObject); +begin + DoConnect; +end; + +procedure TMSConnectForm.edServerDropDown(Sender: TObject); +var + OldCursor: TCursor; +begin + if FListGot then + Exit; + + FListGot := True; + OldCursor := Screen.Cursor; + Screen.Cursor := crSQLWait; + try + FConnectDialog.GetServerList(edServer.Items); + finally + Screen.Cursor := OldCursor; + end; +end; + +procedure TMSConnectForm.edDatabaseDropDown(Sender: TObject); +var + OldCursor: TCursor; + OldLoginPrompt: boolean; + OldConnected: boolean; +begin + if not (FConnectDialog.Connection is TMSConnection) then + Exit; + + edDatabase.Items.Clear; + OldLoginPrompt := FConnectDialog.Connection.LoginPrompt; + OldCursor := Screen.Cursor; + OldConnected := FConnectDialog.Connection.Connected; + Screen.Cursor := crSQLWait; + + FConnectDialog.Connection.Password := edPassword.Text; + FConnectDialog.Connection.Server := edServer.Text; + FConnectDialog.Connection.UserName := edUsername.Text; + + try + FConnectDialog.Connection.LoginPrompt := False; + GetDatabasesList(TMSConnection(FConnectDialog.Connection), edDatabase.Items); + finally + FConnectDialog.Connection.Connected := OldConnected; + FConnectDialog.Connection.LoginPrompt := OldLoginPrompt; + Screen.Cursor := OldCursor; + end; +end; + +initialization +{ if GetClass('TMSConnectForm') = nil then + Classes.RegisterClass(TMSConnectForm);} +end. + diff --git a/internal/4.10.0.10/1/Source/MSConnectionPool.pas b/internal/4.10.0.10/1/Source/MSConnectionPool.pas new file mode 100644 index 0000000..ed55250 --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSConnectionPool.pas @@ -0,0 +1,213 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSConnectionPool; + +{$ENDIF} + +interface + +uses +{$IFDEF VER6P} + Variants, +{$ENDIF} + Classes, CRConnectionPool, CRAccess, OLEDBAccess; + +type + TMSConnectionParameters = class(TCRConnectionParameters) + protected + procedure AssignTo(Dest: TPersistent); override; + + public + Database: string; + IsolationLevel: TIsolationLevel; + Authentication: TMSAuthentication; + Provider: TOLEDBProvider; + + QuotedIdentifier: boolean; + Language: string; + Encrypt: boolean; + PersistSecurityInfo: boolean; + AutoTranslate: boolean; + NetworkLibrary: string; + ApplicationName: string; + WorkstationID: string; + PacketSize: integer; + + function Equals(Obj: TCRConnectionParameters): boolean; override; + end; + + TMSLocalConnectionPool = class(TCRLocalConnectionPool) + protected + function CreateNewConnector: TCRConnection; override; + end; + + + TMSConnectionPoolManager = class(TCRConnectionPoolManager) + protected + function CreateCRConnectionPool(ConnectionParameters: TCRConnectionParameters): TCRConnectionPool; override; + public + class procedure Clear; {$IFDEF CLR}static;{$ENDIF} + class function GetConnection(ConnectionParameters: TCRConnectionParameters): TCRConnection; {$IFDEF CLR}static;{$ENDIF} + end; + +implementation + +uses +{$IFDEF MSWINDOWS} + Windows, +{$ENDIF} + SysUtils, MemData, SyncObjs; + +var + ConnectionPoolManager: TMSConnectionPoolManager; + LockPoolManagerCreate: TCriticalSection; + +{ TMSConnectionParameters} + +procedure TMSConnectionParameters.AssignTo(Dest: TPersistent); +begin + if Dest is TMSConnectionParameters then begin + TMSConnectionParameters(Dest).Database := Database; + TMSConnectionParameters(Dest).IsolationLevel := IsolationLevel; + TMSConnectionParameters(Dest).Authentication := Authentication; + TMSConnectionParameters(Dest).Provider := Provider; + + TMSConnectionParameters(Dest).QuotedIdentifier := QuotedIdentifier; + TMSConnectionParameters(Dest).Language := Language; + TMSConnectionParameters(Dest).Encrypt := Encrypt; + TMSConnectionParameters(Dest).PersistSecurityInfo := PersistSecurityInfo; + TMSConnectionParameters(Dest).AutoTranslate := AutoTranslate; + TMSConnectionParameters(Dest).NetworkLibrary := NetworkLibrary; + TMSConnectionParameters(Dest).ApplicationName := ApplicationName; + TMSConnectionParameters(Dest).WorkstationID := WorkstationID; + TMSConnectionParameters(Dest).PacketSize := PacketSize; + end; + + inherited; +end; + +function TMSConnectionParameters.Equals(Obj: TCRConnectionParameters): boolean; +var + O: TMSConnectionParameters; +begin + Result := inherited Equals(Obj); + if Result and (Obj is TMSConnectionParameters) then begin + O := TMSConnectionParameters(obj); + Result := + (AnsiCompareText(Database, O.Database) = 0) and + (O.IsolationLevel = IsolationLevel) and + (O.Authentication = Authentication) and + (O.Provider = Provider) and + (O.QuotedIdentifier = QuotedIdentifier) and + (AnsiCompareText(O.Language, Language) = 0)and + (O.Encrypt = Encrypt) and + (O.PersistSecurityInfo = PersistSecurityInfo) and + (O.AutoTranslate = AutoTranslate) and + (AnsiCompareText(O.NetworkLibrary, NetworkLibrary) = 0) and + (AnsiCompareText(O.ApplicationName, ApplicationName) = 0) and + (AnsiCompareText(O.WorkstationID, WorkstationID) = 0) and + (O.PacketSize = PacketSize); + end; +end; + +{ TMSLocalConnectionPool } + +function TMSLocalConnectionPool.CreateNewConnector: TCRConnection; +begin + Result := TOLEDBConnection.Create; + + Result.SetProp(prDatabase, TMSConnectionParameters(ConnectionParameters).Database); + Result.SetProp(prIsolationLevel, Integer(TMSConnectionParameters(ConnectionParameters).IsolationLevel)); + Result.SetProp(prAuthentication, Integer(TMSConnectionParameters(ConnectionParameters).Authentication)); + Result.SetProp(prProvider, Integer(TMSConnectionParameters(ConnectionParameters).Provider)); + + Result.SetProp(prQuotedIdentifier, TMSConnectionParameters(ConnectionParameters).QuotedIdentifier); + Result.SetProp(prLanguage, TMSConnectionParameters(ConnectionParameters).Language); + Result.SetProp(prEncrypt, TMSConnectionParameters(ConnectionParameters).Encrypt); + Result.SetProp(prPersistSecurityInfo, TMSConnectionParameters(ConnectionParameters).PersistSecurityInfo); + Result.SetProp(prAutoTranslate, TMSConnectionParameters(ConnectionParameters).AutoTranslate); + Result.SetProp(prNetworkLibrary, TMSConnectionParameters(ConnectionParameters).NetworkLibrary); + Result.SetProp(prApplicationName, TMSConnectionParameters(ConnectionParameters).ApplicationName); + Result.SetProp(prWorkstationID, TMSConnectionParameters(ConnectionParameters).WorkstationID); + Result.SetProp(prPacketSize, TMSConnectionParameters(ConnectionParameters).PacketSize); + + StartWait; + try + Result.SetUsername(ConnectionParameters.Username); + Result.SetPassword(ConnectionParameters.Password); + Result.SetServer(ConnectionParameters.Server); + + Result.Connect(''); + finally + StopWait + end; +end; + +{ TMSConnectionPoolManager } + +function TMSConnectionPoolManager.CreateCRConnectionPool(ConnectionParameters: TCRConnectionParameters): TCRConnectionPool; +begin + Result := TMSLocalConnectionPool.Create(Self, ConnectionParameters); +end; + +class procedure TMSConnectionPoolManager.Clear; +begin + if ConnectionPoolManager <> nil then + ConnectionPoolManager.InternalClear; +end; + +class function TMSConnectionPoolManager.GetConnection(ConnectionParameters: TCRConnectionParameters): TCRConnection; +begin + LockPoolManagerCreate.Enter; + try + if ConnectionPoolManager = nil then + ConnectionPoolManager := TMSConnectionPoolManager.Create; + finally + LockPoolManagerCreate.Leave; + end; + + Result := ConnectionPoolManager.InternalGetConnection(ConnectionParameters); +end; + +{$IFDEF WIN32} +{$IFNDEF VER6P} +type + TDLLProc = procedure (Reason: Integer); +{$ENDIF} + +var + OldDLLProc: TDLLProc; + +procedure LibraryProc(Reason: integer); +begin + if Reason = DLL_PROCESS_DETACH then begin + ConnectionPoolManager.Free; + ConnectionPoolManager := nil; + end; + if Assigned(OldDLLProc) then + OldDLLProc(Reason); +end; +{$ENDIF} + +initialization +{$IFDEF WIN32} + OldDLLProc := DLLProc; + DLLProc := @LibraryProc; +{$ENDIF} + ConnectionPoolManager := nil; + LockPoolManagerCreate := TCriticalSection.Create; + +finalization + ConnectionPoolManager.Free; + ConnectionPoolManager := nil; + LockPoolManagerCreate.Free; + +end. diff --git a/internal/4.10.0.10/1/Source/MSConsts.pas b/internal/4.10.0.10/1/Source/MSConsts.pas new file mode 100644 index 0000000..17e9a0f --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSConsts.pas @@ -0,0 +1,126 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Contants and user messages +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSConsts; +{$ENDIF} + +interface + +const + {$EXTERNALSYM WSABASEERR} + WSABASEERR = 10000; + {$EXTERNALSYM WSAECONNRESET} + WSAECONNRESET = (WSABASEERR+54); + +{$IFDEF CLR} +const /// ??? Compiler Error +{$ELSE} +resourcestring +{$ENDIF} + SEmptySQLStatement = 'No SQL statement provided'; + SOLEDBError = 'OLE DB error occured. Code %Xh'; + SOLEDBNotFound = 'OLE DB not found'; + SMSSQLNotFound = 'Required provider is not installed'; + SNoResultSet = 'Query must return exactly one result set - use Execute'; + SBadStatementType = 'Bad statement type'; + SBadOutputParam = 'Bad parameter %s. Output parameters "text", "ntext" or "image" are not acceptable'; + SBadFieldType = 'Unknown field type "%s" (OLE DB code = %Xh)'; + SBadSQLObjectName = 'SQL Object name must be provided'; + SBookmarksRequired = 'Dataset does not support bookmarks, which are required for multi-record data controls'; + SCUandServerCursors = 'CachedUpdates not allowed for server cursors'; + SOpenNextPreparedSQL = 'Cannot OpenNext if statement is Prepared'; + SCursorTypeChanged = 'Cursor type changed for statement'; + SWrongMDACVer = 'Wrong MDAC version. Download latest MDAC version'; + SObjectOpen = 'Cannot execute command in current transaction context ' + + 'until previous opened DataSet (CursorType is ctDefaultResultSet) is fetched to end'; + SNoKeyFields = 'Key fields not found'; + SConnectionOpen = 'Cannot perform this operation on an open connection'; + SBadProviderName = 'Wrong provider name'; + + SBadDatabaseFile = 'Wrong Database file'; + SBadNetworkLibrary = 'Wrong NetworkLibrary value'; + SBadPacketSize = 'Wrong PacketSize value'; + SBadEncrypt = 'Wrong Encrypt value'; + + // see MSDN at oledb.chm::/htm/oledbstatus.htm + SInvalidParamType = 'invalid ParamType'; + SBadAccessor = 'bad accessor'; + SInvalidValue = 'invalid Value'; + SSignMismatch = 'sign mismatch'; + SDataOverflow = 'data overflow'; + SDataTruncated = 'data truncated'; + SOutOfMemory = 'could not allocate memory for return data'; + SCantCreate = 'the provider could not allocate memory in which to return data or a storage object was already open on the rowset. '; + SUnavaible = 'could not obtain the value'; + SPermissionDenied = 'user did not have permission to write to the column'; + SIntegrityViolation = 'the data value violates the integrity constraints for the column'; + SShemaViolation = 'the data value violates the schema''s constraint for the column'; + SBadStatus = 'bad status'; + SUnknownStatus = 'unknown status'; + + SParamNameMissing = 'Parameter name missing'; + SParamValueMissing = 'Parameter value missing'; + SInvalidChar = 'Invalid character in non-quoted parameter value'; + SParamNameUnknown = 'Parameter name is unknown - %s'; + SBadParamValue = 'Bad parameter value - %s=%s'; + + SCheckConnection = '/* Check connection */'; + + STimestampFieldRequired = 'Timestamp field required'; + SInvalidServerVersion = 'Invalid server version'; + SServiceNotDefined = 'Service not defined'; + STargetServiceNotDefined = 'Target service not defined'; + SServiceBrokerAsync = 'Cannot perform this operation in AsyncNotification mode'; + SDialogActive = 'Cannot perform this operation with open conversations'; + SConnectionClosed = 'Can''t perform operation on closed connection'; + + SLocalSortingServerCursor = 'Local sorting is not compatible with server cursor types'; + + // DBROWSTATUSENUM + SRowMultipleChanges = 'Updating or deleting a single row caused more than one row to be updated or deleted in the data store'; + SRowPendingChanges = 'A row had a pending change'; + SRowCanceled = 'Updating a row was canceled during notification'; + SRowConcurrencyViolation = 'A row was being updated or deleted, and the value of a column in that row has been changed since it was last fetched'; + SRowDeleted = 'A row was deleted'; + SRowIntegrityViolation = 'A row was being inserted, updated or deleted, and doing so violated the integrity constraints for the column or table'; + SRowPermissionDenied = 'The consumer did not have sufficient permission to update, delete, or insert a row'; + SRowLimitReached = 'The update, delete, or insert failed due to reaching a limit on the server, such as a query execution timing out'; + SRowSchemaViolation = 'A row was being inserted, no value was specified for a column, the column does not have a default, and the column is non-nullable'; + SRowFail = 'The consumer encountered a recoverable, provider-specific error, such as an RPC failure when transmitting the change to a remote server'; + + SInvalidQNStatement = 'SELECT statement does not meet the requirements for query notification'; + SStatementNotSupported = 'Statement does not support notifications'; + SInvalidQNSetOptions = 'The connection options were not set appropriately when the command was submitted'; + SInvalidQNIsolation = 'The isolation level is not valid for query notification'; + STemplateLimit = 'A table specified in the query has reached the maximum number of internal templates'; + SSubscriptionTimedOut = 'The subscription timeout expired'; + SQNObjectDropped = 'One of the underlying objects used by the query was dropped'; + SQNObjectAltered = 'One of the underlying objects used by the query was modified'; + SSQLServerStarted = 'SQL Server started'; + SSQLInternalError = 'An internal error occurred in SQL Server'; + SSubscriptionRemoved = 'The notification subscription was removed due to the state of SQL Server'; + + SSQLNCLINeeds = 'Provider must be SQL Native Client for nonblocking execute'; + SSQLNCLINeedsChangePwd = 'Provider must be SQL Native Client for changing password'; + + SAsynchExecuting = 'Operation cannot be performed while executing asynchronously'; + + SNumericOverflow = 'Numeric overflow'; + + SDMandServerCursors = 'DisconnectedMode not allowed for server cursors'; + + SSQLOLEDB = 'SQLOLEDB.1'; + SSQLNativeClient = 'SQLNCLI.1'; + SSQLEverywhere = 'MICROSOFT.SQLSERVER.MOBILE.OLEDB.3.0'; + +implementation + +end. diff --git a/internal/4.10.0.10/1/Source/MSDump.pas b/internal/4.10.0.10/1/Source/MSDump.pas new file mode 100644 index 0000000..5eb173a --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSDump.pas @@ -0,0 +1,486 @@ +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSDump; +{$ENDIF} + +interface + +uses + SysUtils, Classes, DB, CRAccess, DBAccess, MSAccess, DADump, DAScript; + +type + TMSDump = class; + + //TMSDumpObject = (doData); + //TMSDumpObjects = set of TMSDumpObject; + + TMSDumpOptions = class(TDADumpOptions) + protected + FIdentityInsert: boolean; + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create(Owner: TMSDump); + published + property IdentityInsert: boolean read FIdentityInsert write FIdentityInsert default False; + end; + + TMSDump = class(TDADump) + protected + //FObjects: TMSDumpObjects; + + procedure AssignTo(Dest: TPersistent); override; + + function GetTableInfoClass: TTableInfoClass; override; + + function GetConnection: TMSConnection; + procedure SetConnection(Value: TMSConnection); + + function GetTableNames: string; override; + procedure SetTableNames(Value: string); override; + + function CreateOptions: TDADumpOptions; override; + function CreateScript: TDAScript; override; + + function GetOptions: TMSDumpOptions; + procedure SetOptions(Value: TMSDumpOptions); + + procedure InternalBackup(Query: string); override; + public + constructor Create(Owner: TComponent); override; + published + property Connection: TMSConnection read GetConnection write SetConnection; + + //property Objects: TMSDumpObjects read FObjects write FObjects default [doData]; + property Options: TMSDumpOptions read GetOptions write SetOptions; + end; + +implementation + +uses +{$IFDEF CLR} + System.Text, System.Runtime.InteropServices, +{$ELSE} + CLRClasses, +{$ENDIF} +{$IFDEF VER6P} + Variants, +{$ENDIF} + MemUtils, MemData, DAConsts, DALoader, OLEDBAccess, MSScript; + +{ TMSDumpOptions } + +constructor TMSDumpOptions.Create(Owner: TMSDump); +begin + inherited Create(Owner); + + FIdentityInsert := False; +end; + +procedure TMSDumpOptions.AssignTo(Dest: TPersistent); +begin + inherited; + + if Dest is TMSDumpOptions then begin + TMSDumpOptions(Dest).IdentityInsert := IdentityInsert; + end; +end; + +{ TMSDump } + +constructor TMSDump.Create(Owner: TComponent); +begin + inherited Create(Owner); + + //FObjects := [doData]; + + FLeftQuote := OLEDBAccess.LeftQuote; + FRightQuote := OLEDBAccess.RightQuote; +end; + +procedure TMSDump.AssignTo(Dest: TPersistent); +begin + inherited; + + if Dest is TMSDump then begin + //TMSDump(Dest).Objects := Objects; + end; +end; + +function TMSDump.GetTableInfoClass: TTableInfoClass; +begin + Result := TOLEDBTableInfo; +end; + +function TMSDump.GetConnection: TMSConnection; +begin + Result := TMSConnection(inherited Connection); +end; + +procedure TMSDump.SetConnection(Value: TMSConnection); +begin + inherited Connection := Value; +end; + +function TMSDump.GetTableNames: string; +begin + Result := TableNamesFromList(FTables); +end; + +procedure TMSDump.SetTableNames(Value: string); +begin + TableNamesToList(Value, FTables); +end; + +function TMSDump.CreateOptions: TDADumpOptions; +begin + Result := TMSDumpOptions.Create(nil); +end; + +function TMSDump.CreateScript: TDAScript; +begin + Result := TMSScript.Create(nil); +end; + +function TMSDump.GetOptions: TMSDumpOptions; +begin + Result := TMSDumpOptions(inherited Options); +end; + +procedure TMSDump.SetOptions(Value: TMSDumpOptions); +begin + inherited Options := Value; +end; + +{$IFNDEF CLR} +type + _StringBuilder = class (StringBuilder); +{$ENDIF} + +procedure TMSDump.InternalBackup(Query: string); +var + MSQuery: TMSQuery; + TableCount: integer; + + procedure VarToMSSQL(Field: TField; FieldDesc: TOLEDBFieldDesc; sb: StringBuilder); + var + dt: TDateTime; + Blob: TBlob; + Piece: PPieceHeader; + Value: Variant; + Data: TBytes; + {$IFNDEF VER6P} + pValueData: PVarData; + {$ENDIF} + {$IFDEF CLR} + Bytes: TBytes; + {$ELSE} + sbOffset: integer; + {$ENDIF} + begin + SetLength(Data, 0); // To avoid Hint from compiler + case FieldDesc.DataType of + dtBoolean: + sb.Append(BoolToStr(Field.AsBoolean)); + dtUnknown, dtString, dtMemo, dtWideMemo, dtExtString, dtWideString, dtExtWideString, dtGuid{$IFDEF VER5P}, dtVariant{$ENDIF}: + sb.Append(QuotedStr(Field.AsString)); + dtInt8, dtInt16, dtInt32, dtInt64, + dtUInt16, dtUInt32: begin + {$IFNDEF VER6P} + Value := Field.AsVariant; + pValueData := @TVarData(Value); + if pValueData.VType = varDecimal then + sb.Append(IntToStr(PInt64(@pValueData.VInteger)^)) + else + {$ENDIF} + sb.Append(Field.AsString); + end; + dtFloat, dtCurrency: + sb.Append(ChangeDecimalSeparator(Field.AsString)); + dtDate, dtTime, dtDateTime: begin + dt := Field.AsDateTime; + if dt = 0 then + sb.Append(QuotedStr('1900-01-01 00:00:00')) + else + sb.Append(QuotedStr(FormatDateTime('YYYY-MM-DD HH:NN:SS', dt))); + end; + dtBlob: begin + sb.Append('0x'); + Blob := MSQuery.GetBlob(Field.FieldName); + Piece := Blob.FirstPiece; + + {$IFDEF CLR} + while IntPtr(Piece) <> nil do begin + SetLength(Data, Piece.Used); + Marshal.Copy(IntPtr(Integer(Piece) + sizeof(TPieceHeader)), Data, 0, Piece.Used); + SetLength(Bytes, Length(Data) * 2); + BinToHex(Data, 0, Bytes, 0, Length(Data)); + sb.Append(Encoding.Default.GetString(Bytes)); + Piece := Piece.Next; + end; + {$ELSE} + sbOffset := sb.Length + 1; + sb.Length := sb.Length + Integer(Blob.Size) * 2; + while Piece <> nil do begin + BinToHex(IntPtr(Integer(Piece) + sizeof(TPieceHeader)), + IntPtr(Integer(@_StringBuilder(sb).FString[sbOffset])), Piece.Used); + sbOffset := sbOffset + Integer(Piece.Used); + Piece := Piece.Next; + end; + {$ENDIF} + end; + dtBytes, dtVarBytes, dtExtVarBytes: begin + sb.Append('0x'); + Value := Field.Value; + Data := Value; + {$IFDEF CLR} + SetLength(Bytes, Length(Data) * 2); + BinToHex(Data, 0, Bytes, 0, Length(Data)); + sb.Append(Encoding.Default.GetString(Bytes)); + {$ELSE} + sbOffset := sb.Length + 1; + sb.Length := sb.Length + Length(Data) * 2; + BinToHex(@Data[0], + IntPtr(Integer(@_StringBuilder(sb).FString[sbOffset])), Length(Data)); + {$ENDIF} + end; + else + Assert(False, 'Unknown datatype (' + IntToStr(FieldDesc.DataType) + ')'); + end; + end; + + procedure BackupTablesAndData; + + function FieldIsIdentity(Field: TField): boolean; + var + FieldDesc: TOLEDBFieldDesc; + begin + FieldDesc := MSQuery.GetFieldDesc(Field) as TOLEDBFieldDesc; + Result := FieldDesc.IsAutoIncrement; + end; + + procedure BackupTable(TableName: string; TableNum: integer); + var + KeyAndDataFields: TKeyAndDataFields; + + procedure GetCurrentRow(sb: StringBuilder); + var + sbOldLen: integer; + + procedure ProcessField(Field: TField); + var + Value: Variant; + FieldDesc: TOLEDBFieldDesc; + begin + if sbOldLen <> sb.Length then + sb.Append(', '); + + Value := Field.AsVariant; + if VarIsEmpty(Value) or VarIsNull(Value) or Field.IsNull then + sb.Append('NULL') + else + begin + FieldDesc := MSQuery.GetFieldDesc(Field) as TOLEDBFieldDesc; + VarToMSSQL(Field, FieldDesc, sb); + end; + end; + + var + i: integer; + begin + sbOldLen := sb.Length; + + if Length(KeyAndDataFields.DataFieldDescs) = 0 then begin + for i := 0 to MSQuery.FieldCount - 1 do + if not (FieldIsIdentity(MSQuery.Fields[i]) and not Options.IdentityInsert) then + ProcessField(MSQuery.Fields[i]); + end + else + begin + if (TDBAccessUtils.GetIdentityField(MSQuery) <> nil) and Options.IdentityInsert then + ProcessField(TDBAccessUtils.GetIdentityField(MSQuery)); + for i := 0 to Length(KeyAndDataFields.DataFieldDescs) - 1 do + ProcessField(MSQuery.GetField(KeyAndDataFields.DataFieldDescs[i])); + end; + end; + + var + RecordCount: integer; + InsHeader: string; + FieldList: string; + i: integer; + SQLSelect1: string; + sb: StringBuilder; + + begin + FieldList := ''; + if Query = '' then + SQLSelect1 := 'SELECT * FROM ' + TableName + else + SQLSelect1 := Query; + + MSQuery.SQL.Text := SQLSelect1; + MSQuery.AddWhere('0=1'); + try + MSQuery.Open; + + if (TableName = '') + and (TDBAccessUtils.GetTablesInfo(MSQuery).Count > 0) then + TableName := TDBAccessUtils.GetTablesInfo(MSQuery)[0].TableName; + + if (TDBAccessUtils.GetIdentityField(MSQuery) <> nil) and Options.IdentityInsert then + FieldList := QuoteName(TDBAccessUtils.GetIdentityField(MSQuery).FieldName); + + TDBAccessUtils.GetKeyAndDataFields(MSQuery, KeyAndDataFields, False); + for i := 0 to Length(KeyAndDataFields.DataFieldDescs) - 1 do + if not (TOLEDBFieldDesc(KeyAndDataFields.DataFieldDescs[i]).IsAutoIncrement and not Options.IdentityInsert) then + if FieldList = '' then + FieldList := QuoteName(KeyAndDataFields.DataFieldDescs[i].Name) + else + FieldList := FieldList + ', ' + QuoteName(KeyAndDataFields.DataFieldDescs[i].Name); + finally + MSQuery.Close; + end; + + if True {(doData in Objects)} then begin + if Options.GenerateHeader then + AddLineToSQL(SBHTableData, [TableName]); + + if Options.AddDrop {and not (doTables in Objects)} then + Add('TRUNCATE TABLE ' + TableName + ';'); + + if Options.IdentityInsert then + Add(Format('SET IDENTITY_INSERT %s ON;', [TableName])); + + MSQuery.SQL.Text := 'SELECT COUNT(*) FROM ' + TableName; + MSQuery.Execute; + RecordCount := MSQuery.Fields[0].AsInteger; + + if Assigned(FOnBackupProgress) then + FOnBackupProgress(Self, TableName, TableNum, TableCount, 0); + + if RecordCount > 0 then begin + if FieldList = '' then + InsHeader := TableName + else + InsHeader := TableName + '(' + FieldList + ')'; + + InsHeader := 'INSERT INTO ' + InsHeader + ' VALUES'; + + MSQuery.SQL.Text := SQLSelect1; + MSQuery.Open; + if FieldList <> '' then + TDBAccessUtils.GetKeyAndDataFields(MSQuery, KeyAndDataFields, False); + + sb := StringBuilder.Create; + try + while not MSQuery.Eof do begin + if Assigned(FOnBackupProgress) then + FOnBackupProgress(Self, TableName, TableNum, TableCount, Trunc(MSQuery.RecNo * 100 / RecordCount)); + + sb.Length := 0; + sb.Append(InsHeader); + sb.Append(' ('); + GetCurrentRow(sb); + sb.Append(');'); + Add(sb.ToString); + MSQuery.Next; + end; + finally + sb.Free; + end; + end; + if Options.IdentityInsert then + Add(Format('SET IDENTITY_INSERT %s OFF;', [TableName])); + end; + end; + + var + i: integer; + TablesList: TStringList; + TableName: string; + + begin + if Query = '' then begin + TablesList := nil; + try + TablesList := TStringList.Create; + + if FTables.Count = 0 then + GetTablesList(Connection, TablesList) + else + TablesList.Assign(FTables); + + for i := 0 to TablesList.Count - 1 do begin + TableName := QuoteName(TablesList[i]); + + if Assigned(FOnBackupProgress) then + FOnBackupProgress(Self, TableName, i, TablesList.Count, 0); + + TableCount := TablesList.Count; + BackupTable(TableName, i); + Add(''); + end; + + finally + TablesList.Free; + end; + end + else + begin + if FTables.Count = 1 then + TableName := QuoteName(FTables[0]) + else + TableName := ''; + + if Assigned(FOnBackupProgress) then + FOnBackupProgress(Self, TableName, 0, 1, 0); + + TableCount := 1; + BackupTable(TableName, 0); + Add(''); + end; + end; + +begin + BeginConnection; + try + Query := Trim(Query); + if (Query <> '') and (FTables.Count > 1) then + raise Exception.Create(SWrongTblCount); + MSQuery := nil; + FSQL.BeginUpdate; + try + FSQL.Text := ''; + if Options.GenerateHeader then + AddLineToSQL(Format(SBHCaption, ['Sdac', SDACVersion, + 'MS SQL', Connection.ServerVersion, 'MS SQL', Connection.ClientVersion, DateTimeToStr(Now), + Connection.Server, Connection.Database])); + + MSQuery := TMSQuery.Create(nil); + MSQuery.Connection := Connection; + MSQuery.ReadOnly := False; + MSQuery.FetchAll := True; + MSQuery.UniDirectional := True; + MSQuery.Options.SetFieldsReadOnly := True; + MSQuery.Options.QueryRecCount := False; + + // if doData in Objects then + BackupTablesAndData; + + finally + FSQL.EndUpdate; + MSQuery.Free; + end; + finally + EndConnection; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/MSLoader.pas b/internal/4.10.0.10/1/Source/MSLoader.pas new file mode 100644 index 0000000..29943c9 --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSLoader.pas @@ -0,0 +1,564 @@ +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// MSAccess +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSLoader; +{$ENDIF} +interface + +uses +{$IFDEF CLR} + System.Runtime.InteropServices, Variants, +{$ELSE} + CLRClasses, +{$ENDIF} + Windows, Classes, DB, MemDS, CRAccess, MemData, + DALoader, OLEDBAccess, MSAccess, OLEDBC, OLEDBIntf; + +type + TMSColumn = class(TDAColumn) + private + FSize: integer; + FPrecision: integer; + FScale: integer; + FIsWide: boolean; + + function GetSize: integer; + procedure SetSize(Value: integer); + + protected + procedure SetFieldType(Value: TFieldType); override; + + published + property Size: integer read GetSize write SetSize; + property Precision: integer read FPrecision write FPrecision default 0; + property Scale: integer read FScale write FScale default 0; + end; + + TMSLoader = class; + + TMSPutDataEvent = procedure (Sender: TMSLoader) of object; + TMSGetColumnDataEvent = procedure (Sender: TObject; Column: TMSColumn; + Row: integer; var Value: variant; var IsEOF: boolean) of object; + + TMSLoaderOptions = class(TPersistent) + private + FRowsPerBatch: integer; + FKilobytesPerBatch: integer; + FLockTable: boolean; + FCheckConstraints: boolean; + FOwner: TMSLoader; + protected + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create(Owner: TMSLoader); + published + property RowsPerBatch: integer read FRowsPerBatch write FRowsPerBatch default 0; + property KilobytesPerBatch: integer read FKilobytesPerBatch write FKilobytesPerBatch default 0; + property LockTable: boolean read FLockTable write FLockTable default False; + property CheckConstraints: boolean read FCheckConstraints write FCheckConstraints default False; + end; + + TDBIDAccessor = class + protected + FPDBID: PDBID; + function GeteKind: DBKIND; + procedure SeteKind(Value: DBKIND); + function GetpwszName: IntPtr; + procedure SetpwszName(Value: IntPtr); + procedure SetPDBID(Value: PDBID); + public + constructor Create(APDBID: PDBID); + property eKind: DBKIND read GeteKind write SeteKind; + property pwszName: IntPtr read GetpwszName write SetpwszName; + end; + + TMSLoader = class(TDALoader) + private + FIOpenRowset: IOpenRowset; + FIRowsetFastLoad: IRowsetFastLoad; + FParamsAccessorData: TParamsAccessorData; + FOnPutData: TMSPutDataEvent; + FOnGetColumnData: TMSGetColumnDataEvent; + FKeepIdentity: boolean; + FKeepNulls: boolean; + FOptions: TMSLoaderOptions; + FParamDescs: TParamDescs; + + procedure DAPutDataEvent(Sender: TDALoader); + procedure DAGetColumnDataEvent(Sender: TObject; Column: TDAColumn; + Row: integer; var Value: variant; var IsEOF: boolean); + protected + class function DAColumnClass: TDAColumnClass; override; + function GetConnection: TMSConnection; + procedure SetConnection(Value: TMSConnection); + procedure SetOnPutData(const Value: TMSPutDataEvent); + procedure SetOnGetColumnData(const Value: TMSGetColumnDataEvent); + procedure SetKeepIdentity(Value: boolean); + procedure SetKeepNulls(Value: boolean); + procedure SetOptions(Value: TMSLoaderOptions); + + procedure Prepare; override; + procedure Commit(Done: boolean = True); + procedure Finish; override; + + procedure FillColumn(Column: TDAColumn; FieldDesc: TFieldDesc); override; + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + procedure PutColumnData(Col: integer; Row: integer; const Value: variant); override; + published + property Connection: TMSConnection read GetConnection write SetConnection; + property TableName; + property Columns; + property KeepIdentity: boolean read FKeepIdentity write SetKeepIdentity default False; + property KeepNulls: boolean read FKeepNulls write SetKeepNulls default False; + property Options: TMSLoaderOptions read FOptions write SetOptions; + property OnPutData: TMSPutDataEvent read FOnPutData write SetOnPutData; + property OnGetColumnData: TMSGetColumnDataEvent read FOnGetColumnData write SetOnGetColumnData; + end; + +implementation + +uses + SysUtils, +{$IFDEF CLR} + System.Text, +{$ENDIF} +{$IFDEF VER6P} +{$IFNDEF CLR} + Variants, +{$ENDIF} + FmtBcd, +{$ENDIF} + ActiveX, MemUtils, DBAccess; + +{ TMSColumn } + +function TMSColumn.GetSize: integer; +begin + if (FieldType in [ftString, ftFixedChar, ftWideString, ftBytes, ftVarBytes, + ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}, ftVariant, ftUnknown]) then + Result := FSize + else + Result := 0; +end; + +procedure TMSColumn.SetFieldType(Value: TFieldType); +var + NewValue: boolean; +begin + NewValue := Value <> FieldType; + + inherited; + + if NewValue then + case FieldType of + ftGuid: + FSize := SizeOf(TGuid); + ftSmallint: + FSize := SizeOf(SmallInt); + ftInteger: + FSize := SizeOf(Integer); + ftWord: + FSize := SizeOf(Word); + ftLargeint: + FSize := SizeOf(LargeInt); + ftBoolean: + FSize := SizeOf(Boolean); + ftFloat, ftCurrency: + FSize := SizeOf(Double); + ftBCD: + FSize := SizeOf(Currency); + {$IFDEF VER6P} + ftFMTBcd: + FSize := SizeOf(TBcd); + {$ENDIF} + ftDate, ftTime, ftDateTime{$IFDEF VER6P}, ftTimeStamp{$ENDIF}: + FSize := SizeOf(Double); + else + FSize := 0; + end; +end; + +procedure TMSColumn.SetSize(Value: integer); +begin + if (FieldType in [ftString, ftFixedChar, ftWideString, ftBytes, ftVarBytes, + ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}, ftVariant, ftUnknown]) and (Value > 0) then + FSize := Value; +end; + +{ TDBIDAccessor } + +constructor TDBIDAccessor.Create(APDBID: PDBID); +begin + inherited Create; + + FPDBID := APDBID; +end; + +procedure TDBIDAccessor.SetPDBID(Value: PDBID); +begin + FPDBID := Value; +end; + +function TDBIDAccessor.GeteKind: DBKIND; +var + Offset: integer; +begin + Offset := 16; + Result := Marshal.ReadInt32(FPDBID, Offset); +end; + +procedure TDBIDAccessor.SeteKind(Value: DBKIND); +var + Offset: integer; +begin + Offset := 16; + Marshal.WriteInt32(FPDBID, Offset, Value); +end; + +function TDBIDAccessor.GetpwszName: IntPtr; +var + Offset: integer; +begin + Offset := 20; + Result := Marshal.ReadIntPtr(FPDBID, Offset); +end; + +procedure TDBIDAccessor.SetpwszName(Value: IntPtr); +var + Offset: integer; +begin + Offset := 20; + Marshal.WriteIntPtr(FPDBID, Offset, Value); +end; + +{ TMSLoader } + +class function TMSLoader.DAColumnClass: TDAColumnClass; +begin + Result := TMSColumn; +end; + +function TMSLoader.GetConnection: TMSConnection; +begin + Result := TMSConnection(inherited Connection); +end; + +procedure TMSLoader.SetConnection(Value: TMSConnection); +begin + inherited Connection := Value; +end; + +procedure TMSLoader.DAPutDataEvent(Sender: TDALoader); +begin + if Assigned(FOnPutData) then + FOnPutData(TMSLoader(Sender)); +end; + +procedure TMSLoader.DAGetColumnDataEvent(Sender: TObject; Column: TDAColumn; + Row: integer; var Value: variant; var IsEOF: boolean); +begin + if Assigned(FOnGetColumnData) then + FOnGetColumnData(Sender, TMSColumn(Column), Row, Value, IsEOF); +end; + +procedure TMSLoader.SetOnPutData(const Value: TMSPutDataEvent); +begin + FOnPutData := Value; + if Assigned(FOnPutData) then + inherited OnPutData := DAPutDataEvent + else + inherited OnPutData := nil; +end; + +procedure TMSLoader.SetOnGetColumnData(const Value: TMSGetColumnDataEvent); +begin + FOnGetColumnData := Value; + if Assigned(Value) then + inherited OnGetColumnData := DAGetColumnDataEvent + else + inherited OnGetColumnData := nil; +end; + +procedure TMSLoader.SetKeepIdentity(Value: boolean); +begin + FKeepIdentity := Value; +end; + +procedure TMSLoader.SetKeepNulls(Value: boolean); +begin + FKeepNulls := Value; +end; + +procedure TMSLoader.SetOptions(Value: TMSLoaderOptions); +begin + FOptions.Assign(Value); +end; + +constructor TMSLoader.Create(Owner: TComponent); +begin + inherited Create(Owner); + + FOptions := TMSLoaderOptions.Create(Self); + FKeepIdentity := False; + FKeepNulls := False; + FSkipReadOnlyFieldDescs := False; +end; + +destructor TMSLoader.Destroy; +begin + Assert(FIOpenRowset = nil); + Assert(FIRowsetFastLoad = nil); + FOptions.Free; + + inherited; +end; + +procedure TMSLoader.FillColumn(Column: TDAColumn; FieldDesc: TFieldDesc); +begin + with TMSColumn(Column) do begin + Name := FieldDesc.Name; + FIsWide := (FieldDesc.SubDataType and dtWide) <> 0; + FieldType := GetFieldType(FieldDesc.DataType); + case FieldType of + ftString, ftFixedChar, ftWideString, ftBytes, ftVarBytes, ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}, ftVariant, ftUnknown: + Size := FieldDesc.Length; + ftFloat, ftCurrency, ftBCD{$IFDEF VER6P}, ftFMTBcd{$ENDIF}: begin + Precision := FieldDesc.Length; + Scale := FieldDesc.Scale; + end; + end; + end; +end; + +procedure TMSLoader.Prepare; +const + MaxPropCount = 3; +var + OLEDBConnection: TOLEDBConnection; + TableID: PDBID; + TableIDAccessor: TDBIDAccessor; + BindMemorySize: UINT; +{$IFDEF CLR} + rgBindingsGC: GCHandle; +{$ENDIF} + rgBindings: PDBBinding; + rgStatus: PUINT; + i: integer; + OLEDBPropertiesSet: TOLEDBPropertiesSet; + OptionsStr: string; + IUnk: IUnknown; + ParamDesc: TOLEDBParamDesc; + + procedure AddOption(var OptionStr: string; const Value: string); + begin + if OptionStr <> '' then + OptionStr := OptionStr + ', '; + OptionStr := OptionStr + Value; + end; + +begin + inherited; + + OLEDBConnection := TMSAccessUtils.FIConnection(Connection); + OLEDBConnection.Check(TMSAccessUtils.FIDBCreateSession(OLEDBConnection).CreateSession(nil, IID_IOpenRowset, IUnk), Self); + FIOpenRowset := IOpenRowset(IUnk); + + TableID := Marshal.AllocHGlobal(SizeOf(TDBID)); + TableIDAccessor := TDBIDAccessor.Create(TableID); + OLEDBPropertiesSet := TOLEDBPropertiesSet.Create(OLEDBConnection, DBPROPSET_SQLSERVERROWSET); + try + TableIDAccessor.eKind := DBKIND_NAME; + TableIDAccessor.pwszName := Marshal.AllocHGlobal(Length(TableName) * SizeOf(WideChar) + SizeOf(WideChar)); + CopyBuffer(Marshal.StringToHGlobalUni(Encoding.Default.GetString(Encoding.Default.GetBytes(TableName), 0, Length(TableName))), + TableIDAccessor.pwszName, Length(TableName) * SizeOf(WideChar) + SizeOf(WideChar)); + + OLEDBPropertiesSet.AddPropBool(SSPROP_FASTLOADKEEPIDENTITY, FKeepIdentity); + OLEDBPropertiesSet.AddPropBool(SSPROP_FASTLOADKEEPNULLS, FKeepNulls); + if (FOptions.FRowsPerBatch > 0) or (FOptions.FKilobytesPerBatch > 0) or FOptions.FLockTable or FOptions.FCheckConstraints then begin + OptionsStr := ''; + if FOptions.FRowsPerBatch > 0 then + AddOption(OptionsStr, 'ROWS_PER_BATCH = ' + IntToStr(FOptions.FRowsPerBatch)); + if FOptions.FKilobytesPerBatch > 0 then + AddOption(OptionsStr, 'KILOBYTES_PER_BATCH = ' + IntToStr(FOptions.FKilobytesPerBatch)); + if FOptions.FLockTable then + AddOption(OptionsStr, 'TABLOCK'); + if FOptions.FCheckConstraints then + AddOption(OptionsStr, 'CHECK_CONSTRAINTS'); + OLEDBPropertiesSet.AddPropStr(SSPROP_FASTLOADOPTIONS, OptionsStr); + end; + + OLEDBConnection.Check(FIOpenRowset.OpenRowset(nil, TableID, nil, IID_IRowsetFastLoad, 1, + PDBPropIDSetArray(OLEDBPropertiesSet.InitPropSet), IUnk), Self); + FIRowsetFastLoad := IRowsetFastLoad(IUnk); + finally + OLEDBPropertiesSet.Free; + Marshal.FreeHGlobal(TableIDAccessor.pwszName); + Marshal.FreeHGlobal(TableID); + TableIDAccessor.Free; + end; + + rgStatus := Marshal.AllocHGlobal(Columns.Count * SizeOf(UINT)); +{$IFNDEF CLR} + IntPtr(FParamsAccessorData.Accessor) := nil; +{$ENDIF} + try + try + FParamsAccessorData.ExecuteParams.HACCESSOR := 0; + FParamsAccessorData.ExecuteParams.pData := nil; + FParamsAccessorData.ExecuteParams.cParamSets := 1; + + SetLength(FParamsAccessorData.rgBindings, Columns.Count); + + for i := 0 to Columns.Count - 1 do + FParamsAccessorData.rgBindings[i].pObject := nil; + + BindMemorySize := 0; + + FParamDescs := TParamDescs.Create; + for i := 0 to Columns.Count - 1 do begin + ParamDesc := TOLEDBParamDesc.Create; + try + ParamDesc.SetName(Columns[i].Name); // +++ + ParamDesc.SetDataType(GetDataType(TMSColumn(Columns[i]).FieldType)); + ParamDesc.SetParamType(pdInput); + FillBindingForParam(i + 1, ParamDesc, OLEDBConnection, FParamsAccessorData.rgBindings[i], BindMemorySize, False, TMSColumn(Columns[i]).FIsWide); + FParamsAccessorData.rgBindings[i].eParamIO := DBPARAMIO_NOTPARAM; + ParamDesc.SetSize(FParamsAccessorData.rgBindings[i].cbMaxLen); + finally + FParamDescs.Add(ParamDesc); + end; + end; + + FParamsAccessorData.ExecuteParams.pData := Marshal.AllocHGlobal(BindMemorySize); + FillChar(FParamsAccessorData.ExecuteParams.pData, BindMemorySize, 0); + + QueryIntf(FIRowsetFastLoad, {$IFDEF CLR}IAccessor{$ELSE}IID_IAccessor{$ENDIF}, FParamsAccessorData.Accessor); + + {$IFDEF CLR} + rgBindingsGC := GCHandle.Alloc(FParamsAccessorData.rgBindings, GCHandleType.Pinned); + rgBindings := Marshal.UnsafeAddrOfPinnedArrayElement(FParamsAccessorData.rgBindings, 0); + {$ELSE} + rgBindings := @FParamsAccessorData.rgBindings[0]; + {$ENDIF} + + OLEDBConnection.Check(FParamsAccessorData.Accessor.CreateAccessor(DBACCESSOR_ROWDATA, Columns.Count, + rgBindings, BindMemorySize, FParamsAccessorData.ExecuteParams.HACCESSOR, rgStatus), Self); + except + if FParamsAccessorData.ExecuteParams.pData <> nil then + Marshal.FreeHGlobal(FParamsAccessorData.ExecuteParams.pData); + FParamsAccessorData.ExecuteParams.pData := nil; + + if Length(FParamsAccessorData.rgBindings) <> 0 then begin + for i := 0 to Columns.Count - 1 do begin + if FParamsAccessorData.rgBindings[i].pObject <> nil then + Marshal.FreeHGlobal(FParamsAccessorData.rgBindings[i].pObject); + end; + SetLength(FParamsAccessorData.rgBindings, 0); + end; + + raise; + end; + finally + Marshal.FreeHGlobal(rgStatus); + {$IFDEF CLR} + if IntPtr(rgBindingsGC) <> nil then + rgBindingsGC.Free; + {$ENDIF} + end; +end; + +procedure TMSLoader.PutColumnData(Col: integer; Row: integer; const Value: variant); +var + ParamDesc: CRAccess.TParamDesc; + pLength: PUINT; +{$IFDEF CLR} + ParamGCHandle: TIntPtrDynArray; +{$ENDIF} +begin + inherited; + + ParamDesc := FParamDescs.Items[Col]; + ParamDesc.SetValue(Unassigned); + ParamDesc.SetValue(Value); + FParamsAccessorData.rgBindings[Col].eParamIO := DBPARAMIO_INPUT; + + + SaveParamValue(ParamDesc, FParamsAccessorData.rgBindings[Col], FParamsAccessorData{$IFDEF HAVE_COMPRESS}, cbNone{$ENDIF}, + {$IFDEF CLR}ParamGCHandle, {$ENDIF}TMSAccessUtils.FIConnection(Connection).DBMSPrimaryVer, TMSAccessUtils.FIConnection(Connection).ProviderPrimaryVer); + FParamsAccessorData.rgBindings[Col].eParamIO := DBPARAMIO_NOTPARAM; + + if not (ParamDesc.GetDataType in CharsByRef + BytesByRef) and not (ParamDesc.GetDataType in [dtUnknown]) then begin + pLength := PUINT(UINT(Integer(FParamsAccessorData.ExecuteParams.pData)) + FParamsAccessorData.rgBindings[Col].obLength); + Marshal.WriteInt32(pLength, FParamsAccessorData.rgBindings[Col].cbMaxLen); + end; + + if Col = Columns.Count - 1 then + TMSAccessUtils.FIConnection(Connection).Check(FIRowsetFastLoad.InsertRow(FParamsAccessorData.ExecuteParams.HACCESSOR, + FParamsAccessorData.ExecuteParams.pData), Self); +end; + +procedure TMSLoader.Commit(Done: boolean = True); +begin + if FIRowsetFastLoad <> nil then + TMSAccessUtils.FIConnection(Connection).Check(FIRowsetFastLoad.Commit(Done), Self); +end; + +procedure TMSLoader.Finish; +begin + inherited; + + try + Commit; + + FParamDescs.Free; + + if FParamsAccessorData.ExecuteParams.pData <> nil then + TMSAccessUtils.FIConnection(Connection).Check(FParamsAccessorData.Accessor.ReleaseAccessor(FParamsAccessorData.ExecuteParams.HACCESSOR, nil), Self); + finally + FParamsAccessorData.ExecuteParams.HACCESSOR := 0; + FParamsAccessorData.Accessor := nil; + if FParamsAccessorData.ExecuteParams.pData <> nil then + Marshal.FreeHGlobal(FParamsAccessorData.ExecuteParams.pData); + FParamsAccessorData.ExecuteParams.pData := nil; + + FIOpenRowset := nil; + FIRowsetFastLoad := nil; + Reset; + end; +end; + +{ TMSLoaderOptions } + +constructor TMSLoaderOptions.Create(Owner: TMSLoader); +begin + inherited Create; + + FOwner := Owner; + FRowsPerBatch := 0; + FKilobytesPerBatch := 0; + FLockTable := False; + FCheckConstraints := False; +end; + +procedure TMSLoaderOptions.AssignTo(Dest: TPersistent); +begin + if Dest is TMSLoaderOptions then begin + TMSLoaderOptions(Dest).RowsPerBatch := RowsPerBatch; + TMSLoaderOptions(Dest).KilobytesPerBatch := KilobytesPerBatch; + TMSLoaderOptions(Dest).LockTable := LockTable; + TMSLoaderOptions(Dest).CheckConstraints := CheckConstraints; + end + else + inherited; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/MSParser.pas b/internal/4.10.0.10/1/Source/MSParser.pas new file mode 100644 index 0000000..899215e --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSParser.pas @@ -0,0 +1,238 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// MS Parser +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSParser; +{$ENDIF} + +interface +uses + CRParser; + +const + lxALTER = 7 {MSSymbolCount} + 1; + lxAND = lxALTER; + lxAS = lxAND + 1; + lxBEGIN = lxAS + 1; + lxBY = lxBEGIN + 1; + lxCOMPUTE = lxBY + 1; + lxCREATE = lxCOMPUTE + 1; + lxCROSS = lxCREATE + 1; + lxDECLARE = lxCROSS + 1; + lxDEFAULT = lxDECLARE + 1; + lxDELETE = lxDEFAULT + 1; + lxEND = lxDELETE + 1; + lxFOR = lxEND + 1; + lxFROM = lxFOR + 1; + lxFULL = lxFROM + 1; + lxFUNCTION = lxFULL + 1; + lxGO = lxFUNCTION + 1; + lxGROUP = lxGO + 1; + lxHAVING = lxGROUP + 1; + lxINNER = lxHAVING + 1; + lxINSERT = lxINNER + 1; + lxINTO = lxINSERT + 1; + lxIS = lxINTO + 1; + lxJOIN = lxIS + 1; + lxLEFT = lxJOIN + 1; + lxOPTION = lxLEFT + 1; + lxOR = lxOPTION + 1; + lxORDER = lxOR + 1; + lxOUTER = lxORDER + 1; + lxPROCEDURE = lxOUTER + 1; + lxREPLACE = lxPROCEDURE + 1; + lxRIGHT = lxREPLACE + 1; + lxRULE = lxRIGHT + 1; + lxSELECT = lxRULE + 1; + lxTABLE = lxSELECT + 1; + lxTRIGGER = lxTABLE + 1; + lxUPDATE = lxTRIGGER + 1; + lxUNION = lxUPDATE + 1; + lxVIEW = lxUNION + 1; + lxWHERE = lxVIEW + 1; + lxWITH = lxWHERE + 1; + +type + TMSParser = class (TParser) + protected + function IsAlpha(Ch: char): boolean; override; + function IsStringQuote(Ch: char): boolean; override; + function IsIdentQuote(Ch: char): boolean; override; + function IsInlineComment(Pos: integer): boolean; override; + procedure ToRightQuote(LeftQuote: Char); override; // Search right quote of quoted string value or quoted identifier + + procedure InitParser; override; + public + function IsSemicolon(Code: integer): boolean; override; + end; + +implementation + +uses + Classes, SysUtils; + +var + MSSymbolLexems, MSKeywordLexems: TStringList; + +{ TMSParser } + +procedure TMSParser.InitParser; +begin + inherited; +(* +SELECT statement ::= + < query_expression > + [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } + [ ,...n ] ] + [ COMPUTE + { { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,...n ] + [ BY expression [ ,...n ] ] + ] + [ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT } + [ , XMLDATA ] + [ , ELEMENTS ] + [ , BINARY base64 ] + } +] + [ OPTION ( < query_hint > [ ,...n ]) ] + +< query expression > ::= + { < query specification > | ( < query expression > ) } + [ UNION [ ALL ] < query specification | ( < query expression > ) [...n ] ] + +< query specification > ::= + SELECT [ ALL | DISTINCT ] + [ { TOP integer | TOP integer PERCENT } [ WITH TIES ] ] + < select_list > + [ INTO new_table ] + [ FROM { < table_source > } [ ,...n ] ] + [ WHERE < search_condition > ] + [ GROUP BY [ ALL ] group_by_expression [ ,...n ] + [ WITH { CUBE | ROLLUP } ] + ] + [ HAVING < search_condition > ] + +*) + + SetLength(FClauses, 7); + FClauses[0] := lxWHERE; + FClauses[1] := lxGROUP; + FClauses[2] := lxHAVING; + FClauses[3] := lxORDER; + FClauses[4] := lxCOMPUTE; + FClauses[5] := lxFOR; + FClauses[6] := lxOPTION; + + FSymbolLexems := MSSymbolLexems; + FKeywordLexems := MSKeywordLexems; + + CommentBegin := '/*'; + CommentEnd := '*/'; +end; + +function TMSParser.IsAlpha(Ch: char): boolean; +begin + Result := inherited IsAlpha(Ch) or (Ch = '$') or (Ch = '#'); +end; + +function TMSParser.IsStringQuote(Ch: char): boolean; +begin + Result := Ch = ''''; +end; + +function TMSParser.IsIdentQuote(Ch: char): boolean; +begin + case Ch of + '"', '[', ']': + Result := True; + else + Result := False; + end; +end; + +function TMSParser.IsInlineComment(Pos: integer): boolean; +begin + // cr 7788 Result := (TextLength >= Pos + 3) and (Text[Pos] = '-') and (Text[Pos + 1] = '-') and (Text[Pos + 2] = ' '); + Result := (TextLength >= Pos + 2) and (Text[Pos] = '-') and (Text[Pos + 1] = '-'); +end; + +procedure TMSParser.ToRightQuote(LeftQuote: Char); +begin + if LeftQuote = '[' then + inherited ToRightQuote(']') + else + inherited; +end; + +function TMSParser.IsSemicolon(Code: integer): boolean; +begin + Result := Code = 7; {';'} +end; + +initialization + MSSymbolLexems := TStringList.Create; + MSKeywordLexems := TStringList.Create; + + MSSymbolLexems.AddObject('*', TObject(Integer(1))); + MSSymbolLexems.AddObject('=', TObject(Integer(2))); + MSSymbolLexems.AddObject(':', TObject(Integer(3))); + MSSymbolLexems.AddObject(',', TObject(Integer(4))); + MSSymbolLexems.AddObject('.', TObject(Integer(5))); + MSSymbolLexems.AddObject('/', TObject(Integer(6))); + MSSymbolLexems.AddObject(';', TObject(Integer(7))); + MSSymbolLexems.CustomSort(CRCmpStrings); + + MSKeywordLexems.AddObject('SELECT', TObject(Integer(lxSELECT))); + MSKeywordLexems.AddObject('FROM', TObject(Integer(lxFROM))); + MSKeywordLexems.AddObject('WHERE', TObject(Integer(lxWHERE))); + MSKeywordLexems.AddObject('ORDER', TObject(Integer(lxORDER))); + MSKeywordLexems.AddObject('BY', TObject(Integer(lxBY))); + MSKeywordLexems.AddObject('GROUP', TObject(Integer(lxGROUP))); + MSKeywordLexems.AddObject('PROCEDURE', TObject(Integer(lxPROCEDURE))); + MSKeywordLexems.AddObject('IS', TObject(Integer(lxIS))); + MSKeywordLexems.AddObject('AS', TObject(Integer(lxAS))); + MSKeywordLexems.AddObject('AND', TObject(Integer(lxAND))); + MSKeywordLexems.AddObject('OR', TObject(Integer(lxOR))); + MSKeywordLexems.AddObject('CREATE', TObject(Integer(lxCREATE))); + MSKeywordLexems.AddObject('REPLACE', TObject(Integer(lxREPLACE))); + MSKeywordLexems.AddObject('INTO', TObject(Integer(lxINTO))); + MSKeywordLexems.AddObject('UPDATE', TObject(Integer(lxUPDATE))); + MSKeywordLexems.AddObject('DELETE', TObject(Integer(lxDELETE))); + MSKeywordLexems.AddObject('INSERT', TObject(Integer(lxINSERT))); + MSKeywordLexems.AddObject('COMPUTE', TObject(Integer(lxCOMPUTE))); + MSKeywordLexems.AddObject('CROSS', TObject(Integer(lxCROSS))); + MSKeywordLexems.AddObject('FOR', TObject(Integer(lxFOR))); + MSKeywordLexems.AddObject('FULL', TObject(Integer(lxFULL))); + MSKeywordLexems.AddObject('HAVING', TObject(Integer(lxHAVING))); + MSKeywordLexems.AddObject('INNER', TObject(Integer(lxINNER))); + MSKeywordLexems.AddObject('JOIN', TObject(Integer(lxJOIN))); + MSKeywordLexems.AddObject('LEFT', TObject(Integer(lxLEFT))); + MSKeywordLexems.AddObject('OPTION', TObject(Integer(lxOPTION))); + MSKeywordLexems.AddObject('OUTER', TObject(Integer(lxOUTER))); + MSKeywordLexems.AddObject('RIGHT', TObject(Integer(lxRIGHT))); + MSKeywordLexems.AddObject('UNION', TObject(Integer(lxUNION))); + MSKeywordLexems.AddObject('WITH', TObject(Integer(lxWITH))); + MSKeywordLexems.AddObject('BEGIN', TObject(Integer(lxBEGIN))); + MSKeywordLexems.AddObject('END', TObject(Integer(lxEND))); + MSKeywordLexems.AddObject('DECLARE', TObject(Integer(lxDECLARE))); + MSKeywordLexems.AddObject('FUNCTION', TObject(Integer(lxFUNCTION))); + MSKeywordLexems.AddObject('GO', TObject(Integer(lxGO))); + MSKeywordLexems.AddObject('TABLE', TObject(Integer(lxTABLE))); + MSKeywordLexems.AddObject('DEFAULT', TObject(Integer(lxDEFAULT))); + MSKeywordLexems.AddObject('RULE', TObject(Integer(lxRULE))); + MSKeywordLexems.AddObject('VIEW', TObject(Integer(lxVIEW))); + + MSKeywordLexems.CustomSort(CRCmpStrings); + +finalization + MSSymbolLexems.Free; + MSKeywordLexems.Free; + +end. diff --git a/internal/4.10.0.10/1/Source/MSSQLMonitor.pas b/internal/4.10.0.10/1/Source/MSSQLMonitor.pas new file mode 100644 index 0000000..28eec37 --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSSQLMonitor.pas @@ -0,0 +1,237 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SQL Monitor +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSSQLMonitor; +{$ENDIF} + +interface + +uses + SysUtils, Classes, DB, DBAccess, DASQLMonitor; + +type + TTypeInfo = record + Name: string; + DataType: TFieldType; + end; + +const + // Obsolete, needs to change to DB.FieldTypeNames + ArrTypeInfoCount = 16 {$IFDEF VER5P}+ 2{$ENDIF}{$IFDEF VER10P} + 1{$ENDIF}; + ArrTypeInfo: array [0..ArrTypeInfoCount - 1] of TTypeInfo = ( + (Name: 'Unknown'; DataType: ftUnknown), + (Name: 'String'; DataType: ftString), + (Name: 'WideString';DataType: ftWideString), + (Name: 'Smallint'; DataType: ftSmallint), + (Name: 'Integer'; DataType: ftInteger), + (Name: 'Word'; DataType: ftWord), + (Name: 'LargeInt'; DataType: ftLargeInt), + (Name: 'Boolean'; DataType: ftBoolean), + (Name: 'Float'; DataType: ftFloat), + (Name: 'Currency'; DataType: ftCurrency), + (Name: 'BCD'; DataType: ftBCD), + (Name: 'DateTime'; DataType: ftDateTime), + (Name: 'Memo'; DataType: ftMemo), + {$IFDEF VER10P} + (Name: 'WideMemo'; DataType: ftWideMemo), + {$ENDIF} + (Name: 'Bytes'; DataType: ftBytes), + (Name: 'VarBytes'; DataType: ftVarBytes), + (Name: 'Blob'; DataType: ftBlob){$IFDEF VER5P}, + (Name: 'GUID'; DataType: ftGuid), + (Name: 'Variant'; DataType: ftVariant){$ENDIF} + ); + +function GetArrTypeInfoIdx(DataType: TFieldType): integer; overload; +function GetArrTypeInfoIdx(Name: string): integer; overload; + +type + +{ TMSSQLMonitor } + + TMSSQLMonitorClass = class of TMSSQLMonitor; + + TMSSQLMonitor = class(TCustomDASQLMonitor) + protected + procedure InternalTRSavepoint(Connection: TCustomDAConnection; Savepoint: string); + procedure InternalTRRollbackToSavepoint(Connection: TCustomDAConnection; Savepoint: string); + procedure InternalInfoMessage(Connection: TCustomDAConnection; MessageText: string); + + class function GetMonitor: TCustomDASQLMonitor; override; + + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + class function GetParamDataType(Param: TDAParam): string; override; + + class procedure TRSavepoint(Connection: TCustomDAConnection; Savepoint: string); + class procedure TRRollbackToSavepoint(Connection: TCustomDAConnection; Savepoint: string); + + class procedure InfoMessage(Connection: TCustomDAConnection; MessageText: string); + + class function GetCaption: string; override; + + published + property Active default True; + property Options; + property OnSQL; + property TraceFlags; + end; + +implementation + +uses + MemDS, MSAccess, OLEDBAccess; + +var + MSMonitor: TMSSQLMonitor; + +function GetArrTypeInfoIdx(DataType: TFieldType): integer; +var + i: integer; +begin + if DataType = ftFixedChar then + DataType := ftString; + + Result := - 1; + for i := 0 to ArrTypeInfoCount - 1 do + if ArrTypeInfo[i].DataType = DataType then + begin + Result := i; + Break; + end; +end; + +function GetArrTypeInfoIdx(Name: string): integer; +var + i: integer; +begin + Result := - 1; + for i := 0 to ArrTypeInfoCount - 1 do + if ArrTypeInfo[i].Name = Name then + begin + Result := i; + Break; + end; +end; + +{ TMSSQLMonitor } + +class procedure TMSSQLMonitor.TRSavepoint(Connection: TCustomDAConnection; Savepoint: string); +begin + if GetMonitor <> nil then + TMSSQLMonitor(GetMonitor).InternalTRSavepoint(Connection, Savepoint); +end; + +class procedure TMSSQLMonitor.TRRollbackToSavepoint(Connection: TCustomDAConnection; Savepoint: string); +begin + if GetMonitor <> nil then + TMSSQLMonitor(GetMonitor).InternalTRRollbackToSavepoint(Connection, Savepoint); +end; + +class procedure TMSSQLMonitor.InfoMessage(Connection: TCustomDAConnection; MessageText: string); +begin + if (GetMonitor <> nil) then + TMSSQLMonitor(GetMonitor).InternalInfoMessage(Connection, MessageText); +end; + +class function TMSSQLMonitor.GetMonitor: TCustomDASQLMonitor; +begin + Result := MSMonitor; +end; + +class function TMSSQLMonitor.GetCaption: string; +begin + Result := 'MS SQL'; +end; + +procedure TMSSQLMonitor.InternalTRSavepoint(Connection: TCustomDAConnection; Savepoint: string); +var + St: string; +begin + if Active then begin + St := 'Savepoint ' + Savepoint + ': ' + Connection.Username + '@' + Connection.Server; + + if (moSQLMonitor in Options) and (tfTransact in TraceFlags) then + AddStatement(St); + + if Assigned(FOnSQLEvent) then + FOnSQLEvent(Connection, St, tfTransact); + end; +end; + +procedure TMSSQLMonitor.InternalTRRollbackToSavepoint(Connection: TCustomDAConnection; Savepoint: string); +var + St: string; +begin + if Active then begin + St := 'Rollback to savepoint ' + Savepoint + ': ' + Connection.Username + '@' + Connection.Server; + + if (moSQLMonitor in Options) and (tfTransact in TraceFlags) then + AddStatement(St); + + if Assigned(FOnSQLEvent) then + FOnSQLEvent(Connection, St, tfTransact); + end; +end; + +procedure TMSSQLMonitor.InternalInfoMessage(Connection: TCustomDAConnection; MessageText: string); +var + St: string; +begin + if Active then begin + St := 'Info Message: ' + MessageText + ': ' + Connection.Username + '@' + Connection.Server; + + if (moSQLMonitor in Options) and (tfMisc in TraceFlags) then + AddStatement(St); + + if Assigned(FOnSQLEvent) then + FOnSQLEvent(Connection, St, tfMisc); + end; +end; + +class function TMSSQLMonitor.GetParamDataType(Param: TDAParam): string; +begin + if Param.DataType = TFieldType(ftMSXML) then + Result := 'XML' + else +{$IFDEF D8} // Copied from inherited to avoid D8 Internal linker error: ILLK8903 + begin + Result := FieldTypeNames[Param.DataType]; + if Param.DataType in [ftString,ftFixedChar,ftWideString] then + Result := Result + '[' + IntToStr(Length(Param.AsString)) + ']'; + end; +{$ELSE} + Result := inherited GetParamDataType(Param); +{$ENDIF} +end; + +constructor TMSSQLMonitor.Create(AOwner: TComponent); +begin + inherited; + + if MSMonitor = nil then + MSMonitor := Self; +end; + +destructor TMSSQLMonitor.Destroy; +begin + if MSMonitor = Self then + MSMonitor := nil; + + inherited; +end; + +initialization + +end. + diff --git a/internal/4.10.0.10/1/Source/MSScript.pas b/internal/4.10.0.10/1/Source/MSScript.pas new file mode 100644 index 0000000..428d1a7 --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSScript.pas @@ -0,0 +1,139 @@ +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// MSScript +////////////////////////////////////////////////// +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit MSScript; +{$ENDIF} + +interface + +uses + SysUtils, Classes, DAScript, CRParser, MSParser, MSAccess, DBAccess; + +type + + TMSScript = class(TDAScript) + private + FCodes: array of integer; + protected + function GetConnection: TMSConnection; + procedure SetConnection(Value: TMSConnection); + function GetDataSet: TCustomMSDataSet; + procedure SetDataSet(Value: TCustomMSDataSet); + function GetParserClass: TParserClass; override; + function CreateCommand: TCustomDASQL; override; + procedure CheckLexem(Code: integer; var StatementType: integer; var Omit: boolean); override; + function GetReady(Code: integer): boolean; override; + function CanOptimize(const SQL: string; const StatementType: integer): boolean; override; + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + function ExecuteNext: boolean; override; + + published + property Connection: TMSConnection read GetConnection write SetConnection; + property DataSet: TCustomMSDataSet read GetDataSet write SetDataSet; + property UseOptimization; + end; + +implementation + +{ TMSScript } + +function TMSScript.CreateCommand: TCustomDASQL; +begin + Result := TMSSQL.Create(nil); +end; + +function TMSScript.GetParserClass: TParserClass; +begin + Result := TMSParser; +end; + +function TMSScript.ExecuteNext: boolean; +var + OldCommandTimeout: integer; + i: integer; +begin + for i := Low(FCodes) to High(FCodes) do + FCodes[i] := 0; + OldCommandTimeout := 0; + if Assigned(DataSet) then + OldCommandTimeout := DataSet.CommandTimeout; + try + Result := inherited ExecuteNext; + finally + if Assigned(DataSet) then + DataSet.CommandTimeout := OldCommandTimeout; + end; +end; + +function TMSScript.GetConnection: TMSConnection; +begin + Result := TMSConnection(inherited Connection); +end; + +procedure TMSScript.SetConnection(Value: TMSConnection); +begin + inherited Connection := Value; +end; + +function TMSScript.GetDataSet: TCustomMSDataSet; +begin + Result := TCustomMSDataSet(inherited DataSet); +end; + +procedure TMSScript.SetDataSet(Value: TCustomMSDataSet); +begin + inherited DataSet := Value; +end; + +constructor TMSScript.Create(Owner: TComponent); +begin + inherited Create(Owner); + SetLength(FCodes, 3); + FMacros.SetParserClass(TMSParser); + Delimiter := ';'; +end; + +destructor TMSScript.Destroy; +begin + SetLength(FCodes, 0); + inherited; +end; + +procedure TMSScript.CheckLexem(Code: integer; var StatementType: integer; var Omit: boolean); +var + i: integer; +begin + if (Code <> lcBlank) and (Code <> lcComment) then begin + for i := Low(FCodes) to High(FCodes) - 1 do + FCodes[i] := FCodes[i + 1]; + FCodes[2] := Code; + + if (FCurrDelimiter = ';') then + if (FCodes[2] in [lxBEGIN, lxDECLARE]) + or ((FCodes[2] in [lxPROCEDURE, lxFUNCTION, lxTRIGGER]) + and ((FCodes[1] = lxCREATE) and (FCodes[0] = 0) or + (FCodes[1] = lxALTER) and (FCodes[0] = 0))) + then + StatementType := ST_SPECIFIC_SQL; + end; +end; + +function TMSScript.GetReady(Code: integer): boolean; +begin + Result := Code = lxGO; +end; + +function TMSScript.CanOptimize(const SQL: string; const StatementType: integer): boolean; +begin + Result := (StatementType <> ST_SPECIFIC_SQL) and inherited CanOptimize(SQL, StatementType); +end; + +end. diff --git a/internal/4.10.0.10/1/Source/MSServiceBroker.pas b/internal/4.10.0.10/1/Source/MSServiceBroker.pas new file mode 100644 index 0000000..e6be6c6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/MSServiceBroker.pas @@ -0,0 +1,1241 @@ +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// MSServiceBroker +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} +unit MSServiceBroker; +{$ENDIF} +interface + +uses + SysUtils, Classes, DB,{$IFDEF VER6P} Variants,{$ENDIF}{$IFNDEF CLR} CLRClasses,{$ENDIF} + CRThread, MSAccess, OLEDBAccess; + +const + SEventNotificationType = 'http://schemas.microsoft.com/SQL/Notifications/EventNotification'; + SQueryNotificationType = 'http://schemas.microsoft.com/SQL/Notifications/QueryNotification'; + SFailedRemoteServiceBindingType = 'http://schemas.microsoft.com/SQL/ServiceBroker/BrokerConfigurationNotice/FailedRemoteServiceBinding'; + SFailedRouteType = 'http://schemas.microsoft.com/SQL/ServiceBroker/BrokerConfigurationNotice/FailedRoute'; + SMissingRemoteServiceBindingType = 'http://schemas.microsoft.com/SQL/ServiceBroker/BrokerConfigurationNotice/MissingRemoteServiceBinding'; + SMissingRouteType = 'http://schemas.microsoft.com/SQL/ServiceBroker/BrokerConfigurationNotice/MissingRoute'; + SDialogTimerType = 'http://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer'; + SEndDialogType = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'; + SErrorType = 'http://schemas.microsoft.com/SQL/ServiceBroker/Error'; + SDescriptionType = 'http://schemas.microsoft.com/SQL/ServiceBroker/ServiceDiagnostic/Description'; + SQueryType = 'http://schemas.microsoft.com/SQL/ServiceBroker/ServiceDiagnostic/Query'; + SStatusType = 'http://schemas.microsoft.com/SQL/ServiceBroker/ServiceDiagnostic/Status'; + SEchoType = 'http://schemas.microsoft.com/SQL/ServiceBroker/ServiceEcho/Echo'; + +type + // TMSMessageStatus = (msReady, msReceived, msIncomplete, msRetained); // Status of the message. For messages returned by the RECEIVE command, the status is always 0. Messages in the queue may contain one of the following values: 0=Ready, 1=Received message, 2=Not yet complete, 3=Retained sent message + TMSMessageValidation = (mvEmpty, mvNone, mvXML); + + TMSServiceBroker = class; + TMSConversation = class; + + TMSMessage = class + protected + FBody: TBytes; + FConversation: TMSConversation; + FParams: TStringList; + FParamValues: TStringList; + + // FStatus: TMSMessageStatus; // Status of the message. For messages returned by the RECEIVE command, the status is always 0. Messages in the queue may contain one of the following values: 0=Ready, 1=Received message, 2=Not yet complete, 3=Retained sent message + FQueuingOrder: Int64; // Message order number within the queue. + FConversationGroupId: TGuid; // Identifier for the conversation group that this message belongs to. + FConversationHandle: TGuid; // Handle for the conversation that this message is part of. + FMessageSequenceNumber: Int64;// Sequence number of the message within the conversation. + // FServiceName: WideString; // Name of the service that the conversation is to. + // FServiceId: integer; // SQL Server object identifier of the service that the conversation is to. + FServiceContractName: WideString; // Name of the contract that the conversation follows. + // FServiceContractId: integer; // SQL Server object identifier of the contract that the conversation follows. + FMessageType: WideString; // {DEFAULT, http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog} Name of the message type that describes the message. + FMessageTypeId: integer; // SQL Server object identifier of the message type that describes the message. + FValidation: TMSMessageValidation; // Validation used for the message. E=Empty N=None X=XML + FIsEmpty: boolean; + FMessageId: TGuid; // Unique identifier for the message. + + function GetAsString: string; + function GetAsWideString: WideString; + + procedure Fill(Source: TMSQuery); + + function GetParams: TStringList; + function GetParamValues: TStringList; + property Params: TStringList read GetParams; + property ParamValues: TStringList read GetParamValues; + + public + destructor Destroy; override; + + property AsString: string read GetAsString; + property AsWideString: WideString read GetAsWideString; + property AsBytes: TBytes read FBody; + + property Conversation: TMSConversation read FConversation; + + // property Status: TMSMessageStatus read FStatus; // Status of the message. For messages returned by the RECEIVE command, the status is always 0. Messages in the queue may contain one of the following values: 0=Ready, 1=Received message, 2=Not yet complete, 3=Retained sent message + property QueuingOrder: Int64 read FQueuingOrder; // Message order number within the queue. + // property ConversationGroupId: TGuid read FConversationGroupId; // Identifier for the conversation group that this message belongs to. + // property ConversationHandle: TGuid read FConversationHandle; // Handle for the conversation that this message is part of. + property MessageSequenceNumber: Int64 read FMessageSequenceNumber;// Sequence number of the message within the conversation. + // property ServiceName: WideString read FServiceName; // Name of the service that the conversation is to. + // property ServiceId: integer read FServiceId; // SQL Server object identifier of the service that the conversation is to. + // property ServiceContractName: WideString read FServiceContractName; // Name of the contract that the conversation follows. + // property ServiceContractId: integer read FServiceContractId; // SQL Server object identifier of the contract that the conversation follows. + property MessageType: WideString read FMessageType; // {DEFAULT, http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog} Name of the message type that describes the message. + property MessageTypeId: integer read FMessageTypeId; // SQL Server object identifier of the message type that describes the message. + property Validation: TMSMessageValidation read FValidation; // Validation used for the message. E=Empty N=None X=XML + property IsEmpty: boolean read FIsEmpty; + property MessageId: TGuid read FMessageId; // Unique identifier for the message. + end; + + TMSMessageEvent = procedure(Sender: TObject) of object; + TMSConversationBeginEvent = procedure(Sender: TObject; Conversation: TMSConversation) of object; + TMSConversationEndEvent = procedure(Sender: TObject; Conversation: TMSConversation; ErrorMessage: string; ErrorCode: integer) of object; + + TMSConversation = class + protected + FHandle: TGuid; + FGroupId: TGuid; + + FFarService: string; + FIsInitiator: boolean; + FServiceBroker: TMSServiceBroker; + + FContractName: WideString; + // FContractId: integer; + + function GetFarService: string; + function GetGroupId: TGuid; + // function GetContractId: integer; + function GetContractName: WideString; + procedure SetGroupId(const Value: TGuid); + + procedure InternalSend(const MessageBody: TBytes; const MessageType: WideString = ''; const IsEmpty: boolean = False); + public + constructor Create(ServiceBroker: TMSServiceBroker; const Handle: TGuid; const IsInitiator: boolean; const FarService: string = ''); + + procedure EndConversation(const Cleanup: boolean = False); + procedure EndConversationWithError(const ErrorMessage: string; const ErrorCode: integer; const Cleanup: boolean = False); + + procedure Send(const MessageBody: TBytes; const MessageType: WideString = ''); overload; + procedure Send(const MessageBody: string; const MessageType: WideString = ''); overload; + procedure SendEmpty(const MessageType: WideString = ''); + {$IFNDEF CLR} + {$IFDEF VER6P} + procedure Send(const MessageBody: WideString; const MessageType: WideString = ''); overload; + {$ENDIF} + {$ENDIF} + + procedure BeginTimer(const Timeout: integer); + function GetTransmissionStatus: string; + property Handle: TGuid read FHandle; + property GroupId: TGuid read GetGroupId write SetGroupId; + property ServiceBroker: TMSServiceBroker read FServiceBroker; + property FarService: string read GetFarService; + property IsInitiator: boolean read FIsInitiator; + property ContractName: WideString read GetContractName; // Name of the contract that the conversation follows. + // property ContractId: integer read GetContractId; // SQL Server object identifier of the contract that the conversation follows. + end; + + TMSServiceBroker = class(TComponent) + protected + FQuery: TMSQuery; + FReceiveSQL: string; + + FConversations: TList; + FMsgs: TThreadList; + FReceivePrev: boolean; + + FDesignCreate: boolean; + + FService, FQueue: string; + FFetchRows: integer; + FWaitTimeout: integer; + + FOnBeginConversation: TMSConversationBeginEvent; + FOnEndConversation: TMSConversationEndEvent; + + // Async mode + FOnMessage: TMSMessageEvent; + FAsyncNotification: boolean; + FStreamedAsyncNotification: boolean; + FListener: TOLEDBThreadWrapper; + FStopProcessing: boolean; + + function GetConversation(Index: Integer): TMSConversation; + function GetConversationCount: integer; + function GetConversationIndexByHandle(Handle: TGuid): integer; + procedure EndConversations; + + function GetCurrentMessage: TMSMessage; + procedure GetServiceBrockerObjNames(List: TStrings; SQL: string); + function GetQueue: string; + + function GetConnection: TMSConnection; + procedure SetConnection(const Value: TMSConnection); + procedure SetService(Value: string); + procedure SetFetchRows(Value: integer); + procedure SetWaitTimeout(Value: integer); + procedure SetOnMessage(Value: TMSMessageEvent); + procedure ConnectChange(Sender: TObject; Connecting: Boolean); + + procedure Loaded; override; + procedure AssignTo(Dest: TPersistent); override; + procedure CheckInactive; + + procedure BeginConnection; + procedure EndConnection; + + class function GenerateReceiveSQL(const Queue: string; Conversation: TMSConversation; const FetchRows: integer; const TimeoutMSec: integer): string; + class function ReceiveFromServer(Query: TMSQuery; Msgs: TThreadList): integer; // Received messages count + + function BeginDialogInternal( + const TargetService: string; + const TargetDatabase: string; + const Contract: string; + const LifeTime: integer; + const UseEncryption: boolean; + RelatedConversation: TMSConversation; + const GroupId: TGuid + ): TMSConversation; + + // Async mode + procedure DoThreadMessage(Sender: TObject; Event: TObject); + procedure DoException(Sender: TObject; E: Exception; var Fail: boolean); + procedure Start; + procedure Stop; + procedure SetAsyncNotification(const Value: boolean); + + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + function BeginDialog( + const TargetService: string; + const TargetDatabase: string = ''; + const UseEncryption: boolean = True; + RelatedConversation: TMSConversation = nil; + const LifeTime: integer = 0; + const Contract: string = '' + ): TMSConversation; overload; + + function BeginDialog( + const TargetService: string; + const TargetDatabase: string; + const UseEncryption: boolean; + const GroupId: TGuid; + const LifeTime: integer = 0; + const Contract: string = '' + ): TMSConversation; overload; + + property Conversations[Index: Integer]: TMSConversation read GetConversation; default; + property ConversationCount: integer read GetConversationCount; + property CurrentMessage: TMSMessage read GetCurrentMessage; + + function Receive(Conversation: TMSConversation = nil): boolean; + + procedure GetQueueNames(List: TStrings); + procedure GetServiceNames(List: TStrings); + procedure GetContractNames(List: TStrings); + procedure GetMessageTypeNames(List: TStrings); + + procedure CreateServerObjects; + procedure DropServerObjects; + + property Queue: string read GetQueue; + published + property Connection: TMSConnection read GetConnection write SetConnection; + property Service: string read FService write SetService; + property AsyncNotification: boolean read FAsyncNotification write SetAsyncNotification default False; + property FetchRows: integer read FFetchRows write SetFetchRows default 0; + property WaitTimeout: integer read FWaitTimeout write SetWaitTimeout default - 1; + property OnMessage: TMSMessageEvent read FOnMessage write SetOnMessage; + property OnBeginConversation: TMSConversationBeginEvent read FOnBeginConversation write FOnBeginConversation; + property OnEndConversation: TMSConversationEndEvent read FOnEndConversation write FOnEndConversation; + end; + +implementation + +uses +{$IFDEF CLR} + System.Runtime.InteropServices, System.Text, System.XML, System.IO, System.Reflection, +{$ELSE} + CRXml, +{$ENDIF} + Windows, ComObj, ActiveX, DAConsts, DBAccess, MSConsts, MemData, OLEDBC, MemUtils; + +function GuidToUniqueidentifier(Guid: TGuid): string; +var + Str: string; +begin + Str := GuidToString(Guid); + Result := Copy(Str, 2, Length(Str) - 2); +end; + +{ TListenThread } + +type + TListenThread = class(TCRThread) + private + FConnection: TMSConnection; + FQuery: TMSQuery; + FMsgs: TThreadList; + + protected + procedure InternalExecute; override; + + public + constructor Create(Owner: TCRThreadWrapper); override; + destructor Destroy; override; + end; + +constructor TListenThread.Create(Owner: TCRThreadWrapper); +begin + inherited Create(Owner); + + FConnection := TMSConnection.Create(nil); + FQuery := TMSQuery.Create(nil); + FQuery.Connection := FConnection; +end; + +destructor TListenThread.Destroy; +begin + Terminate; + WaitFor; + + FQuery.Free; + FConnection.Free; + + inherited; +end; + +procedure TListenThread.InternalExecute; +var + MsgCount: integer; +begin + OleCheck(CoInitializeEx(nil, COINIT_APARTMENTTHREADED)); + try + FQuery.Connection.Connect; + while not Terminated do begin + MsgCount := TMSServiceBroker.ReceiveFromServer(FQuery, FMsgs); + PostEvent(TObject(MsgCount)); + end; + finally + CoUninitialize; + end; +end; + +{ TMSMessage } + +destructor TMSMessage.Destroy; +begin + FParams.Free; + FParamValues.Free; + + inherited; +end; + +function TMSMessage.GetAsString: string; +begin + Result := Encoding.Default.GetString(FBody); +end; + +function TMSMessage.GetAsWideString: WideString; +begin + Result := Encoding.Unicode.{$IFDEF CLR}GetString{$ELSE}GetWideString{$ENDIF}(FBody); +end; + +procedure TMSMessage.Fill(Source: TMSQuery); +var + Blob: MemData.TBlob; + Handle: IntPtr; + s: string; + +begin + (*case Source.FieldByName('status').AsInteger of + 0: + FStatus := msReady; + 1: + FStatus := msReceived; + 2: + FStatus := msIncomplete; + 3: + FStatus := msRetained; + else + Assert(False); + end;*) + FQueuingOrder := (Source.FieldByName('queuing_order') as TLargeIntField).AsLargeInt; + FConversationGroupId := (Source.FieldByName('conversation_group_id') as TGuidField).AsGuid; + FConversationHandle := (Source.FieldByName('conversation_handle') as TGuidField).AsGuid; + FMessageSequenceNumber := (Source.FieldByName('message_sequence_number') as TLargeIntField).AsLargeInt; + // FServiceName := (Source.FieldByName('service_name') as TWideStringField).Value; + // FServiceId := Source.FieldByName('service_id').AsInteger; + FServiceContractName := (Source.FieldByName('service_contract_name') as TWideStringField).Value; + // FServiceContractId := Source.FieldByName('service_contract_id').AsInteger; + FMessageType := (Source.FieldByName('message_type_name') as TWideStringField).Value; + FMessageTypeId := Source.FieldByName('message_type_id').AsInteger; + + s := UpperCase(Source.FieldByName('validation').AsString); + Assert(Length(s) = 1, 'Length(' + s + ') <> 1'); + case s[1] of + 'E': // Empty + FValidation := mvEmpty; + 'N': // None + FValidation := mvNone; + 'X': // XML + FValidation := mvXML; + else + Assert(False); + end; + FIsEmpty := Source.FieldByName('message_body').IsNull; + FMessageId := (Source.FieldByName('message_id') as TGuidField).AsGuid; + + Blob := Source.GetBlob('message_body'); + + SetLength(FBody, Blob.Size); + Handle := AllocGCHandle(FBody, True); + try + Blob.Read(0, 0, GetAddrOfPinnedObject(Handle)); + finally + FreeGCHandle(Handle); + end; +end; + +function TMSMessage.GetParams: TStringList; +var + TextReader: StringReader; + Reader: XMLTextReader; + i: integer; + PrevNodeType: XmlNodeType; +begin + if (FParams = nil) and (Validation = mvXML) then begin + FParams := TStringList.Create; + FParamValues := TStringList.Create; + TextReader := nil; + Reader := nil; + try + TextReader := StringReader.Create(Encoding.Unicode.{$IFDEF CLR}GetString{$ELSE}GetWideString{$ENDIF}(FBody)); + Reader := XMLTextReader.Create(TextReader); + PrevNodeType := Reader.NodeType; + while Reader.Read do begin + if Reader.NodeType = ntElement then begin + FParams.Add(Reader.Name); + FParamValues.Add(''); + end; + if (Reader.NodeType = ntText) and (PrevNodeType = ntElement) then begin + Assert(FParams.Count = FParamValues.Count); + FParamValues[FParamValues.Count - 1] := Reader.Value; + end; + + for i := 0 to Reader.AttributeCount - 1 do begin + Reader.MoveToAttribute(i); + FParams.Add(Reader.Name); + FParamValues.Add(Reader.Value); + end; + PrevNodeType := Reader.NodeType; + end; + finally + Reader.Free; + TextReader.Free; + end; + end; + Result := FParams; + Assert(Result <> nil); +end; + +function TMSMessage.GetParamValues: TStringList; +begin + GetParams; // fill FParams and FParamValues + Result := FParamValues; + Assert(Result <> nil); +end; + +{ TMSConversation } + +constructor TMSConversation.Create(ServiceBroker: TMSServiceBroker; const Handle: TGuid; const IsInitiator: boolean; const FarService: string = ''); +begin + inherited Create; + Assert(ServiceBroker <> nil); + FServiceBroker := ServiceBroker; + FHandle := Handle; + FFarService := FarService; + FIsInitiator := IsInitiator; + + FServiceBroker.FConversations.Add(Self); + if Assigned(FServiceBroker.FOnBeginConversation) then + FServiceBroker.FOnBeginConversation(FServiceBroker, Self); +end; + +procedure TMSConversation.EndConversation(const Cleanup: boolean = False); +begin + EndConversationWithError('', 0, Cleanup); +end; + +procedure TMSConversation.EndConversationWithError(const ErrorMessage: string; const ErrorCode: integer; const Cleanup: boolean = False); +var + WithError: string; + WithCleanUp: string; +begin + Assert(FServiceBroker <> nil); + Assert(FServiceBroker.Connection <> nil); + try + if Assigned(FServiceBroker.FOnEndConversation) then + FServiceBroker.FOnEndConversation(FServiceBroker, Self, ErrorMessage, ErrorCode); + FServiceBroker.FConversations.Remove(Self); + + if (ErrorMessage <> '') and (ErrorCode <> 0) then + WithError := ' WITH ERROR = :ErrorCode DESCRIPTION = :ErrorMessage'; + + if Cleanup then + WithCleanUp := ' WITH CLEANUP'; + FServiceBroker.FQuery.SQL.Text := 'END CONVERSATION :Handle ' + WithError + WithCleanUp; + FServiceBroker.FQuery.ParamByName('Handle').DataType := ftGuid; + FServiceBroker.FQuery.ParamByName('Handle').AsString := GuidToString(Handle); + + if FServiceBroker.FQuery.Params.Count > 1 then begin + FServiceBroker.FQuery.ParamByName('ErrorCode').AsInteger := ErrorCode; + FServiceBroker.FQuery.ParamByName('ErrorMessage').AsString := ErrorMessage; + end; + FServiceBroker.FQuery.Execute; + finally + FServiceBroker.EndConnection; + Free; + end; +end; + +{$IFNDEF CLR} +{$IFDEF VER6P} +procedure TMSConversation.Send(const MessageBody: WideString; const MessageType: WideString = ''); +var + Buf: TBytes; +begin + Buf := Encoding.Default.{$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(MessageBody); + Send(Buf, MessageType); +end; +{$ENDIF} +{$ENDIF} + +function TMSConversation.GetTransmissionStatus: string; +begin + FServiceBroker.FQuery.SQL.Text := 'SELECT GET_TRANSMISSION_STATUS(CONVERT(uniqueidentifier, ''' + + GuidToUniqueidentifier(Handle) + '''))'; + FServiceBroker.FQuery.Execute; + Result := FServiceBroker.FQuery.Fields[0].AsString; +end; + +procedure TMSConversation.BeginTimer(const Timeout: integer); +begin + FServiceBroker.FQuery.SQL.Text := 'BEGIN CONVERSATION TIMER (CONVERT(uniqueidentifier, ''' + + GuidToUniqueidentifier(Handle) + ''')) TIMEOUT = ' + IntToStr(Timeout); + FServiceBroker.FQuery.Execute; +end; + +function TMSConversation.GetFarService: string; +begin + if FFarService = '' then begin + FServiceBroker.FQuery.SQL.Text := 'SELECT far_service FROM sys.conversation_endpoints WHERE conversation_handle = CONVERT(uniqueidentifier, ''' + GuidToUniqueidentifier(Handle) + ''')'; + FServiceBroker.FQuery.Execute; + FFarService := FServiceBroker.FQuery.Fields[0].AsString; + end; + + Result := FFarService; +end; + +function TMSConversation.GetGroupId: TGuid; +begin + if CompareGuid(FGroupId, DB_NULLGUID) then begin + Assert(FServiceBroker <> nil); + Assert(FServiceBroker.FQuery <> nil); + + // sys.conversation_endpoints + FServiceBroker.FQuery.SQL.Text := + 'SELECT e.conversation_group_id, e.service_contract_id, c.name ' + + 'FROM sys.conversation_endpoints e, sys.service_contracts c ' + + 'WHERE (e.conversation_handle = CONVERT(uniqueidentifier, ''' + GuidToUniqueidentifier(Handle) + ''')) AND (e.service_contract_id = c.service_contract_id)'; + FServiceBroker.FQuery.Execute; + FGroupId := StringToGUID(FServiceBroker.FQuery.Fields[0].AsString); + // FContractId := FServiceBroker.FQuery.Fields[1].AsInteger; + FContractName := FServiceBroker.FQuery.Fields[2].AsString; + end; + + Result := FGroupId; +end; + +(*function TMSConversation.GetContractId: integer; +begin + if CompareGuid(FGroupId, DB_NULLGUID) then + GetGroupId; // Fill FGroupId, FContractId, FContractName + + Result := FContractId; +end;*) + +function TMSConversation.GetContractName: WideString; +begin + if CompareGuid(FGroupId, DB_NULLGUID) then + GetGroupId; // Fill FGroupId, FContractId, FContractName + + Result := FContractName; +end; + +procedure TMSConversation.SetGroupId(const Value: TGuid); +begin + Assert(FServiceBroker <> nil); + Assert(FServiceBroker.Connection <> nil); + + FServiceBroker.FQuery.SQL.Text := 'MOVE CONVERSATION CONVERT(uniqueidentifier, ''' + + GuidToUniqueidentifier(Handle) + ''')'; + FServiceBroker.FQuery.SQL.Add('TO CONVERT(uniqueidentifier, ''' + + GuidToUniqueidentifier(Value) + ''')'); + FServiceBroker.FQuery.Execute; + FGroupId := Value; +end; + +procedure TMSConversation.SendEmpty(const MessageType: WideString = ''); +begin + InternalSend(nil, MessageType, True); +end; + +procedure TMSConversation.Send(const MessageBody: string; const MessageType: WideString = ''); +var + Buf: TBytes; +begin + Buf := Encoding.Default.GetBytes(MessageBody); + InternalSend(Buf, MessageType); +end; + +procedure TMSConversation.Send(const MessageBody: TBytes; const MessageType: WideString = ''); +begin + InternalSend(MessageBody, MessageType); +end; + +procedure TMSConversation.InternalSend(const MessageBody: TBytes; const MessageType: WideString = ''; const IsEmpty: boolean = False); +var + ParamIndex: integer; +begin + Assert(FServiceBroker <> nil); + Assert(FServiceBroker.Connection <> nil); + + ParamIndex := 0; + FServiceBroker.FQuery.SQL.BeginUpdate; + try + FServiceBroker.FQuery.SQL.Text := 'SEND ON CONVERSATION CONVERT(uniqueidentifier, ''' + GuidToUniqueidentifier(Handle) + ''')'; + if MessageType <> '' then + FServiceBroker.FQuery.SQL.Add('MESSAGE TYPE :MessageType' + LineSeparator); + if not IsEmpty then + FServiceBroker.FQuery.SQL.Add('(:MessageBody);'); + finally + FServiceBroker.FQuery.SQL.EndUpdate; + end; + if MessageType <> '' then begin + FServiceBroker.FQuery.Params[ParamIndex].DataType := ftWideString; + FServiceBroker.FQuery.Params[ParamIndex].Value := MessageType; + FServiceBroker.FQuery.Params[ParamIndex].ParamType := ptInput; + Inc(ParamIndex); + end; + + if not IsEmpty then begin + FServiceBroker.FQuery.Params[ParamIndex].DataType := ftBytes; + FServiceBroker.FQuery.Params[ParamIndex].Value := MessageBody; + FServiceBroker.FQuery.Params[ParamIndex].ParamType := ptInput; + end; + FServiceBroker.FQuery.Execute; +end; + +{ TMSServiceBroker } + +constructor TMSServiceBroker.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + + FWaitTimeout := -1; + + FConversations := TList.Create; + + FQuery := TMSQuery.Create(nil); + FQuery.ReadOnly := True; + FMsgs := TThreadList.Create; + + FDesignCreate := csDesigning in ComponentState; +end; + +destructor TMSServiceBroker.Destroy; +var + i: integer; + MsgList: TList; +begin + Stop; + EndConversations; + + Connection := nil; // UnregisterClient + + if FMsgs <> nil then begin + MsgList := FMsgs.LockList; + try + for i := 0 to MsgList.Count - 1 do + TObject(MsgList[i]).Free; + finally + FMsgs.UnlockList; + FMsgs.Free; + end; + end; + + FQuery.Free; + FConversations.Free; + + inherited; +end; + +procedure TMSServiceBroker.Loaded; +begin + inherited; + + FDesignCreate := False; + try + if FStreamedAsyncNotification then + AsyncNotification := True; + except + if csDesigning in ComponentState then + ApplicationHandleException(Self) + else + raise; + end; +end; + +procedure TMSServiceBroker.AssignTo(Dest: TPersistent); +begin + if Dest is TMSServiceBroker then begin + TMSServiceBroker(Dest).Connection := Connection; + TMSServiceBroker(Dest).Service := Service; + TMSServiceBroker(Dest).OnMessage := OnMessage; + end + else + inherited; +end; + +procedure TMSServiceBroker.BeginConnection; +begin + if Connection = nil then + raise Exception.Create(SConnectionNotDefined); + TDBAccessUtils.InternalConnect(Connection); +end; + +procedure TMSServiceBroker.EndConnection; +begin + TDBAccessUtils.InternalDisconnect(Connection); +end; + +procedure TMSServiceBroker.EndConversations; +var + i: integer; +begin + for i := ConversationCount - 1 downto 0 do + Conversations[i].Free; + FConversations.Clear; +end; + +procedure TMSServiceBroker.CheckInactive; +begin + if AsyncNotification then + if ([csUpdating, csDesigning] * ComponentState) <> [] then + Stop + else + DatabaseError(SServiceBrokerAsync, Self); +end; + +procedure TMSServiceBroker.ConnectChange(Sender: TObject; Connecting: Boolean); +begin + if not Connecting then begin + Stop; + EndConversations; + end; +end; + +function TMSServiceBroker.GetConversation(Index: Integer): TMSConversation; +begin + Result := TMSConversation(FConversations[Index]); +end; + +function TMSServiceBroker.GetConversationCount: integer; +begin + Result := FConversations.Count; +end; + +function TMSServiceBroker.GetConversationIndexByHandle(Handle: TGuid): integer; +var + i: integer; +begin + Result := -1; + for i := 0 to FConversations.Count - 1 do + if CompareGuid(Conversations[i].Handle, Handle) then begin + Result := i; + Exit; + end; +end; + +class function TMSServiceBroker.GenerateReceiveSQL(const Queue: string; Conversation: TMSConversation; const FetchRows: integer; const TimeoutMSec: integer): string; +begin + if FetchRows = 0 then + Result := 'RECEIVE ' + else + Result := 'RECEIVE TOP(' + IntToStr(FetchRows) + ') '; + + Result := Result + 'message_id, message_body, status, queuing_order, conversation_group_id, conversation_handle, message_sequence_number, service_contract_name, service_contract_id, message_type_name, message_type_id, validation FROM ' + BracketIfNeed(Queue); + if Conversation <> nil then + Result := Result + ' WHERE conversation_handle = ' + + 'CONVERT(uniqueidentifier, ''''' + GuidToUniqueidentifier(Conversation.Handle) + ''''')'; + + if TimeoutMSec <> - 1 then + Result := 'WAITFOR (' + Result + '), TIMEOUT ' + IntToStr(TimeoutMSec); +end; + +function TMSServiceBroker.BeginDialogInternal( + const TargetService: string; + const TargetDatabase: string; + const Contract: string; + const LifeTime: integer; + const UseEncryption: boolean; + RelatedConversation: TMSConversation; + const GroupId: TGuid +): TMSConversation; +var + Param: TMSParam; +begin + if FService = '' then + raise Exception.Create(SServiceNotDefined); + + BeginConnection; + try + FQuery.SQL.Clear; + FQuery.SQL.Append('BEGIN DIALOG :ch FROM SERVICE :fs TO SERVICE :ts'); + Param := FQuery.ParamByName('ch'); + Param.DataType := ftGuid; + Param.ParamType := ptOutput; + Param := FQuery.ParamByName('fs'); + Param.AsString := FService; + Param := FQuery.ParamByName('ts'); + Param.AsString := TargetService; + + if TargetDatabase <> '' then begin + FQuery.SQL.Append(', :bi'); + Param := FQuery.ParamByName('bi'); + Param.AsWideString := TargetDatabase; + end; + + if Contract <> '' then begin + FQuery.SQL.Append(' ON CONTRACT :cn'); + Param := FQuery.ParamByName('cn'); + Param.AsString := Contract; + end; + + if UseEncryption then + FQuery.SQL.Append(' WITH ENCRYPTION = ON ') + else + FQuery.SQL.Append(' WITH ENCRYPTION = OFF '); + + if RelatedConversation <> nil then begin + FQuery.SQL.Append(', RELATED_CONVERSATION = :rch '); + Param := FQuery.ParamByName('rch'); + Param.AsString := GUIDToString(RelatedConversation.Handle); + end + else + if not CompareGuid(GroupId, DB_NULLGUID) then begin + FQuery.SQL.Append(', RELATED_CONVERSATION_GROUP = :rcg '); + Param := FQuery.ParamByName('rcg'); + Param.AsString := GUIDToString(GroupId); + end; + if LifeTime <> 0 then + FQuery.SQL.Append(', LIFETIME = ' + IntToStr(LifeTime) + ' '); + + FQuery.Execute; + + Param := FQuery.ParamByName('ch'); + Result := TMSConversation.Create(Self, StringToGUID(Param.AsString), True, TargetService); + except + EndConnection; + raise; + end; +end; + +function TMSServiceBroker.BeginDialog( + const TargetService: string; + const TargetDatabase: string = ''; + const UseEncryption: boolean = True; + RelatedConversation: TMSConversation = nil; + const LifeTime: integer = 0; + const Contract: string = ''): TMSConversation; +begin + Result := BeginDialogInternal(TargetService, TargetDatabase, Contract, LifeTime, UseEncryption, RelatedConversation, DB_NULLGUID); +end; + +function TMSServiceBroker.BeginDialog( + const TargetService: string; + const TargetDatabase: string; + const UseEncryption: boolean; + const GroupId: TGuid; + const LifeTime: integer = 0; + const Contract: string = ''): TMSConversation; +begin + Result := BeginDialogInternal(TargetService, TargetDatabase, Contract, LifeTime, UseEncryption, nil, GroupId); +end; + +function TMSServiceBroker.GetCurrentMessage: TMSMessage; +var + MsgList: TList; +begin + MsgList := FMsgs.LockList; + try + if MsgList.Count > 0 then + Result := TMSMessage(MsgList[0]) + else + Result := nil; + finally + FMsgs.UnlockList; + end; +end; + +procedure TMSServiceBroker.GetServiceBrockerObjNames(List: TStrings; SQL: string); +var + QueueDS: TMSQuery; + NameFld: TField; +begin + BeginConnection; + List.Clear; + QueueDS := nil; + try + QueueDS := TMSQuery.Create(nil); + QueueDS.Connection := Connection; + QueueDS.SQL.Text := SQL; + + if TOLEDBConnection(TMSAccessUtils.FIConnection(Connection)).DBMSPrimaryVer <= 8 then + Exit; + + QueueDS.Open; + + NameFld := QueueDS.Fields[0]; + while not QueueDS.Eof do begin + List.Add(NameFld.AsString); + QueueDS.Next + end; + + if List is TStringList then + TStringList(List).Sort; + finally + QueueDS.Free; + EndConnection; + end; +end; + +function TMSServiceBroker.GetQueue: string; +begin + if FQueue = '' then begin + BeginConnection; + try + FQuery.SQL.Text := 'SELECT q.name FROM sys.service_queues q, sys.services s WHERE (s.service_queue_id = q.object_id) AND (s.name = ''' + Service + ''')'; + FQuery.Execute; + FQueue := FQuery.Fields[0].AsString; + finally + EndConnection; + end; + end; + Result := FQueue; +end; + +function TMSServiceBroker.GetConnection: TMSConnection; +begin + Assert(FQuery <> nil); + Result := FQuery.Connection; +end; + +procedure TMSServiceBroker.SetConnection(const Value: TMSConnection); +begin + if Value <> Connection then begin + Stop; + EndConversations; + + if Connection <> nil then + TDBAccessUtils.UnRegisterClient(Connection, Self); + + FQuery.Connection := Value; + if Value <> nil then + TDBAccessUtils.RegisterClient(Value, Self, ConnectChange); + end; +end; + +procedure TMSServiceBroker.SetService(Value: string); +begin + if FService <> Value then begin + Stop; + if FConversations.Count > 0 then + if ([csUpdating, csDesigning] * ComponentState) <> [] then + EndConversations + else + DatabaseError(SDialogActive, Self); + FService := Value; + FQueue := ''; + end; +end; + +procedure TMSServiceBroker.SetFetchRows(Value: integer); +begin + FFetchRows := Value; + FReceiveSQL := ''; +end; + +procedure TMSServiceBroker.SetWaitTimeout(Value: integer); +begin + FWaitTimeout := Value; + FReceiveSQL := ''; +end; + +procedure TMSServiceBroker.SetOnMessage(Value: TMSMessageEvent); +begin + CheckInactive; + FOnMessage := Value; +end; + +class function TMSServiceBroker.ReceiveFromServer(Query: TMSQuery; Msgs: TThreadList): integer; // Received messages count +var + Msg: TMSMessage; + MsgList: TList; +begin + Assert(Query <> nil); + Assert(Query.Connection <> nil); + + Result := 0; + TDBAccessUtils.InternalConnect(Query.Connection); + try + Query.Execute; + + MsgList := Msgs.LockList; + try + while not Query.Eof do begin + Msg := TMSMessage.Create; + try + Msg.Fill(Query); + except + Msg.Free; + raise; + end; + MsgList.Add(Msg); + Inc(Result); + + Query.Next; + end; + finally + Msgs.UnlockList; + end; + Query.Close; + finally + // Query will automatically disconnect + // TDBAccessUtils.InternalDisconnect(Query.Connection); + end; +end; + +function TMSServiceBroker.Receive(Conversation: TMSConversation = nil): boolean; +var + MsgList: TList; + + procedure RemoveCurrentMessage; + var + Msg: TMSMessage; + begin + Msg := TMSMessage(MsgList[0]); + try + if (Msg.MessageType = SEndDialogType) or (Msg.MessageType = SErrorType) then begin + FConversations.Remove(Msg.Conversation); + Msg.Conversation.Free; + end; + finally + Msg.Free; + MsgList.Delete(0); + end; + end; + + procedure ActualizeCurrentMessage; + var + Msg: TMSMessage; + ConversationIndex: integer; + i: integer; + s: string; + begin + Msg := CurrentMessage; + + ConversationIndex := GetConversationIndexByHandle(Msg.FConversationHandle); + if ConversationIndex < 0 then + Msg.FConversation := TMSConversation.Create(Self, Msg.FConversationHandle, False) + else + Msg.FConversation := Conversations[ConversationIndex]; + + Msg.FConversation.FGroupId := Msg.FConversationGroupId; + Msg.FConversation.FContractName := Msg.FServiceContractName; + // Msg.FConversation.FContractId := Msg.FServiceContractId; + + if Assigned(FOnEndConversation) then begin + if Msg.MessageType = SEndDialogType then + FOnEndConversation(Self, Msg.Conversation, '', 0) + else + if Msg.MessageType = SErrorType then begin + i := Msg.Params.IndexOf('Description'); + s := Msg.ParamValues[i]; + i := Msg.Params.IndexOf('Code'); + i := StrToInt(Msg.ParamValues[i]); + FOnEndConversation(Self, Msg.Conversation, s, i); + end; + end; + end; + +begin + if (Conversation <> nil) and AsyncNotification then + raise Exception.Create(SServiceBrokerAsync); + + MsgList := FMsgs.LockList; + try + if (MsgList.Count > 0) and FReceivePrev then + RemoveCurrentMessage; + + if (MsgList.Count = 0) and not AsyncNotification then begin + if (FReceiveSQL = '') or (Conversation <> nil) then + FReceiveSQL := GenerateReceiveSQL(Queue, Conversation, FetchRows, WaitTimeout); + FQuery.SQL.Text := FReceiveSQL; + ReceiveFromServer(FQuery, FMsgs); + end; + + Result := MsgList.Count > 0; + FReceivePrev := Result; + if Result then + ActualizeCurrentMessage; + finally + FMsgs.UnlockList; + end; +end; + +procedure TMSServiceBroker.GetQueueNames(List: TStrings); +begin + GetServiceBrockerObjNames(List, 'SELECT name FROM sys.service_queues'); +end; + +procedure TMSServiceBroker.GetServiceNames(List: TStrings); +begin + GetServiceBrockerObjNames(List, 'SELECT name FROM sys.services'); +end; + +procedure TMSServiceBroker.GetContractNames(List: TStrings); +begin + GetServiceBrockerObjNames(List, 'SELECT name FROM sys.service_contracts'); +end; + +procedure TMSServiceBroker.GetMessageTypeNames(List: TStrings); +begin + GetServiceBrockerObjNames(List, 'SELECT name FROM sys.service_message_types'); +end; + +procedure TMSServiceBroker.CreateServerObjects; +begin + Connection.ExecSQL( + 'IF NOT EXISTS (SELECT * FROM sys.service_queues WHERE name = ''' + Service + '_QUEUE'') CREATE QUEUE ' + BracketIfNeed(Service + '_QUEUE') + #$D#$A + + 'IF NOT EXISTS (SELECT * FROM sys.services WHERE name = ''' + Service + ''') CREATE SERVICE ' + BracketIfNeed(Service) + ' ON QUEUE ' + BracketIfNeed(Service + '_QUEUE') + '([DEFAULT])', []); +end; + +procedure TMSServiceBroker.DropServerObjects; +begin + BeginConnection; + try + Stop; + + Connection.ExecSQL( + 'IF EXISTS (SELECT * FROM sys.services WHERE name = ''' + Service + ''') DROP SERVICE ' + BracketIfNeed(Service) + #$D#$A + + 'IF EXISTS (SELECT * FROM sys.service_queues WHERE name = ''' + Service + '_Queue'') DROP QUEUE ' + BracketIfNeed(Service + '_Queue'), []); + finally + EndConnection; + end; +end; + +procedure TMSServiceBroker.DoThreadMessage(Sender: TObject; Event: TObject); +var + i: integer; +begin + if Assigned(FOnMessage) then + for i := 0 to Integer(Event) - 1do + FOnMessage(Sender); +end; + +procedure TMSServiceBroker.DoException(Sender: TObject; E: Exception; var Fail: boolean); +begin + if (E is EOLEDBError) then begin + if EOLEDBError(E).ErrorCode = DB_E_CANCELED then + Fail := False + else + if Connection.Connected then + TMSAccessUtils.DoError(Connection, E, Fail); + if Fail then + Stop; + end; +end; + +procedure TMSServiceBroker.Start; +var + lt: TListenThread; +begin + if not FAsyncNotification then begin + BeginConnection; + if FService = '' then + DatabaseError(SServiceNotDefined, Self); + {if not Assigned(FOnMessage) then + DatabaseError(SOnMessageNotAssigned, Self);} + + Assert(FListener = nil); + FListener := TOLEDBThreadWrapper.Create(TListenThread, True); + lt := TListenThread(FListener.Thread); + Assert(lt.FConnection <> nil); + lt.FConnection.Assign(Connection); + lt.FConnection.LoginPrompt := False; + lt.FQuery.SQL.Text := GenerateReceiveSQL(Queue, nil, FetchRows, MaxInt); + lt.FMsgs := FMsgs; + + FListener.OnPostEvent := DoThreadMessage; + FListener.OnException := DoException; + FListener.Resume; + FAsyncNotification := True; + end; +end; + +procedure TMSServiceBroker.Stop; +begin + if FStopProcessing then + Exit; + + if FAsyncNotification then begin + FStopProcessing := True; + try + TListenThread(FListener.Thread).FQuery.BreakExec; + FListener.Free; + FListener := nil; + FAsyncNotification := False; + finally + FStopProcessing := False; + EndConnection; + end; + end; +end; + +procedure TMSServiceBroker.SetAsyncNotification(const Value: boolean); +begin + if csReading in ComponentState then begin + if Value then + FStreamedAsyncNotification := True; + end + else + if Value <> FAsyncNotification then + if Value then + Start + else + Stop; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Make.bat b/internal/4.10.0.10/1/Source/Make.bat new file mode 100644 index 0000000..edcfc1d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Make.bat @@ -0,0 +1,277 @@ +@echo off +rem ********************************************************************** +rem * +rem * SDAC +rem * +rem * Tasks: +rem * 1) Compile DAC packages; +rem * 2) Compile CRControls package; +rem * 2) Compile SDAC packages; +rem * +rem * Command line: +rem * call ..\_Make.bat IDEName IDEVer CLR +rem * +rem * Parameters: +rem * IDEName = (Delphi, CBuilder) +rem * IDEVer = (5, 6, 7, 8, 9, 10, 11) +rem * CLR = (CLR, WIN32) WIN32 - default +rem ********************************************************************** + +rem Prepare ============================================================== +rem ====================================================================== +set IDEName=%1 +set IDEVer=%2 +set CLR=%3 +set PrjName=Sdac +set PrjNameL=sdac + +pushd + +rem Test IDEName +if %IDEName%A==DelphiA goto IDENameOK +if %IDEName%A==CBuilderA goto IDENameOK +echo Command line must be: +echo call ..\_Make.bat IDEName IDEVer +echo IDEName = (Delphi, CBuilder) +goto Err +:IDENameOK + +rem Test IDEVer +if %IDEVer%A==5A goto IDEVerOK +if %IDEVer%A==6A goto IDEVerOK +if %IDEVer%A==7A goto IDEVerOK +if %IDEVer%A==8A goto IDEVerOK +if %IDEVer%A==9A goto IDEVerOK +if %IDEVer%A==10A goto IDEVerOK +if %IDEVer%A==11A goto IDEVer11 +echo Command line must be: +echo call ..\Make.bat IDEName IDEVer CLR +echo IDEVer = (5, 6, 7, 8, 9, 10, 11) +goto Err + +:IDEVer11: +set PkgVer=105 +goto PkgVerOK + +:IDEVerOK +set PkgVer=%IDEVer%0 + +:PkgVerOK + +rem Test CLR +if %CLR%A==CLRA goto CLROK +set CLR=WIN32 +:CLROK + +rem Make paths =========================================================== +rem Create common paths +mkdir %PrjName% +mkdir %PrjName%\Lib +mkdir %PrjName%\CRGrid +if %IDEVer%A==10A mkdir %PrjName%\Include + +rem Create CBuilder specific paths +if %IDEName%A==DelphiA goto SkipCBPaths +mkdir %PrjName%\Include +mkdir %PrjName%\Dcu +:SkipCBPaths + +rem del /Q/S %PrjName%\*.* + +if %IDEName%A==CBuilderA goto CBuilder +if %CLR%A==CLRA goto Delphi8 + +rem Compile ============================================================== +rem Compile DAC packages ================================================= +%IdeDir%\Bin\dcc32.exe" -LE. dac%PkgVer%.dpk +@if errorlevel 1 goto Err + +if %IDEVer%A==4A goto SkipDVcl +if %IDEVer%A==5A goto SkipDVcl +%IdeDir%\Bin\dcc32.exe" -LE. dacvcl%PkgVer%.dpk +@if errorlevel 1 goto Err + +:SkipDVcl +%IdeDir%\Bin\dcc32.exe" -LE. dcldac%PkgVer%.dpk +@if errorlevel 1 goto Err + +rem Compile CRControls package =========================================== +cd ..\..\CRGrid\Source\%IDEName%%IDEVer% +%IdeDir%\Bin\dcc32.exe" -LE. CRControls%PkgVer%.dpk -I..\..\..\Source -U..\..\..\Source\%IDEName%%IDEVer% +@if errorlevel 1 goto Err +cd ..\..\..\Source\%IDEName%%IDEVer% + +rem Compile SDAC packages =========================================== +%IdeDir%\Bin\dcc32.exe" -LE. %PrjNameL%%PkgVer%.dpk +@if errorlevel 1 goto Err + +if %IDEVer%A==4A goto SkipD__Vcl +if %IDEVer%A==5A goto SkipD__Vcl + +%IdeDir%\Bin\dcc32.exe" -LE. %PrjNameL%vcl%PkgVer%.dpk +@if errorlevel 1 goto Err + +:SkipD__Vcl + +%IdeDir%\Bin\dcc32.exe" -LE. dcl%PrjNameL%%PkgVer%.dpk +@if errorlevel 1 goto Err + +rem Copy files =========================================================== +rem ====================================================================== + +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CRControls%PkgVer%.bpl %PrjName% + +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CRControls%PkgVer%.dcp %PrjName%\CRGrid +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CRGrid.dcu %PrjName%\CRGrid +copy ..\..\CRGrid\Source\CRGrid.res %PrjName%\CRGrid + +copy *.bpl %PrjName% + +copy *.bpi %PrjName%\Lib +copy *.dcu %PrjName%\Lib +copy *.dcp %PrjName%\Lib +copy ..\*.res %PrjName%\Lib +copy *.hpp %PrjName%\Include +copy ..\*.hpp %PrjName%\Include + +copy ..\..\CRGrid\Source\CRControlsReg.hpp %PrjName%\Include +copy ..\..\CRGrid\Source\CRGrid.hpp %PrjName%\Include + +set IdeDir="D:\Progra~1\Borland\BDS\4.0 + +if not %IDEVer%A==10A goto SkipD10BCCLib +if not %CLR%A==WIN32A goto SkipD10BCCLib + +del %PrjName%\Include\*100.hpp +:SkipD10BCCLib + +goto end + +:Delphi8 +rem Compile Delphi8 ====================================================== +rem Compile DAC packages ================================================= + +%IdeDir%\Bin\dccil.exe" -LE. CoreLab.Dac.dpk +@if errorlevel 1 goto Err + +%IdeDir%\Bin\dccil.exe" -LE. CoreLab.Dac.AdoNet.dpk +@if errorlevel 1 goto Err + +%IdeDir%\Bin\dccil.exe" -LE. CoreLab.Dac.Design.dpk +@if errorlevel 1 goto Err + +rem Compile CRControls package =========================================== +cd ..\..\CRGrid\Source\%IDEName%%IDEVer% +%IdeDir%\Bin\dccil.exe" -LE. CoreLab.Vcl.dpk -I..\..\..\Source -U..\..\..\Source\%IDEName%%IDEVer%;..\ -R..\..\..\Source\;..\ +@if errorlevel 1 goto Err +cd ..\..\..\Source\%IDEName%%IDEVer% + +rem Compile SDAC packages =========================================== +%IdeDir%\Bin\dccil.exe" -LE. CoreLab.Sdac.dpk +@if errorlevel 1 goto Err + +%IdeDir%\Bin\dccil.exe" -LE. CoreLab.Sdac.AdoNet.dpk +@if errorlevel 1 goto Err + +%IdeDir%\Bin\dccil.exe" -LE. CoreLab.Sdac.Design.dpk +@if errorlevel 1 goto Err + +rem Copy files =========================================================== +rem ====================================================================== + +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CoreLab.Vcl.dll %PrjName% + +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CoreLab.Vcl.dcpil %PrjName%\CRGrid +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CoreLab.Vcl.CRGrid.dcuil %PrjName%\CRGrid +copy ..\..\CRGrid\Source\CRGrid.res %PrjName%\CRGrid + +copy *.dll %PrjName% + +copy *.dcuil %PrjName%\Lib +copy *.dcpil %PrjName%\Lib +copy ..\*.res %PrjName%\Lib + +goto end + +:CBuilder +rem Compile ============================================================== +rem Compile DAC packages ================================================= +cd %DacDir% + +%IdeDir%\Bin\bpr2mak.exe" -t..\dac.bmk dac%PkgVer%.bpk +@if errorlevel 1 goto Err +%IdeDir%\Bin\make.exe" -f dac%PkgVer%.mak +@if errorlevel 1 goto Err + +if %IDEVer%A==4A goto SkipCBVcl +if %IDEVer%A==5A goto SkipCBVcl +%IdeDir%\Bin\bpr2mak.exe" -t..\dac.bmk dacvcl%PkgVer%.bpk +@if errorlevel 1 goto Err +%IdeDir%\Bin\make.exe" -f dacvcl%PkgVer%.mak +@if errorlevel 1 goto Err + +:SkipCBVcl + +%IdeDir%\Bin\bpr2mak.exe" -t..\dac.bmk dcldac%PkgVer%.bpk +@if errorlevel 1 goto Err +%IdeDir%\Bin\make.exe" -f dcldac%PkgVer%.mak +@if errorlevel 1 goto Err + +rem Compile CRControls package =========================================== +cd ..\..\CRGrid\Source\%IDEName%%IDEVer% + +%IdeDir%\Bin\bpr2mak.exe" -t..\..\..\Source\dac.bmk CRControls%PkgVer%.bpk +@if errorlevel 1 goto Err +%IdeDir%\Bin\make.exe" -f CRControls%PkgVer%.mak +@if errorlevel 1 goto Err +cd ..\..\..\Source\%IDEName%%IDEVer% + +rem Compile SDAC packages =========================================== +%IdeDir%\Bin\bpr2mak.exe" -t..\dac.bmk %PrjNameL%%PkgVer%.bpk +@if errorlevel 1 goto Err +%IdeDir%\Bin\make.exe" -f %PrjNameL%%PkgVer%.mak +@if errorlevel 1 goto Err + +if %IDEVer%A==4A goto SkipCB__Vcl +if %IDEVer%A==5A goto SkipCB__Vcl + +%IdeDir%\Bin\bpr2mak.exe" -t..\dac.bmk %PrjNameL%vcl%PkgVer%.bpk +@if errorlevel 1 goto Err +%IdeDir%\Bin\make.exe" -f %PrjNameL%vcl%PkgVer%.mak +@if errorlevel 1 goto Err + +:SkipCB__Vcl + +%IdeDir%\Bin\bpr2mak.exe" -t..\dac.bmk dcl%PrjNameL%%PkgVer%.bpk +@if errorlevel 1 goto Err +%IdeDir%\Bin\make.exe" -f dcl%PrjNameL%%PkgVer%.mak +@if errorlevel 1 goto Err + +rem Copy files =========================================================== +rem ====================================================================== + +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CRControls%PkgVer%.bpl %PrjName% + +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CRControls%PkgVer%.bpi %PrjName%\CRGrid +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CRControls%PkgVer%.lib %PrjName%\CRGrid + +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CRGrid.obj %PrjName%\CRGrid +copy ..\..\CRGrid\Source\%IDEName%%IDEVer%\CRGrid.dcu %PrjName%\CRGrid +copy ..\..\CRGrid\Source\CRGrid.hpp %PrjName%\CRGrid +copy ..\..\CRGrid\Source\CRGrid.res %PrjName%\CRGrid + +copy *.bpl %PrjName% + +copy *.dcu %PrjName%\Dcu +copy ..\*.hpp %PrjName%\Include +copy *.bpi %PrjName%\Lib +copy *.lib %PrjName%\Lib +copy *.obj %PrjName%\Lib +copy ..\*.res %PrjName%\Lib + +goto end +:Err +pause + +:end +popd diff --git a/internal/4.10.0.10/1/Source/MemDS.pas b/internal/4.10.0.10/1/Source/MemDS.pas new file mode 100644 index 0000000..cff1d5d --- /dev/null +++ b/internal/4.10.0.10/1/Source/MemDS.pas @@ -0,0 +1,3921 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Memory Data Set +// Created: 01.02.98 +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit MemDS; +{$ENDIF} +interface +uses +{$IFDEF CLR} + DB, SysUtils, Classes, MemData, MemUtils{$IFDEF BDE_SHARED}, DBTables{$ENDIF}, Variants, + System.Runtime.InteropServices, System.Text, System.IO, System.XML; +{$ELSE} + DB, SysUtils, Classes, MemData, MemUtils{$IFDEF BDE_SHARED}, DBTables{$ENDIF} + {$IFDEF VER6P}, Variants{$ENDIF}, CRXml, CLRClasses; +{$ENDIF} + +const + uaDefault = 10; // TUpdateAction + +type + +{ TMemDataSet } + +{$IFDEF VER4} + +{$IFNDEF BDE_SHARED} + TUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApplied); // uaDefault +{$ENDIF} + +{$ENDIF} + + TUpdateRecordTypes = set of (rtModified, rtInserted, rtDeleted, rtUnmodified); + TUpdateErrorEvent = procedure(DataSet: TDataSet; E: EDatabaseError; + UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction) of object; + TUpdateRecordEvent = procedure(DataSet: TDataSet; UpdateKind: TUpdateKind; + var UpdateAction: TUpdateAction) of object; + +{$IFDEF CLR} + PRecInfo = packed record + private + Ptr: IntPtr; + + function GetRecordNumber: longint; + procedure SetRecordNumber(const Value: longint); + function GetUpdateStatus: TUpdateStatus; + procedure SetUpdateStatus(const Value: TUpdateStatus); + function GetBookmarkFlag: TBookmarkFlag; + procedure SetBookmarkFlag(const Value: TBookmarkFlag); + function GetRefComplexFields: boolean; + procedure SetRefComplexFields(const Value: boolean); + + public + property RecordNumber: longint read GetRecordNumber write SetRecordNumber; + property UpdateStatus: TUpdateStatus read GetUpdateStatus write SetUpdateStatus; + property BookmarkFlag: TBookmarkFlag read GetBookmarkFlag write SetBookmarkFlag; + property RefComplexFields: boolean read GetRefComplexFields write SetRefComplexFields; + + class operator Implicit(AValue: IntPtr): PRecInfo; + class operator Implicit(AValue: integer): PRecInfo; + end; +{$ELSE} + TRecordBuffer = PChar; + TValueBuffer = pointer; + PRecInfo = ^TRecInfo; +{$ENDIF} + TRecInfo = packed record + RecordNumber: longint; + UpdateStatus: TUpdateStatus; + BookmarkFlag: TBookmarkFlag; + RefComplexFields: boolean; + end; + +// TBlobData = string; + + TCalcFieldDescMapping = record + FieldDesc: TFieldDesc; + Field: TField; + end; + + TMemDataSet = class(TDataSet) + private + FOldRecBuf: TRecordBuffer; + FFilterBuffer: TRecordBuffer; + FCachedUpdates: boolean; + FLocalUpdate: boolean; + //FInDeferredPost: boolean; to protected + FInInserting: boolean; + FInEditing: boolean; + FIndexFieldNames: string; + FCalcFieldsMapping: array of TCalcFieldDescMapping; + + FOnUpdateError: TUpdateErrorEvent; + FOnUpdateRecord: TUpdateRecordEvent; + + //Renamed LocateRecord (CBuilder5 bug - overloaded methods in different sections): + function InternalLocateRecord(KeyFields: TDAList; const KeyValues: variant; + Options: TLocateExOptions; SavePos: boolean): boolean; overload; + + {function GetBlobData(Field:TField; Buffer: PChar):TBlobData; + procedure SetBlobData(Field:TField; Buffer: PChar; Value:TBlobData); + procedure ClearBlobCache(Buffer: PChar);} + + procedure SetCachedUpdates(Value: boolean); + function GetUpdatesPending: boolean; + function GetPrepared: boolean; + procedure SetPrepared(Value: boolean); + function GetUpdateRecordSet: TUpdateRecordTypes; + procedure SetUpdateRecordSet(Value: TUpdateRecordTypes); + procedure SetIndexFieldNames(Value: string); + + protected + Data: TData; // FIRecordSet + + FBookmarkOfs: longint; + FRecInfoOfs: longint; +{$IFNDEF CLR} +{$IFNDEF VER10P} + FWideStringOfs: longint; +{$ENDIF} +{$ENDIF} + FRecBufSize: longint; + FInCacheProcessing: boolean; + FInDeferredPost: boolean; // private + NewCacheRecBuf: TRecordBuffer; + OldCacheRecBuf: TRecordBuffer; + OldDeferredPostBuf: TRecordBuffer; + FParentDataSet: TMemDataSet; + FLastParentPos: integer; + FLocalConstraints: boolean; + FNumberRange: boolean; + FNeedAddRef: boolean; + FCacheCalcFields: boolean; + FCreateCalcFieldDescs: boolean; + + procedure CreateIRecordSet; virtual; + procedure FreeIRecordSet; + procedure SetIRecordSet(Value: TData{TRecordSet}); virtual; + + { Open/Close DataSet } + procedure OpenCursor(InfoQuery: boolean); override; + procedure CloseCursor; override; + + procedure InternalOpen; override; + procedure InternalClose; override; + function IsCursorOpen: boolean; override; + procedure DataReopen; virtual; + procedure InternalRefresh; override; + procedure CheckFieldCompatibility(Field: TField; FieldDef: TFieldDef); override; + procedure DoAfterOpen; override; + + { Field Management } + procedure InternalInitFieldDefs; override; + procedure CreateFieldDefs; virtual; + procedure ClearCalcFields(Buffer: TRecordBuffer); override; + + function GetObjectFieldDefName(Parent: TFieldDef; Index: integer; ObjType: TObjectType):string; virtual; + function GetFielDefSize(FieldType: TFieldType; FieldDesc: TFieldDesc): integer; virtual; + procedure GetObjectTypeNames(Fields: TFields); + function GetFieldType(DataType: word): TFieldType; overload; virtual; + function GetFieldType(FieldDesc: TFieldDesc): TFieldType; overload; virtual; + procedure SetFieldData(Field: TField; Buffer: TValueBuffer); override; + procedure SetFieldData(Field: TField; Buffer: TValueBuffer; NativeFormat: Boolean); override; + procedure DataConvert(Field: TField; Source, Dest: TValueBuffer; ToNative: Boolean); override; //TODO + function GetSparseArrays: boolean; + procedure SetSparseArrays(Value: boolean); + + procedure SetNumberRange(FieldDef: TFieldDef); virtual; + + { Buffer/Record Management } + function AllocRecordBuffer: TRecordBuffer; override; + procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override; + procedure CopyRecordBuffer(SrcBuffer: IntPtr; DstBuffer: IntPtr); + + procedure InitRecord(Buffer: TRecordBuffer); override; + procedure InternalInitRecord(Buffer: TRecordBuffer); override; + + function GetOldRecord: TRecordBuffer; + function GetActiveRecBuf(var RecBuf: TRecordBuffer): boolean; + function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: boolean): TGetResult; override; + + procedure BlockReadNext; override; + procedure SetBlockReadSize(Value: integer); override; + procedure FreeRefBuffers; + procedure FreeRefComplexFields(Buffer: TRecordBuffer; WithBlob: boolean = True); + + { Bookmarks } + procedure GetBookmarkData(Buffer: TRecordBuffer; {$IFDEF CLR}var{$ENDIF} Bookmark: TBookmark); override; + procedure SetBookmarkData(Buffer: TRecordBuffer; {$IFDEF CLR}const{$ENDIF} Bookmark: TBookmark); override; + function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override; + procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override; + //function GetBookmarkStr: TBookmarkStr; override; + + { Navigation } + procedure InternalFirst; override; + procedure InternalLast; override; + procedure InternalGotoBookmark({$IFDEF CLR}const{$ENDIF} Bookmark: TBookmark); override; + procedure InternalSetToRecord(Buffer: TRecordBuffer); override; + + { Editing } + procedure InternalAddRecord(Buffer: IntPtr; Append: boolean); override; + procedure InternalInsert; override; + procedure InternalDelete; override; + procedure InternalEdit; override; + + procedure InternalPost; override; + procedure InternalCancel; override; + + procedure InternalDeferredPost; virtual; + + function PerformAppend: boolean; virtual; + function PerformDelete: boolean; virtual; + function PerformUpdate: boolean; virtual; + + procedure DoPerformAppend; + procedure DoPerformDelete; + procedure DoPerformUpdate; + procedure DoGetCachedFields; + procedure DoGetCachedBuffer(Buffer: IntPtr; Source: IntPtr = nil); + + procedure SetDefaultExpressionValue(Field: TField); virtual; + procedure DoOnNewRecord; override; + + { Filter/Find/Locate } + procedure ActivateFilters; + procedure DeactivateFilters; + function RecordFilter(RecBuf: IntPtr): boolean; + procedure SetFilterData(const Text: string; Options:TFilterOptions); + + procedure SetFiltered(Value: boolean); override; + procedure SetFilterOptions(Value: TFilterOptions); override; + procedure SetFilterText(const Value: string); override; + procedure SetOnFilterRecord(const Value: TFilterRecordEvent); override; + + procedure CopyFieldValue(const Value: variant; out ValuePtr: IntPtr; out ValueType: integer; FieldDesc: TFieldDesc); virtual; + function LocateRecord(const KeyFields: string; const KeyValues: variant; + Options: TLocateExOptions; SavePos: boolean): boolean; overload; + function LocateRecord(const KeyFields: array of TField; const KeyValues: variant; + Options: TLocateExOptions; SavePos: boolean): boolean; overload; + function FindRecord(Restart, GoForward: boolean): boolean; override; + + { CachedUpdates } + function BatchUpdate: boolean; virtual; + function CanFlushBatch: boolean; virtual; + procedure FlushBatch; virtual; + + procedure CheckCachedUpdateMode; + + procedure DoApplyRecord(UpdateKind: TUpdateRecKind; var Action: TUpdateRecAction; LastItem: boolean); + + { Blobs } + //Renamed GetBlob (CBuilder5 bug - overloaded methods in different sections): + function InternalGetBlob(FieldDesc: TFieldDesc): TBlob; + function InternalSetBlob(FieldDesc: TFieldDesc; Blob: TBlob): boolean; + function SetBlob(Field: TField; Blob: TBlob): boolean; + procedure CloseBlob(Field: TField); override; + + { Misc } + function GetRecordCount: integer; override; + function GetRecordSize: word; override; + + function GetRecNo: integer; override; + procedure SetRecNo(Value: integer); override; + + procedure InternalHandleException; override; + + procedure AssignTo(Dest: TPersistent); override; + + {$IFDEF CLR} + procedure DataEvent(Event: TDataEvent; Info: TObject); override; + {$ELSE} + procedure DataEvent(Event: TDataEvent; Info: longint); override; + {$ENDIF} + + function GetStateFieldValue(State: TDataSetState; Field: TField): Variant; override; + + { XML } + procedure WriteFieldXMLDataType(Field: TField; FieldDesc: TFieldDesc; const FieldAlias: string; + XMLWriter: XMLTextWriter); virtual; + procedure WriteFieldXMLAttributeType(Field: TField; FieldDesc: TFieldDesc; const FieldAlias: string; + XMLWriter: XMLTextWriter); virtual; + function GetFieldXMLValue(Field: TField; FieldDesc: TFieldDesc): string; virtual; + + public + constructor Create(aOwner: TComponent); override; + destructor Destroy; override; + + procedure Prepare; virtual; + procedure UnPrepare; virtual; + procedure CheckPrepared; + + { Fields } + function GetFieldDescNo(Field: TField): integer; + function GetFieldDesc(const Field: TField): TFieldDesc; overload; virtual; + function GetFieldData(Field: TField; Buffer: TValueBuffer): boolean; overload; override; + //function Translate(const Src: string; var Dest: string; ToOem: boolean): integer; override; + + function GetFieldData(FieldNo: integer; Buffer: TValueBuffer): boolean; overload; override; + function GetFieldData(Field: TField; Buffer: TValueBuffer; NativeFormat: Boolean): Boolean; override; + + function GetBlob(const FieldName: string): TBlob; overload; + function GetBlob(Field: TField): TBlob; overload; + + { Edit } + procedure Cancel; override; + procedure DeferredPost; + + { Bookmarks } + {$IFDEF CLR} // TDataSet bug + function GetBookmark: TBookmark; override; + procedure FreeBookmark(var Bookmark: TBookmark); override; + {$ENDIF} + function BookmarkValid({$IFDEF CLR}const{$ENDIF} Bookmark: TBookmark): boolean; override; + function CompareBookmarks({$IFDEF CLR}const{$ENDIF} Bookmark1, Bookmark2: TBookmark): integer; override; + + function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override; + + function Locate(const KeyFields: string; const KeyValues: variant; + Options: TLocateOptions): boolean; overload; override; + function Locate(const KeyFields: array of TField; const KeyValues: variant; + Options: TLocateOptions): boolean; reintroduce; overload; + function LocateEx(const KeyFields: string; const KeyValues: variant; + Options: TLocateExOptions): boolean; overload; + function LocateEx(const KeyFields: array of TField; const KeyValues: variant; + Options: TLocateExOptions): boolean; overload; + function Lookup(const KeyFields: string; const KeyValues: variant; + const ResultFields: string): variant; override; + + { CachedUpdates } + function UpdateStatus: TUpdateStatus; override; + function UpdateResult: TUpdateAction; + procedure ApplyUpdates; virtual; + procedure CommitUpdates; + procedure CancelUpdates; + procedure RestoreUpdates; + procedure RevertRecord; + + { XML } + procedure SaveToXML(Destination: TStream); overload; + procedure SaveToXML(const FileName: string); overload; + + function IsSequenced: boolean; override; + + property Prepared: boolean read GetPrepared write SetPrepared; + property CachedUpdates: boolean read FCachedUpdates write SetCachedUpdates default False; + property UpdatesPending: boolean read GetUpdatesPending; + property LocalUpdate: boolean read FLocalUpdate write FLocalUpdate default False; + property UpdateRecordTypes: TUpdateRecordTypes read GetUpdateRecordSet write SetUpdateRecordSet; + property SparseArrays: boolean read GetSparseArrays write SetSparseArrays; + + // obsolete + property LocalConstraints: boolean read FLocalConstraints write FLocalConstraints default True; + + property OnUpdateError: TUpdateErrorEvent read FOnUpdateError write FOnUpdateError; + property OnUpdateRecord: TUpdateRecordEvent read FOnUpdateRecord write FOnUpdateRecord; + property IndexFieldNames: string read FIndexFieldNames write SetIndexFieldNames; + end; + +{ TBlobStream } + + TBlobStream = class(TStream) + protected + FField: TBlobField; + FDataSet: TMemDataSet; + FBuffer: TRecordBuffer; + FMode: TBlobStreamMode; + FFieldNo: integer; + FOpened: boolean; + FModified: boolean; + FPosition: longint; + function GetBlobSize: Longint; + + protected + {$IFDEF CLR} + procedure SetSize(NewSize: Int64); override; + {$ELSE} + procedure SetSize(NewSize: Longint); override; + {$ENDIF} + public + constructor Create(Field: TBlobField; Mode: TBlobStreamMode); + destructor Destroy; override; + {$IFDEF CLR} + function Read(var Buffer: TBytes; Offset, Count: Longint): Longint; override; + function Write(const Buffer: TBytes; Offset, Count: Longint): Longint; override; + function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; + {$ELSE} + function Read(var Buffer; Count: longint): longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + {$ENDIF} + procedure Truncate; + end; + + TMemDSUtils = class + public + class function SetBlob(Obj: TMemDataSet; Field: TField; Blob: TBlob): boolean; + class function GetBlob(Obj: TMemDataSet; FieldDesc: TFieldDesc): TBlob; + end; + + function GetFieldType(DataType: word): TFieldType; + function GetDataType(FieldType: TFieldType): word; + + function ChangeDecimalSeparator(const Value: string; OldSeparator, NewSeparator: string): string; + + function XMLEncode(const AStr: String): String; + +implementation + +uses +{$IFDEF VER6P} + DateUtils,FmtBcd, +{$ENDIF} + DBConsts, DAConsts, Math{$IFDEF MSWINDOWS}, Windows{$ENDIF}; + +const +{$IFDEF VER4} + DataTypeMap: array [TFieldType] of word = ( + // ftUnknown, ftString, ftSmallint, ftInteger, ftWord + dtUnknown, dtString, dtInt16, dtInteger, dtUInt16, + // ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, + dtBoolean, dtFloat, dtCurrency, dtBCD, dtDate, dtTime, dtDateTime, + // ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, + dtBytes, dtVarBytes, dtInteger, dtBlob, dtMemo, 0, 0, + // ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, + 0, 0, 0, 0, dtString, dtWideString, + // ftLargeint, ftADT, ftArray, ftReference, ftDataSet + dtInt64, dtObject, dtArray, dtReference, dtTable); +{$ENDIF} +{$IFDEF VER5} + DataTypeMap: array [TFieldType] of word = ( + // ftUnknown, ftString, ftSmallint, ftInteger, ftWord + dtUnknown, dtString, dtInt16, dtInteger, dtUInt16, + // ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, + dtBoolean, dtFloat, dtCurrency, dtBCD, dtDate, dtTime, dtDateTime, + // ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, + dtBytes, dtVarBytes, dtInteger, dtBlob, dtMemo, 0, 0, + // ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, + 0, 0, 0, 0, dtString, dtWideString, + // ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, + dtInt64, dtObject, dtArray, dtReference, dtTable, 0, 0, + // ftVariant, ftInterface, ftIDispatch, ftGuid + dtVariant, 0, 0, dtGuid); +{$ENDIF} +{$IFDEF VER6P} +{$IFNDEF VER10P} + DataTypeMap: array [TFieldType] of word = ( + // ftUnknown, ftString, ftSmallint, ftInteger, ftWord + dtUnknown, dtString, dtInt16, dtInteger, dtUInt16, + // ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, + dtBoolean, dtFloat, dtCurrency, dtBCD, dtDate, dtTime, dtDateTime, + // ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, + dtBytes, dtVarBytes, dtInteger, dtBlob, dtMemo, 0, 0, + // ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, + 0, 0, 0, 0, dtString, dtWideString, + // ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, + dtInt64, dtObject, dtArray, dtReference, dtTable, 0, 0, + // ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd + dtVariant, 0, 0, dtGuid, 0, dtFmtBCD); +{$ENDIF} +{$ENDIF} + +{$IFDEF VER10P} + DataTypeMap: array [TFieldType] of word = ( + // ftUnknown, ftString, ftSmallint, ftInteger, ftWord + dtUnknown, dtString, dtInt16, dtInteger, dtUInt16, + // ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, + dtBoolean, dtFloat, dtCurrency, dtBCD, dtDate, dtTime, dtDateTime, + // ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, + dtBytes, dtVarBytes, dtInteger, dtBlob, dtMemo, 0, 0, + // ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, + 0, 0, 0, 0, dtString, dtWideString, + // ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, + dtInt64, dtObject, dtArray, dtReference, dtTable, 0, 0, + // ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd, ftFixedWideChar + dtVariant, 0, 0, dtGuid, 0, dtFmtBCD, dtWideString, + // ftWideMemo, ftOraTimeStamp, ftOraInterval + dtWideMemo, 0, 0); +{$ENDIF} + +function GetFieldType(DataType: word): TFieldType; +begin + case DataType of + dtUnknown: + Result := ftUnknown; + dtString: + Result := ftString; + dtWideString: + Result := ftWideString; + dtInt8: + Result := ftSmallint; + dtInt16: + Result := ftSmallint; + dtWord: + Result := ftWord; + dtInteger: + Result := ftInteger; + dtUInt32: + Result := ftLargeInt; + dtLargeint: + Result := ftLargeInt; + dtFloat: + Result := ftFloat; + dtDate: + Result := ftDate; + dtTime: + Result := ftTime; + dtDateTime: + Result := ftDateTime; + dtMemo: + Result := ftMemo; + dtWideMemo: + Result := {$IFDEF VER10P}ftWideMemo;{$ELSE}ftMemo;{$ENDIF} + dtBlob: + Result := ftBlob; + dtObject: + Result := ftADT; + dtReference: + Result := ftReference; + dtArray: + Result := ftArray; + dtTable: + Result := ftDataSet; + dtBoolean: + Result := ftBoolean; + {$IFDEF VER5P} + dtVariant: + Result := ftVariant; + {$ENDIF} + dtExtString: + Result := ftString; + dtExtWideString: + Result := ftWideString; + dtBytes: + Result := ftBytes; + dtVarBytes: + Result := ftVarBytes; + dtExtVarBytes: + Result := ftVarBytes; + dtBCD: + Result := ftBCD; + {$IFDEF VER6P} + dtFmtBCD: + Result := ftFMTBcd; + {$ENDIF} + dtGuid: + Result := ftGuid; + dtCurrency: + Result := ftCurrency; + else + Assert(False, SUnknownDataType); + Result := ftUnknown; + end; +end; + +function GetDataType(FieldType: TFieldType): word; +begin + Result := DataTypeMap[FieldType]; +end; + +{$IFDEF CLR} +{ PRecInfo } + +function PRecInfo.GetRecordNumber: longint; +begin + Result := Marshal.ReadInt32(Ptr); +end; + +procedure PRecInfo.SetRecordNumber(const Value: longint); +begin + Marshal.WriteInt32(Ptr, Value); +end; + +function PRecInfo.GetUpdateStatus: TUpdateStatus; +begin + Result := TUpdateStatus(Marshal.ReadByte(Ptr, sizeof(longint))); +end; + +procedure PRecInfo.SetUpdateStatus(const Value: TUpdateStatus); +begin + Marshal.WriteByte(Ptr, sizeof(longint), byte(Value)); +end; + +function PRecInfo.GetBookmarkFlag: TBookmarkFlag; +begin + Result := TBookmarkFlag(Marshal.ReadByte(Ptr, sizeof(integer) + sizeof(TUpdateStatus))); +end; + +procedure PRecInfo.SetBookmarkFlag(const Value: TBookmarkFlag); +begin + Marshal.WriteByte(Ptr, sizeof(integer) + sizeof(TUpdateStatus), byte(Value)); +end; + +function PRecInfo.GetRefComplexFields: boolean; +begin + Result := boolean(Marshal.ReadByte(Ptr, sizeof(integer) + sizeof(TUpdateStatus) + + sizeof(TBookmarkFlag))); +end; + +procedure PRecInfo.SetRefComplexFields(const Value: boolean); +begin + Marshal.WriteByte(Ptr, sizeof(integer) + sizeof(TUpdateStatus) + + sizeof(TBookmarkFlag), byte(Value)); +end; + +class operator PRecInfo.Implicit(AValue: IntPtr): PRecInfo; +begin + Result.Ptr := AValue; +end; + +class operator PRecInfo.Implicit(AValue: integer): PRecInfo; +begin + Result.Ptr := IntPtr(AValue); +end; +{$ENDIF} + +{ TMemDataSet } + +constructor TMemDataSet.Create(aOwner:TComponent); +begin + inherited Create(aOwner); + + FLocalConstraints := True; + FCreateCalcFieldDescs := True; + + CreateIRecordSet; +end; + +destructor TMemDataSet.Destroy; +begin + inherited; + + UnPrepare; + + FreeIRecordSet; +end; + +procedure TMemDataSet.CreateIRecordSet; +begin + SetIRecordSet(TMemData.Create); +end; + +procedure TMemDataSet.FreeIRecordSet; +begin + Data.Free; +end; + +procedure TMemDataSet.SetIRecordSet(Value: TData); +begin + Data := Value; + + if Data <> nil then begin + Data.CachedUpdates := FCachedUpdates; + Data.OnAppend := DoPerformAppend; + Data.OnDelete := DoPerformDelete; + Data.OnUpdate := DoPerformUpdate; + Data.OnApplyRecord := DoApplyRecord; + if FCreateCalcFieldDescs then begin + TMemData(Data).OnGetCachedFields := DoGetCachedFields; + TMemData(Data).OnGetCachedBuffer := DoGetCachedBuffer; + end; + end; +end; + +{ Open/Close DataSet } + +procedure TMemDataSet.Prepare; +begin + if not Prepared then begin + Data.Prepare; + CreateFieldDefs; + end; +end; + +procedure TMemDataSet.UnPrepare; +begin + if Active then + Close; + + Data.UnPrepare; + + if not (csDestroying in ComponentState) then // This line may be called after destroing FieldDefs. For details see TMemDataSet.Destroy + FieldDefs.Updated := False; +end; + +procedure TMemDataSet.CheckPrepared; +begin + if not Prepared then + DatabaseError(SDataSetIsNotPrepared); +end; + +procedure TMemDataSet.InternalOpen; +var + Field: TField; + i: integer; +begin + Data.Open; + + CreateFieldDefs; + + // Update FieldDefs once to avoid multiple Update calls when working with FieldDefsList + // (Perfomance optimization) +// FieldDefs.Updated := False; +// FieldDefs.Update; + + if DefaultFields then + CreateFields + else // Setting actual size + for i := 0 to FieldDefs.Count - 1 do + if FieldDefs[i].DataType = ftString then begin + Field := FindField(FieldDefs[i].Name); + if (Field <> nil) and (Field.FieldKind = fkData) then begin + CheckFieldCompatibility(Field, FieldDefs[i]); + Field.Size := FieldDefs[i].Size; + end; + end; + + // Set number specific + if FNumberRange then + for i := 0 to FieldDefs.Count - 1 do + SetNumberRange(FieldDefs[i]); + + BindFields(True); + + if (Data.Fields.Count > 0) and (Data.Fields[Data.Fields.Count - 1].FieldDescKind = fdkCached) then + TMemData(Data).UpdateCachedBuffer(nil, nil); + + if ObjectView then + GetObjectTypeNames(Fields); + + if (Data is TMemData) and (TMemData(Data).IndexFields.Count > 0) then + TMemData(Data).SortItems; + + BookmarkSize := SizeOf(TRecBookmark); + + //FBlobCacheOfs := Data.RecordSize + CalcFieldsSize; + if not FCreateCalcFieldDescs then + FRecInfoOfs := Data.RecordSize + CalcFieldsSize + else + if FCacheCalcFields then + FRecInfoOfs := Data.RecordSize + else + FRecInfoOfs := Data.RecordSize + Data.CalcRecordSize; //FBlobCacheOfs + BlobFieldCount * SizeOf(Pointer); + + FBookmarkOfs := FRecInfoOfs + SizeOf(TRecInfo); + FRecBufSize := FBookmarkOfs + BookmarkSize; + +{$IFNDEF CLR} +{$IFNDEF VER10P} + if not FCreateCalcFieldDescs then begin + FWideStringOfs := FRecBufSize; + + if CalcFieldsSize > 0 then + for i := 0 to Fields.Count - 1 do + if (Fields[i].DataType = ftWideString) and (Fields[i].FieldKind in [fkCalculated, fkLookUp]) then + FRecBufSize := FRecBufSize + (Fields[i].Size + 1) * sizeof(WideChar); + end; +{$ENDIF} +{$ENDIF} + + FInCacheProcessing := False; + + if Filtered then begin + ActivateFilters; + Data.FilterUpdated; + end; +end; + +function TMemDataSet.IsCursorOpen: boolean; +begin + Result := Data.Active; +end; + +procedure TMemDataSet.InternalClose; +begin + BindFields(False); + if DefaultFields then + DestroyFields; + + Data.Close; +end; + +procedure TMemDataSet.OpenCursor(InfoQuery: boolean); +begin + inherited; + + if not InfoQuery then begin + if FOldRecBuf <> nil then begin + FreeRecordBuffer(FOldRecBuf); + FOldRecBuf := nil; + end; + + FOldRecBuf := AllocRecordBuffer; + end; + //DataEvent(deDataSetChange, 0); // Notify nested datasets // DEBUG +end; + +procedure TMemDataSet.CloseCursor; +var + Buffer: IntPtr; + RecInfo: PRecInfo; +begin +// free complex fields if call Close in dsInsert or dsEdit mode +// TDataSet.Close doesn't call Cancel + if Data.HasComplexFields then begin + if FInInserting then begin + Buffer := ActiveBuffer; + RecInfo := PRecInfo(integer(Buffer) + FRecInfoOfs); + if RecInfo.RefComplexFields then begin + Data.FreeComplexFields(Buffer, True); + RecInfo.RefComplexFields := False; + end; + end; + if FInEditing then begin + Buffer := ActiveBuffer; + RecInfo := PRecInfo(integer(Buffer) + FRecInfoOfs); + if RecInfo.RefComplexFields then begin + Data.FreeComplexFields(Buffer, False); // Blobs isn't created + RecInfo.RefComplexFields := False; + end; + end; + + if FInInserting then + Data.FreeComplexFields(ActiveBuffer, True); + if FInEditing then + Data.FreeComplexFields(ActiveBuffer, False); // Blobs isn't created + + FInInserting := False; + FInEditing := False; + end; + + if FOldRecBuf <> nil then begin + FreeRecordBuffer(FOldRecBuf); + FOldRecBuf := nil; + end; + + try + inherited; + finally + FParentDataSet := nil; + end; +end; + +procedure TMemDataSet.DataReopen; +begin + Data.Reopen; +end; + +procedure TMemDataSet.InternalRefresh; +begin + FreeRefBuffers; + //ClearBuffers; /// CR11512 + DataReopen; + if (Data is TMemData) and (TMemData(Data).IndexFields.Count > 0) then + TMemData(Data).SortItems; +end; + +procedure TMemDataSet.CheckFieldCompatibility(Field: TField; FieldDef: TFieldDef); +begin + with Field do + begin + {$IFDEF VER6P} + if (DataType <= ftFMTBcd) and (FieldDef.DataType <= ftFMTBcd) then + {$ELSE} + if (DataType <= ftGuid) and (FieldDef.DataType <= ftGuid) then + {$ENDIF} + inherited CheckFieldCompatibility(Field, FieldDef) + else + if DataType <> FieldDef.DataType then + DatabaseErrorFmt(SFieldTypeMismatch, [DisplayName, + FieldTypeNames[DataType], FieldTypeNames[FieldDef.DataType]], Self); + end; +end; + +procedure TMemDataSet.DoAfterOpen; +var + i: integer; +begin + inherited; + + for i := 0 to NestedDataSets.Count - 1 do + with TDataSet(NestedDataSets[i]) do + if Active then + DataEvent(deParentScroll, {$IFDEF CLR}nil{$ELSE}0{$ENDIF}); +end; + +procedure TMemDataSet.FreeRefBuffers; +var + i: integer; +begin + if FNeedAddRef then + for i := 0 to BufferCount do + FreeRefComplexFields(Buffers[i]); + FreeRefComplexFields(TempBuffer); +end; + +procedure TMemDataSet.FreeRefComplexFields(Buffer: TRecordBuffer; WithBlob: boolean); +var + RecInfo: PRecInfo; +begin + RecInfo := PRecInfo(integer(Buffer) + FRecInfoOfs); + if RecInfo.RefComplexFields then begin + Data.FreeComplexFields(Buffer, WithBlob); + RecInfo.RefComplexFields := False; + end; +end; + +{ Field Management } + +procedure TMemDataSet.InternalInitFieldDefs; +var + CheckDefs: boolean; + i: integer; + OldFieldNames: array of string; + OldFieldCount: integer; + +begin + // can't CreateFieldDefs if FieldDefs.Update(InitFieldDefs) + if not Data.Active then begin + OldFieldCount := Data.Fields.Count; + CheckDefs := (FieldDefs <> nil) and not FieldDefs.Updated; + if CheckDefs then begin + SetLength(OldFieldNames, OldFieldCount); + for i := 0 to OldFieldCount - 1 do + OldFieldNames[i] := Data.Fields[i].Name; + end; + + Data.InitFields; + + if OldFieldCount <> Data.Fields.Count then + FieldDefs.Updated := False + else + if CheckDefs then + for i := 0 to OldFieldCount - 1 do + if OldFieldNames[i] <> Data.Fields[i].Name then begin + FieldDefs.Updated := False; + Break; + end; + + CreateFieldDefs; + end; +end; + +function TMemDataSet.GetFieldType(DataType: word): TFieldType; +begin + Result := {$IFDEF CLR}CoreLab.Dac.{$ENDIF}MemDS.GetFieldType(DataType); +end; + +function TMemDataSet.GetFieldType(FieldDesc: TFieldDesc): TFieldType; +begin + Result := GetFieldType(FieldDesc.DataType); +end; + +function TMemDataSet.GetObjectFieldDefName(Parent: TFieldDef; Index: integer; ObjType: TObjectType):string; +begin + Result := IntToStr(Index); +end; + +function TMemDataSet.GetFielDefSize(FieldType: TFieldType; FieldDesc: TFieldDesc): integer; +begin + Result := 0; + case FieldType of + ftString, ftWideString{$IFDEF VER5P},ftGuid{$ENDIF}: begin + Result := FieldDesc.Length; + if Result = 0 then + Result := 1; // For SELECT NULL FROM ... + end; + ftBytes, ftVarBytes: + Result := FieldDesc.Length; + end; +end; + +procedure TMemDataSet.CreateFieldDefs; + + function GetFieldName(ParentFieldName, FieldName: string; Index: integer): string; + var + NewFieldName: string; + begin + if Index = 0 then + NewFieldName := FieldName + else + NewFieldName := FieldName + '_' + IntToStr(Index); + + if (FieldDefs.IndexOf(ParentFieldName + '.' + NewFieldName) <> -1) then + Result := GetFieldName(ParentFieldName, FieldName, Index + 1) + else + Result := NewFieldName; + end; + + procedure CreateObjectFields(ObjType: TObjectType; Parent: TFieldDef); + var + i: integer; + FieldDef: TFieldDef; + FieldType: TFieldType; + aSize: word; + Item,CountItem: integer; + FieldName: string; + begin + if (ObjType.DataType = dtObject) or SparseArrays then + CountItem := 1 + else begin + CountItem := ObjType.Size; + if CountItem > MaxArrayItem then // Restriction of array length + CountItem := MaxArrayItem; + end; + + for i := 0 to ObjType.AttributeCount - 1 do begin + for Item := 0 to CountItem - 1 do begin + with ObjType.Attributes[i] do begin + FieldType := GetFieldType(DataType); + + aSize := 0; + case FieldType of + ftString: + aSize := Length; + end; + + FieldDef := TFieldDef.Create(Parent.ChildDefs); + if ObjType.DataType = dtObject then + FieldName := Name + else + FieldName := GetObjectFieldDefName(Parent, Item, ObjType); + FieldDef.Name := GetFieldName(Parent.Name, FieldName, 0); + + FieldDef.DataType := FieldType; + FieldDef.Size := aSize; + FieldDef.Required := False; + if DB.faReadonly in Parent.Attributes then + FieldDef.Attributes := FieldDef.Attributes + [DB.faReadonly]; + + if FieldType in [ftADT,ftArray] then + CreateObjectFields(ObjectType, FieldDef); + end; + end; + end; + end; + +var + FieldType: TFieldType; + aSize: word; + i: integer; + FieldDef: TFieldDef; +begin + if FieldDefs.Updated then Exit; + FieldDefs.BeginUpdate; + try + FieldDefs.Clear; + for i := 0 to Data.FieldCount - 1 do + with Data.Fields[i] do + if not HiddenObject and (FieldDescKind = fdkData) and (not HasParent or ParentField.HiddenObject) then begin + // FieldNo 1.. + FieldType := GetFieldType(Data.Fields[i]); + aSize := GetFielDefSize(FieldType, Data.Fields[i]); + if FieldType <> ftUnknown then begin + FieldDef := TFieldDef.Create(FieldDefs, Name, FieldType, aSize, + Required and FLocalConstraints, i + 1); + + if ReadOnly then + FieldDef.Attributes := FieldDef.Attributes + [DB.faReadonly]; + + if FieldType in [ftFloat, ftInteger] then + FieldDef.Precision := Length + else + if FieldType in [ftBCD{$IFDEF VER6P}, ftFMTBCD{$ENDIF}] then begin + FieldDef.Precision := Length; + FieldDef.Size := Scale; + end + else + if FieldType in [ftADT, ftArray] then + CreateObjectFields(ObjectType, FieldDef); + + if Hidden then + FieldDef.Attributes := FieldDef.Attributes + [DB.faHiddenCol]; + {$IFDEF VER5P} + if Fixed then + FieldDef.Attributes := FieldDef.Attributes + [DB.faFixed]; + {$ENDIF} + end; + end; + finally + FieldDefs.EndUpdate; + end; + FieldDefList.Update; + FieldDefs.Updated := True; +end; + +procedure TMemDataSet.GetObjectTypeNames(Fields: TFields); +var + i: integer; + ObjectField: TObjectField; +begin + for i := 0 to Fields.Count - 1 do + if Fields[i] is TObjectField then begin + ObjectField := TObjectField(Fields[i]); + + ObjectField.ObjectType := Data.Fields[Fields[i].FieldNo - 1].ObjectType.Name; + + with ObjectField do + if DataType in [ftADT, ftArray] then begin + if (DataType = ftArray) and SparseArrays and + (Fields[0].DataType = ftADT) + then + GetObjectTypeNames(TObjectField(Fields[0]).Fields) + else + GetObjectTypeNames(Fields); + end; + end +end; + +function TMemDataSet.GetFieldDescNo(Field: TField): integer; +var + FieldDesc: TFieldDesc; +begin + FieldDesc := GetFieldDesc(Field); + if FieldDesc <> nil then + Result := FieldDesc.FieldNo + else + raise Exception.Create(Format(SFieldNotFound, [Field.FieldName])); +end; + +function TMemDataSet.GetFieldDesc(const Field: TField): TFieldDesc; +var + FieldDesc: TFieldDesc; + i: integer; + Found: boolean; +begin + Assert(Data <> nil, 'FIRecordSet must be setted to this time'); + Assert(Field <> nil, 'Field cannot be nil'); + Assert((Field.DataSet = Self) or (Field.DataSet = nil {CR 22356}), 'Wrong DataSet'); + {if Field.DataSet <> Self then + for i := 0 to Data.FieldCount - 1 do + if AnsiLowerCase(Field.FieldName) = AnsiLowerCase(Data.Fields[i].Name) then begin /// Field.FieldName must be equal with FieldDesc.Name + Result := Data.Fields[i]; + Exit; + end;} + + Result := nil; + if Field.FieldNo > 0 then + Result := TFieldDesc(Data.Fields[Field.FieldNo - 1]) + else + begin + if DefaultFields and (Fields.Count = Data.Fields.Count {just in case; should be moved to Assert}) then begin + i := Fields.IndexOf(Field); + Result := Data.Fields[i]; + end + else + for i := 0 to Data.FieldCount - 1 do begin + FieldDesc := Data.Fields[i]; + Found := AnsiLowerCase(Field.FieldName) = AnsiLowerCase(FieldDesc.Name); /// Field.FieldName must be equal with FieldDesc.Name + if (Field.FieldKind <> fkData) then begin + if FieldDesc.FieldDescKind = fdkData then + Found := False + else + if not Found then + Found := AnsiLowerCase(Field.FieldName) = AnsiLowerCase(FieldDesc.ActualName); + end; + if Found then begin + Result := FieldDesc; + Break; + end; + end; + end; + // Assert(AnsiLowerCase(Field.FieldName) = AnsiLowerCase(Result.Name), Format('Field.FieldName <> FieldDesc.Name' + LineSeparator + '"%s" <> "%s"' + LineSeparator, [Field.FieldName, Result.Name])); +end; + +function TMemDataSet.GetFieldData(Field: TField; Buffer: TValueBuffer): boolean; +var + IsBlank: boolean; + RecBuf: TRecordBuffer; + FieldBuf: IntPtr; +{$IFNDEF CLR} +{$IFNDEF VER10P} + DataOffset: LongInt; +{$ENDIF} +{$ENDIF} + i: integer; + FieldDesc: TFieldDesc; +begin + Result := False; + if not GetActiveRecBuf(RecBuf) then + Exit; + + with Field do + if FieldNo > 0 then begin + Data.GetField(FieldNo, RecBuf, Buffer, IsBlank); + Result := not IsBlank; + end + else + if State in [dsBrowse, dsEdit, dsInsert, dsCalcFields, dsFilter, dsBlockRead] then + if FCreateCalcFieldDescs then begin + FieldDesc := nil; + for i := 0 to Length(FCalcFieldsMapping) - 1 do + if FCalcFieldsMapping[i].Field = Field then begin + FieldDesc := FCalcFieldsMapping[i].FieldDesc; + break; + end; + if FieldDesc <> nil then + Data.GetField(FieldDesc.FieldNo, RecBuf, Buffer, IsBlank) + else + Data.GetField(GetFieldDescNo(Field), RecBuf, Buffer, IsBlank); + Result := not IsBlank; + end + else begin + FieldBuf := IntPtr(integer(RecBuf) + RecordSize + Offset); + Result := Boolean(Marshal.ReadByte(FieldBuf)); + if Result and (Buffer <> nil) then + {$IFNDEF CLR} + {$IFNDEF VER10P} + if Field.DataType = ftWideString then begin + DataOffset := Integer(IntPtr(Integer(FieldBuf) + 1)^); + CopyBuffer(IntPtr(Integer(RecBuf) + FWideStringOfs + DataOffset), Buffer, (Size + 1) * SizeOf(WideChar)); + end + else + {$ENDIF} + {$ENDIF} + CopyBuffer(IntPtr(integer(FieldBuf) + 1), Buffer, DataSize); + end; +end; + +function TMemDataSet.GetFieldData(FieldNo: integer; Buffer: TValueBuffer): boolean; +var + IsBlank: boolean; + RecBuf: TRecordBuffer; +begin +//if BlockReadSize > 0 then + + Result := GetActiveRecBuf(RecBuf); + if Result then begin + Data.GetField(FieldNo, RecBuf, Buffer, IsBlank); + Result := not IsBlank; + end +end; + +procedure TMemDataSet.SetFieldData(Field: TField; Buffer: TValueBuffer); +var + RecBuf: TRecordBuffer; + FieldBuf: IntPtr; +{$IFNDEF CLR} +{$IFNDEF VER10P} + DataOffset, WideStringSize: integer; +{$ENDIF} +{$ENDIF} + FieldDesc: TFieldDesc; + i: integer; +begin + with Field do begin + if not (State in dsWriteModes) then + DatabaseError(SNotEditing); + GetActiveRecBuf(RecBuf); + if FieldNo > 0 then begin + if State = dsCalcFields then + DatabaseError(SNotEditing); + if ReadOnly and not (State in [dsSetKey, dsFilter]) then + DatabaseErrorFmt(SFieldReadOnly, [DisplayName]); + Validate(Buffer); + if FieldKind <> fkInternalCalc then begin + Data.PutField(FieldNo, RecBuf, Buffer); + end; + end + else + if FCreateCalcFieldDescs then begin + FieldDesc := nil; + for i := 0 to Length(FCalcFieldsMapping) - 1 do + if FCalcFieldsMapping[i].Field = Field then begin + FieldDesc := FCalcFieldsMapping[i].FieldDesc; + break; + end; + if FieldDesc <> nil then + Data.PutField(FieldDesc.FieldNo, RecBuf, Buffer) + else + Data.PutField(GetFieldDescNo(Field), RecBuf, Buffer); + end + else begin + FieldBuf := IntPtr(integer(RecBuf) + RecordSize + Offset); + Marshal.WriteByte(FieldBuf, Integer(Integer(Buffer) <> 0) ); + if Integer(Buffer) <> 0 then + {$IFNDEF CLR} + {$IFNDEF VER10P} + if Field.DataType = ftWideString then begin + WideStringSize := Length(WideString(Buffer^)) * Sizeof(WideChar); + DataOffset := Integer(IntPtr(integer(FieldBuf) + 1)^); + + CopyBuffer(Pointer(Buffer^), IntPtr(Integer(RecBuf) + FWideStringOfs + DataOffset), WideStringSize); + Marshal.WriteInt16(IntPtr(Integer(RecBuf) + FWideStringOfs + DataOffset + WideStringSize), 0); + end + else + {$ENDIF} + {$ENDIF} + CopyBuffer(Buffer, IntPtr(integer(FieldBuf) + 1), DataSize); + end; + + if not (State in [dsCalcFields, dsFilter, dsNewValue]) then + {$IFDEF CLR} + DataEvent(deFieldChange, Field); + {$ELSE} + DataEvent(deFieldChange, longint(Field)); + {$ENDIF} + end; +end; + +function TMemDataSet.GetFieldData(Field: TField; Buffer: TValueBuffer; + NativeFormat: Boolean): Boolean; +{$IFNDEF CLR} +{$IFNDEF VER10P} +var + Temp: PWideChar; +{$ENDIF} +{$ENDIF} +begin + if (Field.DataType = ftWideString) and (Buffer <> nil) then begin + {$IFDEF CLR} + Result := inherited GetFieldData(Field, Buffer, True); + {$ELSE} + {$IFDEF VER10P} + Result := inherited GetFieldData(Field, Buffer, True); + {$ELSE} + { Cannot copy direct - may be conflict with Delphi string manager + SetLength(WideString(Buffer^), Field.Size * sizeof(WideChar)); + Result := inherited GetFieldData(Field, PWideChar(WideString(Buffer^)), True);} + GetMem(Temp, (Field.Size + 1 {#0} + 8) * sizeof(WideChar));//+ 8 for numbers + try + Result := inherited GetFieldData(Field, Temp, True); + if Result then + WideString(Buffer^) := Temp + else + WideString(Buffer^) := ''; + finally + FreeMem(Temp); + end; + {$ENDIF} + {$ENDIF} + end + else + Result := inherited GetFieldData(Field, Buffer, NativeFormat); +end; + +procedure TMemDataSet.SetFieldData(Field: TField; Buffer: TValueBuffer; NativeFormat: Boolean); +begin + if Field is TWideStringField then begin + //Assert(Buffer <> nil); + inherited SetFieldData(Field, Buffer, True); + end + else + inherited SetFieldData(Field, Buffer, NativeFormat); +end; + +function TMemDataSet.GetStateFieldValue(State: TDataSetState; Field: TField): Variant; +begin + if ((Self.State = dsInsert) and (State = dsOldValue)) or (State = dsInsert) then + Result := NULL + else + Result := inherited GetStateFieldValue(State, Field); +end; + +procedure TMemDataSet.DataConvert(Field: TField; Source, Dest: TValueBuffer; ToNative: Boolean); +{$IFDEF CLR} +var + TimeStamp: TTimeStamp; + TempDouble: Double; +{$ENDIF} +begin + case Field.DataType of + {$IFDEF CLR} + ftDate: + if ToNative then + begin + TimeStamp := DateTimeToTimeStamp( + BitConverter.Int64BitsToDouble(Marshal.ReadInt64(Source))); + Marshal.WriteInt32(Dest, TimeStamp.Date); + end + else + begin + TimeStamp.Time := 0; + TimeStamp.Date := Marshal.ReadInt32(Source); + Marshal.WriteInt64(Dest, + BitConverter.DoubleToInt64Bits(MemUtils.TimeStampToDateTime(TimeStamp))); + end; + ftTime: + if ToNative then + begin + TimeStamp := DateTimeToTimeStamp( + BitConverter.Int64BitsToDouble(Marshal.ReadInt64(Source))); + Marshal.WriteInt32(Dest, TimeStamp.Time); + end + else + begin + TimeStamp.Time := Marshal.ReadInt32(Source); + TimeStamp.Date := DateDelta; + Marshal.WriteInt64(Dest, + BitConverter.DoubleToInt64Bits(MemUtils.TimeStampToDateTime(TimeStamp))); + end; + ftDateTime: + if ToNative then + begin + TempDouble := TimeStampToMSecs(DateTimeToTimeStamp( + BitConverter.Int64BitsToDouble(Marshal.ReadInt64(Source)))); + Marshal.WriteInt64(Dest, BitConverter.DoubleToInt64Bits(TempDouble)); + end + else + begin + TimeStamp := MSecsToTimeStamp( + Trunc(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(Source)))); + Marshal.WriteInt64(Dest, + BitConverter.DoubleToInt64Bits(MemUtils.TimeStampToDateTime(TimeStamp))); + end; +{$ENDIF} + ftBCD: + Marshal.WriteInt64(Dest, Marshal.ReadInt64(Source)); + else + inherited DataConvert(Field, Source, Dest, ToNative); + end; +end; + +function TMemDataSet.GetSparseArrays: boolean; +begin + Result := inherited SparseArrays; +end; + +procedure TMemDataSet.SetSparseArrays(Value: boolean); +begin + if SparseArrays <> Value then begin + UnPrepare; + + inherited SparseArrays := Value; + + if Data <> nil then + Data.SparseArrays := Value; + end; +end; + +function TMemDataSet.InternalGetBlob(FieldDesc: TFieldDesc): TBlob; +var + RecBuf: TRecordBuffer; + Ptr: IntPtr; + IsBlank: boolean; +begin + Ptr := Marshal.AllocHGlobal(sizeof(IntPtr)); + try + if GetActiveRecBuf(RecBuf) then begin + if not Data.IsBlobFieldType(FieldDesc.DataType) then + DatabaseError(SNeedBlobType); + + Data.GetField(FieldDesc.FieldNo, RecBuf, Ptr, IsBlank); + Result := TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(Ptr))); + end + else + Result := nil; + finally + Marshal.FreeHGlobal(Ptr); + end; +end; + +function TMemDataSet.GetBlob(const FieldName: string): TBlob; +var + FieldDesc: TFieldDesc; +begin + FieldDesc := Data.FieldByName(FieldName); + Result := InternalGetBlob(FieldDesc); +end; + +function TMemDataSet.GetBlob(Field: TField): TBlob; +var + FieldDesc: TFieldDesc; +begin + if Field <> nil then begin + FieldDesc := GetFieldDesc(Field); + if FieldDesc = nil then + raise Exception.Create(Format(SFieldNotFound, [Field.FieldName])); + Result := InternalGetBlob(FieldDesc); + end + else + Result := nil; +end; + +function TMemDataSet.InternalSetBlob(FieldDesc: TFieldDesc; Blob: TBlob): boolean; +var + OldBlob: TBlob; + RecBuf: TRecordBuffer; +begin + Assert(FieldDesc <> nil); + Assert(Blob <> nil); + OldBlob := InternalGetBlob(FieldDesc); + Assert(OldBlob <> nil); + Result := Blob.ClassType = OldBlob.ClassType; + if GetActiveRecBuf(RecBuf) then begin + if not Data.IsBlobFieldType(FieldDesc.DataType) then + DatabaseError(SNeedBlobType); + + Assert((Blob.RefCount = 1) and (OldBlob.RefCount = 1)); + OldBlob.Free; + Blob.AddRef; + Marshal.WriteIntPtr(RecBuf, FieldDesc.Offset, Blob.GCHandle); + end + else + Result := False; +end; + +function TMemDataSet.SetBlob(Field: TField; Blob: TBlob): boolean; +var + FieldDesc: TFieldDesc; +begin + if Field <> nil then begin + FieldDesc := GetFieldDesc(Field); + if FieldDesc = nil then + raise Exception.Create(Format(SFieldNotFound, [Field.FieldName])); + Result := InternalSetBlob(FieldDesc, Blob); + end + else + Result := False; +end; + +procedure TMemDataSet.SetNumberRange(FieldDef: TFieldDef); +var + Field: TField; + FieldDesc: TFieldDesc; +begin + if FieldDef.DataType in [ftInteger, ftFloat] then begin + Field := FindField(FieldDef.Name); + if Field <> nil then begin + CheckFieldCompatibility(Field, FieldDef); + FieldDesc := Data.FindField(FieldDef.Name); + if FieldDef.DataType = ftInteger then begin + Assert(Field is TIntegerField); + TIntegerField(Field).MaxValue := Round(IntPower(10, FieldDesc.Length)) - 1; + TIntegerField(Field).MinValue := -TIntegerField(Field).MaxValue; + end + else + if (FieldDesc.Length > 0) and (FieldDesc.Length <= 15) then begin + Assert(Field is TFloatField); + TFloatField(Field).Precision := FieldDesc.Length; + TFloatField(Field).MaxValue := + IntPower(10, FieldDesc.Length - FieldDesc.Scale) - + IntPower(10, - FieldDesc.Scale); + TFloatField(Field).MinValue := - TFloatField(Field).MaxValue; + end; + end; + end; +end; + +{function TMemDataSet.Translate(const Src: string; var Dest: string; boolean): integer; +begin + inherited Translate(Src, Dest, ToOem); + Result := StrLen(Src); +{ if ToOem then + AnsiToNativeBuf(Locale, Src, Dest, Result) + else + NativeToAnsiBuf(Locale, Src, Dest, Result); + if Src <> Dest then + Dest[Result] := #0; +end;} + +{ Buffer/Record Management } + +function TMemDataSet.AllocRecordBuffer: TRecordBuffer; +begin + Result := Marshal.AllocHGlobal(FRecBufSize); + PRecInfo(integer(Result) + FRecInfoOfs).RefComplexFields := False; +end; + +procedure TMemDataSet.FreeRecordBuffer(var Buffer: TRecordBuffer); +begin + FreeRefComplexFields(Buffer); + Marshal.FreeHGlobal(Buffer); + Buffer := nil; +end; + +procedure TMemDataSet.CopyRecordBuffer(SrcBuffer: IntPtr; DstBuffer: IntPtr); +begin + Data.FreeComplexFields(DstBuffer, False); + CopyBuffer(SrcBuffer, DstBuffer, FRecBufSize); + PRecInfo(integer(DstBuffer) + FRecInfoOfs).RefComplexFields := True; + Data.CreateComplexFields(DstBuffer, False); //copy complex fields + Data.CopyComplexFields(SrcBuffer, DstBuffer, False); +end; + +function TMemDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; + DoCheck: Boolean): TGetResult; +var +{$IFDEF CLR} + RecInfo: IntPtr; +{$ELSE} + RecInfo: PRecInfo; +{$ENDIF} +begin + FreeRefComplexFields(Buffer); + case GetMode of + gmCurrent: + Data.GetRecord(Buffer); + gmNext: + Data.GetNextRecord(Buffer); + gmPrior: + Data.GetPriorRecord(Buffer); + end; + if Data.BOF then + Result := grBOF + else + if Data.EOF then + Result := grEOF + else begin + {$IFDEF CLR} + RecInfo := IntPtr(Integer(Buffer) + FRecInfoOfs); + Marshal.WriteInt32(RecInfo, Data.RecordNo); //RecordNumber + Marshal.WriteInt16(RecInfo, sizeof(longint), (byte(bfCurrent) shl 8) or byte(Data.GetUpdateStatus)); //UpdateStatus + if FNeedAddRef then begin + Marshal.WriteByte(RecInfo, sizeof(integer) + sizeof(TUpdateStatus) + + sizeof(TBookmarkFlag), byte(True)); //RefComplexFields + Data.AddRefComplexFields(Buffer); + end; + {$ELSE} + RecInfo := PRecInfo(Integer(Buffer) + FRecInfoOfs); + RecInfo.RecordNumber := Data.RecordNo; + RecInfo.UpdateStatus := TUpdateStatus(Data.GetUpdateStatus); + RecInfo.BookmarkFlag := bfCurrent; + if FNeedAddRef then begin + RecInfo.RefComplexFields := True; + Data.AddRefComplexFields(Buffer); + end; + {$ENDIF} + + //ClearBlobCache(Buffer); + if not FCacheCalcFields then + GetCalcFields(Buffer); + //SetBookmarkFlag(Buffer, bfCurrent); + Data.GetBookmark(PRecBookmark(Integer(Buffer) + FBookmarkOfs)); + + Result := grOK; + end; +end; + +procedure TMemDataSet.InternalInitRecord(Buffer: TRecordBuffer); +begin + //FInDeferredPost := False; moved to InternalInsert + //FInInserting := True; + FreeRefComplexFields(Buffer); + Data.InitRecord(Buffer); + if Data.HasComplexFields then + Data.CreateComplexFields(Buffer, True); +end; + +procedure TMemDataSet.InitRecord(Buffer: TRecordBuffer); +var + RecInfo: PRecInfo; +begin + inherited InitRecord(Buffer); + //ClearBlobCache(Buffer); + RecInfo := PRecInfo(integer(Buffer) + FRecInfoOfs); + RecInfo.RecordNumber := 0; + RecInfo.UpdateStatus := TUpdateStatus(usInserted); + RecInfo.BookMarkFlag := bfInserted; + Data.InitRecord(FOldRecBuf); // clear OldRecBuf +end; + +function TMemDataSet.GetActiveRecBuf(var RecBuf: TRecordBuffer): boolean; +begin + case State of + dsBlockRead: + if IsEmpty then + RecBuf := nil + else + RecBuf := ActiveBuffer; + dsBrowse: + if FInCacheProcessing then + RecBuf := NewCacheRecBuf + else + if IsEmpty then + RecBuf := nil + else + RecBuf := ActiveBuffer; + dsEdit,dsInsert: + RecBuf := ActiveBuffer; + dsCalcFields: + RecBuf := CalcBuffer; + dsFilter: + RecBuf := FFilterBuffer; + dsNewValue: + if FInCacheProcessing then + RecBuf := NewCacheRecBuf + else + RecBuf := ActiveBuffer; + dsOldValue: + if FInDeferredPost then + RecBuf := OldDeferredPostBuf + else + if FInCacheProcessing then + RecBuf := OldCacheRecBuf + else + RecBuf := GetOldRecord; +// dsSetKey: RecBuf := PChar(FKeyBuffer) + SizeOf(TKeyBuffer); + else + RecBuf := nil; + end; + Result := RecBuf <> nil; +end; + +function TMemDataSet.GetOldRecord: TRecordBuffer; +begin + UpdateCursorPos; + Data.GetOldRecord(FOldRecBuf); + Result := FOldRecBuf; +end; + +procedure TMemDataSet.ClearCalcFields(Buffer: TRecordBuffer); +var + i: integer; +{$IFNDEF CLR} +{$IFNDEF VER10P} + DataOffset: integer; +{$ENDIF} +{$ENDIF} +begin + if FCreateCalcFieldDescs then begin + for i := 0 to Data.Fields.Count - 1 do + if Data.Fields[i].FieldDescKind <> fdkData then + Data.SetNull(i + 1, Buffer, True); + end + else begin + FillChar(IntPtr(integer(Buffer) + RecordSize), CalcFieldsSize, 0); + + {$IFNDEF CLR} + {$IFNDEF VER10P} + DataOffset := 0; + for i := 0 to Fields.Count - 1 do + if (Fields[i].DataType = ftWideString) and (Fields[i].FieldKind in [fkCalculated, fkLookUp]) then begin + Marshal.WriteInt32(Pointer(Integer(Buffer) + RecordSize + Fields[i].Offset + 1), DataOffset); + DataOffset := DataOffset + (Fields[i].Size + 1) * sizeof(WideChar); + end; + FillChar(IntPtr(integer(Buffer) + FWideStringOfs), DataOffset, 0); + {$ENDIF} + {$ENDIF} + end; +end; + +// WAR don't support BlockRead + +procedure TMemDataSet.SetBlockReadSize(Value: Integer); +begin + if Value <> BlockReadSize then + if (Value > 0) or (Value < -1) then begin + UpdateCursorPos; + inherited; + end + else + inherited; +end; + +procedure TMemDataSet.BlockReadNext; +begin + inherited; +end; + +{ Bookmarks } + +function TMemDataSet.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; +begin + Result := PRecInfo(integer(Buffer) + FRecInfoOfs).BookmarkFlag; +end; + +procedure TMemDataSet.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); +begin + PRecInfo(integer(Buffer) + FRecInfoOfs).BookmarkFlag := Value +end; + +// Data - pointer to bookmark +procedure TMemDataSet.GetBookmarkData(Buffer: TRecordBuffer; + {$IFDEF CLR}var{$ENDIF} Bookmark: TBookmark); +begin + CopyBuffer(IntPtr(integer(Buffer) + FBookmarkOfs), Bookmark, BookmarkSize); +end; + +procedure TMemDataSet.SetBookmarkData(Buffer: TRecordBuffer; + {$IFDEF CLR}const{$ENDIF} Bookmark: TBookmark); +begin + CopyBuffer(Bookmark, IntPtr(integer(Buffer) + FBookmarkOfs), BookmarkSize); +end; + +procedure TMemDataSet.InternalGotoBookmark({$IFDEF CLR}const{$ENDIF} Bookmark: TBookmark); +begin + Data.SetToBookMark(PRecBookmark(Bookmark)); +end; + +{function TMemDataSet.GetBookmarkStr: TBookmarkStr; +begin + if State in [dsFilter] then begin + SetLength(Result, BookmarkSize); + Data.GetBookmark(Pointer(Result)); + end + else + Result := inherited GetBookmarkStr; +end;} + +function ChangeDecimalSeparator(const Value: string; OldSeparator, NewSeparator: string): string; +begin + if OldSeparator <> NewSeparator then + Result := StringReplace(Value, OldSeparator, NewSeparator, [rfReplaceAll]) + else + Result := Value; +end; + +function XMLEncode(const AStr: String): String; +var + sb: StringBuilder; +begin + sb := StringBuilder.Create(AStr, Length(AStr)); + try + sb.Replace('&', '&'); + sb.Replace('''', '''); + sb.Replace('"', '"'); + sb.Replace('<', '<'); + sb.Replace('>', '>'); + Result := sb.ToString; + finally + sb.Free; + end; +end; + +procedure TMemDataSet.SaveToXML(const FileName: string); +var + FileStream: TFileStream; +begin + FileStream := TFileStream.Create(FileName, fmCreate); + try + SaveToXML(FileStream); + finally + FileStream.Free; + end; +end; + +procedure TMemDataSet.SaveToXML(Destination: TStream); +var + FieldAliases: TStringList; + + function IsValidFieldName(const FldName: string): boolean; + var + i: integer; + ch: char; + begin + for i := 1 to Length(FldName) do begin + ch := FldName[i]; + if not ((ch = '_') or (ch >= 'A') and (ch <= 'Z') or (ch >= 'a') and (ch <= 'z') or + (i > 1) and (ch >= '0') and (ch <= '9')) + then begin + Result := False; + Exit; + end; + end; + Result := True; + end; + + function FindFieldAlias(FldName: string): string; + var + i, p: integer; + Attr: string; + ActualName: string; + begin + Result := ''; + if FieldAliases <> nil then + for i := 0 to FieldAliases.Count - 1 do begin + Attr := FieldAliases[i]; + p := Pos('''=c', Attr); + Assert(p <> 0); + ActualName := Copy(Attr, 2, p - 2); + if ActualName = FldName then begin + Result := Copy(Attr, p + 2, Length(Attr) - p - 1); + Break; + end; + end; + end; + +var + OldActive: boolean; + Bookmark: DB.TBookmark; + DestWriter: StreamWriter; + XMLWriter: XmlTextWriter; + XML: string; + FldName, FldAlias: string; + i: integer; + FieldDesc: TFieldDesc; +{$IFDEF VER8} + DestStream: Stream; +{$ENDIF} +begin + OldActive := Active; + Bookmark := nil; + FieldAliases := nil; + DestWriter := nil; + XmlWriter := nil; +{$IFDEF VER8} + DestStream := nil; +{$ENDIF} + try + DisableControls; + Active := True; + {$IFDEF CLR} + {$IFDEF VER9P} + {$DEFINE OWNGETBOOKMARK} + {$ENDIF} + {$ENDIF} + {$IFDEF OWNGETBOOKMARK} + if BookmarkAvailable then + begin + Bookmark := Marshal.AllocHGlobal(BookmarkSize); + GetBookmarkData(ActiveBuffer, Bookmark); + end else + Bookmark := nil; + {$ELSE} + Bookmark := GetBookmark; + {$ENDIF} + + FieldAliases := TStringList.Create; + + {$IFDEF VER8} + DestStream := TStreamToCLRStream.GetStream(Destination); + {$ENDIF} + DestWriter := StreamWriter.Create({$IFDEF VER8}DestStream{$ELSE}Destination{$ENDIF}, Encoding.Default); + XmlWriter := XmlTextWriter.Create(DestWriter); + + XmlWriter.QuoteChar := ''''; + XmlWriter.Formatting := fmtIndented; + XmlWriter.Indentation := 2; + XmlWriter.IndentChar := ' '; + + // Header + XmlWriter.WriteStartElement('xml'); + + XmlWriter.WriteAttributeString('xmlns:s', 'uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'); + XmlWriter.WriteAttributeString('xmlns:dt', 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'); + XmlWriter.WriteAttributeString('xmlns:rs', 'urn:schemas-microsoft-com:rowset'); + XmlWriter.WriteAttributeString('xmlns:z', '#RowsetSchema'); + + // Fields + XmlWriter.WriteStartElement('s:Schema'); + XmlWriter.WriteAttributeString('id', 'RowsetSchema'); + + XmlWriter.WriteStartElement('s:ElementType'); + XmlWriter.WriteAttributeString('name', 'row'); + XmlWriter.WriteAttributeString('content', 'eltOnly'); + XmlWriter.WriteAttributeString('rs:updatable', 'true'); + + for i := 0 to Fields.Count - 1 do + if not (Fields[i].FieldKind in [fkCalculated, fkLookup]) then begin + FieldDesc := GetFieldDesc(Fields[i]); + if FieldDesc <> nil then begin + FldName := FieldDesc.Name; + if not IsValidFieldName(FldName) then begin + FldAlias := 'c' + IntToStr(FieldAliases.Count + 1); + FieldAliases.Add(QuotedStr({$IFNDEF CLR}XMLEncode{$ENDIF}(UTF8Encode(FldName))) + '=' + FldAlias); + end + else + FldAlias := ''; + XmlWriter.WriteStartElement('s:AttributeType'); + WriteFieldXMLAttributeType(Fields[i], FieldDesc, FldAlias, XmlWriter); + XmlWriter.WriteStartElement('s:datatype'); + WriteFieldXMLDataType(Fields[i], FieldDesc, FldAlias, XmlWriter); + XmlWriter.WriteEndElement; // s:datatype + XmlWriter.WriteFullEndElement; // s:AttributeType + end; + end; + + XmlWriter.WriteStartElement('s:extends'); + XmlWriter.WriteAttributeString('type', 'rs:rowbase'); + XmlWriter.WriteEndElement; // s:extends + XmlWriter.WriteFullEndElement; // s:ElementType + XmlWriter.WriteFullEndElement; // s:Schema + + // Data + XmlWriter.WriteStartElement('rs:data'); + + First; + while not EOF do begin + XmlWriter.WriteStartElement('z:row'); + for i := 0 to Fields.Count - 1 do + if not (Fields[i].FieldKind in [fkCalculated, fkLookup]) then begin + if not Fields[i].IsNull then begin + XML := GetFieldXMLValue(Fields[i], GetFieldDesc(Fields[i])); + FldName := {$IFNDEF CLR}XMLEncode{$ENDIF}(UTF8Encode(Fields[i].FieldName)); + if not IsValidFieldName(FldName) then + FldName := FindFieldAlias(FldName); + XmlWriter.WriteAttributeString(FldName, XML); + end; + end; + XmlWriter.WriteEndElement; + Next; + end; + + XmlWriter.WriteFullEndElement; // rs:data + XmlWriter.WriteFullEndElement; // xml + + XmlWriter.Close; + finally + Active := OldActive; + if OldActive and (Bookmark <> nil) then + GotoBookmark(Bookmark); + if Bookmark <> nil then + {$IFDEF OWNGETBOOKMARK} + Marshal.FreeHGlobal(Bookmark); + {$ELSE} + FreeBookmark(Bookmark); + {$ENDIF} + FieldAliases.Free; + XmlWriter.Free; + DestWriter.Free; + {$IFDEF VER8} + DestStream.Free; + {$ENDIF} + + EnableControls; + end; +end; + +procedure TMemDataSet.WriteFieldXMLDataType(Field: TField; FieldDesc: TFieldDesc; + const FieldAlias: string; XmlWriter: XMLTextWriter); +begin + case FieldDesc.DataType of + dtInt64: begin + XmlWriter.WriteAttributeString('dt:type', 'i8'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:precision', '19'); + end; + dtBlob, dtBytes, dtVarBytes, dtExtVarBytes: begin + XmlWriter.WriteAttributeString('dt:type', 'bin.hex'); + if (FieldDesc.DataType = dtBlob) then + XmlWriter.WriteAttributeString('dt:maxLength', '2147483647') + else + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Length)); + if Field.IsBlob and not FieldDesc.Fixed then + XmlWriter.WriteAttributeString('rs:long', 'true'); + end; + dtBoolean: begin + XmlWriter.WriteAttributeString('dt:type', 'boolean'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + end; + dtString, dtExtString, dtMemo, dtWideString, dtExtWideString, dtWideMemo: begin + XmlWriter.WriteAttributeString('dt:type', 'string'); + if FieldDesc.DataType in [dtMemo, dtWideMemo] then + XmlWriter.WriteAttributeString('dt:maxLength', '2147483647') + else + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Length)); + if not (FieldDesc.DataType in [dtWideString, dtExtWideString, dtWideMemo]) then + XmlWriter.WriteAttributeString('rs:dbtype', 'str'); + if Field.IsBlob and not FieldDesc.Fixed then + XmlWriter.WriteAttributeString('rs:long', 'true'); + end; + dtCurrency, dtBCD: begin + XmlWriter.WriteAttributeString('dt:type', 'number'); + XmlWriter.WriteAttributeString('rs:dbtype', 'currency'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:precision', IntToStr(FieldDesc.Length)); + end; + dtDateTime: begin + XmlWriter.WriteAttributeString('dt:type', 'datetime'); + XmlWriter.WriteAttributeString('rs:dbtype', 'variantdate'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:scale', IntToStr(FieldDesc.Scale)); + XmlWriter.WriteAttributeString('rs:precision', IntToStr(FieldDesc.Length)); + end; + dtDate: begin + XmlWriter.WriteAttributeString('dt:type', 'date'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:scale', IntToStr(FieldDesc.Scale)); + XmlWriter.WriteAttributeString('rs:precision', IntToStr(FieldDesc.Length)); + end; + dtTime: begin + XmlWriter.WriteAttributeString('dt:type', 'time'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:scale', IntToStr(FieldDesc.Scale)); + XmlWriter.WriteAttributeString('rs:precision', IntToStr(FieldDesc.Length)); + end; + dtFloat: begin + if FieldDesc.Length <= 7 then begin + XmlWriter.WriteAttributeString('dt:type', 'r4'); + XmlWriter.WriteAttributeString('dt:maxLength', '4'); + end + else begin + XmlWriter.WriteAttributeString('dt:type', 'float'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + end; + XmlWriter.WriteAttributeString('rs:precision', IntToStr(FieldDesc.Length)); + end; + {$IFDEF VER5P} + dtGuid: begin + XmlWriter.WriteAttributeString('dt:type', 'uuid'); + XmlWriter.WriteAttributeString('dt:maxLength', '16'); + end; + {$ENDIF} + dtInt32: begin + XmlWriter.WriteAttributeString('dt:type', 'int'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:precision', '10'); + end; + {$IFDEF VER6P} + dtFmtBCD: begin + XmlWriter.WriteAttributeString('dt:type', 'number'); + XmlWriter.WriteAttributeString('rs:dbtype', 'numeric'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:scale', IntToStr(FieldDesc.Scale)); + XmlWriter.WriteAttributeString('rs:precision', IntToStr(FieldDesc.Length)); + end; + {$ENDIF} + dtInt16: begin + XmlWriter.WriteAttributeString('dt:type', 'i2'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:precision', '5'); + end; + dtInt8: begin + XmlWriter.WriteAttributeString('dt:type', 'i1'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:precision', IntToStr(FieldDesc.Length)); + end; + dtLongword: begin + XmlWriter.WriteAttributeString('dt:type', 'ui4'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:precision', IntToStr(FieldDesc.Length)); + end; + dtWord: begin + XmlWriter.WriteAttributeString('dt:type', 'ui2'); + XmlWriter.WriteAttributeString('dt:maxLength', IntToStr(FieldDesc.Size)); + XmlWriter.WriteAttributeString('rs:precision', IntToStr(FieldDesc.Length)); + end; + dtUnknown{$IFDEF VER5P}, dtVariant{$ENDIF}: + XmlWriter.WriteAttributeString('dt:type', 'string') + else + DatabaseError(SDataTypeNotSupported, Self); + end; + + if FieldDesc.Fixed and not (FieldDesc.DataType in [dtUnknown{$IFDEF VER5P}, dtVariant{$ENDIF}]) then + XmlWriter.WriteAttributeString('rs:fixedlength', 'true'); + + if Field.Required and not Field.ReadOnly then + XmlWriter.WriteAttributeString('rs:maybenull', 'false'); +end; + +procedure TMemDataSet.WriteFieldXMLAttributeType(Field: TField; FieldDesc: TFieldDesc; + const FieldAlias: string; XmlWriter: XMLTextWriter); +begin + if FieldAlias = '' then + XmlWriter.WriteAttributeString('name', {$IFNDEF CLR}XMLEncode{$ENDIF}(UTF8Encode(FieldDesc.Name))) + else begin + XmlWriter.WriteAttributeString('name', FieldAlias); + XmlWriter.WriteAttributeString('rs:name', {$IFNDEF CLR}XMLEncode{$ENDIF}(UTF8Encode(FieldDesc.Name))); + end; + + XmlWriter.WriteAttributeString('rs:number', IntToStr(FieldDesc.FieldNo)); + if not Field.Required and not Field.ReadOnly then /// Can't use FieldDesc.Required, see "Required and FLocalConstraints" line in TMemDataSet.CreateFieldDefs for details + XmlWriter.WriteAttributeString('rs:nullable', 'true'); + if not Field.ReadOnly then + XmlWriter.WriteAttributeString('rs:writeunknown', 'true'); + // XmlWriter.WriteAttributeString('rs:basecatalog', ''); + + if FieldDesc.ActualName <> '' then + XmlWriter.WriteAttributeString('rs:basecolumn', {$IFNDEF CLR}XMLEncode{$ENDIF}(UTF8Encode(FieldDesc.ActualName))); + if FieldDesc.IsKey then + XmlWriter.WriteAttributeString('rs:keycolumn', 'true'); + if Field.AutoGenerateValue = arAutoInc then + XmlWriter.WriteAttributeString('rs:autoincrement', 'true'); +end; + +function TMemDataSet.GetFieldXMLValue(Field: TField; FieldDesc: TFieldDesc): string; +var + Buffer: TBytes; + Blob: TBlob; + Piece: PPieceHeader; +{$IFDEF CLR} + sb: StringBuilder; + Bytes: TBytes; +{$ELSE} + sbOffset: integer; +{$ENDIF} + + function EncodeXMLDateTime(Value: TDateTime): string; + var + Year, Month, Day, Hour, Minute, Second, MilliSecond: Word; + begin + DecodeDateTime(Value, Year, Month, Day, Hour, Minute, Second, MilliSecond); + Result := StringReplace(Format('%4d%s%2d%s%2d', [Year, '-', Month, '-', Day]), + ' ', '0', [rfReplaceAll]); + Result := Result + 'T'; + Result := StringReplace(Result + Format('%2d%s%2d%s%2d', [Hour, ':', Minute, ':', Second]), + ' ', '0', [rfReplaceAll]); + end; + + function EncodeXMLTime(Value: TDateTime): string; + var + Hour, Minute, Second, MilliSecond: Word; + begin + DecodeTime(Value, Hour, Minute, Second, MilliSecond); + Result := StringReplace(Format('%2d%s%2d%s%2d', [Hour, ':', Minute, ':', Second]), + ' ', '0', [rfReplaceAll]); + end; + +begin + Result := ''; + SetLength(Buffer, 0); + case FieldDesc.DataType of + dtBoolean: + Result := BoolToStr(Field.AsBoolean, True); + dtInt8, dtInt16, dtInt32, dtUInt16, dtUInt32, dtInt64: + Result := Field.AsString; + dtFloat: + Result := ChangeDecimalSeparator(FloatToStr(Field.AsFloat), DecimalSeparator, '.'); + dtCurrency, dtBcd: + Result := ChangeDecimalSeparator(CurrToStr(Field.Value), DecimalSeparator, '.'); + dtDate, dtDateTime: + Result := EncodeXMLDateTime(Field.AsDateTime); + dtTime: + Result := EncodeXMLTime(Field.AsDateTime); + {$IFDEF VER6P} + dtFmtBCD: + Result := BcdToStr(Field.AsBCD); + {$ENDIF} + dtBytes, dtVarBytes, dtExtVarBytes: begin + Buffer := Field.Value; + SetLength(Result, Length(Buffer) * 2); + {$IFDEF CLR} + Bytes := Encoding.Default.GetBytes(Result); + BinToHex(Buffer, 0, Bytes, 0, Length(Buffer)); + Result := Encoding.Default.GetString(Bytes); + {$ELSE} + BinToHex(@Buffer[0], PChar(Result), Length(Buffer)); + {$ENDIF} + end; + dtBlob: begin + Blob := InternalGetBlob(FieldDesc); + SetLength(Result, Integer(Blob.Size) * 2); + Piece := Blob.FirstPiece; + {$IFDEF CLR} + sb := StringBuilder.Create; + try + while IntPtr(Piece) <> nil do begin + SetLength(Buffer, Piece.Used); + Marshal.Copy(IntPtr(Integer(Piece) + sizeof(TPieceHeader)), Buffer, 0, Piece.Used); + SetLength(Bytes, Length(Buffer) * 2); + BinToHex(Buffer, 0, Bytes, 0, Length(Buffer)); + sb.Append(Encoding.Default.GetString(Bytes)); + Piece := Piece.Next; + end; + Result := sb.ToString; + finally + sb.Free; + end; + {$ELSE} + sbOffset := 0; + while Piece <> nil do begin + BinToHex(IntPtr(Integer(Piece) + sizeof(TPieceHeader)), + IntPtr(Integer(Result) + sbOffset), Piece.Used); + sbOffset := sbOffset + Integer(Piece.Used); + Piece := Piece.Next; + end; + {$ENDIF} + end; + else + Result := Field.AsString; + end; + Result := {$IFNDEF CLR}XMLEncode{$ENDIF}(UTF8Encode(Result)); +end; + +{$IFDEF CLR} // TDataSet bug +var + NativeDBBuffers: TDBBufferList; + +function NativeBuffers: TDBBufferList; +begin + if NativeDBBuffers <> nil then + Result := NativeDBBuffers + else + begin + Result := TDBBufferList.Create; + NativeDBBuffers := Result; // fix d9 bug + end; +end; + +function TMemDataSet.GetBookmark: TBookmark; +begin + if BookmarkAvailable then + begin + Result := NativeBuffers.AllocHGlobal(BookmarkSize); + GetBookmarkData(ActiveBuffer, Result); + end else + Result := nil; +end; + +procedure TMemDataSet.FreeBookmark(var Bookmark: TBookmark); +begin + NativeBuffers.FreeHGlobal(Bookmark); +end; +{$ENDIF} + +function TMemDataSet.BookmarkValid({$IFDEF CLR}const{$ENDIF} Bookmark: TBookmark): boolean; +begin + Result := Data.BookmarkValid(PRecBookmark(Bookmark)); +end; + +function TMemDataSet.CompareBookmarks({$IFDEF CLR}const{$ENDIF} Bookmark1, Bookmark2: TBookmark): integer; +begin + Result := Data.CompareBookmarks(PRecBookmark(Bookmark1), PRecBookmark(Bookmark2)); +end; + +{ Navigation } + +procedure TMemDataSet.InternalSetToRecord(Buffer: TRecordBuffer); +begin + InternalGotoBookmark(IntPtr(integer(Buffer) + FBookmarkOfs)); +end; + +procedure TMemDataSet.SetIndexFieldNames(Value: string); +begin + if Active then + CheckBrowseMode; + TMemData(Data).SetIndexFieldNames(Value); + if Active and (TMemData(Data).IndexFields.Count > 0) then + Resync([]); + FIndexFieldNames := Value; +end; + +procedure TMemDataSet.InternalFirst; +begin + Data.SetToBegin; +end; + +procedure TMemDataSet.InternalLast; +begin + Data.SetToEnd; +end; + +{ Editing } + +procedure TMemDataSet.InternalAddRecord(Buffer: IntPtr; Append: Boolean); +begin + if Append then + Data.AppendRecord(Buffer) + else + Data.InsertRecord(Buffer); +end; + +procedure TMemDataSet.InternalInsert; +begin + FInDeferredPost := False; + if OldDeferredPostBuf <> nil then begin + FreeRefComplexFields(OldDeferredPostBuf, False); + Marshal.FreeHGlobal(OldDeferredPostBuf); + OldDeferredPostBuf := nil; + end; + FInInserting := True; +end; + +procedure TMemDataSet.InternalEdit; +begin + FInDeferredPost := False; + if OldDeferredPostBuf <> nil then begin + FreeRefComplexFields(OldDeferredPostBuf, False); + Marshal.FreeHGlobal(OldDeferredPostBuf); + OldDeferredPostBuf := nil; + end; + FInEditing := True; + + FreeRefComplexFields(ActiveBuffer); + Data.EditRecord(ActiveBuffer); +end; + +procedure TMemDataSet.InternalDelete; +begin + if not CanModify then DatabaseError(SDataSetReadOnly, Self); + Data.DeleteRecord; + + // CR M8107 + FInInserting := False; + FInEditing := False; +end; + +procedure TMemDataSet.InternalPost; +var + i: integer; + Blob: TBlob; + Field: TField; + FieldDesc: TFieldDesc; +begin +{$IFDEF VER6P} + inherited; +{$ENDIF} + + for i := 0 to FieldCount - 1 do begin + Field := Fields[i]; + FieldDesc := GetFieldDesc(Field); + if (FieldDesc <> nil) and Data.IsBlobFieldType(FieldDesc.DataType) then begin + Blob := Data.GetObject(FieldDesc.FieldNo, ActiveBuffer) as TBlob; + if Blob.Modified then + TBlobField(Field).Modified := True; + end; + end; + if State = dsEdit then begin + Data.PostRecord(ActiveBuffer); + end + else + Data.InsertRecord(ActiveBuffer); + + FInDeferredPost := False; + if OldDeferredPostBuf <> nil then begin + FreeRefComplexFields(OldDeferredPostBuf, False); + Marshal.FreeHGlobal(OldDeferredPostBuf); + OldDeferredPostBuf := nil; + end; + FInInserting := False; + FInEditing := False; +end; + +procedure TMemDataSet.Cancel; +var + CancelBuf : IntPtr; +begin + if ((State = dsEdit) or (State = dsInsert)) and (Data.HasComplexFields) then begin + CancelBuf := AllocRecordBuffer; + CopyBuffer(ActiveBuffer, CancelBuf, FRecBufSize); + Data.AddRefComplexFields(CancelBuf); + end + else + CancelBuf := nil; + try +{$IFDEF D3} + if State = dsInsert then + if Data.HasComplexFields then + Data.FreeComplexFields(ActiveBuffer, True); +{$ENDIF} + + + inherited; + finally + if CancelBuf <> nil then begin + Data.FreeComplexFields(CancelBuf, True); + Marshal.FreeHGlobal(CancelBuf); + end; + end; +end; + + +procedure TMemDataSet.InternalCancel; +begin + FInDeferredPost := False; + if OldDeferredPostBuf <> nil then begin + FreeRefComplexFields(OldDeferredPostBuf, False); + Marshal.FreeHGlobal(OldDeferredPostBuf); + OldDeferredPostBuf := nil; + end; + FInInserting := False; + FInEditing := False; + + if State = dsEdit then + Data.CancelRecord(ActiveBuffer); +{$IFNDEF D3} + if State = dsInsert then + if Data.HasComplexFields then + Data.FreeComplexFields(ActiveBuffer, True); +{$ENDIF} +end; + +procedure TMemDataSet.InternalDeferredPost; +begin + if State = dsEdit then + DoPerformUpdate + else + DoPerformAppend; +end; + +procedure TMemDataSet.DeferredPost; + procedure CheckRequiredFields; + var + I: Integer; + begin + for I := 0 to Fields.Count - 1 do + with Fields[I] do + if Required and not ReadOnly and (FieldKind = fkData) and IsNull then + begin + FocusControl; + DatabaseErrorFmt(SFieldRequired, [DisplayName]); + end; + end; +begin + if not CachedUpdates then begin + UpdateRecord; + case State of + dsEdit, dsInsert: + begin + {$IFDEF CLR} + DataEvent(deCheckBrowseMode, nil); + {$ELSE} + DataEvent(deCheckBrowseMode, 0); + {$ENDIF} + CheckRequiredFields; + UpdateCursorPos; + + InternalDeferredPost; + + if OldDeferredPostBuf = nil then begin + OldDeferredPostBuf := AllocRecordBuffer; + Data.CreateComplexFields(OldDeferredPostBuf, False); + PRecInfo(Integer(OldDeferredPostBuf) + FRecInfoOfs).RefComplexFields := True;//own complex fields + end; + CopyRecordBuffer(ActiveBuffer, OldDeferredPostBuf); + FInDeferredPost := True; + end; + end; + end; +end; + +procedure TMemDataSet.SetDefaultExpressionValue(Field: TField); +begin + Field.AsString := Field.DefaultExpression; +end; + +procedure TMemDataSet.DoOnNewRecord; +var + i: integer; +begin + for i := 0 to FieldCount - 1 do + if Fields[i].DefaultExpression <> '' then + SetDefaultExpressionValue(Fields[i]); + try + inherited; + except + InternalCancel; + raise; + end; +end; + +function TMemDataSet.PerformAppend: boolean; +begin + Result := False; +end; + +function TMemDataSet.PerformDelete: boolean; +begin + Result := False; +end; + +function TMemDataSet.PerformUpdate: boolean; +begin + Result := False; +end; + +procedure TMemDataSet.DoPerformAppend; +var + OldModified: boolean; +begin + OldModified := Modified; + try + if not FLocalUpdate then + if not FInDeferredPost then // WAR supports defer posting + PerformAppend + else + DoPerformUpdate; + finally + SetModified(OldModified); + end; +end; + +procedure TMemDataSet.DoPerformDelete; +var + OldModified: boolean; +begin + OldModified := Modified; + try + if not FLocalUpdate then + PerformDelete + finally + SetModified(OldModified); + end; +end; + +procedure TMemDataSet.DoPerformUpdate; +var + OldModified: boolean; +begin + OldModified := Modified; + try + if not FLocalUpdate then + PerformUpdate + finally + SetModified(OldModified); + end; +end; + +{ Filter / Locate / Find } +procedure TMemDataSet.DoGetCachedFields; +var + i: Integer; + FieldDesc: TFieldDesc; + CalcFieldCount: integer; +begin + CalcFieldCount := 0; + if not DefaultFields then begin + for i := 0 to Fields.Count - 1 do + case Fields[i].FieldKind of + fkCalculated, fkLookup: begin + FieldDesc := Data.GetFieldDescType.Create; + try + FieldDesc.ActualName := Fields[i].FullName; + FieldDesc.Name := Fields[i].FullName; + FieldDesc.FieldNo := Data.FieldCount + 1; + FieldDesc.DataType := GetDataType(Fields[i].DataType); + case Fields[i].DataType of + ftWideString: + FieldDesc.Size := (Fields[i].Size + 1) * SizeOf(WideChar); + ftDate, ftTime: + FieldDesc.Size := Fields[i].DataSize * 2; + else + FieldDesc.Size := Fields[i].DataSize; + end; + FieldDesc.Length := Fields[i].Size; + if FCacheCalcFields then + FieldDesc.FieldDescKind := fdkCached + else + FieldDesc.FieldDescKind := fdkCalculated; + + // FieldDescs with CachedField=True must be positioned after data FieldDescs + Data.Fields.Add(FieldDesc); + Inc(CalcFieldCount); + SetLength(FCalcFieldsMapping, CalcFieldCount); + FCalcFieldsMapping[CalcFieldCount - 1].Field := Fields[i]; + FCalcFieldsMapping[CalcFieldCount - 1].FieldDesc := FieldDesc; + except + FieldDesc.Free; + raise; + end; + end; + end; + end; +end; + +procedure TMemDataSet.DoGetCachedBuffer(Buffer: IntPtr; Source: IntPtr = nil); +var + RecBuf: IntPtr; +begin + if (CalcFieldsSize > 0) then begin + RecBuf := Marshal.AllocHGlobal(Data.RecordSize + Data.CalcRecordSize + SizeOf(TRecInfo) + BookmarkSize); + try + if Source = nil then + CopyBuffer(Buffer, RecBuf, Data.RecordSize) + else + CopyBuffer(Source, RecBuf, Data.RecordSize); + + GetCalcFields(RecBuf); + CopyBuffer(RecBuf, Buffer, Data.RecordSize + Data.CalcRecordSize); + finally + Marshal.FreeHGlobal(RecBuf); + end; + end; +end; + +procedure TMemDataSet.ActivateFilters; +begin + DeactivateFilters; + + if Assigned(OnFilterRecord) then + Data.FilterFunc := RecordFilter; + if Trim(Filter) <> '' then + Data.FilterText := Filter; +end; + +procedure TMemDataSet.DeactivateFilters; +begin + Data.FilterFunc := nil; + Data.FilterText := ''; +end; + +function TMemDataSet.RecordFilter(RecBuf: IntPtr): boolean; +var + Accept: boolean; + SaveState: TDataSetState; +begin + SaveState := SetTempState(dsFilter); + FFilterBuffer := RecBuf; + try + Accept := True; + OnFilterRecord(Self, Accept); + except + InternalHandleException; + end; + RestoreState(SaveState); + Result := Accept; +end; + +procedure TMemDataSet.SetFiltered(Value: boolean); +begin + if Active then begin + CheckBrowseMode; + UpdateCursorPos; + end; + + if Value <> Filtered then begin + if Value then + ActivateFilters + else + DeactivateFilters; + + inherited SetFiltered(Value); + + if Active then begin + Data.FilterUpdated; + Resync([]); + First; + //DoAfterScroll; + end; + end; +end; + +procedure TMemDataSet.SetFilterData(const Text: string; Options: TFilterOptions); +begin + if Active then begin + CheckBrowseMode; + UpdateCursorPos; + end; + + if (Text <> Filter) or (Options <> FilterOptions) then begin + Data.FilterCaseInsensitive := foCaseInsensitive in Options; + Data.FilterNoPartialCompare := foNoPartialCompare in Options; + + if Filtered and (Trim(Text) <> '') then + Data.FilterText := Text + else + Data.FilterText := ''; + + inherited SetFilterText(Text); + inherited SetFilterOptions(Options); + + if Active and Filtered then begin + Data.FilterUpdated; + Resync([]); + First; + //DoAfterScroll; + end; + end; +end; + +procedure TMemDataSet.SetFilterOptions(Value: TFilterOptions); +begin + SetFilterData(Filter, Value); +end; + +procedure TMemDataSet.SetFilterText(const Value: string); +begin + SetFilterData(Value, FilterOptions); +end; + +procedure TMemDataSet.SetOnFilterRecord(const Value: TFilterRecordEvent); +begin + if Active then begin + CheckBrowseMode; + UpdateCursorPos; + end; + + inherited SetOnFilterRecord(Value); + + if Filtered and Assigned(OnFilterRecord) then + Data.FilterFunc := RecordFilter + else + Data.FilterFunc := nil; + + if Active then begin + Data.FilterUpdated; + Resync([]); + First; + end; +end; + +function TMemDataSet.FindRecord(Restart, GoForward: boolean): boolean; +begin + CheckBrowseMode; + DoBeforeScroll; + SetFound(False); + UpdateCursorPos; + CursorPosChanged; + if not Filtered then + ActivateFilters; + try + if GoForward then begin + if Restart then + Data.SetToBegin; + Data.GetNextRecord(nil); + end + else begin + if Restart then + Data.SetToEnd; + Data.GetPriorRecord(nil); + end; + finally + if not Filtered then + DeactivateFilters; + end; + + if not Data.BOF and not Data.EOF then begin + Resync([rmExact, rmCenter]); + SetFound(True); + end; + Result := Found; + if Result then + DoAfterScroll; +end; + +// Allocate memory for Value (ValuePtr - must call FreeMem!) and copy Value to ValuePtr +procedure TMemDataSet.CopyFieldValue(const Value: variant; out ValuePtr: IntPtr; + out ValueType: integer; FieldDesc: TFieldDesc); // Allocate memory for Value (ValuePtr - must call FreeMem!) and copy Value to ValuePtr +var + BoolValue: boolean; + s: string; + l: integer; + Temp: IntPtr; + ws: WideString; +{$IFDEF CLR} + Data: TBytes; +{$ENDIF} +{$IFDEF VER6P} + i64: Int64; + bcd: TBcd; +{$ENDIF} +begin + case VarType(Value) of + varEmpty,varNull: + ValuePtr := nil; + varString{$IFDEF CLR}, varChar{$ELSE}, varOleStr{$ENDIF}: + case FieldDesc.DataType of + dtBoolean: begin + BoolValue := Value; + ValuePtr := Marshal.AllocHGlobal(SizeOf(Boolean)); + Marshal.WriteByte(ValuePtr, integer(BoolValue)); + ValueType := dtBoolean; + end; + dtBytes, dtVarBytes, dtExtVarBytes: begin + s := Value; + l := Length(s); + ValuePtr := Marshal.AllocHGlobal(l + SizeOf(Word)); + + Temp := Marshal.StringToHGlobalAnsi(s); + try + CopyBuffer(Temp, IntPtr(integer(ValuePtr) + SizeOf(Word)), l); + finally + Marshal.FreeCoTaskMem(Temp); + end; + Marshal.WriteInt16(ValuePtr, l); + ValueType := FieldDesc.DataType; + end; + dtWideString: + begin + ws := Value; + l := (Length(ws) + 1) * SizeOf(WideChar); + ValuePtr := Marshal.AllocHGlobal(l); + CopyBufferUni(ws, ValuePtr, l); + ValueType := dtWideString; + end; + else + begin + s := Value; + l := Length(s) + 1; + ValuePtr := Marshal.AllocHGlobal(l); + CopyBufferAnsi(s, ValuePtr, l); + ValueType := dtString; + end; + end; + else + ValueType := FieldDesc.DataType; + case ValueType of + dtInt32, dtInt8, dtInt16, dtUInt16: begin + ValuePtr := Marshal.AllocHGlobal(SizeOf(integer)); + Marshal.WriteInt32(ValuePtr, Value); + end; + dtUInt32: begin + ValuePtr := Marshal.AllocHGlobal(SizeOf(longword)); + Marshal.WriteInt32(ValuePtr, Value); + end; + dtBoolean: begin + ValuePtr := Marshal.AllocHGlobal(SizeOf(Boolean)); + Marshal.WriteByte(ValuePtr, Integer(Boolean(Value))); + end; + dtInt64: begin + {$IFDEF VER6P} + ValuePtr := Marshal.AllocHGlobal(SizeOf(Int64)); + i64 := Value; + Marshal.WriteInt64(ValuePtr, i64); + {$ELSE} + GetMem(ValuePtr, SizeOf(Int64)); + if TVarData(Value).VType = varDecimal then + Int64(ValuePtr^) := TVarDataD6(Value).VInt64 + else + Int64(ValuePtr^) := StrToInt64(Value); + {$ENDIF} + end; + dtFloat, dtCurrency: begin + ValuePtr := Marshal.AllocHGlobal(SizeOf(Int64)); + Marshal.WriteInt64(ValuePtr, BitConverter.DoubleToInt64Bits(Value)); + end; + dtBCD: begin + ValuePtr := Marshal.AllocHGlobal(SizeOf(Currency)); + Marshal.WriteInt64(ValuePtr, BitConverter.DoubleToInt64Bits(Value)); + end; + {$IFDEF VER6P} + dtFmtBCD: begin + ValuePtr := Marshal.AllocHGlobal(SizeOfTBcd); + bcd := VarToBcd(Value); + {$IFDEF CLR} + Data := TBcd.ToBytes(bcd); + Marshal.Copy(Data, 0, ValuePtr, SizeOfTBcd); + {$ELSE} + PBcd(ValuePtr)^ := bcd; + {$ENDIF} + end; + {$ENDIF} + dtString, dtExtString: begin + s := Value; + l := Length(s) + 1; + ValuePtr := Marshal.AllocHGlobal(l); + CopyBufferAnsi(s, ValuePtr, l); + ValueType := dtString; + end; + dtWideString, dtExtWideString: begin + ws := Value; + l := (Length(ws) + 1) * SizeOf(WideChar); + ValuePtr := Marshal.AllocHGlobal(l); + CopyBufferUni(ws, ValuePtr, l); + ValueType := dtWideString; + end; + dtDateTime, dtDate, dtTime: begin + ValuePtr := Marshal.AllocHGlobal(SizeOf(Int64)); + Marshal.WriteInt64(ValuePtr, BitConverter.DoubleToInt64Bits(TDateTime(Value))); + end; + dtBytes, dtVarBytes, dtExtVarBytes: begin + Assert(VarType(Value) = varArray + varByte); + {$IFDEF CLR} + SetLength(Data, VarArrayHighBound(Value, 1) + 1); + for l := 0 to High(Data) do + Data[l] := VarArrayGet(Value, l); + ValuePtr := Marshal.AllocHGlobal(Length(Data) + sizeof(word)); + Marshal.WriteInt16(ValuePtr, Length(Data)); + Marshal.Copy(Data, 0, IntPtr(integer(ValuePtr) + sizeof(word)), Length(Data)); + {$ELSE} + GetMem(ValuePtr, TVarData(Value).VArray.Bounds[0].ElementCount + SizeOf(Word)); + Move(TVarData(Value).VArray.Data^, (PChar(ValuePtr) + SizeOf(Word))^, TVarData(Value).VArray.Bounds[0].ElementCount); + Word(ValuePtr^) := TVarData(Value).VArray.Bounds[0].ElementCount; + {$ENDIF} + end; + else + raise EConvertError.Create(SCannotConvertType); + end; + end; +end; + +function TMemDataSet.InternalLocateRecord(KeyFields: TDAList; const KeyValues: variant; + Options: TLocateExOptions; SavePos: boolean): boolean; +var + FieldDesc: TFieldDesc; + RecBuf: TRecordBuffer; + Values: array of IntPtr; + Types: array of integer; + i, FieldCount: integer; + IndexedFieldCount: integer; + Bookmark: PRecBookmark; + Res: integer; + CalcKeyFields: boolean; + FirstRecNo, LastRecNo: Integer; + + procedure SetKeyFields; + var + i: integer; + Index: integer; + TmpValue: IntPtr; + TmpType: integer; + Value: variant; + begin + CalcKeyFields := False; + FieldCount := KeyFields.Count; + SetLength(Values, FieldCount); + for i := 0 to FieldCount - 1 do begin + Values[i] := nil; // Clear Values array to prevent AV in 'finally' section after Exception + + if TFieldDesc(KeyFields[i]).FieldDescKind = fdkCalculated then + CalcKeyFields := True; + end; + + SetLength(Types, FieldCount); + for i := 0 to FieldCount - 1 do begin + Value := Unassigned; + if VarIsArray(KeyValues) + and ((FieldCount > 1) or (VarArrayHighBound(KeyValues, 1) = 0)) then + if i <= VarArrayHighBound(KeyValues, 1) then + Value := KeyValues[i] + else + Value := Null + else + if i = 0 then + Value := KeyValues + else + Value := Null; + + CopyFieldValue(Value, Values[i], Types[i], TFieldDesc(KeyFields[i])); + end; + + + IndexedFieldCount := 0; + if not ((lxPartialKey in Options) or (lxPartialCompare in Options) or (lxNearest in Options))then //lxPartialKey and lxPartialCompare incompatible with ordered locate + //lxNearest can be partially supported in the next versions + for i := 0 to TMemData(Data).IndexFields.Count - 1 do begin + //Check ordered locate posibility for current Index field + if (not TMemData(Data).IndexFields[i].CaseSensitive) xor + (lxCaseInsensitive in Options) then + break; + + //First IndexFields should be in KeyFields if not then we can't use ordered Locate + Index := KeyFields.IndexOf(TMemData(Data).IndexFields[i].FieldDesc); + if (Index > -1) then begin + if IndexedFieldCount <> Index then begin + FieldDesc := TFieldDesc(KeyFields[IndexedFieldCount]); + KeyFields[IndexedFieldCount] := KeyFields[Index]; + KeyFields[Index] := FieldDesc; + + TmpValue := Values[IndexedFieldCount]; + Values[IndexedFieldCount] := Values[Index]; + Values[Index] := TmpValue; + + TmpType := Types[IndexedFieldCount]; + Types[IndexedFieldCount] := Types[Index]; + Types[Index] := TmpType; + end; + inc(IndexedFieldCount); + end + else + break; + + end; + + end; + + function GetGoldenSectionDir(ReadRecBuf: boolean): integer; + var + i: integer; + FieldBlank: boolean; + Dir: Integer; + begin + Result := 0; + i := 0; + if ReadRecBuf then + Data.GetRecord(RecBuf); + + if CalcKeyFields then + GetCalcFields(RecBuf); + + while (Result = 0) and (i < IndexedFieldCount) do begin + FieldDesc := TFieldDesc(KeyFields[i]); + + FieldBlank := TMemData(Data).GetNull(FieldDesc.FieldNo, RecBuf); + + if TMemData(Data).IndexFields[i].DescendingOrder then + Dir := -1 + else + Dir := 1; + + if FieldBlank and (Values[i] = nil) then + Result := 0 + else + if FieldBlank and not (Values[i] = nil) then + Result := 1 + else + if not FieldBlank and (Values[i] = nil) then + Result := -1 + else + Result := TMemData(Data).CompareFieldValue(Values[i], Types[i], FieldDesc, RecBuf, Options); + + if Result <> 0 then + Result := Result * Dir; + Inc(i); + end; + end; + + function ExecGoldenSection: boolean; + var + First, Last, Current: Integer; + Dir: Integer; + + begin + Result := False; + + First := FirstRecNo; + Last := LastRecNo; + + Data.RecordNo := First; + Dir := GetGoldenSectionDir(True); + if Dir <= 0 then begin + Result := Dir = 0; + Exit; + end; + + Data.RecordNo := Last; + Dir := GetGoldenSectionDir(True); + if Dir >= 0 then begin + Result := Dir = 0; + Exit; + end; + + repeat + Current := (Last + First) div 2; + TMemData(Data).RecordNo := Current; + Dir := GetGoldenSectionDir(True); + if Dir < 0 then + Last := Current + else + if Dir > 0 then + First := Current + else begin + Result := True; + Break; + end; + until Last - First <= 1; + end; + +begin + Result := False; + if KeyFields.Count = 0 then + Exit; + + CheckBrowseMode; + CursorPosChanged; + UpdateCursorPos; + + FieldCount := 0; + + RecBuf := TempBuffer; + FreeRefComplexFields(RecBuf); + + Values := nil; + Bookmark := Marshal.AllocHGlobal(sizeof(TRecBookmark)); + try + SetKeyFields; + Data.GetBookmark(Bookmark); + + //Set locate dimensions. This dimensions should be used for lxNearest ordered implementation + FirstRecNo := 1; + LastRecNo := Data.RecordCount; + + if (lxNext in Options) then begin//Search from current position + if IndexedFieldCount > 0 then + Data.GetNextRecord(RecBuf); //Next RecNo in case of Ordered Search + FirstRecNo := Data.RecordNo; + end; + + if (lxUp in Options) then begin //Search from current position downto first + if IndexedFieldCount > 0 then + Data.GetPriorRecord(RecBuf); //Prior RecNo in case of Ordered Search + LastRecNo := Data.RecordNo; + end; + + if IndexedFieldCount > 0 then begin + TMemData(Data).PrepareRecNoCache; + Result := ExecGoldenSection; + + //Find the first occurence of located data + if Result then + repeat + + if (lxUp in Options) then begin + if Data.RecordNo >= LastRecNo then //top limit of first occurrence search + break + else begin + Data.GetNextRecord(RecBuf); + if Data.Eof or (GetGoldenSectionDir(False) <> 0) then begin + if IndexedFieldCount >= FieldCount then //we shouldn't restore correct position in case of mixed locate + Data.GetPriorRecord(RecBuf); //Restore correct position + break; + end; + end; + end + else + if Data.RecordNo <= FirstRecNo then //bottom limit of first occurrence search + break + else begin + Data.GetPriorRecord(RecBuf); + if (GetGoldenSectionDir(False) <> 0) then begin + if IndexedFieldCount >= FieldCount then //we shouldn't restore correct position in case of mixed locate + Data.GetNextRecord(RecBuf); //Restore correct position + break; + end; + end; + + until Data.Bof or Data.Eof; + end; + + + if (IndexedFieldCount = 0) or ((IndexedFieldCount < FieldCount) and Result) then begin + + if not((lxNext in Options) or (lxUp in Options)) and not (IndexedFieldCount > 0) then + Data.SetToBegin; + + while True do begin + if lxUp in Options then + Data.GetPriorRecord(RecBuf) + else + Data.GetNextRecord(RecBuf); + + if CalcKeyFields then + GetCalcFields(RecBuf); + + if not (Data.EOF or Data.BOF) then begin + Result := True; + i := 0; + while Result and (i < FieldCount) do begin + FieldDesc := TFieldDesc(KeyFields[i]); + if (Values[i] = nil) or Data.GetNull(FieldDesc.FieldNo, RecBuf) then + Result := (Values[i] = nil) and Data.GetNull(FieldDesc.FieldNo, RecBuf) + else begin + Res := TMemData(Data).CompareFieldValue(Values[i], Types[i], FieldDesc, RecBuf, Options); + Result := (Res = 0) or (Res < 0) and (lxNearest in Options); + end; + Inc(i); + end; + + if Result then + break; + end + else begin + Result := False; + break; + end; + end; + end; + + if (SavePos or not Result) + and not (Data.Eof and Data.Bof {Empty Data}) then + Data.SetToBookmark(Bookmark); + finally + Marshal.FreeHGlobal(Bookmark); + for i := 0 to FieldCount - 1 do + Marshal.FreeHGlobal(Values[i]); + end; +end; + +function TMemDataSet.LocateRecord(const KeyFields: string; const KeyValues: variant; + Options: TLocateExOptions; SavePos: boolean): boolean; +var + Fields: TDAList; + FieldDesc: TFieldDesc; + + procedure ParseKeyFields; + var + St: string; + i: integer; + begin + i := 1; + while True do begin + St := ExtractFieldName(KeyFields, i); + if St <> '' then begin + FieldDesc := Data.FieldByName(St); + if FieldDesc <> nil then + Fields.Add(FieldDesc); + end + else + break; + end; + end; + +begin + Fields := TDAList.Create; + try + ParseKeyFields; + Result := InternalLocateRecord(Fields, KeyValues, Options, SavePos); + finally + Fields.Free; + end; +end; + +function TMemDataSet.LocateRecord(const KeyFields: array of TField; const KeyValues: variant; + Options: TLocateExOptions; SavePos: boolean): boolean; +var + Fields: TDAList; + i: integer; +begin + Fields := TDAList.Create; + try + for i := 0 to Length(KeyFields) - 1 do begin + if KeyFields[i] <> nil then + Fields.Add(GetFieldDesc(KeyFields[i])); + end; + + Result := InternalLocateRecord(Fields, KeyValues, Options, SavePos); + finally + Fields.Free; + end; +end; + +function LocateExOptions(Options: TLocateOptions): TLocateExOptions; +begin + Result := []; + if loCaseInsensitive in Options then + Result := Result + [lxCaseInsensitive]; + + if loPartialKey in Options then + Result := Result + [lxPartialKey]; +end; + +function TMemDataSet.Locate(const KeyFields: array of TField; const KeyValues: variant; + Options: TLocateOptions): boolean; +begin + DoBeforeScroll; + + Result := LocateRecord(KeyFields, KeyValues, LocateExOptions(Options), False); + + if Result then begin + Resync([{rmExact, rmCenter}]); + DoAfterScroll; + end; +end; + +function TMemDataSet.Locate(const KeyFields: string; + const KeyValues: variant; Options: TLocateOptions): boolean; +begin + DoBeforeScroll; + + Result := LocateRecord(KeyFields, KeyValues, LocateExOptions(Options), False); + + if Result then begin + Resync([{rmExact, rmCenter}]); + DoAfterScroll; + end; +end; + +function TMemDataSet.LocateEx(const KeyFields: string; + const KeyValues: variant; Options: TLocateExOptions): boolean; +begin + DoBeforeScroll; + + Result := LocateRecord(KeyFields, KeyValues, Options, False); + + if Result then begin + Resync([{rmExact, rmCenter}]); + DoAfterScroll; + end; +end; + +function TMemDataSet.LocateEx(const KeyFields: array of TField; + const KeyValues: variant; Options: TLocateExOptions): boolean; +begin + DoBeforeScroll; + + Result := LocateRecord(KeyFields, KeyValues, Options, False); + + if Result then begin + Resync([{rmExact, rmCenter}]); + DoAfterScroll; + end; +end; + +function TMemDataSet.Lookup(const KeyFields: string; const KeyValues: variant; + const ResultFields: string): variant; +begin + Result := Null; + if LocateRecord(KeyFields, KeyValues, [], True) then begin + SetTempState(dsCalcFields); + try + CalculateFields(TempBuffer); + Result := FieldValues[ResultFields]; + finally + RestoreState(dsBrowse); + end; + end; +end; + +{ CachedUpdates } + +procedure TMemDataSet.CheckCachedUpdateMode; +begin + if not CachedUpdates then + DatabaseError(SNotCachedUpdate); +end; + +function TMemDataSet.UpdateStatus: TUpdateStatus; +var + RecBuf: TRecordBuffer; +begin + if CachedUpdates and not IsEmpty then begin + if State = dsCalcFields then + RecBuf := CalcBuffer + else + RecBuf := ActiveBuffer; + + Result := PRecInfo(integer(RecBuf) + FRecInfoOfs).UpdateStatus; + end + else + Result := usUnModified; +end; + +function TMemDataSet.UpdateResult: TUpdateAction; +begin + UpdateCursorPos; + + if Data.GetUpdateResult = urNone then + Result := uaApplied + else + Result := TUpdateAction(Data.GetUpdateResult); +end; + +procedure TMemDataSet.ApplyUpdates; +begin + CheckActive; + FreeRefBuffers; + if State <> dsBrowse then + Post; + CheckCachedUpdateMode; + UpdateCursorPos; + + NewCacheRecBuf := AllocRecordBuffer; + OldCacheRecBuf := AllocRecordBuffer; + FInCacheProcessing := True; + try + Data.SetCacheRecBuf(NewCacheRecBuf, OldCacheRecBuf); + Data.ApplyUpdates; + finally + FInCacheProcessing := False; + FreeRecordBuffer(NewCacheRecBuf); + FreeRecordBuffer(OldCacheRecBuf); + Resync([]); + end; +end; + +procedure TMemDataSet.CommitUpdates; +begin + CheckActive; + CheckCachedUpdateMode; + FreeRefBuffers; + UpdateCursorPos; + + NewCacheRecBuf := AllocRecordBuffer; + OldCacheRecBuf := AllocRecordBuffer; + FInCacheProcessing := True; + try + Data.SetCacheRecBuf(NewCacheRecBuf, OldCacheRecBuf); + Data.CommitUpdates; + finally + FInCacheProcessing := False; + FreeRecordBuffer(NewCacheRecBuf); + FreeRecordBuffer(OldCacheRecBuf); + end; + Resync([]); +end; + +procedure TMemDataSet.CancelUpdates; +begin + CheckActive; + FreeRefBuffers; + Cancel; + CheckCachedUpdateMode; + UpdateCursorPos; + Data.CancelUpdates; + Resync([]); +end; + +procedure TMemDataSet.RestoreUpdates; +begin + CheckActive; + FreeRefBuffers; + Cancel; + CheckCachedUpdateMode; + UpdateCursorPos; + Data.RestoreUpdates; + Resync([]); +end; + +procedure TMemDataSet.RevertRecord; +begin + CheckActive; + FreeRefComplexFields(ActiveBuffer); + if State in dsEditModes then + Cancel; + CheckCachedUpdateMode; + UpdateCursorPos; + Data.RevertRecord; + Resync([]); +end; + +procedure TMemDataSet.DoApplyRecord(UpdateKind: TUpdateRecKind; var Action: TUpdateRecAction; LastItem: boolean); +var + OldModified: boolean; + UpdateAction: TUpdateAction; +begin + OldModified := Modified; // NewValue change Modified ??? or MemDS + try + UpdateAction := uaFail; + try + if Assigned(OnUpdateRecord) then begin + OnUpdateRecord(Self, TUpdateKind(UpdateKind), UpdateAction); + if UpdateAction in [uaAbort] then + Abort; + end; + //else begin + if not Assigned(OnUpdateRecord) or (UpdateAction = TUpdateAction(uaDefault)) then begin + case UpdateKind of + ukUpdate: + PerformUpdate; + ukInsert: + PerformAppend; + ukDelete: + PerformDelete; + end; + + if BatchUpdate then + if CanFlushBatch or LastItem then + // Should be flushed here because of Action parameter that should be returned + // to TMemData.ApplyUpdates function + FlushBatch + else begin + Action := urSuspended; + Exit; + end; + + UpdateAction := uaApplied; + end; + except + on E: Exception do + if IsClass(E, EDatabaseError) and Assigned(OnUpdateError) then begin + OnUpdateError(Self, EDatabaseError(E), TUpdateKind(UpdateKind), UpdateAction); + case UpdateAction of + uaFail: + raise; + uaAbort: + Abort; + end; + end + else + raise; + end; + finally + SetModified(OldModified); + end; + Action := TUpdateRecAction(UpdateAction); +end; + +function TMemDataSet.BatchUpdate: boolean; +begin + Result := False; +end; + +function TMemDataSet.CanFlushBatch: boolean; +begin + Result := False; +end; + +procedure TMemDataSet.FlushBatch; +begin + Assert(False, 'Should be overridden'); +end; + +{ BLOB Support } + +{function TMemDataSet.GetBlobData(Field:TField; Buffer: PChar):TBlobData; +begin + Result := PBlobDataArray(Buffer + FBlobCacheOfs)[Field.Offset]; +end; + +procedure TMemDataSet.SetBlobData(Field:TField; Buffer: PChar; Value:TBlobData); +begin + if Buffer = ActiveBuffer then + PBlobDataArray(Buffer + FBlobCacheOfs)[Field.Offset] := Value; +end; + +procedure TMemDataSet.ClearBlobCache(Buffer: PChar); +var + i: integer; +begin + for i := 0 to BlobFieldCount - 1 do + PBlobDataArray(Buffer + FBlobCacheOfs)[i] := ''; +end;} + +procedure TMemDataSet.CloseBlob(Field: TField); +begin +end; + +function TMemDataSet.CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; +begin + Result := TBlobStream.Create(Field as TBlobField, Mode); +end; + +{ Informational } + +function TMemDataSet.IsSequenced: boolean; +begin + Result := True; +end; + +function TMemDataSet.GetRecordSize: word; +begin + Result := word(Data.RecordSize); +end; + +function TMemDataSet.GetRecordCount: integer; +begin + if Active then + Result := Data.RecordCount + else + Result := 0; +end; + +function TMemDataSet.GetRecNo: integer; +var + RecBuf: TRecordBuffer; +begin + if GetActiveRecBuf(RecBuf) then + Result := PRecInfo(integer(RecBuf) + FRecInfoOfs).RecordNumber + else + Result := 0; +end; + +procedure TMemDataSet.SetRecNo(Value: integer); +begin + CheckBrowseMode; + DoBeforeScroll; + Data.RecordNo := Value; + Resync([{rmCenter}]); + DoAfterScroll; +end; + +{ More } + +procedure TMemDataSet.InternalHandleException; +begin +{$IFDEF VER6P} + if Assigned(Classes.ApplicationHandleException) then + Classes.ApplicationHandleException(ExceptObject) + else + ShowException(ExceptObject, ExceptAddr) +{$ELSE} + ApplicationHandleException(Self); +{$ENDIF} +end; + +{$IFDEF CLR} +procedure TMemDataSet.DataEvent(Event: TDataEvent; Info: TObject); +{$ELSE} +procedure TMemDataSet.DataEvent(Event: TDataEvent; Info: longint); +{$ENDIF} + procedure CheckIfParentScrolled; + var + ParentPosition, I: Integer; + begin + if FParentDataSet = nil then + Exit; + ParentPosition := 0; + with FParentDataSet do + if not IsEmpty then + for I := 0 to BookmarkSize - 1 do + ParentPosition := ParentPosition + + Marshal.ReadByte(ActiveBuffer, FBookmarkOfs + I); + if (FLastParentPos = 0) or (ParentPosition <> FLastParentPos) then + begin + First; + FLastParentPos := ParentPosition; + end else + begin + UpdateCursorPos; + Resync([]); + end; + end; + +begin + if Event = deParentScroll then + CheckIfParentScrolled; + inherited DataEvent(Event, Info); +end; + +procedure TMemDataSet.AssignTo(Dest: TPersistent); +begin + if Dest is TMemDataSet then begin + TMemDataSet(Dest).CachedUpdates := CachedUpdates; + TMemDataSet(Dest).LocalConstraints := LocalConstraints; + TMemDataSet(Dest).LocalUpdate := LocalUpdate; + end + else + inherited; +end; + +procedure TMemDataSet.SetCachedUpdates(Value: boolean); +begin + if FCachedUpdates <> Value then begin + CheckInactive; + FCachedUpdates := Value; + Data.CachedUpdates := FCachedUpdates; + end; +end; + +function TMemDataSet.GetUpdatesPending: boolean; +begin + Result := Data.UpdatesPending; +end; + +function TMemDataSet.GetPrepared: boolean; +begin + Result := Data.Prepared; +end; + +procedure TMemDataSet.SetPrepared(Value: boolean); +begin + if Value then + Prepare + else + UnPrepare; +end; + +function TMemDataSet.GetUpdateRecordSet: TUpdateRecordTypes; +var + ItemTypes: TItemTypes; +begin +// if Active then begin + CheckCachedUpdateMode; + ItemTypes := Data.FilterItemTypes; + + Result := []; + if isUnmodified in ItemTypes then + Result := Result + [rtUnmodified]; + if isUpdated in ItemTypes then + Result := Result + [rtModified]; + if isAppended in ItemTypes then + Result := Result + [rtInserted]; + if isDeleted in ItemTypes then + Result := Result + [rtDeleted]; +{ end + else + Result := [];} +end; + +procedure TMemDataSet.SetUpdateRecordSet(Value: TUpdateRecordTypes); +var + ItemTypes: TItemTypes; +begin + CheckCachedUpdateMode; + + //CheckBrowseMode; + if Active then + UpdateCursorPos; + + ItemTypes := []; + if rtUnmodified in Value then + ItemTypes := ItemTypes + [isUnmodified]; + if rtModified in Value then + ItemTypes := ItemTypes + [isUpdated]; + if rtInserted in Value then + ItemTypes := ItemTypes + [isAppended]; + if rtDeleted in Value then + ItemTypes := ItemTypes + [isDeleted]; + + Data.FilterItemTypes := ItemTypes; + + if Active then + Resync([]); +end; + +{ TBlobStream } + +constructor TBlobStream.Create(Field: TBlobField; Mode: TBlobStreamMode); +begin + inherited Create; + + FMode := Mode; + FField := Field; + FDataSet := FField.DataSet as TMemDataSet; + FFieldNo := FField.FieldNo; + if not FDataSet.GetActiveRecBuf(FBuffer) then + Exit; +{ if FDataSet.State = dsFilter then + DatabaseErrorFmt('SNoFieldAccess', [FField.DisplayName]);} + if not FField.Modified then begin + if Mode = bmRead then begin +{ FCached := FDataSet.FCacheBlobs and (FBuffer = FDataSet.ActiveBuffer) and + (FField.IsNull or (FDataSet.GetBlobData(FField, FBuffer) <> ''));} + end + else begin +// FDataSet.SetBlobData(FField, FBuffer, ''); + if FField.ReadOnly then + DatabaseErrorFmt(SFieldReadOnly, [FField.DisplayName]); + if not (FDataSet.State in [dsNewValue, dsEdit, dsInsert]) then + DatabaseError(SNotEditing); + end; + end; + FOpened := True; + if Mode = bmWrite then + Truncate; +end; + +destructor TBlobStream.Destroy; +begin + if FOpened then begin + if FModified then + FField.Modified := True; + end; + if FModified then + //try + {$IFDEF CLR} + FDataSet.DataEvent(deFieldChange, FField); + {$ELSE} + FDataSet.DataEvent(deFieldChange, longint(FField)); + {$ENDIF} + {except + Application.HandleException(Self); + end;} +end; + +{$IFDEF CLR} +function TBlobStream.Read(var Buffer: TBytes; Offset, Count: Longint): Longint; +var + Handle: IntPtr; +{$ELSE} +function TBlobStream.Read(var Buffer; Count: longint): longint; +{$ENDIF} +begin + Result := 0; + if FOpened then begin + if Count > Size - FPosition then + Result := Size - FPosition + else + Result := Count; + if Result > 0 then begin + {$IFDEF CLR} + Handle := AllocGCHandle(Buffer, True); + try + Result := FDataSet.Data.ReadBlob(FFieldNo, FBuffer, FPosition, Count, + GetAddrOfPinnedObject(Handle), FDataSet.State = dsOldValue{$IFDEF VER10P}, (FField is TWideMemoField){$ENDIF}); + finally + FreeGCHandle(Handle); + end; + {$ELSE} + Result := FDataSet.Data.ReadBlob(FFieldNo, FBuffer, FPosition, Count, @Buffer, + (FDataSet.State = dsOldValue){$IFDEF VER10P}, (FField is TWideMemoField){$ENDIF}); + {$ENDIF} + Inc(FPosition, Result); + end; + end; +end; + +{$IFDEF CLR} +function TBlobStream.Write(const Buffer: TBytes; Offset, Count: Longint): Longint; +var + Handle: IntPtr; +{$ELSE} +function TBlobStream.Write(const Buffer; Count: Longint): Longint; +{$ENDIF} +begin + Result := 0; + if FOpened then begin + {$IFDEF CLR} + Handle := AllocGCHandle(Buffer, True); + try + FDataSet.Data.WriteBlob(FFieldNo, FBuffer, FPosition, Count, + GetAddrOfPinnedObject(Handle){$IFDEF VER10P}, FField is TWideMemoField{$ENDIF}); + finally + FreeGCHandle(Handle); + end; + + {$ELSE} + FDataSet.Data.WriteBlob(FFieldNo, FBuffer, FPosition, Count, @Buffer + {$IFDEF VER10P}, FField is TWideMemoField{$ENDIF}); + {$ENDIF} + Inc(FPosition, Count); + Result := Count; + FModified := True; +{ FDataSet.SetBlobData(FField, FBuffer, '');} + end; +end; + +{$IFDEF CLR} +function TBlobStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; +{$ELSE} +function TBlobStream.Seek(Offset: Longint; Origin: Word): Longint; +{$ENDIF} +begin + case Origin of + soFromBeginning: + FPosition := Offset; + soFromCurrent: + Inc(FPosition, Offset); + soFromEnd: + FPosition := GetBlobSize + Offset; + end; + Result := FPosition; +end; + +procedure TBlobStream.Truncate; +begin + if FOpened then begin + FDataSet.Data.TruncateBlob(FFieldNo, FBuffer, FPosition + {$IFDEF VER10P}, FField is TWideMemoField{$ENDIF}); + FModified := True; +// FDataSet.SetBlobData(FField, FBuffer, ''); + end; +end; + +function TBlobStream.GetBlobSize: longint; +begin + Result := 0; + if FOpened then + Result := FDataSet.Data.GetBlobSize(FFieldNo, FBuffer, (FDataSet.State = dsOldValue) + {$IFDEF VER10P}, FField is TWideMemoField{$ENDIF}); +end; + +{$IFDEF CLR} +procedure TBlobStream.SetSize(NewSize: Int64); +{$ELSE} +procedure TBlobStream.SetSize(NewSize: Longint); +{$ENDIF} +begin + if FOpened then + FDataSet.Data.SetBlobSize(FFieldNo, FBuffer, NewSize, (FDataSet.State = dsOldValue) + {$IFDEF VER10P}, (FField is TWideMemoField){$ENDIF}); +end; + +class function TMemDSUtils.SetBlob(Obj: TMemDataSet; Field: TField; Blob: TBlob): boolean; +begin + Result := Obj.SetBlob(Field, Blob); +end; + +class function TMemDSUtils.GetBlob(Obj: TMemDataSet; FieldDesc: TFieldDesc): TBlob; +begin + Result := Obj.InternalGetBlob(FieldDesc); +end; + +end. diff --git a/internal/4.10.0.10/1/Source/MemData.pas b/internal/4.10.0.10/1/Source/MemData.pas new file mode 100644 index 0000000..305efe4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/MemData.pas @@ -0,0 +1,9028 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Mem Data +// Created: 20.02.98 +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit MemData; +{$ENDIF} +interface +uses + Classes, CRParser, MemUtils, SyncObjs, +{$IFDEF MSWINDOWS} + Windows, +{$ENDIF} +{$IFDEF VER6P} + FMTBcd, Variants, +{$ENDIF} +{$IFDEF CLR} + System.Runtime.InteropServices, System.Text; +{$ELSE} + CLRClasses; +{$ENDIF} + +const + btSign = $DD; // DEBUG + flUsed = $EE; + flFree = $DD; + + FlatBufferLimit = 32; + +{ internal data types } + +{ ! can't modify this consts } + + dtUnknown = 0; + dtString = 1; + + dtInt8 = 2; + dtInt16 = 3; + dtSmallint = dtInt16; + dtInt32 = 4; + + dtInteger = dtInt32; + dtFloat = 5; + dtDate = 6; // Date only + dtTime = 7; // Time only + dtDateTime = 8; // Date and time + dtUInt16 = 9; + dtWord = dtUInt16; + dtBoolean = 10; + dtInt64 = 11; + dtLargeint = dtInt64; + dtCurrency = 12; + dtBlob = 13; + dtMemo = 14; + dtObject = 15; + dtReference = 16; + dtArray = 17; + dtTable = 18; + +{$IFDEF VER5P} + dtVariant = 19; +{$ENDIF} + dtExtString = 20; + dtBytes = 21; + dtVarBytes = 22; /// Cannot be deleted because "Fixed" flag not avaible on component level (MSAccess) GetFieldType(DataType: word): TFieldType + dtExtVarBytes = 23; + + dtUInt32 = 24; + dtLongword = dtUInt32; + + dtWideString = 25; + dtExtWideString = 26; + + dtBCD = 27; +{$IFDEF VER6P} + dtFMTBCD = 28; +{$ENDIF} + dtGuid = 29; + dtWideMemo = 30; //This type corectly supported only in BDS 2006 and higher + +{ StringHeap const } + +const + BlockSize = 16384; + SmallSize = 2000; + Align = 8; + RefNull = 101; + +{$IFNDEF CLR} +{$IFDEF VER6P} + SizeOfTBcd = SizeOf(TBcd); +{$ENDIF} +{$ENDIF} + +type + TDataType = word; + + TDANumericType = (ntFloat, ntBCD{$IFDEF VER6P}, ntFmtBCD{$ENDIF}); + + //Note that TConnLostCause should be ordered by FailOver priority + //e.g. there are multyple DataSet.ApplyUpdates during Connection.ApplyUpdates so Connection.ApplyUpdates is more + //prioritized operation than DataSet.ApplyUpdates and should be reexecuted instead of DataSet.ApplyUpdates in case of + //failover + TConnLostCause = (clUnknown, //Connection lost reason - unknown + clExecute, //Connection Lost detected during SQL execution (Reconnect with exception possible) + clOpen, //Connection Lost detected during query opening (Reconnect/Reexecute possible) + clRefresh, //Connection Lost detected during query opening (Reconnect/Reexecute possible) + clApply, //Connection Lost detected during DataSet.ApplyUpdates (Reconnect/Reexecute possible) + clServiceQuery, //Connection Lost detected during service information request (Reconnect/Reexecute possible) + clTransStart, //Connection Lost detected during transaction start (Reconnect/Reexecute possible) + //In IBDAC one connection could start several transactions during ApplyUpdates that's why + //clTransStart has less priority then clConnectionApply + clConnectionApply, //Connection Lost detected during Connection.ApplyUpdates (Reconnect/Reexecute possible) + clConnect //Connection Lost detected during connection establishing (Reconnect possible) + ); + +{ TBlockManager } + +{$IFDEF CLR} + PBlockHeader = packed record + private + Ptr: IntPtr; + + function GetItemCount: word; + procedure SetItemCount(Value: word); + function GetUsedItems: word; + procedure SetUsedItems(Value: word); + function GetPrev: PBlockHeader; + procedure SetPrev(Value: PBlockHeader); + function GetNext: PBlockHeader; + procedure SetNext(Value: PBlockHeader); + + public + property ItemCount: word read GetItemCount write SetItemCount; + property UsedItems: word read GetUsedItems write SetUsedItems; + property Prev: PBlockHeader read GetPrev write SetPrev; + property Next: PBlockHeader read GetNext write SetNext; + + class operator Implicit(AValue: IntPtr): PBlockHeader; + class operator Implicit(AValue: PBlockHeader): IntPtr; + class operator Implicit(AValue: PBlockHeader): integer; + class operator Equal(ALeft, ARight: PBlockHeader): boolean; + end; +{$ELSE} + PBlockHeader = ^TBlockHeader; +{$ENDIF} + TBlockHeader = packed record + ItemCount: word; + UsedItems: word; + Prev: PBlockHeader; + Next: PBlockHeader; + Test: byte; // DEBUG + end; + + TItemStatus = (isUnmodified, isUpdated, isAppended, isDeleted); + TItemTypes = set of TItemStatus; + TUpdateRecAction = (urFail, urAbort, urSkip, urRetry, urApplied, urNone, urSuspended); + TItemFilterState = (fsNotChecked, fsNotOmitted, fsOmitted); + +{$IFDEF CLR} + PItemHeader = packed record + private + Ptr: IntPtr; + + function GetBlock: PBlockHeader; + procedure SetBlock(Value: PBlockHeader); + function GetPrev: PItemHeader; + procedure SetPrev(Value: PItemHeader); + function GetNext: PItemHeader; + procedure SetNext(Value: PItemHeader); + function GetRollback: PItemHeader; + procedure SetRollback(Value: PItemHeader); + function GetStatus: TItemStatus; + procedure SetStatus(Value: TItemStatus); + function GetUpdateResult: TUpdateRecAction; + procedure SetUpdateResult(Value: TUpdateRecAction); + function GetOrder: longint; + procedure SetOrder(Value: longint); + function GetFlag: byte; + procedure SetFlag(Value: byte); + function GetFilterResult: TItemFilterState; + procedure SetFilterResult(Value: TItemFilterState); + public + property Block: PBlockHeader read GetBlock write SetBlock; + property Prev: PItemHeader read GetPrev write SetPrev; + property Next: PItemHeader read GetNext write SetNext; + property Rollback: PItemHeader read GetRollback write SetRollback; + property Status: TItemStatus read GetStatus write SetStatus; + property UpdateResult: TUpdateRecAction read GetUpdateResult write SetUpdateResult; + property Order: longint read GetOrder write SetOrder; + property Flag: byte read GetFlag write SetFlag; + property FilterResult: TItemFilterState read GetFilterResult write SetFilterResult; + + class operator Implicit(AValue: IntPtr): PItemHeader; + class operator Implicit(AValue: PItemHeader): IntPtr; + class operator Implicit(AValue: PItemHeader): integer; + class operator Equal(ALeft, ARight: PItemHeader): boolean; + end; +{$ELSE} + PItemHeader = ^TItemHeader; +{$ENDIF} + TItemHeader = packed record + Block: PBlockHeader; + Prev: PItemHeader; + Next: PItemHeader; + Rollback: PItemHeader; + Status: TItemStatus; + UpdateResult: TUpdateRecAction; + Order: longint; + Flag: byte; + FilterResult: TItemFilterState; + AlignByte: byte; // (SizeOf(TBlockHeader) + SizeOf(TItemHeader)) mod 2 = 0 + end; // (RecordSize + SizeOf(TItemHeader)) mod 2 = 0 + + TBlockManager = class + private + {$IFDEF CLR} + FHeap: THandle; + {$ENDIF} + + public + FirstFree: PItemHeader; + FirstBlock: PBlockHeader; + RecordSize: longint; + DefaultItemCount: word; + + constructor Create; + destructor Destroy; override; + + procedure AllocBlock(var Block: PBlockHeader; ItemCount: word); + procedure FreeBlock(Block: PBlockHeader); + + procedure AddFreeBlock; + procedure FreeAllBlock; + + procedure AllocItem(var Item: PItemHeader); + procedure FreeItem(Item: PItemHeader); + procedure InitItem(Item: PItemHeader); + + procedure PutRecord(Item: PItemHeader; Rec: IntPtr); + procedure GetRecord(Item: PItemHeader; Rec: IntPtr); + function GetRecordPtr(Item: PItemHeader): IntPtr; + + procedure CopyRecord(ItemSrc: PItemHeader; ItemDest: PItemHeader); + end; + +{ TStringHeap } + +{$IFDEF CLR} + PBlock = packed record + private + Ptr: IntPtr; + + function GetNext: PBlock; + procedure SetNext(Value: PBlock); + public + property Next: PBlock read GetNext write SetNext; + + class operator Implicit(AValue: IntPtr): PBlock; + class operator Implicit(AValue: PBlock): IntPtr; + end; +{$ELSE} + PBlock = ^TBlock; +{$ENDIF} + TStrData = array [0..BlockSize - 5 {SizeOf(PBlock) - 1}] of char; + TBlock = packed record + Next: PBlock; + Data: TStrData; + end; + + TSmallTab = array [1..SmallSize div Align] of IntPtr; + +const + SizeOf_TStrData = BlockSize - 4; + SizeOf_TBlock = SizeOf_TStrData + 4; + SizeOf_TSmallTab = SmallSize div Align * 4; + +type + TStringHeap = class + private + FSmallTab: TSmallTab; + FFree: integer; + FRoot: PBlock; + FEmpty: boolean; + FSysGetMem: boolean; + {$IFDEF WIN32} + FUseSysMemSize: boolean; + {$ENDIF} + FThreadSafety: boolean; + FThreadSafetyCS: TCriticalSection; + procedure SetThreadSafety(const Value: boolean); + function UseSmallTabs(divSize: integer): boolean; + public + constructor Create; + destructor Destroy; override; + function NewBuf(Size: integer): IntPtr; + function AllocStr(Str: IntPtr; Trim: boolean = false; Len: integer = -1): IntPtr; + function AllocWideStr(Str: IntPtr; Trim: boolean = false; Len: integer = -1): IntPtr; + function ReAllocStr(Str: IntPtr; Trim: boolean = false): IntPtr; + function ReAllocWideStr(Str: IntPtr; Trim: boolean = false): IntPtr; + procedure DisposeBuf(Buf: IntPtr); + procedure AddRef(Buf: IntPtr); + procedure Clear; + property Empty: boolean read FEmpty; + property SysGetMem: boolean read FSysGetMem; + property ThreadSafety: boolean read FThreadSafety write SetThreadSafety; + end; + +{ TFieldDesc } + + TFieldTypeSet = set of byte; + + TDateFormat = (dfMSecs, dfDateTime, dfTime, dfDate); + + TFieldDescKind = (fdkData, fdkCached, fdkCalculated); + + TObjectType = class; + + TFieldDesc = class + protected + FName: string; // unique name in TData + FActualName: string; // original name from source + FDataType: word; + FSubDataType: word; + FLength: word; // precision for number + FScale: word; + FFieldNo: word; + FActualFieldNo: word; + FSize: word; // size in rec buffer + FOffset: longint; // offset in rec buffer + FDataOffset: longint;// offset in storage structure + FRequired: boolean; + FReadOnly: boolean; + FIsKey: boolean; + FFixed: boolean; // indicates that the string field has a fixed size + FHidden: boolean; + FObjectType: TObjectType; + FParentField: TFieldDesc; + FHiddenObject: boolean; // for hide Object field (child field is visible) + FHandle: IntPtr; // pointer to field specific data + FReserved: boolean; // reserved flag for perfomance optimization + FFieldDescKind: TFieldDescKind; + + procedure SetObjectType(Value: TObjectType); + + public + constructor Create; virtual; + destructor Destroy; override; + + function HasParent: boolean; + + procedure Assign(FieldDesc: TFieldDesc); + + property Name: string read FName write FName; + property ActualName: string read FActualName write FActualName ; + property DataType: word read FDataType write FDataType; + property SubDataType: word read FSubDataType write FSubDataType; + property Length: word read FLength write FLength; + property Scale: word read FScale write FScale; + property FieldNo: word read FFieldNo write FFieldNo; + property ActualFieldNo: word read FActualFieldNo write FActualFieldNo; // for define + property Size: word read FSize write FSize; + property Offset: longint read FOffset write FOffset; + property DataOffset: longint read FDataOffset write FDataOffset; + property Required: boolean read FRequired write FRequired; + property ReadOnly: boolean read FReadOnly write FReadOnly; + property IsKey: boolean read FIsKey write FIsKey; + property Fixed: boolean read FFixed write FFixed; + property Hidden: boolean read FHidden write FHidden; + property ObjectType: TObjectType read FObjectType write SetObjectType; + property ParentField: TFieldDesc read FParentField write FParentField; + property HiddenObject: boolean read FHiddenObject write FHiddenObject; // IncludeObject + property Handle: IntPtr read FHandle write FHandle; + property FieldDescKind: TFieldDescKind read FFieldDescKind write FFieldDescKind; + end; + + TFieldDescClass = class of TFieldDesc; + + TFieldDescs = class (TDAList) + private + function GetItems(Index: integer): TFieldDesc; + + public + destructor Destroy; override; + + procedure Clear; override; + + function FindField(Name: string): TFieldDesc; + function FieldByName(Name: string): TFieldDesc; + + property Items[Index: integer]: TFieldDesc read GetItems; default; + end; + +{ TSharedObject } + + TSharedObject = class + protected + FRefCount: integer; + FGCHandle: IntPtr; + + function GetGCHandle: IntPtr; + + public + constructor Create; + destructor Destroy; override; + procedure Free; + + procedure CheckValid; + + procedure AddRef; + procedure Release; + {$IFNDEF CLR} + function GetHashCode: integer; + {$ENDIF} + + property RefCount: integer read FRefCount; + property GCHandle: IntPtr read GetGCHandle; + end; + +{ TObjectType } + + TAttribute = class + private + FName: string; + FDataType: word; + FLength: word; + FScale: word; + FSize: word; // size of got data + FDataSize: word; // size of stored data + FOffset: word; // stored offset + FIndicatorOffset: word; // indicator offset + FAttributeNo: word; + FObjectType: TObjectType; + FOwner: TObjectType; + FFixed: boolean; + + procedure SetObjectType(Value: TObjectType); + + public + constructor Create; + destructor Destroy; override; + + property Name: string read FName write FName; + property DataType: word read FDataType write FDataType; + property Fixed: boolean read FFixed write FFixed; + property Length: word read FLength write FLength; + property Scale: word read FScale write FScale; + property Size: word read FSize write FSize; + property DataSize: word read FDataSize write FDataSize; + property Offset: word read FOffset write FOffset; + property IndicatorOffset: word read FIndicatorOffset write FIndicatorOffset; + property AttributeNo: word read FAttributeNo write FAttributeNo; + property ObjectType: TObjectType read FObjectType write SetObjectType; + property Owner: TObjectType read FOwner write FOwner; + end; + + TObjectType = class (TSharedObject) + private + function GetAttributes(Index: integer): TAttribute; + function GetAttributeCount: integer; + + protected + FName: string; + FDataType: word; + FSize: integer; + FAttributes: TDAList; + + protected + procedure ClearAttributes; + + public + constructor Create; + destructor Destroy; override; + + function FindAttribute(Name: string): TAttribute; + function AttributeByName(Name: string): TAttribute; + + property Name: string read FName; + property DataType: word read FDataType; + property Size: integer read FSize; + property AttributeCount: integer read GetAttributeCount; + + property Attributes[Index: integer]: TAttribute read GetAttributes; + end; + + TDBObject = class (TSharedObject) + private + FObjectType: TObjectType; + + protected + procedure SetObjectType(Value: TObjectType); + + procedure GetAttributeValue(Name: string; Dest: IntPtr; var IsBlank: boolean); virtual; + procedure SetAttributeValue(Name: string; Source: IntPtr); virtual; + + public + constructor Create; + + property ObjectType: TObjectType read FObjectType; + end; + + TCacheItem = class + Item: PItemHeader; + Next: TCacheItem; + end; + +{$IFDEF CLR} + PRecBookmark = packed record + private + Ptr: IntPtr; + + function GetRefreshIteration: longint; + procedure SetRefreshIteration(Value: longint); + function GetItem: PItemHeader; + procedure SetItem(Value: PItemHeader); + function GetOrder: longint; + procedure SetOrder(Value: longint); + + public + property RefreshIteration: longint read GetRefreshIteration write SetRefreshIteration; + property Item: PItemHeader read GetItem write SetItem; + property Order: longint read GetOrder write SetOrder; + + class operator Implicit(AValue: IntPtr): PRecBookmark; + class operator Implicit(AValue: PRecBookmark): IntPtr; + class operator Implicit(AValue: integer): PRecBookmark; + end; +{$ELSE} + PRecBookmark = ^TRecBookmark; +{$ENDIF} + TRecBookmark = record + RefreshIteration: longint; + Item: PItemHeader; + Order: longint + end; + + TFilterFunc = function(RecBuf: IntPtr): boolean of object; + + TBoolParser = class (TParser) + protected + procedure ToRightQuote(LeftQuote: Char); override; + public + constructor Create(const Text: string); override; + end; + + TExpressionType = (ntEqual,ntMore,ntLess,ntMoreEqual,ntLessEqual,ntNoEqual, + ntAnd,ntOr,ntNot,ntField,ntValue,ntTrue,ntFalse,ntLike); + + TExpressionNode = class + NextAlloc: TExpressionNode; + NodeType: TExpressionType; + LeftOperand: TExpressionNode; + RightOperand: TExpressionNode; + NextOperand: TExpressionNode; + FieldDesc: TFieldDesc; // used only when TExpressionType = ntField + Value: variant; + end; + + TBlob = class; + +{ TData } + + TUpdateRecKind = (ukUpdate, ukInsert, ukDelete); + TOnModifyRecord = procedure of object; + TOnApplyRecord = procedure (UpdateKind: TUpdateRecKind; var Action: TUpdateRecAction; LastItem: boolean) of object; + + TOnGetCachedFields = procedure of object; + TOnGetCachedBuffer = procedure(Buffer: IntPtr; Source: IntPtr = nil) of object; + + TData = class + private + FRecordSize: longint; // FDataSize + TIndicatorSize + FCalcRecordSize: longint; + FCachedUpdates: boolean; + FOnAppend: TOnModifyRecord; + FOnDelete: TOnModifyRecord; + FOnUpdate: TOnModifyRecord; + FOnApplyRecord: TOnApplyRecord; + FAutoInitFields: boolean; // initialization fields by InternalInitField + FTrimFixedChar: boolean; + FTrimVarChar: boolean; + + { Filter } + FFilterFunc: TFilterFunc; + FFilterMDFunc: TFilterFunc; + FFilterText: string; + FFilterCaseInsensitive: boolean; + FFilterNoPartialCompare: boolean; + FFilterItemTypes: TItemTypes; + + Parser: TBoolParser; + Code: integer; + StrLexem: string; + FilterExpression: TExpressionNode; + FirstAlloc: TExpressionNode; + FilterRecBuf: IntPtr; + + /// if False then PutField set Null for string fields with empty value ('') + FEnableEmptyStrings: boolean; + FHasComplexFields: boolean; + FSparseArrays: boolean; + + FOnGetCachedFields: TOnGetCachedFields; + FOnGetCachedBuffer: TOnGetCachedBuffer; + + procedure FilterError; + function AllocNode: TExpressionNode; + function OrExpr: TExpressionNode; + function AndExpr: TExpressionNode; + function Condition: TExpressionNode; + function Argument: TExpressionNode; + + procedure CreateFilterExpression(Text: string); + procedure FreeFilterExpression; + + function Eval(Node: TExpressionNode): boolean; + + function GetFieldCount: word; + procedure SetCachedUpdates(Value: boolean); + protected + FRecordNoOffset: integer; + + FRecordCount: longint; + FBOF: boolean; + FEOF: boolean; + DataSize: longint; // size of data + CalcDataSize: longint; + + FFields: TFieldDescs; + + StringHeap: TStringHeap; + + { Open/Close } + procedure InternalPrepare; virtual; + procedure InternalUnPrepare; virtual; + procedure InternalOpen; virtual; + procedure InternalClose; virtual; + + { Data } + procedure InitData; virtual; + procedure FreeData; virtual; + + { Fields } + procedure InternalInitFields; virtual; + procedure InitObjectFields(ObjectType: TObjectType; Parent: TFieldDesc); + function InternalGetObject(FieldNo: word; RecBuf: IntPtr): TSharedObject; + function GetArrayFieldName(ObjectType: TObjectType; ItemIndex: integer): string; virtual; + + function GetIndicatorSize: word; virtual; + + procedure GetChildFieldInfo(Field: TFieldDesc; var RootField: TFieldDesc; var AttrName: string); + procedure GetChildField(Field: TFieldDesc; RecBuf: IntPtr; Dest: IntPtr; var IsBlank: boolean); + procedure PutChildField(Field: TFieldDesc; RecBuf: IntPtr; Source: IntPtr); + + function NeedConvertEOL: boolean; virtual; + + { Records } + + { Navigation } + function GetEOF: boolean; virtual; + function GetBOF: boolean; virtual; + + function GetRecordCount: longint; virtual; + function GetRecordNo: longint; virtual; + procedure SetRecordNo(Value: longint); virtual; + + { Edit } + procedure InternalAppend(RecBuf: IntPtr); virtual; + procedure InternalDelete; virtual; + procedure InternalUpdate(RecBuf: IntPtr); virtual; + + property IndicatorSize: word read GetIndicatorSize; + + { Filter } + function Filtered: boolean; + procedure SetFilterText(Value: string); virtual; + + { CachedUpdates } + function GetUpdatesPending: boolean; virtual; + procedure SetFilterItemTypes(Value: TItemTypes); virtual; + + public + Active: boolean; + Prepared: boolean; + NewCacheRecBuf: IntPtr; + OldCacheRecBuf: IntPtr; + + property FieldCount: word read GetFieldCount; + property Fields: TFieldDescs read FFields; + property Bof: boolean read GetBOF; // EOF: for CB case sensivity + property Eof: boolean read GetEOF; + + constructor Create; + destructor Destroy; override; + + { Open/Close } + procedure Open; virtual; + procedure Close; virtual; + + procedure Prepare; virtual; + procedure UnPrepare; virtual; + + function IsFullReopen: boolean; virtual; + procedure Reopen; virtual; + + { Fields } + function GetFieldDescType: TFieldDescClass; virtual; + procedure InitFields; virtual; + procedure ClearFields; virtual; + procedure GetField(FieldNo: word; RecBuf: IntPtr; Dest: IntPtr; var IsBlank: boolean); + procedure GetFieldData(Field: TFieldDesc; RecBuf: IntPtr; Dest: IntPtr); virtual; + function GetFieldBuf(RecBuf: IntPtr; FieldDesc: TFieldDesc; var DataType: integer; var IsBlank, NativeBuffer: boolean): IntPtr; + procedure PutField(FieldNo: word; RecBuf: IntPtr; Source: IntPtr); + procedure PutFieldData(Field: TFieldDesc; RecBuf: IntPtr; Source: IntPtr); virtual; + function GetNull(FieldNo: word; RecBuf: IntPtr): boolean; virtual; + procedure SetNull(FieldNo: word; RecBuf: IntPtr; Value: boolean); virtual; + function GetNullByBlob(FieldNo: word; RecBuf: IntPtr): boolean; + + procedure GetFieldAsVariant(FieldNo: word; RecBuf: IntPtr; var Value: variant); virtual; + procedure PutFieldAsVariant(FieldNo: word; RecBuf: IntPtr; const Value: variant); virtual; + + procedure GetDateFromBuf(Buf: IntPtr; Offset: integer; Date: IntPtr; Format: TDateFormat); virtual; + procedure PutDateToBuf(Buf: IntPtr; Offset: integer; Date: IntPtr; Format: TDateFormat); virtual; + + function FindField(Name: string): TFieldDesc; + function FieldByName(Name: string): TFieldDesc; + + function IsBlobFieldType(DataType: word): boolean; virtual; // TBlob descendants - dtBlob, dtMemo etc + function IsComplexFieldType(DataType: word): boolean; virtual; // All supported complex field types (BlobFieldTypes, ExtFieldTypes and TSharedObject descendants (not BLOB)) + + function HasFields(FieldTypes: TFieldTypeSet): boolean; + function HasBlobFields: boolean; + function CheckHasComplexFields: boolean; + + { Records } + function AllocRecBuf(var RecBuf: IntPtr): IntPtr; + procedure FreeRecBuf(RecBuf: IntPtr); + + procedure InitRecord(RecBuf: IntPtr); + //procedure FreeRecord(RecBuf: pointer); + procedure GetRecord(RecBuf: IntPtr); virtual; abstract; + procedure GetNextRecord(RecBuf: IntPtr); virtual; abstract; + procedure GetPriorRecord(RecBuf: IntPtr); virtual; abstract; + procedure PutRecord(RecBuf: IntPtr); virtual; abstract; + procedure AppendRecord(RecBuf: IntPtr); virtual; abstract; + procedure AppendBlankRecord; + procedure InsertRecord(RecBuf: IntPtr); virtual; abstract; + procedure UpdateRecord(RecBuf: IntPtr); virtual; abstract; // Modify + procedure DeleteRecord; virtual; abstract; + + procedure EditRecord(RecBuf: IntPtr); + procedure PostRecord(RecBuf: IntPtr); + procedure CancelRecord(RecBuf: IntPtr); virtual; + + procedure CreateComplexFields(RecBuf: IntPtr; WithBlob: boolean); virtual; + procedure CreateComplexField(RecBuf: IntPtr; FieldIndex: integer; WithBlob: boolean); virtual; + procedure FreeComplexFields(RecBuf: IntPtr; WithBlob: boolean); virtual; + procedure CopyComplexFields(Source: IntPtr; Dest: IntPtr; WithBlob: boolean); virtual; // copy content ComplexFields + procedure AddRefComplexFields(RecBuf: IntPtr); virtual; + + { Navigation } + procedure SetToBegin; virtual; + procedure SetToEnd; virtual; + + { BookMarks } + procedure GetBookmark(Bookmark: PRecBookmark); virtual; + procedure SetToBookmark(Bookmark: PRecBookmark); virtual; + function BookmarkValid(Bookmark: PRecBookmark): boolean; virtual; + function CompareBookmarks(Bookmark1, Bookmark2: PRecBookmark): integer; virtual; + + { CachedUpdates } + function GetUpdateStatus: TItemStatus; virtual; + function GetUpdateResult: TUpdateRecAction; virtual; + + procedure SetCacheRecBuf(NewBuf: IntPtr; OldBuf: IntPtr); virtual; + procedure ApplyUpdates; virtual; + procedure CommitUpdates; virtual; + procedure CancelUpdates; virtual; + procedure RestoreUpdates; virtual; + procedure RevertRecord; virtual; + + procedure ApplyRecord(UpdateKind: TUpdateRecKind; var Action: TUpdateRecAction; LastItem: boolean); virtual; + + procedure GetOldRecord(RecBuf: IntPtr); virtual; // get rollback data + + { Filter } + procedure FilterUpdated; virtual; + + { Blobs } + function GetObject(FieldNo: word; RecBuf: IntPtr): TSharedObject; + procedure SetObject(FieldNo: word; RecBuf: IntPtr; Obj: TSharedObject); + function ReadBlob(FieldNo: word; RecBuf: IntPtr; Position: longint; + Count: longint; Dest: IntPtr; FromRollback: boolean = false; TrueUnicode: boolean = False): longint; + procedure WriteBlob(FieldNo: word; RecBuf: IntPtr; Position: longint; + Count: longint; Source: IntPtr; TrueUnicode: boolean = False); + procedure TruncateBlob(FieldNo: word; RecBuf: IntPtr; Size: longint; + TrueUnicode: boolean = False); + function GetBlobSize(FieldNo: word; RecBuf: IntPtr; FromRollback: boolean = false; + TrueUnicode: boolean = False): longint; + procedure SetBlobSize(FieldNo: word; RecBuf: IntPtr; NewSize: longint; FromRollback: boolean = false; + TrueUnicode: boolean = False); + + property RecordSize: longint read FRecordSize; + property CalcRecordSize: longint read FCalcRecordSize; + property RecordCount: longint read GetRecordCount;//FRecordCount; + property RecordNo: longint read GetRecordNo write SetRecordNo; + property CachedUpdates: boolean read FCachedUpdates write SetCachedUpdates default False; + property UpdatesPending: boolean read GetUpdatesPending; + property FilterFunc: TFilterFunc read FFilterFunc write FFilterFunc; + property FilterMDFunc: TFilterFunc read FFilterMDFunc write FFilterMDFunc; + property FilterText: string read FFilterText write SetFilterText; + property FilterCaseInsensitive: boolean read FFilterCaseInsensitive write FFilterCaseInsensitive; + property FilterNoPartialCompare: boolean read FFilterNoPartialCompare write FFilterNoPartialCompare; + property FilterItemTypes: TItemTypes read FFilterItemTypes write SetFilterItemTypes; + property AutoInitFields: boolean read FAutoInitFields write FAutoInitFields; + property TrimFixedChar: boolean read FTrimFixedChar write FTrimFixedChar; + property TrimVarChar: boolean read FTrimVarChar write FTrimVarChar; + + /// if False then PutField set Null for string fields with empty value ('') + property EnableEmptyStrings: boolean read FEnableEmptyStrings write FEnableEmptyStrings; + property SparseArrays: boolean read FSparseArrays write FSparseArrays; + + property OnAppend: TOnModifyRecord read FOnAppend write FOnAppend; + property OnDelete: TOnModifyRecord write FOnDelete; + property OnUpdate: TOnModifyRecord write FOnUpdate; + property OnApplyRecord: TOnApplyRecord write FOnApplyRecord; + property OnGetCachedFields: TOnGetCachedFields write FOnGetCachedFields; + property OnGetCachedBuffer: TOnGetCachedBuffer write FOnGetCachedBuffer; + property HasComplexFields: boolean read FHasComplexFields write FHasComplexFields; + end; + + TReorderOption = (roInsert,roDelete,roFull); + + TSortColumn = class + public + FieldDesc: TFieldDesc; + DescendingOrder: boolean; + CaseSensitive: boolean; + end; + + TSortColumns = class (TDAList) + private + function GetItems(Index: integer): TSortColumn; + + public + destructor Destroy; override; + + procedure Clear; override; + + property Items[Index: integer]: TSortColumn read GetItems; default; + end; + + TRecordNoCache = array of PItemHeader; + + TLocateExOption = (lxCaseInsensitive, lxPartialKey, lxNearest, lxNext, lxUp, lxPartialCompare{,lxCharCompare}); + TLocateExOptions = set of TLocateExOption; + + TMemData = class (TData) + private + Cache: TCacheItem; + LastCacheItem: TCacheItem; + FRefreshIteration: longint; + FIndexFieldNames: string; + FIndexFields: TSortColumns; + + FRecordNoCache: TRecordNoCache; + + { Sorting } + procedure UpdateIndexFields; + function CompareRecords(RecBuf1, RecBuf2: IntPtr): integer; + procedure Exchange(I, J: PItemHeader); + procedure MoveSortedRecord(Dir: integer); + procedure QuickSort(L, R, P: PItemHeader); + procedure ClearItemsOmittedStatus; + protected + FirstItem: PItemHeader; + LastItem: PItemHeader; + CurrentItem: PItemHeader; + + BlockMan: TBlockManager; + + { Items/Data } + function InsertItem: PItemHeader; + function AppendItem: PItemHeader; + procedure DeleteItem(Item: PItemHeader); + procedure RevertItem(Item: PItemHeader); + + procedure InitData; override; + procedure FreeData; override; + + procedure ReorderItems(Item: PItemHeader; ReorderOption: TReorderOption); + + { Navigation } + function GetEOF: boolean; override; + function GetBOF: boolean; override; + + function GetRecordCount: longint; override; + function GetRecordNo: longint; override; + procedure SetRecordNo(Value: longint); override; + + { Fetch } + function Fetch(FetchBack: boolean = False): boolean; virtual; + procedure InitFetchedItems(FetchedItem: IntPtr; NoData, FetchBack: boolean); + + { Filter/Sorting } + {$IFNDEF CLR} + function InternalAnsiStrComp(const Value1, Value2: IntPtr; + const Options: TLocateExOptions): integer; virtual; + {$ENDIF} + function InternalAnsiCompareText(const Value1, Value2: string; + const Options: TLocateExOptions): integer; virtual; + function InternalWStrLComp(const Value1, Value2: WideString; + const Options: TLocateExOptions): integer; virtual; + function InternalWStrComp(const Value1, Value2: WideString; + const Options: TLocateExOptions): integer; virtual; + + function CompareStrValues(const Value: string; const FieldValue: string; const Options: TLocateExOptions): integer; virtual; + function CompareWideStrValues(const Value: WideString; const FieldValue: WideString; const Options: TLocateExOptions): integer; virtual; + function CompareBinValues(const Value: IntPtr; const ValueLen: integer; const FieldValue: IntPtr; const FieldValueLen: integer; const Options: TLocateExOptions): integer; + + { Edit } + procedure AddCacheItem(CacheItem: TCacheItem); + + { CachedUpdates } + function GetUpdatesPending: boolean; override; + procedure SetFilterItemTypes(Value: TItemTypes); override; + + public + constructor Create; + destructor Destroy; override; + + { Open/Close } + procedure Open; override; + procedure Reopen; override; + + { Fields } + procedure InitFields; override; + procedure ClearFields; override; + + { Records } + procedure GetRecord(RecBuf: IntPtr); override; + procedure GetNextRecord(RecBuf: IntPtr); override; + procedure GetPriorRecord(RecBuf: IntPtr); override; + procedure PutRecord(RecBuf: IntPtr); override; + procedure AppendRecord(RecBuf: IntPtr); override; + procedure InsertRecord(RecBuf: IntPtr); override; + procedure UpdateRecord(RecBuf: IntPtr); override; + procedure DeleteRecord; override; + procedure AddRecord(RecBuf: IntPtr); + procedure RemoveRecord; // remove record from memory + + + function OmitRecord(Item: PItemHeader): boolean; + procedure UpdateCachedBuffer(FItem, LItem: PItemHeader); // FItem and LItem can be nil. In this case FirstItem and LastItem used + + { Navigation } + procedure SetToBegin; override; + procedure SetToEnd; override; + procedure PrepareRecNoCache; + + { BookMarks } + procedure GetBookmark(Bookmark: PRecBookmark); override; + procedure SetToBookmark(Bookmark: PRecBookmark); override; + function BookmarkValid(Bookmark: PRecBookmark): boolean; override; + function CompareBookmarks(Bookmark1, Bookmark2: PRecBookmark): integer; override; + + { CachedUpdates } + function GetUpdateStatus: TItemStatus; override; + function GetUpdateResult: TUpdateRecAction; override; + + procedure SetCacheRecBuf(NewBuf: IntPtr; OldBuf: IntPtr); override; + procedure ApplyUpdates; override; + procedure CommitUpdates; override; + procedure CancelUpdates; override; + procedure RestoreUpdates; override; + procedure RevertRecord; override; + + procedure GetOldRecord(RecBuf: IntPtr); override; + + { Filter } + function CompareFieldValue(ValuePtr: IntPtr; const ValueType: integer; FieldDesc: TFieldDesc; RecBuf: IntPtr; const Options: TLocateExOptions): integer; virtual; + function CompareFields(RecBuf1: IntPtr; RecBuf2: IntPtr; SortColumn: TSortColumn): integer; overload; virtual; + function CompareFields(RecBuf1: IntPtr; RecBuf2: IntPtr; FieldDesc: TFieldDesc; Options: TLocateExOptions = []): integer; overload; virtual; + procedure FilterUpdated; override; + + { Sorting } + procedure SetIndexFieldNames(Value: string); virtual; + procedure SortItems; virtual; + + property IndexFields: TSortColumns read FIndexFields; + end; + +{ TBlob } + +{$IFDEF CLR} + PPieceHeader = packed record + private + Ptr: IntPtr; + + function GetBlob: integer; + procedure SetBlob(Value: integer); + function GetSize: cardinal; + procedure SetSize(Value: cardinal); + function GetUsed: cardinal; + procedure SetUsed(Value: cardinal); + function GetPrev: PPieceHeader; + procedure SetPrev(Value: PPieceHeader); + function GetNext: PPieceHeader; + procedure SetNext(Value: PPieceHeader); + + public + property Blob: integer read GetBlob write SetBlob; + property Size: cardinal read GetSize write SetSize; + property Used: cardinal read GetUsed write SetUsed; + property Prev: PPieceHeader read GetPrev write SetPrev; + property Next: PPieceHeader read GetNext write SetNext; + + class operator Implicit(AValue: IntPtr): PPieceHeader; + class operator Implicit(AValue: PPieceHeader): IntPtr; + class operator Implicit(AValue: PPieceHeader): integer; + class operator Equal(ALeft, ARight: PPieceHeader): boolean; + end; +{$ELSE} + PPieceHeader = ^TPieceHeader; +{$ENDIF} + TPieceHeader = packed record + Blob: integer; + Size: cardinal; + Used: cardinal; // offest 8 uses GetUsedPtr + Prev: PPieceHeader; + Next: PPieceHeader; + Test: word; // DEBUG + end; + + TBlob = class (TSharedObject) + protected + FIsUnicode: boolean; + + FFirstPiece: PPieceHeader; + FNeedRollback: boolean; + Rollback: TBlob; + + // Used to detect a need to write LOB parameters before executing statement + FModified: boolean; + + function GetAsString: string; virtual; + procedure SetAsString(Value: string); virtual; + + function GetAsWideString: WideString; virtual; + procedure SetAsWideString(Value: WideString); virtual; + + procedure AddCRUnicode; + procedure RemoveCRUnicode; + procedure AddCRString; + procedure RemoveCRString; + + procedure CheckValid; // DEBUG + procedure CheckCached; + + procedure CheckValue; virtual; + + procedure SaveToRollback; virtual; + + function GetDataSize: cardinal; // sum of pieces.used + function GetSize: cardinal; virtual; // if uncompressed then equal to GetDataSize else uncompressed size + procedure SetSize(Value: cardinal); virtual; + procedure SetIsUnicode(Value: boolean); virtual; + procedure InternalClear; + + { Unicode to Ansi conversion methods } + function TranslatePosition(Position: integer): integer; // Ansi to Unicode + function GetSizeAnsi: integer; + + public + PieceSize: cardinal; + Test: byte; // DEBUG + + constructor Create(IsUnicode: boolean = False); + destructor Destroy; override; + + { Pieces } + procedure AllocPiece(var Piece: PPieceHeader; Size: cardinal); + procedure ReallocPiece(var Piece: PPieceHeader; Size: cardinal); + procedure FreePiece(Piece: PPieceHeader); + procedure AppendPiece(Piece: PPieceHeader); + procedure DeletePiece(Piece: PPieceHeader); + procedure CompressPiece(var Piece: PPieceHeader); + + function FirstPiece: PPieceHeader; + + function Read(Position: cardinal; Count: cardinal; Dest: IntPtr): cardinal; virtual; + procedure Write(Position: cardinal; Count: cardinal; Source: IntPtr); virtual; + procedure Clear; virtual; + procedure Truncate(NewSize: cardinal); virtual; + procedure Compress; + procedure Defrag; virtual; // Move all data to first piece + procedure AddCR; + procedure RemoveCR; + + { Stream/File } + + procedure LoadFromStream(Stream: TStream); virtual; + procedure SaveToStream(Stream: TStream); virtual; + + procedure LoadFromFile(const FileName: string); + procedure SaveToFile(const FileName: string); + + procedure Assign(Source: TBlob); + + { Rollback } + procedure EnableRollback; + procedure Commit; virtual; + procedure Cancel; virtual; + function CanRollback: boolean; + + property Size: cardinal read GetSize write SetSize; + property AsString: string read GetAsString write SetAsString; + property AsWideString: WideString read GetAsWideString write SetAsWideString; + property IsUnicode: boolean read FIsUnicode write SetIsUnicode; + property Modified: boolean read FModified; + end; + +const +{$IFDEF CLR} + DefaultPieceSize: longint = 64*1024 - 22; +{$ELSE} + DefaultPieceSize: longint = 64*1024 - sizeof(TPieceHeader); +{$ENDIF} + +type + TBlobUtils = class + public + class procedure SetModified(Blob: TBlob; Value: boolean); + end; + +{$IFDEF HAVE_COMPRESS} + +{ TCompressedBlob } + +const + CCompressBlobHeaderGuidSize = 16; + CCompressBlobHeaderSize = CCompressBlobHeaderGuidSize{guid} + SizeOf(Integer){uncompressed size}; + CCompressBlobHeaderGuid: array [0..CCompressBlobHeaderGuidSize - 1] of byte = ($39, $8C, $9D, $F1, $58, $55, $49, $38, $A6, $52, $87, $CE, $E0, $C6, $DA, $7E); + +type + TCompressBlobMode = ( + cbNone, // uncompressed (default) + cbClient, // store compressed data on client. Save client memory. Other apps can read and write BLOBs on server + cbServer, // store compressed data on server. Save server memory. Other apps can NOT read and write BLOBs on server + cbClientServer // store compressed data on client and server. + ); + + TCompressedBlob = class(TBlob) + protected + function GetCompressed: boolean; + procedure SetCompressed(Value: boolean); + function UnCompressedSize: cardinal; + + function GetSize: cardinal; override; + procedure SetSize(Value: cardinal); override; + function GetCompressedSize: cardinal; + procedure SaveToRollback; override; + + function CompressFrom(source: IntPtr; const sourceLen: longint): boolean; + procedure UncompressTo(dest: IntPtr; var destlen: integer); + + public + function Read(Position: cardinal; Count: cardinal; Dest: IntPtr): cardinal; override; + procedure Write(Position: cardinal; Count: cardinal; Source: IntPtr); override; + procedure Truncate(NewSize: cardinal); override; + property Compressed: boolean read GetCompressed write SetCompressed; + property CompressedSize: cardinal read GetCompressedSize; + end; +{$ELSE} +type + TCompressedBlob = class(TBlob); +{$ENDIF} + +{ TVariantObject } + + TVariantObject = class (TSharedObject) + private + FValue: Variant; + + public + property Value: Variant read FValue write FValue; + end; + + function NextPiece(Piece: PPieceHeader): PPieceHeader; + function PieceData(Piece: PPieceHeader): IntPtr; + function PieceUsedPtr(Piece: PPieceHeader): IntPtr; + + procedure DataError(Msg: string); + +const + MaxArrayItem: integer = 100; // Max count of fields from array type + +{$IFDEF CRDEBUG} + ShareObjectCnt: integer = 0; +{$ENDIF} + + varDecimal = $000E; + varLongWord = $0013; +{$IFNDEF VER6P} + varInt64 = $0014; + +type + TVarDataD6 = packed record // TVarData from Delphi 6 + VType: word; + case Integer of + 0: (Reserved1: Word; + case Integer of + 0: (Reserved2, Reserved3: Word; + case Integer of + varLongWord: (VLongWord: LongWord); + varDecimal: (VInt64: Int64); + ); + ); + end; + +{$ENDIF} + +var + StartWaitProc: procedure; + StopWaitProc: procedure; + ApplicationTitleProc: function: string; +{$IFNDEF VER6P} + ApplicationHandleException: procedure (Sender: TObject) of object; +{$ENDIF} + +procedure StartWait; +procedure StopWait; +function ApplicationTitle: string; + +function AddCRString(Source, Dest: IntPtr; Count: integer): integer; overload; +function RemoveCRString(Source, Dest: IntPtr; DestLen, Count: integer): integer; overload; + +function AddCRUnicode(Source, Dest: IntPtr; Count: integer): integer; overload; +function RemoveCRUnicode(Source, Dest: IntPtr; DestLen, Count: integer): integer; overload; + +implementation +uses + DAConsts, SysUtils, Math; + +const + lxEqual = 1; + lxMore = lxEqual + 1; + lxLess = lxMore + 1; + lxMoreEqual = lxLess + 1; + lxLessEqual = lxMoreEqual + 1; + lxNoEqual = lxLessEqual + 1; + lxLeftBracket = lxNoEqual + 1; + lxRightBracket = lxLeftBracket + 1; + lxMinus = lxRightBracket + 1; + lxPlus = lxMinus + 1; + lxLeftSqBracket = lxPlus + 1; + lxRightSqBracket = lxLeftSqBracket + 1; + + lxAND = lxRightSqBracket + 1; + lxFALSE = lxAND + 1; + lxIS = lxFALSE + 1; + lxLIKE = lxIS + 1; + lxNOT = lxLIKE + 1; + lxNULL = lxNOT + 1; + lxOR = lxNULL + 1; + lxTRUE = lxOR + 1; + +var + BoolSymbolLexems, BoolKeywordLexems: TStringList; + RefreshIteration: longint; + +procedure DataError(Msg: string); +begin + raise Exception.Create(Msg); +end; + +procedure StartWait; +begin + if Assigned(StartWaitProc) then + StartWaitProc; +end; + +procedure StopWait; +begin + if Assigned(StopWaitProc) then + StopWaitProc; +end; + +function ApplicationTitle: string; +begin + if Assigned(ApplicationTitleProc) then + Result := ApplicationTitleProc + else + Result := ''; +end; + +{$IFDEF CLR} + +{ PBlockHeader } + +function PBlockHeader.GetItemCount: word; +begin + Result := Marshal.ReadInt16(Ptr); +end; + +procedure PBlockHeader.SetItemCount(Value: word); +begin + Marshal.WriteInt16(Ptr, Value); +end; + +function PBlockHeader.GetUsedItems: word; +begin + Result := Marshal.ReadInt16(Ptr, sizeof(word)); +end; + +procedure PBlockHeader.SetUsedItems(Value: word); +begin + Marshal.WriteInt16(Ptr, sizeof(word), Value); +end; + +function PBlockHeader.GetPrev: PBlockHeader; +begin + Result := Marshal.ReadIntPtr(Ptr, sizeof(word) * 2); +end; + +procedure PBlockHeader.SetPrev(Value: PBlockHeader); +begin + Marshal.WriteIntPtr(Ptr, sizeof(word) * 2, Value.Ptr); +end; + +function PBlockHeader.GetNext: PBlockHeader; +begin + Result := Marshal.ReadIntPtr(Ptr, sizeof(word) * 2 + sizeof(PBlockHeader)); +end; + +procedure PBlockHeader.SetNext(Value: PBlockHeader); +begin + Marshal.WriteIntPtr(Ptr, sizeof(word) * 2 + sizeof(PBlockHeader), Value.Ptr); +end; + +class operator PBlockHeader.Implicit(AValue: IntPtr): PBlockHeader; +begin + Result.Ptr := AValue; +end; + +class operator PBlockHeader.Implicit(AValue: PBlockHeader): IntPtr; +begin + Result := AValue.Ptr; +end; + +class operator PBlockHeader.Implicit(AValue: PBlockHeader): integer; +begin + Result := AValue.Ptr.ToInt32; +end; + +class operator PBlockHeader.Equal(ALeft, ARight: PBlockHeader): boolean; +begin + Result := ALeft.Ptr = ARight.Ptr; +end; + +{ PItemHeader } + +function PItemHeader.GetBlock: PBlockHeader; +begin + Result := Marshal.ReadIntPtr(Ptr); +end; + +procedure PItemHeader.SetBlock(Value: PBlockHeader); +begin + Marshal.WriteIntPtr(Ptr, Value.Ptr); +end; + +function PItemHeader.GetPrev: PItemHeader; +begin + Result := Marshal.ReadIntPtr(Ptr, sizeof(PBlockHeader)); +end; + +procedure PItemHeader.SetPrev(Value: PItemHeader); +begin + Marshal.WriteIntPtr(Ptr, sizeof(PBlockHeader), Value.Ptr); +end; + +function PItemHeader.GetNext: PItemHeader; +begin + Result := Marshal.ReadIntPtr(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader)); +end; + +procedure PItemHeader.SetNext(Value: PItemHeader); +begin + Marshal.WriteIntPtr(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader), Value.Ptr); +end; + +function PItemHeader.GetRollback: PItemHeader; +begin + Result := Marshal.ReadIntPtr(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 2); +end; + +procedure PItemHeader.SetRollback(Value: PItemHeader); +begin + Marshal.WriteIntPtr(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 2, Value.Ptr); +end; + +function PItemHeader.GetStatus: TItemStatus; +begin + Result := TItemStatus(Marshal.ReadByte(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 3)); +end; + +procedure PItemHeader.SetStatus(Value: TItemStatus); +begin + Marshal.WriteByte(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 3, byte(Value)); +end; + +function PItemHeader.GetUpdateResult: TUpdateRecAction; +begin + Result := TUpdateRecAction(Marshal.ReadByte(Ptr, sizeof(PBlockHeader) + + sizeof(PItemHeader) * 3 + sizeof(TItemStatus))); +end; + +procedure PItemHeader.SetUpdateResult(Value: TUpdateRecAction); +begin + Marshal.WriteByte(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 3 + + sizeof(TItemStatus), byte(Value)); +end; + +function PItemHeader.GetOrder: longint; +begin + Result := Marshal.ReadInt32(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 3 + + sizeof(TItemStatus) + sizeof(TUpdateRecAction)); +end; + +procedure PItemHeader.SetOrder(Value: longint); +begin + Marshal.WriteInt32(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 3 + + sizeof(TItemStatus) + sizeof(TUpdateRecAction), Value); +end; + +function PItemHeader.GetFlag: byte; +begin + Result := Marshal.ReadByte(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 3 + + sizeof(TItemStatus) + sizeof(TUpdateRecAction) + sizeof(longint)); +end; + +procedure PItemHeader.SetFlag(Value: byte); +begin + Marshal.WriteByte(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 3 + + sizeof(TItemStatus) + sizeof(TUpdateRecAction) + sizeof(longint), Value); +end; + +function PItemHeader.GetFilterResult: TItemFilterState; +begin + Result := TItemFilterState(Marshal.ReadByte(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 3 + + sizeof(TItemStatus) + sizeof(TUpdateRecAction) + sizeof(longint) + + SizeOf(byte))); +end; + +procedure PItemHeader.SetFilterResult(Value: TItemFilterState); +begin + Marshal.WriteByte(Ptr, sizeof(PBlockHeader) + sizeof(PItemHeader) * 3 + + sizeof(TItemStatus) + sizeof(TUpdateRecAction) + sizeof(longint) + + SizeOf(byte), Byte(Value)); +end; + +class operator PItemHeader.Implicit(AValue: IntPtr): PItemHeader; +begin + Result.Ptr := AValue; +end; + +class operator PItemHeader.Implicit(AValue: PItemHeader): IntPtr; +begin + Result := AValue.Ptr; +end; + +class operator PItemHeader.Implicit(AValue: PItemHeader): integer; +begin + Result := AValue.Ptr.ToInt32; +end; + +class operator PItemHeader.Equal(ALeft, ARight: PItemHeader): boolean; +begin + Result := ALeft.Ptr = ARight.Ptr; +end; + +{ PRecBookmark } + +function PRecBookmark.GetRefreshIteration: longint; +begin + Result := Marshal.ReadInt32(Ptr); +end; + +procedure PRecBookmark.SetRefreshIteration(Value: longint); +begin + Marshal.WriteInt32(Ptr, Value); +end; + +function PRecBookmark.GetItem: PItemHeader; +begin + Result := Marshal.ReadIntPtr(Ptr, sizeof(longint)); +end; + +procedure PRecBookmark.SetItem(Value: PItemHeader); +begin + Marshal.WriteIntPtr(Ptr, sizeof(longint), Value); +end; + +function PRecBookmark.GetOrder: longint; +begin + Result := Marshal.ReadInt32(Ptr, sizeof(longint) + sizeof(PItemHeader)); +end; + +procedure PRecBookmark.SetOrder(Value: longint); +begin + Marshal.WriteInt32(Ptr, sizeof(longint) + sizeof(PItemHeader), Value); +end; + +class operator PRecBookmark.Implicit(AValue: IntPtr): PRecBookmark; +begin + Result.Ptr := AValue; +end; + +class operator PRecBookmark.Implicit(AValue: PRecBookmark): IntPtr; +begin + Result := AValue.Ptr; +end; + +class operator PRecBookmark.Implicit(AValue: integer): PRecBookmark; +begin + Result.Ptr := IntPtr(AValue); +end; + +{ PPieceHeader } + +function PPieceHeader.GetBlob: integer; +begin + Result := Marshal.ReadInt32(Ptr); +end; + +procedure PPieceHeader.SetBlob(Value: integer); +begin + Marshal.WriteInt32(Ptr, Value); +end; + +function PPieceHeader.GetSize: cardinal; +begin + Result := Marshal.ReadInt32(Ptr, sizeof(integer)); +end; + +procedure PPieceHeader.SetSize(Value: cardinal); +begin + Marshal.WriteInt32(Ptr, sizeof(integer), Value); +end; + +function PPieceHeader.GetUsed: cardinal; +begin + Result := Marshal.ReadInt32(Ptr, sizeof(integer) * 2); +end; + +procedure PPieceHeader.SetUsed(Value: cardinal); +begin + Marshal.WriteInt32(Ptr, sizeof(integer) * 2, Value); +end; + +function PPieceHeader.GetPrev: PPieceHeader; +begin + Result := Marshal.ReadIntPtr(Ptr, sizeof(integer) * 3); +end; + +procedure PPieceHeader.SetPrev(Value: PPieceHeader); +begin + Marshal.WriteIntPtr(Ptr, sizeof(integer) * 3, Value.Ptr); +end; + +function PPieceHeader.GetNext: PPieceHeader; +begin + Result := Marshal.ReadIntPtr(Ptr, sizeof(integer) * 3 + sizeof(PPieceHeader)); +end; + +procedure PPieceHeader.SetNext(Value: PPieceHeader); +begin + Marshal.WriteIntPtr(Ptr, sizeof(integer) * 3 + sizeof(PPieceHeader), Value.Ptr); +end; + +class operator PPieceHeader.Implicit(AValue: IntPtr): PPieceHeader; +begin + Result.Ptr := AValue; +end; + +class operator PPieceHeader.Implicit(AValue: PPieceHeader): IntPtr; +begin + Result := AValue.Ptr; +end; + +class operator PPieceHeader.Implicit(AValue: PPieceHeader): integer; +begin + Result := AValue.Ptr.ToInt32; +end; + +class operator PPieceHeader.Equal(ALeft, ARight: PPieceHeader): boolean; +begin + Result := ALeft.Ptr = ARight.Ptr; +end; +{$ENDIF} + +{ TFieldDesc } + +constructor TFieldDesc.Create; +begin + inherited; +end; + +destructor TFieldDesc.Destroy; +begin + if FObjectType <> nil then + FObjectType.Release; + + inherited; +end; + +function TFieldDesc.HasParent: boolean; +begin + Result := FParentField <> nil; +end; + +procedure TFieldDesc.Assign(FieldDesc:TFieldDesc); +begin + Name := FieldDesc.Name; + ActualName := FieldDesc.ActualName; + DataType := FieldDesc.DataType; + Length := FieldDesc.Length; + Scale := FieldDesc.Scale; + Size := FieldDesc.Size; + Offset := FieldDesc.Offset; + Required := FieldDesc.Required; + FieldNo := FieldDesc.FieldNo; +end; + +procedure TFieldDesc.SetObjectType(Value:TObjectType); +begin + if Value <> FObjectType then begin + if FObjectType <> nil then + FObjectType.Release; + + FObjectType := Value; + + if FObjectType <> nil then + FObjectType.AddRef; + end; +end; + +{ TFieldDescs } + +destructor TFieldDescs.Destroy; +begin + Clear; + + inherited; +end; + +procedure TFieldDescs.Clear; +var + i: integer; +begin + for i := 0 to Count - 1 do + if Items[i] <> nil then + TFieldDesc(Items[i]).Free; + + inherited Clear; +end; + +function TFieldDescs.FindField(Name: string):TFieldDesc; +var + i: integer; + ComplexField: boolean; + Found: boolean; +begin + Result := nil; + ComplexField := (Pos('.', Name) > 0) or (Pos('[', Name) > 0); + if not ComplexField then + for i := 0 to Count - 1 do + if (Items[i] <> nil) and (not TFieldDesc(Items[i]).HasParent) then begin + Found := AnsiCompareText(TFieldDesc(Items[i]).Name, Name) = 0; + + if Found then begin + Result := Items[i]; + Exit; + end; + end; + for i := 0 to Count - 1 do + if (Items[i] <> nil) then begin + Found := False; + if ComplexField then + Found := AnsiCompareText(TFieldDesc(Items[i]).ActualName, Name) = 0 + else + if (TFieldDesc(Items[i]).HasParent) then + Found := AnsiCompareText(TFieldDesc(Items[i]).Name, Name) = 0; + + if Found then begin + Result := Items[i]; + Exit; + end; + end; +end; + +function TFieldDescs.FieldByName(Name: string): TFieldDesc; +begin + Result := FindField(Name); + + if Result = nil then + raise Exception.Create(Format(SFieldNotFound, [Name])); +end; + +function TFieldDescs.GetItems(Index: integer): TFieldDesc; +begin + Result := TFieldDesc(inherited Items[Index]); +end; + +{ TAttribute } + +constructor TAttribute.Create; +begin + inherited; +end; + +destructor TAttribute.Destroy; +begin + if (FObjectType <> nil) and (FOwner.Name <> FObjectType.Name) then + FObjectType.Release; + + inherited; +end; + +procedure TAttribute.SetObjectType(Value:TObjectType); +begin + if Value <> FObjectType then begin + if FObjectType <> nil then + FObjectType.Release; + + FObjectType := Value; + + if (FObjectType <> nil) and (FOwner.Name <> FObjectType.Name) then + FObjectType.AddRef; + end; +end; + +{ TObjectType } + +constructor TObjectType.Create; +begin + inherited; + + FAttributes := TDAList.Create; +end; + +destructor TObjectType.Destroy; +begin + ClearAttributes; + FAttributes.Free; + + inherited; +end; + +{function TObjectType.AddAttribute:TAttribute; +begin + Result := TAttribute.Create; + FAttributes.Add(Result); +end;} + +procedure TObjectType.ClearAttributes; +var + i: integer; +begin + for i := 0 to FAttributes.Count - 1 do + TAttribute(FAttributes[i]).Free; + FAttributes.Clear; +end; + +function TObjectType.FindAttribute(Name: string):TAttribute; +var + St: string; + iPos,IndexPos: integer; + i: integer; + OType:TObjectType; +begin + Name := AnsiUpperCase(Name); + OType := Self; + + repeat + Name := TrimLeft(Name); + + iPos := Pos('.', Name); + IndexPos := Pos('[', Name); + if IndexPos = 1 then begin + i := Pos(']', Name); + if i = 0 then begin + Result := nil; + Exit; + end; + if (i + 1 <= Length(Name)) and (Name[i + 1] = '.') then + Inc(i); + + St := 'ELEMENT'; + Name := Copy(Name, i + 1, Length(Name)); + end + else + if (iPos > 0) and ((iPos < IndexPos) or (IndexPos = 0)) then begin + St := Copy(Name, 1, iPos - 1); + Name := Copy(Name, iPos + 1, Length(Name)); + end + else + if IndexPos > 0 then begin + St := Copy(Name, 1, IndexPos - 1); + Name := Copy(Name, IndexPos, Length(Name)); + end + else + St := Name; + + Result := nil; + for i := 0 to OType.AttributeCount - 1 do + if AnsiUpperCase(TAttribute(OType.Attributes[i]).Name) = St then begin + Result := OType.Attributes[i]; + break; + end; + + if (Result = nil) or not(Result.DataType in [dtObject,dtArray,dtTable,dtReference]) and + (iPos <> 0) + then begin + Result := nil; + Exit; + end; + + OType := Result.ObjectType; + until (iPos = 0) and ((IndexPos = 0) or (Name = '')); +end; + +function TObjectType.AttributeByName(Name: string):TAttribute; +begin + Result := FindAttribute(Name); + if Result = nil then + raise Exception.Create(Format(SAttributeNotFount, [Name])); +end; + +function TObjectType.GetAttributes(Index: integer):TAttribute; +begin + Result := TAttribute(FAttributes[Index]); +end; + +function TObjectType.GetAttributeCount: integer; +begin + Result := FAttributes.Count; +end; + +{ TDBObject } + +constructor TDBObject.Create; +begin + inherited; +end; + +procedure TDBObject.SetObjectType(Value:TObjectType); +begin + if FObjectType <> nil then + FObjectType.Release; + + FObjectType := Value; + + if FObjectType <> nil then + FObjectType.AddRef; +end; + +procedure TDBObject.GetAttributeValue(Name: string; Dest: IntPtr; var IsBlank: boolean); +begin + IsBlank := True; +end; + +procedure TDBObject.SetAttributeValue(Name: string; Source: IntPtr); +begin +end; + +{ TBoolParser } + +constructor TBoolParser.Create(const Text: string); +begin + inherited Create(Text); + + FSymbolLexems := BoolSymbolLexems; + FKeywordLexems := BoolKeywordLexems; +end; + +procedure TBoolParser.ToRightQuote(LeftQuote: Char); +begin + while (Pos <= TextLength) and (Text[Pos] <> LeftQuote) do begin + Inc(Pos); + if (Pos + 1 <= TextLength) and (Text[Pos] = '''') and (Text[Pos + 1] = '''') then + Inc(Pos, 2); + end; +end; + +{ TData } + +{$IFDEF CRDEBUG} +const + DataCnt: integer = 0; +{$ENDIF} + +constructor TData.Create; +begin + inherited; + + FEOF := True; + FBOF := True; + FFields := TFieldDescs.Create; + FAutoInitFields := True; + FEnableEmptyStrings := False; + +{$IFDEF CRDEBUG} Inc(DataCnt); {$ENDIF} + StringHeap := TStringHeap.Create; +end; + +destructor TData.Destroy; +begin + Close; + + ClearFields; + FFields.Free; + StringHeap.Free; + + inherited; + +{$IFDEF CRDEBUG} Dec(DataCnt); {$ENDIF} +end; + +{ Data } + +procedure TData.InitData; +begin + FBOF := True; + FEOF := True; + FRecordCount := 0; + FRecordNoOffset := 0; +end; + +procedure TData.FreeData; +begin + InitData; +end; + +{ Open / Close } + +procedure TData.InternalPrepare; +begin +end; + +procedure TData.Prepare; +begin + InternalPrepare; + Prepared := True; // lost connection +end; + +procedure TData.InternalUnPrepare; +begin +end; + +procedure TData.UnPrepare; +begin + if Prepared then begin + Prepared := False; + if FAutoInitFields then + ClearFields; + InternalUnPrepare; + end; +end; + +procedure TData.InternalOpen; +begin +end; + +procedure TData.Open; +begin + if not Active then begin + InitData; + try + InternalOpen; + CreateFilterExpression(FFilterText); // ??? + except + FreeData; + FreeFilterExpression; + raise; + end; + + Active := True; + end; +end; + +procedure TData.InternalClose; +begin +end; + +procedure TData.Close; +begin + try + if Active then + InternalClose; + finally + Active := False; + FreeData; // FreeData after for multithreads + + if FAutoInitFields and not Prepared then // After FreeData! + ClearFields; + + FreeFilterExpression; + end; +end; + +function TData.IsFullReopen: boolean; +begin + Result := True; +end; + +procedure TData.Reopen; +begin + Close; + Open; +end; + +{ Field } + +function TData.GetFieldCount: word; +begin + Result := FFields.Count; +end; + +function TData.GetIndicatorSize: word; +begin + Result := FieldCount; +end; + +function TData.GetFieldDescType: TFieldDescClass; +begin + Result := TFieldDesc; +end; + +procedure TData.InternalInitFields; +begin +end; + +function TData.GetArrayFieldName(ObjectType: TObjectType; ItemIndex: integer): string; +begin + Result := '[' + IntToStr(ItemIndex) + ']'; +end; + +procedure TData.InitObjectFields(ObjectType:TObjectType; Parent: TFieldDesc); +var + i: integer; + Field:TFieldDesc; + Item,CountItem: integer; +begin + if (ObjectType.DataType in [dtObject,dtTable]) or FSparseArrays then + CountItem := 1 + else begin + CountItem := ObjectType.Size; + if CountItem > MaxArrayItem then // Restriction of array length + CountItem := MaxArrayItem; + end; + + for i := 0 to ObjectType.AttributeCount - 1 do begin + for Item := 0 to CountItem - 1 do begin + Field := GetFieldDescType.Create; + Field.ParentField := Parent; + if ObjectType.DataType in [dtObject,dtTable] then begin + Field.Name := ObjectType.Attributes[i].Name; + if Parent = nil then + Field.ActualName := Field.Name + else + Field.ActualName := Parent.ActualName + '.' + Field.Name; + end + else begin + Field.Name := GetArrayFieldName(ObjectType, Item); + if Parent = nil then + Field.ActualName := Field.Name + else + Field.ActualName := Parent.ActualName + Field.Name; + end; + + Field.DataType := ObjectType.Attributes[i].DataType; + Field.Size := 0;// ObjectType.Attributes[i].Size; + Field.Fixed := ObjectType.Attributes[i].Fixed; + Field.Length := ObjectType.Attributes[i].Length; + Field.FieldNo := FFields.Count + 1; + Field.ObjectType := ObjectType.Attributes[i].ObjectType; + if Parent <> nil then + Field.ReadOnly := Parent.ReadOnly; + FFields.Add(Field); + + if Field.DataType in [dtObject,dtArray] then + InitObjectFields(Field.ObjectType, Field); + end; + end; +end; + +function CompareAlias(Field1, Field2: {$IFDEF CLR}TObject{$ELSE}pointer{$ENDIF}): integer; +begin + if Field1 = Field2 then + Result := 0 + else begin + Result := AnsiCompareText(TFieldDesc(Field1).Name, TFieldDesc(Field2).Name); + if Result = 0 then begin + Result := TFieldDesc(Field1).FieldNo - TFieldDesc(Field2).FieldNo; + TFieldDesc(Field1).FReserved := True; + TFieldDesc(Field2).FReserved := True; + end; + end +end; + +procedure TData.InitFields; +var + i: integer; + + // perfomance optimization for many fields set aliases + procedure InitAliases; + var + AliasNum, AliasLen: integer; + AFields: TDAList; + i: integer; + s: string; + + procedure ReplaceNextOriginalNames(StartName: string; StartInd: integer); + var + i, Res: integer; + AliasNum: integer; + S: string; + begin + AliasNum := 1; + for i := StartInd to AFields.Count - 1 do begin + S := TFieldDesc(AFields[i]).Name; + Res := AnsiCompareTextS(StartName, S); + if (Res < 0) then + break; + if (Res = 0) then begin + TFieldDesc(AFields[i]).Name := S + '_' + IntToStr(AliasNum); + Inc(AliasNum); + ReplaceNextOriginalNames(TFieldDesc(AFields[i]).Name, i + 1); + end; + end; + end; + begin + AFields := TDAList.Create; + try + AFields.Capacity := FFields.Capacity; + for i := 0 to FFields.Count - 1 do + if (FFields[i] <> nil) and (TFieldDesc(FFields[i]).ParentField = nil) then + AFields.Add(FFields[i]); + + AFields.Sort(CompareAlias); + AliasNum := 0; + for i := 0 to AFields.Count - 1 do + if (TFieldDesc(AFields[i]).FReserved) or (TFieldDesc(AFields[i]).Name = '') then begin + if (AliasNum > 1) then begin + s := TFieldDesc(AFields[i-1]).Name; + AliasLen := 1 {'_'} + Length(IntToStr((AliasNum - 1))); + SetLength(s, Length(s) - AliasLen); + if (AnsiCompareText(s, TFieldDesc(AFields[i]).Name) <> 0) then + AliasNum := 0; + end; + if (AliasNum <> 0) or (TFieldDesc(AFields[i]).Name = '') then begin + TFieldDesc(AFields[i]).Name := TFieldDesc(AFields[i]).Name + '_' + IntToStr(AliasNum); + ReplaceNextOriginalNames(TFieldDesc(AFields[i]).Name, i + 1); + end; + Inc(AliasNum); + end else + AliasNum := 0; + finally + AFields.Free; + end; + end; + +var + Off, AlignOff: integer; + FieldDesc: TFieldDesc; +begin + if FAutoInitFields then begin + ClearFields; + InternalInitFields; + if Assigned(FOnGetCachedFields) then + FOnGetCachedFields(); + InitAliases; + end; + + DataSize := 0; + CalcDataSize := 0; + for i := 0 to FieldCount - 1 do + if Fields[i].FieldDescKind <> fdkCalculated then begin + FieldDesc := Fields[i]; + FieldDesc.Offset := DataSize; + + if FieldDesc.DataType = dtWideString then begin + Off := FieldDesc.Offset; + AlignOff := Off and 1; // Fields[i].Offset mod 2; + FieldDesc.Offset := Off + AlignOff; // align WideString field offset + end + else + AlignOff := 0; + + DataSize := DataSize + FieldDesc.Size + AlignOff; + end; + + FRecordSize := DataSize + IndicatorSize; + FRecordSize := FRecordSize + (FRecordSize + 1) mod 2; //align + + for i := 0 to FieldCount - 1 do + if Fields[i].FieldDescKind = fdkCalculated then begin + FieldDesc := Fields[i]; + FieldDesc.Offset := FRecordSize + CalcDataSize; + + if FieldDesc.DataType = dtWideString then begin + Off := FieldDesc.Offset; + AlignOff := Off and 1; // Fields[i].Offset mod 2; + FieldDesc.Offset := Off + AlignOff; // align WideString field offset + end + else + AlignOff := 0; + + CalcDataSize := CalcDataSize + FieldDesc.Size + AlignOff; + end; + + FCalcRecordSize := CalcDataSize; + if FCalcRecordSize > 0 then + FCalcRecordSize := FCalcRecordSize + (FCalcRecordSize + 1) mod 2; //align + CheckHasComplexFields; +end; + +procedure TData.ClearFields; +begin + FFields.Clear; +end; + +procedure TData.GetDateFromBuf(Buf: IntPtr; Offset: integer; Date: IntPtr; Format: TDateFormat); +var + DateTime: double; +begin + DateTime := BitConverter.Int64BitsToDouble(Marshal.ReadInt64(Buf, Offset)); + case Format of + dfMSecs: begin + DateTime := TimeStampToMSecs(DateTimeToTimeStamp(DateTime)); + Marshal.WriteInt64(Date, BitConverter.DoubleToInt64Bits(DateTime)); + end; + dfDateTime: + Marshal.WriteInt64(Date, BitConverter.DoubleToInt64Bits(DateTime)); + dfDate: + Marshal.WriteInt32(Date, DateTimeToTimeStamp(DateTime).Date); + dfTime: + Marshal.WriteInt32(Date, DateTimeToTimeStamp(DateTime).Time); + end; +end; + +procedure TData.PutDateToBuf(Buf: IntPtr; Offset: integer; Date: IntPtr; Format: TDateFormat); +var + Ts: TTimeStamp; + DateTime: TDateTime; +begin + case Format of + dfMSecs: begin + {$IFDEF CLR} + DateTime := MemUtils.TimeStampToDateTime(MSecsToTimeStamp(Trunc(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(Date))))); + {$ELSE} + DateTime := MemUtils.TimeStampToDateTime(MSecsToTimeStamp(TDateTime(Date^))); + {$ENDIF} + Marshal.WriteInt64(Buf, Offset, BitConverter.DoubleToInt64Bits(DateTime)); + end; + dfDateTime: + Marshal.WriteInt64(Buf, Offset, Marshal.ReadInt64(Date)); + dfDate: begin + Ts.Date := Marshal.ReadInt32(Date); + Ts.Time := 0; + Marshal.WriteInt64(Buf, Offset, BitConverter.DoubleToInt64Bits(MemUtils.TimeStampToDateTime(Ts))); + end; + dfTime: begin + Ts.Date := DateDelta; + Ts.Time := Marshal.ReadInt32(Date); + Marshal.WriteInt64(Buf, Offset, BitConverter.DoubleToInt64Bits(MemUtils.TimeStampToDateTime(Ts))); + end; + end; +end; + +procedure TData.GetChildFieldInfo(Field: TFieldDesc; var RootField: TFieldDesc; var AttrName: string); +begin + AttrName := ''; + repeat + if AttrName = '' then + AttrName := Field.Name + else + if Field.DataType = dtArray then + AttrName := Field.Name + AttrName + else + AttrName := Field.Name + '.' + AttrName; + Field := Field.ParentField; + until not Field.HasParent; + RootField := Field; +end; + +procedure TData.GetChildField(Field: TFieldDesc; RecBuf: IntPtr; Dest: IntPtr; var IsBlank: boolean); +var + DBObject: IntPtr; + AttrName: string; +begin + GetChildFieldInfo(Field, Field, AttrName); + DBObject := Marshal.ReadIntPtr(RecBuf, Field.Offset); + if DBObject <> nil then + TDBObject(GetGCHandleTarget(DBObject)).GetAttributeValue(AttrName, Dest, IsBlank) + else + IsBlank := True; +end; + +procedure TData.PutChildField(Field: TFieldDesc; RecBuf: IntPtr; Source: IntPtr); +var + DBObject: IntPtr; + AttrName: string; +begin + GetChildFieldInfo(Field, Field, AttrName); + DBObject := Marshal.ReadIntPtr(RecBuf, Field.Offset); + if DBObject <> nil then + TDBObject(GetGCHandleTarget(DBObject)).SetAttributeValue(AttrName, Source); +end; + +const + CRLF = $0A0D; + LF = $0A; + CRLF_UTF16 = $000A000D; + LF_UTF16 = $000A; + +function AddCRString(Source, Dest: IntPtr; Count: integer): integer; +var + SourceEnd: IntPtr; + w: word; + b: byte; +begin + Result := Count; + SourceEnd := IntPtr(Integer(Source) + Count); + while Integer(Source) < Integer(SourceEnd) do begin + w := Marshal.ReadInt16(Source); + if w = CRLF then begin + Marshal.WriteInt16(Dest, w); + Source := IntPtr(Integer(Source) + 2); + Dest := IntPtr(Integer(Dest) + 2); + end + else begin + b := Byte(w); + if b = 0 then begin + Dec(Result, Integer(SourceEnd) - Integer(Source)); + break; + end + else + if b = LF then begin + Marshal.WriteInt16(Dest, CRLF); + Source := IntPtr(Integer(Source) + 1); + Dest := IntPtr(Integer(Dest) + 2); + Inc(Result); + end + else begin + Marshal.WriteByte(Dest, b); + Source := IntPtr(Integer(Source) + 1); + Dest := IntPtr(Integer(Dest) + 1); + end; + end; + end; + Marshal.WriteByte(Dest, 0); +end; + +function RemoveCRString(Source, Dest: IntPtr; DestLen, Count: integer): integer; +var + SourceEnd: IntPtr; + DestStart: IntPtr; + w: word; +begin + Result := Count; + SourceEnd := IntPtr(Integer(Source) + Count); + DestStart := Dest; + while (Integer(Source) < Integer(SourceEnd)) and (Integer(Dest) - Integer(DestStart) < DestLen) do begin + w := Marshal.ReadInt16(Source); + if w = CRLF then begin + Marshal.WriteByte(Dest, LF); + Source := IntPtr(Integer(Source) + 2); + Dec(Result); + Dest := IntPtr(Integer(Dest) + 1); + end + else + begin + Marshal.WriteByte(Dest, Byte(w)); + Source := IntPtr(Integer(Source) + 1); + Dest := IntPtr(Integer(Dest) + 1); + end; + end; + Marshal.WriteByte(Dest, 0); +end; + +function AddCRUnicode(Source, Dest: IntPtr; Count: integer): integer; +var + SourceEnd: IntPtr; + w: LongWord; + b: word; +begin + Result := Count; + SourceEnd := IntPtr(Integer(Source) + Count * 2); + while Integer(Source) < Integer(SourceEnd) do begin + w := Marshal.ReadInt32(Source); + if w = CRLF_UTF16 then begin + Marshal.WriteInt32(Dest, w); + Source := IntPtr(Integer(Source) + 4); + Dest := IntPtr(Integer(Dest) + 4); + end + else begin + b := Word(w); + if b = 0 then begin + Dec(Result, (Integer(SourceEnd) - Integer(Source)) div 2); + break; + end + else + if b = LF_UTF16 then begin + Marshal.WriteInt32(Dest, CRLF_UTF16); + Source := IntPtr(Integer(Source) + 2); + Dest := IntPtr(Integer(Dest) + 4); + Inc(Result); + end + else begin + Marshal.WriteInt16(Dest, b); + Source := IntPtr(Integer(Source) + 2); + Dest := IntPtr(Integer(Dest) + 2); + end; + end; + end; + Marshal.WriteInt16(Dest, 0); +end; + +function RemoveCRUnicode(Source, Dest: IntPtr; DestLen, Count: integer): integer; +var + SourceEnd: IntPtr; + DestStart: IntPtr; + w: LongWord; +begin + Result := Count; + SourceEnd := IntPtr(Integer(Source) + Count * 2); + DestStart := Dest; + while (Integer(Source) < Integer(SourceEnd)) and (Integer(Dest) - Integer(DestStart) < DestLen * 2) do begin + w := Marshal.ReadInt32(Source); + if w = CRLF_UTF16 then begin + Marshal.WriteInt16(Dest, LF_UTF16); + Source := IntPtr(Integer(Source) + 4); + Dec(Result); + Dest := IntPtr(Integer(Dest) + 2); + end + else + begin + Marshal.WriteInt16(Dest, Word(w)); + Source := IntPtr(Integer(Source) + 2); + Dest := IntPtr(Integer(Dest) + 2); + end; + end; + Marshal.WriteInt16(Dest, 0); +end; + +function TData.NeedConvertEOL: boolean; +begin + Result := False; +end; + +procedure TData.GetFieldData(Field: TFieldDesc; RecBuf: IntPtr; Dest: IntPtr); +var + Data: IntPtr; +begin + case Field.DataType of + dtUInt32: + Marshal.WriteInt64(Dest, Longword(Marshal.ReadInt32(RecBuf, Field.Offset))); + dtDateTime: + GetDateFromBuf(RecBuf, Field.Offset, Dest, dfMSecs); + dtDate: + GetDateFromBuf(RecBuf, Field.Offset, Dest, dfDate); + dtTime: + GetDateFromBuf(RecBuf, Field.Offset, Dest, dfTime); + {$IFDEF VER5P} + dtVariant: + {$IFDEF CLR} + Assert(False); + {$ELSE} + Variant(Dest^) := TVariantObject(Marshal.ReadIntPtr(RecBuf, Field.Offset)).Value; + {$ENDIF} + {$ENDIF} + {$IFDEF VER6P} + dtFmtBCD: + CopyBuffer(IntPtr(Integer(RecBuf) + Field.Offset), Dest, SizeOfTBcd); // To avoid errors if Field.Size > SizeOfTBcd + {$ENDIF} + dtExtString: begin + Assert(Marshal.ReadIntPtr(RecBuf, Field.Offset) <> nil); + if NeedConvertEOL then + AddCRString(Marshal.ReadIntPtr(RecBuf, Field.Offset), Dest, MaxInt div 2) + else + StrCopy(Dest, Marshal.ReadIntPtr(RecBuf, Field.Offset)); + end; + dtExtWideString: begin + Assert(Marshal.ReadIntPtr(RecBuf, Field.Offset) <> nil); + if NeedConvertEOL then + AddCRUnicode(Marshal.ReadIntPtr(RecBuf, Field.Offset), Dest, MaxInt div 4) + else + StrCopyW(Dest, Marshal.ReadIntPtr(RecBuf, Field.Offset)); + end; + dtExtVarBytes: begin + Data := Marshal.ReadIntPtr(RecBuf, Field.Offset); + CopyBuffer(Data, Dest, Marshal.ReadInt16(Data) + SizeOf(Word)); + end; + dtString: + if NeedConvertEOL then + AddCRString(IntPtr(Integer(RecBuf) + Field.Offset), Dest, Field.Size) + else + StrLCopy(Dest, IntPtr(Integer(RecBuf) + Field.Offset), Field.Size); + dtWideString: begin + if NeedConvertEOL then + AddCRUnicode(IntPtr(Integer(RecBuf) + Field.Offset), Dest, Field.Size) + else + StrLCopyW(Dest, IntPtr(Integer(RecBuf) + Field.Offset), Field.Size); + end; + {$IFDEF CLR} + dtBytes: + CopyBuffer(IntPtr(Integer(RecBuf) + Field.Offset), Dest, Field.Length); + {$ENDIF} + else + CopyBuffer(IntPtr(Integer(RecBuf) + Field.Offset), Dest, Field.Size); + end; +end; + +procedure TData.GetField(FieldNo: word; RecBuf: IntPtr; Dest: IntPtr; var IsBlank: boolean); +var + Field: TFieldDesc; + DataType: word; + t: boolean; + l: integer; + +begin + Assert((FieldNo <= FieldCount) and (FieldNo > 0)); + + IsBlank := GetNull(FieldNo, RecBuf); + + Field := Fields[FieldNo - 1]; + + DataType := Field.DataType; + if (Dest = nil) or IsBlank and (not IsComplexFieldType(DataType) + or (DataType = dtExtString) or (DataType = dtExtWideString) + or (DataType = dtExtVarBytes)) + then + Exit; + + if not Field.HasParent then + GetFieldData(Field, RecBuf, Dest) + else + GetChildField(Field, RecBuf, Dest, IsBlank); + + if not IsBlank and (Field.DataType in [dtString, dtWideString]) then begin// trim fixed char values + if Field.Fixed then begin + t := FTrimFixedChar; + l := Field.Length; + end + else begin + t := FTrimVarChar; + l := -1; + end; + if t then + if Field.DataType = dtString then + StrTrim(Dest, l) + else + StrTrimW(Dest, l); + end; +end; + +function TData.GetFieldBuf(RecBuf: IntPtr; FieldDesc: TFieldDesc; var DataType: integer; var IsBlank, NativeBuffer: boolean): IntPtr; +var + FieldBufStatic: IntPtr; + ValueBuf: IntPtr; + Len: integer; +begin + NativeBuffer := True; + FieldBufStatic := nil; + ValueBuf := nil; + try + if FieldDesc.ParentField = nil then begin + Result := IntPtr(integer(RecBuf) + FieldDesc.Offset); + IsBlank := GetNull(FieldDesc.FieldNo, RecBuf); + end + else begin + // support objects + FieldBufStatic := Marshal.AllocHGlobal(4001); + Result := FieldBufStatic; + GetField(FieldDesc.FieldNo, RecBuf, Result, IsBlank); // GetChildField + end; + + if not IsBlank then begin + DataType := FieldDesc.DataType; + case DataType of + dtExtString: begin + Result := Marshal.ReadIntPtr(Result); + DataType := dtString; + end; + dtExtWideString: begin + Result := Marshal.ReadIntPtr(Result); + DataType := dtWideString; + end; + dtExtVarBytes: + Result := Marshal.ReadIntPtr(Result); + dtBCD: begin + ValueBuf := Marshal.AllocHGlobal(SizeOf(double)); + Marshal.WriteInt64(ValueBuf, BitConverter.DoubleToInt64Bits(Marshal.ReadInt64(Result) / 10000)); + Result := ValueBuf; + end; + dtDateTime, dtDate, dtTime: begin + ValueBuf := Marshal.AllocHGlobal(SizeOf(double)); + GetDateFromBuf(RecBuf, FieldDesc.Offset, ValueBuf, dfDateTime); + Result := ValueBuf; + end; + dtBytes: begin + ValueBuf := Marshal.AllocHGlobal(FieldDesc.Length + SizeOf(Word)); + Marshal.WriteInt16(ValueBuf, FieldDesc.Length); + CopyBuffer(Result, IntPtr(Integer(ValueBuf) + SizeOf(Word)), FieldDesc.Length); + Result := ValueBuf; + end; + else + if IsBlobFieldType(DataType) then begin + Len := GetBlobSize(FieldDesc.FieldNo, RecBuf); + ValueBuf := Marshal.AllocHGlobal(Len + 1); + ReadBlob(FieldDesc.FieldNo, RecBuf, 0, Len, ValueBuf); + Marshal.WriteByte(ValueBuf, Len, 0); + DataType := dtString; + Result := ValueBuf; + end + end; + end; + finally + if (FieldBufStatic <> nil) and (ValueBuf <> nil) then + Marshal.FreeHGlobal(FieldBufStatic); + NativeBuffer := (FieldBufStatic = nil) and (ValueBuf = nil); + end; +end; + +function SetScale(F: double; Scale: integer): double; +begin + if Scale > 0 then begin + Result := StrToFloat(FloatToStrF(F, ffFixed, 18, Scale)); // 0.009 + end + else + Result := F; +end; + +procedure TData.PutFieldData(Field: TFieldDesc; RecBuf: IntPtr; Source: IntPtr); +var + Dest, Src: IntPtr; + D: double; + Len: integer; + +begin + case Field.DataType of + dtFloat: begin + D := BitConverter.Int64BitsToDouble(Marshal.ReadInt64(Source)); + D := SetScale(D, Field.Scale); + Marshal.WriteInt64(RecBuf, Field.Offset, BitConverter.DoubleToInt64Bits(D)); + end; + dtDateTime: + PutDateToBuf(RecBuf, Field.Offset, Source, dfMSecs); + dtDate: + PutDateToBuf(RecBuf, Field.Offset, Source, dfDate); + dtTime: + PutDateToBuf(RecBuf, Field.Offset, Source, dfTime); + {$IFDEF VER5P} + dtVariant: + {$IFDEF CLR} + Assert(False); + {$ELSE} + TVariantObject(Marshal.ReadIntPtr(RecBuf, Field.Offset)).Value := Variant(Source^); + {$ENDIF} + {$ENDIF} + dtString: + StrLCopy(IntPtr(Integer(RecBuf) + Field.Offset), Source, Field.Size); + dtWideString: begin + Src := + {$IFDEF CLR} + Source; + {$ELSE} + {$IFDEF VER10P} + Source; + {$ELSE} + PWideChar(WideString(Source^)); + {$ENDIF} + {$ENDIF} + StrLCopyW(IntPtr(Integer(RecBuf) + Field.Offset), Src, Field.Length); + end; + dtExtString: begin + StringHeap.DisposeBuf(Marshal.ReadIntPtr(RecBuf, Field.Offset)); + Marshal.WriteIntPtr(RecBuf, Field.Offset, StringHeap.AllocStr(Source)); + end; + dtExtWideString: begin + StringHeap.DisposeBuf(Marshal.ReadIntPtr(RecBuf, Field.Offset)); + if Source = nil then + Src := nil + else + Src := + {$IFDEF CLR} + Source; + {$ELSE} + {$IFDEF VER10P} + Source; + {$ELSE} + PWideChar(WideString(Source^)); + {$ENDIF} + {$ENDIF} + Marshal.WriteIntPtr(RecBuf, Field.Offset, StringHeap.AllocWideStr(Src)); + end; + dtExtVarBytes: begin + StringHeap.DisposeBuf(Marshal.ReadIntPtr(RecBuf, Field.Offset)); + if Source <> nil then begin + Len := Marshal.ReadInt16(Source) + SizeOf(Word); + Dest := StringHeap.NewBuf(Len); + CopyBuffer(Source, Dest, Len); + Marshal.WriteIntPtr(RecBuf, Field.Offset, Dest); + end + else + Marshal.WriteIntPtr(RecBuf, Field.Offset, nil); + end; + {$IFDEF CLR} + dtBytes: + CopyBuffer(Source, IntPtr(Integer(RecBuf) + Field.Offset), Field.Length); + {$ENDIF} + else + CopyBuffer(Source, IntPtr(Integer(RecBuf) + Field.Offset), Field.Size); + end; +end; + +procedure TData.PutField(FieldNo: word; RecBuf: IntPtr; Source: IntPtr); +var + Field: TFieldDesc; +begin + if Source = nil then begin + SetNull(FieldNo, RecBuf, True); + Exit; + end; + + Field := Fields[FieldNo - 1]; + + if not Field.HasParent then begin + if (not FEnableEmptyStrings) and + ((Field.DataType in [dtString, dtExtString]) and (Marshal.ReadByte(Source) = 0) or + (Field.DataType in [dtWideString, dtExtWideString]) and (Marshal.ReadInt16(Source) = 0)) + then + SetNull(FieldNo, RecBuf, True) + else + begin + PutFieldData(Field, RecBuf, Source); + SetNull(FieldNo, RecBuf, False); + end; + end + else + PutChildField(Field, RecBuf, Source); +end; + +function TData.GetNull(FieldNo: word; RecBuf: IntPtr): boolean; +var + Field:TFieldDesc; +begin + Field := Fields[FieldNo - 1]; + if not Field.HasParent then + Result := Marshal.ReadByte(RecBuf, DataSize + FieldNo - 1) = 1 + else + GetChildField(Field, RecBuf, nil, Result); +end; + +procedure TData.SetNull(FieldNo: word; RecBuf: IntPtr; Value: boolean); +var + Flag: byte; + Field: TFieldDesc; + Blob: TBlob; +begin + Field := Fields[FieldNo - 1]; + if not Field.HasParent then begin + if Value then + Flag := 1 + else + Flag := 0; + + Marshal.WriteByte(RecBuf, DataSize + FieldNo - 1, Flag); + + if Value and IsBlobFieldType(Field.DataType) then begin // clear Blob value + Blob := TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(RecBuf, Field.Offset))); + if Blob <> nil then + Blob.Clear; + end; + end + else + PutChildField(Field, RecBuf, nil); +end; + +function TData.GetNullByBlob(FieldNo: word; RecBuf: IntPtr): boolean; +var + Blob: TBlob; + Ptr: IntPtr; +begin + Result := True; + if IsBlobFieldType(Fields[FieldNo - 1].DataType) then begin + Ptr := Marshal.AllocHGlobal(sizeof(IntPtr)); + try + if Fields[FieldNo - 1].HasParent then + GetChildField(Fields[FieldNo - 1], RecBuf, Ptr, Result) + else + GetFieldData(Fields[FieldNo - 1], RecBuf, Ptr); + Blob := TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(Ptr))); + finally + Marshal.FreeHGlobal(Ptr); + end; + + if (Blob <> nil) and (Blob.Size <> 0) then begin + Result := False; + SetNull(FieldNo, RecBuf, False); + end; + end; +end; + +procedure TData.GetFieldAsVariant(FieldNo: word; RecBuf: IntPtr; var Value: variant); +var + Field: TFieldDesc; + FieldData: IntPtr; + Date: TDateTime; + Date64: int64; + PDate: IntPtr; + Buf: IntPtr; + Data: TBytes; + IsBlank, t: boolean; +{ Blob: TBlob; + l: integer;} +{$IFDEF VER6P} + bcd: TBcd; +{$ENDIF} +begin + if GetNull(FieldNo, RecBuf) then begin + Value := Null; + Exit; + end; + + Value := Unassigned; // Delphi bug + Field := Fields[FieldNo - 1]; + + if not Field.HasParent then + Buf := nil + else + Buf := Marshal.AllocHGlobal(4000); + + try + if not Field.HasParent then + FieldData := IntPtr(Integer(RecBuf) + Field.Offset) + else begin + FieldData := Buf; + GetChildField(Field, RecBuf, FieldData, IsBlank); + end; + + case Field.DataType of + dtString: begin + if Field.Fixed then + t := FTrimFixedChar + else + t := FTrimVarChar; + if t then + // trim fixed char values + Value := TrimRight(Marshal.PtrToStringAnsi(FieldData)) + else + Value := Marshal.PtrToStringAnsi(FieldData); + end; + dtWideString: begin + if Field.Fixed then + t := FTrimFixedChar + else + t := FTrimVarChar; + if t then + // trim fixed char values + Value := TrimRight(Marshal.PtrToStringUni(FieldData)) + else + Value := Marshal.PtrToStringUni(FieldData); + end; + dtInt8: + Value := shortint(Marshal.ReadByte(FieldData)); + dtSmallint: + Value := Marshal.ReadInt16(FieldData); + dtInt64: begin + {$IFDEF VER6P} + Value := Marshal.ReadInt64(FieldData); + {$ELSE} + TVarData(Value).VType := varDecimal; + TVarDataD6(Value).VInt64 := Int64(FieldData^); + {$ENDIF} + end; + dtUInt32: begin + {$IFDEF VER6P} + Value := LongWord(Marshal.ReadInt32(FieldData)); + {$ELSE} + TVarData(Value).VType := varLongWord; + TVarDataD6(Value).VLongword := LongWord(FieldData^); + {$ENDIF} + end; + dtInteger: + Value := Marshal.ReadInt32(FieldData); + dtWord: + Value := Word(Marshal.ReadInt16(FieldData)); + dtBoolean: + Value := WordBool(Marshal.ReadInt16(FieldData)); + dtFloat,dtCurrency: + Value := BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldData)); + dtDateTime, dtDate, dtTime: begin + if Field.HasParent then + Date := MemUtils.TimeStampToDateTime(MSecsToTimeStamp(Trunc(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldData))))) + else begin + PDate := OrdinalToPtr(Date64); + try + GetDateFromBuf(FieldData, 0, PDate, dfDateTime); + finally + PtrToOrdinal(PDate, Date64); + end; + Date := BitConverter.Int64BitsToDouble(Date64); + end; + Value := Date; + end; + dtMemo: + Value := TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(FieldData))).AsString; + dtWideMemo: + Value := TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(FieldData))).AsWideString; + {$IFDEF VER5P} + dtVariant: + Value := TVariantObject(GetGCHandleTarget(Marshal.ReadIntPtr(FieldData))).Value; + {$ENDIF} + dtExtString: + Value := Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(FieldData)); + dtExtWideString: + Value := Marshal.PtrToStringUni(Marshal.ReadIntPtr(FieldData)); + dtBytes: begin + SetLength(Data, Field.Length); + Marshal.Copy(FieldData, Data, 0, Field.Length); + Value := Data; + end; + dtVarBytes: begin + SetLength(Data, Marshal.ReadInt16(FieldData)); + Marshal.Copy(IntPtr(Integer(FieldData) + SizeOf(word)), Data, 0, Length(Data)); + Value := Data; + end; + dtExtVarBytes: begin + SetLength(Data, Marshal.ReadInt16(Marshal.ReadIntPtr(FieldData))); + Marshal.Copy(IntPtr(Integer(Marshal.ReadIntPtr(FieldData)) + SizeOf(word)), Data, 0, Length(Data)); + Value := Data; + end; +(* dtBlob: begin + Blob := GetObject(FieldNo, RecBuf) as TBlob; + try + l := Blob.Size; + {$IFDEF CLR} + SetLength(Value, l); + Blob.Defrag; + asdd + {$ELSE} + Value := VarArrayCreate([0, l - 1], varByte); + Blob.Read(0, l, TVarData(Value).VArray.Data); + {$ENDIF} + finally + Blob.Free; + end; + end; *) + dtBCD: + begin + {$IFDEF CLR} + Date64 := Marshal.ReadInt64(FieldData); + Value := Date64 / 10000; + {$ELSE} + Value := PCurrency(FieldData)^; + {$ENDIF} + end; + {$IFDEF VER6P} + dtFmtBCD: + begin + {$IFDEF CLR} + SetLength(Data, SizeOfTBcd); + Marshal.Copy(FieldData, Data, 0, SizeOfTBcd); + bcd := TBcd.FromBytes(Data); + {$ELSE} + bcd := PBcd(FieldData)^; + {$ENDIF} + Value := VarFMTBcdCreate(bcd); + end; + {$ENDIF} + dtGuid: + Value := Marshal.PtrToStringAnsi(FieldData); + else + raise EConvertError.Create(SCannotConvertType + ' ' + IntToStr(Integer(Field.DataType))); + end; + finally + if Buf <> nil then + Marshal.FreeHGlobal(Buf); + end; +end; + +procedure TData.PutFieldAsVariant(FieldNo: word; RecBuf: IntPtr; const Value: variant); +var + FieldData: IntPtr; + i: integer; +{$IFDEF VER6P} + lw: Longword; + i32: Int32; + i64: Int64; +{$ENDIF} +{$IFDEF CLR} + Data: TBytes; + bcd: TBcd; + d: Double; +{$ENDIF} + Date: int64; + PDate: IntPtr; + Temp: IntPtr; + Ws: WideString; + l: word; + + s: string; + p: IntPtr; +begin + if VarIsNull(Value) or VarIsEmpty(Value) then begin + SetNull(FieldNo, RecBuf, True); + Exit; + end; + FieldData := IntPtr(Integer(RecBuf) + Fields[FieldNo - 1].Offset); + case Fields[FieldNo - 1].DataType of + dtString: begin + {$IFDEF CLR} + Data := Encoding.Default.GetBytes(String(Copy(String(Value), 1, Fields[FieldNo - 1].Size))); + Marshal.Copy(Data, 0, FieldData, Length(Data)); + Marshal.WriteByte(FieldData, Length(Data), 0); + {$ELSE} + StrLCopy(FieldData, PChar(VarToStr(Value)), Fields[FieldNo - 1].Size); + {$ENDIF} + end; + dtWideString: begin + Ws := WideString(Value); + {$IFDEF CLR} + i := Fields[FieldNo - 1].Size div 2 - 1; + if Length(Ws) > i then + SetLength(Ws, i); + Data := Encoding.Unicode.GetBytes(Ws); + Marshal.Copy(Data, 0, FieldData, Length(Data)); + Marshal.WriteInt16(FieldData, Length(Data), 0); + {$ELSE} + StrLCopyW(FieldData, PWideChar(ws), Fields[FieldNo - 1].Size div 2 - 1); + {$ENDIF} + end; + dtInt8: begin + i := Value; + case Fields[FieldNo - 1].Size of + 2: + Marshal.WriteInt16(FieldData, i); + 1: + Marshal.WriteByte(FieldData, byte(i)); + else + Assert(False); + end; + end; + dtSmallint: + case VarType(Value) of + varSmallint,varInteger,varByte{$IFDEF VER6P}, varWord{$ENDIF}: + Marshal.WriteInt16(FieldData, smallint(Value)); + else + raise EConvertError.Create(SCannotConvertType); + end; + dtInteger: + case VarType(Value) of + varString{$IFDEF WIN32},varOleStr{$ENDIF}{$IFDEF CLR}, varChar{$ENDIF}: + Marshal.WriteInt32(FieldData, StrToInt(Value)); + varSmallint,varInteger,varByte,{$IFDEF VER6P}varWord,{$ENDIF} + varSingle,varDouble{$IFDEF WIN32},varCurrency{$ENDIF}: + Marshal.WriteInt32(FieldData, Integer(Value)); + else + raise EConvertError.Create(SCannotConvertType); + end; + dtInt64: + case VarType(Value) of + {$IFDEF VER6P} + varInt64: begin + i64 := Value; + Marshal.WriteInt64(FieldData, i64); + end; + {$ELSE} + varDecimal: + Int64(FieldData^) := TVarDataD6(Value).VInt64; + {$ENDIF} + else + raise EConvertError.Create(SCannotConvertType); + end; + dtUInt32: + case VarType(Value) of + varLongWord: + {$IFDEF VER6P} + begin + // To prevent range-checking error on large values (for example, 4294967295) + i64 := Value; + lw := longword(i64); + i32 := Int32(lw); + Marshal.WriteInt32(FieldData, i32); + end; + {$ELSE} + LongWord(FieldData^) := TVarDataD6(Value).VLongWord; + {$ENDIF} + else + raise EConvertError.Create(SCannotConvertType); + end; + dtWord: + case VarType(Value) of + varSmallint,varInteger,varByte{$IFDEF VER6P},varWord{$ENDIF}: begin + i := Value; + Marshal.WriteInt16(FieldData, smallint(i)); + end + else + raise EConvertError.Create(SCannotConvertType); + end; + dtBoolean: + case VarType(Value) of + varBoolean: + Marshal.WriteInt16(FieldData, smallint(boolean(Value))); + else + raise EConvertError.Create(SCannotConvertType); + end; + dtFloat, dtCurrency: + case VarType(Value) of + varString{$IFDEF WIN32},varOleStr{$ENDIF}{$IFDEF CLR}, varChar{$ENDIF}: + Marshal.WriteInt64(FieldData, + BitConverter.DoubleToInt64Bits(SetScale(StrToFloat(Value), Fields[FieldNo - 1].Scale))); + varSmallint,varInteger,varByte: + Marshal.WriteInt64(FieldData, BitConverter.DoubleToInt64Bits(Value)); + varSingle,varDouble{$IFDEF WIN32},varCurrency{$ENDIF}: + Marshal.WriteInt64(FieldData, + BitConverter.DoubleToInt64Bits(SetScale(Value, Fields[FieldNo - 1].Scale))); + else + raise EConvertError.Create(SCannotConvertType); + end; + dtDateTime, dtDate, dtTime: begin + Date := BitConverter.DoubleToInt64Bits(Value); + PDate := OrdinalToPtr(Date); + try + PutDateToBuf(FieldData, 0, PDate, dfDateTime); + finally + FreeOrdinal(PDate); + end; + end; + dtMemo,dtBlob: // used by ODAC to refresh String as Memo + TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(FieldData))).AsString := VarToStr(Value); + dtWideMemo: + TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(FieldData))).AsWideString := VarToWideStr(Value); + {$IFDEF VER5P} + dtVariant: + TVariantObject(GetGCHandleTarget(Marshal.ReadIntPtr(FieldData))).Value := Value; + {$ENDIF} + dtExtString: begin + StringHeap.DisposeBuf(Marshal.ReadIntPtr(FieldData)); + Temp := Marshal.StringToHGlobalAnsi(Value); + try + Marshal.WriteIntPtr(FieldData, StringHeap.AllocStr(Temp)); + finally + Marshal.FreeCoTaskMem(Temp); + end; + end; + dtExtWideString: begin + StringHeap.DisposeBuf(Marshal.ReadIntPtr(FieldData)); + Temp := Marshal.StringToHGlobalUni(Value); + try + Marshal.WriteIntPtr(FieldData, StringHeap.AllocWideStr(Temp)); + finally + Marshal.FreeCoTaskMem(Temp); + end; + end; + dtBytes: begin + Assert(VarType(Value) = varArray + varByte, 'Invalid VType'); + {$IFDEF CLR} + SetLength(Data, VarArrayHighBound(Value, 1) + 1); + for i := 0 to High(Data) do + Data[i] := VarArrayGet(Value, i); + Marshal.Copy(Data, 0, FieldData, Length(Data)); + {$ELSE} + Assert(TVarData(Value).VArray.Bounds[0].ElementCount = Fields[FieldNo - 1].Length, 'Invalid data size'); + Move(TVarData(Value).VArray.Data^, FieldData^, Fields[FieldNo - 1].Length); + {$ENDIF} + end; + dtVarBytes: begin + Assert(VarType(Value) = varArray + varByte, 'Invalid VType'); + {$IFDEF CLR} + SetLength(Data, VarArrayHighBound(Value, 1) + 1); + for i := 0 to High(Data) do + Data[i] := VarArrayGet(Value, i); + Marshal.WriteInt16(FieldData, Length(Data)); + Marshal.Copy(Data, 0, IntPtr(Integer(FieldData) + sizeof(word)), Length(Data)); + {$ELSE} + Assert(TVarData(Value).VArray.Bounds[0].ElementCount <= Fields[FieldNo - 1].Length, 'Invalid data size'); + + Word(FieldData^) := TVarData(Value).VArray.Bounds[0].ElementCount; + Move(TVarData(Value).VArray.Data^, (PChar(FieldData) + sizeof(word))^, Word(FieldData^)); + {$ENDIF} + end; + dtExtVarBytes: begin + Assert(VarType(Value) = varArray + varByte, 'Invalid VType'); +// Assert(VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1) + 1 <= Length, 'Invalid data size'); + + StringHeap.DisposeBuf(Marshal.ReadIntPtr(FieldData)); + l := VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1) + 1; + Marshal.WriteIntPtr(FieldData, StringHeap.NewBuf(l + sizeof(Word))); + + Marshal.WriteInt16( Marshal.ReadIntPtr(FieldData), l); + for i:= VarArrayLowBound(Value, 1) to VarArrayHighBound(Value, 1) do + Marshal.WriteByte( IntPtr(Integer(Marshal.ReadIntPtr(FieldData)) + sizeof(word) + i - VarArrayLowBound(Value, 1)), Value[i]); + end; + dtBCD: + {$IFDEF CLR} + begin + d := Value; + d := d * 10000; + Marshal.WriteInt64(FieldData, Round(d)); + end; + {$ELSE} + PCurrency(FieldData)^ := Value; + {$ENDIF} + {$IFDEF VER6P} + dtFmtBCD: + {$IFDEF CLR} + begin + bcd := Value; + Data := TBcd.ToBytes(bcd); + Marshal.Copy(Data, 0, FieldData, SizeOfTBcd); + end; + {$ELSE} + PBcd(FieldData)^ := StrToBcd(Value); + {$ENDIF} + {$ENDIF} + dtGuid: + begin + s := VarToStr(Value); + p := Marshal.StringToHGlobalAnsi(s); + try + StrLCopy(FieldData, p, Fields[FieldNo - 1].Size); + finally + Marshal.FreeCoTaskMem(p); + end; + end; + else + raise EConvertError.Create(SCannotConvertType); + end; + + SetNull(FieldNo, RecBuf, False); +end; + +function TData.FindField(Name: string):TFieldDesc; +begin + Result := FFields.FindField(Name); +end; + +function TData.FieldByName(Name: string):TFieldDesc; +begin + Result := FFields.FieldByName(Name); +end; + +function TData.IsBlobFieldType(DataType: word): boolean; // TBlob descendants - dtBlob, dtMemo etc +begin + Result := (DataType = dtBlob) or (DataType = dtMemo) or (DataType = dtWideMemo); +end; + +function TData.IsComplexFieldType(DataType: word): boolean; // All supported complex field types (BlobFieldTypes, ExtFieldTypes and TSharedObject descendants (not BLOB)) +begin + case DataType of + dtExtString, dtExtWideString, dtExtVarBytes{$IFDEF VER5P}, dtVariant{$ENDIF}: + Result := True; + else + Result := IsBlobFieldType(DataType); + end; +end; + +function TData.HasFields(FieldTypes: TFieldTypeSet): boolean; +var + i: integer; +begin + i := 0; + while (i < FieldCount) and not (Fields[i].DataType in FieldTypes) do + Inc(i); + Result := i < FieldCount; +end; + +function TData.HasBlobFields: boolean; +var + i: integer; +begin + i := 0; + while (i < FieldCount) and not IsBlobFieldType(Fields[i].DataType) do + Inc(i); + Result := i < FieldCount; +end; + +function TData.CheckHasComplexFields: boolean; +var + i: integer; +begin + i := 0; + while (i < FieldCount) and not IsComplexFieldType(Fields[i].DataType) do + Inc(i); + Result := i < FieldCount; + FHasComplexFields := Result; +end; + +{ Records } + +function TData.AllocRecBuf(var RecBuf: IntPtr): IntPtr; +begin + RecBuf := Marshal.AllocHGlobal(RecordSize); + Result := RecBuf; +end; + +procedure TData.FreeRecBuf(RecBuf: IntPtr); +begin + Marshal.FreeHGlobal(RecBuf); +end; + +procedure TData.CreateComplexFields(RecBuf: IntPtr; WithBlob: boolean); +var + i: integer; +begin + for i := 0 to FieldCount - 1 do + CreateComplexField(RecBuf, i, WithBlob); +end; + +procedure TData.CreateComplexField(RecBuf: IntPtr; FieldIndex: integer; WithBlob: boolean); +var + Blob: TSharedObject; + FieldDesc: TFieldDesc; +begin + FieldDesc := Fields[FieldIndex]; + if FieldDesc.FieldDescKind <> fdkCalculated then + case FieldDesc.DataType of + dtBlob, dtMemo, dtWideMemo: + if WithBlob then begin + Blob := TBlob.Create; + if FieldDesc.DataType = dtWideMemo then + TBlob(Blob).IsUnicode := True; + // RollBack is always on for LOB fields. Otherwise modification + // that cannot be canceled is possible. + TBlob(Blob).EnableRollback; + SetObject(FieldIndex + 1, RecBuf, Blob); + end; + {$IFDEF VER5P} + dtVariant: + begin + Blob := TVariantObject.Create; + Marshal.WriteIntPtr(RecBuf, FieldDesc.Offset, Blob.GCHandle); + end; + {$ENDIF} + dtExtString, dtExtWideString, dtExtVarBytes: + Marshal.WriteIntPtr(RecBuf, FieldDesc.Offset, nil); + end; +end; + + +procedure TData.AddRefComplexFields(RecBuf: IntPtr); +var + i: integer; + so: TSharedObject; +begin + for i := 0 to FieldCount - 1 do + if Fields[i].DataType in [dtExtString, dtExtWideString, dtExtVarBytes] then + StringHeap.AddRef(Marshal.ReadIntPtr(RecBuf, Fields[i].Offset)) + else + if IsComplexFieldType(Fields[i].DataType) and not Fields[i].HasParent then begin + so := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(RecBuf, Fields[i].Offset))); + Assert(so <> nil, 'Shared object for ' + Fields[i].Name + '=nil'); + so.AddRef; + end; +end; + +procedure TData.FreeComplexFields(RecBuf: IntPtr; WithBlob: boolean); +var + i: integer; + Handle: IntPtr; + so: TSharedObject; + b: boolean; + Field: TFieldDesc; +begin + for i := 0 to FieldCount - 1 do begin + Field := Fields[i]; + if Field.FieldDescKind <> fdkCalculated then + case Field.DataType of + dtBlob, dtMemo, dtWideMemo: + if WithBlob then begin + Handle := Marshal.ReadIntPtr(RecBuf, Field.Offset); + so := TSharedObject(GetGCHandleTarget(Handle)); + // see TSharedObject.Free for details + b := (so <> nil) and (so.RefCount = 1); + so.Free; + if b then + Marshal.WriteIntPtr(RecBuf, Field.Offset, nil); + end; + {$IFDEF VER5P} + dtVariant: begin + Handle := Marshal.ReadIntPtr(RecBuf, Field.Offset); + TVariantObject(GetGCHandleTarget(Handle)).Free; + end; + {$ENDIF} + dtExtString, dtExtWideString, dtExtVarBytes: + if not StringHeap.Empty then begin + Handle := Marshal.ReadIntPtr(RecBuf, Field.Offset); + if (Handle <> nil) and (Marshal.ReadInt16(IntPtr(Integer(Handle) - SizeOf(Word))) = RefNull) then + Handle := nil; + StringHeap.DisposeBuf(Marshal.ReadIntPtr(RecBuf, Field.Offset)); + Marshal.WriteIntPtr(RecBuf, Field.Offset, Handle) + end; + end; + end; +end; + +procedure TData.CopyComplexFields(Source: IntPtr; Dest: IntPtr; WithBlob: boolean); +var + i, l: integer; + SrcPtr: IntPtr; + DestPtr: IntPtr; +begin + if WithBlob then + Assert(False); + + for i := 0 to FieldCount - 1 do + case Fields[i].DataType of + dtExtString: begin + SrcPtr := Marshal.ReadIntPtr(Source, Fields[i].Offset); + Marshal.WriteIntPtr(Dest, Fields[i].Offset, StringHeap.AllocStr(SrcPtr)); + end; + dtExtWideString: begin + SrcPtr := Marshal.ReadIntPtr(Source, Fields[i].Offset); + Marshal.WriteIntPtr(Dest, Fields[i].Offset, StringHeap.AllocWideStr(SrcPtr)); + end; + dtExtVarBytes: begin + SrcPtr := Marshal.ReadIntPtr(Source, Fields[i].Offset); + DestPtr := IntPtr(Integer(Dest) + Fields[i].Offset); + if SrcPtr = nil then + Marshal.WriteIntPtr(DestPtr, nil) + else begin + l := Marshal.ReadInt16(IntPtr(SrcPtr)) + SizeOf(Word); + Marshal.WriteIntPtr(DestPtr, StringHeap.NewBuf(l)); + CopyBuffer(SrcPtr, Marshal.ReadIntPtr(DestPtr), l); + end + end; + {$IFDEF VER5P} + dtVariant: + TVariantObject(GetGCHandleTarget(Marshal.ReadIntPtr(Dest, Fields[i].Offset))).Value := + TVariantObject(GetGCHandleTarget(Marshal.ReadIntPtr(Source, Fields[i].Offset))).Value; + {$ENDIF} + end; +end; + +procedure TData.InitRecord(RecBuf: IntPtr); +var + i: integer; +begin +// Complex fields need create later + if HasComplexFields then // clear pointer to complex field + FillChar(RecBuf, RecordSize, 0); + + for i := 1 to FieldCount do + SetNull(i, RecBuf, True); +end; + +procedure TData.AppendBlankRecord; +var + RecBuf: IntPtr; +begin + AllocRecBuf(RecBuf); + try + InitRecord(RecBuf); + AppendRecord(RecBuf); + finally + FreeRecBuf(RecBuf); + end; +end; + +procedure TData.EditRecord(RecBuf: IntPtr); +var + TempBuf: IntPtr; +begin + AllocRecBuf(TempBuf); + try + GetRecord(TempBuf); + CreateComplexFields(TempBuf, False); // Blobs uses internal cache + CopyComplexFields(RecBuf, TempBuf, False); + PutRecord(TempBuf); + + {if IsBlobFields then + for i:= 0 to FieldCount - 1 do + if Fields[i].DataType in BlobFieldTypes then + TBlob(Pointer(PChar(RecBuf) + Fields[i].Offset)^).EnableRollback;} + finally + FreeRecBuf(TempBuf); + end; +end; + +procedure TData.PostRecord(RecBuf: IntPtr); +var + i: integer; + TempBuf: IntPtr; + Blob: TBlob; +begin + AllocRecBuf(TempBuf); + try + GetRecord(TempBuf); + + UpdateRecord(RecBuf); + + if HasBlobFields then + for i := 0 to FieldCount - 1 do + if IsBlobFieldType(Fields[i].DataType) then begin + Blob := TBlob(InternalGetObject(Fields[i].FieldNo, RecBuf)); + if Blob <> nil then + Blob.Commit; + end; + + FreeComplexFields(TempBuf, False); + finally + FreeRecBuf(TempBuf); + end; +end; + +procedure TData.CancelRecord(RecBuf: IntPtr); +var + i: integer; + Blob: TBlob; +begin + if HasBlobFields then + for i := 0 to FieldCount - 1 do + if IsBlobFieldType(Fields[i].DataType) then begin + Blob := TBlob(InternalGetObject(Fields[i].FieldNo, RecBuf)); + if Blob <> nil then + Blob.Cancel; + end; + + FreeComplexFields(RecBuf, False); +end; + +{ Edit } + +procedure TData.InternalAppend(RecBuf: IntPtr); +begin + if Assigned(FOnAppend) then + FOnAppend; +end; + +procedure TData.InternalDelete; +begin + if Assigned(FOnDelete) then + FOnDelete; +end; + +procedure TData.InternalUpdate(RecBuf: IntPtr); +begin + if Assigned(FOnUpdate) then + FOnUpdate; +end; + +procedure TData.ApplyRecord(UpdateKind:TUpdateRecKind; var Action:TUpdateRecAction; LastItem: boolean); +begin + if Assigned(FOnApplyRecord) then + FOnApplyRecord(UpdateKind, Action, LastItem); +end; + +{ Navigation } + +function TData.GetEOF: boolean; +begin + Result := FEOF; +end; + +function TData.GetBOF: boolean; +begin + Result := FBOF; +end; + +procedure TData.SetToBegin; +begin + FBOF := True; + FEOF := False; +end; + +procedure TData.SetToEnd; +begin + FEOF := True; + FBOF := False; +end; + +function TData.GetRecordCount: longint; +begin + Result := -1; +end; + +function TData.GetRecordNo: longint; +begin + Result := -1; +end; + +procedure TData.SetRecordNo(Value: longint); +begin +end; + +{ BookMarks } + +procedure TData.GetBookmark(Bookmark: PRecBookmark); +begin + Bookmark.Order := RecordNo; +end; + +procedure TData.SetToBookmark(Bookmark: PRecBookmark); +begin + if Bookmark.Order <> -1 then + SetRecordNo(Bookmark.Order); +end; + +function TData.BookmarkValid(Bookmark: PRecBookmark): boolean; +begin + if IntPtr(Bookmark) <> nil then + Result := Bookmark.Order <> -1 + else + Result := False; +end; + +function TData.CompareBookmarks(Bookmark1, Bookmark2: PRecBookmark): integer; +const + RetCodes: array[Boolean, Boolean] of ShortInt = ((2,-1),(1,0)); +begin + Result := RetCodes[IntPtr(Bookmark1) = nil, IntPtr(Bookmark2) = nil]; + if Result = 2 then begin + if Bookmark1.Order >= Bookmark2.Order then + if Bookmark1.Order = Bookmark2.Order then + Result := 0 + else + Result := 1 + else + Result := -1 + end; +end; + +{ CachedUpdates } + +function TData.GetUpdateStatus: TItemStatus; +begin + Result := isUnmodified; +end; + +function TData.GetUpdateResult: TUpdateRecAction; +begin + Result := urNone; +end; + +procedure TData.SetCacheRecBuf(NewBuf: IntPtr; OldBuf: IntPtr); +begin +end; + +procedure TData.ApplyUpdates; +begin +end; + +procedure TData.CommitUpdates; +begin +end; + +procedure TData.CancelUpdates; +begin +end; + +procedure TData.RestoreUpdates; +begin +end; + +procedure TData.RevertRecord; +begin +end; + +function TData.GetUpdatesPending: boolean; +begin + Result := False; +end; + +procedure TData.GetOldRecord(RecBuf: IntPtr); +begin +end; + +{ Filter } + +function TData.AllocNode: TExpressionNode; +begin + Result := TExpressionNode.Create; + Result.NextAlloc := FirstAlloc; + FirstAlloc := Result; + Result.LeftOperand := nil; + Result.RightOperand := nil; + Result.NextOperand := nil; +end; + +procedure TData.FilterError; +begin + raise Exception.Create(SIllegalFilter); +end; + +function TData.OrExpr: TExpressionNode; +var + Node: TExpressionNode; +begin + Result := AndExpr; + while Code = lxOR do begin + Code := Parser.GetNext(StrLexem); + Node := AllocNode; + Node.NodeType := ntOr; + Node.LeftOperand := Result; + Node.RightOperand := AndExpr; + Result := Node; + end; +end; + +function TData.AndExpr: TExpressionNode; +var + Node: TExpressionNode; +begin + Result := Condition; + while Code = lxAND do begin + Code := Parser.GetNext(StrLexem); + Node := AllocNode; + Node.NodeType := ntAnd; + Node.LeftOperand := Result; + Node.RightOperand := Condition; + Result := Node; + end; +end; + +function TData.Condition: TExpressionNode; +var + OpCode: integer; +begin + Result := nil; + if (Code = lcIdent) or (Code = lcNumber) or (Code = lcString) or + (Code in [lxMinus, lxPlus, lxLeftSqBracket, lxRightSqBracket]) + then begin + Result := AllocNode; + Result.LeftOperand := Argument; + OpCode := Code; + case Code of + lxEqual, lxIS: + Result.NodeType := ntEqual; + lxMore: + Result.NodeType := ntMore; + lxLess: + Result.NodeType := ntLess; + lxMoreEqual: + Result.NodeType := ntMoreEqual; + lxLessEqual: + Result.NodeType := ntLessEqual; + lxNoEqual: + Result.NodeType := ntNoEqual; + lxLike: + Result.NodeType := ntLike; + else + FilterError; + end; + Code := Parser.GetNext(StrLexem); + if OpCode = lxIS then begin + if Code = lxNOT then begin + Code := Parser.GetNext(StrLexem); + if Code <> lxNULL then + FilterError; + Result.NodeType := ntNoEqual; + end + else if Code <> lxNULL then + FilterError; + end; + Result.RightOperand := Argument; + end + else + if Code = lxNOT then begin + Code := Parser.GetNext(StrLexem); + Result := AllocNode; + Result.NodeType := ntNot; + Result.LeftOperand := Condition; + end + else + if Code = lxTRUE then begin + Code := Parser.GetNext(StrLexem); + Result := AllocNode; + Result.NodeType := ntTrue; + end + else + if Code = lxFALSE then begin + Code := Parser.GetNext(StrLexem); + Result := AllocNode; + Result.NodeType := ntFalse; + end + else + if Code = lxLeftBracket then begin + Code := Parser.GetNext(StrLexem); + Result := OrExpr; + if Code = lxRightBracket then + Code := Parser.GetNext(StrLexem) + else + FilterError; + end + else + FilterError; +end; + +{$IFNDEF VER6P} +function AnsiExtractQuotedStr(var Src: PChar; Quote: Char): string; +var + P, Dest: PChar; + DropCount: Integer; +begin + Result := ''; + if (Src = nil) or (Src^ <> Quote) then Exit; + Inc(Src); + DropCount := 1; + P := Src; + Src := AnsiStrScan(Src, Quote); + while Src <> nil do // count adjacent pairs of quote chars + begin + Inc(Src); + if Src^ <> Quote then Break; + Inc(Src); + Inc(DropCount); + Src := AnsiStrScan(Src, Quote); + end; + if Src = nil then Src := StrEnd(P); + if ((Src - P) <= 1) then Exit; + if DropCount = 1 then + SetString(Result, P, Src - P - 1) + else + begin + SetLength(Result, Src - P - DropCount); + Dest := PChar(Result); + Src := AnsiStrScan(P, Quote); + while Src <> nil do + begin + Inc(Src); + if Src^ <> Quote then Break; + Move(P^, Dest^, Src - P); + Inc(Dest, Src - P); + Inc(Src); + P := Src; + Src := AnsiStrScan(Src, Quote); + end; + if Src = nil then Src := StrEnd(P); + Move(P^, Dest^, Src - P - 1); + end; +end; + +function AnsiDequotedStr(const S: string; AQuote: Char): string; +var + LText: PChar; +begin + LText := PChar(S); + Result := AnsiExtractQuotedStr(LText, AQuote); + if Result = '' then + Result := S; +end; +{$ENDIF} + +function TData.Argument: TExpressionNode; +var + Field: TFieldDesc; + FieldName: string; + ASign: string; + + function ParseFieldName(FirstPart: string): string; + begin + Result := FirstPart; + Code := Parser.GetNext(StrLexem); + if StrLexem = '.' then + repeat + Code := Parser.GetNext(StrLexem); + if Code = lcIdent then + Result := Result + '.' + StrLexem + else + break; + Code := Parser.GetNext(StrLexem); + until StrLexem <> '.'; + end; +begin + Result := AllocNode; + case Code of + lcIdent: begin + FieldName := ParseFieldName(StrLexem); + Field := FindField(FieldName); + if Field = nil then + raise Exception.Create(Format(SFieldNotFound, [FieldName])); + Result.NodeType := ntField; + Result.FieldDesc := Field; + Result.Value := StrLexem; + Exit; + end; + lxLeftSqBracket: begin + FieldName := ''; + Parser.OmitBlank := False; + Code := Parser.GetNext(StrLexem); + while (Code <> lxRightSqBracket) and (Code <> lcEnd) do begin + FieldName := FieldName + StrLexem; + Code := Parser.GetNext(StrLexem); + end; + Parser.OmitBlank := True; + Field := FindField(FieldName); + if Field = nil then + raise Exception.Create(Format(SFieldNotFound, [FieldName])); + Result.NodeType := ntField; + Result.FieldDesc := Field; + Result.Value := FieldName; + end; + lcString: begin + Result.NodeType := ntValue; + Result.Value := AnsiDequotedStr('''' + StrLexem + '''', ''''); // TODO Optimize with StringBuilder + end; + lcNumber: begin + Result.NodeType := ntValue; + Result.Value := StrToFloat(StrLexem); + end; + lxMinus,lxPlus: begin + Result.NodeType := ntValue; + ASign := StrLexem; + Code := Parser.GetNext(StrLexem); + if Code = lcNumber then + Result.Value := StrToFloat(ASign + StrLexem) + else + FilterError; + end; + lxNULL: begin + Result.NodeType := ntValue; + Result.Value := Null; + end; + lxTRUE: begin + Result.NodeType := ntValue; + Result.Value := True; + end; + lxFALSE: begin + Result.NodeType := ntValue; + Result.Value := False; + end; + else + FilterError; + end; + + Code := Parser.GetNext(StrLexem); +end; + +procedure TData.CreateFilterExpression(Text: string); +begin + FreeFilterExpression; + if Trim(Text) <> '' then begin + Parser := TBoolParser.Create(Text); + try + try + Parser.ToBegin(); + Code := Parser.GetNext(StrLexem); + FilterExpression := OrExpr(); + + if (Code <> lcEnd) then + FilterError; + except + FreeFilterExpression; + raise; + end; + finally + Parser.Free; + end; + end; +end; + +procedure TData.FreeFilterExpression; +var + Node: TExpressionNode; +begin + while FirstAlloc <> nil do begin + Node := FirstAlloc; + FirstAlloc := FirstAlloc.NextAlloc; + Node.Free; + end; + FilterExpression := nil; +end; + +function TData.Eval(Node: TExpressionNode): boolean; + + function VarIsString(const V: Variant): boolean; + begin + Result := (VarType(V) = varString){$IFDEF WIN32} or (VarType(V) = varOleStr){$ENDIF}{$IFDEF CLR} or (VarType(V) = varChar){$ENDIF}; + end; + +var + V1,V2: variant; + DateField1: boolean; + DateField2: boolean; + FieldDesc: TFieldDesc; + + function MatchesMask(St: string; Mask: string): boolean; + const + WildcardAst = '*'; + WildcardPct = '%'; + WildcardOne = '_'; + type + TMatchesResult = (mrFalse,mrTrue,mrEnd); + + function SubMatchesMask(StIndex, MaskIndex: integer): TMatchesResult; + begin + while (MaskIndex <= Length(Mask)) and + ((StIndex <= Length(St)) or + ((Mask[MaskIndex] = WildcardAst) or (Mask[MaskIndex] = WildcardPct))) do begin + if (Mask[MaskIndex] = WildcardAst) or (Mask[MaskIndex] = WildcardPct) then begin + if MaskIndex = Length(Mask) then begin //- + Result := mrTrue; // Speed up + Exit; // with mask '*' + end //- + else + case SubMatchesMask(StIndex, MaskIndex + 1) of + mrTrue: begin + Result := mrTrue; + Exit; + end; + mrFalse: + if StIndex > Length(St) then begin + Result := mrEnd; + Exit; + end + else + Inc(StIndex); + mrEnd: begin + Result := mrEnd; + Exit; + end; + end; + end + else + if (St[StIndex] = Mask[MaskIndex]) or (Mask[MaskIndex] = WildcardOne) + then begin + Inc(StIndex); + Inc(MaskIndex); + end + else begin + Result := mrFalse; + Exit; + end; + end; + + if StIndex > Length(St) then + if MaskIndex > Length(Mask) then + Result := mrTrue + else + Result := mrEnd + else + Result := mrFalse; + end; + begin + Result := SubMatchesMask(1, 1) = mrTrue; + end; + +{$IFNDEF VER6P} + function TryStrToDateTime(const S: string; out Value: TDateTime): Boolean; + begin + try + Value := StrToDateTime(s); + Result := True; + except + Result := False; + end; + end; +{$ENDIF} + + procedure NormalizeDateField(var V: Variant); +{$IFNDEF CLR} + var + d: TDateTime; +{$ENDIF} + begin + if VarIsString(V) then + {$IFDEF CLR} + V := TDateTime(V); + {$ELSE} + if TryStrToDateTime(V, d) then + V := d + else + V := VarToDateTime(V); + {$ENDIF} + end; + +begin + Assert(Node <> nil); + + Result := False; + + if Node.NodeType in [ntEqual, ntMore, ntLess, ntMoreEqual, ntLessEqual, + ntNoEqual, ntLike] + then begin + Assert(Node.LeftOperand <> nil); + Assert(Node.RightOperand <> nil); + + DateField1 := False; + DateField2 := False; + + case Node.LeftOperand.NodeType of + ntField: begin + FieldDesc := Node.LeftOperand.FieldDesc; + GetFieldAsVariant(FieldDesc.FieldNo, FilterRecBuf, V1); + DateField1 := FieldDesc.DataType in [dtDateTime, dtDate, dtTime]; + end; + ntValue: + V1 := Node.LeftOperand.Value; + end; + + case Node.RightOperand.NodeType of + ntField: begin + FieldDesc := Node.RightOperand.FieldDesc; + GetFieldAsVariant(FieldDesc.FieldNo, FilterRecBuf, V2); + DateField2 := FieldDesc.DataType in [dtDateTime, dtDate, dtTime]; + end; + ntValue: + V2 := Node.RightOperand.Value; + end; + + if DateField1 then + NormalizeDateField(V2); /// CR-D12823 + if DateField2 then + NormalizeDateField(V1); + + if FilterCaseInsensitive then begin + if VarIsString(V1) then + V1 := AnsiUpperCase(VarToStr(V1)); + if VarIsString(V2) then + V2 := AnsiUpperCase(VarToStr(V2)); + end; + +// if FilterNoPartialCompare then; + + end; + + if (VarIsNull(V1) or VarIsNull(V2)) and (Node.NodeType in [ntMore, ntLess, ntMoreEqual, ntLessEqual]) then begin + // To prevent exception on compare value with Null + Result := False; + Exit; + end; + + case Node.NodeType of + ntEqual, ntLike: + if FilterNoPartialCompare or not VarIsString(V1) then + Result := V1 = V2 + else + Result := MatchesMask(VarToStr(V1), VarToStr(V2)); + ntNoEqual: + if FilterNoPartialCompare or not VarIsString(V1) then + Result := V1 <> V2 + else + Result := not MatchesMask(VarToStr(V1), VarToStr(V2)); + ntMore: + Result := V1 > V2; + ntLess: + Result := V1 < V2; + ntMoreEqual: + Result := V1 >= V2; + ntLessEqual: + Result := V1 <= V2; + ntAnd: + Result := Eval(Node.LeftOperand) and Eval(Node.RightOperand); + ntOr: + Result := Eval(Node.LeftOperand) or Eval(Node.RightOperand); + ntNot: + Result := not Eval(Node.LeftOperand); + ntTrue: + Result := True; + ntFalse: + Result := False; + else + Assert(False); + end; +end; + +procedure TData.FilterUpdated; +begin +end; + +function TData.Filtered: boolean; +begin + Result := Assigned(FFilterFunc) or Assigned(FilterExpression) or + Assigned(FFilterMDFunc); +end; + +{ Blobs } + +function TData.InternalGetObject(FieldNo: word; RecBuf: IntPtr): TSharedObject; +var + IsBlank: boolean; + Ptr: IntPtr; +begin + Ptr := Marshal.AllocHGlobal(sizeof(IntPtr)); + try + GetField(FieldNo, RecBuf, Ptr, IsBlank); + Result := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(Ptr))); + finally + Marshal.FreeHGlobal(Ptr); + end; +end; + +function TData.GetObject(FieldNo: word; RecBuf: IntPtr): TSharedObject; +begin + if not IsBlobFieldType(Fields[FieldNo - 1].DataType) then + raise Exception.Create(SNeedBlobType); + + Result := InternalGetObject(FieldNo, RecBuf); + + Assert(Result <> nil, 'Object for field ' + Fields[FieldNo - 1].Name + '(' + IntToStr(FieldNo) + ') = nil'); +end; + +procedure TData.SetObject(FieldNo: word; RecBuf: IntPtr; Obj: TSharedObject); +begin + if not IsBlobFieldType(Fields[FieldNo - 1].DataType) then + raise Exception.Create(SNeedBlobType); + + Marshal.WriteIntPtr(RecBuf, Fields[FieldNo - 1].Offset, Obj.GCHandle); +end; + +{$IFDEF VER6} +{$IFDEF MSWINDOWS} +var + DefaultUserCodePage: Integer; +{$ENDIF} + +type + PStrRec = ^StrRec; + StrRec = packed record + refCnt: Longint; + length: Longint; + end; + +{$IFDEF LINUX} +const + libc = 'libc.so.6'; + +const + LC_CTYPE = 0; + _NL_CTYPE_CODESET_NAME = LC_CTYPE shl 16 + 14; + +function iconv_open(ToCode: PChar; FromCode: PChar): Integer; cdecl; + external libc name 'iconv_open'; + +function nl_langinfo(item: integer): pchar; cdecl; + external libc name 'nl_langinfo'; + +function iconv(cd: Integer; var InBuf; var InBytesLeft: Integer; var OutBuf; var OutBytesLeft: Integer): Integer; cdecl; + external libc name 'iconv'; + +function iconv_close(cd: Integer): Integer; cdecl; + external libc name 'iconv_close'; + +function CharacterSizeWideChar(P: Pointer; MaxLen: Integer): Integer; +begin + Result := SizeOf(WideChar); +end; + +procedure LocaleConversionError; +begin + Error(TRuntimeError(234) {reCodesetConversion}); +end; + +type + TCharacterSizeProc = function(P: Pointer; MaxLen: Integer): Integer; + +function __errno_location: PInteger; cdecl; + external libc name '__errno_location'; + +function GetLastError: Integer; +begin + Result := __errno_location^; +end; + +function BufConvert(var Dest; DestBytes: Integer; + const Source; SrcBytes: Integer; + context: Integer; + DestCharSize: Integer; + SourceCharSize: TCharacterSizeProc): Integer; +const + E2BIG = 7; + EINVAL = 22; + EILSEQ = 84; +const + UnknownCharIndicator = '?'; +var + SrcBytesLeft, DestBytesLeft, Zero: Integer; + s, d, pNil: Pointer; + LastError: Integer; + cs: Integer; +begin + Result := -1; + + // Make copies of parameters. iconv modifies param pointers. + DestBytesLeft := DestBytes; + SrcBytesLeft := SrcBytes; + s := Pointer(Source); + d := Pointer(Dest); + + while True do + begin + Result := iconv(context, s, SrcBytesLeft, d, DestBytesLeft); + if Result <> -1 then + Break + else + begin + LastError := GetLastError; + if (LastError = E2BIG) and (SrcBytesLeft > 0) and (DestBytesLeft > 0) then + Continue; + + if (LastError <> EINVAL) and (LastError <> EILSEQ) then + LocaleConversionError; + pNil := nil; + Zero := 0; + iconv(context, pNil, Zero, pNil, Zero); // Reset state of context + + // Invalid input character in conversion stream. + // Skip input character and write '?' to output stream. + // The glibc iconv() implementation also returns EILSEQ + // for a valid input character that cannot be converted + // into the requested codeset. + cs := SourceCharSize(s, SrcBytesLeft); + Inc(Cardinal(s), cs); + Dec(SrcBytesLeft, cs); + + Assert(DestCharSize in [1, 2]); + case DestCharSize of + 1: + begin + PChar(d)^ := UnknownCharIndicator; + Inc(PChar(d)); + Dec(DestBytesLeft, SizeOf(Char)); + end; + + 2: + begin + PWideChar(d)^ := UnknownCharIndicator; + Inc(PWideChar(d)); + Dec(DestBytesLeft, SizeOf(WideChar)); + end; + end; + end; + end; + + if Result <> -1 then + Result := DestBytes - DestBytesLeft; +end; +{$ENDIF} + +function CharFromWCharD7(CharDest: PChar; DestBytes: Integer; const WCharSource: PWideChar; SrcChars: Integer): Integer; +{$IFDEF LINUX} +var + IconvContext: Integer; +{$ENDIF} +begin +{$IFDEF LINUX} + if (DestBytes <> 0) and (SrcChars <> 0) then + begin + IconvContext := iconv_open(nl_langinfo(_NL_CTYPE_CODESET_NAME), 'UNICODELITTLE'); + if IconvContext = -1 then + LocaleConversionError; + try + Result := BufConvert(CharDest, DestBytes, WCharSource, SrcChars * SizeOf(WideChar), + IconvContext, 1, CharacterSizeWideChar); + finally + iconv_close(IconvContext); + end; + end + else + Result := 0; +{$ENDIF} +{$IFDEF MSWINDOWS} + Result := WideCharToMultiByte(DefaultUserCodePage, 0, WCharSource, SrcChars, + CharDest, DestBytes, nil, nil); +{$ENDIF} +end; + +procedure _LStrClr(var S); +var + P: PStrRec; +begin + if Pointer(S) <> nil then + begin + P := Pointer(Integer(S) - Sizeof(StrRec)); + Pointer(S) := nil; + if P.refCnt > 0 then + if InterlockedDecrement(P.refCnt) = 0 then + FreeMem(P); + end; +end; + +function _NewAnsiString(length: Longint): Pointer; +var + P: PStrRec; +begin + Result := nil; + if length <= 0 then Exit; + // Alloc an extra null for strings with even length. This has no actual cost + // since the allocator will round up the request to an even size anyway. + // All widestring allocations have even length, and need a double null terminator. + GetMem(P, length + sizeof(StrRec) + 1 + ((length + 1) and 1)); + Result := Pointer(Integer(P) + sizeof(StrRec)); + P.length := length; + P.refcnt := 1; + PWideChar(Result)[length div 2] := #0; // length guaranteed >= 2 +end; + +procedure _LStrFromPCharLen(var Dest: AnsiString; Source: PAnsiChar; Length: Integer); +asm + { -> EAX pointer to dest } + { EDX source } + { ECX length } + + PUSH EBX + PUSH ESI + PUSH EDI + + MOV EBX,EAX + MOV ESI,EDX + MOV EDI,ECX + + { allocate new string } + + MOV EAX,EDI + + CALL _NewAnsiString + MOV ECX,EDI + MOV EDI,EAX + + TEST ESI,ESI + JE @@noMove + + MOV EDX,EAX + MOV EAX,ESI + CALL Move + + { assign the result to dest } + +@@noMove: + MOV EAX,EBX + CALL _LStrClr + MOV [EBX],EDI + + POP EDI + POP ESI + POP EBX +end; + +procedure _LStrFromPWCharLenD7(var Dest: AnsiString; Source: PWideChar; Length: Integer); +var + DestLen: Integer; + Buffer: array[0..4095] of Char; +begin + if Length <= 0 then + begin + _LStrClr(Dest); + Exit; + end; + if Length+1 < (High(Buffer) div sizeof(WideChar)) then + begin + DestLen := CharFromWCharD7(Buffer, High(Buffer), Source, Length); + if DestLen >= 0 then + begin + _LStrFromPCharLen(Dest, Buffer, DestLen); + Exit; + end; + end; + + DestLen := (Length + 1) * sizeof(WideChar); + SetLength(Dest, DestLen); // overallocate, trim later + DestLen := CharFromWCharD7(Pointer(Dest), DestLen, Source, Length); + if DestLen < 0 then DestLen := 0; + SetLength(Dest, DestLen); +end; + +procedure _LStrFromWStrD7(var Dest: AnsiString; const Source: WideString); +asm + { -> EAX pointer to dest } + { EDX pointer to WideString data } + + XOR ECX,ECX + TEST EDX,EDX + JE @@1 + MOV ECX,[EDX-4] + SHR ECX,1 +@@1: JMP _LStrFromPWCharLenD7 +end; +{$ENDIF} + +function TData.ReadBlob(FieldNo: word; RecBuf: IntPtr; Position: longint; + Count: longint; Dest: IntPtr; FromRollback: boolean = false; + TrueUnicode: boolean = False): longint; +var + Blob: TBlob; + LenBytes, BlobPos: longint; + Ws, Buf: IntPtr; + s: string; + +begin + Blob := TBlob(GetObject(FieldNo, RecBuf)); + if FromRollback and (Blob.Rollback <> nil) then + Blob := Blob.Rollback; + + if not Blob.FIsUnicode or TrueUnicode then + Result := Blob.Read(Position, Count, Dest) + else + begin + BlobPos := Blob.TranslatePosition(Position); + if Count = 0 then + LenBytes := LongInt(Blob.Size) - BlobPos + else + LenBytes := Blob.TranslatePosition(Count); + + Ws := Marshal.AllocHGlobal(LenBytes); + Buf := nil; + try + Result := Blob.Read(BlobPos, LenBytes, Ws); + {$IFNDEF VER6} + s := Marshal.PtrToStringUni(Ws, Result div 2); + {$ELSE} + _LStrFromWStrD7(s, Marshal.PtrToStringUni(Ws, Result div 2)); + {$ENDIF} + Result := Length(s); + Buf := Marshal.StringToHGlobalAnsi(s); + CopyBuffer(Buf, Dest, Result); + finally + Marshal.FreeHGlobal(Ws); + if Buf <> nil then + Marshal.FreeCoTaskMem(Buf); + end; + end; +end; + +procedure TData.WriteBlob(FieldNo: word; RecBuf: IntPtr; Position: longint; + Count: longint; Source: IntPtr; TrueUnicode: boolean = False); +var + Blob: TBlob; + Buf: IntPtr; + S: string; + Ws: WideString; + +begin + Blob := TBlob(GetObject(FieldNo, RecBuf)); + + Blob.EnableRollback; + if not Blob.FIsUnicode or TrueUnicode then + Blob.Write(Position, Count, Source) + else begin + S := Marshal.PtrToStringAnsi(Source, Count); + Ws := S; + Count := Length(Ws) * 2; // for MBCS this differ from Count * 2 + Position := Blob.TranslatePosition(Position); + Buf := Marshal.StringToHGlobalUni(Ws); + try + Blob.Write(Position, Count, Buf); //Count length in bytes + finally + Marshal.FreeCoTaskMem(Buf); + end; + end; + + SetNull(FieldNo, RecBuf, False); +end; + +procedure TData.TruncateBlob(FieldNo: word; RecBuf: IntPtr; Size: longint; + TrueUnicode: boolean = False); +var + Blob:TBlob; +begin + Blob := TBlob(GetObject(FieldNo, RecBuf)); + + Blob.EnableRollback; + if Blob.FIsUnicode and not TrueUnicode then + Size := Blob.TranslatePosition(Size); + + Blob.Truncate(Size); + + if Size = 0 then + SetNull(FieldNo, RecBuf, True); +end; + +function TData.GetBlobSize(FieldNo: word; RecBuf: IntPtr; FromRollback: boolean = false; + TrueUnicode: boolean = False): longint; +var + Blob: TBlob; +begin + if GetNull(FieldNo, RecBuf) then begin + Result := 0; + Exit; + end; + Blob := TBlob(GetObject(FieldNo, RecBuf)); + if FromRollback and (Blob.Rollback <> nil) then + Blob := Blob.Rollback; + if not Blob.FIsUnicode or TrueUnicode then + Result := Blob.Size + else + Result := Blob.GetSizeAnsi; +end; + +procedure TData.SetBlobSize(FieldNo: word; RecBuf: IntPtr; NewSize: longint; FromRollback: boolean = false; + TrueUnicode: boolean = False); +var + Blob: TBlob; + OldSize: integer; +begin + SetNull(FieldNo, RecBuf, False); + + Blob := TBlob(GetObject(FieldNo, RecBuf)); + if FromRollback and (Blob.Rollback <> nil) then + Blob := Blob.Rollback; + + if Blob.FIsUnicode and not TrueUnicode then begin + // Blob.Size is char count * 2 + OldSize := Blob.GetSizeAnsi; + if NewSize > OldSize then + Blob.Size := Integer(Blob.Size) + (NewSize - OldSize) * 2 + else + Blob.Size := Blob.TranslatePosition(NewSize); + end + else + Blob.Size := NewSize; +end; + +procedure TData.SetCachedUpdates(Value: boolean); +begin + if Value <> FCachedUpdates then begin + if FCachedUpdates then + CancelUpdates; + + FCachedUpdates := Value; + + if FCachedUpdates then + FFilterItemTypes := [isUnmodified, isUpdated, isAppended]; + end; +end; + +procedure TData.SetFilterText(Value: string); +begin + if Value <> FFilterText then begin + if Active then + CreateFilterExpression(Value); + FFilterText := Value; + end; +end; + +procedure TData.SetFilterItemTypes(Value:TItemTypes); +begin + FFilterItemTypes := Value; +end; + +{ TSortColumns } + +destructor TSortColumns.Destroy; +begin + Clear; + + inherited; +end; + +procedure TSortColumns.Clear; +var + i: integer; +begin + for i := 0 to Count - 1 do + if Items[i] <> nil then + TSortColumn(Items[i]).Free; + + inherited Clear; +end; + +function TSortColumns.GetItems(Index: integer): TSortColumn; +begin + Result := TSortColumn(inherited Items[Index]); +end; + +{ TMemData } + +constructor TMemData.Create; +begin + inherited; + + BlockMan := TBlockManager.Create; + FIndexFields := TSortColumns.Create; + + InitData; +end; + +destructor TMemData.Destroy; +begin + inherited; + + FIndexFields.Free; + BlockMan.Free; + SetLength(FRecordNoCache, 0); +end; + +{ Items / Data } + +procedure TMemData.SetIndexFieldNames(Value: string); +begin + FIndexFieldNames := Value; + if Active then begin + UpdateIndexFields; + SortItems; + end; +end; + +procedure TMemData.UpdateIndexFields; +var + S, S1: string; + FldName: string; + FieldDesc: TFieldDesc; + SortColumn: TSortColumn; + ProcessedCS, ProcessedDESC: boolean; + + procedure RaiseError; + begin + raise Exception.Create('Invalid IndexFieldNames format!'); + end; + +begin + FIndexFields.Clear; + S := FIndexFieldNames; + if Trim(S) <> '' then begin + Parser := TBoolParser.Create(S); + + try + Parser.ToBegin(); + Code := Parser.GetNext(S1); + while Code <> lcEnd do begin + case Code of + lcIdent, lcString, lxLeftSqBracket: begin + if Code = lxLeftSqBracket then begin + Parser.OmitBlank := False; + Code := Parser.GetNext(S1); + FldName := ''; + while (Code <> lxRightSqBracket) and (Code <> lcEnd) do begin + FldName := FldName + S1; + Code := Parser.GetNext(S1); + end; + Parser.OmitBlank := True; + S1 := FldName; + end; + + FieldDesc := Fields.FindField(S1); + if FieldDesc = nil then + raise Exception.Create(Format(SFieldNotFound, [S1])); + SortColumn := TSortColumn.Create; + SortColumn.FieldDesc := FieldDesc; + SortColumn.CaseSensitive := True; + FIndexFields.Add(SortColumn); + Code := Parser.GetNext(S1); + ProcessedCS := False; + ProcessedDESC := False; + while not (((Code = lcSymbol) and ((S1 = ';') or (S1 = ','))) or (Code = lcEnd)) do begin + if Code = lcIdent then begin + if not ProcessedDESC and ('DESC' = UpperCase(S1)) then begin + SortColumn.DescendingOrder := True; + ProcessedDESC := True; + end + else + if not ProcessedCS and ('CIS' = UpperCase(S1)) then begin + SortColumn.CaseSensitive := False; + ProcessedCS := True; + end + else + if not ProcessedDESC and ('ASC' = UpperCase(S1)) then + ProcessedDESC := True + else + if not ProcessedCS and ('CS' = UpperCase(S1)) then + ProcessedCS := True + else + RaiseError; + Code := Parser.GetNext(S1); + end + else + RaiseError; + end; + end; + lcSymbol: begin + if (S1 <> ';') and (S1 <> ',') then + RaiseError; + Code := Parser.GetNext(S1); + end + else + RaiseError; + end; + end; + finally + Parser.Free; + end; + end; +end; + +{$IFNDEF CLR} +function TMemData.InternalAnsiStrComp(const Value1, Value2: IntPtr; + const Options: TLocateExOptions): integer; +begin + if lxCaseInsensitive in Options then + Result := AnsiStrICompS(Value1, Value2) + else + Result := AnsiStrCompS(Value1, Value2); +end; +{$ENDIF} + +function TMemData.InternalAnsiCompareText(const Value1, Value2: string; + const Options: TLocateExOptions): integer; +begin + if lxCaseInsensitive in Options then + Result := AnsiCompareTextS(Value1, Value2) + else + Result := AnsiCompareStrS(Value1, Value2); +end; + +function TMemData.InternalWStrLComp(const Value1, Value2: WideString; + const Options: TLocateExOptions): integer; +begin + if lxCaseInsensitive in Options then + Result := AnsiStrLICompWS(Value1, Value2, Length(Value1)) + else + Result := AnsiStrLCompWS(Value1, Value2, Length(Value1)) +end; + +function TMemData.InternalWStrComp(const Value1, Value2: WideString; + const Options: TLocateExOptions): integer; +begin + if lxCaseInsensitive in Options then + Result := AnsiStrICompWS(Value1, Value2) + else + Result := AnsiStrCompWS(Value1, Value2); +end; + +// Used to compare field value and string KeyValue with matching options +function TMemData.CompareStrValues(const Value: string; + const FieldValue: string; const Options: TLocateExOptions): integer; +var + Res: integer; + ValueLen: integer; +begin + if lxPartialCompare in Options then begin + if lxCaseInsensitive in Options then + Res := Pos(AnsiUpperCase(Value), AnsiUpperCase(FieldValue)) + else + Res := Pos(Value, FieldValue); + if Res = 0 then + Res := 1 + else + Res := 0; + end + else + if lxPartialKey in Options then begin + ValueLen := Length(Value); + if ValueLen = 0 then + ValueLen := Length(FieldValue); + if Length(FieldValue) >= ValueLen then + Result := 0 + else + Result := 1; + if Result <> 0 then + Exit // To avoid AV in case Len(Value) > Len(St) + else + Res := InternalAnsiCompareText(Value, Copy(FieldValue, 1, ValueLen), Options); + end + else + Res := InternalAnsiCompareText(Value, FieldValue, Options); + Result := Res; +end; + +function TMemData.CompareWideStrValues(const Value: WideString; + const FieldValue: WideString; const Options: TLocateExOptions): integer; +var + Res: integer; + ValueLen: integer; + +{$IFDEF MSWINDOWS} + ValueS, FieldValueS: string; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + if IsWin9x then begin + ValueS := Value; + FieldValueS := FieldValue; + Result := CompareStrValues(ValueS, FieldValueS, Options); + Exit; + end; +{$ENDIF} + + if lxPartialCompare in Options then begin + if lxCaseInsensitive in Options then + Res := Pos(WideUpperCase(Value), WideUpperCase(FieldValue)) + else + Res := Pos(Value, FieldValue); + if Res = 0 then + Res := 1 + else + Res := 0; + end + else + if lxPartialKey in Options then begin + ValueLen := Length(Value); + if Length(FieldValue) >= ValueLen then + Result := 0 + else + Result := 1; + if Result <> 0 then + Exit // To avoid AV in case Len(Value) > Len(St) + else + Res := InternalWStrLComp(Value, FieldValue, Options); + end + else + Res := InternalWStrComp(Value, FieldValue, Options); + Result := Res; +end; + +// Used to compare binary field value and binary KeyValue with matching options +function TMemData.CompareBinValues(const Value: IntPtr; + const ValueLen: integer; const FieldValue: IntPtr; + const FieldValueLen: integer; const Options: TLocateExOptions): integer; + + function CompareMem(FieldValue, Value: IntPtr; FieldValueLen: integer): integer; + var + i: integer; + begin + for i := 0 to FieldValueLen div 4 - 1 do begin + if Longword(Marshal.ReadInt32(Value, i shl 2)) > Longword(Marshal.ReadInt64(FieldValue, i shl 2)) then begin + Result := 1; + Exit; + end + else + if Longword(Marshal.ReadInt32(Value, i shl 2)) < Longword(Marshal.ReadInt64(FieldValue, i shl 2)) then begin + Result := -1; + Exit; + end + end; + for i := ((FieldValueLen - 1) and $fffffffc) to FieldValueLen - 1 do begin + if Marshal.ReadByte(Value, i) > Marshal.ReadByte(FieldValue, i) then begin + Result := 1; + Exit; + end + else + if Marshal.ReadByte(Value, i) > Marshal.ReadByte(FieldValue, i) then begin + Result := -1; + Exit; + end + end; + Result := 0; + end; + +var + i: integer; + +begin + if lxPartialCompare in Options then begin + if FieldValueLen >= ValueLen then + Result := 0 + else + Result := 1; + if Result <> 0 then + Exit // Field value is shorter when Value + else + begin + for i := integer(FieldValue) to integer(FieldValue) + FieldValueLen - ValueLen - 1 do begin + Result := CompareMem(IntPtr(i), Value, ValueLen); + if Result = 0 then + Break; + end; + Result := 1; + end; + end + else + if lxPartialKey in Options then begin + if FieldValueLen >= ValueLen then + Result := 0 + else + Result := 1; + if Result <> 0 then + Exit // Field value is shorter when Value + else + Result := CompareMem(FieldValue, Value, ValueLen); + end + else + begin + if ValueLen = FieldValueLen then + Result := 0 + else + Result := 1; + if Result <> 0 then + Exit + else + Result := CompareMem(FieldValue, Value, FieldValueLen); + end; +end; + +// Used to compare field value and KeyValue from MemDataSet.LocateRecord +function TMemData.CompareFieldValue( + ValuePtr: IntPtr; const ValueType: integer; FieldDesc: TFieldDesc; + RecBuf: IntPtr; const Options: TLocateExOptions): integer; +var + St: string; + WSt: WideString; + BlobValue: IntPtr; + FieldBuf: IntPtr; + FieldBufStatic: IntPtr; + IsBlank: boolean; + l: integer; + c, cValue: Currency; +{$IFDEF VER6P} + bcd, bcdValue: TBcd; +{$ENDIF} +{$IFDEF CLR} + Data: TBytes; +{$ENDIF} + Value: string; + WValue: WideString; + v1, v2: variant; + v1VType, v2VType: TVarType; +{$IFNDEF CLR} + v1VArray, v2VArray: PVarArray; + v1VArrayData, v2VArrayData: IntPtr; +{$ENDIF} + +begin + FieldBufStatic := nil; + + if FieldDesc.ParentField = nil then + FieldBuf := IntPtr(integer(RecBuf) + FieldDesc.Offset) + else begin + // support objects + FieldBufStatic := Marshal.AllocHGlobal(4001); + FieldBuf := FieldBufStatic; + GetField(FieldDesc.FieldNo, RecBuf, FieldBuf, IsBlank); // GetChildField + end; + + Result := 0; + try + case ValueType of + dtString, dtGuid: begin + case FieldDesc.DataType of + dtString: begin + {$IFNDEF CLR} + if not (lxPartialKey in Options) + and not (lxPartialCompare in Options) + and not (FieldDesc.Fixed and TrimFixedChar) + and not (not FieldDesc.Fixed and TrimVarChar) + then begin + Result := InternalAnsiStrComp(ValuePtr, FieldBuf, Options); + Exit; + end; + {$ENDIF} + St := Marshal.PtrToStringAnsi(FieldBuf); + if FieldDesc.Fixed and TrimFixedChar then + St := Trim(St) + else + if not FieldDesc.Fixed and TrimVarChar then + St := Trim(St) + end; + dtWideString: begin + St := Marshal.PtrToStringUni(FieldBuf); + if FieldDesc.Fixed and TrimFixedChar then + St := Trim(St) + else + if not FieldDesc.Fixed and TrimVarChar then + St := Trim(St) + end; + dtExtString: begin + {$IFNDEF CLR} + if not (lxPartialKey in Options) and not (lxPartialCompare in Options) then begin + Result := InternalAnsiStrComp(ValuePtr, Marshal.ReadIntPtr(FieldBuf), Options); + Exit; + end; + {$ENDIF} + St := Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(FieldBuf)); + end; + dtExtWideString: + St := Marshal.PtrToStringUni(Marshal.ReadIntPtr(FieldBuf)); + {$IFDEF VER5P} + dtVariant: + St := TVariantObject(GetGCHandleTarget(Marshal.ReadIntPtr(FieldBuf))).Value; + {$ENDIF} + dtInt8: + St := IntToStr(ShortInt(Marshal.ReadByte(FieldBuf))); + dtInt16: + St := IntToStr(Marshal.ReadInt16(FieldBuf)); + dtUInt16: + St := IntToStr(Word(Marshal.ReadInt16(FieldBuf))); + dtInt32: + St := IntToStr(Marshal.ReadInt32(FieldBuf)); + dtUInt32: + St := IntToStr(Longword(Marshal.ReadInt32(FieldBuf))); + dtInt64: + St := IntToStr(Marshal.ReadInt64(FieldBuf)); + dtFloat, dtCurrency: + St := FloatToStr(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf))); + dtDate: + St := DateToStr(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf))); + dtTime: + St := TimeToStr(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf))); + dtDateTime: + St := DateTimeToStr(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf))); + dtBCD: + begin + c := Marshal.ReadInt64(RecBuf, FieldDesc.Offset) / 10000; + St := CurrToStr(c); + Result := CompareStrValues(Marshal.PtrToStringAnsi(ValuePtr), St, Options + [lxCaseInsensitive]); + Exit; + end; + {$IFDEF VER6P} + dtFmtBCD: + begin + {$IFDEF CLR} + SetLength(Data, SizeOfTBcd); + Marshal.Copy(IntPtr(Integer(RecBuf) + FieldDesc.Offset), Data, 0, SizeOfTBcd); + bcd := TBcd.FromBytes(Data); + {$ELSE} + bcd := PBcd(PChar(RecBuf) + FieldDesc.Offset)^; + {$ENDIF} + St := BcdToStr(bcd); + Result := CompareStrValues(Marshal.PtrToStringAnsi(ValuePtr), St, Options + [lxCaseInsensitive]); + Exit; + end; + {$ENDIF} + dtGuid: + begin + Result := CompareStrValues(Marshal.PtrToStringAnsi(ValuePtr), Marshal.PtrToStringAnsi(FieldBuf), Options + [lxCaseInsensitive]); + Exit; + end; + else + if IsBlobFieldType(FieldDesc.DataType) then begin + l := GetBlobSize(FieldDesc.FieldNo, RecBuf); + BlobValue := Marshal.AllocHGlobal(l + 1); + try + ReadBlob(FieldDesc.FieldNo, RecBuf, 0, l, BlobValue); + St := Marshal.PtrToStringAnsi(BlobValue, l); + finally + Marshal.FreeHGlobal(BlobValue); + end; + end + else + raise EConvertError.Create(SCannotConvertType); + end; + + if ((FieldDesc.DataType = dtString) or (FieldDesc.DataType = dtWideString)) + and ((FieldDesc.Fixed and TrimFixedChar) or (not FieldDesc.Fixed and TrimVarChar)) then + Value := Trim(Marshal.PtrToStringAnsi(ValuePtr)) + else + Value := Marshal.PtrToStringAnsi(ValuePtr); + Result := CompareStrValues(Value, St, Options); + end; + dtWideString: begin + case FieldDesc.DataType of + dtWideString: begin + WSt := Marshal.PtrToStringUni(FieldBuf); + if FieldDesc.Fixed and TrimFixedChar then + WSt := Trim(WSt) + else + if not FieldDesc.Fixed and TrimVarChar then + WSt := Trim(WSt) + end; + dtString: begin + WSt := Marshal.PtrToStringAnsi(FieldBuf); + if FieldDesc.Fixed and TrimFixedChar then + WSt := Trim(WSt) + else + if not FieldDesc.Fixed and TrimVarChar then + WSt := Trim(WSt) + end; + dtExtString: + WSt := Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(FieldBuf)); + dtExtWideString: + WSt := Marshal.PtrToStringUni(Marshal.ReadIntPtr(FieldBuf)); + {$IFDEF VER5P} + dtVariant: + WSt := TVariantObject(GetGCHandleTarget(Marshal.ReadIntPtr(FieldBuf))).Value; + {$ENDIF} + dtInt8: + WSt := IntToStr(ShortInt(Marshal.ReadByte(FieldBuf))); + dtInt16: + WSt := IntToStr(Marshal.ReadInt16(FieldBuf)); + dtUInt16: + WSt := IntToStr(Word(Marshal.ReadInt16(FieldBuf))); + dtInt32: + WSt := IntToStr(Marshal.ReadInt32(FieldBuf)); + dtUInt32: + WSt := IntToStr(Longword(Marshal.ReadInt16(FieldBuf))); + dtInt64: + WSt := IntToStr(Marshal.ReadInt64(FieldBuf)); + dtFloat, dtCurrency: + WSt := FloatToStr(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf))); + dtDate: + WSt := DateToStr(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf))); + dtTime: + WSt := TimeToStr(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf))); + dtDateTime: + WSt := DateTimeToStr(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf))); + dtBCD: + begin + c := Marshal.ReadInt64(RecBuf, FieldDesc.Offset) / 10000; + WSt := CurrToStr(c); + Result := CompareWideStrValues(Marshal.PtrToStringUni(ValuePtr), WSt, Options + [lxCaseInsensitive]); + Exit; + end; + else + if IsBlobFieldType(FieldDesc.DataType) then begin + BlobValue := Marshal.AllocHGlobal(GetBlobSize(FieldDesc.FieldNo, RecBuf)); + try + ReadBlob(FieldDesc.FieldNo, RecBuf, 0, 0, BlobValue); + St := Marshal.PtrToStringUni(BlobValue); + finally + Marshal.FreeHGlobal(BlobValue); + end; + end + else + raise EConvertError.Create(SCannotConvertType); + end; + + if ((FieldDesc.DataType = dtString) or (FieldDesc.DataType = dtWideString)) + and ((FieldDesc.Fixed and TrimFixedChar) or (not FieldDesc.Fixed and TrimVarChar)) then + WValue := Trim(Marshal.PtrToStringUni(ValuePtr)) + else + WValue := Marshal.PtrToStringUni(ValuePtr); + Result := CompareWideStrValues(WValue, WSt, Options); + end; + dtInt8: + if ShortInt(Marshal.ReadByte(FieldBuf)) < ShortInt(Marshal.ReadByte(ValuePtr)) then + Result := 1 + else + if ShortInt(Marshal.ReadByte(FieldBuf)) > ShortInt(Marshal.ReadByte(ValuePtr)) then + Result := -1 + else + Result := 0; + dtInt16: + if Marshal.ReadInt16(FieldBuf) < Marshal.ReadInt16(ValuePtr) then + Result := 1 + else + if Marshal.ReadInt16(FieldBuf) > Marshal.ReadInt16(ValuePtr) then + Result := -1 + else + Result := 0; + dtUInt16: + if Word(Marshal.ReadInt16(FieldBuf)) < Word(Marshal.ReadInt16(ValuePtr)) then + Result := 1 + else + if Word(Marshal.ReadInt16(FieldBuf)) > Word(Marshal.ReadInt16(ValuePtr)) then + Result := -1 + else + Result := 0; + dtInt32: + if Marshal.ReadInt32(FieldBuf) < Marshal.ReadInt32(ValuePtr) then + Result := 1 + else + if Marshal.ReadInt32(FieldBuf) > Marshal.ReadInt32(ValuePtr) then + Result := -1 + else + Result := 0; + dtUInt32: + if Longword(Marshal.ReadInt32(FieldBuf)) < Longword(Marshal.ReadInt32(ValuePtr)) then + Result := 1 + else + if Longword(Marshal.ReadInt32(FieldBuf)) > Longword(Marshal.ReadInt32(ValuePtr)) then + Result := -1 + else + Result := 0; + dtInt64: + if Marshal.ReadInt64(FieldBuf) < Marshal.ReadInt64(ValuePtr) then + Result := 1 + else + if Marshal.ReadInt64(FieldBuf) > Marshal.ReadInt64(ValuePtr) then + Result := -1 + else + Result := 0; + dtBoolean: + if (Marshal.ReadByte(FieldBuf) = 0) = (Marshal.ReadByte(ValuePtr) = 0) then // Cannot use 'boolean(FieldBuf^) = boolean(ValuePtr^)' because 'True' may have any value without 0 + Result := 0 + else + if (Marshal.ReadByte(FieldBuf) = 0) then + Result := 1 + else + Result := -1; + dtFloat, dtCurrency, + dtDateTime, dtDate, dtTime: begin + if BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf)) < BitConverter.Int64BitsToDouble(Marshal.ReadInt64(ValuePtr)) then + Result := 1 + else + if BitConverter.Int64BitsToDouble(Marshal.ReadInt64(FieldBuf)) > BitConverter.Int64BitsToDouble(Marshal.ReadInt64(ValuePtr)) then + Result := -1 + else + Result := 0; + end; + dtBytes: + Result := CompareBinValues(IntPtr(integer(ValuePtr) + SizeOf(Word)), + Marshal.ReadInt16(ValuePtr), FieldBuf, FieldDesc.Length, Options); + dtVarBytes: + Result := CompareBinValues(IntPtr(integer(ValuePtr) + SizeOf(Word)), + Marshal.ReadInt16(ValuePtr), IntPtr(integer(FieldBuf) + SizeOf(Word)), + Marshal.ReadInt16(FieldBuf), Options); + dtExtVarBytes: + Result := CompareBinValues(IntPtr(integer(ValuePtr) + SizeOf(Word)), + Marshal.ReadInt16(ValuePtr), + IntPtr(integer(Marshal.ReadIntPtr(FieldBuf)) + SizeOf(Word)), + Marshal.ReadInt16(Marshal.ReadIntPtr(FieldBuf)), Options); + dtBCD: begin + c := Marshal.ReadInt64(RecBuf, FieldDesc.Offset) / 10000; + cValue := BitConverter.Int64BitsToDouble(Marshal.ReadInt64(ValuePtr)); + if c < cValue then + Result := 1 + else + if c > cValue then + Result := -1 + else + Result := 0; + end; + dtVariant: begin + v1 := TVariantObject(GetGCHandleTarget(Marshal.ReadIntPtr(FieldBuf))).Value; + v2 := TVariantObject(GetGCHandleTarget(Marshal.ReadIntPtr(ValuePtr))).Value; + v1VType := VarType(v1); + v2VType := VarType(v2); + + {$IFNDEF CLR} + if (v1VType = varArray + varByte) or (v2VType = varArray + varByte) then begin + if (v1VType = varNull) and (v2VType = varNull) then + Result := 0 + else + if v1VType = varNull then // (v1VType = varNull) and (v2VType = varArray + varByte) + Result := 1 + else + if v2VType = varNull then // (v2VType = varNull) and (v1VType = varArray + varByte) + Result := -1 + else // (v1VType <> varNull) and (v2VType <> varNull) + if v1VType <> v2VType then begin + if v1VType < v2VType then + Result := 1 + else + Result := -1; + end + else begin + Assert(v1VType = varArray + varByte, 'Invalid v1.VType'); + Assert(v2VType = varArray + varByte, 'Invalid v2.VType'); + + v1VArray := TVarData(v1).VArray; + v2VArray := TVarData(v2).VArray; + if (v1VArray = nil) and (v2VArray = nil) then + Result := 0 + else + if (v1VArray = nil) and (v2VArray = nil) then + Result := 0 + else + if v1VArray = nil then // (v1VArray = nil) and (v2VArray <> nil) + Result := 1 + else + if v2VArray = nil then // (v2VArray = nil) and (v1VArray <> nil) + Result := -1 + else // (v1VArray <> nil) and (v2VArray <> nil) + if v1VArray.Bounds[0].ElementCount < v2VArray.Bounds[0].ElementCount then + Result := 1 + else + if v1VArray.Bounds[0].ElementCount > v2VArray.Bounds[0].ElementCount then + Result := - 1 + else begin + v1VArrayData := v1VArray.Data; + v2VArrayData := v2VArray.Data; + if (v1VArrayData = nil) and (v2VArrayData = nil) then + Result := 0 + else + if (v1VArrayData = nil) and (v2VArrayData = nil) then + Result := 0 + else + if v1VArrayData = nil then // (v1VArrayData = nil) and (v2VArrayData <> nil) + Result := 1 + else + if v2VArrayData = nil then // (v2VArrayData = nil) and (v1VArrayData <> nil) + Result := -1 + else // (v1VArrayData <> nil) and (v2VArrayData <> nil) + Result := CompareBinValues(v1VArrayData, v1VArray.Bounds[0].ElementCount, v2VArrayData, v2VArray.Bounds[0].ElementCount, Options); + end; + end + end + else + {$ENDIF} + {$IFNDEF VER6P} + if (v1VType = v2VType) and (v1VType = varDecimal) then begin + if PInt64(@TVarData(v1).VInteger)^ < PInt64(@TVarData(v2).VInteger)^ then + Result := 1 + else + if PInt64(@TVarData(v1).VInteger)^ > PInt64(@TVarData(v2).VInteger)^ then + Result := -1 + else + Result := 0; + end + else + {$ENDIF} + if (v1VType = v2VType) or + ((((v1VType >= varSmallint) and (v1VType <= varCurrency)) or ((v1VType >= varDecimal) and (v1VType <= varInt64))) and + (((v2VType >= varSmallint) and (v2VType <= varCurrency)) or ((v2VType >= varDecimal) and (v2VType <= varInt64)))) then begin // Equal VarType or Numbers + if v1 < v2 then + Result := 1 + else + if v1 > v2 then + Result := -1 + else + Result := 0; + end + else + if ((v1VType = varString) or (v1VType = varOleStr)) or + ((v2VType = varString) or (v2VType = varOleStr)) then begin// String + Result := CompareStrValues(v2, v1, Options) + end + else // VarType is different + if v1VType < v2VType then + Result := 1 + else + Result := -1; + end; + {$IFDEF VER6P} + dtFmtBCD: begin + {$IFDEF CLR} + SetLength(Data, SizeOfTBcd); + + Marshal.Copy(IntPtr(Integer(RecBuf) + FieldDesc.Offset), Data, 0, SizeOfTBcd); + bcd := TBcd.FromBytes(Data); + + Marshal.Copy(ValuePtr, Data, 0, SizeOfTBcd); + bcdValue := TBcd.FromBytes(Data); + {$ELSE} + bcd := PBcd(PChar(RecBuf) + FieldDesc.Offset)^; + bcdValue := PBcd(ValuePtr)^; + {$ENDIF} + Result := BcdCompare(bcdValue, bcd); + end; + {$ENDIF} + else + Assert(False, 'Unknown ValueType = ' + IntToStr(ValueType)); + end; + finally + if FieldBufStatic <> nil then + Marshal.FreeHGlobal(FieldBufStatic); + end; +end; + +function TMemData.CompareFields(RecBuf1: IntPtr; RecBuf2: IntPtr; SortColumn: TSortColumn): integer; +var + Options: TLocateExOptions; +begin + if not SortColumn.CaseSensitive then + Options := [lxCaseInsensitive] + else + Options := []; + + Result := CompareFields(RecBuf1, RecBuf2, SortColumn.FieldDesc, Options); +end; + +function TMemData.CompareFields(RecBuf1: IntPtr; RecBuf2: IntPtr; FieldDesc: TFieldDesc; Options: TLocateExOptions = []): integer; +var + FieldBuf: IntPtr; + IsBlank1, IsBlank2: boolean; + DataType: integer; + NativeBuffer: boolean; +begin + FieldBuf := nil; + NativeBuffer := True; + try + FieldBuf := GetFieldBuf(RecBuf1, FieldDesc, DataType, IsBlank1, NativeBuffer); + IsBlank2 := GetNull(FieldDesc.FieldNo, RecBuf2); + if IsBlank1 and not IsBlank2 then + Result := -1 + else + if not IsBlank1 and IsBlank2 then + Result := 1 + else + if IsBlank1 and IsBlank2 then + Result := 0 + else + Result := CompareFieldValue(FieldBuf, DataType, FieldDesc, + RecBuf2, Options); + finally + if not NativeBuffer then + Marshal.FreeHGlobal(FieldBuf); + end; +end; + +function TMemData.CompareRecords(RecBuf1, RecBuf2: IntPtr): integer; +var + SortColumn: TSortColumn; + i: integer; + Dir: integer; + + CalcRecBuf1, CalcRecBuf2: IntPtr; +begin + CalcRecBuf1 := nil; + CalcRecBuf2 := nil; + try + Result := 0; + for i := 0 to FIndexFields.Count - 1 do begin + SortColumn := FIndexFields.Items[i]; + if SortColumn.DescendingOrder then + Dir := -1 + else + Dir := 1; + + if SortColumn.FieldDesc.FieldDescKind = fdkCalculated then begin + if CalcRecBuf1 = nil then begin + CalcRecBuf1 := Marshal.AllocHGlobal(FRecordSize + CalcRecordSize); + CalcRecBuf2 := Marshal.AllocHGlobal(FRecordSize + CalcRecordSize); + if Assigned(FOnGetCachedBuffer) then + FOnGetCachedBuffer(CalcRecBuf1, RecBuf1); + if Assigned(FOnGetCachedBuffer) then + FOnGetCachedBuffer(CalcRecBuf2, RecBuf2); + end; + Result := CompareFields(CalcRecBuf1, CalcRecBuf2, SortColumn) * Dir; + end + else + Result := CompareFields(RecBuf1, RecBuf2, SortColumn) * Dir; + + if Result <> 0 then + break; + end; + finally + if CalcRecBuf1 <> nil then + Marshal.FreeHGlobal(CalcRecBuf1); + if CalcRecBuf2 <> nil then + Marshal.FreeHGlobal(CalcRecBuf2); + end; +end; + +procedure TMemData.Exchange(I, J: PItemHeader); +var + NextToI, PrevToJ: PItemHeader; +begin + NextToI := I.Next; + PrevToJ := J.Prev; + if IntPtr(I.Prev) <> nil then + I.Prev.Next := J; + if IntPtr(J.Next) <> nil then + J.Next.Prev := I; + J.Prev := I.Prev; + I.Next := J.Next; + if NextToI = J then begin + I.Prev := J; + J.Next := I; + end + else begin + I.Prev := PrevToJ; + if IntPtr(PrevToJ) <> nil then + PrevToJ.Next := I; + J.Next := NextToI; + if IntPtr(NextToI) <> nil then + NextToI.Prev := J; + end; + + if I = FirstItem then FirstItem := J; + if J = LastItem then LastItem := I; +end; + +procedure TMemData.MoveSortedRecord(Dir: integer); +begin + if Dir = 0 then + Exit; + while True do begin + if Dir > 0 then begin + if (IntPtr(CurrentItem.Next) <> nil) and + (CompareRecords(IntPtr(Integer(CurrentItem) + sizeof(TItemHeader)), IntPtr(Integer(CurrentItem.Next) + sizeof(TItemHeader))) > 0) + then + Exchange(CurrentItem, CurrentItem.Next) + else + break; + end + else begin + if (IntPtr(CurrentItem.Prev) <> nil) and + (CompareRecords(IntPtr(Integer(CurrentItem) + sizeof(TItemHeader)), IntPtr(Integer(CurrentItem.Prev) + sizeof(TItemHeader))) < 0) + then + Exchange(CurrentItem.Prev, CurrentItem) + else + break; + end; + end; +end; + +procedure TMemData.QuickSort(L, R, P: PItemHeader); +var + I, J, IP, JP, I1: PItemHeader; + changeIP, changeJP: boolean; +begin + repeat + I := L; + J := R; + IP := I; + JP := J; + changeIP := False; + changeJP := False; + while True do begin + while (IntPtr(I) <> IntPtr(P)) and (CompareRecords(IntPtr(Integer(I) + sizeof(TItemHeader)), IntPtr(Integer(P) + sizeof(TItemHeader))) < 0) do begin + I := I.Next; + if changeIP then + IP := IP.Next; + changeIP := not changeIP; + end; + while (IntPtr(J) <> IntPtr(P)) and (CompareRecords(IntPtr(Integer(J) + sizeof(TItemHeader)), IntPtr(Integer(P) + sizeof(TItemHeader))) > 0) do begin + J := J.Prev; + if changeJP then + JP := JP.Prev; + changeJP := not changeJP; + end; + if (IntPtr(J.Next) = IntPtr(I)) or + (IntPtr(I) = IntPtr(J)) + then + break; + + if CompareRecords(IntPtr(Integer(I) + sizeof(TItemHeader)), IntPtr(Integer(J) + sizeof(TItemHeader))) <> 0 then begin + Exchange(I, J); + I1 := I; + I := J; + J := I1; + if L = I then + L := J + else + if L = J then + L := I; + + if JP = I then + JP := J + else + if JP = J then + JP := I; + + if IP = I then + IP := J + else + if IP = J then + IP := I; + + if R = I then + R:=J + else + if R=J then + R:=I; + end; + + if IntPtr(I) <> IntPtr(R) then begin + I := I.Next; + if changeIP then + IP := IP.Next; + changeIP := not changeIP; + end; + if IntPtr(J) <> IntPtr(L) then begin + J := J.Prev; + if changeJP then + JP := JP.Prev; + changeJP := not changeJP; + end; + end; + if IntPtr(L) <> IntPtr(J) then QuickSort(L, J, IP); + if (IntPtr(I) = IntPtr(J)) and (IntPtr(I) <> IntPtr(R)) then + I := I.Next; + L := I; + P := JP; + until I = R; +end; + +procedure TMemData.SortItems; +begin + if FIndexFields.Count = 0 then + Exit; + if (IntPtr(FirstItem) <> nil) and (IntPtr(LastItem) <> nil) then begin + QuickSort(FirstItem, LastItem, FirstItem); + ReorderItems(nil, roFull); + end; +end; + +function TMemData.InsertItem: PItemHeader; +var + Item: PItemHeader; +begin + if EOF then begin + Result := AppendItem; + Exit; + end; + + if BOF then + CurrentItem := FirstItem; + + BlockMan.AllocItem(Item); + + Item.Next := CurrentItem; + + if IntPtr(CurrentItem) <> nil then begin + Item.Prev := CurrentItem.Prev; + if IntPtr(CurrentItem.Prev) <> nil then + CurrentItem.Prev.Next := Item; + CurrentItem.Prev := Item + end + else begin + Item.Prev := nil; + end; + + if FirstItem = CurrentItem then + FirstItem := Item; + + if IntPtr(LastItem) = nil then + LastItem := Item; + + Result := Item; +end; + +function TMemData.AppendItem: PItemHeader; +var + Item: PItemHeader; +begin + BlockMan.AllocItem(Item); + + if IntPtr(FirstItem) = nil then begin + FirstItem := Item; + Item.Order := 1; + end + else begin + LastItem.Next := Item; + Item.Order := LastItem.Order + 1; + end; + + Item.Prev := LastItem; + Item.Next := nil; + LastItem := Item; + + Result := Item; +end; + +procedure TMemData.DeleteItem(Item: PItemHeader); +begin + if IntPtr(Item) <> nil then begin + if Item = FirstItem then + if Item = LastItem then begin + CurrentItem := nil; + FirstItem := nil; + LastItem := nil; + FBOF := True; + FEOF := True; + end + else begin + FirstItem := Item.Next; + FirstItem.Prev := nil; + if Item = CurrentItem then + CurrentItem := FirstItem; + end + else + if Item = LastItem then begin + LastItem := Item.Prev; + LastItem.Next := nil; + if Item = CurrentItem then + CurrentItem := LastItem; + end + else begin + if Item = CurrentItem then + CurrentItem := Item.Next; + + if IntPtr(Item.Prev) <> nil then + Item.Prev.Next := Item.Next; + if IntPtr(Item.Next) <> nil then + Item.Next.Prev := Item.Prev; + end; + + {if IsComplexFields then + FreeComplexFields(PChar(Item) + sizeof(TItemHeader), True);} + + BlockMan.FreeItem(Item); + end; +end; + +procedure TMemData.InitData; +begin + FirstItem := nil; + LastItem := nil; + CurrentItem := nil; + Cache := nil; + LastCacheItem := nil; + + FBOF := True; + FEOF := True; + FRecordCount := 0; + FRecordNoOffset := 0; + + BlockMan.FirstFree := nil; + Inc(RefreshIteration); + FRefreshIteration := RefreshIteration; +end; + +procedure TMemData.FreeData; +var + CacheItem: TCacheItem; + Item: PItemHeader; + NeedFreeComplex: boolean; + + function HasComplexFields (IncludeStrings : boolean): boolean; + var + i: integer; + begin + Result := False; + for i := 0 to FieldCount - 1 do + if IsComplexFieldType(Fields[i].DataType) then + case Fields[i].DataType of + dtExtString, dtExtWideString, dtExtVarBytes: + Result := IncludeStrings; + else + begin + Result := True; + Exit; + end; + end; + end; + +begin + if not StringHeap.SysGetMem then begin + NeedFreeComplex := HasComplexFields(False); + StringHeap.Clear; + end + else + NeedFreeComplex := HasComplexFields(True); + + if NeedFreeComplex then begin + // Free complex fields + Item := FirstItem; + while IntPtr(Item) <> nil do begin + FreeComplexFields(IntPtr(Integer(Item) + sizeof(TItemHeader)), True); + Item := Item.Next; + end; + CacheItem := Cache; + while CacheItem <> nil do begin + Item := CacheItem.Item.Rollback; + if IntPtr(Item) <> nil then + FreeComplexFields(IntPtr(Integer(Item) + sizeof(TItemHeader)), True); + CacheItem := CacheItem.Next; + end; + end; + +// Free cache + while Cache <> nil do begin + CacheItem := Cache; + Cache := Cache.Next; + CacheItem.Free; + end; + + StringHeap.Clear; + BlockMan.FreeAllBlock; + + InitData; +end; + +procedure TMemData.ReorderItems(Item: PItemHeader; ReorderOption: TReorderOption); +var + No: longint; + Item1: PItemHeader; +begin + if Length(FRecordNoCache) > 0 then + SetLength(FRecordNoCache, 0); + if (IntPtr(Item) <> nil) or (ReorderOption = roFull) and (IntPtr(FirstItem) <> nil) + then begin + if ReorderOption = roFull then begin + Item := FirstItem; + No := 1; + end + else + if IntPtr(Item.Next) <> nil then + No := Item.Next.Order + else + if IntPtr(Item.Prev) <> nil then + No := Item.Prev.Order + else begin + Item.Order := 1; + FRecordNoOffset := 0; + { $IFDEF LINUX + No := 0; // Kylix 1 anti warning + $ENDIF} + Exit; + end; + + if (ReorderOption = roFull) or (No > (FRecordCount + FRecordNoOffset) div 2) + then begin + Item1 := Item.Prev; + while (IntPtr(Item1) <> nil) and OmitRecord(Item1) do + Item1 := Item1.Prev; + if IntPtr(Item1) <> nil then + No := Item1.Order + 1 + else begin + No := 1; + FRecordNoOffset := 0; + end; + + while IntPtr(Item) <> nil do begin + + if not OmitRecord(Item) then begin + Item.Order := No; + Inc(No); + end + else + Item.Order := 0; + Item := Item.Next; + end; + end + else begin + Item1 := Item.Next; + while (IntPtr(Item1) <> nil) and OmitRecord(Item1) do + Item1 := Item1.Next; + if IntPtr(Item1) <> nil then begin + No := Item1.Order - 1; + if ReorderOption = roInsert then + Inc(FRecordNoOffset) + else + Dec(FRecordNoOffset) + end + else begin + No := FRecordCount; + FRecordNoOffset := 0; + end; + + while IntPtr(Item) <> nil do begin + if not OmitRecord(Item) then begin + Item.Order := No; + Dec(No); + end + else + Item.Order := 0; + Item := Item.Prev; + end; + end; + + if ReorderOption = roFull then + FRecordCount := No - 1; + end; +end; + +{ Fields } + +procedure TMemData.Open; +begin + inherited Open; +end; + +procedure TMemData.Reopen; +begin + inherited; + + if Length(FRecordNoCache) > 0 then + SetLength(FRecordNoCache, 0); + + // M11255 + if FilterText <> '' then + FilterUpdated; + // M11254 + if IndexFields.Count > 0 then + SortItems; +end; + +procedure TMemData.InitFields; +begin + inherited; + + BlockMan.RecordSize := RecordSize; + UpdateIndexFields; +end; + +procedure TMemData.ClearFields; +begin + FIndexFields.Clear; + + inherited; +end; + +{ Records } + +function TMemData.OmitRecord(Item: PItemHeader): boolean; +var + LocalFilterBuf: IntPtr; +begin + if IntPtr(Item) <> nil then begin + if Item.FilterResult = fsNotChecked then begin + FilterRecBuf := BlockMan.GetRecordPtr(Item); + LocalFilterBuf := nil; + try + Result := FCachedUpdates and not (Item.Status in FFilterItemTypes); + if not Result then begin + if (CalcRecordSize > 0) and (Assigned(FFilterMDFunc) or Assigned(FilterExpression) or + Assigned(FFilterFunc)) + then begin + LocalFilterBuf := Marshal.AllocHGlobal(RecordSize + CalcRecordSize); + CopyBuffer(FilterRecBuf, LocalFilterBuf, RecordSize); + if Assigned(FOnGetCachedBuffer) then + FOnGetCachedBuffer(LocalFilterBuf); + FilterRecBuf := LocalFilterBuf; + end; + + Result := Assigned(FFilterFunc) and not FFilterFunc(FilterRecBuf) or + Assigned(FFilterMDFunc) and not FFilterMDFunc(FilterRecBuf) or + Assigned(FilterExpression) and not Eval(FilterExpression); + end; + finally + if LocalFilterBuf <> nil then + Marshal.FreeHGlobal(LocalFilterBuf); + end; + if Result then + Item.FilterResult := fsOmitted + else + Item.FilterResult := fsNotOmitted; + end + else + Result := Item.FilterResult = fsOmitted; + end + else + Result := True; //False; +end; + +procedure TMemData.GetRecord(RecBuf: IntPtr); +begin + if not(EOF or BOF or (IntPtr(CurrentItem) = nil)) then + if OmitRecord(CurrentItem) then + GetNextRecord(RecBuf) + else + BlockMan.GetRecord(CurrentItem, RecBuf); +end; + +procedure TMemData.GetNextRecord(RecBuf: IntPtr); + procedure OmitRecords; + begin + while (IntPtr(CurrentItem) <> nil) and OmitRecord(CurrentItem) do + CurrentItem := CurrentItem.Next; + end; +begin + if not EOF then begin + if BOF then begin + FBOF := False; + CurrentItem := FirstItem; + end + else + if IntPtr(CurrentItem) <> nil then + CurrentItem := CurrentItem.Next + else + CurrentItem := FirstItem; + + OmitRecords; + if IntPtr(CurrentItem) = nil then + FEOF := True + else + if RecBuf <> nil then + GetRecord(RecBuf); + end; +end; + +procedure TMemData.GetPriorRecord(RecBuf: IntPtr); + procedure OmitRecords; + begin + while (IntPtr(CurrentItem) <> nil) and OmitRecord(CurrentItem) do + CurrentItem := CurrentItem.Prev; + end; +begin + if not BOF then begin + if EOF then begin + FEOF := False; + CurrentItem := LastItem; + end + else + if IntPtr(CurrentItem) <> nil then + CurrentItem := CurrentItem.Prev + else + CurrentItem := LastItem; + + OmitRecords; + if IntPtr(CurrentItem) = nil then + FBOF := True + else + if RecBuf <> nil then + GetRecord(RecBuf); + end; +end; + +procedure TMemData.UpdateCachedBuffer(FItem, LItem: PItemHeader); +var + Item: PItemHeader; +begin + if not Assigned(FOnGetCachedBuffer) or (CalcDataSize > 0) then + Exit; + + if IntPtr(FItem) = nil then + FItem := FirstItem; + if IntPtr(LItem) = nil then + LItem := LastItem; + + Item := FItem; + + while IntPtr(Item) <> nil do begin + FOnGetCachedBuffer(IntPtr(Integer(Item) + SizeOf(TItemHeader))); + if Item = LItem then + Break; + Item := Item.Next; + end; +end; + +procedure TMemData.PutRecord(RecBuf: IntPtr); +begin + Assert(IntPtr(CurrentItem) <> nil); + if Length(FRecordNoCache) > 0 then + SetLength(FRecordNoCache, 0); + CurrentItem.FilterResult := fsNotChecked; + BlockMan.PutRecord(CurrentItem, RecBuf); +end; + +procedure TMemData.AddRecord(RecBuf: IntPtr); +var + OldCurrentItem: PItemHeader; + MoveDir, i: integer; + Blob: TBlob; +begin + OldCurrentItem := CurrentItem; + CurrentItem := InsertItem; + + PutRecord(RecBuf); + + if HasBlobFields then + for i := 0 to FieldCount - 1 do + if IsBlobFieldType(Fields[i].DataType) then begin + Blob := TBlob(InternalGetObject(Fields[i].FieldNo, RecBuf)); + if Blob <> nil then + Blob.Commit; + end; + + if FIndexFields.Count > 0 then begin + if IntPtr(OldCurrentItem) = nil then + MoveDir := -1 + else + MoveDir := CompareRecords(RecBuf, IntPtr(Integer(OldCurrentItem) + sizeof(TItemHeader))); + MoveSortedRecord(MoveDir); + end; + Inc(FRecordCount); + ReorderItems(CurrentItem, roInsert); +end; + +procedure TMemData.InsertRecord(RecBuf: IntPtr); +var + CacheItem: TCacheItem; +begin + if not FCachedUpdates then + InternalAppend(RecBuf); + + AddRecord(RecBuf); + + if FCachedUpdates then begin + CacheItem := TCacheItem.Create; + CacheItem.Item := CurrentItem; + AddCacheItem(CacheItem); + + CurrentItem.Status := isAppended; + CurrentItem.UpdateResult := urNone; + end; +end; + +procedure TMemData.AppendRecord(RecBuf: IntPtr); +begin + SetToEnd; + InsertRecord(RecBuf); +end; + +procedure TMemData.UpdateRecord(RecBuf: IntPtr); +var + CacheItem: TCacheItem; + Rollback: PItemHeader; + i: integer; + Blob: TBlob; + RollbackRecBuf: IntPtr; + ItemRecBuf: IntPtr; + MoveDir: integer; +begin + Assert(IntPtr(CurrentItem) <> nil); + + if not FCachedUpdates then + InternalUpdate(RecBuf) + else begin + if CurrentItem.Status = isUnmodified then begin + // add to cache + CacheItem := TCacheItem.Create; + CacheItem.Item := CurrentItem; + AddCacheItem(CacheItem); + end; + + if (CurrentItem.Status <> isAppended) or (CurrentItem.UpdateResult = urApplied) + then begin + CurrentItem.Status := isUpdated; + + if IntPtr(CurrentItem.Rollback) = nil then begin + // create rollback record + BlockMan.AllocItem(Rollback); + CurrentItem.Rollback := Rollback; + BlockMan.CopyRecord(CurrentItem, Rollback); + AddRefComplexFields(IntPtr(Integer(Rollback) + sizeof(TItemHeader))); + end; + if HasBlobFields then begin + RollbackRecBuf := IntPtr(Integer(CurrentItem.Rollback) + sizeof(TItemHeader)); + ItemRecBuf := IntPtr(Integer(CurrentItem) + sizeof(TItemHeader)); + for i := 0 to FieldCount - 1 do + if IsBlobFieldType(Fields[i].DataType) then begin + Blob := TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(RollbackRecBuf, Fields[i].Offset))); + if (Blob.Rollback <> nil) + and (Blob = TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(ItemRecBuf, Fields[i].Offset)))) + then begin + Marshal.WriteIntPtr(RollbackRecBuf, Fields[i].Offset, Blob.Rollback.GCHandle); + Blob.Rollback := nil; + Blob.Release; + end; + end; + end; + end; + CurrentItem.UpdateResult := urNone; + end; + + MoveDir := CompareRecords(RecBuf, IntPtr(Integer(CurrentItem) + sizeof(TItemHeader))); + PutRecord(RecBuf); + if FIndexFields.Count > 0 then begin + MoveSortedRecord(MoveDir); + ReorderItems(nil, roFull); + end; +end; + +procedure TMemData.RemoveRecord; +var + PermitDelete: boolean; +begin + if FCachedUpdates then begin + PermitDelete := CurrentItem.Status <> isAppended; + RevertRecord; + end + else + PermitDelete := True; + + if PermitDelete then begin + if HasComplexFields then + FreeComplexFields(IntPtr(Integer(CurrentItem) + sizeof(TItemHeader)), True); + DeleteItem(CurrentItem); + Dec(FRecordCount); // if PermitDelete = False RecordCount is decreased on RevertRecord + end; + + ReorderItems(CurrentItem, roDelete); +end; + +procedure TMemData.DeleteRecord; +var + CacheItem: TCacheItem; + OldCacheItem: TCacheItem; +begin + if IntPtr(CurrentItem.Next) = nil then + Fetch; + + if not FCachedUpdates then begin + InternalDelete; + + RemoveRecord; + end + else begin + if CurrentItem.Status = isUnmodified then begin + // add to cache + CacheItem := TCacheItem.Create; + CacheItem.Item := CurrentItem; + AddCacheItem(CacheItem); + + CurrentItem.Status := isDeleted; + CurrentItem.UpdateResult := urNone; + end + else + case CurrentItem.Status of + isAppended: begin + // remove record from cache + CacheItem := Cache; + OldCacheItem := CacheItem; + while CacheItem <> nil do begin + if CacheItem.Item = CurrentItem then begin + if CacheItem = LastCacheItem then + if CacheItem = Cache then + LastCacheItem := nil + else + LastCacheItem := OldCacheItem; + + if CacheItem = Cache then + Cache := CacheItem.Next + else + OldCacheItem.Next := CacheItem.Next; + + CacheItem.Free; + break; + end; + + OldCacheItem := CacheItem; + CacheItem := CacheItem.Next; + end; + + if HasComplexFields then + FreeComplexFields(IntPtr(Integer(CurrentItem) + sizeof(TItemHeader)), True); + + DeleteItem(CurrentItem); + end; + isUpdated: begin + // rollback record + FreeComplexFields(IntPtr(Integer(CurrentItem) + sizeof(TItemHeader)), True); + BlockMan.CopyRecord(CurrentItem.Rollback, CurrentItem); + BlockMan.FreeItem(CurrentItem.Rollback); + CurrentItem.Rollback := nil; + + CurrentItem.Status := isDeleted; + CurrentItem.UpdateResult := urNone; + end; + end; + if IntPtr(CurrentItem) <> nil then + CurrentItem.FilterResult := fsNotChecked; + Dec(FRecordCount); + ReorderItems(CurrentItem, roDelete); + end; +end; + +{ Edit } + +{ Navigation } + +function TMemData.GetBOF: boolean; +begin + Result := (IntPtr(CurrentItem) = nil) and FBOF; // WAR +end; + +function TMemData.GetEOF: boolean; +begin + Result := (IntPtr(CurrentItem) = nil) and FEOF; // WAR +end; + +procedure TMemData.SetToBegin; +begin + CurrentItem := nil; //FirstItem; + FBOF := True; + if IntPtr(LastItem) <> nil then + FEOF := False; +end; + +procedure TMemData.SetToEnd; +begin + CurrentItem := nil; //LastItem; + FEOF := True; + if IntPtr(FirstItem) <> nil then + FBOF := False; +end; + +procedure TMemData.PrepareRecNoCache; +var + i: Integer; + Item: PItemHeader; +begin + if Length(FRecordNoCache) > 0 then + Exit; + i := 0; + Item := FirstItem; + SetLength(FRecordNoCache, RecordCount); + while IntPtr(Item) <> nil do begin + if Item.FilterResult = fsNotOmitted then begin + FRecordNoCache[i] := Item; + inc(i); + end; + Item := Item.Next; + end; +end; + +function TMemData.GetRecordCount: longint; +begin + Result := FRecordCount; +end; + +function TMemData.GetRecordNo: longint; +begin + if IntPtr(CurrentItem) <> nil then + Result := CurrentItem.Order + FRecordNoOffset + else + Result := 0; +end; + +procedure TMemData.SetRecordNo(Value: longint); +var + Item, CurrItem, LastOrderedItem: PItemHeader; + ForwardDir: boolean; +begin + if (IntPtr(FirstItem) <> nil) and (Value > 0) then begin + if Length(FRecordNoCache) > 0 then begin + CurrentItem := FRecordNoCache[Value - 1]; + Exit; + end; + + if IntPtr(CurrentItem) <> nil then + CurrItem := CurrentItem + else + CurrItem := FirstItem; + + LastOrderedItem := LastItem; + while LastOrderedItem.Order = 0 do begin // if recordset is filtered + LastOrderedItem := LastOrderedItem.Prev; + if IntPtr(LastOrderedItem) = nil then + Exit; // all records are rejected by filter + end; + + if (Value < Abs(LastOrderedItem.Order + FRecordNoOffset - Value)) and + (Value < Abs(CurrItem.Order + FRecordNoOffset - Value)) + then begin + // from first + Item := FirstItem; + ForwardDir := True; + end + else + if Abs(LastOrderedItem.Order + FRecordNoOffset - Value) < + Abs(CurrItem.Order + FRecordNoOffset - Value) + then begin + // from + Item := LastOrderedItem; + ForwardDir := LastOrderedItem.Order + FRecordNoOffset < Value; + end + else begin + // from current + Item := CurrItem; + ForwardDir := CurrItem.Order + FRecordNoOffset < Value; + end; + + while (IntPtr(Item) <> nil) and (Item.Order + FRecordNoOffset <> Value) do + if ForwardDir then begin + if IntPtr(Item.Next) = nil then + Fetch; + Item := Item.Next + end + else + Item := Item.Prev; + + if IntPtr(Item) <> nil then + CurrentItem := Item; + end; +end; + +{ Fetch } + +function TMemData.Fetch(FetchBack: boolean = False): boolean; +begin + Result := False; +end; + +procedure TMemData.InitFetchedItems(FetchedItem: IntPtr; NoData, FetchBack: boolean); +var + Item: IntPtr; + ItemHeader: PItemHeader {$IFNDEF CLR}absolute Item{$ENDIF}; + NewOrder: Integer; +begin + Item := FetchedItem; +{$IFDEF CLR} + ItemHeader := Item; +{$ENDIF} + if not FetchBack then begin + NewOrder := 1; + while (Item = FetchedItem) or ((Item <> nil) and OmitRecord(ItemHeader)) do begin + ItemHeader := ItemHeader.Prev; + {$IFDEF CLR} + Item := ItemHeader; + {$ENDIF} + end; + if Item <> nil then + NewOrder := ItemHeader.Order + 1; + end + else + NewOrder := ItemHeader.Order; + + Item := FetchedItem; +{$IFDEF CLR} + ItemHeader := Item; +{$ENDIF} + while IntPtr(Item) <> nil do begin + if not OmitRecord(ItemHeader) then begin + if not (NoData or FetchBack) then + Inc(FRecordCount); + ItemHeader.Order := NewOrder; + if FetchBack then + Dec(NewOrder) + else + Inc(NewOrder); + end; + if FetchBack then + ItemHeader := ItemHeader.Prev + else + ItemHeader := ItemHeader.Next; + {$IFDEF CLR} + Item := ItemHeader; + {$ENDIF} + end; +end; + +{ BookMarks } + +procedure TMemData.GetBookmark(Bookmark: PRecBookmark); +begin + Bookmark.RefreshIteration := FRefreshIteration; + Bookmark.Item := CurrentItem; + if IntPtr(CurrentItem) <> nil then + Bookmark.Order := CurrentItem.Order + FRecordNoOffset + else + Bookmark.Order := -1; +end; + +procedure TMemData.SetToBookmark(Bookmark: PRecBookmark); +var + OldCurrentItem: PItemHeader; +begin + if (Bookmark.RefreshIteration = FRefreshIteration) and + (IntPtr(Bookmark.Item) <> nil) + then begin + OldCurrentItem := CurrentItem; + try // for freed item + CurrentItem := Bookmark.Item; + if CurrentItem.Flag = flUsed then begin + FBOF := False; + FEOF := False; + Exit; + end + else + CurrentItem := OldCurrentItem; + except + CurrentItem := OldCurrentItem; + end; + end; + +// Set by order + inherited; +end; + +function TMemData.BookmarkValid(Bookmark: PRecBookmark): boolean; +begin + if IntPtr(Bookmark) <> nil then + Result := (Bookmark.Order <> -1) or (IntPtr(Bookmark.Item) <> nil) + else + Result := False; + + if Result and Filtered then + Result := not OmitRecord(Bookmark.Item); +end; + +function TMemData.CompareBookmarks(Bookmark1, Bookmark2: PRecBookmark): integer; +const + RetCodes: array[Boolean, Boolean] of ShortInt = ((2,-1),(1,0)); +begin + Result := RetCodes[IntPtr(Bookmark1) = nil, IntPtr(Bookmark2) = nil]; + if Result = 2 then + if Bookmark1.RefreshIteration = Bookmark2.RefreshIteration then + if Bookmark1.Item = Bookmark2.Item then begin + Result := 0; + Exit; + end; + +// Compare by order + Result := inherited CompareBookmarks(Bookmark1, Bookmark2); +end; + +{ CachedUpdates } + +function TMemData.GetUpdateStatus: TItemStatus; +begin + if IntPtr(CurrentItem) <> nil then + Result := CurrentItem.Status + else + Result := isUnmodified; +end; + +function TMemData.GetUpdateResult: TUpdateRecAction; +begin + if IntPtr(CurrentItem) <> nil then + Result := CurrentItem.UpdateResult + else + Result := urNone; +end; + +procedure TMemData.AddCacheItem(CacheItem: TCacheItem); +begin +// add to end cache + CacheItem.Next := nil; + if Cache = nil then + Cache := CacheItem + else + LastCacheItem.Next := CacheItem; + + LastCacheItem := CacheItem; +end; + +procedure TMemData.SetCacheRecBuf(NewBuf: IntPtr; OldBuf: IntPtr); +begin + NewCacheRecBuf := NewBuf; + OldCacheRecBuf := OldBuf; +end; + +procedure TMemData.ApplyUpdates; +var + CacheItem, NextCacheItem, PrevCacheItem: TCacheItem; + Action: TUpdateRecAction; + OldCurrentItem: PItemHeader; + + PacketCacheItem: TCacheItem; + PrevPacketCacheItem: TCacheItem; + + function ValidateCacheItem: boolean; + { On case of deleting current item from cache via RevertRecord in + ApplyRecord call. Returns True if CacheItem was deleted. } + begin + Result := True; + if PrevCacheItem <> nil then begin + if PrevCacheItem.Next = NextCacheItem then begin + CacheItem := NextCacheItem; + Result := True; + end; + end + else + if NextCacheItem <> nil then begin + if CacheItem.Next <> NextCacheItem then begin + CacheItem := NextCacheItem; + Result := False; + end; + end + else + if Cache = nil then begin + CacheItem := nil; + Result := False; + end; + end; + + procedure SetAction(Action: TUpdateRecAction); + var + Temp: TCacheItem; + begin + // Set action for batch of items + if Action <> urSuspended then begin + Temp := PacketCacheItem; + while (Temp <> nil) and (Temp <> CacheItem) do begin + Temp.Item.UpdateResult := Action; + Temp := Temp.Next; + end; + end; + CacheItem.Item.UpdateResult := Action; + end; + +begin + if FCachedUpdates then begin + OldCurrentItem := CurrentItem; + try + PrevCacheItem := nil; + PacketCacheItem := nil; + PrevPacketCacheItem := nil; + CacheItem := Cache; + while CacheItem <> nil do + if CacheItem.Item.UpdateResult <> urApplied then begin + NextCacheItem := CacheItem.Next; + try + CurrentItem := CacheItem.Item; // for refresh on applied + Action := urFail; + try + case CacheItem.Item.Status of + isAppended: begin + BlockMan.GetRecord(CacheItem.Item, NewCacheRecBuf); + BlockMan.GetRecord(CacheItem.Item, OldCacheRecBuf); + ApplyRecord(ukInsert, Action, CacheItem.Next = nil); + BlockMan.PutRecord(CacheItem.Item, NewCacheRecBuf); // for ReturnParams + end; + isUpdated: begin + BlockMan.GetRecord(CacheItem.Item, NewCacheRecBuf); + BlockMan.GetRecord(CacheItem.Item.Rollback, OldCacheRecBuf); + ApplyRecord(ukUpdate, Action, CacheItem.Next = nil); + BlockMan.PutRecord(CacheItem.Item, NewCacheRecBuf); // for ReturnParams + end; + isDeleted: begin + BlockMan.GetRecord(CacheItem.Item, NewCacheRecBuf); + BlockMan.GetRecord(CacheItem.Item, OldCacheRecBuf); + ApplyRecord(ukDelete, Action, CacheItem.Next = nil); + end; + else + Assert(False); + end; + finally + if Active and ValidateCacheItem then begin + SetAction(Action); + case Action of + urSuspended: + if PacketCacheItem = nil then begin + PacketCacheItem := CacheItem; + PrevPacketCacheItem := PrevCacheItem; + end; + urRetry: + if PacketCacheItem <> nil then begin + CacheItem := PacketCacheItem; + PrevCacheItem := PrevPacketCacheItem; + end; + else + PacketCacheItem := nil; + PrevPacketCacheItem := nil; + end; + if Action <> urRetry then begin + PrevCacheItem := CacheItem; + CacheItem := NextCacheItem; + end; + end; + end; + except + if CacheItem <> nil then + OldCurrentItem := CacheItem.Item; // failed item is current + raise; + end; + end + else + CacheItem := CacheItem.Next; + finally + CurrentItem := OldCurrentItem; + end; + end; +end; + +procedure TMemData.CommitUpdates; +var + CacheItem,CacheItem1: TCacheItem; +begin + if UpdatesPending then + ApplyUpdates; + + CacheItem := Cache; + LastCacheItem := nil; + while CacheItem <> nil do + if CacheItem.Item.UpdateResult = urApplied then begin + if IntPtr(CacheItem.Item.Rollback) <> nil then begin + FreeComplexFields(IntPtr(Integer(CacheItem.Item.Rollback) + sizeof(TItemHeader)), True); + BlockMan.FreeItem(CacheItem.Item.Rollback); + CacheItem.Item.Rollback := nil; + end; + + if CacheItem.Item.Status = isDeleted then begin + if HasComplexFields then + FreeComplexFields(IntPtr(Integer(CacheItem.Item) + sizeof(TItemHeader)), True); + + DeleteItem(CacheItem.Item) + end + else begin + CacheItem.Item.Status := isUnmodified; + CacheItem.Item.UpdateResult := urNone; + end; + + CacheItem1 := CacheItem; + CacheItem := CacheItem.Next; + if CacheItem1 = Cache then + Cache := CacheItem; + if (CacheItem = nil) and (Cache <> nil) and (Cache.Next = CacheItem1) then + Cache.Next := nil; + CacheItem1.Free; + end + else begin + CacheItem1 := CacheItem; + CacheItem := CacheItem.Next; + if CacheItem <> nil then + LastCacheItem := CacheItem + else + if (LastCacheItem = nil) and (CacheItem1 = Cache) then // only one unapllied reacord + LastCacheItem := Cache; + end; +end; + +procedure TMemData.RevertItem(Item: PItemHeader); +begin + case Item.Status of + isAppended: begin + if HasComplexFields then + FreeComplexFields(IntPtr(Integer(Item) + sizeof(TItemHeader)), True); + + DeleteItem(Item); + Dec(FRecordCount); + end; + isUpdated: begin + FreeComplexFields(IntPtr(Integer(Item) + sizeof(TItemHeader)), True); + BlockMan.CopyRecord(Item.Rollback, Item); + BlockMan.FreeItem(Item.Rollback); + Item.Rollback := nil; + Item.Status := isUnmodified; + Item.UpdateResult := urNone; + Item.FilterResult := fsNotChecked; + end; + isDeleted: begin + Item.Status := isUnmodified; + Item.UpdateResult := urNone; + Item.FilterResult := fsNotChecked; + Inc(FRecordCount); + end; + isUnmodified: begin + Item.UpdateResult := urNone; + Item.FilterResult := fsNotChecked; + end; + end; +end; + +procedure TMemData.RevertRecord; +var + CacheItem: TCacheItem; + OldCacheItem: TCacheItem; +begin + if Cache <> nil then begin + CacheItem := Cache; + OldCacheItem := CacheItem; + while (CacheItem <> nil) and not (CacheItem.Item = CurrentItem) do begin + OldCacheItem := CacheItem; + CacheItem := CacheItem.Next; + end; + if CacheItem <> nil then begin + if OldCacheItem <> CacheItem then + OldCacheItem.Next := CacheItem.Next + else + Cache := CacheItem.Next; + + RevertItem(CacheItem.Item); + if CacheItem = LastCacheItem then + LastCacheItem := OldCacheItem; + CacheItem.Free; + end; + end; +end; + +procedure TMemData.CancelUpdates; +var + CacheItem: TCacheItem; +begin + if Cache <> nil then begin + while Cache <> nil do begin + RevertItem(Cache.Item); + CacheItem := Cache; + Cache := Cache.Next; + CacheItem.Free; + end; + + LastCacheItem := nil; + + ReorderItems(nil, roFull); + end; +end; + +procedure TMemData.RestoreUpdates; +var + CacheItem: TCacheItem; +begin + if FCachedUpdates then begin + CacheItem := Cache; + while CacheItem <> nil do begin + //CacheItem.Item.Status + CacheItem.Item.UpdateResult := urNone; + CacheItem := CacheItem.Next; + end; + end; +end; + +function TMemData.GetUpdatesPending: boolean; +var + CacheItem: TCacheItem; +begin + Result := False; + CacheItem := Cache; + while (CacheItem <> nil) and not Result do begin + Result := CacheItem.Item.UpdateResult <> urApplied; + CacheItem := CacheItem.Next; + end; +end; + +procedure TMemData.GetOldRecord(RecBuf: IntPtr); +begin + if not(EOF or BOF or (IntPtr(CurrentItem) = nil)) then begin + if OmitRecord(CurrentItem) then + GetNextRecord(RecBuf); + if IntPtr(CurrentItem) <> nil then + if IntPtr(CurrentItem.Rollback) <> nil then + BlockMan.GetRecord(CurrentItem.Rollback, RecBuf) + else + BlockMan.GetRecord(CurrentItem, RecBuf); + end; +end; + +{ Filter } + +procedure TMemData.FilterUpdated; +begin + ClearItemsOmittedStatus; + ReorderItems(nil, roFull); + FEOF := RecordCount = 0; // for correct navigation +end; + +procedure TMemData.ClearItemsOmittedStatus; +var + Item: PItemHeader; +begin + Item := FirstItem; + while IntPtr(Item) <> nil do begin + Item.FilterResult := fsNotChecked; + Item := Item.Next; + end; +end; + +procedure TMemData.SetFilterItemTypes(Value: TItemTypes); +begin + if Value <> FilterItemTypes then begin + inherited; + + ClearItemsOmittedStatus; + ReorderItems(nil, roFull); + FEOF := RecordCount = 0; // for correct navigation + end; +end; + +{ TBlockManager } + +{$IFDEF CLR} +[DllImport(kernel32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'HeapAlloc')] +function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): IntPtr; external; + +[DllImport(kernel32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'HeapFree')] +function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: IntPtr): BOOL; external; + +[DllImport(kernel32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'HeapCreate')] +function HeapCreate(flOptions, dwInitialSize, dwMaximumSize: DWORD): THandle; external; + +[DllImport(kernel32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'HeapDestroy')] +function HeapDestroy(hHeap: THandle): BOOL; external; + +const + HEAP_NO_SERIALIZE = 1; + HEAP_GENERATE_EXCEPTIONS = 4; +{$ENDIF} + + +constructor TBlockManager.Create; +begin + inherited; + + DefaultItemCount := 10; // WAR +end; + +destructor TBlockManager.Destroy; +begin + FreeAllBlock; + + inherited; +end; + +procedure TBlockManager.AllocBlock(var Block: PBlockHeader; ItemCount: word); +var + BlockSize: integer; +begin + BlockSize := sizeof(TBlockHeader) + ItemCount*(sizeof(TItemHeader) + RecordSize); + +{$IFDEF CLR} + if IntPtr(FHeap) = nil then + FHeap := HeapCreate(HEAP_GENERATE_EXCEPTIONS + HEAP_NO_SERIALIZE, BlockSize + 100 {overhead}, 0); + Block := HeapAlloc(FHeap, HEAP_GENERATE_EXCEPTIONS + HEAP_NO_SERIALIZE, BlockSize); +{$ELSE} + GetMem(Block, BlockSize); +{$ENDIF} + + Block.ItemCount := ItemCount; + Block.UsedItems := ItemCount; + + Block.Next := FirstBlock; + Block.Prev := nil; + + //Block.Test := btSign; // DEBUG + + if IntPtr(FirstBlock) <> nil then + FirstBlock.Prev := Block; + FirstBlock := Block; +end; + +procedure TBlockManager.FreeBlock(Block: PBlockHeader); +begin + if Block = FirstBlock then begin + FirstBlock := Block.Next; + if IntPtr(FirstBlock) <> nil then + FirstBlock.Prev := nil; + end + else begin + Block.Prev.Next := Block.Next; + if IntPtr(Block.Next) <> nil then + Block.Next.Prev := Block.Prev; + end; + +{$IFDEF CLR} + HeapFree(FHeap, HEAP_NO_SERIALIZE, Block); +{$ELSE} + FreeMem(Block, BlockSize); +{$ENDIF} +end; + +procedure TBlockManager.FreeAllBlock; +begin +{$IFDEF CLR} + HeapDestroy(FHeap); + FHeap := 0; + FirstBlock := nil; +{$ELSE} + while IntPtr(FirstBlock) <> nil do + FreeBlock(FirstBlock); +{$ENDIF} + + FirstFree := nil; +end; + +procedure TBlockManager.AddFreeBlock; +var + Block: PBlockHeader; + Item: PItemHeader; + i: word; +begin + AllocBlock(Block, DefaultItemCount); + + Item := IntPtr(Integer(Block) + sizeof(TBlockHeader)); + for i := 1 to DefaultItemCount do begin + Item.Prev := nil; + Item.Next := FirstFree; + Item.Block := Block; + Item.Flag := flFree; + + if IntPtr(FirstFree) <> nil then + FirstFree.Prev := Item; + FirstFree := Item; + + Item := IntPtr(Integer(Item) + sizeof(TItemHeader) + RecordSize); + end; + Block.UsedItems := 0; +end; + +procedure TBlockManager.AllocItem(var Item: PItemHeader); +begin + if IntPtr(FirstFree) = nil then + AddFreeBlock; + + Item := FirstFree; + + Assert(Item.Flag = flFree); + Item.Flag := flUsed; + + FirstFree := FirstFree.Next; + if IntPtr(FirstFree) <> nil then + FirstFree.Prev := nil; + + Item.Rollback := nil; + Item.Status := isUnmodified; + Item.UpdateResult := urNone; + Item.Order := 0; + Item.FilterResult := fsNotChecked; + + Item.Block.UsedItems := Item.Block.UsedItems + 1; +end; + +procedure TBlockManager.FreeItem(Item: PItemHeader); +var + Free: PItemHeader; + i: integer; +begin + Assert(Item.Flag = flUsed); + + Item.Flag := flFree; + + if Item.Block.UsedItems = 1 then begin + // Procesing Free List + Free := IntPtr(Integer(Item.Block) + sizeof(TBlockHeader)); + for i := 1 to Item.Block.ItemCount do begin + if not(Free = Item) then begin + Assert(Free.Flag = flFree); + + if Free = FirstFree then begin + FirstFree := Free.Next; + if IntPtr(FirstFree) <> nil then + FirstFree.Prev := nil; + end + else begin + Free.Prev.Next := Free.Next; + if IntPtr(Free.Next) <> nil then + Free.Next.Prev := Free.Prev; + end; + end; + Free := IntPtr(Integer(Free) + sizeof(TItemHeader) + RecordSize); + end; + FreeBlock(Item.Block); + end + else begin + Item.Prev := nil; + Item.Next := FirstFree; + if IntPtr(FirstFree) <> nil then + FirstFree.Prev := Item; + FirstFree := Item; + Item.Block.UsedItems := Item.Block.UsedItems - 1; + end; +end; + +procedure TBlockManager.InitItem(Item: PItemHeader); +begin + Item.Rollback := nil; + Item.Status := isUnmodified; + Item.UpdateResult := urNone; +end; + +procedure TBlockManager.PutRecord(Item: PItemHeader; Rec: IntPtr); +begin + CopyBuffer(Rec, IntPtr(Integer(Item) + sizeof(TItemHeader)), RecordSize) +end; + +procedure TBlockManager.GetRecord(Item: PItemHeader; Rec: IntPtr); +begin + CopyBuffer(IntPtr(Integer(Item) + sizeof(TItemHeader)), Rec, RecordSize) +end; + +function TBlockManager.GetRecordPtr(Item: PItemHeader): IntPtr; +begin + Result := IntPtr(Integer(Item) + sizeof(TItemHeader)); +end; + +procedure TBlockManager.CopyRecord(ItemSrc: PItemHeader; ItemDest: PItemHeader); +begin + CopyBuffer(IntPtr(Integer(ItemSrc) + sizeof(TItemHeader)), + IntPtr(Integer(ItemDest) + sizeof(TItemHeader)), RecordSize); +end; + +{ TStringHeap } + +{$IFDEF CLR} +function PBlock.GetNext: PBlock; +begin + Result := Marshal.ReadIntPtr(Ptr, 0); +end; + +procedure PBlock.SetNext(Value: PBlock); +begin + Marshal.WriteIntPtr(Ptr, 0, Value); +end; + +class operator PBlock.Implicit(AValue: IntPtr): PBlock; +begin + Result.Ptr := AValue; +end; + +class operator PBlock.Implicit(AValue: PBlock): IntPtr; +begin + Result := AValue.Ptr; +end; + +{$ENDIF} + +constructor TStringHeap.Create; +begin + inherited; + + FRoot := nil; + FEmpty := True; + FSysGetMem := False; + +{$IFDEF WIN32} + FUseSysMemSize := not IsMemoryManagerSet; +{$ENDIF} + FThreadSafety := False; + FThreadSafetyCS := nil; +end; + +destructor TStringHeap.Destroy; +begin + Clear; + FThreadSafetyCS.Free; + + inherited; +end; + +procedure TStringHeap.SetThreadSafety(const Value: boolean); +begin + if Value <> FThreadSafety then begin + FThreadSafety := Value; + if Value then begin + Assert(FThreadSafetyCS = nil); + FThreadSafetyCS := TCriticalSection.Create; + end + else begin + FThreadSafetyCS.Free; + FThreadSafetyCS := nil; + end; + end; +end; + +procedure TStringHeap.Clear; +var + P, Temp: PBlock; + i: integer; +begin + if Empty then + Exit; + if FThreadSafetyCS <> nil then + FThreadSafetyCS.Acquire; + try + P := FRoot; + while IntPtr(P) <> nil do begin + Temp := P; + P := P.Next; + Marshal.FreeHGlobal(Temp); + end; + FRoot := nil; + FFree := SizeOf_TStrData; + for i := Low(FSmallTab) to High(FSmallTab) do + FSmallTab[i] := nil; + FEmpty := True; + FSysGetMem := False; + finally + if FThreadSafetyCS <> nil then + FThreadSafetyCS.Release; + end; +end; + +function TStringHeap.AllocStr(Str: IntPtr; Trim: boolean = false; Len: integer = -1): IntPtr; +var + EndPtr: IntPtr; +begin + if Str = nil then + Result := nil + else begin + if Len = -1 then + Len := StrLen(Str); + if Trim then begin + EndPtr := IntPtr(Integer(Str) + Len - 1); + while (Len > 0) and + {$IFDEF CLR} + (Marshal.ReadByte(EndPtr) = Byte(' ')) + {$ELSE} + (PByte(EndPtr)^ = Byte(' ')) + {$ENDIF} + do begin + EndPtr := IntPtr(Integer(EndPtr) - 1 {sizeof(AsciiChar)}); + Dec(Len); + end; + end; + Result := NewBuf(Len + 1); + CopyBuffer(Str, Result, Len); + Marshal.WriteByte(Result, Len, byte(#0)); + end; +end; + +function TStringHeap.AllocWideStr(Str: IntPtr; Trim: boolean = false; Len: integer = -1): IntPtr; +var + EndPtr: IntPtr; +begin + if Str = nil then + Result := nil + else begin + if Len = -1 then + Len := StrLenW(Str); + if Trim then begin + EndPtr := IntPtr(Integer(Str) + (Len - 1) * sizeof(WideChar)); + while (Len > 0) and + {$IFDEF CLR} + (Marshal.ReadInt16(EndPtr) = SmallInt(' ')) + {$ELSE} + (PSmallInt(EndPtr)^ = SmallInt(' ')) + {$ENDIF} + do begin + EndPtr := IntPtr(Integer(EndPtr) - sizeof(WideChar)); + Dec(Len); + end; + end; + Result := NewBuf((Len + 1) * sizeof(WideChar)); + CopyBuffer(Str, Result, Len * sizeof(WideChar)); + Marshal.WriteInt16(Result, Len * sizeof(WideChar), byte(#0)); + end; +end; + +function TStringHeap.ReAllocStr(Str: IntPtr; Trim: boolean = false): IntPtr; +begin + Result := AllocStr(Str, Trim); + DisposeBuf(Str); +end; + +function TStringHeap.ReAllocWideStr(Str: IntPtr; Trim: boolean = false): IntPtr; +begin + Result := AllocStr(Str, Trim); + DisposeBuf(Str); +end; + +function TStringHeap.UseSmallTabs(divSize: integer): boolean; +begin + Result := divSize <= SmallSize div Align; + // This fix was added 04.04.2006 and rolled back 07.03.2007 because of bug + // with allocation using memory manager and disposing using StringHeap block of memroy with size 2002 bytes + // if (not Result) and ((Size - 1) div Align <= SmallSize div Align) then + // Result := True; +end; + +function TStringHeap.NewBuf(Size: integer): IntPtr; +var + P: IntPtr; + Temp: PBlock; + Idx: integer; + divSize: integer; +begin + if Size <= 0 then begin + Result := nil; + end + else begin + if FThreadSafetyCS <> nil then + FThreadSafetyCS.Acquire; + try + FEmpty := False; + divSize := (Size + Align - 1) div Align; + if UseSmallTabs(divSize) then begin + Result := FSmallTab[divSize]; + if Result <> nil then begin + FSmallTab[divSize] := Marshal.ReadIntPtr(Result); + p := IntPtr(Integer(Result) - SizeOf(Word)); + Marshal.WriteInt16(p, Marshal.ReadInt16(p) + 1); + Exit; + end; + Size := divSize * Align; + if IntPtr(FRoot) = nil then begin + FRoot := Marshal.AllocHGlobal(SizeOf_TBlock); + FRoot.Next := nil; + FFree := SizeOf_TStrData; + end + else + if FFree < Size + SizeOf(Integer) + SizeOf(Word) then begin + P := IntPtr(Integer(IntPtr(FRoot)) + SizeOf(PBlock) + SizeOf_TStrData - FFree); + divSize := (FFree - SizeOf(Integer) - SizeOf(Word)) div Align; + Marshal.WriteInt32(P, divSize * Align); + P := IntPtr(Integer(P) + SizeOf(Integer)); + Marshal.WriteInt16(P, RefNull); + P := IntPtr(Integer(P) + SizeOf(Word)); + Idx := divSize; + Marshal.WriteIntPtr(P, FSmallTab[Idx]); + FSmallTab[Idx] := P; + Temp := FRoot; + FRoot := Marshal.AllocHGlobal(SizeOf_TBlock); + FRoot.Next := Temp; + FFree := SizeOf_TStrData; + end; + Result := IntPtr(Integer(IntPtr(FRoot)) + SizeOf(PBlock) + SizeOf_TStrData - FFree); + Marshal.WriteInt32(Result, Size); + Dec(FFree, Size + SizeOf(Integer) + SizeOf(Word)); + if FFree < SizeOf(Integer) + SizeOf(Word) + Align then begin + Marshal.WriteInt32(Result, Marshal.ReadInt32(Result) + FFree and not (Align - 1)); + Temp := FRoot; + FRoot := Marshal.AllocHGlobal(SizeOf_TBlock); + FRoot.Next := Temp; + FFree := SizeOf_TStrData; + end; + Result := IntPtr(Integer(Result) + SizeOf(Integer)); + end + else begin + {$IFDEF WIN32} + if FUseSysMemSize then + Result := Marshal.AllocHGlobal(Size + SizeOf(Word)) + else begin + {$ENDIF} + Result := Marshal.AllocHGlobal(Size + SizeOf(Word) + SizeOf(Integer)); + Marshal.WriteInt32(Result, Size); + Result := IntPtr(Integer(Result) + SizeOf(Integer)); + {$IFDEF WIN32} + end; + {$ENDIF} + FSysGetMem := True; + end; + Marshal.WriteInt16(Result, RefNull); + Result := IntPtr(Integer(Result) + SizeOf(Word)); + finally + if FThreadSafetyCS <> nil then + FThreadSafetyCS.Release; + end; + end; +end; + +procedure TStringHeap.DisposeBuf(Buf: IntPtr); +var + Size: integer; + PRefCount: IntPtr; + RefCount: Word; + Idx: integer; + divSize: integer; +begin + if (Buf <> nil) then begin + if FThreadSafetyCS <> nil then + FThreadSafetyCS.Acquire; + try + PRefCount := IntPtr(Integer(Buf) - SizeOf(Word)); + RefCount := Marshal.ReadInt16(PRefCount); + Assert(RefCount >= RefNull, 'DisposeBuf failed'); + if RefCount = RefNull then begin + Marshal.WriteInt16(PRefCount, RefCount - 1); + Size := Marshal.ReadInt32(IntPtr(Integer(PRefCount) - SizeOf(Integer))); + divSize := (Size + Align - 1) div Align; + Assert(divSize <> 0, 'SmallTab in DisposeBuf failed'); + if UseSmallTabs(divSize) then begin + Idx := divSize; + Marshal.WriteIntPtr(Buf, FSmallTab[Idx]); + FSmallTab[Idx] := Buf; + end + else + {$IFDEF WIN32} + if FUseSysMemSize then + Marshal.FreeHGlobal(PRefCount) + else + {$ENDIF} + Marshal.FreeHGlobal(IntPtr(Integer(PRefCount) - SizeOf(Integer))); + end + else + Marshal.WriteInt16(PRefCount, RefCount - 1); + finally + if FThreadSafetyCS <> nil then + FThreadSafetyCS.Release; + end; + end; +end; + +procedure TStringHeap.AddRef(Buf: IntPtr); +var + PRefCount: IntPtr; + RefCount: Word; +begin + if (Buf <> nil) then begin + PRefCount := IntPtr(Integer(Buf) - SizeOf(Word)); + RefCount := Marshal.ReadInt16(PRefCount); + Assert(RefCount >= RefNull, 'AddRefStr failed'); + Marshal.WriteInt16(PRefCount, RefCount + 1); + end; +end; + +{ TSharedObject } + +constructor TSharedObject.Create; +begin + inherited; + + AddRef; + +{$IFDEF CRDEBUG} Inc(ShareObjectCnt); {$ENDIF} +end; + +destructor TSharedObject.Destroy; +begin + {$IFDEF CRDEBUG} Dec(ShareObjectCnt); {$ENDIF} + FRefCount := 0; + + inherited; +end; + +procedure TSharedObject.CheckValid; +begin + if FRefCount = 0 then + raise Exception.Create(SInvalidSharedObject); +end; + +procedure TSharedObject.Free; +begin + if Assigned(Self) then begin + Assert(FRefCount > 0, ClassName + '.Free RefCount = ' + IntToStr(FRefCount)); + + if FRefCount = 1 then begin + if FGCHandle <> nil then + FreeGCHandle(FGCHandle); + inherited Free; + end + else + Dec(FRefCount); + end; +end; + +procedure TSharedObject.AddRef; +begin + Inc(FRefCount); +end; + +procedure TSharedObject.Release; +begin + Free; +end; + +{$IFNDEF CLR} +function TSharedObject.GetHashCode: integer; +begin + Result := Integer(Self); +end; +{$ENDIF} + +function TSharedObject.GetGCHandle: IntPtr; +begin + if FGCHandle = nil then + FGCHandle := AllocGCHandle(Self); + Result := FGCHandle; +end; + +{ TPiece } + +function NextPiece(Piece: PPieceHeader): PPieceHeader; +begin + if IntPtr(Piece) <> nil then + Result := Piece.Next + else + Result := nil; +end; + +function PieceData(Piece: PPieceHeader): IntPtr; +begin + if IntPtr(Piece) <> nil then + Result := IntPtr(Integer(Piece) + sizeof(TPieceHeader)) + else + Result := nil; +end; + +function PieceUsedPtr(Piece: PPieceHeader): IntPtr; +begin + if IntPtr(Piece) <> nil then + Result := IntPtr(Integer(Piece) + sizeof(integer) * 2) + else + Result := nil; +end; + +{ TBlob } + +constructor TBlob.Create(IsUnicode: boolean = False); +begin + inherited Create; + + FIsUnicode := IsUnicode; + PieceSize := DefaultPieceSize; + Test := btSign; // DEBUG +end; + +destructor TBlob.Destroy; +begin + CheckValid; // DEBUG + Test := 0; // DEBUG + + FNeedRollback := False; + Clear; + + if Rollback <> nil then + Rollback.Free; + + inherited; +end; + +procedure TBlob.CheckValid; +begin + if Test <> btSign then // DEBUG + raise Exception.Create(SInvalidBlob); +end; + +procedure TBlob.Clear; +begin + if FNeedRollback and (Rollback = nil) then + SaveToRollback; + + InternalClear; + + FModified := True; +end; + +{ Pieces } + +procedure TBlob.AllocPiece(var Piece: PPieceHeader; Size: cardinal); +begin + Assert(Size > 0); + Piece := Marshal.AllocHGlobal(Integer(sizeof(TPieceHeader)) + Integer(Size)); + Piece.Blob := 0; + Piece.Size := Size; + Piece.Used := 0; + Piece.Prev := nil; + Piece.Next := nil; +end; + +procedure TBlob.ReallocPiece(var Piece: PPieceHeader; Size: cardinal); +var + MemSize: integer; +begin + if Size = 0 then begin + FreePiece(Piece); + Piece := nil; + end + else + if Size <> Piece.Size then begin + MemSize := Integer(sizeof(TPieceHeader)) + Integer(Size); + Piece := Marshal.ReAllocHGlobal(Piece, IntPtr(MemSize)); + Piece.Size := Size; + if Piece.Used > Size then + Piece.Used := Size; + if Piece.Blob <> 0 then begin + if IntPtr(Piece.Prev) <> nil then + Piece.Prev.Next := Piece + else + FFirstPiece := Piece; + + if IntPtr(Piece.Next) <> nil then + Piece.Next.Prev := Piece; + end; + end; +end; + +procedure TBlob.FreePiece(Piece: PPieceHeader); +begin + if Piece.Blob <> 0 then + DeletePiece(Piece); + + Marshal.FreeHGlobal(Piece); +end; + +procedure TBlob.AppendPiece(Piece: PPieceHeader); +var + Last: PPieceHeader; +begin + Piece.Blob := Self.GetHashCode; + Piece.Next := nil; + if IntPtr(FFirstPiece) = nil then begin + Piece.Prev := nil; + FFirstPiece := Piece; + end + else begin + Last := FFirstPiece; + while IntPtr(Last.Next) <> nil do + Last := Last.Next; + Last.Next := Piece; + Piece.Prev := Last; + end; +end; + +procedure TBlob.DeletePiece(Piece: PPieceHeader); +begin + Assert(Piece.Blob = Self.GetHashCode); + + if FFirstPiece = Piece then begin + FFirstPiece := Piece.Next; + if IntPtr(FFirstPiece) <> nil then + FFirstPiece.Prev := nil; + end + else + begin + Piece.Prev.Next := Piece.Next; + if IntPtr(Piece.Next) <> nil then + Piece.Next.Prev := Piece.Prev; + end; + + Piece.Blob := 0; +end; + +procedure TBlob.CompressPiece(var Piece: PPieceHeader); +begin + if Piece.Used < Piece.Size then + ReallocPiece(Piece, Piece.Used); +end; + +function TBlob.FirstPiece: PPieceHeader; +begin + Result := FFirstPiece; +end; + +procedure TBlob.CheckValue; +begin +end; + +function TBlob.Read(Position: cardinal; Count: cardinal; Dest: IntPtr): cardinal; +var + Piece: PPieceHeader; + Pos, { shift from Blob begin } + Shift, { for read, in Piece } + ReadCount, { all } + MoveSize: cardinal; { in Piece } +begin + CheckValid; // DEBUG + + CheckValue; + + Result := 0; + + if (IntPtr(FFirstPiece) = nil) or (Position > Size) then + Exit; + + if Count = 0 then + Count := Size; + + if Position + Count > Size then + Count := Size - Position; + + Piece := FFirstPiece; + ReadCount := 0; + Pos := 0; + while (IntPtr(Piece) <> nil) and (Pos < (Position + Count)) do begin + if Pos + Piece.Used > Position then begin + if Position > Pos then + Shift := Position - Pos + else + Shift := 0; + + if (Pos + Piece.Used) > (Position + Count) then + MoveSize := (Position + Count) - (Pos + Shift) + else + MoveSize := Piece.Used - Shift; + + CopyBuffer(IntPtr(Integer(Piece) + sizeof(TPieceHeader) + Integer(Shift)), + IntPtr(Integer(Dest) + Integer(ReadCount)), MoveSize); + Inc(ReadCount, MoveSize); + end; + Inc(Pos, Piece.Used); + Piece := Piece.Next; + end; + Result := ReadCount; +end; + +{ similar to Read } + +procedure TBlob.Write(Position: cardinal; Count: cardinal; Source: IntPtr); +var + Piece: PPieceHeader; + Pos, { shift from Blob begin } + Shift, { for write, in Piece } + WriteCount, { all } + MoveSize: cardinal; { in Piece } +begin + CheckValid; // DEBUG + + if FNeedRollback and (Rollback = nil) then + SaveToRollback; + + if (Position > Size) then + Position := Size; + + Piece := FFirstPiece; + WriteCount := 0; + Pos := 0; + while (Pos < (Position + Count)) do begin + if IntPtr(Piece) = nil then begin + if Count > PieceSize then + AllocPiece(Piece, PieceSize) + else + AllocPiece(Piece, Count); + AppendPiece(Piece); + end; + + if Pos + Piece.Size > Position then begin + if Position > Pos then + Shift := Position - Pos + else + Shift := 0; + + if (Pos + Piece.Size) > (Position + Count) then + MoveSize := (Position + Count) - (Pos + Shift) + else + MoveSize := Piece.Size - Shift; + + CopyBuffer(IntPtr(Integer(Source) + Integer(WriteCount)), + IntPtr(Integer(Piece) + sizeof(TPieceHeader) + Integer(Shift)), MoveSize); + Inc(WriteCount, MoveSize); + + Assert(Shift <= Piece.Used); + if (Shift + MoveSize) > Piece.Used then + Piece.Used := Shift + MoveSize; + end; + Inc(Pos, Piece.Used); + Piece := Piece.Next; + end; + + FModified := True; +end; + +procedure TBlob.Truncate(NewSize: cardinal); +var + Piece: PPieceHeader; + Size: cardinal; +begin + if FNeedRollback and (Rollback = nil) then + SaveToRollback; + + if NewSize = 0 then + Clear + else begin + Size := 0; + Piece := FirstPiece; + while IntPtr(Piece) <> nil do begin + if Size + Piece.Used > NewSize then + Piece.Used := NewSize - Size; + Inc(Size, Piece.Used); + Piece := Piece.Next; + end; + end; + + FModified := True; +end; + +procedure TBlob.Compress; +var + Piece: PPieceHeader; + NextPiece: PPieceHeader; +begin + Piece := FirstPiece; + while IntPtr(Piece) <> nil do begin + NextPiece := Piece.Next; + CompressPiece(Piece); + Piece := NextPiece; + end; +end; + +procedure TBlob.Defrag; // Move all data to first piece +var + pc: IntPtr; + Piece: PPieceHeader; + NextPiece: PPieceHeader; +begin + if IntPtr(FirstPiece) = nil then + Exit; // Is empty + + ReallocPiece(FFirstPiece, GetDataSize); + pc := IntPtr(Integer(FFirstPiece) + sizeof(TPieceHeader) + Integer(FFirstPiece.Used)); + + Piece := FFirstPiece.Next; + while IntPtr(Piece) <> nil do begin + CopyBuffer(IntPtr(Integer(Piece) + sizeof(TPieceHeader)), pc, Piece.Used); + pc := IntPtr(Integer(pc) + Integer(Piece.Used)); + FFirstPiece.Used := FFirstPiece.Used + Piece.Used; + + NextPiece := Piece.Next; + FreePiece(Piece); + Piece := NextPiece; + end; +end; + +{ Stream/File } + +procedure TBlob.LoadFromStream(Stream: TStream); +var + Piece: PPieceHeader; + Remainder: cardinal; + BufLen: cardinal; +{$IFDEF CLR} + Buffer: TBytes; +{$ENDIF} +begin + Clear; + + Stream.Seek(0, soFromBeginning); + + Remainder := Stream.Size; + while Remainder > 0 do begin + if Remainder > PieceSize then + BufLen := PieceSize + else + BufLen := Remainder; + + AllocPiece(Piece, BufLen); + {$IFDEF CLR} + SetLength(Buffer, BufLen); + Stream.Read(Buffer{$IFNDEF CLR}[0]{$ENDIF}, BufLen); + Marshal.Copy(Buffer, 0, IntPtr(Integer(Piece) + Sizeof(TPieceHeader)), BufLen); + {$ELSE} + Stream.Read(IntPtr(Integer(Piece) + Sizeof(TPieceHeader))^, BufLen); + {$ENDIF} + Piece.Used := BufLen; + AppendPiece(Piece); + + Dec(Remainder, BufLen); + end; + + FModified := True; +end; + +procedure TBlob.SaveToStream(Stream: TStream); +var + Piece: PPieceHeader; + BufLen: cardinal; +{$IFDEF CLR} + Buffer: TBytes; +{$ENDIF} +begin + Stream.Size := 0; + + Piece := FirstPiece; + + while IntPtr(Piece) <> nil do begin + BufLen := Piece.Used; + + {$IFDEF CLR} + SetLength(Buffer, BufLen); + Marshal.Copy(IntPtr(Integer(Piece) + Sizeof(TPieceHeader)), Buffer, 0, BufLen); + Stream.Write(Buffer{$IFNDEF CLR}[0]{$ENDIF}, BufLen); + {$ELSE} + Stream.Write(IntPtr(Integer(Piece) + Sizeof(TPieceHeader))^, BufLen); + {$ENDIF} + + Piece := Piece.Next; + end; +end; + +procedure TBlob.LoadFromFile(const FileName: string); +var + Stream:TStream; +begin + Stream := TFileStream.Create(FileName, fmOpenRead); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TBlob.SaveToFile(const FileName: string); +var + Stream:TStream; +begin + Stream := TFileStream.Create(FileName, fmCreate); + try + SaveToStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TBlob.Assign(Source: TBlob); +const + BufSize = 65536; +var + Buf: IntPtr; + Pos: cardinal; + Size: cardinal; +begin + Clear; + + Pos := 0; + Buf := Marshal.AllocHGlobal(BufSize); + try + repeat + Size := Source.Read(Pos, BufSize, Buf); + if Size > 0 then begin + Write(Pos, Size, Buf); + Inc(Pos, Size); + end; + until Size = 0; + finally + Marshal.FreeHGlobal(Buf); + end; +end; + +{ Cached } + +procedure TBlob.CheckCached; +begin + if not FNeedRollback then + raise Exception.Create(SBlobMustBeCached); +end; + +procedure TBlob.SaveToRollback; +var + Piece: PPieceHeader; + CSize: Longint; +begin + CheckCached; + + Rollback := TBlob.Create; + Rollback.FIsUnicode := FIsUnicode; + Rollback.FModified := FModified; + + if IntPtr(FFirstPiece) <> nil then begin + // make copy of data + CSize := Size; + AllocPiece(Piece, CSize); + Piece.used := CSize; + Read(0, CSize, IntPtr(Integer(Piece) + sizeof(TPieceHeader))); + + Rollback.FFirstPiece := FFirstPiece; + FFirstPiece := nil; + AppendPiece(Piece); + end; +end; + +procedure TBlob.EnableRollback; +begin + {if FNeedRollback then + raise Exception.Create(SCachedAlreadyEnabled);} + + FNeedRollback := True; +end; + +procedure TBlob.Commit; +begin + //CheckCached; + + if Rollback <> nil then begin + Rollback.Free; + Rollback := nil; + end; +end; + +procedure TBlob.Cancel; +var + Piece: PPieceHeader; +begin + //CheckCached; + + if Rollback <> nil then begin + Piece := Rollback.FFirstPiece; + Rollback.FFirstPiece := FFirstPiece; + FFirstPiece := Piece; + FModified := Rollback.FModified; + + Rollback.Free; + Rollback := nil; + end; +end; + +function TBlob.CanRollback: boolean; +begin + Result := Rollback <> nil; +end; + +function TBlob.GetDataSize: cardinal; // sum of pieces.used +var + Piece: PPieceHeader; +begin + Result := 0; + Piece := FFirstPiece; + while IntPtr(Piece) <> nil do begin + Inc(Result, Piece.Used); + Piece := Piece.Next; + end; +end; + +function TBlob.GetSize: cardinal; +begin + Result := GetDataSize; +end; + +procedure TBlob.SetSize(Value: cardinal); +var + Piece: PPieceHeader; + OldSize: cardinal; +begin + OldSize := Size; + if OldSize > Value then + Truncate(Value) + else + if OldSize < Value then begin + AllocPiece(Piece, Value - OldSize); + Piece.Used := Value - OldSize; + FillChar(IntPtr(Integer(Piece) + Sizeof(TPieceHeader)), Value - OldSize, 0); + AppendPiece(Piece); + end; +end; + +procedure TBlob.SetIsUnicode(Value: boolean); +begin + if Value = IsUnicode then + Exit; + + if Size > 0 then + DataError(SCannotChangeIsUnicode); + + FIsUnicode := Value; +end; + +procedure TBlob.InternalClear; +var + Piece: PPieceHeader; +begin + while IntPtr(FFirstPiece) <> nil do begin + Piece := FFirstPiece; + FFirstPiece := FFirstPiece.Next; + Marshal.FreeHGlobal(Piece); + end; +end; + +function TBlob.TranslatePosition(Position: integer): integer; // Ansi to Unicode +var + Piece: PPieceHeader; + CurPosAnsi, CurPosUni, i: integer; + p: IntPtr; + w: WideString; + s: string; +begin + Assert(FIsUnicode); + + if {$IFNDEF CLR}not SysLocale.FarEast{$ELSE}(LeadBytes = []){$ENDIF} or (Position = 0) then begin + Result := Position * 2; + Exit; + end; + + CurPosAnsi := 0; + CurPosUni := 0; + Piece := FFirstPiece; + while IntPtr(Piece) <> nil do begin + p := IntPtr(Integer(Piece) + Sizeof(TPieceHeader)); + for i := 0 to Cardinal((Piece.Used div 2) - 1) do begin + w := Marshal.PtrToStringUni(IntPtr(Integer(p) + i * 2), 1); + s := w; + Inc(CurPosUni, 2); + Inc(CurPosAnsi, Length(s)); + if CurPosAnsi = Position then begin + Result := CurPosUni; + Exit; + end; + if CurPosAnsi > Position then + raise Exception.Create(SInvalidBlobPosition); + end; + Piece := Piece.Next; + end; + raise Exception.Create(SInvalidBlobPosition); +end; + +function TBlob.GetSizeAnsi: integer; +var + Piece: PPieceHeader; + i: integer; + p: IntPtr; + w: WideString; + s: string; +begin + Assert(FIsUnicode); + + if {$IFNDEF CLR}not SysLocale.FarEast{$ELSE}(LeadBytes = []){$ENDIF} then begin + Result := Cardinal(Size div 2); + Exit; + end; + + Result := 0; + Piece := FFirstPiece; + while IntPtr(Piece) <> nil do begin + p := IntPtr(Integer(Piece) + Sizeof(TPieceHeader)); + for i := 0 to Cardinal((Piece.Used div 2) - 1) do begin + w := Marshal.PtrToStringUni(IntPtr(Integer(p) + i * 2), 1); + s := w; + Inc(Result, Length(s)); + end; + Piece := Piece.Next; + end; +end; + +function TBlob.GetAsString: string; +var + Buffer: TBytes; + Handle: IntPtr; +begin + SetLength(Buffer, Size); + Handle := AllocGCHandle(Buffer, True); + try + Read(0, 0, GetAddrOfPinnedObject(Handle)); + finally + FreeGCHandle(Handle); + end; + if FIsUnicode then + Result := Encoding.Unicode.GetString(Buffer, 0, Size) + else + Result := Encoding.Default.GetString(Buffer, 0, Size); +end; + +procedure TBlob.SetAsString(Value: string); +var + Ws: WideString; + Buffer: IntPtr; + Size: cardinal; +begin + Clear; + if FIsUnicode then begin + Ws := Value; + Buffer := Marshal.StringToHGlobalUni(Ws); + Size := (Length(Value) shl 1); + end + else begin + Buffer := Marshal.StringToHGlobalAnsi(Value); + Size := Length(Value); + end; + try + Write(0, Size, Buffer); + finally + Marshal.FreeCoTaskMem(Buffer); + end; +end; + +function TBlob.GetAsWideString: WideString; +var + Buffer: TBytes; + Handle: IntPtr; + CachedSize: integer; // performance optimization +begin + CachedSize := Size; + SetLength(Buffer, CachedSize); + Handle := AllocGCHandle(Buffer, True); + try + Read(0, 0, GetAddrOfPinnedObject(Handle)); + finally + FreeGCHandle(Handle); + end; + if FIsUnicode then begin + Assert(CachedSize mod 2 = 0); // WideString must have even Size + Result := Encoding.Unicode.{$IFDEF CLR}GetString{$ELSE}GetWideString{$ENDIF}(Buffer); + end + else + Result := Encoding.Default.GetString(Buffer); +end; + +procedure TBlob.SetAsWideString(Value: WideString); +{$IFDEF WIN32} +var + s: string; +{$ENDIF} +begin +{$IFDEF CLR} + SetAsString(Value); +{$ENDIF} +{$IFDEF WIN32} + Clear; + if not FIsUnicode then begin + s := Value; + Write(0, Length(s), PChar(s)); + end + else + Write(0, Length(Value) shl 1, PWideChar(Value)); +{$ENDIF} +end; + +procedure TBlob.AddCR; +begin + if FIsUnicode then + AddCRUnicode + else + AddCRString; + + FModified := True; +end; + +procedure TBlob.RemoveCR; +begin + if FIsUnicode then + RemoveCRUnicode + else + RemoveCRString; + + FModified := True; +end; + +procedure TBlob.AddCRString; +var + SourcePiece: PPieceHeader; + DestPiece: PPieceHeader; + LastPiece: PPieceHeader; + FirstPiece: PPieceHeader; + TempPiece: PPieceHeader; + + Source: IntPtr; + SourceStart: IntPtr; + Dest: IntPtr; + DestEnd: IntPtr; + SourceEnd: IntPtr; + + Shift: cardinal; + Used: cardinal; + w: word; + b: byte; + c: byte; + + procedure AllocDestPiece; + var + AUsed, AUsed2: cardinal; + begin + AUsed := Used + Cardinal(Integer(SourceStart)) - Cardinal(Integer(Source)); + if Dest <> nil then + DestPiece.Used := Cardinal(DestPiece.Size) - 1 + Cardinal(Integer(Dest))- Cardinal(Integer(DestEnd)); + if AUsed < PieceSize div 2 then begin + AUsed2 := AUsed * 2; //temporary for Update 7.1 + AllocPiece(DestPiece, AUsed2) + end + else + AllocPiece(DestPiece, PieceSize); + Dest := IntPtr(Integer(DestPiece) + SizeOf(TPieceHeader)); + DestEnd := IntPtr(Integer(Dest) + Integer(DestPiece.Size) - 1); + DestPiece.Blob := Self.GetHashCode; + DestPiece.Prev := LastPiece; + if IntPtr(LastPiece) <> nil then + LastPiece.Next := DestPiece; + LastPiece := DestPiece; + if IntPtr(FirstPiece) = nil then + FirstPiece := DestPiece; + end; + +begin + CheckValid; // DEBUG + + CheckValue; + + if (IntPtr(FFirstPiece) = nil) then + Exit; + + SourcePiece := FFirstPiece; + FirstPiece := nil; + LastPiece := nil; + DestPiece := nil; + Dest := nil; + DestEnd := nil; + Shift := 0; + Used := Size; + + while (IntPtr(SourcePiece) <> nil) do begin + if SourcePiece.Used > Shift then begin + SourceStart := IntPtr(Integer(SourcePiece) + SizeOf(TPieceHeader) + Integer(Shift)); + Source := SourceStart; + SourceEnd := IntPtr(Integer(Source) + Integer(SourcePiece.Used) - 1 - Integer(Shift)); + + while Integer(Source) < Integer(SourceEnd) do begin + if Integer(Dest) >= Integer(DestEnd) then + AllocDestPiece; + w := Marshal.ReadInt16(Source); + if w = CRLF then begin + Marshal.WriteInt16(Dest, w); + Source := IntPtr(Integer(Source) + 2); + Dest := IntPtr(Integer(Dest) + 2); + end + else begin + b := Byte(w); + if b = LF then begin + Marshal.WriteInt16(Dest, CRLF); + Source := IntPtr(Integer(Source) + 1); + Dest := IntPtr(Integer(Dest) + 2); + end + else begin + Marshal.WriteByte(Dest, b); + Source := IntPtr(Integer(Source) + 1); + Dest := IntPtr(Integer(Dest) + 1); + end; + end; + end; + + if Source = SourceEnd then begin + c := Marshal.ReadByte(Source); + if Integer(Dest) >= Integer(DestEnd) then + AllocDestPiece; + Shift := Ord( + ((c = 13) + and + (((IntPtr(SourcePiece.Next) <> nil) + and + ( + Marshal.ReadByte( + IntPtr(Integer(IntPtr(SourcePiece.Next)) + SizeOf(TPieceHeader)) + ) = 10 + )) + or + (IntPtr(SourcePiece.Next) = nil))) + or + (c = 10) + ); + if (Shift = 1) then begin + Marshal.WriteInt16(Dest, CRLF); + Dest := IntPtr(Integer(Dest) + 2); + end + else begin + Marshal.WriteByte(Dest, c); + Dest := IntPtr(Integer(Dest) + 1); + end; + end else + Shift := 0; + end; + Dec(Used, SourcePiece.Used); + TempPiece := SourcePiece; + SourcePiece := SourcePiece.Next; + Marshal.FreeHGlobal(TempPiece); + end; + if Dest <> nil then + DestPiece.Used := DestPiece.Size - 1 + Cardinal(Integer(Dest)) - Cardinal(Integer(DestEnd)); + FFirstPiece := FirstPiece; +end; + +procedure TBlob.RemoveCRString; +var + SourcePiece: PPieceHeader; + DestPiece: PPieceHeader; + LastPiece: PPieceHeader; + FirstPiece: PPieceHeader; + TempPiece: PPieceHeader; + + SourceStart: IntPtr; + Source: IntPtr; + Dest: IntPtr; + DestEnd: IntPtr; + SourceEnd: IntPtr; + + Shift: cardinal; + Used: cardinal; + w: word; + c: byte; + + procedure AllocDestPiece; + var + AUsed: cardinal; + begin + AUsed := Used + Cardinal(Integer(SourceStart)) - Cardinal(Integer(Source)); + if Dest <> nil then + DestPiece.Used := DestPiece.Size + Cardinal(Integer(Dest)) - Cardinal(Integer(DestEnd)); + if AUsed < PieceSize then + AllocPiece(DestPiece, AUsed) + else + AllocPiece(DestPiece, PieceSize); + Dest := IntPtr(Integer(IntPtr(DestPiece)) + SizeOf(TPieceHeader)); + DestEnd := IntPtr(Integer(Dest) + Integer(DestPiece.Size)); + DestPiece.Blob := Self.GetHashCode; + DestPiece.Prev := LastPiece; + if IntPtr(LastPiece) <> nil then + LastPiece.Next := DestPiece; + LastPiece := DestPiece; + if IntPtr(FirstPiece) = nil then + FirstPiece := DestPiece; + end; + +begin + CheckValid; // DEBUG + + CheckValue; + + if (IntPtr(FFirstPiece) = nil) then + Exit; + + SourcePiece := FFirstPiece; + FirstPiece := nil; + LastPiece := nil; + DestPiece := nil; + Dest := nil; + DestEnd := nil; + Shift := 0; + Used := Size; + + while (IntPtr(SourcePiece) <> nil) do begin + if SourcePiece.Used > Shift then begin + SourceStart := IntPtr(Integer(SourcePiece) + SizeOf(TPieceHeader) + Integer(Shift)); + Source := SourceStart; + SourceEnd := IntPtr(Integer(Source) + Integer(SourcePiece.Used) - 1 - Integer(Shift)); + + while Integer(Source) < Integer(SourceEnd) do begin + if Integer(Dest) >= Integer(DestEnd) then + AllocDestPiece; + w := Marshal.ReadInt16(Source); + if w = CRLF then begin + Marshal.WriteByte(Dest, LF); + Source := IntPtr(Integer(Source) + 2); + Dest := IntPtr(Integer(Dest) + 1); + end + else + begin + Marshal.WriteByte(Dest, Byte(w)); + Source := IntPtr(Integer(Source) + 1); + Dest := IntPtr(Integer(Dest) + 1); + end; + end; + + if Source = SourceEnd then begin + c := Marshal.ReadByte(Source); + if Integer(Dest) >= Integer(DestEnd) then + AllocDestPiece; + Shift := Ord((c = 13) and (IntPtr(SourcePiece.Next) <> nil) + and + ( + Marshal.ReadByte( + IntPtr(Integer(IntPtr(SourcePiece.Next)) + SizeOf(TPieceHeader)) + ) = 10) + ); + if Shift = 1 then + c := 10; + Marshal.WriteByte(Dest, c); + Dest := IntPtr(Integer(Dest) + 1); + end else + Shift := 0; + end; + Dec(Used, SourcePiece.Used); + TempPiece := SourcePiece; + SourcePiece := SourcePiece.Next; + Marshal.FreeHGlobal(TempPiece); + end; + if Dest <> nil then + DestPiece.Used := DestPiece.Size + Cardinal(Integer(Dest)) - Cardinal(Integer(DestEnd)); + FFirstPiece := FirstPiece; +end; + +procedure TBlob.AddCRUnicode; +var + SourcePiece: PPieceHeader; + DestPiece: PPieceHeader; + LastPiece: PPieceHeader; + FirstPiece: PPieceHeader; + TempPiece: PPieceHeader; + + Source: IntPtr; + SourceStart: IntPtr; + Dest: IntPtr; + DestEnd: IntPtr; + SourceEnd: IntPtr; + + Shift: cardinal; //bytes + Used: cardinal; //bytes + w: LongWord; + b: Word; + c: Word; + procedure AllocDestPiece; + var + AUsed, AUsed2: cardinal; + begin + AUsed := Used + Cardinal(Integer(SourceStart)) - Cardinal(Integer(Source)); + if Dest <> nil then + DestPiece.Used := DestPiece.Size - sizeof(WideChar) + Cardinal(Integer(Dest)) - Cardinal(Integer(DestEnd)); + if AUsed < PieceSize div 2 then begin + AUsed2 := AUsed * 2; //temporary for Update 7.1 + AllocPiece(DestPiece, AUsed2) + end + else + AllocPiece(DestPiece, PieceSize); + Dest := IntPtr(Integer(DestPiece) + SizeOf(TPieceHeader)); + DestEnd := IntPtr(Integer(Dest) + Integer(DestPiece.Size) - sizeof(WideChar)); + DestPiece.Blob := Self.GetHashCode; + DestPiece.Prev := LastPiece; + if IntPtr(LastPiece) <> nil then + LastPiece.Next := DestPiece; + LastPiece := DestPiece; + if IntPtr(FirstPiece) = nil then + FirstPiece := DestPiece; + end; + +begin + CheckValid; // DEBUG + + CheckValue; + + if (IntPtr(FFirstPiece) = nil) then + Exit; + + SourcePiece := FFirstPiece; + FirstPiece := nil; + LastPiece := nil; + DestPiece := nil; + Dest := nil; + DestEnd := nil; + Shift := 0; + Used := Size; + + while (IntPtr(SourcePiece) <> nil) do begin + if SourcePiece.Used > Shift then begin + SourceStart := IntPtr(Integer(SourcePiece) + SizeOf(TPieceHeader) + Integer(Shift)); + Source := SourceStart; + SourceEnd := IntPtr(Integer(Source) + Integer(SourcePiece.Used) - sizeof(WideChar) - Integer(Shift)); + + while Integer(Source) < Integer(SourceEnd) do begin + if Integer(Dest) >= Integer(DestEnd) then + AllocDestPiece; + w := Marshal.ReadInt32(Source); + if w = CRLF_UTF16 then begin + Marshal.WriteInt32(Dest, w); + Source := IntPtr(Integer(Source) + 4); + Dest := IntPtr(Integer(Dest) + 4); + end + else begin + b := Word(w); + if b = LF_UTF16 then begin + Marshal.WriteInt32(Dest, CRLF_UTF16); + Source := IntPtr(Integer(Source) + 2); + Dest := IntPtr(Integer(Dest) + 4); + end + else begin + Marshal.WriteInt16(Dest, b); + Source := IntPtr(Integer(Source) + 2); + Dest := IntPtr(Integer(Dest) + 2); + end; + end; + end; + + if Source = SourceEnd then begin + c := Marshal.ReadInt16(Source); + if Integer(Dest) >= Integer(DestEnd) then + AllocDestPiece; + Shift := Ord( + (c = 13) and (IntPtr(SourcePiece.Next) <> nil) and + ( + Marshal.ReadInt16(IntPtr(Integer(IntPtr(SourcePiece.Next)) + SizeOf(TPieceHeader))) = 10 + ) + ) * sizeof(WideChar); + if Shift = sizeof(WideChar) then begin + Marshal.WriteInt32(Dest, CRLF_UTF16); + Dest := IntPtr(Integer(Dest) + 4); + end + else begin + Marshal.WriteInt16(Dest, c); + Dest := IntPtr(Integer(Dest) + 2); + end; + end else + Shift := 0; + end; + Dec(Used, SourcePiece.Used); + TempPiece := SourcePiece; + SourcePiece := SourcePiece.Next; + Marshal.FreeHGlobal(TempPiece); + end; + if Dest <> nil then + DestPiece.Used := DestPiece.Size - sizeof(WideChar) + Cardinal(Integer(Dest)) - Cardinal(Integer(DestEnd)); + FFirstPiece := FirstPiece; +end; + +procedure TBlob.RemoveCRUnicode; +var + SourcePiece: PPieceHeader; + DestPiece: PPieceHeader; + LastPiece: PPieceHeader; + FirstPiece: PPieceHeader; + TempPiece: PPieceHeader; + + SourceStart: IntPtr; + Source: IntPtr; + Dest: IntPtr; + DestEnd: IntPtr; + SourceEnd: IntPtr; + + Shift: cardinal; //bytes + Used: cardinal; //bytes + w: LongWord; + c: word; + + procedure AllocDestPiece; + var + AUsed: cardinal; + begin + AUsed := Used + Cardinal(Integer(SourceStart)) - Cardinal(Integer(Source)); + if Dest <> nil then + DestPiece.Used := DestPiece.Size + Cardinal(Integer(Dest)) - Cardinal(Integer(DestEnd)); + if AUsed < PieceSize then + AllocPiece(DestPiece, AUsed) + else + AllocPiece(DestPiece, PieceSize); + Dest := IntPtr(Integer(DestPiece) + SizeOf(TPieceHeader)); + DestEnd := IntPtr(Integer(Dest) + Integer(DestPiece.Size)); + DestPiece.Blob := Self.GetHashCode; + DestPiece.Prev := LastPiece; + if IntPtr(LastPiece) <> nil then + LastPiece.Next := DestPiece; + LastPiece := DestPiece; + if IntPtr(FirstPiece) = nil then + FirstPiece := DestPiece; + end; + +begin + CheckValid; // DEBUG + + CheckValue; + + if (IntPtr(FFirstPiece) = nil) then + Exit; + + SourcePiece := FFirstPiece; + FirstPiece := nil; + LastPiece := nil; + DestPiece := nil; + Dest := nil; + DestEnd := nil; + Shift := 0; + Used := Size; + + while (IntPtr(SourcePiece) <> nil) do begin + if SourcePiece.Used > Shift then begin + SourceStart := IntPtr(Integer(SourcePiece) + SizeOf(TPieceHeader) + Integer(Shift)); + Source := SourceStart; + SourceEnd := IntPtr(Integer(Source) + Integer(SourcePiece.Used) - sizeof(WideChar) - Integer(Shift)); + + while Integer(Source) < Integer(SourceEnd) do begin + if Integer(Dest) >= Integer(DestEnd) then + AllocDestPiece; + w := marshal.ReadInt32(Source); + if w = CRLF_UTF16 then begin + Marshal.WriteInt16(Dest, LF_UTF16); + Source := IntPtr(Integer(Source) + 4); + Dest := IntPtr(Integer(Dest) + 2); + end + else + begin + Marshal.WriteInt16(Dest, Word(w)); + Source := IntPtr(Integer(Source) + 2); + Dest := IntPtr(Integer(Dest) + 2); + end; + end; + + if Source = SourceEnd then begin + c := Marshal.ReadInt16(Source); + if Integer(Dest) >= Integer(DestEnd) then + AllocDestPiece; + Shift := Ord( + (c = 13) and (IntPtr(SourcePiece.Next) <> nil) and + ( + Marshal.ReadInt16(IntPtr(Integer(IntPtr(SourcePiece.Next)) + SizeOf(TPieceHeader))) = 10 + ) + ) * sizeof(WideChar); + if Shift = sizeof(WideChar) then + c := 10; + Marshal.WriteInt16(Dest, c); + Dest := IntPtr(Integer(Dest) + 2); + end else + Shift := 0; + end; + Dec(Used, SourcePiece.Used); + TempPiece := SourcePiece; + SourcePiece := SourcePiece.Next; + Marshal.FreeHGlobal(TempPiece); + end; + if Dest <> nil then + DestPiece.Used := DestPiece.Size + Cardinal(Integer(Dest)) - Cardinal(Integer(DestEnd)); + FFirstPiece := FirstPiece; +end; + +{ TBlobUtils } + +class procedure TBlobUtils.SetModified(Blob: TBlob; Value: boolean); +begin + Blob.FModified := Value; +end; + +{$IFDEF HAVE_COMPRESS} + +{ TCompressedBlob } + +function TCompressedBlob.CompressFrom(source: IntPtr; const sourceLen: longint): boolean; +var + CPiece: PPieceHeader; + CSize: integer; +begin + // see my_compress_alloc + // *complen= *len * 120 / 100 + 12; + CheckZLib; + CSize := CCompressBlobHeaderSize{header} + sourceLen + (sourceLen div 5) + 12; + AllocPiece(CPiece, CSize); + try + DoCompress(Pointer(Integer(CPiece) + sizeof(TPieceHeader) + CCompressBlobHeaderSize), @CSize, source, sourceLen); + CPiece.Used := CCompressBlobHeaderSize + CSize; + Result := LongInt(CPiece.Used) < sourceLen; // Compression is successful + except + Result := False; + end; + if not Result then begin + FreePiece(CPiece); + Exit; + end; + + // WriteHeader + CopyBuffer(@CCompressBlobHeaderGuid[0], PByte(Integer(CPiece) + sizeof(TPieceHeader)), CCompressBlobHeaderGuidSize); + Marshal.WriteInt32(CPiece, sizeof(TPieceHeader) + CCompressBlobHeaderSize - SizeOf(Integer), sourceLen); + + CompressPiece(CPiece); + if FFirstPiece <> nil then + FreePiece(FFirstPiece); + AppendPiece(CPiece); + + FModified := True; +end; + +procedure TCompressedBlob.UncompressTo(dest: IntPtr; var destlen: integer); +var + source: IntPtr; +begin + Assert(FFirstPiece <> nil); + + Defrag; + source := PByte(Integer(FFirstPiece) + sizeof(TPieceHeader)); + + Assert(FFirstPiece.Next = nil); + + // Check header + if FFirstPiece.Used <= CCompressBlobHeaderSize then + DataError(SInvalidComprBlobSize); + if not CompareMem(source, @CCompressBlobHeaderGuid[0], CCompressBlobHeaderGuidSize) then + DataError(SInvalidComprBlobHeader); + + CheckZLib; + try + DoUncompress(dest, @destlen, IntPtr(Integer(source) + CCompressBlobHeaderSize), FFirstPiece.Used - CCompressBlobHeaderSize); + except + DataError(SInvalidComprBlobData); + end; +end; + +function TCompressedBlob.GetSize: cardinal; +begin + if Compressed then begin + Result := UnCompressedSize; + Assert(Result > 0); + end + else + Result := inherited GetSize; +end; + +procedure TCompressedBlob.SetSize(Value: cardinal); +begin + if Compressed then + Assert((Value = 0) or (Value = Size)); + + inherited; +end; + +function TCompressedBlob.GetCompressedSize: cardinal; +begin + if not Compressed then + DataError(sBlobNotCompressed); + Result := inherited GetSize; +end; + +function TCompressedBlob.GetCompressed: boolean; +begin + Result := + (FFirstPiece <> nil) and + // (FFirstPiece.Next = nil) and - false, if blob copied from another blob + (FFirstPiece.Used > CCompressBlobHeaderSize) and + CompareMem(IntPtr(Integer(FFirstPiece) + sizeof(TPieceHeader)), @CCompressBlobHeaderGuid[0], CCompressBlobHeaderGuidSize); +end; + +procedure TCompressedBlob.SetCompressed(Value: boolean); +var + CPiece: PPieceHeader; + Count, CSize: integer; +begin + if (IntPtr(FFirstPiece) = nil) or (Compressed = Value) then + Exit; + + if Value then begin + { pack + (b) small blob without compression (Size < MIN_COMPRESS_LENGTH). + (c) big blobs without compression (ZIP, JPG etc). + (d) big blobs with compression (TXT etc). + } + Count := Size; + // (b) + if Count <= MIN_COMPRESS_LENGTH then + Exit; + + Defrag; + CompressFrom(PByte(Integer(FFirstPiece) + sizeof(TPieceHeader)), Count); + end + else + begin + // unpack + CheckValid; // DEBUG + CheckValue; + + Assert(FFirstPiece <> nil, 'FFirstPiece = nil'); + + CSize := UnCompressedSize; + AllocPiece(CPiece, CSize); + try + UncompressTo(IntPtr(Integer(CPiece) + sizeof(TPieceHeader)), CSize); + CPiece.Used := CSize; + if CPiece.Used <> CPiece.Size then + DataError(SInvalidUnComprBlobSize); //DatabaseError(SInvalidUnComprBlobSize); + except + FreePiece(CPiece); + raise; + end; + + FreePiece(FFirstPiece); + AppendPiece(CPiece); + end; + + FModified := True; +end; + +function TCompressedBlob.UnCompressedSize: cardinal; +begin + Assert(Compressed); + Result := Marshal.ReadInt32(FFirstPiece, sizeof(TPieceHeader) + CCompressBlobHeaderSize - SizeOf(Integer)); +end; + +procedure TCompressedBlob.Truncate(NewSize: cardinal); +begin + if Compressed and (NewSize <> 0) then + Compressed := False; + inherited; +end; + +function TCompressedBlob.Read(Position, Count: cardinal; + Dest: IntPtr): cardinal; +var + CSize: Longint; + ReadAll: boolean; +begin + // partial read or read all blob? + ReadAll := (Position = 0) and ((Count = Size) or (Count = 0)); + if Compressed and not ReadAll then + Compressed := False; + + if Compressed then begin + Assert(ReadAll); + + // Copied from inherited + CheckValid; // DEBUG + CheckValue; + Result := 0; + + if (IntPtr(FFirstPiece) = nil) or (Position > Size) then + Exit; + + if Count = 0 then + Count := Size; + //----------- + + CSize := Count; + UncompressTo(Dest, CSize); + Assert(Cardinal(CSize) = Count); + Result := CSize; + end + else + Result := inherited Read(Position, Count, Dest); +end; + +procedure TCompressedBlob.Write(Position, Count: cardinal; Source: IntPtr); +begin + if Compressed then begin + if (Position <> 0) or ((Count <> Size) and (Size <> 0)) {full rewrite} then begin + Compressed := False; + inherited; + Exit; + end; + Clear; + + { pack + (b) small blob without compression (Size < MIN_COMPRESS_LENGTH). + (c) big blobs without compression (ZIP, JPG etc). + (d) big blobs with compression (TXT etc). + } + + // (b) + if (Count <= MIN_COMPRESS_LENGTH) or not CompressFrom(Source, Count) then + inherited; + end + else + inherited; +end; + +procedure TCompressedBlob.SaveToRollback; +var + Piece: PPieceHeader; + CSize: Longint; +begin + CheckCached; + + Rollback := TCompressedBlob.Create; + Rollback.IsUnicode := IsUnicode; + Rollback.FModified := FModified; + + CSize := Size; + if (IntPtr(FFirstPiece) <> nil) and (CSize <> 0) then begin + // make copy of data + AllocPiece(Piece, CSize); + Piece.used := CSize; + Read(0, CSize, IntPtr(Integer(Piece) + sizeof(TPieceHeader))); + + TCompressedBlob(Rollback).FFirstPiece := FFirstPiece; + FFirstPiece := nil; + AppendPiece(Piece); + end; +end; +{$ENDIF} + +{$IFDEF VER6} +{$IFDEF MSWINDOWS} +function LCIDToCodePage(ALcid: LongWord): Integer; +const + CP_ACP = 0; // system default code page + LOCALE_IDEFAULTANSICODEPAGE = $00001004; // default ansi code page +var + ResultCode: Integer; + Buffer: array [0..6] of Char; +begin + GetLocaleInfo(ALcid, LOCALE_IDEFAULTANSICODEPAGE, Buffer, SizeOf(Buffer)); + Val(Buffer, Result, ResultCode); + if ResultCode <> 0 then + Result := CP_ACP; +end; +{$ENDIF} +{$ENDIF} + +initialization + StartWaitProc := nil; + StopWaitProc := nil; + ApplicationTitleProc := nil; +{$IFNDEF VER6P} + ApplicationHandleException := nil; +{$ENDIF} + +{$IFDEF VER6} +{$IFDEF MSWINDOWS} + // Code from Delphi7 system.pas + // High bit is set for Win95/98/ME + if not IsWin9x then + begin + if {Lo(GetVersion) > 4} Win32MajorVersion > 4 then + DefaultUserCodePage := 3 // Use CP_THREAD_ACP with Win2K/XP + else + // Use thread's current locale with NT4 + DefaultUserCodePage := LCIDToCodePage(GetThreadLocale); + end + else + // Convert thread's current locale with Win95/98/ME + DefaultUserCodePage := LCIDToCodePage(GetThreadLocale); +{$ENDIF} +{$ENDIF} + + BoolSymbolLexems := TStringList.Create; + BoolKeywordLexems := TStringList.Create; + + BoolSymbolLexems.AddObject('=', TObject(Integer(lxEqual))); + BoolSymbolLexems.AddObject('>', TObject(Integer(lxMore))); + BoolSymbolLexems.AddObject('<', TObject(Integer(lxLess))); + BoolSymbolLexems.AddObject('>=', TObject(Integer(lxMoreEqual))); + BoolSymbolLexems.AddObject('<=', TObject(Integer(lxLessEqual))); + BoolSymbolLexems.AddObject('<>', TObject(Integer(lxNoEqual))); + BoolSymbolLexems.AddObject('(', TObject(Integer(lxLeftBracket))); + BoolSymbolLexems.AddObject(')', TObject(Integer(lxRightBracket))); + BoolSymbolLexems.AddObject('-', TObject(Integer(lxMinus))); + BoolSymbolLexems.AddObject('+', TObject(Integer(lxPlus))); + BoolSymbolLexems.AddObject('[', TObject(Integer(lxLeftSqBracket))); + BoolSymbolLexems.AddObject(']', TObject(Integer(lxRightSqBracket))); + BoolSymbolLexems.CustomSort(CRCmpStrings); + + BoolKeywordLexems.AddObject('AND', TObject(Integer(lxAND))); + BoolKeywordLexems.AddObject('FALSE', TObject(Integer(lxFALSE))); + BoolKeywordLexems.AddObject('IS', TObject(Integer(lxIS))); + BoolKeywordLexems.AddObject('NOT', TObject(Integer(lxNOT))); + BoolKeywordLexems.AddObject('NULL', TObject(Integer(lxNULL))); + BoolKeywordLexems.AddObject('OR', TObject(Integer(lxOR))); + BoolKeywordLexems.AddObject('TRUE', TObject(Integer(lxTRUE))); + BoolKeywordLexems.AddObject('LIKE', TObject(Integer(lxLIKE))); + BoolKeywordLexems.CustomSort(CRCmpStrings); + + RefreshIteration := 1; + +finalization + BoolSymbolLexems.Free; + BoolKeywordLexems.Free; + +{$IFDEF MSWINDOWS} + {$IFDEF CRDEBUG} if DataCnt <> 0 then MessageBox(0, PChar(IntToStr(DataCnt) + ' Data(s) hasn''t been released'), 'DA warning', MB_OK); {$ENDIF} + {$IFDEF CRDEBUG} if ShareObjectCnt <> 0 then MessageBox(0, PChar(IntToStr(ShareObjectCnt) + ' ShareObject(s) hasn''t been released'), 'DA warning', MB_OK); {$ENDIF} +{$ENDIF} +end. diff --git a/internal/4.10.0.10/1/Source/MemUtils.pas b/internal/4.10.0.10/1/Source/MemUtils.pas new file mode 100644 index 0000000..97be1f6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/MemUtils.pas @@ -0,0 +1,1682 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Mem Data +// Created: 06.11.03 +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit MemUtils; +{$ENDIF} +interface +uses + Classes, SysUtils, {$IFDEF VER6P}Variants, {$ENDIF} +{$IFDEF HAVE_COMPRESS_INTERNAL} + ZLib, ZLibConst, +{$ENDIF} +{$IFDEF LINUX} +{$ELSE} + Windows, +{$ENDIF} +{$IFDEF CLR} + System.Xml, + System.Runtime.InteropServices; +{$ELSE} + CLRClasses; +{$ENDIF} + +{$IFNDEF VER6P} +const + varShortInt = $0010; { vt_i1 } + varWord = $0012; { vt_ui2 } + varLongWord = $0013; { vt_ui4 } + varInt64 = $0014; { vt_i8 } + +type + TVarType = Word; +{$ENDIF} + +{$IFDEF CLR} +const + wsAttribute: System.Xml.WriteState = System.Xml.WriteState.Attribute; + wsClosed: System.Xml.WriteState = System.Xml.WriteState.Closed; + wsContent: System.Xml.WriteState = System.Xml.WriteState.Content; + wsElement: System.Xml.WriteState = System.Xml.WriteState.Element; + wsStart: System.Xml.WriteState = System.Xml.WriteState.Start; + + fmtNone: System.Xml.Formatting = System.Xml.Formatting.None; + fmtIndented: System.Xml.Formatting = System.Xml.Formatting.Indented; + + ntNone: System.Xml.XmlNodeType = System.Xml.XmlNodeType.None; + ntElement: System.Xml.XmlNodeType = System.Xml.XmlNodeType.Element; + ntAttribute: System.Xml.XmlNodeType = System.Xml.XmlNodeType.Attribute; + ntEndElement: System.Xml.XmlNodeType = System.Xml.XmlNodeType.EndElement; + ntComment: System.Xml.XmlNodeType = System.Xml.XmlNodeType.Comment; + ntDeclaration: System.Xml.XmlNodeType = System.Xml.XmlNodeType.XmlDeclaration; + ntDocumentType: System.Xml.XmlNodeType = System.Xml.XmlNodeType.DocumentType; + ntText: System.Xml.XmlNodeType = System.Xml.XmlNodeType.Text; +{$ENDIF} + +type +{$IFNDEF CLR} + TValueArr = PChar; +{$ELSE} + TValueArr = TBytes; + + PChar = string; + PWideChar = string; + + POleVariant = IntPtr; + +const + { TStream seek origins compatibility aliases } + soFromBeginning = soBeginning; + soFromCurrent = soCurrent; + soFromEnd = soEnd; +{$ENDIF} + +{$IFNDEF VER7P} +const + MSecsPerSec = 1000; +{$ENDIF} + +{ CLR compatibility routines } +{$IFDEF CLR} + function CompareMem(P1, P2: IntPtr; Length: integer): boolean; +{$ENDIF} + function CompareGuid(const g1, g2: TGuid): boolean; + function TimeStampToDateTime(const ATimeStamp: TTimeStamp): TDateTime; + + function VarEqual(const Value1, Value2: variant): boolean; + procedure OleVarClear(pValue: POleVariant); + function GetOleVariant(pValue: POleVariant): OleVariant; + procedure SetOleVariant(pValue: POleVariant; const Value: OleVariant); + + procedure CopyBuffer(Source, Dest: IntPtr; Count: cardinal); + procedure CopyBufferAnsi(const Source: string; Dest: IntPtr; Count{Bytes (#0 included)}: cardinal); + procedure CopyBufferUni(const Source: WideString; Dest: IntPtr; Count{Bytes (#0 included)}: cardinal); + + procedure FillChar(X: IntPtr; Count: integer; Value: byte); + procedure FillStr(var S: string; Count: integer; Value: char); + procedure ArrayCopy(sourceArray: TBytes; sourceIndex: integer; destinationArray: TBytes; destinationIndex: integer; length: integer); + function AllocGCHandle(Obj: {$IFDEF CLR}TObject{$ELSE}pointer{$ENDIF}; Pinned: boolean = False): IntPtr; + function GetGCHandleTarget(Handle: IntPtr): TObject; + function GetAddrOfPinnedObject(Handle: IntPtr): IntPtr; + procedure FreeGCHandle(Handle: IntPtr); + + function AllocString(var S: string; Length: integer): IntPtr; + procedure FreeString(P: IntPtr); + function AllocOrdinal(var Obj: IntPtr): IntPtr; overload; + function AllocOrdinal(var Obj: shortint): IntPtr; overload; + function AllocOrdinal(var Obj: byte): IntPtr; overload; + function AllocOrdinal(var Obj: word): IntPtr; overload; + function AllocOrdinal(var Obj: integer): IntPtr; overload; + function AllocOrdinal(var Obj: cardinal): IntPtr; overload; + function OrdinalToPtr(var Obj: double): IntPtr; overload; + function OrdinalToPtr(var Obj: byte): IntPtr; overload; + function OrdinalToPtr(var Obj: smallint): IntPtr; overload; + function OrdinalToPtr(var Obj: integer): IntPtr; overload; + function OrdinalToPtr(var Obj: int64): IntPtr; overload; + function OrdinalToPtr(var Obj: cardinal): IntPtr; overload; + function OrdinalToPtr(var Obj: word): IntPtr; overload; + function OrdinalToPtr(var Obj: IntPtr): IntPtr; overload; + procedure PtrToOrdinal(P: IntPtr; var Obj: shortint); overload; + procedure PtrToOrdinal(P: IntPtr; var Obj: byte); overload; + procedure PtrToOrdinal(P: IntPtr; var Obj: smallint); overload; + procedure PtrToOrdinal(P: IntPtr; var Obj: word); overload; + procedure PtrToOrdinal(P: IntPtr; var Obj: integer); overload; + procedure PtrToOrdinal(P: IntPtr; var Obj: int64); overload; + procedure PtrToOrdinal(P: IntPtr; var Obj: cardinal); overload; + procedure PtrToOrdinal(P: IntPtr; var Obj: IntPtr); overload; + procedure FreeOrdinal(P: IntPtr); +{ PChar and PWideChar routines } +{$IFDEF CLR} + procedure StrCopy(Dest: IntPtr; const Source: IntPtr); + function StrComp(const Str1: IntPtr; const Str2: IntPtr): integer; + procedure StrLCopy(Dest: IntPtr; const Source: IntPtr; MaxLen{Chars}: Cardinal); + function StrLen(const Str: IntPtr): Cardinal; + + function AnsiUpperCase(const S: string): string; + function AnsiCompareText(const S1, S2: string): integer; + function AnsiCompareStr(const S1, S2: string): integer; + function AnsiSameText(const S1, S2: string): Boolean; +{$ELSE} + function AnsiStrCompS(S1, S2: PChar): Integer; // SORT_STRINGSORT + function AnsiStrICompS(S1, S2: PChar): Integer; // SORT_STRINGSORT +{$ENDIF} + function AnsiCompareTextS(const S1, S2: string): integer; // SORT_STRINGSORT + function AnsiCompareStrS(const S1, S2: string): integer; // SORT_STRINGSORT + function Utf8ToWs(const Dest: TValueArr; DestIdx: Cardinal; MaxDestBytes{w/wo #0}: Cardinal; + const Source: TValueArr; SourceIdx, SourceBytes: Cardinal; + const AddNull: boolean): Cardinal{bytes w/wo #0}; + + function StrCopyW(Dest: IntPtr; const Source: IntPtr): IntPtr; + procedure StrLCopyW(Dest: IntPtr; const Source: IntPtr; MaxLen{WideChars}: Cardinal); + function StrLenW(const Str: IntPtr): Cardinal; + procedure StrTrim(const Str: IntPtr; Len: integer = -1); + procedure StrTrimW(const Str: IntPtr; Len: integer = -1); + function AnsiStrLCompWS(const S1, S2: WideString; MaxLen: Cardinal): Integer; // SORT_STRINGSORT + function AnsiStrLICompWS(const S1, S2: WideString; MaxLen: Cardinal): Integer; // SORT_STRINGSORT + function AnsiStrCompWS(const S1, S2: WideString): Integer; // SORT_STRINGSORT + function AnsiStrICompWS(const S1, S2: WideString): Integer; // SORT_STRINGSORT + + function IsClass(Obj: TObject; AClass: TClass): boolean; + +type +{$IFDEF CLR} + TDAList = class(TObject) + FList: array of TObject; + FCount: Integer; + FCapacity: Integer; + protected + function Get(Index: Integer): TObject; + procedure Grow; virtual; + procedure Put(Index: Integer; Item: TObject); + procedure SetCapacity(NewCapacity: Integer); + + public + constructor Create; + destructor Destroy; override; + function Add(Item: TObject): Integer; + procedure Clear; virtual; + procedure Delete(Index: Integer); + function IndexOf(Item: TObject): Integer; + function Last: TObject; + function Remove(Item: TObject): Integer; + procedure Sort(Compare: TListSortCompare); + + property Capacity: Integer read FCapacity write SetCapacity; + property Count: Integer read FCount; + property Items[Index: Integer]: TObject read Get write Put; default; + + end; +{$ELSE} + TDAList = TList; +{$ENDIF} + +{$IFNDEF CLR} +function TryEncodeDate(Year, Month, Day: Word; var Date: TDateTime): Boolean; +function TryEncodeTime(Hour, Min, Sec, MSec: Word; var Time: TDateTime): Boolean; +function TryEncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, + AMilliSecond: Word; out AValue: TDateTime): Boolean; +function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, + AMilliSecond: Word): TDateTime; +{$ENDIF} + +{$IFNDEF VER6P} + function BoolToStr(const Value: boolean; UseBoolStrs: Boolean = False): string; + function TryStrToBool(const S: string; out Value: Boolean): Boolean; + function StrToBool(const S: string): Boolean; + procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, + AHour, AMinute, ASecond, AMilliSecond: Word); + function WideUpperCase(const S: WideString): WideString; + function VarToWideStr(const V: Variant): WideString; +{$ENDIF} + +{$IFDEF VER6} +function StrToBool(const S: string): Boolean; +function TryStrToBool(const S: string; out Value: Boolean): Boolean; +{$ENDIF} + + function Reverse4(Value: cardinal): cardinal; +{$IFNDEF CLR} + procedure Reverse8(pValue: IntPtr); +{$ENDIF} + +{$IFDEF VER8} +type + UTF8String = AnsiString deprecated; + +function UTF8Encode(const WS: WideString): UTF8String; deprecated; +function UTF8Decode(const S: UTF8String): WideString; deprecated; +{$ENDIF} + +{$IFDEF HAVE_COMPRESS} +const + MIN_COMPRESS_LENGTH = 50; // Don't compress small bl. + + procedure CheckZLib; + procedure DoCompress(dest: IntPtr; destLen: IntPtr; const source: IntPtr; sourceLen: longint); + procedure DoUncompress(dest: IntPtr; destlen: IntPtr; source: IntPtr; sourceLne: longint); + +type + TCompressProc = function(dest: IntPtr; destLen: IntPtr; const source: IntPtr; sourceLen: longint): longint; {$IFDEF LINUX}cdecl;{$ENDIF} + TUncompressProc = function(dest: IntPtr; destlen: IntPtr; source: IntPtr; sourceLne: longint): longint; {$IFDEF LINUX}cdecl;{$ENDIF} + +var + CompressProc: TCompressProc; + UncompressProc: TUncompressProc; + +{$ENDIF} + +{$IFDEF MSWINDOWS} +var + IsWin9x: boolean; +{$ENDIF} + +implementation + +{$IFDEF CLR} +uses + ActiveX, System.Text, + RTLConsts; +{$ELSE} +uses +{$IFDEF VER6} + SysConst, +{$ENDIF} + DAConsts; +{$ENDIF} + +{$IFNDEF CLR} + {$IFDEF MSWINDOWS} + {$DEFINE SORT_STRINGSORT} + {$ENDIF} +{$ENDIF} + +{$IFDEF CLR} +[DllImport('kernel32.dll')] +procedure CopyMemory(Dest, Source: IntPtr; Count: cardinal); external; + +[DllImport('kernel32.dll')] +function lstrcpy(lpString1, lpString2: IntPtr): IntPtr; external; + +[DllImport('kernel32.dll')] +function lstrcpyn(lpString1, lpString2: IntPtr; iMaxLength: Integer): IntPtr; external; + +[DllImport('kernel32.dll')] +function lstrcmp(lpString1, lpString2: IntPtr): integer; external; + +[DllImport('kernel32.dll')] +function lstrlen(lpString: IntPtr): Integer; external; + +[DllImport('kernel32.dll')] +procedure FillMemory(Destination: IntPtr; Length: DWORD; Fill: Byte); external; + +function CompareMem(P1, P2: IntPtr; Length: integer): boolean; +var + i: integer; +begin + Result := False; + for i := 0 to Length - 1 do begin + if Marshal.ReadByte(P1) <> Marshal.ReadByte(P2) then + Exit; + P1 := IntPtr(integer(P1) + 1); + P2 := IntPtr(integer(P2) + 1); + end; + Result := True; +end; +function CompareGuid(const g1, g2: TGuid): boolean; +begin + Result := g1 = g2; +end; +{$ELSE} +function CompareGuid(const g1, g2: TGuid): boolean; +begin + Result := CompareMem(@g1, @g2, SizeOf(TGuid)); +end; +{$ENDIF} + +function TimeStampToDateTime(const ATimeStamp: TTimeStamp): TDateTime; + procedure ValidateTimeStamp(const ATimeStamp: TTimeStamp); + begin + if (ATimeStamp.Time < 0) or (ATimeStamp.Date <= 0) then + raise EConvertError.Create(Format('''%d.%d'' is not a valid timestamp', [ATimeStamp.Date, ATimeStamp.Time])); + end; +begin + ValidateTimeStamp(ATimeStamp); + Result := ATimeStamp.Date - DateDelta; +{$IFNDEF CLR} + if Result < 0 then + Result := Result - (ATimeStamp.Time / MSecsPerDay) + else +{$ENDIF} + Result := Result + (ATimeStamp.Time / MSecsPerDay); +end; + +// bug in D8 in compare strings as variant type +function VarEqual(const Value1, Value2: variant): boolean; +var +{$IFDEF CLR} + va_old, va_new: TBytes; + i: integer; +{$ELSE} + va_old, va_new: PVarArray; + va_data_old, va_data_new: IntPtr; +{$ENDIF} +begin +{$IFDEF CLR} + if (Value1 <> nil) and (Value2 <> nil) and + (integer(Convert.GetTypeCode(Value1)) = 18) and (integer(Convert.GetTypeCode(Value2)) = 18) + then + Result := System.String.CompareOrdinal(string(Value1), string(Value2)) = 0 + else +{$ELSE} + // prevent comparing as AnsiString + if (VarType(Value1) = 8) and ((VarType(Value2) = 8) or (VarType(Value2) = 256)) or + (VarType(Value2) = 8) and ((VarType(Value1) = 8) or (VarType(Value1) = 256)) + then + Result := WideString(Value1) = WideString(Value2) + else +{$ENDIF} + if (VarType(Value1) = varNull) and (VarType(Value2) = varNull) then + Result := True + else + if (VarType(Value1) = varNull) or (VarType(Value2) = varNull) or + (VarType(Value2) <> VarType(Value2)) then + Result := False + else + if (VarType(Value1) = varArray + varByte) or + (VarType(Value2) = varArray + varByte) then begin + {$IFDEF CLR} + va_old := Value1; + va_new := Value2; + if (va_old = nil) and (va_new = nil) then + Result := True + else + if (va_old = nil) or (va_new = nil) or + (Length(va_old) <> Length(va_new)) then + Result := False + else begin + Result := True; + for i := Low(va_old) to High(va_old) do + if va_old[i] <> va_new[i] then begin + Result := False; + Break; + end; + end; + {$ELSE} + va_old := TVarData(Value1).VArray; + va_new := TVarData(Value2).VArray; + if (va_old = nil) and (va_new = nil) then + Result := True + else + if (va_old = nil) or (va_new = nil) or + (va_old.Bounds[0].ElementCount <> va_new.Bounds[0].ElementCount) then + Result := False + else begin + va_data_old := va_old.Data; + va_data_new := va_new.Data; + if (va_data_old = nil) and (va_data_new = nil) then + Result := True + else + if (va_data_old = nil) or (va_data_new = nil) then + Result := False + else + Result := CompareMem(va_data_old, va_data_new, va_old.Bounds[0].ElementCount); + end; + {$ENDIF} + end + else + Result := Value1 = Value2; +end; + +procedure CopyBuffer(Source, Dest: IntPtr; Count: cardinal); +begin +{$IFDEF CLR} + CopyMemory(Dest, Source, Count); +{$ELSE} + Move(Source^, Dest^, Count); +{$ENDIF} +end; + +procedure CopyBufferAnsi(const Source: string; Dest: IntPtr; Count{Bytes (#0 included)}: cardinal); +{$IFDEF CLR} +var + buf: TBytes; + CountInt: integer; // To prevent CLR compiler error +begin + SetLength(buf, Count); + CountInt := Convert.ToInt32(Count); // To prevent CLR compiler error + Encoding.Default.GetBytes(Source, 0, CountInt - 1{#0}, buf, 0); + buf[CountInt - 1] := 0; + Marshal.Copy(buf, 0, Dest, CountInt); +end; +{$ELSE} +begin + CopyBuffer(PChar(Source), Dest, Count); +end; +{$ENDIF} + +procedure CopyBufferUni(const Source: WideString; Dest: IntPtr; Count{Bytes (#0#0 included)}: cardinal); +{$IFDEF CLR} +var + buf: TBytes; + CountInt: integer; // To prevent CLR compiler error +begin + SetLength(buf, Count); + CountInt := Convert.ToInt32(Count); // To prevent CLR compiler error + Encoding.Unicode.GetBytes(Source, 0, (CountInt - 1{#0}) shr 1, buf, 0); + buf[CountInt - 1] := 0; + buf[CountInt - 2] := 0; + Marshal.Copy(buf, 0, Dest, CountInt); +end; +{$ELSE} +begin + CopyBuffer(PWideChar(Source), Dest, Count); +end; +{$ENDIF} + +procedure FillChar(X: IntPtr; Count: integer; Value: byte); +begin +{$IFDEF CLR} + FillMemory(X, Count, Value); +{$ELSE} + System.FillChar(X^, Count, Value); +{$ENDIF} +end; + +procedure FillStr(var S: string; Count: integer; Value: char); +begin +{$IFDEF CLR} + S := System.String.Create(Value, Count); +{$ELSE} + SetLength(S, Count); + FillChar(PChar(S), Count, byte(Value)); +{$ENDIF} +end; + +procedure ArrayCopy(sourceArray: TBytes; sourceIndex: integer; destinationArray: TBytes; destinationIndex: integer; length: integer); +begin +{$IFDEF CLR} + System.Array.Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length); +{$ELSE} + System.Move(sourceArray[sourceIndex], destinationArray[destinationIndex], length); +{$ENDIF} +end; + +function AllocGCHandle(Obj: {$IFDEF CLR}TObject{$ELSE}pointer{$ENDIF}; + Pinned: boolean = False): IntPtr; +begin +{$IFDEF CLR} + if Pinned then + Result := IntPtr(GCHandle.Alloc(Obj, GCHandleType.Pinned)) + else + Result := IntPtr(GCHandle.Alloc(Obj, GCHandleType.Normal)); +{$ELSE} + Result := Obj; +{$ENDIF} +end; + +function GetGCHandleTarget(Handle: IntPtr): TObject; +begin +{$IFDEF CLR} + if Handle = nil then + Result := nil + else + Result := GCHandle(Handle).Target; +{$ELSE} + Result := Handle; +{$ENDIF} +end; + +function GetAddrOfPinnedObject(Handle: IntPtr): IntPtr; +begin +{$IFDEF CLR} + Result := GCHandle(Handle).AddrOfPinnedObject; +{$ELSE} + Result := Handle; +{$ENDIF} +end; + +procedure FreeGCHandle(Handle: IntPtr); +begin +{$IFDEF CLR} + GCHandle(Handle).Free; +{$ELSE} +{$ENDIF} +end; + +function AllocString(var S: string; Length: integer): IntPtr; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(Length + 1); + {$ELSE} + SetLength(S, Length); + Result := PChar(S); + {$ENDIF} +end; + +procedure FreeString(P: IntPtr); +begin + {$IFDEF CLR} + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +function AllocOrdinal(var Obj: shortint): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(shortint)); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function AllocOrdinal(var Obj: byte): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(byte)); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function AllocOrdinal(var Obj: word): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(word)); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function AllocOrdinal(var Obj: integer): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(integer)); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function AllocOrdinal(var Obj: cardinal): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(integer)); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function AllocOrdinal(var Obj: IntPtr): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(IntPtr)); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function OrdinalToPtr(var Obj: double): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(Int64)); + Marshal.WriteInt64(Result, BitConverter.DoubleToInt64Bits(Obj)); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function OrdinalToPtr(var Obj: byte): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(byte)); + Marshal.WriteByte(Result, Obj); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function OrdinalToPtr(var Obj: smallint): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(smallint)); + Marshal.WriteInt16(Result, Obj); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function OrdinalToPtr(var Obj: integer): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(integer)); + Marshal.WriteInt32(Result, Obj); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function OrdinalToPtr(var Obj: int64): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(int64)); + Marshal.WriteInt64(Result, Obj); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function OrdinalToPtr(var Obj: cardinal): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(cardinal)); + Marshal.WriteInt32(Result, Obj); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function OrdinalToPtr(var Obj: word): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(word)); + Marshal.WriteInt16(Result, Obj); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +function OrdinalToPtr(var Obj: IntPtr): IntPtr; overload; +begin + {$IFDEF CLR} + Result := Marshal.AllocHGlobal(sizeof(integer)); + Marshal.WriteIntPtr(Result, Obj); + {$ELSE} + Result := @Obj; + {$ENDIF} +end; + +procedure PtrToOrdinal(P: IntPtr; var Obj: shortint); overload; +begin + {$IFDEF CLR} + Obj := Marshal.ReadByte(P); + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +procedure PtrToOrdinal(P: IntPtr; var Obj: byte); overload; +begin + {$IFDEF CLR} + Obj := Marshal.ReadByte(P); + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +procedure PtrToOrdinal(P: IntPtr; var Obj: smallint); overload; +begin + {$IFDEF CLR} + Obj := Marshal.ReadInt16(P); + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +procedure PtrToOrdinal(P: IntPtr; var Obj: word); overload; +begin + {$IFDEF CLR} + Obj := Word(Marshal.ReadInt32(P)); + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +procedure PtrToOrdinal(P: IntPtr; var Obj: integer); overload; +begin + {$IFDEF CLR} + Obj := Marshal.ReadInt32(P); + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +procedure PtrToOrdinal(P: IntPtr; var Obj: int64); overload; +begin + {$IFDEF CLR} + Obj := Marshal.ReadInt64(P); + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +procedure PtrToOrdinal(P: IntPtr; var Obj: cardinal); overload; +begin + {$IFDEF CLR} + Obj := Marshal.ReadInt32(P); + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +procedure PtrToOrdinal(P: IntPtr; var Obj: IntPtr); overload; +begin + {$IFDEF CLR} + Obj := Marshal.ReadIntPtr(P); + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +procedure FreeOrdinal(P: IntPtr); +begin + {$IFDEF CLR} + Marshal.FreeHGlobal(P); + {$ELSE} + {$ENDIF} +end; + +{$IFDEF CLR} +procedure StrCopy(Dest: IntPtr; const Source: IntPtr); +begin + Win32Check(lstrcpy(Dest, Source) <> nil); +end; + +procedure StrLCopy(Dest: IntPtr; const Source: IntPtr; MaxLen{Chars}: Cardinal); +begin + Win32Check(lstrcpyn(Dest, Source, Integer(MaxLen + 1)) <> nil); +end; + +function StrComp(const Str1: IntPtr; const Str2: IntPtr): integer; +begin + Result := lstrcmp(Str1, Str2); +end; + +function StrLen(const Str: IntPtr): Cardinal; +begin + Result := lstrlen(Str); +end; + +function StrLenW(const Str: IntPtr): Cardinal; +var + s: WideString; +begin + s := Marshal.PtrToStringUni(Str); + Result := s.Length; +end; + +procedure StrTrim(const Str: IntPtr; Len: integer = -1); +var + i: integer; + v: byte; +begin + if Len = - 1 then // Detect length + Len := StrLen(Str); + + i := Integer(Str) + Len - 1; + + while True do begin + v := Marshal.ReadByte(IntPtr(i)); + if ((v <> 32 {Byte(' ')}) and (v <> 0{Byte(#0)})) or (i < Integer(Str)) then + Exit; + Marshal.WriteByte(IntPtr(i), Byte(#0)); + Dec(i); + end; +end; + +procedure StrTrimW(const Str: IntPtr; Len: integer = -1); +var + i: integer; + v: smallint; +begin + if Len = - 1 then // Detect length + Len := StrLenW(Str); + + i := Integer(Str) + (Len - 1) shl 1; + + while True do begin + v := Marshal.ReadInt16(IntPtr(i)); + if ((v <> 32 {SmallInt(' ')}) and (v <> 0{SmallInt(#0)})) or (i < Integer(Str)) then + Exit; + Marshal.WriteInt16(IntPtr(i), SmallInt(#0)); + Dec(i); + Dec(i); + end; +end; + +{$ENDIF} + +function StrCopyW(Dest: IntPtr; const Source: IntPtr): IntPtr; +{$IFDEF CLR} +var + Buf: smallint; + i: integer; +begin + i := 0; + repeat + Buf := Marshal.ReadInt16(Source, i); + Marshal.WriteInt16(Dest, i, Buf); + Inc(i, 2); + until Buf = 0; +{$ELSE} +asm + PUSH EDI + PUSH ESI + MOV ESI,EAX + MOV EDI,EDX + MOV ECX,0FFFFFFFFH + XOR AX,AX + REPNE SCASW + NOT ECX + SHL ECX, 1 // Size := Len * sizeof(WideChar) + MOV EDI,ESI + MOV ESI,EDX + MOV EDX,ECX + MOV EAX,EDI + SHR ECX,2 + REP MOVSD + MOV ECX,EDX + AND ECX,3 + REP MOVSB + POP ESI + POP EDI +{$ENDIF} +end; + +procedure StrLCopyW(Dest: IntPtr; const Source: IntPtr; MaxLen{WideChars}: Cardinal); +{$IFDEF CLR} +var + Buf: smallint; + i: cardinal; +begin + i := 0; + Buf := 0; + while i < MaxLen * 2 do begin + Buf := Marshal.ReadInt16(Source, i); + Marshal.WriteInt16(Dest, i, Buf); + if Buf = 0 then + Break; + Inc(i, 2); + end; + if Buf <> 0 then + Marshal.WriteInt16(Dest, i, 0); +{$ELSE} +var + pwc: PWideChar; +begin + pwc := Source; + while (pwc^ <> #0) and (pwc < PWideChar(Source) + MaxLen) do begin + PWideChar(Dest)^ := pwc^; + Inc(PWideChar(Dest)); + Inc(pwc); + end; + PWideChar(Dest)^ := #0; +{$ENDIF} +end; + +{$IFNDEF CLR} +function StrLenW(const Str: IntPtr): Cardinal; assembler; +asm + MOV EDX,EDI + MOV EDI,EAX + MOV ECX,0FFFFFFFFH + XOR AX,AX + REPNE SCASW + MOV EAX,0FFFFFFFEH + SUB EAX,ECX + MOV EDI,EDX +end; + +procedure StrTrim(const Str: IntPtr; Len: integer = -1); +var + pc: PChar; +begin + if Len = - 1 then // Detect length + Len := StrLen(Str); + + pc := PChar(Str) + Len - 1; + + while ((pc^ = ' ') or (pc^ = #0)) and (pc >= Str) do begin + pc^ := #0; + Dec(pc); + end; +end; + +procedure StrTrimW(const Str: IntPtr; Len: integer = -1); +var + pwc: PWideChar; +begin + if Len = - 1 then // Detect length + Len := StrLenW(Str); + + pwc := PWideChar(Str) + Len - 1; + + while ((pwc^ = ' ') or (pwc^ = #0)) and (pwc >= Str) do begin + PWideChar(pwc)^ := #0; + Dec(pwc); + end; +end; +{$ENDIF} + +function AnsiStrLCompWS(const S1, S2: WideString; MaxLen: Cardinal): Integer; +begin +{$IFDEF MSWINDOWS} + Assert(not IsWin9x, 'Unicode support on Win9x'); +{$IFDEF CLR} + Result := CompareStringW(LOCALE_USER_DEFAULT, SORT_STRINGSORT, S1, MaxLen, S2, MaxLen) - 2; +{$ELSE} + Result := CompareStringW(LOCALE_USER_DEFAULT, SORT_STRINGSORT, PWideChar(S1), MaxLen, + PWideChar(S2), MaxLen) - 2; +{$ENDIF} +{$ELSE} + Result := 0; + Assert(False); +{$ENDIF} +end; + +function AnsiStrLICompWS(const S1, S2: WideString; MaxLen: Cardinal): Integer; +begin +{$IFDEF MSWINDOWS} + Assert(not IsWin9x, 'Unicode support on Win9x'); +{$IFDEF CLR} + Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE + SORT_STRINGSORT, + S1, MaxLen, S2, MaxLen) - 2; +{$ELSE} + Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE + SORT_STRINGSORT, + PWideChar(S1), MaxLen, PWideChar(S2), MaxLen) - 2; +{$ENDIF} +{$ELSE} + Result := 0; + Assert(False); +{$ENDIF} +end; + +function AnsiStrCompWS(const S1, S2: WideString): Integer; +begin +{$IFDEF MSWINDOWS} + Assert(not IsWin9x, 'Unicode support on Win9x'); +{$IFDEF CLR} + Result := CompareStringW(LOCALE_USER_DEFAULT, SORT_STRINGSORT, S1, -1, S2, -1) - 2; +{$ELSE} + Result := CompareStringW(LOCALE_USER_DEFAULT, SORT_STRINGSORT, PWideChar(S1), -1, + PWideChar(S2), -1) - 2; +{$ENDIF} +{$ELSE} + Result := 0; + Assert(False); +{$ENDIF} +end; + +function AnsiStrICompWS(const S1, S2: WideString): Integer; +begin +{$IFDEF MSWINDOWS} + Assert(not IsWin9x, 'Unicode support on Win9x'); +{$IFDEF CLR} + Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE + SORT_STRINGSORT, S1, -1, + S2, -1) - 2; +{$ELSE} + Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE + SORT_STRINGSORT, PWideChar(S1), + -1, PWideChar(S2), -1) - 2; +{$ENDIF} +{$ELSE} + Result := 0; + Assert(False); +{$ENDIF} +end; + +function IsClass(Obj: TObject; AClass: TClass): boolean; + + function IsClassByName(Obj: TObject; AClass: TClass): boolean; + var + ParentClass: TClass; + begin + Result := False; + ParentClass := Obj.ClassType; + while ParentClass <> nil do begin + Result := ParentClass.ClassName = AClass.ClassName; + if not Result then + ParentClass := ParentClass.ClassParent + else + Break; + end; + end; + +begin + if IsLibrary then + Result := IsClassByName(Obj, AClass) + else + Result := Obj is AClass; +end; + +{$IFDEF CLR} +function AnsiUpperCase(const S: string): string; +begin + if S <> nil then + Result := System.String(S).ToUpper + else + Result := ''; +end; + +function AnsiCompareText(const S1, S2: string): integer; +begin + Result := System.String.Compare(S1, S2, True); +end; + +function AnsiCompareStr(const S1, S2: string): integer; +begin + Result := System.String.Compare(S1, S2, False); +end; + +function AnsiSameText(const S1, S2: string): Boolean; +begin + Result := System.String.Compare(S1, S2, True) = 0; +end; + +{$ELSE} + +function AnsiStrCompS(S1, S2: PChar): Integer; // SORT_STRINGSORT +begin +{$IFDEF SORT_STRINGSORT} + Result := CompareString(LOCALE_USER_DEFAULT, SORT_STRINGSORT, S1, -1, S2, -1) - 2; +{$ELSE} + Result := AnsiStrComp(S1, S2); +{$ENDIF} +end; + +function AnsiStrICompS(S1, S2: PChar): Integer; // SORT_STRINGSORT +begin +{$IFDEF SORT_STRINGSORT} + Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE + SORT_STRINGSORT, S1, -1, + S2, -1) - 2; +{$ELSE} + Result := AnsiStrIComp(S1, S2); +{$ENDIF} +end; + +{$ENDIF} + +function AnsiCompareTextS(const S1, S2: string): integer; // SORT_STRINGSORT +begin +{$IFDEF SORT_STRINGSORT} + Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE + SORT_STRINGSORT, PChar(S1), + Length(S1), PChar(S2), Length(S2)) - 2; +{$ELSE} + Result := AnsiCompareText(S1, S2); +{$ENDIF} +end; + +function AnsiCompareStrS(const S1, S2: string): integer; // SORT_STRINGSORT +begin +{$IFDEF SORT_STRINGSORT} + Result := CompareString(LOCALE_USER_DEFAULT, SORT_STRINGSORT, PChar(S1), Length(S1), + PChar(S2), Length(S2)) - 2; +{$ELSE} + Result := AnsiCompareStr(S1, S2); +{$ENDIF} +end; + +// Convert Utf8 buffer to WideString buffer with or without null terminator. +// Nearly copied from System.Utf8ToUnicode +function Utf8ToWs(const Dest: TValueArr; DestIdx: Cardinal; MaxDestBytes{w/wo #0}: Cardinal; + const Source: TValueArr; SourceIdx, SourceBytes: Cardinal; + const AddNull: boolean): Cardinal{bytes w/wo #0}; +var + i: Cardinal; + c: Byte; + wc: Cardinal; +begin + Assert(Source <> nil, 'Utf8ToWs: Source is nil'); + Assert(Dest <> nil, 'Utf8ToWs: Destination is nil'); +{$IFDEF CLR} + Assert(Integer(DestIdx + MaxDestBytes) <= Length(Dest), 'Utf8ToWs: DestIdx = ' + IntToStr(DestIdx) + ', MaxDestBytes = ' + IntToStr(MaxDestBytes) + ', Length(Dest) = ' + IntToStr(Length(Dest))); + Assert(Integer(SourceIdx + SourceBytes) <= Length(Source), 'Utf8ToWs: SourceIdx = ' + IntToStr(SourceIdx) + ', SourceBytes = ' + IntToStr(SourceBytes) + ', Length(Source) = ' + IntToStr(Length(Source))); +{$ENDIF} + Result := 0; + i := SourceIdx; + while i < SourceIdx + SourceBytes do + begin + wc := Cardinal(Source[Integer(i)]); + if wc = 0 then //zero terminator + break; + Inc(i); + if (wc and $80) <> 0 then + begin + Assert(i < SourceIdx + SourceBytes, 'Utf8ToWs: Incomplete multibyte char'); + wc := wc and $3F; + if (wc and $20) <> 0 then + begin + c := Byte(Source[Integer(i)]); + Inc(i); + Assert((c and $C0) = $80, 'Utf8ToWs: Malformed trail byte or out of range char'); + Assert(i < SourceIdx + SourceBytes, 'Utf8ToWs: Incomplete multibyte char'); + wc := (wc shl 6) or (c and $3F); + end; + c := Byte(Source[Integer(i)]); + Inc(i); + Assert((c and $C0) = $80, 'Utf8ToWs: Malformed trail byte'); + wc := (wc shl 6) or (c and $3F); + end; + + if not (Result + 1 < MaxDestBytes) then + Break; + {$IFDEF CLR} + Dest[Integer(Result + DestIdx)] := Byte(wc); + Dest[Integer(Result + DestIdx + 1)] := Byte(wc shr 8); + {$ELSE} + Cardinal(Pointer(Cardinal(Dest) + DestIdx + Result)^) := wc; + {$ENDIF} + Inc(Result, SizeOf(WideChar)); + end; + + if AddNull and (MaxDestBytes > 0) then begin + if Result >= MaxDestBytes then + Result := MaxDestBytes - SizeOf(WideChar); + {$IFDEF CLR} + Dest[Integer(Result + DestIdx)] := 0; + Dest[Integer(Result + DestIdx + 1)] := 0; + {$ELSE} + Marshal.WriteInt16(Dest, Integer(DestIdx + Result), 0); + {$ENDIF} + Inc(Result, SizeOf(WideChar)); + end; +end; + +{$IFDEF CLR} +{ TDAList } +constructor TDAList.Create; +begin + inherited Create; + + SetCapacity(10); +end; + +destructor TDAList.Destroy; +begin + Clear; + + inherited; +end; + +procedure TDAList.Clear; +begin + FCount := 0; + SetCapacity(0); +end; + +procedure TDAList.Delete(Index: Integer); +begin + if (Index < 0) or (Index >= FCount) then + TList.Error({$IFNDEF CLR}@{$ENDIF}SListIndexError, Index); + Dec(FCount); + if Index < FCount then + {$IFDEF CLR} + System.Array.Copy(FList, Index + 1, FList, Index, FCount - Index); + {$ELSE}//TODO + System.Move(FList[Index + 1], FList[Index], + (FCount - Index) * SizeOf(Pointer)); + {$ENDIF} +end; + +function TDAList.IndexOf(Item: TObject): Integer; +begin + Result := 0; + while (Result < FCount) and (FList[Result] <> Item) do + Inc(Result); + if Result = FCount then + Result := -1; +end; + +function TDAList.Last: TObject; +begin + Result := Get(FCount - 1); +end; + +function TDAList.Remove(Item: TObject): Integer; +begin + Result := IndexOf(Item); + if Result >= 0 then + Delete(Result); +end; + +procedure QuickSort(var SortList: array of TObject; L, R: Integer; + SCompare: TListSortCompare); +var + I, J: Integer; + P, T: TObject; +begin + repeat + I := L; + J := R; + P := SortList[(L + R) shr 1]; + repeat + while SCompare(SortList[I], P) < 0 do + Inc(I); + while SCompare(SortList[J], P) > 0 do + Dec(J); + if I <= J then + begin + T := SortList[I]; + SortList[I] := SortList[J]; + SortList[J] := T; + Inc(I); + Dec(J); + end; + until I > J; + if L < J then + QuickSort(SortList, L, J, SCompare); + L := I; + until I >= R; +end; + +procedure TDAList.Sort(Compare: TListSortCompare); +begin + if (FList <> nil) and (Count > 0) then + QuickSort(FList, 0, Count - 1, Compare); +end; + +function TDAList.Add(Item: TObject): Integer; +begin + Result := FCount; + if Result = FCapacity then + Grow; + FList[Result] := Item; + Inc(FCount); +end; + +function TDAList.Get(Index: Integer): TObject; +begin + if (Index < 0) or (Index >= FCount) then + TList.Error({$IFNDEF CLR}@{$ENDIF}SListIndexError, Index); + Result := FList[Index]; +end; + +procedure TDAList.Grow; +var + Delta: Integer; +begin + if FCapacity > 64 then + Delta := FCapacity div 4 + else + if FCapacity > 8 then + Delta := 16 + else + Delta := 4; + SetCapacity(FCapacity + Delta); +end; + +procedure TDAList.Put(Index: Integer; Item: TObject); +begin + if (Index < 0) or (Index >= FCount) then + TList.Error({$IFNDEF CLR}@{$ENDIF}SListIndexError, Index); + FList[Index] := Item; +end; + +procedure TDAList.SetCapacity(NewCapacity: Integer); +begin + if (NewCapacity < FCount) or (NewCapacity > MaxListSize) then + TList.Error({$IFNDEF CLR}@{$ENDIF}SListCapacityError, NewCapacity); + if NewCapacity <> FCapacity then + begin + SetLength(FList, NewCapacity); + FCapacity := NewCapacity; + end; +end; +{$ENDIF} + +{$IFDEF CLR} +const + ole32 = 'ole32.dll'; + oleaut32 = 'oleaut32.dll'; + +// Copied from ActiveX.pas (d7) +const + STGM_READ = $00000000; + +[DllImport(oleaut32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'VariantClear')] +function VariantClear(Value: POleVariant): HResult; external; + +procedure OleVarClear(pValue: POleVariant); +begin + SetOleVariant(pValue, Unassigned); +end; + +function GetOleVariant(pValue: POleVariant): OleVariant; +begin + Result := OleVariant(Marshal.GetObjectForNativeVariant(pValue)); +// Result := OleVariant(Marshal.PtrToStructure(pValue, TypeOf(OleVariant))); +end; + +procedure SetOleVariant(pValue: POleVariant; const Value: OleVariant); +begin + Marshal.GetNativeVariantForObject(TObject(Value), pValue); +end; + +{$ELSE} +procedure OleVarClear(pValue: POleVariant); +begin + pValue^ := Unassigned; +end; + +function GetOleVariant(pValue: POleVariant): OleVariant; +begin + Result := pValue^; +end; + +procedure SetOleVariant(pValue: POleVariant; const Value: OleVariant); +begin + pValue^ := Value; +end; + +{$ENDIF} + + +{$IFNDEF VER6P} +function BoolToStr(const Value: boolean; UseBoolStrs: Boolean = False): string; +const + cSimpleBoolStrs: array [boolean] of String = ('0', '-1'); +begin + if UseBoolStrs then + begin + if Value then + Result := 'True' + else + Result := 'False'; + end + else + Result := cSimpleBoolStrs[Value]; +end; + +function TryStrToBool(const S: string; out Value: Boolean): Boolean; +begin + Result := True; + if SameText(s, 'True') or SameText(s, 'Yes') or SameText(s, '1') then + Value := True + else + if SameText(s, 'False') or SameText(s, 'No') or SameText(s, '0') then + Value := False + else + Result := False; +end; + +function StrToBool(const S: string): Boolean; +begin + if not TryStrToBool(S, Result) then + raise EConvertError.Create('InvalidBoolean - ' + S); +end; + +type + PWordBool = ^WordBool; + +procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, + AHour, AMinute, ASecond, AMilliSecond: Word); +begin + DecodeDate(AValue, AYear, AMonth, ADay); + DecodeTime(AValue, AHour, AMinute, ASecond, AMilliSecond); +end; + +function WideUpperCase(const S: WideString): WideString; +var + Len: Integer; +begin + Len := Length(S); + SetString(Result, PWideChar(S), Len); + if Len > 0 then CharUpperBuffW(Pointer(Result), Len); +end; + +function VarToWideStr(const V: Variant): WideString; +begin + if not VarIsNull(V) then + Result := V + else + Result := '';; +end; +{$ENDIF} + +{$IFDEF VER6} +procedure ConvertErrorFmt(ResString: PResStringRec; const Args: array of const); local; +begin + raise EConvertError.CreateResFmt(ResString, Args); +end; + +function StrToBool(const S: string): Boolean; +begin + if not TryStrToBool(S, Result) then + ConvertErrorFmt(@SInvalidBoolean, [S]); +end; + +procedure VerifyBoolStrArray; +begin + if Length(TrueBoolStrs) = 0 then + begin + SetLength(TrueBoolStrs, 1); + TrueBoolStrs[0] := DefaultTrueBoolStr; + end; + if Length(FalseBoolStrs) = 0 then + begin + SetLength(FalseBoolStrs, 1); + FalseBoolStrs[0] := DefaultFalseBoolStr; + end; +end; + +function TryStrToBool(const S: string; out Value: Boolean): Boolean; + function CompareWith(const aArray: array of string): Boolean; + var + I: Integer; + begin + Result := False; + for I := Low(aArray) to High(aArray) do + if AnsiSameText(S, aArray[I]) then + begin + Result := True; + Break; + end; + end; +var + LResult: Extended; +begin + Result := TryStrToFloat(S, LResult); + if Result then + Value := LResult <> 0 + else + begin + VerifyBoolStrArray; + Result := CompareWith(TrueBoolStrs); + if Result then + Value := True + else + begin + Result := CompareWith(FalseBoolStrs); + if Result then + Value := False; + end; + end; +end; +{$ENDIF} + +{$IFNDEF CLR} +function TryEncodeDate(Year, Month, Day: Word; var Date: TDateTime): Boolean; +var + I: Integer; + DayTable: PDayTable; +begin + Result := False; + DayTable := @MonthDays[IsLeapYear(Year)]; + if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and + (Day >= 1) and (Day <= DayTable^[Month]) then + begin + for I := 1 to Month - 1 do Inc(Day, DayTable^[I]); + I := Year - 1; + Date := I * 365 + I div 4 - I div 100 + I div 400 + Day - DateDelta; + Result := True; + end; +end; + +function TryEncodeTime(Hour, Min, Sec, MSec: Word; var Time: TDateTime): Boolean; +begin + Result := False; + if (Hour < 24) and (Min < 60) and (Sec < 60) and (MSec < 1000) then + begin + Time := (Hour * 3600000 + Min * 60000 + Sec * 1000 + MSec) / MSecsPerDay; + Result := True; + end; +end; + +function TryEncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, + AMilliSecond: Word; out AValue: TDateTime): Boolean; +var + LTime: TDateTime; +begin + Result := TryEncodeDate(AYear, AMonth, ADay, AValue); + if Result then + begin + Result := TryEncodeTime(AHour, AMinute, ASecond, AMilliSecond, LTime); + if Result then + if AValue > 0 then + AValue := AValue + LTime + else + AValue := AValue - LTime; + end; +end; + +function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, + AMilliSecond: Word): TDateTime; +begin + if not TryEncodeDateTime(AYear, AMonth, ADay, + AHour, AMinute, ASecond, AMilliSecond, Result) then + raise EConvertError.Create(SDateEncodeError); +end; +{$ENDIF} + +function Reverse4(Value: cardinal): cardinal; +begin + Result := Cardinal((byte(Value) shl 24) or (byte(Value shr 8) shl 16) + or (byte(Value shr 16) shl 8) or byte(Value shr 24)); +end; + +{$IFNDEF CLR} +procedure Reverse8(pValue: IntPtr); +var + FirstByte: PByte; + LastByte: PByte; + TmpValue: Byte; + i: integer; +begin + FirstByte := PByte(pValue); + LastByte := FirstByte; + Inc(LastByte, SizeOf(Int64) - 1); + for i := 0 to 3 do begin + TmpValue := LastByte^; + LastByte^ := FirstByte^; + FirstByte^ := TmpValue; + Inc(FirstByte); + Dec(LastByte); + end; +end; +{$ENDIF} + +{$IFDEF VER8} +function UTF8Encode(const WS: WideString): UTF8String; +begin + Result := UTF8String(System.Array(nil)); + if Assigned(WS) then + Result := System.Text.Encoding.UTF8.GetBytes(WS); +end; + +function UTF8Decode(const S: UTF8String): WideString; +begin + Result := WideString(System.String(nil)); + if Assigned(S) then + Result := System.Text.Encoding.UTF8.GetString(TBytes(S), 0, High(TBytes(S)) + 1); +end; +{$ENDIF} + +{$IFDEF HAVE_COMPRESS} +procedure CheckZLib; +begin + if not Assigned(CompressProc) then + raise Exception.Create(SCompressorNotLinked); + if not Assigned(UncompressProc) then + raise Exception.Create(SUncompressorNotLinked); +end; + +procedure DoCompress(dest: IntPtr; destLen: IntPtr; const source: IntPtr; sourceLen: longint); +begin + Assert(Assigned(CompressProc), SCompressorNotLinked); + CompressProc(dest, destLen, source, sourceLen) +end; + +procedure DoUncompress(dest: IntPtr; destlen: IntPtr; source: IntPtr; sourceLne: longint); +begin + Assert(Assigned(UncompressProc), SUncompressorNotLinked); + UncompressProc(dest, destLen, source, sourceLne) +end; + +{$IFDEF HAVE_COMPRESS_INTERNAL} +function CCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise ECompressionError.Create(sError); +end; + +function DCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise EDecompressionError.Create(sError); +end; + +function compress(dest: IntPtr; destLen: IntPtr; const source: IntPtr; sourceLen: longint): longint; +var + strm: TZStreamRec; +begin + FillChar(@strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + strm.next_in := source; + strm.avail_in := sourceLen; + strm.next_out := dest; + strm.avail_out := Integer(destLen^); + CCheck(deflateInit_(strm, Z_DEFAULT_COMPRESSION{Z_BEST_COMPRESSION}, zlib_version, sizeof(strm))); + try + Result := CCheck(deflate(strm, Z_FINISH)); + if Result <> Z_STREAM_END then + raise EZlibError.CreateRes(@sTargetBufferTooSmall); + finally + CCheck(deflateEnd(strm)); + end; + Integer(destLen^) := strm.total_out; +end; + +function uncompress(dest: IntPtr; destlen: IntPtr; source: IntPtr; sourceLne: longint): longint; +var + strm: TZStreamRec; +begin + FillChar(@strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + strm.next_in := source; + strm.avail_in := sourcelne; + strm.next_out := dest; + strm.avail_out := Integer(destlen^); + DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); + try + Result := DCheck(inflate(strm, Z_FINISH)); + if Result <> Z_STREAM_END then + raise EZlibError.CreateRes(@sTargetBufferTooSmall); + finally + DCheck(inflateEnd(strm)); + end; +end; +{$ENDIF} +{$ENDIF} + +{$IFDEF MSWINDOWS} +var + lpVersionInformation: TOSVersionInfo; + +initialization + lpVersionInformation.dwOSVersionInfoSize := sizeof(lpVersionInformation); +{$IFDEF VER6P} + {$WARN SYMBOL_PLATFORM OFF} +{$ENDIF} +{$IFDEF CLR} + IsWin9x := False; +{$ELSE} + Win32Check(GetVersionEx(lpVersionInformation)); + IsWin9x := lpVersionInformation.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS; +{$ENDIF} +{$ENDIF} + +{$IFDEF HAVE_COMPRESS_INTERNAL} + CompressProc := compress; + UncompressProc := uncompress; +{$ENDIF} +end. diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRAccess.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRAccess.pas new file mode 100644 index 0000000..a957602 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRAccess.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.CRAccess; + +{$I ..\CRAccess.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRBatchMove.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRBatchMove.pas new file mode 100644 index 0000000..4f77d4f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRBatchMove.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.CRBatchMove; + +{$I ..\CRBatchMove.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRConnectionPool.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRConnectionPool.pas new file mode 100644 index 0000000..ff3a159 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRConnectionPool.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.CRConnectionPool; + +{$I ..\CRConnectionPool.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRParser.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRParser.pas new file mode 100644 index 0000000..f108889 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.CRParser.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.CRParser; + +{$I ..\CRParser.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DAConsts.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DAConsts.pas new file mode 100644 index 0000000..818aaa3 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DAConsts.pas @@ -0,0 +1,3 @@ +unit CoreLab.Dac.DAConsts; + +{$I ..\DAConsts.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DADump.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DADump.pas new file mode 100644 index 0000000..b7e2c55 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DADump.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.DADump; + +{$I ..\DADump.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DALoader.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DALoader.pas new file mode 100644 index 0000000..4c33a2d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DALoader.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.DALoader; + +{$I ..\DALoader.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DASQLMonitor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DASQLMonitor.pas new file mode 100644 index 0000000..86a9ac1 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DASQLMonitor.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.DASQLMonitor; + +{$I ..\DASQLMonitor.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DAScript.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DAScript.pas new file mode 100644 index 0000000..c8cb703 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DAScript.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.DAScript; + +{$I ..\DAScript.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBAccess.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBAccess.pas new file mode 100644 index 0000000..6e915b0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBAccess.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.DBAccess; + +{$I ..\DBAccess.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBMonitorClient.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBMonitorClient.pas new file mode 100644 index 0000000..d24dba6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBMonitorClient.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.DBMonitorClient; + +{$I ..\DBMonitorClient.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBMonitorIntf.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBMonitorIntf.pas new file mode 100644 index 0000000..3c0e89a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DBMonitorIntf.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.DBMonitorIntf; + +{$I ..\DBMonitorIntf.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DacVcl.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DacVcl.pas new file mode 100644 index 0000000..92cea89 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DacVcl.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.DacVcl; + +{$I ..\DacVcl.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DataAdapter.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DataAdapter.pas new file mode 100644 index 0000000..913878a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.DataAdapter.pas @@ -0,0 +1,339 @@ +unit CoreLab.Dac.DataAdapter; + +interface + +uses Classes, DB, System.Data, Variants; + +type + TDataTableArr = array of DataTable; + IDataParameterArr = array of IDataParameter; + + DADataAdapter = class (TComponent) + FDataSet: TDataSet; + FData: System.Data.DataSet; + + procedure CheckTDataSet; + + protected + function CanLocateField(Field: TField): boolean; virtual; + function GetItemType(Field: TField): System.Type; virtual; + function GetItemValue(Field: TField): TObject; virtual; + procedure SetItemValue(Field: TField; Value: TObject); virtual; + function ItemToVariant(Field: TField; Value: TObject): Variant; virtual; + + public + function Fill(Data: DataSet; tableName: string): integer; + function Update(Data: DataSet; tableName: string): integer; + + property DataSet: TDataSet read FDataSet write FDataSet; + end; + +implementation + +uses MemUtils, SysUtils; + +procedure DADataAdapter.CheckTDataSet; +begin + if FDataSet = nil then + raise Exception.Create('DADataAdapter.DataSet is not defined!'); +end; + +function DADataAdapter.CanLocateField(Field: TField): boolean; +begin + case Field.DataType of + {ftBoolean,} + ftString, ftFixedChar, ftWideString, + ftAutoInc, ftSmallint, ftWord, ftInteger, ftLargeint, + ftFloat, ftCurrency, + ftDateTime, ftDate, ftTime: + Result := True; + else + case Field.DataType of + ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}: + Result := False; + else + Result := True; + end; + end +end; + +function DADataAdapter.GetItemType(Field: TField): System.Type; +begin + case Field.DataType of + ftBoolean: Result := typeof(Boolean); + ftString, ftFixedChar, ftWideString, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}: Result := typeof(String); + ftAutoInc, ftSmallint, ftWord, ftInteger, ftLargeint: Result := typeof(Longint); + ftFloat, ftCurrency: Result := typeof(Double); + ftDateTime, ftDate, ftTime: Result := typeof(System.DateTime); + ftBlob: Result := typeof(TBytes); + ftBytes, ftVarBytes: Result := typeof(TBytes); + ftBCD: Result := typeof(Borland.Delphi.System.Currency); + else + Result := typeof(Variant);//ftADT, ftArray, ftReference, ftDataSet, ftVariant, + end; +end; + +function DADataAdapter.GetItemValue(Field: TField): TObject; +var + MS: TMemoryStream; + i: integer; + Buf: TBytes; +begin + if Field.IsNull then begin + Result := Convert.DBNull; + Exit; + end; + case Field.DataType of + ftDateTime, ftDate, ftTime: + Result := System.DateTime(Field.Value); + ftBlob: begin; + MS := TMemoryStream.Create; + try + TBlobField(Field).SaveToStream(MS); + SetLength(Buf, MS.Size); + for i := 0 to MS.Size - 1 do begin + Buf[i] := MS.Memory[i]; + end; + finally + MS.Free; + end; + Result := TObject(Buf); + end; + else + Result := Field.Value; + end; +end; + +procedure DADataAdapter.SetItemValue(Field: TField; Value: TObject); +var + MS: TMemoryStream; + i: integer; +begin + if Value = Convert.DBNull then + Field.Clear + else + case Field.DataType of + ftDateTime, ftDate, ftTime: + Field.Value := Variant(TDateTime(System.DateTime(Value))); + ftBlob: begin; + MS := TMemoryStream.Create; + try + for i := 0 to Length(TBytes(Value)) - 1 do + MS.Write(TBytes(Value)[i]); + TBlobField(Field).LoadFromStream(MS); + finally + MS.Free; + end; + end; + else + Field.Value := Variant(Value); + end; +end; + +function DADataAdapter.ItemToVariant(Field: TField; Value: TObject): Variant; +begin + if VarIsNull(Variant(Value)) then begin + Result := Variant(Convert.DBNull); + Exit; + end; + case Field.DataType of + ftDateTime, ftDate, ftTime: + Result := Variant(TDateTime(System.DateTime(Value))); + else + Result := Variant(Value); + end; +end; + +function DADataAdapter.Fill(Data: DataSet; tableName: string): integer; +var + dataTable: System.Data.DataTable; + dataRow: System.Data.DataRow; + dataColumn: System.Data.DataColumn; + Ind, i: integer; + OldActive: boolean; +begin + CheckTDataSet; + Result := 0; + Ind := Data.Tables.IndexOf(tableName); + if Ind < 0 then + dataTable := Data.Tables.Add(tableName) + else + dataTable := Data.Tables.Item[tableName]; + OldActive := FDataSet.Active; + if not FDataSet.Active then + FDataSet.Open; + try + for i := 0 to FDataSet.Fields.Count - 1 do begin + if not FDataSet.Fields[i].Visible or + (dataTable.Columns.IndexOf(FDataSet.Fields[i].FieldName) >= 0) + then + continue; + dataColumn := dataTable.Columns.Add(FDataSet.Fields[i].FieldName, GetItemType(FDataSet.Fields[i])); + dataColumn.ReadOnly := not FDataSet.Fields[i].CanModify; + end; + + FDataSet.FindFirst; + while not FDataSet.EOF do begin + dataRow := dataTable.NewRow; + for i := 0 to FDataSet.Fields.Count - 1 do + if FDataSet.Fields[i].Visible then + dataRow.set_Item(FDataSet.Fields[i].FieldName, GetItemValue(FDataSet.Fields[i])); + dataTable.Rows.Add(dataRow); + FDataSet.Next; + Inc(Result); + end; + dataTable.AcceptChanges; + finally + FDataSet.Active := OldActive + end; +end; + +function DADataAdapter.Update(Data: DataSet; tableName: string): integer; +var + Ind, i: integer; + dataTable: System.Data.DataTable; + dataRow: System.Data.DataRow; + OldActive: boolean; + + function CompareValues(Obj1, Obj2: TObject): boolean; + var + V1, V2: Variant; + i: integer; + begin + V1 := Variant(Obj1); + V2 := Variant(Obj2); + if VarIsArray(V1) and VarIsArray(V2) then begin + if (VarArrayLowBound(V1, 1) <> VarArrayLowBound(V2, 1)) or + (VarArrayHighBound(V1, 1) <> VarArrayHighBound(V2, 1)) + then begin + Result := False; + Exit; + end; + for i := VarArrayLowBound(V1, 1) to VarArrayHighBound(V1, 1) do begin + if V1[i] <> V2[i] then begin + Result := False; + Exit; + end; + end; + Result := True; + end + else + Result := VarEqual(V1, V2); + end; + + procedure EditRecord; + var + j: integer; + dataColumn: System.Data.DataColumn; + Field: TField; + begin + for j := 0 to dataTable.Columns.Count - 1 do begin + dataColumn := dataTable.Columns.Item[j]; + Field := FDataSet.FieldByName(dataColumn.ColumnName); + if + Field.CanModify and + ((dataRow.RowState = DataRowState.Added) or + not CompareValues(dataRow.get_Item(dataColumn.ColumnName), dataRow.get_Item(dataColumn.ColumnName, DataRowVersion.Original))) + then begin + SetItemValue(Field, dataRow.get_Item(dataColumn.ColumnName)); + end; + end; + end; + + procedure LocateRecord; + var + j: integer; + KeyFields, Keys, St: string; + KeyValues, FinalKeyValues: Variant; + KeyCount: integer; + dataColumn: System.Data.DataColumn; + + procedure AddKeyValue(ColumnName: string); + var + Field: TField; + begin + Field := FDataSet.FieldByName(ColumnName); + if CanLocateField(Field) then begin + if KeyFields <> '' then + KeyFields := KeyFields + ';'; + KeyFields := KeyFields + ColumnName; + KeyValues[KeyCount] := ItemToVariant(Field, dataRow.get_Item(ColumnName, DataRowVersion.Original)); + Inc(KeyCount); + end; + end; + + begin + Keys := Trim(IProviderSupport(FDataSet).PSGetKeyFields); + KeyFields := ''; + KeyCount := 0; + KeyValues := VarArrayCreate([0, dataTable.Columns.Count - 1], varObject); + if Keys <> '' then begin + j := 1; + while True do begin + St := ExtractFieldName(Keys, j); + if St = '' then + break; + AddKeyValue(St); + end; + end + else begin + for j := 0 to dataTable.Columns.Count - 1 do begin + dataColumn := dataTable.Columns.Item[j]; + AddKeyValue(dataColumn.ColumnName); + end; + end; + if KeyCount = 1 then + FinalKeyValues := KeyValues[0] + else + if KeyCount > 1 then + FinalKeyValues := KeyValues + else + raise Exception.Create('Cannot locate record'); + if not FDataSet.Locate(KeyFields, FinalKeyValues, []) then + raise Exception.Create('Cannot locate record'); + end; + +begin + Result := 0; + Ind := Data.Tables.IndexOf(tableName); + if Ind < 0 then + raise Exception.Create('Has no table'); + dataTable := Data.Tables.Item[tableName]; + OldActive := FDataSet.Active; + try + for i := 0 to dataTable.Rows.Count - 1 do begin + dataRow := dataTable.Rows.Item[i]; + case dataRow.RowState of + DataRowState.Added: begin + if not FDataSet.Active then + FDataSet.Open; + FDataSet.Append; + EditRecord; + FDataSet.Post; + Inc(Result); + end; + DataRowState.Deleted: begin + if not FDataSet.Active then + FDataSet.Open; + LocateRecord; + FDataSet.Delete; + Inc(Result); + end; + DataRowState.Modified: begin + if not FDataSet.Active then + FDataSet.Open; + LocateRecord; + FDataSet.Edit; + EditRecord; + FDataSet.Post; + Inc(Result); + end; + end; + end; + dataTable.AcceptChanges; + finally + FDataSet.Active := OldActive; + end; +end; + +end. diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRColFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRColFrame.pas new file mode 100644 index 0000000..b155810 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRColFrame.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.CRColFrame; + +{$I ..\Design\CRColFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRDataEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRDataEditor.pas new file mode 100644 index 0000000..8910e42 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRDataEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.CRDataEditor; + +{$I ..\Design\CRDataEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CREditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CREditor.pas new file mode 100644 index 0000000..46191b4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CREditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.CREditor; + +{$I ..\Design\CREditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRFrame.pas new file mode 100644 index 0000000..f98f7d2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRFrame.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.CRFrame; + +{$I ..\Design\CRFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRTabEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRTabEditor.pas new file mode 100644 index 0000000..c6b7028 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.CRTabEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.CRTabEditor; + +{$I ..\Design\CRTabEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAConnectionEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAConnectionEditor.pas new file mode 100644 index 0000000..861b0d6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAConnectionEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAConnectionEditor; + +{$I ..\Design\DAConnectionEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADataEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADataEditor.pas new file mode 100644 index 0000000..51ae122 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADataEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DADataEditor; + +{$I ..\Design\DADataEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADesign.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADesign.pas new file mode 100644 index 0000000..9e6c1a4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADesign.pas @@ -0,0 +1,7 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DADesign; + +{$I ..\Design\DADesign.pas} + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADesignUtils.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADesignUtils.pas new file mode 100644 index 0000000..2bb97a2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADesignUtils.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DADesignUtils; + +{$I ..\Design\DADesignUtils.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADualListEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADualListEditor.pas new file mode 100644 index 0000000..cb0f2ca --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADualListEditor.pas @@ -0,0 +1,8 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DADualListEditor; + +{$I ..\Design\DADualListEditor.pas} + + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADumpEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADumpEditor.pas new file mode 100644 index 0000000..14289d6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADumpEditor.pas @@ -0,0 +1,8 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DADumpEditor; + +{$I ..\Design\DADumpEditor.pas} + + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADumpProgress.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADumpProgress.pas new file mode 100644 index 0000000..1a2d997 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DADumpProgress.pas @@ -0,0 +1,8 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DADumpProgress; + +{$I ..\Design\DADumpProgress.pas} + + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAMacrosFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAMacrosFrame.pas new file mode 100644 index 0000000..6ef0e08 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAMacrosFrame.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAMacrosFrame; + +{$I ..\Design\DAMacrosFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAMenu.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAMenu.pas new file mode 100644 index 0000000..27611a5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAMenu.pas @@ -0,0 +1,9 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAMenu; + +{$DEFINE DAMENU_HEADER} +{$I ..\Design\DAMenu.pas} + + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAParamValueEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAParamValueEditor.pas new file mode 100644 index 0000000..4320810 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAParamValueEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAParamValueEditor; + +{$I ..\Design\DAParamValueEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAParamsFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAParamsFrame.pas new file mode 100644 index 0000000..c1e5185 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAParamsFrame.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAParamsFrame; + +{$I ..\Design\DAParamsFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAQueryEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAQueryEditor.pas new file mode 100644 index 0000000..25caf2d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAQueryEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAQueryEditor; + +{$I ..\Design\DAQueryEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASPCallFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASPCallFrame.pas new file mode 100644 index 0000000..6911ba4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASPCallFrame.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DASPCallFrame; + +{$I ..\Design\DASPCallFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLEditor.pas new file mode 100644 index 0000000..a2cbe39 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DASQLEditor; + +{$I ..\Design\DASQLEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLFrame.pas new file mode 100644 index 0000000..c20a4d3 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLFrame.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DASQLFrame; + +{$I ..\Design\DASQLFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLGeneratorFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLGeneratorFrame.pas new file mode 100644 index 0000000..1f4899a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DASQLGeneratorFrame.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DASQLGeneratorFrame; + +{$I ..\Design\DASQLGeneratorFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAScriptEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAScriptEditor.pas new file mode 100644 index 0000000..7aca006 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAScriptEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAScriptEditor; + +{$I ..\Design\DAScriptEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAStoredProcEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAStoredProcEditor.pas new file mode 100644 index 0000000..3bf67a6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAStoredProcEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAStoredProcEditor; + +{$I ..\Design\DAStoredProcEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DATableEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DATableEditor.pas new file mode 100644 index 0000000..178f101 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DATableEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DATableEditor; + +{$I ..\Design\DATableEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAUpdateSQLEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAUpdateSQLEditor.pas new file mode 100644 index 0000000..a54a9ef --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAUpdateSQLEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAUpdateSQLEditor; + +{$I ..\Design\DAUpdateSQLEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAUpdateSQLFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAUpdateSQLFrame.pas new file mode 100644 index 0000000..61ab303 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DAUpdateSQLFrame.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DAUpdateSQLFrame; + +{$I ..\Design\DAUpdateSQLFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DBToolsClient.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DBToolsClient.pas new file mode 100644 index 0000000..347d003 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DBToolsClient.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DBToolsClient; + +{$I ..\Design\DBToolsClient.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DBToolsIntf.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DBToolsIntf.pas new file mode 100644 index 0000000..6826905 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DBToolsIntf.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DBToolsIntf; + +{$I ..\Design\DBToolsIntf.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DacReg.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DacReg.pas new file mode 100644 index 0000000..05b2ece --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.DacReg.pas @@ -0,0 +1,22 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.DacReg; + +{$IFDEF VER10P} + +{$R ..\..\Images\CoreLab.Dac.VirtualTable.TVirtualTable.bmp} +{$R ..\..\Images\CoreLab.Dac.VirtualTable.TVirtualTable16.bmp} +{$R ..\..\Images\CoreLab.Dac.VirtualTable.TVirtualTable32.bmp} +{$R ..\..\Images\CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp} +{$R ..\..\Images\CoreLab.Dac.CRBatchMove.TCRBatchMove16.bmp} +{$R ..\..\Images\CoreLab.Dac.CRBatchMove.TCRBatchMove32.bmp} + +{$ELSE} + +{$R ..\..\Images\Delphi8\CoreLab.Dac.VirtualTable.TVirtualTable.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp} + +{$ENDIF} + +{$I ..\Design\DacReg.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.Download.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.Download.pas new file mode 100644 index 0000000..1431b1f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.Download.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.Download; + +{$I ..\Design\Download.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.HelpUtils.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.HelpUtils.pas new file mode 100644 index 0000000..fc6b88b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.HelpUtils.pas @@ -0,0 +1,7 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.HelpUtils; + +{$I ..\Design\HelpUtils.pas} + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.VTDataEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.VTDataEditor.pas new file mode 100644 index 0000000..0985240 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.VTDataEditor.pas @@ -0,0 +1,6 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.VTDataEditor; + +{$I ..\Design\VTDataEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.VTDesign.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.VTDesign.pas new file mode 100644 index 0000000..085d166 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Design.VTDesign.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.Design.VTDesign; + +{$I ..\Design\VTDesign.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemDS.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemDS.pas new file mode 100644 index 0000000..e15f953 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemDS.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.MemDS; + +{$I ..\MemDS.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemData.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemData.pas new file mode 100644 index 0000000..8663d04 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemData.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.MemData; + +{$I ..\MemData.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemUtils.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemUtils.pas new file mode 100644 index 0000000..7ef0d6c --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.MemUtils.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.MemUtils; + +{$I ..\MemUtils.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.VirtualTable.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.VirtualTable.pas new file mode 100644 index 0000000..70da6b6 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.VirtualTable.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit CoreLab.Dac.VirtualTable; + +{$I ..\VirtualTable.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Win32Timer.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Win32Timer.pas new file mode 100644 index 0000000..4b75c2a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Dac.Win32Timer.pas @@ -0,0 +1,5 @@ +{$I ..\Dac.inc} + +unit Corelab.Dac.Win32Timer; + +{$I ..\Win32Timer.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.CRThread.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.CRThread.pas new file mode 100644 index 0000000..6a5bef2 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.CRThread.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.CRThread; + +{$I ..\CRThread.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.DataAdapter.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.DataAdapter.pas new file mode 100644 index 0000000..4ed5b14 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.DataAdapter.pas @@ -0,0 +1,20 @@ +unit CoreLab.Sdac.DataAdapter; + +interface + +uses + DB, System.Data.Common, System.Data, CoreLab.Dac.DataAdapter, + Variants, System.ComponentModel; + +type + TDataTableArr = array of DataTable; + IDataParameterArr = array of IDataParameter; + + MSDataAdapter = class (DADataAdapter) + published + property DataSet; + end; + +implementation + +end. diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.DataAdapter.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.DataAdapter.pas new file mode 100644 index 0000000..8636f3e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.DataAdapter.pas @@ -0,0 +1,9 @@ +unit CoreLab.Sdac.Design.DataAdapter; + +interface + +implementation + +{$R ..\..\Images\CoreLab.Sdac.DataAdapter.MSDataAdapter.bmp} + +end. diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSConnectionEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSConnectionEditor.pas new file mode 100644 index 0000000..561fe66 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSConnectionEditor.pas @@ -0,0 +1,7 @@ + +{$I ..\SDac.inc} + +unit CoreLab.SDac.Design.MSConnectionEditor; + +{$I ..\Design\MSConnectionEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDesign.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDesign.pas new file mode 100644 index 0000000..c7f8912 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDesign.pas @@ -0,0 +1,8 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.Design.MSDesign; + +{$I ..\Design\MSDesign.pas} + + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDesignUtils.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDesignUtils.pas new file mode 100644 index 0000000..5d19fe8 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDesignUtils.pas @@ -0,0 +1,6 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.Design.MSDesignUtils; + +{$I ..\Design\MSDesignUtils.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDumpEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDumpEditor.pas new file mode 100644 index 0000000..a986c14 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSDumpEditor.pas @@ -0,0 +1,8 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.Design.MSDumpEditor; + +{$I ..\Design\MSDumpEditor.pas} + + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSMenu.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSMenu.pas new file mode 100644 index 0000000..a88900d --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSMenu.pas @@ -0,0 +1,8 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.Design.MSMenu; + +{$I ..\Design\MSMenu.pas} + + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSNamesEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSNamesEditor.pas new file mode 100644 index 0000000..1a495c3 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSNamesEditor.pas @@ -0,0 +1,7 @@ + +{$I ..\SDac.inc} + +unit CoreLab.SDac.Design.MSNamesEditor; + +{$I ..\Design\MSNamesEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSParamsFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSParamsFrame.pas new file mode 100644 index 0000000..d712da4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSParamsFrame.pas @@ -0,0 +1,7 @@ + +{$I ..\SDac.inc} + +unit CoreLab.SDac.Design.MSParamsFrame; + +{$I ..\Design\MSParamsFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSQueryEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSQueryEditor.pas new file mode 100644 index 0000000..32d3f8a --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSQueryEditor.pas @@ -0,0 +1,7 @@ + +{$I ..\SDac.inc} + +unit CoreLab.SDac.Design.MSQueryEditor; + +{$I ..\Design\MSQueryEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSReg.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSReg.pas new file mode 100644 index 0000000..363b5d4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSReg.pas @@ -0,0 +1,82 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.Design.MSReg; + +{$IFDEF VER10P} + +{$IFNDEF STD} +{$R ..\..\Images\CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp} +{$R ..\..\Images\CoreLab.Dac.CRBatchMove.TCRBatchMove16.bmp} +{$R ..\..\Images\CoreLab.Dac.CRBatchMove.TCRBatchMove32.bmp} +{$ENDIF} + +{$R ..\..\Images\CoreLab.Sdac.SdacVcl.TMSConnectDialog.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSUpdateSQL.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSTable.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSStoredProc.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSSQL.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSScript.TMSScript.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSQuery.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSMetadata.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSLoader.TMSLoader.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSConnection.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSDataSource.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSServiceBroker.TMSServiceBroker.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSDump.TMSDump.bmp} + +{$R ..\..\Images\CoreLab.Sdac.SdacVcl.TMSConnectDialog16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSUpdateSQL16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSTable16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSStoredProc16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSSQL16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSScript.TMSScript16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSQuery16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSMetadata16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSLoader.TMSLoader16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSConnection16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSDataSource16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSServiceBroker.TMSServiceBroker16.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSDump.TMSDump16.bmp} + +{$R ..\..\Images\CoreLab.Sdac.SdacVcl.TMSConnectDialog32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSUpdateSQL32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSTable32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSStoredProc32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSSQL32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSScript.TMSScript32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSQuery32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSMetadata32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSLoader.TMSLoader32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSConnection32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSAccess.TMSDataSource32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSServiceBroker.TMSServiceBroker32.bmp} +{$R ..\..\Images\CoreLab.Sdac.MSDump.TMSDump32.bmp} + + +{$ELSE} + +{$IFNDEF STD} +{$R ..\..\Images\Delphi8\CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp} +{$ENDIF} + +{$R ..\..\Images\Delphi8\CoreLab.Sdac.SdacVcl.TMSConnectDialog.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSAccess.TMSUpdateSQL.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSAccess.TMSTable.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSAccess.TMSStoredProc.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSAccess.TMSSQL.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSScript.TMSScript.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSAccess.TMSQuery.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSAccess.TMSMetadata.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSLoader.TMSLoader.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSAccess.TMSConnection.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSAccess.TMSDataSource.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSServiceBroker.TMSServiceBroker.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Sdac.MSDump.TMSDump.bmp} + +{$ENDIF} + +{$I ..\Design\MSReg.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSSPCallFrame.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSSPCallFrame.pas new file mode 100644 index 0000000..696b345 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSSPCallFrame.pas @@ -0,0 +1,7 @@ + +{$I ..\SDac.inc} + +unit CoreLab.SDac.Design.MSSPCallFrame; + +{$I ..\Design\MSSPCallFrame.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSSQLEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSSQLEditor.pas new file mode 100644 index 0000000..e372245 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSSQLEditor.pas @@ -0,0 +1,7 @@ + +{$I ..\SDac.inc} + +unit CoreLab.SDac.Design.MSSQLEditor; + +{$I ..\Design\MSSQLEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSStoredProcEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSStoredProcEditor.pas new file mode 100644 index 0000000..f955b1b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSStoredProcEditor.pas @@ -0,0 +1,7 @@ + +{$I ..\SDac.inc} + +unit CoreLab.SDac.Design.MSStoredProcEditor; + +{$I ..\Design\MSStoredProcEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSUpdateSQLEditor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSUpdateSQLEditor.pas new file mode 100644 index 0000000..3d44d5f --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.MSUpdateSQLEditor.pas @@ -0,0 +1,7 @@ + +{$I ..\SDac.inc} + +unit CoreLab.SDac.Design.MSUpdateSQLEditor; + +{$I ..\Design\MSUpdateSQLEditor.pas} + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.SdacAbout.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.SdacAbout.pas new file mode 100644 index 0000000..0d2e77e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.Design.SdacAbout.pas @@ -0,0 +1,8 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.Design.SdacAbout; + +{$I ..\Design\SdacAbout.pas} + + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSAccess.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSAccess.pas new file mode 100644 index 0000000..23bfd20 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSAccess.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.MSAccess; + +{$I ..\MSAccess.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConnectForm.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConnectForm.pas new file mode 100644 index 0000000..f69c291 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConnectForm.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.MSConnectForm; + +{$I ..\MSConnectForm.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConnectionPool.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConnectionPool.pas new file mode 100644 index 0000000..6651de0 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConnectionPool.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.MSConnectionPool; + +{$I ..\MSConnectionPool.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConsts.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConsts.pas new file mode 100644 index 0000000..7a755c8 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSConsts.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.MSConsts; + +{$I ..\MSConsts.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSDump.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSDump.pas new file mode 100644 index 0000000..6b649cf --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSDump.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.MSDump; + +{$I ..\MSDump.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSLoader.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSLoader.pas new file mode 100644 index 0000000..19eade4 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSLoader.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.MSLoader; + +{$I ..\MSLoader.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSParser.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSParser.pas new file mode 100644 index 0000000..e57e873 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSParser.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.MSParser; + +{$I ..\MSParser.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSSQLMonitor.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSSQLMonitor.pas new file mode 100644 index 0000000..edb4a48 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSSQLMonitor.pas @@ -0,0 +1,8 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.MSSQLMonitor; + +{$I ..\MSSQLMonitor.pas} + + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSScript.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSScript.pas new file mode 100644 index 0000000..5abd1e7 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSScript.pas @@ -0,0 +1,8 @@ + +{$I ..\SDac.inc} + +unit CoreLab.Sdac.MSScript; + +{$I ..\MSScript.pas} + + diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSServiceBroker.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSServiceBroker.pas new file mode 100644 index 0000000..e3aaf30 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.MSServiceBroker.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.MSServiceBroker; + +{$I ..\MSServiceBroker.pas} diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBAccess.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBAccess.pas new file mode 100644 index 0000000..1395abd --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBAccess.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.OLEDBAccess; + +{$I ..\OLEDBAccess.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBC.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBC.pas new file mode 100644 index 0000000..aaf320e --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBC.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.OLEDBC; + +{$I ..\OLEDBC.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBIntf.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBIntf.pas new file mode 100644 index 0000000..3f43a59 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.OLEDBIntf.pas @@ -0,0 +1,1356 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.OLEDBIntf; + +interface + +uses + MemUtils, OLEDBC, + ActiveX, System.Runtime.InteropServices, Variants, Windows; + +const + STGM_READ = $00000000; + +type + IUnknown = System.Object; // ++ should move to MemUtils + TUintArray = array of UINT; + PUintArray = IntPtr; + PPByteArray = IntPtr; + PPOleStr = IntPtr; + PCoServerInfo = IntPtr; + PMultiQI = IntPtr; + + PUINT = IntPtr; + PDWORD = IntPtr; + PLongint = IntPtr; + + OleStr = string; + POleStrList = IntPtr; + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBTIMESTAMP = packed record + year: Smallint; + month: Word; + day: Word; + hour: Word; + minute: Word; + second: Word; + fraction: UINT; + end; + TDBTimeStamp = DBTIMESTAMP; + {$EXTERNALSYM DBTIMESTAMP} + +type + [ComImport, GuidAttribute('1CF2B120-547D-101B-8E65-08002B2BD119'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IErrorInfo = interface + [PreserveSig] + function GetGUID(out guid: TGUID): HResult; + [PreserveSig] + function GetSource(out bstrSource: WideString): HResult; + [PreserveSig] + function GetDescription(out bstrDescription: WideString): HResult; + [PreserveSig] + function GetHelpFile(out bstrHelpFile: WideString): HResult; + [PreserveSig] + function GetHelpContext(out dwHelpContext: Longint): HResult; + end; + + PBoid = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + BOID = packed record + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16, ArraySubType = UnmanagedType.U1)] + rgb_: array[0..15] of Byte; + end; + TBoid = BOID; + {$EXTERNALSYM BOID} + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + XACTTRANSINFO = packed record + uow: BOID; + isoLevel: Integer; + isoFlags: UINT; + grfTCSupported: UINT; + grfRMSupported: UINT; + grfTCSupportedRetaining: UINT; + grfRMSupportedRetaining: UINT; + end; + TXactTransInfo = XACTTRANSINFO; + {$EXTERNALSYM XACTTRANSINFO} + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + XACTOPT = packed record + ulTimeout: UINT; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40, ArraySubType = UnmanagedType.I1)] + szDescription: array[0..39] of Shortint; + end; + TXActOpt = XACTOPT; + {$EXTERNALSYM XACTOPT} + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + XACTSTATS = packed record + cOpen: UINT; + cCommitting: UINT; + cCommitted: UINT; + cAborting: UINT; + cAborted: UINT; + cInDoubt: UINT; + cHeuristicDecision: UINT; + timeTransactionsUp: FILETIME; + end; + TXactStats = XACTSTATS; + {$EXTERNALSYM XACTSTATS} + + PDBBindExt = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBBINDEXT = packed record + pExtension: IntPtr; // PByte; + ulExtension: UINT; + end; + TDBBindExt = DBBINDEXT; + {$EXTERNALSYM DBBINDEXT} + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBOBJECT = packed record + dwFlags: UINT; + [MarshalAs(UnmanagedType.Struct)] + iid: TGUID; + end; + TDBObject = DBOBJECT; + {$EXTERNALSYM DBOBJECT} + + PDBBinding = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBBINDING = packed record + iOrdinal: UINT; + obValue: UINT; + obLength: UINT; + obStatus: UINT; + pTypeInfo: IntPtr; // IUnknown; + pObject: IntPtr; // PDBObject; + pBindExt: IntPtr; // PDBBindExt; + dwPart: DBPART; + dwMemOwner: DBMEMOWNER; + eParamIO: DBPARAMIO; + cbMaxLen: UINT; + dwFlags: UINT; + wType: DBTYPE; + bPrecision: Byte; + bScale: Byte; + end; + TDBBinding = DBBINDING; +{ $IFNDEF VER125} + { $EXTERNALSYM DBBINDING} +{ $ENDIF} + + PDBBindingArray = IntPtr; + TDBBindingArray = packed array of TDBBinding; + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBIDNAME = record + [MarshalAs(UnmanagedType.LPWStr)] + pwszName: PWideChar; + end; + TDBIDName = DBIDNAME; + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBIDGUID = record + guid: TGUID; + end; + TDBIDGuid = DBIDGUID; + + DBPROPID = UINT; + {$EXTERNALSYM DBPROPID} + PDBPROPID = IntPtr; + PDBPropIDArray = IntPtr; + TDBPropIDArray = array[0..MAXBOUND] of DBPROPID; + + PDBID = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBID = packed record + uGuid: DBIDGUID; + eKind: DBKIND; + uName: IntPtr; // DBIDNAME; + end; + TDBID = DBID; + {$EXTERNALSYM DBID} + + _DBID = array [0..23] of byte; + + PDBIDArray = IntPtr; + TDBIDArray = array[0..MAXBOUND] of TDBID; + + PDBPropIDSet = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBPROPIDSET = packed record + rgPropertyIDs: IntPtr; // PDBPropIDArray; + cPropertyIDs: UINT; + guidPropertySet: TGUID; + end; + TDBPropIDSet = DBPROPIDSET; + {$EXTERNALSYM DBPROPIDSET} + + PDBPropIDSetArray = IntPtr; + TDBPropIDSetArray = array[0..MAXBOUND] of TDBPropIDSet; + + PDBProp = packed record + private + Ptr: IntPtr; + + function GetdwPropertyID: DBPROPID; + procedure SetdwPropertyID(Value: DBPROPID); + + function GetdwOptions: DBPROPOPTIONS; + procedure SetdwOptions(Value: DBPROPOPTIONS); + + function GetdwStatus: DBPROPSTATUS; + procedure SetdwStatus(Value: DBPROPSTATUS); + + function Getcolid: _DBID; + procedure Setcolid(Value: _DBID); + + function GetvValue: OleVariant; + procedure SetvValue(Value: OleVariant); + + public + property dwPropertyID: DBPROPID read GetdwPropertyID write SetdwPropertyID; + property dwOptions: DBPROPOPTIONS read GetdwOptions write SetdwOptions; + property dwStatus: DBPROPSTATUS read GetdwStatus write SetdwStatus; + property colid: _DBID read Getcolid write Setcolid; + property vValue: OleVariant read GetvValue write SetvValue; + + class operator Implicit(AValue: IntPtr): PDBProp; + class operator Implicit(AValue: PDBProp): IntPtr; + end; + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBPROP = packed record + dwPropertyID: DBPROPID; + dwOptions: DBPROPOPTIONS; + dwStatus: DBPROPSTATUS; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24, ArraySubType = UnmanagedType.U1)] + colid: _DBID; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16, ArraySubType = UnmanagedType.U1)] // ?? + vValue: OleVariant; + end; + TDBProp = DBPROP; + {$EXTERNALSYM DBPROP} + + PDBPropArray = IntPtr; + TDBPropArray = array[0..MAXBOUND] of TDBProp; + + + PPDBPropSet = IntPtr; + + PDBPropSet = packed record + private + Ptr: IntPtr; + + function GetrgProperties: PDBPropArray; + procedure SetrgProperties(Value: PDBPropArray); + + function GetcProperties: UINT; + procedure SetcProperties(Value: UINT); + + function GetguidPropertySet: TGUID; + procedure SetguidPropertySet(Value: TGUID); + + public + property rgProperties: PDBPropArray read GetrgProperties write SetrgProperties; + property cProperties: UINT read GetcProperties write SetcProperties; + property guidPropertySet: TGUID read GetguidPropertySet write SetguidPropertySet; + + class operator Implicit(AValue: IntPtr): PDBPropSet; + class operator Implicit(AValue: PDBPropSet): IntPtr; + end; + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBPROPSET = packed record + rgProperties: PDBPropArray; + cProperties: UINT; + [MarshalAs(UnmanagedType.Struct)] + guidPropertySet: TGUID; + end; + TDBPropSet = DBPROPSET; + {$EXTERNALSYM DBPROPSET} + + PDBPropSetArray = IntPtr; + TDBPropSetArray = array[0..MAXBOUND] of TDBPropSet; + + PDBPropInfo = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBPROPINFO = packed record + [MarshalAs(UnmanagedType.LPWStr)] + pwszDescription: PWideChar; + dwPropertyID: DBPROPID; + dwFlags: DBPROPFLAGS; + vtType: Word; + vValues: OleVariant; + end; + TDBPropInfo = DBPROPINFO; + {$EXTERNALSYM DBPROPINFO} + + PDBPropInfoArray = IntPtr; + TDBPropInfoArray = array[0..MAXBOUND] of TDBPropInfo; + + PDBPropInfoSet = IntPtr; +(* + PDBPropInfoSet = ^TDBPropInfoSet; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBPROPINFOSET = packed record + rgPropertyInfos: PDBPropInfoArray; + cPropertyInfos: UINT; + guidPropertySet: TGUID; + end; + TDBPropInfoSet = DBPROPINFOSET; + {$EXTERNALSYM DBPROPINFOSET} + *) + + PDBParams = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBPARAMS = packed record + pData: IntPtr; + cParamSets: UINT; + HACCESSOR: HACCESSOR; + end; + TDBParams = DBPARAMS; + {$EXTERNALSYM DBPARAMS} + + PDBColumnInfo = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBCOLUMNINFO = packed record + [MarshalAs(UnmanagedType.LPWStr)] + pwszName: PWideChar; + pTypeInfo: IntPtr; + iOrdinal: UINT; + dwFlags: DBCOLUMNFLAGS; + ulColumnSize: UINT; + wType: DBTYPE; + bPrecision: Byte; + bScale: Byte; + columnid: DBID; + end; + TDBColumnInfo = DBCOLUMNINFO; + {$EXTERNALSYM DBCOLUMNINFO} + + PDBColumnInfoArray = IntPtr; + TDBColumnInfoArray = array[0..MAXCOLS] of TDBColumnInfo; + + PDBLiteralInfo = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBLITERALINFO = packed record + [MarshalAs(UnmanagedType.LPWStr)] + pwszLiteralValue: PWideChar; + [MarshalAs(UnmanagedType.LPWStr)] + pwszInvalidChars: PWideChar; + [MarshalAs(UnmanagedType.LPWStr)] + pwszInvalidStartingChars: PWideChar; + lt: UINT; + fSupported: BOOL; + cchMaxLen: UINT; + end; + TDBLiteralInfo = DBLITERALINFO; + {$EXTERNALSYM DBLITERALINFO} + + PDBLiteralInfoArray = IntPtr; + TDBLiteralInfoArray = array[0..MAXBOUND] of TDBLiteralInfo; + + PDBColumnDesc = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBCOLUMNDESC = packed record + [MarshalAs(UnmanagedType.LPWStr)] + pwszTypeName: PWideChar; + pTypeInfo: IntPtr; + rgPropertySets: IntPtr; + pclsid: IntPtr; + cPropertySets: UINT; + ulColumnSize: UINT; + dbcid: DBID; + wType: DBTYPE; + bPrecision: Byte; + bScale: Byte; + end; + TDBColumnDesc = DBCOLUMNDESC; + {$EXTERNALSYM DBCOLUMNDESC} + + PErrorInfo = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + ERRORINFO = packed record + hrError: HResult; + dwMinor: UINT; + clsid: TGUID; + iid: TGUID; + dispid: Integer; + end; + TErrorInfo = ERRORINFO; + {$EXTERNALSYM ERRORINFO} + + PDBParamInfo = IntPtr; +(* PDBParamInfo = ^TDBParamInfo; + DBPARAMINFO = packed record + dwFlags: DBPARAMFLAGS; + iOrdinal: UINT; + pwszName: PWideChar; + pTypeInfo: ITypeInfo; + ulParamSize: UINT; + wType: DBTYPE; + bPrecision: Byte; + bScale: Byte; + end; + TDBParamInfo = DBPARAMINFO; + {$EXTERNALSYM DBPARAMINFO}*) + + PDBParamBindInfo = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DBPARAMBINDINFO = packed record + pwszDataSourceType: IntPtr; + pwszName: IntPtr; + ulParamSize: UINT; + dwFlags: DBPARAMFLAGS; + bPrecision: Byte; + bScale: Byte; + end; + TDBParamBindInfo = DBPARAMBINDINFO; + {$EXTERNALSYM DBPARAMBINDINFO} + + PDBParamBindInfoArray = IntPtr; + TDBParamBindInfoArray = array[0..MAXBOUND] of TDBParamBindInfo; + + PDBNumeric = IntPtr; + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + DB_NUMERIC = packed record + precision: Byte; + scale: Byte; + sign: Byte; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16, ArraySubType = UnmanagedType.U1)] + val: array[0..15] of Byte; + end; + TDBNumeric = DB_NUMERIC; + {$EXTERNALSYM DB_NUMERIC} +const + SizeOfTDBNumeric = 19; +// *********************************************************************// +// DBID Values +// *********************************************************************// + +var + DB_NULLID: _DBID = ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00); + +type + TVariantArray = array [0..0] of OleVariant; + PVariantArray = IntPtr; + + TGUIDArray = array [0..0] of TGUID; + PGUIDArray = IntPtr; + +// *********************************************************************// +// Interface: ITransaction +// GUID: {0FB15084-AF41-11CE-BD2B-204C4F4F5020} +// *********************************************************************// +{$IFNDEF VER6P} + {$NODEFINE ITransaction} +{$ENDIF} + [ComImport, GuidAttribute('0FB15084-AF41-11CE-BD2B-204C4F4F5020'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ITransaction = interface + [PreserveSig] + function Commit(fRetaining: BOOL; grfTC: UINT; grfRM: UINT): HResult; + [PreserveSig] + function Abort(pboidReason: PBOID; fRetaining: BOOL; fAsync: BOOL): HResult; + [PreserveSig] + function GetTransactionInfo(out pinfo: XACTTRANSINFO): HResult; + end; + +// *********************************************************************// +// Interface: ITransactionOptions +// GUID: {3A6AD9E0-23B9-11CF-AD60-00AA00A74CCD} +// *********************************************************************// + [ComImport, GuidAttribute('3A6AD9E0-23B9-11CF-AD60-00AA00A74CCD'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ITransactionOptions = interface + [PreserveSig] + function SetOptions(var pOptions: XACTOPT): HResult; + [PreserveSig] + function GetOptions(var pOptions: XACTOPT): HResult; + end; + +// *********************************************************************// +// Interface: IAccessor +// GUID: {0C733A8C-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A8C-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IAccessor = interface + [PreserveSig] + function AddRefAccessor( + HACCESSOR: HACCESSOR; + [Out, MarshalAs(UnmanagedType.U4)] + out pcRefCount: UINT): HResult; + [PreserveSig] + function CreateAccessor( + dwAccessorFlags: UINT; + cBindings: UINT; + rgBindings: PDBBindingArray; + cbRowSize: UINT; + var phAccessor: HACCESSOR; + rgStatus: PUintArray + ): HResult; + [PreserveSig] + function GetBindings(HACCESSOR: HACCESSOR; + [Out, MarshalAs(UnmanagedType.U4)] + out pdwAccessorFlags: UINT; + var pcBindings: UINT; + out prgBindings: PDBBinding): HResult; + [PreserveSig] + function ReleaseAccessor(HACCESSOR: HACCESSOR; + pcRefCount: PUINT): HResult; + end; + +// *********************************************************************// +// Interface: IRowset +// GUID: {0C733A7C-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A7C-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IRowset = interface + [PreserveSig] + function AddRefRows(cRows: UINT; rghRows: PUintArray; rgRefCounts: PUintArray; + rgRowStatus: PUintArray): HResult; + [PreserveSig] + function GetData(HROW: HROW; HACCESSOR: HACCESSOR; pData: IntPtr): HResult; + [PreserveSig] + function GetNextRows(hReserved: HCHAPTER; lRowsOffset: Integer; cRows: Integer; + out pcRowsObtained: UINT; var prghRows: PUintArray): HResult; + [PreserveSig] + function ReleaseRows( + cRows: UINT; + rghRows: PUintArray; + rgRowOptions, + rgRefCounts, + rgRowStatus: PUintArray): HResult; + [PreserveSig] + function RestartPosition(hReserved: HCHAPTER): HResult; + end; + +// *********************************************************************// +// Interface: IRowsetInfo +// GUID: {0C733A55-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A55-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IRowsetInfo = interface + [PreserveSig] + function GetProperties(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + out pcPropertySets: UINT; out prgPropertySets: PDBPropSet): HResult; + [PreserveSig] + function GetReferencedRowset(iOrdinal: UINT; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppReferencedRowset: IUnknown): HResult; + [PreserveSig] + function GetSpecification( + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppSpecification: IUnknown): HResult; + end; + +// *********************************************************************// +// Interface: IRowsetLocate +// GUID: {0C733A7D-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A7D-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IRowsetLocate = interface + // IRowset + [PreserveSig] + function AddRefRows(cRows: UINT; rghRows: PUintArray; rgRefCounts: PUintArray; + rgRowStatus: PUintArray): HResult; + [PreserveSig] + function GetData(HROW: HROW; HACCESSOR: HACCESSOR; pData: IntPtr): HResult; + [PreserveSig] + function GetNextRows(hReserved: HCHAPTER; lRowsOffset: Integer; cRows: Integer; + out pcRowsObtained: UINT; var prghRows: PUintArray): HResult; + [PreserveSig] + function ReleaseRows(cRows: UINT; rghRows: PUintArray; rgRowOptions, + rgRefCounts, rgRowStatus: PUintArray): HResult; + [PreserveSig] + function RestartPosition(hReserved: HCHAPTER): HResult; + + // IRowsetLocate + [PreserveSig] + function Compare(hReserved: HCHAPTER; cbBookmark1: UINT; pBookmark1: IntPtr; + cbBookmark2: UINT; pBookmark2: IntPtr; out pComparison: UINT): HResult; + [PreserveSig] + function GetRowsAt( + hReserved1: HWATCHREGION; + hReserved2: HCHAPTER; + cbBookmark: UINT; + pBookmark: IntPtr; + lRowsOffset: Integer; + cRows: Integer; + out pcRowsObtained: UINT; + var prghRows: PUintArray): HResult; + [PreserveSig] + function GetRowsByBookmark(hReserved: HCHAPTER; cRows: UINT; rgcbBookmarks: PUintArray; + rgpBookmarks: PPByteArray; rghRows, rgRowStatus: PUintArray): HResult; + [PreserveSig] + function Hash(hReserved: HCHAPTER; cBookmarks: UINT; rgcbBookmarks: PUintArray; + rgpBookmarks: PPByteArray; rgHashedValues, + rgBookmarkStatus: PUintArray): HResult; + end; + +// *********************************************************************// +// Interface: IRowsetChange +// GUID: {0C733A05-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A05-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IRowsetChange = interface + [PreserveSig] + function DeleteRows(hReserved: HCHAPTER; cRows: UINT; rghRows: PUintArray; + rgRowStatus: PUintArray): HResult; + [PreserveSig] + function SetData(HROW: HROW; HACCESSOR: HACCESSOR; pData: IntPtr): HResult; + [PreserveSig] + function InsertRow(hReserved: HCHAPTER; HACCESSOR: HACCESSOR; pData: IntPtr; + out phRow: HROW): HResult; + end; + +// *********************************************************************// +// Interface: IRowsetUpdate +// GUID: {0C733A6D-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A6D-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IRowsetUpdate = interface + // IRowsetChange + [PreserveSig] + function DeleteRows(hReserved: HCHAPTER; cRows: UINT; rghRows: PUintArray; + rgRowStatus: PUintArray): HResult; + [PreserveSig] + function SetData(HROW: HROW; HACCESSOR: HACCESSOR; pData: IntPtr): HResult; + [PreserveSig] + function InsertRow(hReserved: HCHAPTER; HACCESSOR: HACCESSOR; pData: IntPtr; + out phRow: HROW): HResult; + + // IRowsetUpdate + [PreserveSig] + function GetOriginalData(HROW: HROW; HACCESSOR: HACCESSOR; pData: IntPtr): HResult; + [PreserveSig] + function GetPendingRows(hReserved: HCHAPTER; dwRowStatus: DBPENDINGSTATUS; + [Out, MarshalAs(UnmanagedType.U4)] + out pcPendingRows: UINT; + prgPendingRows: PPHROW; prgPendingStatus: PPDBPENDINGSTATUS): HResult; + [PreserveSig] + function GetRowStatus(hReserved: HCHAPTER; + [Out, MarshalAs(UnmanagedType.U4)] + out cRows: UINT; + rghRows: PUintArray; + rgPendingStatus: PUintArray): HResult; + [PreserveSig] + function Undo( + hReserved: HCHAPTER; + cRows: UINT; + rghRows: PUintArray; + pcRowsUndone: PUINT; + prgRowsUndone: PPHROW; + prgRowStatus: PPDBROWSTATUS + ): HResult; + [PreserveSig] + function Update( + hReserved: HCHAPTER; + cRows: UINT; + rghRows: PUintArray; + pcRows: PUINT; + prgRows: PPHROW; + out prgRowStatus: PDBROWSTATUS + ): HResult; + end; + +// *********************************************************************// +// Interface: IMultipleResults +// GUID: {0C733A90-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A90-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IMultipleResults = interface + [PreserveSig] + function GetResult( + [In, MarshalAs(UnmanagedType.IUnknown)] + const punkOuter: IUnknown; + reserved: Integer; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + [Out, MarshalAs(UnmanagedType.U4)] + out pcRowsAffected: Integer; + [Out, MarshalAs(UnmanagedType.Interface)] + out ppRowset: IUnknown): HResult; + end; + +// *********************************************************************// +// Interface: ICommandPrepare +// GUID: {0C733A26-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A26-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ICommandPrepare = interface + [PreserveSig] + function Prepare(cExpectedRuns: UINT): HResult; + [PreserveSig] + function Unprepare: HResult; + end; + +// *********************************************************************// +// Interface: ICommandProperties +// GUID: {0C733A79-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + + [ComImport, GuidAttribute('0C733A79-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ICommandProperties = interface + [PreserveSig] + function GetProperties(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + var pcPropertySets: UINT; out prgPropertySets: PDBPropSet): HResult; + [PreserveSig] + function SetProperties(cPropertySets: UINT; rgPropertySets: PDBPropSetArray): HResult; + end; + +// *********************************************************************// +// Interface: ICommand +// GUID: {0C733A63-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A63-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ICommand = interface + [PreserveSig] + function Cancel: HResult; + [PreserveSig] + function Execute( + [In, MarshalAs(UnmanagedType.IUnknown)] + const punkOuter: IUnknown; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + var pParams: DBPARAMS; + [Out, MarshalAs(UnmanagedType.I4)] + out pcRowsAffected: Integer; + [Out, MarshalAs(UnmanagedType.Interface)] + out ppRowset: IUnknown): HResult; + [PreserveSig] + function GetDBSession( + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppSession: IUnknown): HResult; + end; + +// *********************************************************************// +// Interface: ICommandText +// GUID: {0C733A27-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A27-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ICommandText = interface(ICommand) + [PreserveSig] + function Cancel: HResult; + [PreserveSig] + function Execute( + [In, MarshalAs(UnmanagedType.IUnknown)] + const punkOuter: IUnknown; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + var pParams: DBPARAMS; + [Out, MarshalAs(UnmanagedType.I4)] + out pcRowsAffected: Integer; + [Out, MarshalAs(UnmanagedType.Interface)] + out ppRowset: IUnknown): HResult; + [PreserveSig] + function GetDBSession( + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppSession: IUnknown): HResult; + + [PreserveSig] + function GetCommandText( // WANING! System.Data.Common.UnsafeNativeMethods.GetCommandText has no parameters! + [MarshalAs(UnmanagedType.LPStruct)] + var pguidDialect: TGUID; + out ppwszCommand: IntPtr): HResult; + [PreserveSig] + function SetCommandText( + [In, MarshalAs(UnmanagedType.LPStruct)] + const rguidDialect: TGUID; + [In, MarshalAs(UnmanagedType.LPWStr)] + const pwszCommand: string): HResult; + end; + +// *********************************************************************// +// Interface: ICommandWithParameters +// GUID: {0C733A64-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A64-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ICommandWithParameters = interface + [PreserveSig] + function GetParameterInfo( + [Out, MarshalAs(UnmanagedType.I4)] + var pcParams: UINT32; + out prgParamInfo: PDBPARAMINFO; + ppNamesBuffer: PPOleStr): HResult; + [PreserveSig] + function MapParameterNames( + cParamNames: UINT; + rgParamNames: POleStrList; + rgParamOrdinals: PUintArray): HResult; + [PreserveSig] + function SetParameterInfo( + cParams: UINT; + rgParamOrdinals: PUintArray; + rgParamBindInfo: PDBParamBindInfoArray): HResult; + end; + +// *********************************************************************// +// Interface: IColumnsRowset +// GUID: {0C733A10-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A10-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IColumnsRowset = interface + [PreserveSig] + function GetAvailableColumns(var pcOptColumns: UINT; + var prgOptColumns: PDBID): HResult; + [PreserveSig] + function GetColumnsRowset( + [In, MarshalAs(UnmanagedType.IUnknown)] + const punkOuter: IUnknown; + cOptColumns: UINT; + rgOptColumns: PDBIDArray; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + cPropertySets: UINT; + rgPropertySets: PDBPropSetArray; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out pColRowset: IUnknown): HResult; + end; + +// *********************************************************************// +// Interface: IColumnsInfo +// GUID: {0C733A11-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A11-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IColumnsInfo = interface + [PreserveSig] + function GetColumnInfo(var pcColumns: UINT; out prgInfo: PDBColumnInfo; + out ppStringsBuffer: IntPtr): HResult; + [PreserveSig] + function MapColumnIDs(cColumnIDs: UINT; rgColumnIDs: PDBIDArray; + rgColumns: PUintArray): HResult; + end; + +// *********************************************************************// +// Interface: IDBCreateCommand +// GUID: {0C733A1D-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A1D-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IDBCreateCommand = interface + [PreserveSig] + function CreateCommand( + [In, MarshalAs(UnmanagedType.IUnknown)] + const punkOuter: IUnknown; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppCommand: IUnknown): HResult; + end; + +// *********************************************************************// +// Interface: IDBCreateSession +// GUID: {0C733A5D-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A5D-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IDBCreateSession = interface + [PreserveSig] + function CreateSession( + [In, MarshalAs(UnmanagedType.IUnknown)] + const punkOuter: IUnknown; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppDBSession: IUnknown): HResult; + end; + +// *********************************************************************// +// Interface: ISourcesRowset +// GUID: {0C733A1E-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A1E-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ISourcesRowset = interface + [PreserveSig] + function GetSourcesRowset( + [In, MarshalAs(UnmanagedType.IUnknown)] + const punkOuter: IUnknown; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + cPropertySets: UINT; + rgProperties: PDBPropSetArray; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppSourcesRowset: IUnknown): HResult; + end; + +// *********************************************************************// +// Interface: IDBProperties +// GUID: {0C733A8A-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A8A-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IDBProperties = interface + [PreserveSig] + function GetProperties(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + var pcPropertySets: UINT; out prgPropertySets: PDBPropSet): HResult; + [PreserveSig] + function GetPropertyInfo(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + var pcPropertyInfoSets: UINT; out prgPropertyInfoSets: PDBPropInfoSet; + ppDescBuffer: PPOleStr): HResult; + [PreserveSig] + function SetProperties(cPropertySets: UINT; rgPropertySets: PDBPropSetArray): HResult; + end; + +// *********************************************************************// +// Interface: IDBInitialize +// GUID: {0C733A8B-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A8B-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IDBInitialize = interface + [PreserveSig] + function Initialize: HResult; + [PreserveSig] + function Uninitialize: HResult; + end; + +// *********************************************************************// +// Interface: IDBDataSourceAdmin +// GUID: {0C733A7A-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A7A-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IDBDataSourceAdmin = interface + [PreserveSig] + function CreateDataSource(cPropertySets: UINT; + rgPropertySets: PDBPropSetArray; + [In, MarshalAs(UnmanagedType.IUnknown)] + const punkOuter: IUnknown; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppDBSession: IUnknown): HResult; + [PreserveSig] + function DestroyDataSource: HResult; + [PreserveSig] + function GetCreationProperties(cPropertyIDSets: UINT; + rgPropertyIDSets: PDBPropIDSetArray; + pcPropertyInfoSets: PUINT; + out prgPropertyInfoSets: PDBPropInfoSet; + ppDescBuffer: PPOleStr): HResult; + [PreserveSig] + function ModifyDataSource(cPropertySets: UINT; + rgPropertySets: PDBPropSetArray): HResult; + end; + +// *********************************************************************// +// Interface: ISessionProperties +// GUID: {0C733A85-2A1C-11CE-ADE5-00AA0044773d} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A85-2A1C-11CE-ADE5-00AA0044773d'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ISessionProperties = interface + [PreserveSig] + function GetProperties(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + var pcPropertySets: UINT; out prgPropertySets: PDBPropSet): HResult; + [PreserveSig] + function SetProperties(cPropertySets: UINT; rgPropertySets: PDBPropSetArray): HResult; + end; + +// *********************************************************************// +// Interface: ITransactionLocal +// GUID: {0C733A5F-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + [ComImport, GuidAttribute('0C733A5F-2A1C-11CE-ADE5-00AA0044773D'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ITransactionLocal = interface + // ITransaction + [PreserveSig] + function Commit(fRetaining: BOOL; grfTC: UINT; grfRM: UINT): HResult; + [PreserveSig] + function Abort(pboidReason: PBOID; fRetaining: BOOL; fAsync: BOOL): HResult; + [PreserveSig] + function GetTransactionInfo(out pinfo: XACTTRANSINFO): HResult; + + // ITransactionLocal + [PreserveSig] + function GetOptionsObject(out ppOptions: ITransactionOptions): HResult; + [PreserveSig] + function StartTransaction(isoLevel: Integer; isoFlags: UINT; + const pOtherOptions: ITransactionOptions; + pulTransactionLevel: PUINT): HResult; + end; + +// *********************************************************************// +// Interface: IDBPromptInitialize +// GUID: {2206CCB0-19C1-11D1-89E0-00C04FD7A829} +// *********************************************************************// + [ComImport, GuidAttribute('2206CCB0-19C1-11D1-89E0-00C04FD7A829'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IDBPromptInitialize = interface + [PreserveSig] + function PromptDataSource( + [In, MarshalAs(UnmanagedType.IUnknown)] + const pUnkOuter: IUnknown; + hWndParent: HWND; + dwPromptOptions: DBPROMPTOPTIONS; cSourceTypeFilter: ULONG; + rgSourceTypeFilter: PDBSOURCETYPE; + [Out, MarshalAs(UnmanagedType.LPWStr)] + pszProviderFilter: OleStr; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TIID; + [MarshalAs(UnmanagedType.IUnknown)] + var DataSource: IUnknown): HResult; + [PreserveSig] + function PromptFileName(hWndParent: HWND; dwPromptOptions: DBPROMPTOPTIONS; + pwszInitialDirectory, pwszInitialFile: OleStr; + [MarshalAs(UnmanagedType.LPWStr)] + var ppwszSelectedFile: OleStr): HResult; + end; + +// *********************************************************************// +// Interface: IDataInitialize +// GUID: {2206CCB1-19C1-11D1-89E0-00C04FD7A829} +// *********************************************************************// + [ComImport, GuidAttribute('2206CCB1-19C1-11D1-89E0-00C04FD7A829'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IDataInitialize = interface + [PreserveSig] + function GetDataSource( + [In, MarshalAs(UnmanagedType.IUnknown)] + const pUnkOuter: IUnknown; + dwClsCtx: DWORD; + [In, MarshalAs(UnmanagedType.LPWStr)] + const pwszInitializationString: OleStr; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out DataSource: IUnknown): HResult; + [PreserveSig] + function GetInitializationString( + [In, MarshalAs(UnmanagedType.IUnknown)] + const DataSource: IUnknown; + fIncludePassword: Boolean; + [Out, MarshalAs(UnmanagedType.LPWStr)] + out pwszInitString: OleStr): HResult; + function CreateDBInstance( + [In, MarshalAs(UnmanagedType.LPStruct)] + const clsidProvider: TGUID; + [In, MarshalAs(UnmanagedType.IUnknown)] + const pUnkOuter: IUnknown; + dwClsCtx: DWORD; + [MarshalAs(UnmanagedType.LPWStr)] + pwszReserved: OleStr; + riid: TIID; + [MarshalAs(UnmanagedType.IUnknown)] + var DataSource: IUnknown): HResult; + function CreateDBInstanceEx( + [In, MarshalAs(UnmanagedType.LPStruct)] + const clsidProvider: TGUID; + [In, MarshalAs(UnmanagedType.IUnknown)] + const pUnkOuter: IUnknown; + dwClsCtx: DWORD; + [MarshalAs(UnmanagedType.LPWStr)] + pwszReserved: OleStr; + pServerInfo: PCoServerInfo; + cmq: ULONG; + rgmqResults: PMultiQI): HResult; + function LoadStringFromStorage( + [MarshalAs(UnmanagedType.LPWStr)] + pwszFileName: OleStr; + [Out, MarshalAs(UnmanagedType.LPWStr)] + out pwszInitializationString: OleStr): HResult; + function WriteStringToStorage( + [MarshalAs(UnmanagedType.LPWStr)] + pwszFileName, + [MarshalAs(UnmanagedType.LPWStr)] + pwszInitializationString: OleStr; + dwCreationDisposition: DWORD): HResult; + end; + + [ComImport, GuidAttribute('0c733a7b-2a1c-11ce-ade5-00aa0044773d'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IDBSchemaRowset = interface + [PreserveSig] + function GetRowset ( + [In, MarshalAs(UnmanagedType.IUnknown)] + const pUnkOuter: IUnknown; + [In, MarshalAs(UnmanagedType.LPStruct)] + const rguidSchema: TGUID; + cRestrictions: UINT; rgRestrictions: PVariantArray; + [In, MarshalAs(UnmanagedType.LPStruct)] + const riid: TGUID; + cPropertySets: UINT; rgPropertySets: PDBPropSetArray; + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppRowset: IUnknown): HResult; + [PreserveSig] + function GetSchemas (out pcSchemas: UINT; out prgSchemas: PGUIDArray; + prgRestrictionSupport: PUINTArray): HResult; + end; + + [ComImport, + GuidAttribute('0C733A69-2A1C-11CE-ADE5-00AA0044773D'), + InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IOpenRowset = interface // (IUnknown) + [PreserveSig] + function OpenRowset([in, MarshalAs(UnmanagedType.IUnknown)] punkOuter: TObject; + pTableID: PDBID; pIndexID: PDBID; + [MarshalAs(UnmanagedType.LPStruct)] riid: TGUID; cPropertySets: UINT; + rgPropertySets: PDBPropSetArray; + [MarshalAs(UnmanagedType.IUnknown)] var ppRowset): HResult; + end; + + [ComImport, + GuidAttribute('5CF4CA13-EF21-11d0-97E7-00C04FC2AD98'), + InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IRowsetFastLoad = interface // (IUnknown) + [PreserveSig] + function InsertRow(HACCESSOR: HACCESSOR; pData: IntPtr): HResult; + [PreserveSig] + function Commit(fDone: boolean): HResult; + end; + + [ComImport, GuidAttribute('0c733a95-2a1c-11ce-ade5-00aa0044773d'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IDBAsynchStatus = interface + [PreserveSig] + function Abort(Chapter: HCHAPTER; Operation: DBASYNCHOP): HRESULT; + [PreserveSig] + function GetStatus(Chapter: HCHAPTER; Operation: DBASYNCHOP; var Progress: UINT; + var ProgressMax: UINT; var AsynchPhase: DWORD; var StatusText: PWideChar): HRESULT; + end; + + [ComImport, GuidAttribute('1FF1F743-8BB0-4c00-ACC4-C10E43B08FC1'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ISSAsynchStatus = interface(IDBAsynchStatus) + [PreserveSig] + function WaitForAsynchCompletion(MillisecTimeOut: DWORD): HRESULT; + end; + + [ComImport, GuidAttribute('0c733a67-2a1c-11ce-ade5-00aa0044773d'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + IErrorRecords = interface + [PreserveSig] + function (* [local] *) AddErrorRecord( + (* [in] *) const pErrorInfo: ERRORINFO; + (* [in] *) dwLookupID: DWORD; + (* [in] *) const pdispparams: DISPPARAMS; + [In, MarshalAs(UnmanagedType.IUnknown)] + (* [in] *) const punkCustomError: IUnknown; + (* [in] *) dwDynamicErrorID: DWORD): HResult; + + [PreserveSig] + function (* [local] *) GetBasicErrorInfo( + (* [in] *) ulRecordNum: ULONG; + (* [out] *) out pErrorInfo: ERRORINFO): HResult; + + [PreserveSig] + function (* [local] *) GetCustomErrorObject( + (* [in] *) ulRecordNum: ULONG; + [In, MarshalAs(UnmanagedType.LPStruct)] + (* [in] *) const riid: TGUID; + [Out, MarshalAs(UnmanagedType.IUnknown)] + (* [iid_is][out] *) out ppObject: IUnknown): HResult; + + [PreserveSig] + function (* [local] *) GetErrorInfo( + (* [in] *) ulRecordNum: ULONG; + (* [in] *) lcid: LCID; + (* [out] *) + [Out, MarshalAs(UnmanagedType.IUnknown)] + out ppErrorInfo: IErrorInfo): HResult; + + [PreserveSig] + function (* [local] *) GetErrorParameters( + (* [in] *) ulRecordNum: ULONG; + (* [out] *) out pdispparams: DISPPARAMS): HResult; + + [PreserveSig] + function (* [local] *) GetRecordCount( + (* [out] *) out pcRecords: ULONG): HResult; + end; + {$EXTERNALSYM IErrorRecords} + +// the structure returned by ISQLServerErrorInfo::GetSQLServerInfo + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] + SSERRORINFO = record + [MarshalAs(UnmanagedType.LPWStr)] + pwszMessage: PWideChar; + [MarshalAs(UnmanagedType.LPWStr)] + pwszServer: PWideChar; + [MarshalAs(UnmanagedType.LPWStr)] + pwszProcedure: PWideChar; + lNative: UINT; + bState: BYTE; + bClass: BYTE; + wLineNumber: WORD; + end; + PSSERRORINFO = IntPtr; + + [ComImport, GuidAttribute('5CF4CA12-EF21-11d0-97E7-00C04FC2AD98'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ISQLServerErrorInfo = interface + [PreserveSig] + function GetErrorInfo( + (* [out] *) out ppErrorInfo: PSSERRORINFO; + (* [out] *) out ppStringsBuffer: IntPtr{PWideChar}): HResult; + end; + + /// WARINING - in 64bit OSes DBBKMARK is int64 + DBBKMARK = integer; + + [ComImport, GuidAttribute('0c733a30-2a1c-11ce-ade5-00aa0044773d'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ISequentialStream = interface + [PreserveSig] + function Read( + pv: IntPtr; + cb: Longint; + pcbRead: PLongint): HResult; + [PreserveSig] + function Write( + pv: IntPtr; + cb: Longint; + pcbWritten: PLongint): HResult; + end; + +function GetErrorInfo(dwReserved: Longint; out errinfo: IErrorInfo): HResult; +function CoGetMalloc(dwMemContext: Longint; out malloc: IMalloc): HResult; + +implementation + +uses + SysUtils; + +(* +procedure SetOleVariant(pValue: POleVariant; const Value: OleVariant); +var + Temp: TBytes; +begin + SetLength(Temp, 16); + Marshal.Copy(pValue, Temp, 0, 16); + Temp[0] := 1; + Marshal.GetNativeVariantForObject(TObject(Value), pValue); + Marshal.Copy(pValue, Temp, 0, 16); + Temp[0] := 2; +end; +*) + +{ PDBProp } + +function PDBProp.GetdwPropertyID: DBPROPID; +begin + Result := DBPROPID(Marshal.ReadInt32(Ptr, 0)); +end; + +procedure PDBProp.SetdwPropertyID(Value: DBPROPID); +begin + Marshal.WriteInt32(Ptr, 0, Integer(Value)); +end; + +function PDBProp.GetdwOptions: DBPROPOPTIONS; +begin + Result := DBPROPID(Marshal.ReadInt32(Ptr, 4)); +end; + +procedure PDBProp.SetdwOptions(Value: DBPROPOPTIONS); +begin + Marshal.WriteInt32(Ptr, 4, Integer(Value)); +end; + +function PDBProp.GetdwStatus: DBPROPSTATUS; +begin + Result := DBPROPID(Marshal.ReadInt32(Ptr, 8)); +end; + +procedure PDBProp.SetdwStatus(Value: DBPROPSTATUS); +begin + Marshal.WriteInt32(Ptr, 8, Integer(Value)); +end; + +function PDBProp.Getcolid: _DBID; +var + Temp: array of byte; +begin +{$IFDEF VER8} + SetLength(Temp, 0); //To avoid compiler warning. Delphi8 bug. +{$ENDIF} + Marshal.Copy(IntPtr(Integer(Ptr) + 12), Temp, 0, Length(DB_NULLID)); + Result := Temp; +end; + +procedure PDBProp.Setcolid(Value: _DBID); +var + Temp: array of byte; +begin + Temp := Value; + Marshal.Copy(Temp, 0, IntPtr(Integer(Ptr) + 12), Length(DB_NULLID)); +end; + +function PDBProp.GetvValue: OleVariant; +var + pValue: POleVariant; +begin + pValue := IntPtr(Integer(Ptr) + 12 + 24); + Result := GetOleVariant(pValue); +end; + +procedure PDBProp.SetvValue(Value: OleVariant); +var + pValue: POleVariant; +begin + pValue := IntPtr(Integer(Ptr) + 12 + 24); + SetOleVariant(pValue, Value); +end; + +class operator PDBProp.Implicit(AValue: IntPtr): PDBProp; +begin + Result.Ptr := AValue; +end; + +class operator PDBProp.Implicit(AValue: PDBProp): IntPtr; +begin + Result := AValue.Ptr; +end; + +{ PDBPropSet } + +class operator PDBPropSet.Implicit(AValue: IntPtr): PDBPropSet; +begin + Result.Ptr := AValue; +end; + +class operator PDBPropSet.Implicit(AValue: PDBPropSet): IntPtr; +begin + Result := AValue.Ptr; +end; + +function PDBPropSet.GetrgProperties: PDBPropArray; +begin + Result := Marshal.ReadIntPtr(Ptr); +end; + +procedure PDBPropSet.SetrgProperties(Value: PDBPropArray); +begin + Marshal.WriteIntPtr(Ptr, Value); +end; + +function PDBPropSet.GetcProperties: UINT; +begin + Result := UINT(Marshal.ReadInt32(Ptr, 4)); +end; + +procedure PDBPropSet.SetcProperties(Value: UINT); +begin + Marshal.WriteInt32(Ptr, 4, Integer(Value)); +end; + +function PDBPropSet.GetguidPropertySet: TGUID; +begin + Result := TGUID(Marshal.PtrToStructure(IntPtr(Integer(Ptr) + 8), TypeOf(TGUID))); +end; + +procedure PDBPropSet.SetguidPropertySet(Value: TGUID); +begin + Marshal.StructureToPtr(TObject(Value), IntPtr(Integer(Ptr) + 8), False); +end; + +const + ole32 = 'ole32.dll'; + oleaut32 = 'oleaut32.dll'; + +[DllImport(oleaut32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'GetErrorInfo')] +function GetErrorInfo(dwReserved: Longint; out errinfo: IErrorInfo): HResult; external; + +[DllImport(ole32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'CoGetMalloc')] +function CoGetMalloc(dwMemContext: Longint; out malloc: IMalloc): HResult; external; + +initialization + +end. diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.SdacVcl.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.SdacVcl.pas new file mode 100644 index 0000000..7f357dc --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.Sdac.SdacVcl.pas @@ -0,0 +1,5 @@ +{$I ..\Sdac.inc} + +unit CoreLab.Sdac.SdacVcl; + +{$I ..\SdacVcl.pas} \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/Net/CoreLab.VirtualTable.Design.DacReg.pas b/internal/4.10.0.10/1/Source/Net/CoreLab.VirtualTable.Design.DacReg.pas new file mode 100644 index 0000000..4718523 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/CoreLab.VirtualTable.Design.DacReg.pas @@ -0,0 +1,21 @@ +{$I ..\Dac.inc} + +unit CoreLab.VirtualTable.Design.DacReg; + +{$IFDEF VER9P} + +{$R ..\..\Images\CoreLab.Dac.VirtualTable.TVirtualTable.bmp} +{$R ..\..\Images\CoreLab.Dac.VirtualTable.TVirtualTable16.bmp} +{$R ..\..\Images\CoreLab.Dac.VirtualTable.TVirtualTable32.bmp} +{$R ..\..\Images\CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp} +{$R ..\..\Images\CoreLab.Dac.CRBatchMove.TCRBatchMove16.bmp} +{$R ..\..\Images\CoreLab.Dac.CRBatchMove.TCRBatchMove32.bmp} + +{$ELSE} + +{$R ..\..\Images\Delphi8\CoreLab.Dac.VirtualTable.TVirtualTable.bmp} +{$R ..\..\Images\Delphi8\CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp} + +{$ENDIF} + +{$I ..\DacReg.pas} diff --git a/internal/4.10.0.10/1/Source/Net/Dac.inc b/internal/4.10.0.10/1/Source/Net/Dac.inc new file mode 100644 index 0000000..3f676f3 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/Dac.inc @@ -0,0 +1 @@ +{$I ..\Dac.inc} diff --git a/internal/4.10.0.10/1/Source/Net/DacGui.inc b/internal/4.10.0.10/1/Source/Net/DacGui.inc new file mode 100644 index 0000000..bcc0d73 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/DacGui.inc @@ -0,0 +1 @@ +{$I ..\DacGui.inc} diff --git a/internal/4.10.0.10/1/Source/Net/DacVer.inc b/internal/4.10.0.10/1/Source/Net/DacVer.inc new file mode 100644 index 0000000..1f39c7b --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/DacVer.inc @@ -0,0 +1 @@ +{$I ..\DacVer.inc} diff --git a/internal/4.10.0.10/1/Source/Net/SdacGui.inc b/internal/4.10.0.10/1/Source/Net/SdacGui.inc new file mode 100644 index 0000000..52073dc --- /dev/null +++ b/internal/4.10.0.10/1/Source/Net/SdacGui.inc @@ -0,0 +1 @@ +{$I ..\SdacGui.inc} diff --git a/internal/4.10.0.10/1/Source/OLEDBAccess.pas b/internal/4.10.0.10/1/Source/OLEDBAccess.pas new file mode 100644 index 0000000..e1df3ad --- /dev/null +++ b/internal/4.10.0.10/1/Source/OLEDBAccess.pas @@ -0,0 +1,10207 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// Access via OLE DB +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit OLEDBAccess; +{$ENDIF} + +interface + +uses +{$IFDEF CLR} + Borland.Vcl.TypInfo, Variants, +{$ELSE} + CLRClasses, +{$ENDIF} + Windows, Classes, DBConsts, +{$IFNDEF LITE} + DB, DBAccess, +{$ENDIF} +{$IFDEF VER6P} + FMTBcd, +{$ENDIF} + DAConsts, SysUtils, ActiveX, SyncObjs, OLEDBC, OLEDBIntf, CRAccess, MemData, + MSConsts, CRThread, ComObj; + +const + DefaultSDACDatabase = 'master'; + DefaultPacketSize = 4096; + DefaultConnectionTimeout = 15; + + OLE_DB_INDICATOR_SIZE = sizeof(DWORD); + + MaxNonBlobFieldLen = 8000; // Maximum length of "char", "varchar", "nchar", "nvarchar", fields + + // properties + prOleDBBase = 1000; + + // connection properties + prDatabase = prOleDBBase; // string + prIsolationLevel = prOleDBBase + 1; // TIsolationLevel + prAuthentication = prOleDBBase + 2; // TMSAuthentication + + // dataset options + prReadOnly = prOleDBBase + 6; // boolean + prEnableBCD = prOleDBBase + 7; // boolean + prUniqueRecords = prOleDBBase + 8; // boolean + prCursorType = prOleDBBase + 9; // TMSCursorType + prRequestSQLObjects = prOleDBBase + 10; // boolean + prCursorUpdate = prOleDBBase + 12; // boolean + prLockClearMultipleResults = prOleDBBase + 13; // boolean + prConnectionTimeout = prOleDBBase + 14; // integer + prCommandTimeout = prOleDBBase + 15; // integer + prQuotedIdentifier = prOleDBBase + 16; // boolean + prLanguage = prOleDBBase + 17; // string + prEncrypt = prOleDBBase + 18; // boolean + prNetworkLibrary = prOleDBBase + 19; // string + prPacketSize = prOleDBBase + 20; // integer + prRoAfterUpdate = prOleDBBase + 21; // boolean + //prMultipleConnections = prOleDBBase + 18; // boolean + // if False then unicode fields is supported as TStringsField else as TWideStringField + prWideStrings = prOleDBBase + 22; // boolean + prApplicationName = prOleDBBase + 23; // string + prWorkstationID = prOleDBBase + 24; // string +{$IFDEF VER6P} + prEnableFMTBCD = prOleDBBase + 25; // boolean +{$ENDIF} + prAutoTranslate = prOleDBBase + 26; // boolean + prIsSProc = prOleDBBase + 27; // boolean + prProvider = prOleDBBase + 28; // string + prCanReadParams = prOleDBBase + 29; // boolean + prPersistSecurityInfo = prOleDBBase + 30; // boolean + prInitialFileName = prOleDBBase + 31; // string + prMARS = prOleDBBase + 32; // boolean + prSmartRefresh = prOleDBBase + 33; // boolean + prSmartRefreshMsg = prOleDBBase + 34; // string + prSmartRefreshService = prOleDBBase + 35; // string + prNonBlocking = prOleDBBase + 36; // boolean + prOldPassword = prOleDBBase + 37; // string + prMaxDatabaseSize = prOleDBBase + 38; // integer + prFailoverPartner = prOleDBBase + 39; // string + +type + TCursorTypeChangedProc = procedure of object; + TMSCursorType = (ctDefaultResultSet, ctStatic, ctKeyset, ctDynamic); + TMSCursorTypes = set of TMSCursorType; + + TReadParamsProc = procedure of object; + +{ internal data types } +const + dtMSXML = 100; + +{ internal sub data types } +const + dtChar = 20; + dtText = 22; + dtWide = $8000; + +const + ServerCursorTypes: TMSCursorTypes = [ctStatic, ctKeyset, ctDynamic]; + +type + TOLEDBParamDesc = class(TParamDesc) + protected + FOLEDBType: DBTYPE; // Native OLE DB datatype + FUseDefaultValue: boolean; + + property OLEDBType: DBTYPE read FOLEDBType write FOLEDBType; + property UseDefaultValue: boolean read FUseDefaultValue write FUseDefaultValue; + public + function GetOLEDBType: DBTYPE; + procedure SetOLEDBType(Value: DBTYPE); virtual; + + function GetUseDefaultValue: boolean; + procedure SetUseDefaultValue(Value: boolean); + + function GetValue: variant; override; + function GetAsBlobRef: TBlob; + + procedure SetNull(const Value: boolean); override; + end; + + TRunMethod = procedure of object; + + TOLEDBThreadWrapper = class(TCRThreadWrapper) + protected + procedure DoException(E: Exception); override; + end; + + TExecuteThread = class(TCRThread) + protected + FRunMethod: TRunMethod; + procedure InternalExecute; override; + {$IFDEF CLR} + property Terminated; + {$ENDIF} + end; + +{ TOLEDBConnection } + + TOLEDBProvider = (prAuto, prSQL, prNativeClient, prCompact); + + TMSAuthentication = (auWindows, auServer); + + TIsolationLevel = (ilReadCommitted, ilReadUnCommitted, ilRepeatableRead, ilIsolated, ilSnapshot); + + EMSError = class; + // TMSErrorProc = procedure (E: {$IFDEF LITE}Exception{$ELSE}EDAError{$ENDIF}; var Fail: boolean) of object; + TMSInfoMessageProc = procedure (E: EMSError) of object; + + // ---------- + // Must be declared before(!) TOLEDBConnection declaration to prevent CBuilder compiler bug (pas -> hpp) + + { + AccessorBlock types: + 1. Ordinary. May contain many ordinary fields and only one BLOB field + 1.1. For DefaultResultSet or for CursorUpdate = False. All fields in block must be not ReadOnly + 1.2. In other cases ReadOnly and not ReadOnly fields may contains in one AccessorBlock + 2. ReadOnly. Used only for KeySet and Dynamic if CursorUpdate is True. All fields in block must be ReadOnly + 3. BLOB. May contain only one BLOB field + 4. FetchBlock. Used for dtVariant and dtMemo (not BLOB) fields + + RecordSet may contain only one each of accessor types, and some BLOB accessors if need + } + + TAccessorBlockType = (abOrdinary, abReadOnly, abBLOB, abFetchBlock); + TAccessorBlock = record + BlockType: TAccessorBlockType; + hAcc: HACCESSOR; // OLE DB accessor + BlobFieldNum: integer; // -1, if BLOB field not avaible. This member useful to fetch BLOB streams + FieldNums: array of integer; + end; + + TOLEDBRecordSet = class; + TRestrictions = array of OleVariant; + + TOLEDBConnection = class (TCRConnection) + protected + //FIMalloc: IMalloc; + + { DataSource } + FIDBInitialize: IDBInitialize; + FIDBProperties: IDBProperties; + FIDBCreateSession: IDBCreateSession; + + { Session } + FISessionProperties: ISessionProperties; + FITransactionLocal: ITransactionLocal; + + FCommand: TCRCommand; // Used for ExecSQL. Created on first use + + FDatabase: string; + FIsolationLevel: TIsolationLevel; + // FMultipleConnections: boolean; + FMaxDatabaseSize: integer; // Comact Edition + + FAuthentication: TMSAuthentication; + FProvider: TOLEDBProvider; + + // Init properties + FConnectionTimeout: integer; + FQuotedIdentifier: boolean; + FLanguage: string; + FAutoTranslate: boolean; + FEncrypt: boolean; + FPersistSecurityInfo: boolean; + FNetworkLibrary: string; + FPacketSize: integer; + FApplicationName: string; + FWorkstationID: string; + FInitialFileName: string; + FFailoverPartner: string; + FMultipleActiveResultSets: boolean; + FOldPassword: string; + + FDBMSName: string; + FDBMSVer: string; + FDBMSPrimaryVer: integer; + FProviderFriendlyName: string; + FProviderVer: string; + FProviderPrimaryVer: integer; + FProviderId: TGuid; + + FColumnsRowsetFieldDescs: TFieldDescs; // FieldDescs for non-Native rowsets + FColumnsMetaInfo: TOLEDBRecordSet; // ColumnsRowset + {$IFNDEF LITE} + FFldCatalogNameIdx, FFldSchemaNameIdx, FFldTableNameIdx, FFldColumnNameIdx, + FFldFieldNameIdx, FFldActualFieldNameIdx, FFldPrecisionIdx, FFldScaleIdx, FFldGuidIdx: integer; + FFldColumnNumberIdx, FFldIsAutoIncIdx, FFldTypeIdx, FFldFlagsIdx, FFldColumnSizeIdx, FFldComputeModeIdx: integer; + FFldXMLSchemaCollCatalogNameIdx, FFldXMLSchemaCollSchemaNameIdx, FFldXMLSchemaCollNameIdx: integer; + {$ENDIF} + + FOnInfoMessage: TMSInfoMessageProc; + + procedure ReleaseInterfaces; + function GetSchemaRowset(const Schema: TGUID; rgRestrictions: TRestrictions): IRowset; + + procedure GetConnectionProperties; + procedure SetConnectionProperties; + + procedure SetQuotedIdentifier(const Value: boolean); + + procedure ExecSQL(const Text: string); + + class procedure AssignFieldDescs(Source, Dest: TFieldDescs); + + {$IFDEF CLR} + procedure DoError(E: Exception; var Fail: boolean); override; + {$ENDIF} + procedure CreateDatabase(const Database: string; const Password: string; const Encrypted: boolean); + public + constructor Create; override; + destructor Destroy; override; + + procedure Check(const Status: HRESULT; Component: TObject); virtual; + procedure OLEDBError(const ErrorCode: HRESULT; Component: TObject); + + procedure Connect(const ConnectString: string); override; + procedure Disconnect; override; + + procedure Assign(Source: TOLEDBConnection); + + procedure SetIDBCreateSession(CreateSession: IDBCreateSession); + + { Transaction control } + procedure StartTransaction; override; + procedure Commit; override; + procedure Rollback; override; + + function SetProp(Prop: integer; const Value: variant): boolean; override; + function GetProp(Prop: integer; var Value: variant): boolean; override; + + procedure SetDatabase(const Value: string); + + function CheckIsValid: boolean; override; + + //property Malloc: IMalloc read FIMalloc; + property SessionProperties: ISessionProperties read FISessionProperties; + property DBProperties: IDBProperties read FIDBProperties; + + property DBMSName: string read FDBMSName; + property DBMSVer: string read FDBMSVer; + property DBMSPrimaryVer: integer read FDBMSPrimaryVer; + property ProviderFriendlyName: string read FProviderFriendlyName; + property ProviderVer: string read FProviderVer; + property ProviderPrimaryVer: integer read FProviderPrimaryVer; + + property OnInfoMessage: TMSInfoMessageProc read FOnInfoMessage write FOnInfoMessage; + end; + +{ TOLEDBCommand } + TIntPtrDynArray = array of IntPtr; + + TParamsAccessorData = record + Accessor: IAccessor; + ExecuteParams: DBPARAMS; + rgBindings: TDBBindingArray; + end; + + TOLEDBCommand = class (TCRCommand) + protected + FQueryIntCnt: integer; // Quantity of calls to QueryInterfaces + FIsSProc: boolean; + FRPCCall: boolean; + + FPrepared: boolean; + FConnection: TOLEDBConnection; + + FBreakExecCS: TCriticalSection; // Used to prevent clear FICommandText on BreakExec + FWaitForBreak: boolean; + + // If statement executed w/o errors and warnings then FLastExecWarning is False + // If statement executed with warning then FLastExecWarning is True + // If statement executed with error then raising exception + // Used to analyze CursorType changes in RecordSet + FLastExecWarning: boolean; + + FCommandTimeout: integer; + + { Smart Refresh} + FSmartRefresh: boolean; + FSmartRefreshMsg: string; + FSmartRefreshService: string; + + { NonBlocking} + FNonBlocking: boolean; + FISSAsynchStatus: ISSAsynchStatus; + FExecutor: TOLEDBThreadWrapper; + + { Command } + FICommandText: ICommandText; + FICommandPrepare: ICommandPrepare; + FICommandProperties: ICommandProperties; + + { Rowset } + FRequestIUnknown: boolean; // Indicate current command owner - MSSQL(False) or MSDataSet(True) + FRequestMultipleResults: boolean; // True for ctDefaultResultSet only + FIUnknown: IUnknown; // If requested then must be setted to a nil as it possible + FIUnknownNext: IUnknown; + FIMultipleResults: IMultipleResults; + + FCursorState: TCursorState; + + { Params } + FParamsAccessorData: TParamsAccessorData; + FParamsAccessorDataAvaible: boolean; + FCanReadParams: boolean; + {$IFDEF CLR} + FParamsGC: TIntPtrDynArray; // List of AllocGCHandle(ParamDesc.Value, True) + {$ENDIF} + + { Rows } + FRowsAffected: integer; + FRowsAffectedNext: integer; + + FReadParams: TReadParamsProc; + FNextResultRequested: boolean; // FIUnknownNext getted from OLE DB + + procedure Check(const Status: HRESULT); virtual; + procedure QueryInterfaces(const QueryPrepare: boolean); // QueryPrepare must be True to request IID_ICommandPrepare + procedure ReleaseInterfaces; + + procedure SetCommandProp; + procedure SetParameterInfo; + + { Params } + procedure CreateAndFillParamAccs; + procedure RequestParamsIfPossible; // Call RequestAndFreeParamAccs if interfaces is cleared + + procedure CheckAndAnalyze(const Status: HRESULT); + procedure GetNextResult(out ResultSet: IUnknown; out RowsAffected: integer); + + public + constructor Create; override; + destructor Destroy; override; + + procedure Prepare; override; + procedure Unprepare; override; + function GetPrepared: boolean; override; + + function CreateProcCall(Name: string; const NeedDescribe: boolean; const WideStrings: boolean; + const EnableBcd: boolean; const EnableFmtBcd: boolean): string; + procedure Execute(Iters: integer = 1); override; + procedure DoExecuteTerminate(Sender: TObject); + procedure DoExecuteException(Sender: TObject; E: Exception; var Fail: boolean); + procedure WaitAsynchCompletion; + procedure EndExecute(E: Exception); + + procedure SetConnection(Value: TCRConnection); override; + function GetCursorState: TCursorState; override; + procedure SetCursorState(Value: TCursorState); override; + + function GetProp(Prop: integer; var Value: variant): boolean; override; + function SetProp(Prop: integer; const Value: variant): boolean; override; + + procedure BreakExec; + + // Interface management + function IUnknownIsNull: boolean; + function IUnknownNextIsNull: boolean; + function IMultipleResultsIsNull: boolean; + function ISSAsynchStatusIsNull: boolean; + procedure ClearIUnknown; + procedure ClearIUnknownNext; + procedure ClearIMultipleResults; + procedure ClearISSAsynchStatus; + + { Params } + function GetParamDescType: TParamDescClass; override; + function AddParam: TParamDesc; override; + function GetParam(Index: integer): TOLEDBParamDesc; + property Params; + + property ReadParams: TReadParamsProc read FReadParams write FReadParams; + property Executing; + end; + + +{ TOLEDBRecordSet } + + TFetchAccessorData = record + Accessor: IAccessor; + + AccessorBlocks: array of TAccessorBlock; + end; + + TOLEDBFieldDesc = class (TCRFieldDesc) + private + FOLEDBType: DBTYPE; // Native OLE DB datatype + FIsAutoIncrement: boolean; + FBaseCatalogName: string; + FBaseColumnName: string; + FBaseSchemaName: string; + FBaseTableName: string; + FIsTimestamp: boolean; + FXMLSchemaCollectionCatalogName: string; + FXMLSchemaCollectionSchemaName: string; + FXMLSchemaCollectionName: string; + FXMLTyped: boolean; + public + function ActualNameQuoted(RecordSet: TCRRecordSet; const QuoteNames: boolean): string; override; + + property OLEDBType: DBTYPE read FOLEDBType; // Native OLE DB datatype + + property BaseCatalogName: string read FBaseCatalogName; + property BaseSchemaName: string read FBaseSchemaName; + property BaseTableName: string read FBaseTableName; + property BaseColumnName: string read FBaseColumnName; + property IsAutoIncrement: boolean read FIsAutoIncrement; + property IsTimestamp: boolean read FIsTimestamp; + + property XMLSchemaCollectionCatalogName: string read FXMLSchemaCollectionCatalogName; + property XMLSchemaCollectionSchemaName: string read FXMLSchemaCollectionSchemaName; + property XMLSchemaCollectionName: string read FXMLSchemaCollectionName; + property XMLTyped: boolean read FXMLTyped; + end; + + TOLEDBTableInfo = class(TCRTableInfo) + protected + FMaxTimestamp: Int64; + public + class function LeftQuote: Char; override; + class function RightQuote: Char; override; + property MaxTimestamp: Int64 read FMaxTimestamp write FMaxTimestamp; + end; + + TOLEDBRecordSet = class (TCRRecordSet) + private + FProviderPrimaryVer: integer; + FDBMSPrimaryVer: integer; + FProviderId: TGuid; + FProvider: TOLEDBProvider; + FDisconnectedMode: boolean; + FDatabase: string; + function GetProviderPrimaryVer: integer; + function GetDBMSPrimaryVer: integer; + function GetProviderId: TGuid; + function GetProvider: TOLEDBProvider; + function GetDisconnectedMode: boolean; + function GetDatabase: string; + protected + FLockClearMultipleResults: boolean; // Used to prevent clear FCommand.FIMultipleResult on Close by OpenNext + FroAfterUpdate: boolean; // DataSet.RefreshOptions.roAfterUpdate + + FNativeRowset: boolean; // For non-native rowsets output parameters not supported + FIsColumnsRowset: boolean; // If True then FieldDescs was stored in FColumnsRowsetFieldDescs + + FCommand: TOLEDBCommand; + FFetchAccessorData: TFetchAccessorData; + + { Rowset } + FIRowset: IRowset; + FIRowsetLocate: IRowsetLocate; + FIRowsetUpdate: IRowsetUpdate; + + FCursorType: TMSCursorType; + FReadOnly: boolean; + + FRequestSQLObjects: boolean; + + FEnableBCD: boolean; + {$IFDEF VER6P} + FEnableFMTBCD: boolean; + {$ENDIF} + FUniqueRecords: boolean; + FWideStrings: boolean; + + // Bookmarks + FFetchFromBookmark: boolean; + FProcessDynBofEof: boolean; // True, if processing NoResult for ctDynamic + FBookmarkValue: integer; // OLEDB IRowsetLocate Bookmark value. If FBookmarkValue = - 1 then last fetch is not OK for KeySet cursor + FBookmarkSize: integer; // OLEDB IRowsetLocate Bookmark size. If FBookmarkSize = 4 then bookmark is ordinal otherwise bookmark is special (DBBMK_LAST, DBBMK_FIRST) + FBookmarkOffset: integer; // Offset from pHBlock to bookmark field value + + FFetchBlock: IntPtr; + FFetchBlockSize: integer; + FLastFetchOK: boolean; // True, if previous Fetch was called succesfulity (Result is True) + FLastFetchEnd: boolean; // True, If previous FIRowset.GetNextRows has return DB_S_ENDOFROWSET + FLastFetchBack: boolean; // True, if previous Fetch was called with True parameter + + // HRow for IRowsetUpdate + FHRow: HRow; + FHRowAccessible: boolean; // True, if FHRow is setted to valid value + + FCursorUpdate: boolean; + + FCursorTypeChanged: TCursorTypeChangedProc; + + FSchema: TGUID; + FRestrictions: TRestrictions; + + FFetching: boolean; + FFetchExecutor: TOLEDBThreadWrapper; + FBeforeFetch: boolean; + FAfterFetch: boolean; + + FPopulatingKeyInfo: boolean; + + procedure ClearHRowIfNeed; + + procedure Check(const Status: HRESULT); virtual; + procedure CheckBCDOverflow(const FieldNo: integer {from 1}; RecBuf: IntPtr); + procedure CheckAndAnalyzeFieldsStatus(const Status: HRESULT; const pRec: IntPtr); + + procedure QueryCommandInterfaces(const QueryPrepare: boolean); // Create ConnectionSwap if need. Call FCommand.QueryInterfaces. + procedure ReleaseCommandInterfaces; + procedure QueryRecordSetInterfaces; // Reqests IRowset, IRowsetLocate, IRowsetUpdate + procedure ReleaseRecordSetInterfaces; + procedure ReleaseAllInterfaces(const ReleaseMultipleResults: boolean); + + procedure CreateCommand; override; + procedure SetCommand(Value: TCRCommand); override; + + { Open / Close } + function NeedInitFields: boolean; override; + procedure InternalPrepare; override; + procedure InternalUnPrepare; override; + procedure InternalOpen; override; + procedure InternalClose; override; + + { Fields } + procedure InternalInitFields; override; + function GetIndicatorSize: word; override; + + { Fetch } + procedure AllocFetchBlock; // Also create fetch accessors + function Fetch(FetchBack: boolean = False): boolean; override; + procedure FreeFetchBlock; // Also free fetch accessors + function CanFetchBack: boolean; override; // Return True, if BlockMan is store only one block of records + + { Modify } + procedure RowsetUpdateCommit; + procedure RowsetUpdateRollback; + procedure InternalAppend(RecBuf: IntPtr); override; + procedure InternalDelete; override; + procedure InternalUpdate(RecBuf: IntPtr); override; + procedure InternalAppendOrUpdate(RecBuf: IntPtr; const IsAppend: boolean); + + procedure SetCommandProp; + + procedure RequestParamsIfPossible; // Call FCommand.RequestAndFreeParamAccs if interfaces is cleared + + { TablesInfo } + class function GetTableInfoClass: TTableInfoClass; override; + + //PreCached FConection properties + property ProviderPrimaryVer: integer read GetProviderPrimaryVer; + property DBMSPrimaryVer: integer read GetDBMSPrimaryVer; + property ProviderID: TGuid read GetProviderId; + property Provider: TOLEDBProvider read GetProvider; + property DisconnectedMode: boolean read GetDisconnectedMode; + property Database: string read GetDatabase; + public + constructor Create; override; + destructor Destroy; override; + + { Fields} + function GetFieldDescType: TFieldDescClass; override; + + { Open / Close } + procedure ExecCommand; override; + procedure Open; override; + procedure Reopen; override; + function GetSchemaRowset(const Schema: TGUID; rgRestrictions: TRestrictions): IRowset; + procedure Disconnect; override; + + { Fetch } + procedure FetchAll; override; + procedure DoFetchAll; virtual; + procedure DoFetchTerminate(Sender: TObject); + procedure DoFetchException(Sender: TObject; E: Exception; var Fail: boolean); + procedure DoFetchSendEvent(Sender: TObject; Event: TObject); + procedure EndFetchAll(E: Exception); virtual; + procedure BreakFetch; override; + function CanDisconnect: boolean; override; + + { Fields } + function GetNull(FieldNo: word; RecBuf: IntPtr): boolean; override; + procedure SetNull(FieldNo: word; RecBuf: IntPtr; Value: boolean); override; + function GetStatus(FieldNo: word; RecBuf: IntPtr): DWORD; + procedure SetStatus(FieldNo: word; RecBuf: IntPtr; Value: DWORD); + procedure GetFieldData(Field: TFieldDesc; RecBuf: IntPtr; Dest: IntPtr); override; + procedure GetFieldAsVariant(FieldNo: word; RecBuf: IntPtr; var Value: variant);override; + procedure PutFieldData(Field: TFieldDesc; RecBuf: IntPtr; Source: IntPtr); override; + function IsBlobFieldType(DataType: word): boolean; override; + + { Records } + procedure InsertRecord(RecBuf: IntPtr); override; + procedure UpdateRecord(RecBuf: IntPtr); override; + procedure DeleteRecord; override; + + { Sorting } + procedure SetIndexFieldNames(Value: string); override; + + { Filter/Find/Locate } + + procedure CreateComplexField(RecBuf: IntPtr; FieldIndex: integer; WithBlob: boolean); override; + procedure CreateComplexFields(RecBuf: IntPtr; WithBlob: boolean); override; + procedure FreeComplexFields(RecBuf: IntPtr; WithBlob: boolean); override; + + { Navigation } + procedure SetToBegin; override; + procedure SetToEnd; override; + //procedure GetBookmark(Bookmark: PRecBookmark); override; + procedure SetToBookmark(Bookmark: PRecBookmark); override; + function FetchToBookmarkValue(FetchBack: boolean = False): boolean; // Fetch to Bookmark. Bookmark value is stored in FBookmarkValue. Bookmark value used only for ctStatic and ctKeyset. For ctDynamic method refetched current record in specified direction + function CompareBookmarks(Bookmark1, Bookmark2: PRecBookmark): integer; override; + + function RowsReturn: boolean; override; + + function GetIRowset: IRowset; + function GetICommandText: ICommandText; + procedure SetIRowset( + Rowset: IRowset; + const IsColumnsRowset: boolean); // If True then FieldDescs was stored in FColumnsRowsetFieldDescs + + function GetProp(Prop: integer; var Value: variant): boolean; override; + function SetProp(Prop: integer; const Value: variant): boolean; override; + + property NativeRowset: boolean read FNativeRowset; + property CursorTypeChanged: TCursorTypeChangedProc read FCursorTypeChanged write FCursorTypeChanged; + + property FetchExecutor: TOLEDBThreadWrapper read FFetchExecutor; + end; + +{ TOLEDBPropertiesSet } + + TOLEDBPropertiesSet = class + protected + FConnection: TOLEDBConnection; + FInitPropSet: PDBPROPSET; + + procedure Check(const Status: HRESULT); + function GetInitPropSetStatus: string; + function GetDBPropPtr(Index: UINT): PDBProp; + + function InitProp(const dwPropertyID: DBPROPID; const Required: boolean = False): PDBProp; + + public + constructor Create(Connection: TOLEDBConnection; const GuidPropertySet: TGUID); + destructor Destroy; override; + +// procedure AddProp(const dwPropertyID: DBPROPID; const Value: OleVariant); + procedure AddPropSmallInt(const dwPropertyID: DBPROPID; const Value: smallint); + + procedure AddPropInt(const dwPropertyID: DBPROPID; const Value: integer); + procedure AddPropBool(const dwPropertyID: DBPROPID; const Value: boolean; const Required: boolean = False); + procedure AddPropStr(const dwPropertyID: DBPROPID; const Value: string; const Required: boolean = False); + + procedure SetProperties(Obj: IDBProperties); overload; + procedure SetProperties(Obj: ISessionProperties); overload; + procedure SetProperties(Obj: ICommandProperties); overload; + + property InitPropSet: PDBPROPSET read FInitPropSet; + end; + +{ TOLEDBPropertiesGet } + + TPropValues = array of Variant; + + TOLEDBPropertiesGet = class + protected + FConnection: TOLEDBConnection; + FInitPropSet: PDBPROPSET; + + FPropIds: array of DBPROPID; + FPropIdsGC: IntPtr; + + procedure Check(const Status: HRESULT); + function GetDBPropPtr(rgProperties: PDBPropArray; Index: UINT): PDBProp; + + procedure PrepareToGet; + procedure ProcessResult(rgPropertySets: PDBPropSet; var PropValues: TPropValues); + procedure ClearResult(rgPropertySets: PDBPropSet); + + public + constructor Create(Connection: TOLEDBConnection; const GuidPropertySet: TGUID); + destructor Destroy; override; + + procedure AddPropId(Id: DBPROPID); + + procedure GetProperties(Obj: IDBProperties; var PropValues: TPropValues); overload; + procedure GetProperties(Obj: IRowsetInfo; var PropValues: TPropValues); overload; + procedure GetProperties(Obj: ICommandProperties; var PropValues: TPropValues); overload; + end; + +{ TOLEDBErrors } + EOLEDBError = class; + + TOLEDBErrors = class + protected + FList: TList; + + function GetCount: integer; + function GetError(Index: Integer): EOLEDBError; + + procedure Assign(Source: TOLEDBErrors); + procedure Clear; + + public + constructor Create; + destructor Destroy; override; + + property Count: integer read GetCount; + property Errors[Index: Integer]: EOLEDBError read GetError; default; + end; + +{ EOLEDBError } + +{$IFDEF LITE} + EOLEDBError = class(Exception) + protected + FErrorCode: integer; + + public + property ErrorCode: integer read FErrorCode; + +{$ELSE} + EOLEDBError = class(EDAError) +{$ENDIF} + protected + FErrors: TOLEDBErrors; + FOLEDBErrorCode: integer; + + // GetBasicErrorInfo - ERRORINFO struct + // FhrError: HResult; - equal to FOLEDBErrorCode + // FMinor: UINT; - only for EMSError and equal to FMSSQLErrorCode + // Fclsid: TGUID; - always CLSID_SQLOLEDB + Fiid: TGUID; + // Fdispid: Integer; - always 0 + + // GetErrorInfo - IErrorInfo interface + // Fguid: TGUID; - same as Fiid + // FSource: WideString; - always "Microsoft OLE DB Provider for SQL Server" + // FDescription: WideString; - equal to Message + // FHelpFile: WideString; - not used by sqloledb + // FHelpContext: Longint; - not used by sqloledb + + FMessageWide: WideString; + + function GetErrorCount: integer; + function GetError(Index: Integer): EOLEDBError; + + procedure Assign(Source: EOLEDBError); virtual; + + protected + property iid: TGUID read Fiid; + + public + constructor Create(ErrorCode: integer; Msg: WideString); + destructor Destroy; override; + + property ErrorCount: integer read GetErrorCount; + property Errors[Index: Integer]: EOLEDBError read GetError; default; + + property OLEDBErrorCode: integer read FOLEDBErrorCode; + property MessageWide: WideString read FMessageWide; + // property hrError: HResult read FhrError; + // property Minor: UINT read FMinor; + // property clsid: TGUID read Fclsid; + // property iid: TGUID read Fiid; - protected + // property dispid: Integer read Fdispid; + // property Source: WideString read FSource; + // property Description: WideString read FDescription; + end; + + +{ EMSError } + + EMSError = class(EOLEDBError) + protected + FMSSQLErrorCode: integer; + + FServerName: string; + FProcName: string; + FState: BYTE; + FSeverityClass: BYTE; + FLineNumber: WORD; + FLastMessage: string; + + procedure Assign(Source: EOLEDBError); override; + + public + constructor Create( + const pServerErrorInfo: SSERRORINFO; + OLEDBErrorCode: integer; + Msg: WideString); overload; + + property MSSQLErrorCode: integer read FMSSQLErrorCode; + property ServerName: string read FServerName; + property ProcName: string read FProcName; + property State: BYTE read FState; + property SeverityClass: BYTE read FSeverityClass; + property LineNumber: WORD read FLineNumber; + + property LastMessage: string read FLastMessage; + end; + + function ConvertInternalTypeToOLEDB(const InternalType: word; const IsParam: boolean; + ServerVersion: Integer): word; + + function ConvertOLEDBTypeToInternalFormat( + const OLEDBType: DBTYPE; + const IsLong: Boolean; + const EnableBCD, EnableFMTBCD: boolean; + const WideStrings: boolean; + const IsParam: boolean; + var InternalType: word; ServerVersion: Integer): boolean; + + function DBNumericToBCD(Value: TDBNumeric): TBCD; + function BcdToDBNumeric(const Bcd: TBcd): TDBNumeric; + + function DBNumericToDouble(Value: TDBNumeric): double; + function DoubleToDBNumeric(Value: double; Precision, Scale: integer): TDBNumeric; + + function IsLargeDataTypeUsed(const FieldDesc: TFieldDesc): boolean; overload; + function IsLargeDataTypeUsed(const ParamDesc: TParamDesc): boolean; overload; + + function GetProviderName(const Provider: TOLEDBProvider): string; + function GetProvider(const ProviderName: string): TOLEDBProvider; +const + slDelimiter = #1; + + function BracketIfNeed(const Value: string): string; overload; + function BracketIfNeed(const Value: string; const LeftQ: char; const RightQ: char): string; overload; + function UnbracketIfPossible(const Value: string): string; overload; + function UnbracketIfPossible(const Value: string; var sl: string {Result parts in reverse order delimited by slDelimiter}): string; overload; + function UnbracketIfPossible(const Value: string; out DataBase: string; out Owner: string; out ObjName: string): string; overload; + + function GenerateTableName(const CatalogName: string; + const SchemaName: string; + const TableName: string; + const DefaultCatalogName: string): string; + + function ChangeDecimalSeparator(const Value: Variant): string; + function GetParamNameWODog(const ParamName: string): string; + +{$IFDEF CLR} + procedure QueryIntf(Source: IUnknown; const IID: TInterfaceRef; out Intf); // OLE QueryInterface analog +{$ELSE} + procedure QueryIntf(Source: IUnknown; const IID: TGuid; out Intf); // OLE QueryInterface analog +{$ENDIF} + +{$IFDEF DEBUG} +var + StreamCnt: integer = 0; +{$ENDIF} + +var + __UseRPCCallStyle: boolean; // temporary + ParamsInfoOldBehavior: boolean; // delete 03.06.2006 + +//procedure AddInfoToErr(var S: string; const FormatStr: string; const Args: array of const); overload; // Add additional info to exception message +procedure AddInfoToErr(var E: Exception; const FormatStr: string; const Args: array of const); overload; // Add additional info to exception message + +{$IFDEF SDAC_TEST} +var + __ServerPrepareCount: integer; + __ServerExecuteCount: integer; + __SetCommandPropCount: integer; + __SetRecordSetCommandPropCount: integer; + +{$ENDIF} + +const + LeftQuote = '['; + RightQuote = ']'; + EmptyString = ''; +const + BytesByRef = [dtBlob, dtBytes, dtVarBytes]; + CharsByRef = [dtMemo, dtWideMemo, dtMSXML, dtString, dtWideString]; + +procedure FillBindingForParam(Ordinal: integer; ParamDesc: TOLEDBParamDesc; Connection: TOLEDBConnection; + var pBind: TDBBinding; var BindMemorySize: UINT; const ValueAvaliable: boolean; const IsWide: boolean); + +procedure SaveParamValue(const ParamDesc: TParamDesc; const pBind: TDBBinding; + var ParamsAccessorData: TParamsAccessorData + {$IFDEF HAVE_COMPRESS}; const CompressBlobMode: TCompressBlobMode{$ENDIF} + {$IFDEF CLR}; var ParamsGC: TIntPtrDynArray{$ENDIF}; ServerVersion, ClientVersion: integer); + +implementation + +uses + MemUtils, +{$IFDEF VER6P} + DateUtils, +{$ENDIF} +{$IFDEF CLR} + System.Text, System.Runtime.InteropServices, System.Globalization, System.IO, System.Threading, +{$ELSE} +{$IFDEF VER6P} + Variants, +{$ENDIF} +{$ENDIF} + CRParser, MSParser, Math; + +type + TOLEDBStream = class(TInterfacedObject, ISequentialStream) + protected + FSize: UINT; + FBlob: TBlob; + FPosInBlob: cardinal; + FStreamList: TList; + + public + {$IFDEF CLR} + [PreserveSig] + function Read( + pv: IntPtr; + cb: Longint; + pcbRead: PLongint): HResult; + + [PreserveSig] + function Write( + pv: IntPtr; + cb: Longint; + pcbWritten: PLongint): HResult; + {$ELSE} + function Read(pv: IntPtr; cb: Longint; pcbRead: PLongint): HResult; + stdcall; + function Write(pv: IntPtr; cb: Longint; pcbWritten: PLongint): HResult; + stdcall; + {$ENDIF} + + public + constructor Create(Blob: TBlob {to avoid data copy}; StreamList: TList); + destructor Destroy; override; + + property Size: UINT read FSize; // Return size of stream in bytes + end; + +const + MaxLength = 130; + SizeOfLongWord = 4; + +type +{$IFDEF CLR} + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] +{$ENDIF} + RBigInteger = packed record + Data: array[0..MaxLength - 1] of LongWord; + DataLength: integer; + end; + +const + SizeOfRBigInteger = 524; + +type + PBigInteger = IntPtr; + + TBigIntegerAccessor = class + protected + FSelfAllocated: boolean; + FBigIntegerPtr: PBigInteger; + procedure SetBigIntegerPtr(Value: PBigInteger); + function GetDataLength: integer; + procedure SetDataLength(Value: integer); + function GetDataPtr: IntPtr; + function GetData(Index: integer): LongWord; + procedure SetData(Index: integer; Value: LongWord); + function GetBigInteger: RBigInteger; + procedure SetBigInteger(const Value: RBigInteger); + public + constructor Create(BigIntegerPtr: PBigInteger; Allocate: boolean); + destructor Destroy; override; + procedure ClearData; + property DataLength: integer read GetDataLength write SetDataLength; + property DataPtr: IntPtr read GetDataPtr; + property Data[Index: integer]: LongWord read GetData write SetData; + property BigIntegerPtr: PBigInteger read FBigIntegerPtr write SetBigIntegerPtr; + property BigInteger: RBigInteger read GetBigInteger write SetBigInteger; + end; + + TBigInteger = class + public + class procedure CreatePBigIntegerPtr(PBigInt: PBigInteger); + class procedure CreateRBigIntegerStruct(var BigInt: RBigInteger); + class procedure CreatePBigInteger64(PBigInt: PBigInteger; Value: Int64); + class procedure CreatePBigIntegerBCD(PBigInt: PBigInteger; const Value: TBcd); + + class function Add(PBigInt1: PBigInteger; PBigInt2: PBigInteger): RBigInteger; + class function NEGATEPtr(PBigInt: PBigInteger): RBigInteger; + class function NEGATE(const BigInt: RBigInteger): RBigInteger; + class function Mul(PBigInt1: PBigInteger; PBigInt2: PBigInteger): RBigInteger; + class function Mul64(PBigInt1: PBigInteger; Value: Int64): RBigInteger; + end; + +var + dstSmallint: IntPtr; + dstInt: IntPtr; + dstReal: IntPtr; + dstFloat: IntPtr; + dstMoney: IntPtr; + dstDateTime: IntPtr; + dstNVarChar: IntPtr; + dstNVarCharMax: IntPtr; + dstVarChar: IntPtr; + dstVarCharMax: IntPtr; + + dstBit: IntPtr; + dstTinyInt: IntPtr; + dstBigint: IntPtr; + dstSql_variant: IntPtr; + dstImage: IntPtr; + dstBinary: IntPtr; + dstVarBinary: IntPtr; + dstGuid: IntPtr; + +var + IsWindowsVista: boolean; +{$IFNDEF CLR} + GlobaIMalloc: IMalloc; +{$ENDIF} + +procedure FreeCoMem(ptr: IntPtr); +begin +{$IFDEF CLR} + Marshal.FreeCoTaskMem(ptr); +{$ELSE} + if GlobaIMalloc = nil then + CoGetMalloc(1, GlobaIMalloc); + GlobaIMalloc.Free(ptr); +{$ENDIF} +end; + +{$IFDEF LITE} +procedure DatabaseError(const Message: string; Component: TComponent = nil); +begin + if Assigned(Component) and (Component.Name <> '') then + raise Exception.Create(Format('%s: %s', [Component.Name, Message])) else + raise Exception.Create(Message); +end; + +procedure DatabaseErrorFmt(const Message: string; const Args: array of const; + Component: TComponent = nil); +begin + DatabaseError(Format(Message, Args), Component); +end; +{$ENDIF} + +procedure AddInfoToErr(var S: WideString; const FormatStr: string; const Args: array of const); overload; // Add additional info to exception message +var + s1: WideString; +begin + s1 := Format(FormatStr, Args); + if s1 <> '' then + S := S + #10 + s1; +end; + +procedure AddInfoToErr(var E: Exception; const FormatStr: string; const Args: array of const); overload; // Add additional info to exception message +var + S: WideString; +{ $IFDEF CLR} + ENew: Exception; +{ $ENDIF} +begin + if IsClass(E, EOLEDBError) then + S := EOLEDBError(E).MessageWide + else + S := E.Message; + AddInfoToErr(S, FormatStr, Args); +{ $IFDEF CLR} + if IsClass(E, EMSError) then begin + ENew := EMSError.Create(EMSError(E).ErrorCode, S); + EMSError(ENew).Assign(EMSError(E)); + end + else + if IsClass(E, EOLEDBError) then begin + ENew := EOLEDBError.Create(EOLEDBError(E).ErrorCode, S); + EOLEDBError(ENew).Assign(EOLEDBError(E)); + end + else +{$IFNDEF LITE} + if IsClass(E, EDAError) then + ENew := EDAError.Create(EDAError(E).ErrorCode, S) + else +{$ENDIF} + ENew := Exception.Create(S); + E := ENew; +{ $ELSE} +// E.Message := S; +{ $ENDIF} +end; + +{$WARNINGS OFF} +function ConvertInternalTypeToOLEDB(const InternalType: word; const IsParam: boolean; + ServerVersion: Integer): word; +begin + case InternalType of + // Integer fields + dtBoolean: + Result := DBTYPE_BOOL; + dtInt8: + if ServerVersion <> 3 then + Result := DBTYPE_I1 + else + Result := DBTYPE_UI1; + dtWord: + if ServerVersion <> 3 then + Result := DBTYPE_I2 + else + Result := DBTYPE_UI2; + dtInt16: + Result := DBTYPE_I2; + dtInt32: + Result := DBTYPE_I4; + dtUInt32: + Result := DBTYPE_UI4; + dtInt64: + Result := DBTYPE_I8; + + // Float fields + dtFloat: + Result := DBTYPE_R8; + dtCurrency: + if ServerVersion <> 3 then + Result := DBTYPE_R8 + // Result := DBTYPE_CY; Currency type cannot be used over TCurrencyField uses double to store + else + Result := DBTYPE_CY; + // Multibyte fields + dtDateTime: + if ServerVersion <> 3 then + Result := DBTYPE_DATE + else + Result := DBTYPE_DBTIMESTAMP; + dtDate, dtTime: + Result := DBTYPE_DATE; + dtString: + Result := DBTYPE_STR; + dtWideString: + Result := DBTYPE_WSTR; + dtExtString: + Result := DBTYPE_STR; + dtExtWideString: + Result := DBTYPE_WSTR; + dtBytes, dtVarBytes: + Result := DBTYPE_BYTES; + dtExtVarBytes: + Result := DBTYPE_BYTES; + dtMemo, dtWideMemo, dtMSXML, dtBlob: + Result := DBTYPE_IUNKNOWN; + {$IFDEF VER5P} + dtGuid: + Result := DBTYPE_GUID; + dtVariant: + Result := DBTYPE_VARIANT; + {$ENDIF} + dtBCD: + if ServerVersion <> 3 then + Result := DBTYPE_CY + else + Result := DBTYPE_NUMERIC; + {$IFDEF VER6P} + dtFmtBCD: + if IsParam and (ServerVersion <> 3) then + Result := DBTYPE_STR + else + Result := DBTYPE_NUMERIC; + {$ENDIF} + dtUnknown: + Result := DBTYPE_VARIANT; + else + Assert(False, Format('Invalid internal field type $%X (%d)', [InternalType, InternalType])); + end; +end; +{$WARNINGS ON} + +function ConvertOLEDBTypeToInternalFormat( + const OLEDBType: DBTYPE; + const IsLong: boolean; + const EnableBCD, EnableFMTBCD: boolean; + const WideStrings: boolean; + const IsParam: boolean; + var InternalType: word; ServerVersion: Integer): boolean; +begin + Result := True; + case OLEDBType of // List of types must be synchronized with InternalInitFields types list + // Integer fields + DBTYPE_BOOL: + InternalType := dtBoolean; + DBTYPE_UI1: + InternalType := dtWord; + DBTYPE_I2: + InternalType := dtInt16; + DBTYPE_I4: + InternalType := dtInt32; + DBTYPE_UI2, DBTYPE_UI4:{WAR For OLE DB info only. Signed/unsigned conversion} + if ServerVersion <> 3 then + InternalType := dtInt32 + else + case OLEDBType of + DBTYPE_UI2: + InternalType := dtUInt16; + DBTYPE_UI4: + InternalType := dtUInt32; + end; + DBTYPE_I8: + InternalType := dtInt64; + + // Float fields + DBTYPE_NUMERIC: + if EnableBCD then begin + {$IFDEF VER6P} + if EnableFMTBCD then + InternalType := dtFmtBCD + else + {$ENDIF} + InternalType := dtBCD; + end + else + InternalType := dtFloat; + DBTYPE_R4, DBTYPE_R8: + InternalType := dtFloat; + DBTYPE_CY: + InternalType := dtCurrency; + + // Multibyte fields + DBTYPE_DBTIMESTAMP, DBTYPE_DATE: + InternalType := dtDateTime; + DBTYPE_STR: + begin + if IsLong then + InternalType := dtMemo + else + InternalType := dtString; + end; + DBTYPE_WSTR: + begin + if IsLong then begin + if WideStrings then + InternalType := dtWideMemo + else + InternalType := dtMemo; + end + else + if WideStrings then + InternalType := dtWideString + else + InternalType := dtString; + end; + DBTYPE_BYTES: + begin + if IsLong then + InternalType := dtBlob + else + InternalType := dtBytes; + end; + DBTYPE_GUID: + {$IFDEF VER5P} + InternalType := dtGuid; + {$ELSE} + InternalType := dtString; + {$ENDIF} + DBTYPE_VARIANT: + {$IFDEF VER5P} + {$IFDEF LITE} + InternalType := dtString; + {$ELSE} + {$IFDEF CLR} + if IsParam and (ServerVersion = 9) then + InternalType := dtVariant + else + InternalType := dtString; + {$ELSE} + InternalType := dtVariant; + {$ENDIF} + {$ENDIF} + {$ELSE} + InternalType := dtString; + {$ENDIF} + DBTYPE_XML: + InternalType := dtMSXML; + DBTYPE_UDT: + InternalType := dtVarBytes; + else + Result := False; + end; +end; + +function ConvertCRParamTypeToOLEDB(const InternalType: TParamDirection): word; +begin + case InternalType of + pdUnknown: + Result := DBPARAMIO_INPUT; + pdInput: + Result := DBPARAMIO_INPUT; + pdOutput, pdResult: + Result := DBPARAMIO_OUTPUT; + pdInputOutput: + Result := DBPARAMIO_INPUT + DBPARAMIO_OUTPUT; + else + Result := DBPARAMIO_INPUT; + end; +end; + +{$WARNINGS OFF} +function ConvertOLEDBParamTypeToCR(const Value: word): TParamDirection; +begin + case Value of + DBPARAMTYPE_INPUT: + Result := pdInput; + DBPARAMTYPE_INPUTOUTPUT: + Result := pdInputOutput; + DBPARAMTYPE_RETURNVALUE: + Result := pdResult; + else + Assert(False, Format('Invalid value %d', [Value])); + end; +end; +{$WARNINGS ON} + +{$WARNINGS OFF} +function ConvertIsolationLevelToOLEDBIsoLevel(const Value: TIsolationLevel):Integer; +begin + case Value of + ilReadCommitted: + Result := ISOLATIONLEVEL_READCOMMITTED; + ilReadUnCommitted: + Result := ISOLATIONLEVEL_READUNCOMMITTED; + ilRepeatableRead: + Result := ISOLATIONLEVEL_REPEATABLEREAD; + ilIsolated: + Result := ISOLATIONLEVEL_ISOLATED; + ilSnapshot: + Result := ISOLATIONLEVEL_SNAPSHOT; + else + Assert(False, Format('Invalid value %d', [Integer(Value)])); + end; +end; +{$WARNINGS ON} + +{$IFNDEF CLR} +const + SizeOfFraction = 32; +{$ENDIF} + +function DBNumericToBCD(Value: TDBNumeric): TBCD; +var + i, j, k: integer; + SignificantBytes: integer; + Remainder, tmp: word; +{$IFDEF CLR} + ResultCLR: array[0..33] of byte; +{$ENDIF} + function FindStart: boolean; + begin + SignificantBytes := 16; + while (SignificantBytes > 0) and (Value.Val[SignificantBytes - 1] = 0) do + dec(SignificantBytes); + Result := SignificantBytes > 0; + end; + +begin + if Value.Sign = 0 then + {$IFDEF CLR}ResultCLR[1]{$ELSE}Result.SignSpecialPlaces{$ENDIF} := (1 shl 7) + Value.Scale + else + {$IFDEF CLR}ResultCLR[1]{$ELSE}Result.SignSpecialPlaces{$ENDIF} := (0 shl 7) + Value.Scale; + + if not FindStart then begin + {$IFDEF CLR} + for i := 2 to 33 do + ResultCLR[i] := 0; + Result.FromBytes(ResultCLR); + {$ELSE} + System.FillChar(Result.Fraction, Length(Result.Fraction), 0); + {$ENDIF} + + {$IFDEF CLR}ResultCLR[0]{$ELSE}Result.Precision{$ENDIF} := 8; // if value is zero + {$IFDEF CLR}ResultCLR[1]{$ELSE}Result.SignSpecialPlaces{$ENDIF} := 2; + + {$IFDEF CLR} + Result.FromBytes(ResultCLR); + {$ENDIF} + exit; + end; + + {$IFDEF CLR} + for i := 2 to 33 do + ResultCLR[i] := 0; + Result.FromBytes(ResultCLR); + {$ELSE} + System.FillChar(Result.Fraction, Length(Result.Fraction), 0); + {$ENDIF} + + k := SignificantBytes - 1; + j := 31; + while k >= 0 do begin + Remainder := 0; + for i := k downto 0 do begin + tmp := (Byte(Value.Val[i]) + Remainder); + Value.Val[i] := tmp div 100; + Remainder := (tmp mod 100) shl 8; + end; + {$IFDEF CLR}ResultCLR[j + 2]{$ELSE}Result.Fraction[j]{$ENDIF} := (((Remainder shr 8) mod 10)) + (((Remainder shr 8) div 10) shl 4); + if Value.Val[k] = 0 then + dec(k); + dec(j); + end; + + {$IFDEF CLR}ResultCLR[0]{$ELSE}Result.Precision{$ENDIF} := Value.Precision; + i := 31 - (Value.Precision div 2); + j := i; + + if (Value.Precision mod 2) = 1 then begin + while i <= 30 do begin + {$IFDEF CLR}ResultCLR[i - j + 2]{$ELSE}Result.Fraction[i - j]{$ENDIF} := + ({$IFDEF CLR}ResultCLR[i + 2]{$ELSE}Result.Fraction[i]{$ENDIF} and $0f) shl 4 + + {$IFDEF CLR}ResultCLR[i + 1 + 2]{$ELSE}Result.Fraction[i + 1]{$ENDIF} shr 4; + inc(i); + end; + {$IFDEF CLR}ResultCLR[i - j + 2]{$ELSE}Result.Fraction[i - j]{$ENDIF} := + ({$IFDEF CLR}ResultCLR[i + 2]{$ELSE}Result.Fraction[i]{$ENDIF} and $0f) shl 4; + end + else begin + while i <= 30 do begin + {$IFDEF CLR}ResultCLR[i - j + 2]{$ELSE}Result.Fraction[i - j]{$ENDIF} := + {$IFDEF CLR}ResultCLR[i + 1 + 2]{$ELSE}Result.Fraction[i + 1]{$ENDIF}; + inc(i); + end; + end; + + for i := 31 - j + 1 to 31 do + {$IFDEF CLR}ResultCLR[i + 2]{$ELSE}Result.Fraction[i]{$ENDIF} := 0; +{$IFDEF CLR} + Result := TBcd.FromBytes(ResultCLR); +{$ENDIF} +end; + +{$IFNDEF VER6P} +function IsBcdNegative(const Bcd: TBcd): Boolean; +begin + Result := (Bcd.SignSpecialPlaces and (1 shl 7)) <> 0; +end; +{$ENDIF} + +function BcdToDBNumeric(const Bcd: TBcd): TDBNumeric; +var + Value: TBigIntegerAccessor; + BytesCount: integer; +{$IFDEF CLR} + i: integer; +{$ENDIF} +begin + Value := TBigIntegerAccessor.Create(nil, True); + try + Value.ClearData; + TBigInteger.CreatePBigIntegerBCD(Value.BigIntegerPtr, Bcd); + + if Value.DataLength > (Length(Result.val) div SizeOfLongWord) then + raise Exception.Create(SNumericOverflow); + + Result.precision := Bcd.Precision; + + Result.scale := Bcd.SignSpecialPlaces and $3F; + + if IsBcdNegative(Bcd) then + Result.Sign := 0 + else + Result.Sign := 1; + + BytesCount := Result.precision div 2; + if (Result.precision mod 2) <> 0 then + Inc(BytesCount); + {$IFDEF CLR} + for i := 0 to BytesCount - 1 do + Result.val[i] := Marshal.ReadByte(Value.DataPtr, i); + {$ELSE} + FillChar(@Result.val[0], Length(Result.val), $00); + CopyBuffer(Value.DataPtr, @Result.val[0], BytesCount); + {$ENDIF} + finally + Value.Free; + end; +end; + +{$IFNDEF VER6P} +const + MaxFMTBcdFractionSize = 64; + SInvalidBcdValue = '%s is not a valid BCD value'; + +type +{ Exception classes } + + EBcdException = class(Exception); + EBcdOverflowException = class(EBcdException); + +procedure OverflowError(const Message: string); +begin + raise EBcdOverflowException.Create(Message); +end; + +procedure BcdErrorFmt(const Message, BcdAsString: string); +begin + raise EBcdException.Create(Format(Message, [BcdAsString])); +end; + +function FractionToStr(const pIn: PChar; count: SmallInt; + DecPosition: ShortInt; Negative: Boolean; + StartWithDecimal: Boolean): string; +var + NibblesIn, BytesIn, DigitsOut: Integer; + P, POut: PChar; + Dot: Char; + + procedure AddOneChar(Value: Char); + begin + P[0] := Value; + Inc(P); + Inc(DigitsOut); + end; + procedure AddDigit(Value: Char); + begin + if ((DecPosition > 0) and (NibblesIn = DecPosition)) or + ((NibblesIn = 0) and StartWithDecimal) then + begin + if DigitsOut = 0 then AddOneChar('0'); + AddOneChar(Dot); + end; + if (Value > #0) or (DigitsOut > 0) then + AddOneChar(Char(Integer(Value)+48)); + Inc(NibblesIn); + end; + +begin + POut := AllocMem(Count + 3); // count + negative/decimal/zero + try + Dot := DecimalSeparator; + P := POut; + DigitsOut := 0; + BytesIn := 0; + NibblesIn := 0; + while NibblesIn < Count do + begin + AddDigit(Char(Integer(pIn[BytesIn]) SHR 4)); + if NibblesIn < Count then + AddDigit(Char(Integer(pIn[BytesIn]) AND 15)); + Inc(BytesIn); + end; + while (DecPosition > 0) and (NibblesIn > DecPosition) and (DigitsOut > 1) do + begin + if POut[DigitsOut-1] = '0' then + begin + Dec(DigitsOut); + POut[DigitsOut] := #0; + end else + break; + end; + if POut[DigitsOut-1] = Dot then + Dec(DigitsOut); + POut[DigitsOut] := #0; + SetString(Result, POut, DigitsOut); + finally + FreeMem(POut, Count + 2); + end; + if Result = '' then Result := '0' + else if Negative then Result := '-' + Result; +end; + +function BcdToStr(const Bcd: TBcd): string; +var + NumDigits: Integer; + pStart: PChar; + DecPos: SmallInt; + Negative: Boolean; +begin + if (Bcd.Precision = 0) or (Bcd.Precision > MaxFMTBcdFractionSize) then + OverFlowError(SBcdOverFlow) + else + begin + Negative := Bcd.SignSpecialPlaces and (1 shl 7) <> 0; + NumDigits := Bcd.Precision; + pStart := pCHAR(@Bcd.Fraction); // move to fractions + // use lower 6 bits of iSignSpecialPlaces. + if (Bcd.SignSpecialPlaces and 63) > 0 then + begin + DecPos := ShortInt(NumDigits - (Bcd.SignSpecialPlaces and 63)); + end else + DecPos := NumDigits + 1; // out of range + Result := FractionToStr(pStart, NumDigits, DecPos, Negative, + (NumDigits = Bcd.SignSpecialPlaces and 63)); + if Result[1] in ['0', '-'] then + if (Result = '-0') or (Result = '0.0') or (Result = '-0.0') then Result := '0'; + end; +end; + +function BcdToDouble(const Bcd: TBcd): Double; +begin + Result := StrToFloat(BcdToStr(Bcd)); +end; + +function InvalidBcdString(PValue: PChar): Boolean; +var + Dot: Char; + P: PChar; +begin + Dot := DecimalSeparator; + P := PValue; + Result := False; + while P^ <> #0 do + begin + if not (P^ in ['0'..'9', '-', Dot]) then + begin + Result := True; + break; + end; + Inc(P); + end; +end; + +procedure StrToFraction(pTo: PChar; pFrom: PChar; count: SmallInt); pascal; +var + Dot: Char; +begin + Dot := DecimalSeparator; + asm + // From bytes to nibbles, both left aligned + PUSH ESI + PUSH EDI + PUSH EBX + MOV ESI,pFrom // move pFrom to ESI + MOV EDI,pTo // move pTo to EDI + XOR ECX,ECX // set ECX to 0 + MOV CX,count // store count in CX + MOV DL,0 // Flag: when to store + CLD +@@1: LODSB // moves [ESI] into al + CMP AL,Dot + JE @@4 + SUB AL,'0' + CMP DL,0 + JNE @@2 + SHL AL,4 + MOV AH,AL + JMP @@3 +@@2: OR AL,AH // takes AH and ors in AL + STOSB // always moves AL into [EDI] +@@3: NOT dl // flip all bits +@@4: LOOP @@1 // decrements cx and checks if it's 0 + CMP DL,0 // are any bytes left unstored? + JE @@5 + MOV AL,AH // if so, move to al + STOSB // and store to [EDI] +@@5: POP EBX + POP EDI + POP ESI + end; +end; + +function TryStrToBcd(const AValue: string; var Bcd: TBcd): Boolean; +const + spaceChars: set of Char = [ ' ', #6, #10, #13, #14]; + digits: set of Char = ['0'..'9']; +var + Neg: Boolean; + NumDigits, DecimalPos: Word; + pTmp, pSource: PChar; + Dot : Char; +begin + Dot := DecimalSeparator; + if InvalidBcdString(PChar(AValue)) then + begin + Result := False; + exit; + end; + if (AValue = '0') or (AValue = '') then + begin + Result := True; + Bcd.Precision := 8; + Bcd.SignSpecialPlaces := 2; + pSource := PChar(@Bcd.Fraction); + System.FillChar(PSource^, SizeOf(Bcd.Fraction), 0); + Exit + end; + Result := True; + Neg := False; + DecimalPos := Pos(Dot, AValue); + + pSource := pCHAR(AValue); + { Strip leading whitespace } + while (pSource^ in spaceChars) or (pSource^ = '0') do + begin + Inc(pSource); + if DecimalPos > 0 then Dec(DecimalPos); + end; + + { Strip trailing whitespace } + pTmp := @pSource[ StrLen( pSource ) -1 ]; + while pTmp^ in spaceChars do + begin + pTmp^ := #0; + Dec(pTmp); + end; + + { Is the number negative? } + if pSource^ = '-' then + begin + Neg := TRUE; + if DecimalPos > 0 then Dec(DecimalPos); + end; + if (pSource^ = '-') or (pSource^ ='+') then + Inc(pSource); + + { Clear structure } + pTmp := pCHAR(@Bcd.Fraction); + System.FillChar(pTmp^, SizeOf(Bcd.Fraction), 0); + if (pSource[0] = '0') then + begin + Inc(PSource); // '0.' scenario + if DecimalPos > 0 then Dec(DecimalPos); + end; + NumDigits := StrLen(pSource); + if (NumDigits > MaxFMTBcdFractionSize) then + begin + if (DecimalPos > 0) and (DecimalPos <= MaxFMTBcdFractionSize) then + NumDigits := MaxFMTBcdFractionSize // truncate to 64 + else begin + Bcd.Precision := NumDigits; + Exit; + end; + end; + + if NumDigits > 0 then + StrToFraction(pTmp, pSource, SmallInt(NumDigits)) + else begin + Bcd.Precision := 10; + Bcd.SignSpecialPlaces := 2; + end; + + if DecimalPos > 0 then + begin + Bcd.Precision := Byte(NumDigits-1); + if Neg then + Bcd.SignSpecialPlaces := ( 1 shl 7 ) + (BYTE(NumDigits - DecimalPos)) + else + Bcd.SignSpecialPlaces := ( 0 shl 7 ) + (BYTE(NumDigits - DecimalPos)); + end else + begin + Bcd.Precision := Byte(NumDigits); + if Neg then + Bcd.SignSpecialPlaces := (1 shl 7) + else + Bcd.SignSpecialPlaces := (0 shl 7); + end; +end; + +function StrToBcd(const AValue: string): TBcd; +var + Success: Boolean; +begin + Success := TryStrToBcd(AValue, Result); + if not Success then + BcdErrorFmt(SInvalidBcdValue, AValue); +end; + +{$ENDIF} + +function DBNumericToDouble(Value: TDBNumeric): double; +var + Bcd: TBcd; +begin + Bcd := DBNumericToBcd(Value); + Result := BcdToDouble(Bcd); +end; + +function DoubleToDBNumeric(Value: double; Precision, Scale: integer): TDBNumeric; +var + Bcd: TBcd; + Str: string; +begin + //Str := FloatToStrF(Value, ffFixed, Precision, Scale); + if (Precision = 0) and (Scale = 0) then + Str := Format('%f', [Value]) + else + Str := Format('%.' + IntToStr(Scale) + 'f', [Value]); + Bcd := StrToBcd(Str); + Result := BcdToDBNumeric(Bcd); +end; + +function IsLargeDataTypeUsed(const FieldDesc: TFieldDesc): boolean; +begin + Result := FieldDesc.DataType = dtBlob; + if not Result then + Result := ((FieldDesc.DataType = dtMemo) or (FieldDesc.DataType = dtWideMemo)) and (((not dtWide) and FieldDesc.SubDataType) = dtText); + if not Result then + Result := FieldDesc.DataType = dtMSXML; +end; + +function IsLargeDataTypeUsed(const ParamDesc: TParamDesc): boolean; +begin + Result := + (ParamDesc.GetDataType = dtBlob) or + (ParamDesc.GetDataType = dtMemo) or + (ParamDesc.GetDataType = dtWideMemo) or + (ParamDesc.GetDataType = dtMSXML); +end; + +function IsOutputLOB(ParamDesc: TParamDesc; ServerVersion, ClientVersion: integer): boolean; +begin + Result := ((ParamDesc.GetDataType = dtMemo) or (ParamDesc.GetDataType = dtWideMemo)) and + (ParamDesc.GetParamType in [pdOutput, pdInputOutput]) and + (ServerVersion = 9) and + (ClientVersion = 9); +end; + +function GetProviderName(const Provider: TOLEDBProvider): string; +begin + case Provider of + prAuto, prSQL: + Result := 'SQLOLEDB.1'; + prNativeClient: + Result := 'SQLNCLI.1'; + prCompact: + Result := 'MICROSOFT.SQLSERVER.MOBILE.OLEDB.3.0'; + else + Assert(False); + Result := ''; + end; +end; + +function GetProvider(const ProviderName: string): TOLEDBProvider; +var + Name: string; +begin + Name := Uppercase(ProviderName); + if Name = SSQLOLEDB then + Result := prSQL + else + if Name = SSQLNativeClient then + Result := prNativeClient + else + if Name = SSQLEverywhere then + Result := prCompact + else + Result := prAuto; +end; + +// FetchBlock support +function IsNeedFetchBlock(const FieldDesc: TFieldDesc; ServerVersion: integer): boolean; // Return True if field need to fetch into separate buffer +var + DataType: word; +begin + Assert(FieldDesc.FieldDescKind = fdkData, 'IsNeedFetchBlock ' + FieldDesc.Name); + DataType := FieldDesc.DataType; + case DataType of + dtExtString, dtExtWideString, dtExtVarBytes, dtVariant: + Result := True; + dtMemo, dtWideMemo, dtMSXML: + Result := not IsLargeDataTypeUsed(FieldDesc); + dtFloat, dtBcd: + Result := (ServerVersion = 3) and (TOLEDBFieldDesc(FieldDesc).OLEDBType = DBTYPE_NUMERIC); + else + Result := False; + end; +end; + +procedure IncFetchBlockOffset(var FetchBlockOffset: integer; const DataType: TDataType); +begin + case DataType of + dtExtString, dtExtWideString: + Inc(FetchBlockOffset, OLE_DB_INDICATOR_SIZE + MaxNonBlobFieldLen + 2 {#0#0 terminator} + sizeof(UINT) {Length}); + dtMemo, dtWideMemo, dtMSXML: + Inc(FetchBlockOffset, OLE_DB_INDICATOR_SIZE + MaxNonBlobFieldLen + 2 {#0#0 terminator}); + dtExtVarBytes: + Inc(FetchBlockOffset, OLE_DB_INDICATOR_SIZE + MaxNonBlobFieldLen + sizeof(UINT) {Length}); + dtVariant: + Inc(FetchBlockOffset, OLE_DB_INDICATOR_SIZE + sizeof(OleVariant)); + dtFloat, dtBcd: + Inc(FetchBlockOffset, OLE_DB_INDICATOR_SIZE + SizeOfTDBNumeric); + else + Assert(False); + end; +end; + +// Brackets support +function IsBracketPresent(const Value: string): boolean; +var + l: integer; +begin + Assert(Pos('.', Value) = 0, 'In func IsBracketPresent delimited values not allowed'); + + l := Length(Value); + if (l <= 1) then + Result := False + else + Result := ((Value[1] = '"') and (Value[l] = '"')) or + ((Value[1] = '[') and (Value[l] = ']')); +end; + +function Unbracket(const Value: string): string; +begin + if IsBracketPresent(Value) then + Result := Copy(Value, 2, length(Value) - 2) + else + Result := Value; +end; + +function IsBracketNeed(Value: string): boolean; +var + i: integer; +begin + Assert(Pos('.', Value) = 0, 'In func IsBracketNeeds delimited values not allowed'); + + Value := Unbracket(Value); + Result := False; + for i := 1 to Length(Value) do + if i = 1 then + case Value[i] of + 'a'..'z', 'A'..'Z', '_', '@', '#':; // NoBracketableStartingChars = ['a'..'z', 'A'..'Z', '_', '@', '#']; + else + begin + Result := True; + Exit; + end; + end + else + case Value[i] of + 'a'..'z', 'A'..'Z', '_', '@', '#', '0'..'9', '$':; // NoBracketableChars = NoBracketableStartingChars + ['0'..'9', '$']; + else + begin + Result := True; + Exit; + end; + end; +end; + +// Rules see in MSDN (mk:@MSITStore:D:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2003JAN\1033\acdata.chm::/ac_8_con_03_89rn.htm, +// mk:@MSITStore:D:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2003JAN\1033\acdata.chm::/ac_8_con_03_6e9e.htm) +function BracketIfNeed(const Value: string): string; +begin + Result := BracketIfNeed(Value, Char('['), Char(']')); +end; + +function BracketIfNeed(const Value: string; const LeftQ: char; const RightQ: char): string; +var + i: integer; +begin + i := Pos('.', Value); + if i <> 0 then + Result := BracketIfNeed(Copy(Value, 1, i - 1)) + '.' + BracketIfNeed(Copy(Value, i + 1, Length(Value) - i)) + else + if not IsBracketPresent(Value) and + IsBracketNeed(Value) then + Result := LeftQ + Value + RightQ + else + Result := Value; +end; + +function UnbracketIfPossible(const Value: string; const NeedSl: boolean; var sl: String {Result parts in reverse order delimited by slDelimiter}): string; overload; +var +{$IFNDEF CLR} + p: PChar; +{$ENDIF} + DotPos: integer; + l: integer; +begin + Result := Value; + l := Length(Value); +{$IFDEF CLR} + DotPos := Value.IndexOf('.'); +{$ELSE} + p := StrScan(PChar(Value), '.'); // i := Pos('.', Value); + if p = nil then + DotPos := -1 + else + DotPos := p - PChar(Value); +{$ENDIF} + + if (l < 3) then begin + if (DotPos = -1) and NeedSl then + sl := Result + slDelimiter + sl; + Exit; + end; + + if DotPos <> -1 then begin +{ if DotPos = 0 then + Result := UnbracketIfPossible(Copy(Value, DotPos + 2, l - DotPos - 1), sl) + else} + Result := UnbracketIfPossible(Copy(Value, 1, DotPos), sl) + '.' + UnbracketIfPossible(Copy(Value, DotPos + 2, l - DotPos - 1), sl) + end + else + begin + if IsBracketPresent(Value) and + not IsBracketNeed(Value) then + Result := Copy(Value, 2, l - 2) + else + Result := Value; + if NeedSl then + sl := Result + slDelimiter + sl; + end; +end; + +function UnbracketIfPossible(const Value: string): string; overload; +var + sl: string; +begin + Result := UnbracketIfPossible(Value, False, sl); +end; + +function UnbracketIfPossible(const Value: string; var sl: string {Result parts in reverse order delimited by slDelimiter}): string; overload; +begin + Result := UnbracketIfPossible(Value, True, sl); +end; + +{$IFDEF CLR} +function UnbracketIfPossible(const Value: string; out DataBase: string; out Owner: string; out ObjName: string): string; +const + d: array[0..0] of char = (slDelimiter); +var + sl: string; + i: integer; + + SubSl: array of string; +begin + sl := ''; + UnbracketIfPossible(Value, sl); + if sl = '' then + Exit; + + SubSl := sl.Split(d); + i := Length(SubSl); + if i > 0 then begin + ObjName := SubSl[0]; + if i > 1 then begin + Owner := SubSl[1]; + if i > 2 then + Database := SubSl[2]; + end; + end; +end; +{$ELSE} +function UnbracketIfPossible(const Value: string; out DataBase: string; out Owner: string; out ObjName: string): string; + function GetSubStr(var Src: PChar): string; + var + p: PChar; + l: integer; + begin + p := StrScan(Src, slDelimiter); + if p = nil then + Result := '' + else + begin + l := p - Src; + SetLength(Result, l); + Move(Src^, PChar(Result)^, l); + Src := Src + l + 1{slDelimiter}; + end; + end; + +var + sl: string; + p: PChar; +begin + sl := ''; + UnbracketIfPossible(Value, sl); + if sl = '' then + Exit; + + p := PChar(sl); + ObjName := GetSubStr(p); + Owner := GetSubStr(p); + Database := GetSubStr(p); +end; +{$ENDIF} + +function GenerateTableName(const CatalogName: string; + const SchemaName: string; + const TableName: string; + const DefaultCatalogName: string): string; +begin + if (CatalogName <> '') and not SameText(CatalogName, DefaultCatalogName) then + Result := Format('%s.%s.%s', + [BracketIfNeed(CatalogName), + BracketIfNeed(SchemaName), + BracketIfNeed(TableName)]) + else + if SchemaName <> '' then + Result := Format('%s.%s', + [BracketIfNeed(SchemaName), + BracketIfNeed(TableName)]) + else + Result := Format('%s', + [BracketIfNeed(TableName)]); +end; + +function ChangeDecimalSeparator(const Value: Variant): string; +var + i: integer; +begin +{$IFDEF VER6P} + Result := Value; +{$ELSE} + if TVarData(Value).VType = varSingle then + Result := FloatToStr(TVarData(Value).VSingle) + else + if TVarData(Value).VType = varDouble then + Result := FloatToStr(TVarData(Value).VDouble) + else + Result := Value; +{$ENDIF} + if DecimalSeparator <> '.' then begin + i := 2; + while i < Length(Result) do begin + if Result[i] = DecimalSeparator then begin + Result[i] := '.'; + Break; + end; + Inc(i); + end; + end; +end; + +function GetParamNameWODog(const ParamName: string): string; +begin + if (ParamName <> '') and (ParamName[1] = '@') then + Result := Copy(ParamName, 2, 1000) + else + Result := ParamName; +end; + +{$IFDEF CLR} +procedure QueryIntf(Source: IUnknown; const IID: TInterfaceRef; out Intf); // OLE QueryInterface analog +begin + Assert(Source <> nil); + Intf := nil; + if Source is IID then + Intf := Source as IID + else + raise EOLEDBError.Create(E_NOINTERFACE, 'QueryInterface failed'); +end; + +{$ELSE} + +procedure QueryIntf(Source: IUnknown; const IID: TGuid; out Intf); // OLE QueryInterface analog +begin + Assert(Source <> nil); + if Source.QueryInterface(IID, Intf) <> S_OK then + raise EOLEDBError.Create(E_NOINTERFACE, 'QueryInterface failed'); +end; +{$ENDIF} + +function Min(const A, B: Integer): Integer; +begin + if A < B then + Result := A + else + Result := B; +end; + +{ TOLEDBParamDesc } + +function TOLEDBParamDesc.GetOLEDBType: DBTYPE; +begin + Result := FOLEDBType; +end; + +procedure TOLEDBParamDesc.SetOLEDBType(Value: DBTYPE); +begin + FOLEDBType := Value; +end; + +function TOLEDBParamDesc.GetUseDefaultValue: boolean; +begin + Result := FUseDefaultValue; +end; + +procedure TOLEDBParamDesc.SetUseDefaultValue(Value: boolean); +begin + FUseDefaultValue := Value; +end; + +function TOLEDBParamDesc.GetValue: variant; +begin + if not GetNull + and not VarIsEmpty(FData) + and not VarIsNull(FData) + {$IFDEF CLR} + and (FData is TSharedObject) + {$ELSE} + and (TVarData(FData).VType = varByRef) + {$ENDIF} + then begin + if GetAsBlobRef.IsUnicode then + Result := GetAsBlobRef.AsWideString + else + Result := GetAsBlobRef.AsString; + end + else + Result := inherited GetValue; +end; + +function TOLEDBParamDesc.GetAsBlobRef: TBlob; +begin + Result := TBlob({$IFDEF CLR}FData{$ELSE}TVarData(FData).VPointer{$ENDIF}); +end; + +procedure TOLEDBParamDesc.SetNull(const Value: boolean); +begin + FIsNull := Value; + if not((DataType = dtBlob) or (DataType = dtMemo) or (DataType = dtWideMemo)) then + FData := Unassigned; +end; +{ TExecuteThread } + +procedure TExecuteThread.InternalExecute; +begin + if Assigned(FRunMethod) then + FRunMethod; +end; + +{ TOLEDBThreadWrapper } + +procedure TOLEDBThreadWrapper.DoException(E: Exception); +begin + if E is EOLEDBError then begin + Assert(FException = nil); + FException := EOLEDBError.Create(EOLEDBError(E).ErrorCode, EOLEDBError(E).Message); + EOLEDBError(FException).Assign(EOLEDBError(E)); + end + else + inherited; +end; + +{ TOLEDBStream } + +constructor TOLEDBStream.Create(Blob: TBlob {to avoid data copy}; StreamList: TList); +begin + inherited Create; + + {$IFDEF DEBUG} Inc(StreamCnt); {$ENDIF} + + FBlob := Blob; + FPosInBlob := 0; + + FSize := Blob.Size; + FStreamList := StreamList; + + if FStreamList <> nil then + FStreamList.Add(Self); +end; + +destructor TOLEDBStream.Destroy; +begin + if FStreamList <> nil then + {$IFDEF CLR} + FStreamList.Remove(Self); + {$ELSE} + FStreamList.Remove(pointer(Self)); + {$ENDIF} + + inherited; + {$IFDEF DEBUG} Dec(StreamCnt); {$ENDIF} +end; + +function TOLEDBStream.Read( + pv: IntPtr; + cb: Longint; + pcbRead: PLongint +): HResult; +var + cbSrcReadBytes: longint; + cbDstWriteBytes: longint; + +begin + try + cbSrcReadBytes := Min(Integer(FSize - FPosInBlob), cb); + cbDstWriteBytes := FBlob.Read(FPosInBlob, cbSrcReadBytes, pv); + Inc(FPosInBlob, cbDstWriteBytes); + + if pcbRead <> nil then + Marshal.WriteInt32(pcbRead, cbDstWriteBytes); + Result := S_OK; + except + Result := S_FALSE; + end; +end; + +function TOLEDBStream.Write( + pv: IntPtr; + cb: Longint; + pcbWritten: PLongint +): HResult; +begin + try + FBlob.Write(FPosInBlob, cb, pv); + Inc(FPosInBlob, cb); + Inc(FSize, cb); + + if pcbWritten <> nil then + Marshal.WriteInt32(pcbWritten, cb); + Result := S_OK; + except + Result := S_FALSE; + end; +end; + +{ TBigIntegerAccessor } + +constructor TBigIntegerAccessor.Create(BigIntegerPtr: PBigInteger; Allocate: boolean); +begin + inherited Create; + + if not Allocate then + FBigIntegerPtr := BigIntegerPtr + else begin + FBigIntegerPtr := Marshal.AllocHGlobal(SizeOfRBigInteger); + FSelfAllocated := True; + end; +end; + +destructor TBigIntegerAccessor.Destroy; +begin + if FSelfAllocated then + Marshal.FreeHGlobal(FBigIntegerPtr); + + inherited; +end; + +procedure TBigIntegerAccessor.SetBigIntegerPtr(Value: PBigInteger); +begin + if FSelfAllocated then begin + Marshal.FreeHGlobal(FBigIntegerPtr); + FSelfAllocated := False; + end; + FBigIntegerPtr := Value; +end; + +function TBigIntegerAccessor.GetDataLength: integer; +begin + Result := Marshal.ReadInt32(FBigIntegerPtr, MaxLength * SizeOfLongWord) +end; + +procedure TBigIntegerAccessor.SetDataLength(Value: integer); +begin + Marshal.WriteInt32(FBigIntegerPtr, MaxLength * SizeOfLongWord, Value); +end; + +function TBigIntegerAccessor.GetDataPtr: IntPtr; +begin + Result := FBigIntegerPtr; +end; + +function TBigIntegerAccessor.GetData(Index: integer): LongWord; +begin + Result := LongWord(Marshal.ReadInt32(FBigIntegerPtr, Index * SizeOfLongWord)); +end; + +procedure TBigIntegerAccessor.SetData(Index: integer; Value: LongWord); +begin + Marshal.WriteInt32(FBigIntegerPtr, Index * SizeOfLongWord, Integer(Value)); +end; + +procedure TBigIntegerAccessor.ClearData; +var + i: integer; +begin + for i := 0 to MaxLength - 1 do + Data[i] := 0; +end; + +function TBigIntegerAccessor.GetBigInteger: RBigInteger; +{$IFDEF CLR} +var + i: integer; +{$ENDIF} +begin +{$IFDEF CLR} + Result.DataLength := GetDataLength; + for i := 0 to MaxLength - 1 do + Result.Data[i] := Data[i]; + //Result := RBigInteger(Marshal.PtrToStructure(FBigIntegerPtr, TypeOf(RBigInteger))); +{$ELSE} + Result := RBigInteger(FBigIntegerPtr^); +{$ENDIF} +end; + +procedure TBigIntegerAccessor.SetBigInteger(const Value: RBigInteger); +{$IFDEF CLR} +var + i: integer; +{$ENDIF} +begin + Assert(FBigIntegerPtr <> nil); +{$IFDEF CLR} + DataLength := Value.DataLength; + for i := 0 to MaxLength - 1 do + Data[i] := Value.Data[i]; + //Marshal.StructureToPtr(TObject(Value), FBigIntegerPtr, False); +{$ELSE} + RBigInteger(FBigIntegerPtr^) := Value; +{$ENDIF} +end; + +{ TBigInteger } + +class procedure TBigInteger.CreatePBigIntegerPtr(PBigInt: PBigInteger); +var + BigIntAcc: TBigIntegerAccessor; +begin + BigIntAcc := TBigIntegerAccessor.Create(PBigInt, False); + try + BigIntAcc.DataLength := 1; + BigIntAcc.ClearData; + finally + BigIntAcc.Free; + end; +end; + +class procedure TBigInteger.CreateRBigIntegerStruct(var BigInt: RBigInteger); +{$IFDEF CLR} +var + i: integer; +{$ENDIF} +begin + BigInt.DataLength := 1; +{$IFDEF CLR} + for i := 0 to MaxLength - 1 do + BigInt.Data[i] := 0; +{$ELSE} + MemUtils.FillChar(@BigInt.Data[0], MaxLength * SizeOfLongWord, $00); +{$ENDIF} +end; + +class procedure TBigInteger.CreatePBigInteger64(PBigInt: PBigInteger; Value: Int64); +var + BigIntAcc: TBigIntegerAccessor; +begin + BigIntAcc := TBigIntegerAccessor.Create(PBigInt, False); + try + BigIntAcc.ClearData; + BigIntAcc.DataLength := 0; + + while (Value <> 0) and (BigIntAcc.DataLength < MaxLength) do begin + BigIntAcc.Data[BigIntAcc.DataLength] := LongWord(Value and $FFFFFFFF); + Value := Value shr 32; + BigIntAcc.DataLength := BigIntAcc.DataLength + 1; + end; + + if (Value <> 0) or (LongWord(BigIntAcc.Data[MaxLength - 1] and $80000000) <> 0) then + raise Exception.Create('Positive overflow in constructor.'); + + if BigIntAcc.DataLength = 0 then + BigIntAcc.DataLength := 1; + finally + BigIntAcc.Free; + end; +end; + +class procedure TBigInteger.CreatePBigIntegerBCD(PBigInt: PBigInteger; const Value: TBcd); +var + Multiplier: TBigIntegerAccessor; + Result, Tmp: TBigIntegerAccessor; + BigIntAcc: TBigIntegerAccessor; + Radix: integer; + posVal: Integer; + Val: TBytes; + i: Integer; + k: integer; +begin + Multiplier := nil; + Result := nil; + Tmp := nil; + BigIntAcc := nil; + try + Multiplier := TBigIntegerAccessor.Create(nil, True); + Result := TBigIntegerAccessor.Create(nil, True); + Tmp := TBigIntegerAccessor.Create(nil, True); + BigIntAcc := TBigIntegerAccessor.Create(PBigInt, False); + + TBigInteger.CreatePBigInteger64(Multiplier.BigIntegerPtr, 1); + TBigInteger.CreatePBigIntegerPtr(Result.BigIntegerPtr); + + SetLength(Val, SizeOfFraction); + {$IFDEF CLR} + for i := 0 to SizeOfFraction - 1 do + Val[i] := Value.Fraction[i]; + {$ELSE} + MemUtils.CopyBuffer(@Value.Fraction[0], @Val[0], Length(Val)); + {$ENDIF} + + k := (Value.Precision div 2); + if (Value.Precision mod 2) = 0 then + Dec(k); + + for i := k downto 0 do begin + Radix := 100; + if (i = k) then begin + if (Value.Precision mod 2) = 0 then + posVal := (val[i] and $0F) + ((val[i] and $F0) shr 4) * 10 + else begin + posVal := (val[i] and $F0) shr 4; + Radix := 10; + end; + end + else + posVal := (val[i] and $0F) + ((val[i] and $F0) shr 4) * 10; + + Assert(posVal < Radix); + + Tmp.BigInteger := Mul64(Multiplier.BigIntegerPtr, posVal); + Result.BigInteger := Add(Result.BigIntegerPtr, Tmp.BigIntegerPtr); + + if (i - 1) >= 0 then + Multiplier.BigInteger := Mul64(Multiplier.BigIntegerPtr, Radix); + end; + + BigIntAcc.ClearData; + for i := 0 to Result.DataLength - 1 do + BigIntAcc.Data[i] := Result.Data[i]; + + BigIntAcc.DataLength := Result.DataLength; + finally + Multiplier.Free; + Result.Free; + Tmp.Free; + BigIntAcc.Free; + end; +end; + +class function TBigInteger.Add(PBigInt1: PBigInteger; PBigInt2: PBigInteger): RBigInteger; +var + carry, sum: Int64; + i, lastPos: Integer; + BigInt1Acc, BigInt2Acc: TBigIntegerAccessor; +begin + BigInt1Acc := TBigIntegerAccessor.Create(PBigInt1, False); + BigInt2Acc := TBigIntegerAccessor.Create(PBigInt2, False); + try + TBigInteger.CreateRBigIntegerStruct(Result); + + if BigInt1Acc.DataLength > BigInt2Acc.DataLength then + Result.DataLength := BigInt1Acc.DataLength + else + Result.dataLength := BigInt2Acc.DataLength; + carry := 0; + for i := 0 to Result.DataLength - 1 do begin + sum := Int64(BigInt1Acc.data[i]) + Int64(BigInt2Acc.data[i]) + carry; + carry := sum shr 32; + Result.Data[i] := LongWord(sum and $FFFFFFFF); + end; + + if (carry <> 0) and (Result.DataLength < MaxLength) then begin + Result.Data[Result.DataLength] := LongWord(carry); + Result.DataLength := Result.DataLength + 1; + end; + + while (Result.DataLength > 1) and (Result.Data[Result.DataLength - 1] = 0) do + Result.DataLength := Result.DataLength - 1; + + // overflow check + lastPos := maxLength - 1; + if (longword(BigInt1Acc.Data[lastPos] and $80000000) = longword(BigInt2Acc.Data[lastPos] and $80000000)) and + (longword(Result.Data[lastPos] and $80000000) <> longword(BigInt1Acc.Data[lastPos] and $80000000)) then + begin + raise Exception.Create('overflow!'); + end; + finally + BigInt1Acc.Free; + BigInt2Acc.Free; + end; +end; + +class function TBigInteger.NEGATEPtr(PBigInt: PBigInteger): RBigInteger; +var + carry, val: Int64; + i, index: Integer; + BigIntAcc: TBigIntegerAccessor; +begin + BigIntAcc := TBigIntegerAccessor.Create(PBigInt, False); + try + // handle neg of zero separately since it'll cause an overflow + // if we proceed. + if (BigIntAcc.DataLength = 1) and (BigIntAcc.Data[0] = 0) then begin + TBigInteger.CreateRBigIntegerStruct(Result); + Exit; + end; + + // 1's complement + for i := 0 to MaxLength - 1 do + Result.Data[i] := LongWord(not(BigIntAcc.Data[i])); + + // add one to result of 1's complement + carry := 1; + index := 0; + + while (carry <> 0) and (index < maxLength) do begin + val := Int64(Result.Data[index]); + Inc(val); + + Result.Data[index] := LongWord(val and $FFFFFFFF); + carry := val shr 32; + Inc(index); + end; + + if LongWord(BigIntAcc.Data[maxLength-1] and $80000000) = LongWord(Result.Data[MaxLength-1] and $80000000) then + raise Exception.Create('Overflow in negation.'); + + Result.DataLength := MaxLength; + + while (Result.DataLength > 1) and (Result.Data[Result.DataLength - 1] = 0) do + Result.DataLength := Result.DataLength - 1; + finally + BigIntAcc.Free; + end; +end; + +class function TBigInteger.NEGATE(const BigInt: RBigInteger): RBigInteger; +{$IFDEF CLR} +var + BigIntAcc: TBigIntegerAccessor; +{$ENDIF} +begin +{$IFDEF CLR} + BigIntAcc := TBigIntegerAccessor.Create(nil, True); + try + BigIntAcc.BigInteger := BigInt; + Result := NEGATEPtr(BigIntAcc.BigIntegerPtr); + finally + BigIntAcc.Free; + end; +{$ELSE} + Result := NEGATEPtr(@BigInt); +{$ENDIF} +end; + +class function TBigInteger.Mul(PBigInt1: PBigInteger; PBigInt2: PBigInteger): RBigInteger; +var + BigInt1Acc, BigInt2Acc: TBigIntegerAccessor; + nbi1, nbi2: RBigInteger; + mcarry, val: Int64; + bi1Neg, bi2Neg, isMaxNeg: Boolean; + b1, b2: Longword; + i, j, k, lastPos: Integer; +begin + BigInt1Acc := TBigIntegerAccessor.Create(PBigInt1, False); + BigInt2Acc := TBigIntegerAccessor.Create(PBigInt2, False); + try + lastPos := maxLength - 1; + bi1Neg := false; + bi2Neg := false; + + // take the absolute value of the inputs + try + if longword(BigInt1Acc.Data[lastPos] and $80000000) <> 0 then begin + bi1Neg := true; + nbi1 := NEGATEPtr(PBigInt1); + end + else + //nbi1 := bi1^; + nbi1 := BigInt1Acc.BigInteger; + + + if longword(BigInt2Acc.Data[lastPos] and $80000000) <> 0 then begin + bi2Neg := true; + nbi2 := NEGATEPtr(PBigInt2); + end + else + //nbi2 := bi2^; + nbi2 := BigInt2Acc.BigInteger; + except + end; + + TBigInteger.CreateRBigIntegerStruct(Result); + + // multiply the absolute values + for i := 0 to nbi1.dataLength - 1 do begin + if nbi1.data[i] = 0 then + continue; + + mcarry := 0; + k := i; + for j := 0 to nbi2.dataLength - 1 do begin + // k = i + j + // val := Int64(nbi1.data[i]) * Int64(nbi2.data[j]); + b1 := nbi1.data[i]; + b2 := nbi2.data[j]; + {$IFDEF CLR} + val := Int64(b1) * Int64(b2); + {$ELSE} + asm + MOV EAX, b1 + MUL b2 + MOV dword ptr [val+$00], EAX + MOV dword ptr [val+$04], EDX + end; + {$ENDIF} + val := val + Int64(result.data[k]) + mcarry; + + result.data[k] := longword(val and $FFFFFFFF); + mcarry := val shr 32; + Inc(k); + end; + + if mcarry <> 0 then + result.data[i + nbi2.dataLength] := longword(mcarry); + end; + + result.dataLength := nbi1.dataLength + nbi2.dataLength; + if result.dataLength > maxLength then + result.dataLength := maxLength; + + while (result.dataLength > 1) and (result.data[result.dataLength - 1] = 0) do + result.dataLength := result.dataLength - 1; + + // overflow check (result is -ve) + if longword(result.data[lastPos] and $80000000) <> 0 then begin + if (bi1Neg <> bi2Neg) and (result.data[lastPos] = $80000000) then begin + // handle the special case where multiplication produces + // a max negative number in 2's complement. + + if result.dataLength = 1 then + Exit + else begin + isMaxNeg := true; + i := 0; + while (i < result.dataLength - 1) and isMaxNeg do begin + if result.data[i] <> 0 then + isMaxNeg := false; + Inc(i); + end; + + if isMaxNeg then + Exit; + end; + end; + + raise Exception.Create('Multiplication overflow.'); + end; + + // if input has different signs, then result is -ve + if bi1Neg <> bi2Neg then + Result := NEGATE(Result); + finally + BigInt1Acc.Free; + BigInt2Acc.Free; + end; +end; + +class function TBigInteger.Mul64(PBigInt1: PBigInteger; value: Int64): RBigInteger; +var + BigIntAcc2: TBigIntegerAccessor; +begin + BigIntAcc2 := TBigIntegerAccessor.Create(nil, True); + try + TBigInteger.CreatePBigInteger64(BigIntAcc2.BigIntegerPtr, Value); + Result := Mul(PBigInt1, BigIntAcc2.BigIntegerPtr); + finally + BigIntAcc2.Free; + end; +end; + +{ TOLEDBConnection } + +constructor TOLEDBConnection.Create; +begin + inherited; + + FIsolationLevel := ilReadCommitted; + FCommand := nil; + + FAuthentication := auServer; + FProvider := prSQL; + + FDatabase := ''; + FQuotedIdentifier := True; + FPacketSize := DefaultPacketSize; + FAutoTranslate := True; + FConnectionTimeout := DefaultConnectionTimeout; + FOldPassword := ''; + FMaxDatabaseSize := 4091; + FFailoverPartner := ''; +end; + +destructor TOLEDBConnection.Destroy; +begin + Disconnect; + FCommand.Free; + inherited; +end; + +procedure TOLEDBConnection.ReleaseInterfaces; +begin + FISessionProperties := nil; + FITransactionLocal := nil; + + FIDBInitialize := nil; + FIDBProperties := nil; + FIDBCreateSession := nil; +end; + +{$IFDEF SQL_TRANSACTION} +procedure TOLEDBConnection.StartTransaction; +begin +{$WARNINGS OFF} + case FIsolationLevel of + ilReadCommitted: + ExecSQL('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + ilReadUnCommitted: + ExecSQL('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'); + ilRepeatableRead: + ExecSQL('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ'); + ilIsolated: + ExecSQL('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE '); + else + Assert(False, Format('Invalid value %d', [Integer(FIsolationLevel)])); + end; +{$WARNINGS ON} + ExecSQL('BEGIN TRAN'); +end; + +procedure TOLEDBConnection.Commit; +begin + ExecSQL('COMMIT'); +end; + +procedure TOLEDBConnection.Rollback; +begin + ExecSQL('ROLLBACK'); +end; + +{$ELSE} +{$IFDEF CLR} +procedure TOLEDBConnection.StartTransaction; +var + pulTransactionLevel: PUINT; +begin + if FITransactionLocal <> nil then begin + pulTransactionLevel := Marshal.AllocHGlobal(4); + try + Check(FITransactionLocal.StartTransaction(ConvertIsolationLevelToOLEDBIsoLevel(FIsolationLevel), 0, nil, pulTransactionLevel), Component); + finally + Marshal.FreeHGlobal(pulTransactionLevel); + end; + end; +end; +{$ELSE} +procedure TOLEDBConnection.StartTransaction; +var + ulTransactionLevel: UINT; +begin + if FITransactionLocal <> nil then + Check(FITransactionLocal.StartTransaction(ConvertIsolationLevelToOLEDBIsoLevel(FIsolationLevel), 0, nil, @ulTransactionLevel), Component); +end; +{$ENDIF} + +procedure TOLEDBConnection.Commit; +begin + if FITransactionLocal <> nil then + Check(ITransaction(FITransactionLocal).Commit(False{WAR may be troubles with server cursors}, XACTTC_SYNC, 0), Component); +end; + +procedure TOLEDBConnection.Rollback; +begin + if FITransactionLocal <> nil then + Check(ITransaction(FITransactionLocal).Abort(nil, False, False), Component); +end; +{$ENDIF} + +procedure TOLEDBConnection.Check(const Status: HRESULT; Component: TObject); +begin + if Status <> S_OK then + OLEDBError(Status, Component); +end; + +procedure TOLEDBConnection.OLEDBError(const ErrorCode: HRESULT; Component: TObject); +{$IFDEF CLR} + function MarshalErrInfo(Err: PSSERRORINFO): SSERRORINFO; + begin + Result := SSERRORINFO(Marshal.PtrToStructure(Err, TypeOf(SSERRORINFO))); + end; +{$ELSE} + function MarshalErrInfo(Err: PSSERRORINFO): SSERRORINFO; + begin + Result.pwszMessage := Err.pwszMessage; + Result.pwszServer := Err.pwszServer; + Result.pwszProcedure := Err.pwszProcedure; + Result.lNative := Err.lNative; + Result.bState := Err.bState; + Result.bClass := Err.bClass; + Result.wLineNumber := Err.wLineNumber; + end; +{$ENDIF} + +var + pIErrorInfoAll: IErrorInfo; + // pIErrorInfo: IErrorInfo; + pIErrorRecords: IErrorRecords; + pISQLServerErrorInfo: ISQLServerErrorInfo; + pssErrInfo: PSSERRORINFO; + ssErrInfo: SSERRORINFO; + pStrBuf: IntPtr; // pWideChar; + + Msg: WideString; + s1: WideString; + + i, RecordCount: Cardinal; + //pIMalloc: IMalloc; + + Err: EOLEDBError; + Fail: boolean; + + // Descr, Src: WideString; + + ErrInfo: ERRORINFO; + iu: IUnknown; + + // Buffer + ssErrInfoBuf: SSERRORINFO; + +begin + if (ErrorCode = 0) and not Assigned(FOnInfoMessage) then + Exit; + + s1 := ''; + Err := nil; + RecordCount := 0; + //CoGetMalloc(1, pIMalloc); + + if GetErrorInfo(0, pIErrorInfoAll) = S_OK then begin + pIErrorInfoAll.GetDescription(Msg); + {$IFDEF CLR} + pIErrorRecords := pIErrorInfoAll as IErrorRecords; + {$ELSE} + pIErrorInfoAll.QueryInterface(IID_IErrorRecords, pIErrorRecords); + {$ENDIF} + pIErrorRecords.GetRecordCount(RecordCount); + + if RecordCount > 0 then begin /// i and RecordCount is unigned int! + for i := RecordCount - 1 downto 0 do begin// Ignore all error messages without last + if (pIErrorRecords.GetCustomErrorObject(i, IID_ISQLServerErrorInfo, iu) = S_OK) then + pISQLServerErrorInfo := ISQLServerErrorInfo(iu); + iu := nil; + if (pISQLServerErrorInfo <> nil) and + (pISQLServerErrorInfo.GetErrorInfo(pssErrInfo, pStrBuf) = S_OK) and + (pssErrInfo <> nil) then begin + {$IFDEF CLR} + ssErrInfo := SSERRORINFO(Marshal.PtrToStructure(pssErrInfo, TypeOf(SSERRORINFO))); + if s1 = '' then begin + ssErrInfoBuf := ssErrInfo; + s1 := ssErrInfo.pwszMessage; + end + else + s1 := ssErrInfo.pwszMessage + #$D#$A + s1; + {$ELSE} + if s1 = '' then begin + ssErrInfoBuf := MarshalErrInfo(pssErrInfo); + s1 := pssErrInfo^.pwszMessage; + end + else + s1 := pssErrInfo^.pwszMessage + WideString(#$D#$A) + s1; + {$ENDIF} + FreeCoMem(pStrBuf); + FreeCoMem(pssErrInfo); + //pIMalloc.Free(pStrBuf); + //pIMalloc.Free(pssErrInfo); + end; + end; + if s1 <> '' then + Err := EMSError.Create(ssErrInfoBuf, ErrorCode, s1); + end; + end; + + if Err = nil then // this is OLE DB error. As example - repeated Connection.Rollback or non-convergence types of field and parameter + begin + if ErrorCode = 0 then + Exit; // No error and no message + + if Msg = '' then + Msg := Format(SOLEDBError, [ErrorCode]); + if ErrorCode = CO_E_NOTINITIALIZED then + Msg := Msg + '.'#$D#$A'CoInitialize has not been called.'; + + Err := EOLEDBError.Create(ErrorCode, Msg); + end; + +{$IFNDEF LITE} + Err.Component := Component; +{$ENDIF} + Err.FOLEDBErrorCode := ErrorCode; + if RecordCount > 0 then /// i and RecordCount is unigned int! + for i := 0 to RecordCount - 1 do begin// Ignore all error messages without last + if pIErrorRecords.GetCustomErrorObject(i, IID_ISQLServerErrorInfo, iu) = S_OK then begin + pISQLServerErrorInfo := ISQLServerErrorInfo(iu); + if (pISQLServerErrorInfo <> nil) and + (pISQLServerErrorInfo.GetErrorInfo(pssErrInfo, pStrBuf) = S_OK) and + (pssErrInfo <> nil) then begin + // EMSError + + ssErrInfo := MarshalErrInfo(pssErrInfo); + Err.FErrors.FList.Add(EMSError.Create(ssErrInfo, 0, ssErrInfo.pwszMessage)); + + FreeCoMem(pStrBuf); + FreeCoMem(pssErrInfo); + //pIMalloc.Free(pStrBuf); + //pIMalloc.Free(pssErrInfo); + end + else + Err.FErrors.FList.Add(EOLEDBError.Create(ErrorCode, Msg)); + end; + + with Err.Errors[Err.ErrorCount - 1] do begin + if pIErrorRecords.GetBasicErrorInfo(i, ErrInfo) = S_OK then begin + // GetBasicErrorInfo - ERRORINFO struct + FOLEDBErrorCode := ErrInfo.hrError; + // FMinor := ErrInfo.dwMinor; + // Fclsid := ErrInfo.clsid; + Fiid := ErrInfo.iid; + // Fdispid := ErrInfo.dispid; + end; + + (* if pIErrorRecords.GetErrorInfo(i, GetUserDefaultLCID(), pIErrorInfo) = S_OK then begin + // GetErrorInfo - IErrorInfo interface + // pIErrorInfo.GetGUID(Fguid); - same as Fiid + pIErrorInfo.GetSource(FSource); + pIErrorInfo.GetDescription(FDescription); + // pIErrorInfo.GetHelpFile(FHelpFile); - not used by sqloledb + // pIErrorInfo.GetHelpContext(FdwHelpContext); - not used by sqloledb + end;*) + end; + end; + + if (ErrorCode = 0) and Assigned(FOnInfoMessage) then begin + Assert(Err <> nil); + try + FOnInfoMessage(Err as EMSError); + finally + Err.Free; + end; + end + else + begin + Fail := True; + try + if Assigned(OnError) then + DoError(Err{$IFNDEF LITE} as EDAError{$ENDIF}, Fail); + if Fail then + raise Err + else + Abort; + finally + if not Fail then + Err.Free; + end; + end; +end; + +procedure TOLEDBConnection.GetConnectionProperties; +var + PropValues: TPropValues; +begin + with TOLEDBPropertiesGet.Create(Self, DBPROPSET_DATASOURCEINFO) do + try + AddPropId(DBPROP_DBMSNAME); + AddPropId(DBPROP_DBMSVER); + AddPropId(DBPROP_PROVIDERFRIENDLYNAME); + AddPropId(DBPROP_PROVIDERVER); + if FProvider = prCompact then + AddPropId(DBPROP_PROVIDERNAME); + GetProperties(FIDBProperties, PropValues); + finally + Free; + end; + FDBMSName := PropValues[0]; + FDBMSVer := PropValues[1]; + FDBMSPrimaryVer := StrToInt(Copy(FDBMSVer, 1, Pos('.', FDBMSVer) - 1)); + + FProviderFriendlyName := PropValues[2]; + FProviderVer := PropValues[3]; + FProviderPrimaryVer := StrToInt(Copy(FProviderVer, 1, Pos('.', FProviderVer) - 1)); + + if (FProvider = prCompact) and (FProviderFriendlyName = '') then begin + FProviderFriendlyName := PropValues[4]; + if Pos('.dll', LowerCase(FProviderFriendlyName)) > 0 then + SetLength(FProviderFriendlyName, Length(FProviderFriendlyName) - 4); + end; + + if FProvider = prCompact then begin + if (FProviderPrimaryVer <> 3) then + DatabaseError(SBadProviderName) + end + else + if (FProviderPrimaryVer < 7) and not IsWindowsVista then + DatabaseError(SWrongMDACVer); +end; + +procedure TOLEDBConnection.SetConnectionProperties; +var + BufLen: cardinal; +// ComputerName: array[0..MAX_COMPUTERNAME_LENGTH] of char; +{$IFDEF CLR} + AppName: StringBuilder; +{$ELSE} + AppName: array[0..MAX_PATH + 100] of char; +{$ENDIF} + s: string; + +begin + // Set initialization properties + if FProvider <> prCompact then begin + with TOLEDBPropertiesSet.Create(Self, DBPROPSET_DBINIT) do + try + // Auth props + if FServer <> '' then + AddPropStr(DBPROP_INIT_DATASOURCE, FServer) + else + AddPropStr(DBPROP_INIT_DATASOURCE, '(local)'); + AddPropStr(DBPROP_INIT_CATALOG, FDatabase); + AddPropInt(DBPROP_INIT_TIMEOUT, FConnectionTimeout); + + case FAuthentication of + auWindows: + AddPropStr(DBPROP_AUTH_INTEGRATED, ''); + auServer: + if (FUserName = '') and (FPassword = '') then + AddPropStr(DBPROP_AUTH_USERID, 'sa') + else + begin + AddPropStr(DBPROP_AUTH_USERID, FUserName); + AddPropStr(DBPROP_AUTH_PASSWORD, FPassword); + end; + end; + + if FPersistSecurityInfo then + AddPropBool(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, FPersistSecurityInfo); + + // Prompt props + AddPropSmallInt(DBPROP_INIT_PROMPT, DBPROMPT_NOPROMPT); + AddPropInt(DBPROP_INIT_HWND, 0); + + SetProperties(FIDBProperties); + finally + Free; + end; + + // Set common SQL Server properties + with TOLEDBPropertiesSet.Create(Self, DBPROPSET_SQLSERVERDBINIT) do + try + if FWorkstationID <> '' then + AddPropStr(SSPROP_INIT_WSID, FWorkstationID); + + if FApplicationName <> '' then + AddPropStr(SSPROP_INIT_APPNAME, FApplicationName) + else + begin + {$IFDEF CLR} + AppName := StringBuilder.Create(MAX_PATH + 100); + try + BufLen := MAX_PATH + 100; + GetModuleFileName(0, AppName, BufLen); + s := ExtractFileName(AppName.ToString); + finally + AppName.Free; + end; + {$ELSE} + BufLen := sizeof(AppName); + GetModuleFileName(0, AppName, BufLen); + s := ExtractFileName(AppName); + {$ENDIF} + AddPropStr(SSPROP_INIT_APPNAME, s); + end; + + if FLanguage <> '' then + AddPropStr(SSPROP_INIT_CURRENTLANGUAGE, FLanguage, True); + + AddPropBool(SSPROP_INIT_AUTOTRANSLATE, FAutoTranslate, True); + + if GUIDToString(FProviderId) = GUIDToString(CLSID_SQLNCLI) then begin + if FMultipleActiveResultSets then + AddPropBool(SSPROP_INIT_MARSCONNECTION, FMultipleActiveResultSets); + if FOldPassword <> '' then + AddPropStr(SSPROP_AUTH_OLD_PASSWORD, FOldPassword); + end + else + if FOldPassword <> '' then + raise Exception.Create(SSQLNCLINeedsChangePwd); + + if FInitialFileName <> '' then + AddPropStr(SSPROP_INIT_FILENAME, FInitialFileName); + + if FFailoverPartner <> '' then + AddPropStr(SSPROP_INIT_FAILOVERPARTNER, FFailoverPartner); + + SetProperties(FIDBProperties); + finally + Free; + end; + + /// Isolated for easy error detection + if FEncrypt then /// Set only if FEncrypt = True. This needs for prevent troubles with 7.xxx clients + with TOLEDBPropertiesSet.Create(Self, DBPROPSET_SQLSERVERDBINIT) do + try + AddPropBool(SSPROP_INIT_ENCRYPT, FEncrypt); + try + SetProperties(FIDBProperties); + except + on E: Exception do + begin + AddInfoToErr(E, SBadEncrypt, []); + raise E; + end; + end; + finally + Free; + end; + /// Isolated for easy error detection + if FNetworkLibrary <> '' then + with TOLEDBPropertiesSet.Create(Self, DBPROPSET_SQLSERVERDBINIT) do + try + AddPropStr(SSPROP_INIT_NETWORKLIBRARY, FNetworkLibrary, True); + try + SetProperties(FIDBProperties); + except + on E: Exception do begin + AddInfoToErr(E, SBadNetworkLibrary, []); + raise E; + end; + end; + finally + Free; + end; + + /// Isolated for easy error detection + with TOLEDBPropertiesSet.Create(Self, DBPROPSET_SQLSERVERDBINIT) do + try + AddPropInt(SSPROP_INIT_PACKETSIZE, FPacketSize); + try + SetProperties(FIDBProperties); + except + on E: Exception do begin + AddInfoToErr(E, SBadPacketSize, []); + raise E; + end; + end; + finally + Free; + end; + end + else begin + with TOLEDBPropertiesSet.Create(Self, DBPROPSET_DBINIT) do + try + AddPropStr(DBPROP_INIT_DATASOURCE, FDatabase, True); + try + SetProperties(FIDBProperties); + except + on E: Exception do begin + AddInfoToErr(E, SBadDatabaseFile, []); + raise E; + end; + end; + finally + Free; + end; + + + with TOLEDBPropertiesSet.Create(Self, DBPROPSET_SSCE_DBINIT) do + try + if FPassword <> '' then + AddPropStr(DBPROP_SSCE_DBPASSWORD, FPassword); + //if FMaxDatabaseSize <> 128 then + AddPropInt(DBPROP_SSCE_MAX_DATABASE_SIZE, FMaxDatabaseSize); + + SetProperties(FIDBProperties); + finally + Free; + end; + end; +end; + +procedure TOLEDBConnection.Connect(const ConnectString: string); + procedure SetSessionProperties; + var + OLEDBProperties: TOLEDBPropertiesSet; + begin + OLEDBProperties := TOLEDBPropertiesSet.Create(Self, DBPROPSET_SESSION); + try + //Set transaction properties + with OLEDBProperties do begin + AddPropInt(DBPROP_SESS_AUTOCOMMITISOLEVELS, ConvertIsolationLevelToOLEDBIsoLevel(FIsolationLevel)) + end; + OLEDBProperties.SetProperties(FISessionProperties); + finally + OLEDBProperties.Free; + end; + end; + + procedure SetDataSourceProperties; + var + OLEDBProperties: TOLEDBPropertiesSet; + begin + OLEDBProperties := TOLEDBPropertiesSet.Create(Self, DBPROPSET_DATASOURCE); + try + //Set transaction properties + with OLEDBProperties do begin + AddPropBool(DBPROP_MULTIPLECONNECTIONS, True); + SetProperties(FIDBProperties); + end; + finally + OLEDBProperties.Free; + end; + end; + + function OpenProvider(const clsid: array of TGuid): HRESULT; + var + i: integer; + begin + Result := 0; + for i := Low(clsid) to High(clsid) do begin + Result := CoCreateInstance(clsid[i], + nil, + CLSCTX_INPROC_SERVER, + IID_IDBInitialize, + FIDBInitialize); + if Result <> REGDB_E_CLASSNOTREG then begin + FProviderId := clsid[i]; + Exit; + end; + end; + end; + +var + hr: HRESULT; + iu: IUnknown; +begin + if not FConnected then begin + try + hr := 0; + if FProvider = prAuto then + hr := OpenProvider([CLSID_SQLNCLI, CLSID_SQLOLEDB]) + else + if FProvider = prSQL then + hr := OpenProvider([CLSID_SQLOLEDB]) + else + if FProvider = prNativeClient then + hr := OpenProvider([CLSID_SQLNCLI]) + else + if FProvider = prCompact then + hr := OpenProvider([CLSID_SQLSERVERCE_3_0]) + else + DatabaseError(SBadProviderName); + if hr = REGDB_E_CLASSNOTREG then + DatabaseError(SMSSQLNotFound) + else + Check(hr, Component); + + QueryIntf(FIDBInitialize, {$IFDEF CLR}IDBProperties{$ELSE}IID_IDBProperties{$ENDIF}, FIDBProperties); + + //Set initialization properties. + SetConnectionProperties; + // SetDatabase(FDatabase); - setted on SetConnectionProperties + + //Now establish the connection to the data source. + hr := FIDBInitialize.Initialize; + if (hr = E_FAIL) and (FProvider = prCompact) then begin // Database file is not exist + CreateDatabase(FDatabase, FPassword, FEncrypt); + hr := FIDBInitialize.Initialize; + end; + Check(hr, Component); + + if FProvider <> prCompact then + SetDataSourceProperties; + + //Create the SessionObject + QueryIntf(FIDBInitialize, {$IFDEF CLR}IDBCreateSession{$ELSE}IID_IDBCreateSession{$ENDIF}, FIDBCreateSession); + Check(FIDBCreateSession.CreateSession(nil, IID_ISessionProperties, iu), Component); + FISessionProperties := ISessionProperties(iu); + if FProvider <> prCompact then + SetSessionProperties; + QueryIntf(FISessionProperties, {$IFDEF CLR}ITransactionLocal{$ELSE}IID_ITransactionLocal{$ENDIF}, FITransactionLocal); + + // Get properties ------------------------------ + GetConnectionProperties; + inherited; + FConnected := True; + + if not FQuotedIdentifier then + SetQuotedIdentifier(FQuotedIdentifier); + + except + on EFailOver do; + else begin + ReleaseInterfaces; + raise; + end; + end; + end; +end; + +procedure TOLEDBConnection.Disconnect; +begin + if FConnected then begin + if FIDBInitialize <> nil then + FIDBInitialize.Uninitialize;// check not need + + ReleaseInterfaces; + + FConnected := False; + FreeAndNil(FColumnsMetaInfo); + FreeAndNil(FColumnsRowsetFieldDescs); + end; +end; + +procedure TOLEDBConnection.Assign(Source: TOLEDBConnection); +begin + FConnectionTimeout := Source.FConnectionTimeout; + FServer := Source.FServer; + FUsername := Source.FUsername; + FPassword := Source.FPassword; + FDatabase := Source.FDatabase; + + FIsolationLevel := Source.FIsolationLevel; + FAuthentication := Source.FAuthentication; + FProvider := Source.FProvider; + + FQuotedIdentifier := Source.FQuotedIdentifier; + FLanguage := Source.FLanguage; + FEncrypt := Source.FEncrypt; + FPersistSecurityInfo := Source.FPersistSecurityInfo; + FAutoTranslate := Source.FAutoTranslate; + FNetworkLibrary := Source.FNetworkLibrary; + FApplicationName := Source.FApplicationName; + FWorkstationID := Source.FWorkstationID; + FPacketSize := Source.FPacketSize; + FMaxDatabaseSize := Source.FMaxDatabaseSize; +end; + +procedure TOLEDBConnection.SetIDBCreateSession(CreateSession: IDBCreateSession); +var + iu: IUnknown; +begin + Assert(not FConnected); + + //Obtain access to the SQLOLEDB provider. + try + FIDBCreateSession := CreateSession; + Check(FIDBCreateSession.CreateSession(nil, IID_ISessionProperties, iu), Component); + FISessionProperties := ISessionProperties(iu); + QueryIntf(FISessionProperties, {$IFDEF CLR}ITransactionLocal{$ELSE}IID_ITransactionLocal{$ENDIF}, FITransactionLocal); + + FConnected := True; + if not FQuotedIdentifier then + SetQuotedIdentifier(FQuotedIdentifier); + except + ReleaseInterfaces; + raise; + end; +end; + +function TOLEDBConnection.GetProp(Prop: integer; var Value: variant): boolean; +begin + Result := True; + + case Prop of + prDatabase: + Value := FDatabase; // string + prIsolationLevel: + Value := Integer(FIsolationLevel); + prAuthentication: + Value := Integer(FAuthentication); //TMSAuthentication + prConnectionTimeout: + Value := Integer(FConnectionTimeout); + prMaxDatabaseSize: + Value := Integer(FMaxDatabaseSize); + else + Result := inherited GetProp(Prop, Value); + end; + +end; + +function TOLEDBConnection.SetProp(Prop: integer; const Value: variant): boolean; +begin + Result := True; + case Prop of + prDatabase: + SetDatabase(Value); + prIsolationLevel: + FIsolationLevel := TIsolationLevel(Integer(Value)); + {prMultipleConnections: + FMultipleConnections := boolean(Value^);} + prAuthentication: + FAuthentication := TMSAuthentication(Integer(Value)); //TMSAuthentication + prProvider: + FProvider := TOLEDBProvider(Integer(Value)); + prConnectionTimeout: + FConnectionTimeout := Integer(Value); + prQuotedIdentifier: + SetQuotedIdentifier(boolean(Value)); + prLanguage: + FLanguage := Value; + prAutoTranslate: + FAutoTranslate := Boolean(Value); + prEncrypt: + FEncrypt := Boolean(Value); + prPersistSecurityInfo: + FPersistSecurityInfo := Boolean(Value); + prNetworkLibrary: + FNetworkLibrary := Value; + prApplicationName: + FApplicationName := Value; + prWorkstationID: + FWorkstationID := Value; + prPacketSize: + FPacketSize := Integer(Value); + prInitialFileName: + FInitialFileName := Value; + prMARS: + FMultipleActiveResultSets := Value; + prOldPassword: + FOldPassword := Value; + prMaxDatabaseSize: + FMaxDatabaseSize := Value; + prFailoverPartner: + FFailoverPartner := Value; + else + Result := inherited SetProp(Prop, Value); + end; +end; + +function TOLEDBConnection.CheckIsValid: boolean; +begin + FIsValid := FIDBInitialize <> nil; + if FIsValid then + try + ExecSQL(SCheckConnection); + except + FIsValid := False; + end; + Result := FIsValid; +end; + +procedure TOLEDBConnection.SetDatabase(const Value: string); +var + OLEDBProperties: TOLEDBPropertiesSet; +begin + if FIDBProperties <> nil then begin + OLEDBProperties := TOLEDBPropertiesSet.Create(Self, DBPROPSET_DATASOURCE); + try + with OLEDBProperties do + AddPropStr(DBPROP_CURRENTCATALOG, BracketIfNeed(Value)); + OLEDBProperties.SetProperties(FIDBProperties); + finally + OLEDBProperties.Free; + end; + end; + FDatabase := Value; +end; + +procedure TOLEDBConnection.SetQuotedIdentifier(const Value: boolean); +begin + FQuotedIdentifier := Value; + + if FConnected then + if Value then + ExecSQL('SET QUOTED_IDENTIFIER ON') + else + ExecSQL('SET QUOTED_IDENTIFIER OFF'); +end; + +procedure TOLEDBConnection.ExecSQL(const Text: string); +begin + if FCommand = nil then begin + FCommand := TOLEDBCommand.Create; + TOLEDBCommand(FCommand).FConnection := Self; + end; + + with FCommand do begin + SetSQL(Text); + try + Execute; + finally + FCommand.SetCursorState(csInactive); // To prevent blocking execute on second exec + end; + end; +end; + +class procedure TOLEDBConnection.AssignFieldDescs(Source, Dest: TFieldDescs); +var + i: integer; + Field, FieldSource: TOLEDBFieldDesc; +begin + Dest.Clear; + for i := 0 to Source.Count - 1 do begin + FieldSource := Source[i] as TOLEDBFieldDesc; + Field := TOLEDBFieldDesc.Create; + Dest.Add(Field); + Field.Name := FieldSource.Name; + Field.ActualName := FieldSource.ActualName; + // FTableName: string; //table of name that holds this field + Field.DataType := FieldSource.DataType; + Field.SubDataType := FieldSource.SubDataType; + Field.Length := FieldSource.Length; // precision for number + Field.Scale := FieldSource.Scale; + Field.FieldNo := FieldSource.FieldNo; + Field.ActualFieldNo := FieldSource.ActualFieldNo; + Field.Size := FieldSource.Size; + //Field.DataSize := FieldSource.DataSize; + Field.Offset := FieldSource.Offset; + Field.DataOffset := FieldSource.DataOffset; + Field.Required := FieldSource.Required; + Field.ReadOnly := FieldSource.ReadOnly; + Field.IsKey := FieldSource.IsKey; + Field.Fixed := FieldSource.Fixed; + Field.Hidden := FieldSource.Hidden; + //Field.ObjectType := FieldSource.ObjectType; + //Field.ParentField := FieldSource.ParentField; + //Field.HiddenObject := FieldSource.HiddenObject; + //FHandle: IntPtr; // IntPtr to field specific data + //FReserved: boolean; // reserved flag for perfomance optimization + end; +end; + +{$IFDEF CLR} +procedure TOLEDBConnection.DoError(E: Exception; var Fail: boolean); +begin + inherited; +end; +{$ENDIF} + +procedure TOLEDBConnection.CreateDatabase(const Database: string; const Password: string; const Encrypted: boolean); +var + pIDBDataSourceAdmin: IDBDataSourceAdmin; + pIUnknownSession: IUnknown; + + PPropertySet: IntPtr; + PropertySet: PDBPropSet; + PDBProperty: IntPtr; + DBProperty: PDBProp; + PSSCEProperty: IntPtr; + SSCEProperty: PDBPROP; +begin + PPropertySet := nil; + PDBProperty := nil; + PSSCEProperty := nil; + try + Check(CoCreateInstance(CLSID_SQLSERVERCE_3_0, nil, CLSCTX_INPROC_SERVER, + IID_IDBDataSourceAdmin, pIDBDataSourceAdmin), Component); + + PDBProperty := Marshal.AllocHGlobal(SizeOfDBProp); + FillChar(PDBProperty, SizeOfDBProp, $00); + DBProperty := PDBProperty; + DBProperty.dwPropertyID := DBPROP_INIT_DATASOURCE; + DBProperty.dwOptions := DBPROPOPTIONS_REQUIRED; + DBProperty.vValue := Database; + + PSSCEProperty := Marshal.AllocHGlobal(SizeOfDBProp * 2); + FillChar(PSSCEProperty, SizeOfDBProp * 2, $00); + SSCEProperty := PSSCEProperty; + SSCEProperty.dwPropertyID := DBPROP_SSCE_ENCRYPTDATABASE; + SSCEProperty.dwOptions := DBPROPOPTIONS_REQUIRED; + SSCEProperty.vValue := VarAsType(Encrypted, VT_BOOL); + + SSCEProperty := IntPtr(Integer(PSSCEProperty) + SizeOfDBProp); + SSCEProperty.dwPropertyID := DBPROP_SSCE_DBPASSWORD; + SSCEProperty.dwOptions := DBPROPOPTIONS_REQUIRED; + SSCEProperty.vValue := Password; + + PPropertySet := Marshal.AllocHGlobal(SizeOf(DBPROPSET) * 2); + FillChar(PPropertySet, SizeOf(DBPROPSET) * 2, $00); + PropertySet := PPropertySet; + PropertySet.guidPropertySet := DBPROPSET_DBINIT; + PropertySet.rgProperties := PDBProperty; + PropertySet.cProperties := 1; + + PropertySet := IntPtr(Integer(PPropertySet) + SizeOf(DBPROPSET)); + PropertySet.guidPropertySet := DBPROPSET_SSCE_DBINIT ; + PropertySet.rgProperties := PSSCEProperty; + PropertySet.cProperties := 2; + + Check(pIDBDataSourceAdmin.CreateDataSource(2, PPropertySet, nil, + IID_IUnknown, pIUnknownSession), Component); + finally + pIUnknownSession := nil; + if PPropertySet <> nil then + Marshal.FreeHGlobal(PPropertySet); + if PSSCEProperty <> nil then + Marshal.FreeHGlobal(PSSCEProperty); + if PDBProperty <> nil then + Marshal.FreeHGlobal(PDBProperty); + end; +end; + +function TOLEDBConnection.GetSchemaRowset(const Schema: TGUID; rgRestrictions: TRestrictions): IRowset; +var + i: integer; + iu: IUnknown; + DBSchemaRowset: IDBSchemaRowset; + rgRestrictionsPtr: IntPtr; +begin + for i := Low(rgRestrictions) to High(rgRestrictions) do + if (VarType(rgRestrictions[i]) = varOleStr) and (String(rgRestrictions[i]) = '') then + rgRestrictions[i] := Null; // + // rgRestrictions[i] := Unassigned; + // TVarData(rgRestrictions[i]).VType := varNull; + + QueryIntf(SessionProperties, {$IFDEF CLR}IDBSchemaRowset{$ELSE}IID_IDBSchemaRowset{$ENDIF}, DBSchemaRowset); + +{$IFDEF CLR} + i := 16 {SizeOf(OleVariant)} * Length(rgRestrictions); + rgRestrictionsPtr := Marshal.AllocHGlobal(i); + try + FillChar(rgRestrictionsPtr, i, 0); + for i := Low(rgRestrictions) to High(rgRestrictions) do + SetOleVariant(IntPtr(Integer(rgRestrictionsPtr) + 16 {SizeOf(OleVariant)} * (Integer(i) - Low(rgRestrictions))), rgRestrictions[i]); +{$ELSE} + rgRestrictionsPtr := @rgRestrictions[0]; +{$ENDIF} + Check(DBSchemaRowset.GetRowset(nil, Schema, Length(rgRestrictions), rgRestrictionsPtr, + IID_IRowset, 0, nil, iu), Component); +{$IFDEF CLR} + finally + for i := Low(rgRestrictions) to High(rgRestrictions) do + OleVarClear(IntPtr(Integer(rgRestrictionsPtr) + 16 {SizeOf(OleVariant)} * (Integer(i) - Low(rgRestrictions)))); + Marshal.FreeHGlobal(rgRestrictionsPtr); + end; +{$ENDIF} + Result := IRowset(iu); + iu := nil; +end; + +{ TOLEDBCommand } + +procedure TOLEDBCommand.Check(const Status: HRESULT); +begin + Assert(FConnection <> nil); + if Status <> S_OK then + FConnection.Check(Status, Component); +end; + +constructor TOLEDBCommand.Create; +begin + inherited; + FQueryIntCnt := 0; + FRequestIUnknown := False; + FParamsAccessorDataAvaible := False; + + FRowsAffected := -1; + + FCursorState := csInactive; + + FBreakExecCS := TCriticalSection.Create; +end; + +destructor TOLEDBCommand.Destroy; +begin + if FNonBlocking and (FISSAsynchStatus <> nil) then + BreakExec; + FISSAsynchStatus := nil; + ClearIMultipleResults; + FIUnknownNext := nil; /// Clear this interface before RequestParams to avoid AV. See TDbxSdaTestSet.DoTestSPNextRecordSet + RequestParamsIfPossible; + UnPrepare; + Assert(FQueryIntCnt = 0, Format('TOLEDBCommand.Destroy - interfaces not released (%d)', [FQueryIntCnt])); + FBreakExecCS.Free; + + inherited; +end; + +procedure TOLEDBCommand.QueryInterfaces(const QueryPrepare: boolean); // QueryPrepare must be True to request IID_ICommandPrepare +var + CreateCommand: IDBCreateCommand; + iu: IUnknown; +begin + if FQueryIntCnt = 0 then begin + Assert(FConnection <> nil); + QueryIntf(FConnection.FISessionProperties, {$IFDEF CLR}IDBCreateCommand{$ELSE}IID_IDBCreateCommand{$ENDIF}, CreateCommand); + + Check(CreateCommand.CreateCommand(nil, IID_ICommandText, iu)); + FICommandText := ICommandText(iu); + if QueryPrepare then + QueryIntf(FICommandText, {$IFDEF CLR}ICommandPrepare{$ELSE}IID_ICommandPrepare{$ENDIF}, FICommandPrepare) + else + FICommandPrepare := nil; + QueryIntf(FICommandText, {$IFDEF CLR}ICommandProperties{$ELSE}IID_ICommandProperties{$ENDIF}, FICommandProperties); + end; + + Inc(FQueryIntCnt); +end; + +procedure TOLEDBCommand.ReleaseInterfaces; +begin + if FQueryIntCnt = 0 then // Exception on TOLEDBRecordSet.InternalOpen -> TOLEDBRecordSet.QueryCommandInterfaces -> TOLEDBCommand.QueryInterfaces + Exit; + + if FQueryIntCnt = 1 then begin + FBreakExecCS.Acquire; + try + FICommandText := nil; + finally + FBreakExecCS.Release; + end; + FICommandPrepare := nil; + FICommandProperties := nil; + end; + + Dec(FQueryIntCnt); +end; +(*procedure TOLEDBCommand.GetCommandProp; +var + rgPropertySets, pPropSet: PDBPropSet; + cPropertySets: UINT; + s: string; +// PropCnt: integer; +begin + try + Check(FICommandProperties.GetProperties(0, nil, + cPropertySets, PDBPropSet(rgPropertySets))); + + Assert(rgPropertySets <> nil, 'Cannot get connection properties'); + + pPropSet := rgPropertySets; // DBPROPSET_ROWSET +// PropCnt := pPropSet.cProperties; + s := pPropSet.rgProperties[0].vValue; + PChar(pPropSet) := PChar(pPropSet) + sizeof(DBPropSet);//DBPROPSET_SQLSERVERROWSET + s := pPropSet.rgProperties[0].vValue; + s := pPropSet.rgProperties[1].vValue; + s := pPropSet.rgProperties[2].vValue; + s := pPropSet.rgProperties[3].vValue; + finally + + FConnection.Malloc.Free(rgPropertySets.rgProperties); + FConnection.Malloc.Free(rgPropertySets); + end; +end; + +type + PDBParamInfoArray = ^TDBParamInfoArray; + TDBParamInfoArray = array[0..MAXBOUND] of DBPARAMINFO; +*) + +procedure TOLEDBCommand.SetCommandProp; +var + OLEDBProperties: TOLEDBPropertiesSet; + Str: WideString; + g: TGUID; +begin +{$IFDEF SDAC_TEST} + Inc(__SetCommandPropCount); +{$ENDIF} + Assert(FICommandText <> nil); + + Str := FSQL; + g := DBGUID_DEFAULT; + + Check(FICommandText.SetCommandText(g, {$IFDEF CLR}Str{$ELSE}PWideChar(Str){$ENDIF})); + + OLEDBProperties := TOLEDBPropertiesSet.Create(FConnection, DBPROPSET_ROWSET); + try + with OLEDBProperties do begin + if FConnection.FProvider <> prCompact then + AddPropInt(DBPROP_COMMANDTIMEOUT, FCommandTimeout); + if FNonBlocking and (not FRequestIUnknown) then begin + if GUIDToString(FConnection.FProviderId) <> GUIDToString(CLSID_SQLNCLI) then + raise Exception.Create(SSQLNCLINeeds); + AddPropInt(DBPROP_ROWSET_ASYNCH, DBPROPVAL_ASYNCH_INITIALIZE); + end; + end; + OLEDBProperties.SetProperties(FICommandProperties); + finally + OLEDBProperties.Free; + end; + + if FSmartRefresh then begin + OLEDBProperties := TOLEDBPropertiesSet.Create(FConnection, DBPROPSET_SQLSERVERROWSET); + try + with OLEDBProperties do begin + AddPropStr(SSPROP_QP_NOTIFICATION_MSGTEXT, WideString(FSmartRefreshMsg), True); + AddPropStr(SSPROP_QP_NOTIFICATION_OPTIONS, Format('service=%s', [FSmartRefreshService]), True); + end; + OLEDBProperties.SetProperties(FICommandProperties); + finally + OLEDBProperties.Free; + end; + end; +end; + +procedure TOLEDBCommand.SetParameterInfo; +var + CommandWithParameters: ICommandWithParameters; + + i: integer; + rgParamOrdinals: array of UInt; + rgParamBindInfo: array of TDBParamBindInfo; + ParamDesc: TParamDesc; + hr: HResult; + ParamCount: integer; + + ParamVarType: TVarType; + prgParamOrdinals: IntPtr; + prgParamBindInfo: IntPtr; +{$IFDEF CLR} + rgParamOrdinalsGC: GCHandle; + rgParamBindInfoGC: GCHandle; +{$ENDIF} + IsUnicode: boolean; + +begin + QueryIntf(FICommandText, {$IFDEF CLR}ICommandWithParameters{$ELSE}IID_ICommandWithParameters{$ENDIF}, CommandWithParameters); + CommandWithParameters.SetParameterInfo(0, nil, nil); /// Clear, just in case + + ParamCount := FParams.Count; + + if ParamCount <> 0 then begin + SetLength(rgParamOrdinals, ParamCount); + SetLength(rgParamBindInfo, ParamCount); + + //OFS('================================='); + for i := 0 to ParamCount - 1 do begin + ParamDesc := FParams[i]; + rgParamOrdinals[i] := i + 1; + + case ParamDesc.GetDataType and varTypeMask of + dtUnknown: begin + ParamVarType := VarType(ParamDesc.Value); + case ParamVarType of + varSmallint: { vt_i2 2 } + rgParamBindInfo[i].pwszDataSourceType := dstSmallint; + varInteger: { vt_i4 3 } + rgParamBindInfo[i].pwszDataSourceType := dstInt; + varSingle: { vt_r4 4 } + rgParamBindInfo[i].pwszDataSourceType := dstReal; + varDouble: { vt_r8 5 } + rgParamBindInfo[i].pwszDataSourceType := dstFloat; + varCurrency: { vt_cy 6 } + rgParamBindInfo[i].pwszDataSourceType := dstMoney; + varDate: { vt_date 7 } + rgParamBindInfo[i].pwszDataSourceType := dstDatetime; + varOleStr: { vt_bstr 8 } + rgParamBindInfo[i].pwszDataSourceType := dstNVarchar; + {$IFNDEF CLR} + varString: + rgParamBindInfo[i].pwszDataSourceType := dstVarchar; + {$ENDIF} + varBoolean: { vt_bool 11 } + rgParamBindInfo[i].pwszDataSourceType := dstBit; + {$IFDEF VER6P} + varShortInt: + rgParamBindInfo[i].pwszDataSourceType := dstTinyint; + varWord: + rgParamBindInfo[i].pwszDataSourceType := dstInt; + varInt64: { vt_i8 20 } + rgParamBindInfo[i].pwszDataSourceType := dstBigint; + {$ENDIF} + varByte: { vt_ui1 17 } + rgParamBindInfo[i].pwszDataSourceType := dstSmallint; + varLongWord: { vt_ui4 19 } + rgParamBindInfo[i].pwszDataSourceType := dstBigint; + else + rgParamBindInfo[i].pwszDataSourceType := dstSql_variant; + end; + end; + + dtString, dtExtString: + if IsOutputLOB(ParamDesc, FConnection.DBMSPrimaryVer, FConnection.ProviderPrimaryVer) then + rgParamBindInfo[i].pwszDataSourceType := dstVarcharMax + else + rgParamBindInfo[i].pwszDataSourceType := dstVarchar; + + dtWideString, dtExtWideString: + if IsOutputLOB(ParamDesc, FConnection.DBMSPrimaryVer, FConnection.ProviderPrimaryVer) then + rgParamBindInfo[i].pwszDataSourceType := dstNVarcharMax + else + rgParamBindInfo[i].pwszDataSourceType := dstNVarchar; + + dtInt8: + rgParamBindInfo[i].pwszDataSourceType := dstTinyint; + dtInt16: + rgParamBindInfo[i].pwszDataSourceType := dstSmallint; + dtInt32, dtUInt16: + rgParamBindInfo[i].pwszDataSourceType := dstInt; + dtInt64, dtUInt32: + rgParamBindInfo[i].pwszDataSourceType := dstBigint; + dtFloat: + rgParamBindInfo[i].pwszDataSourceType := dstFloat; + dtDate, dtTime, dtDateTime: + rgParamBindInfo[i].pwszDataSourceType := dstDatetime; + dtBoolean: + rgParamBindInfo[i].pwszDataSourceType := dstBit; + dtCurrency: + rgParamBindInfo[i].pwszDataSourceType := dstMoney; + dtBlob: + rgParamBindInfo[i].pwszDataSourceType := dstImage; + dtMemo, dtWideMemo, dtMSXML: begin + {$IFDEF CLR} + IsUnicode := (VarType(ParamDesc.Value) = varOleStr) or (VarType(ParamDesc.Value) = varString); + if not IsUnicode + and (ParamDesc.Value <> nil) + and (ParamDesc.Value is TBlob) then + IsUnicode := TBlob(ParamDesc.Value).IsUnicode; + {$ELSE} + IsUnicode := VarType(ParamDesc.Value) = varOleStr; + if not IsUnicode + and (VarType(ParamDesc.Value) = varByRef) + and (TVarData(ParamDesc.Value).VPointer <> nil) then begin + // Assert(TObject(TVarData(ParamDesc.Value).VPointer) is TBlob); - trial + IsUnicode := TBlob(TVarData(ParamDesc.Value).VPointer).IsUnicode; + end; + {$ENDIF} + + if IsUnicode then + rgParamBindInfo[i].pwszDataSourceType := dstNVarchar + else + rgParamBindInfo[i].pwszDataSourceType := dstVarchar; + end; + + {$IFDEF VER5P} + dtVariant: + rgParamBindInfo[i].pwszDataSourceType := dstSql_variant; + {$ENDIF} + dtBytes: + rgParamBindInfo[i].pwszDataSourceType := dstBinary; + dtVarBytes, dtExtVarBytes: + rgParamBindInfo[i].pwszDataSourceType := dstVarbinary; + + {$IFDEF VER6P} + dtFMTBCD, + {$ENDIF} + dtBCD: + rgParamBindInfo[i].pwszDataSourceType := dstMoney; + + dtGuid: + rgParamBindInfo[i].pwszDataSourceType := dstGuid; + + else + Assert(False, Format('Unknown datatype for param %s[%d] = %X', [ParamDesc.GetName, i, ParamDesc.GetDataType])); + end; + + case ParamDesc.GetDataType of + dtString, dtExtString, dtBytes, dtVarBytes, dtExtVarBytes: + if ParamDesc.GetSize > 0 then + rgParamBindInfo[i].ulParamSize := ParamDesc.GetSize + else + rgParamBindInfo[i].ulParamSize := MaxNonBlobFieldLen; + dtWideString, dtExtWideString: + if ParamDesc.GetSize > 0 then + rgParamBindInfo[i].ulParamSize := ParamDesc.GetSize + else + rgParamBindInfo[i].ulParamSize := MaxNonBlobFieldLen div SizeOf(WideChar); + else + rgParamBindInfo[i].ulParamSize := $FFFFFFF; + end; + case ParamDesc.GetParamType of + pdInput: + rgParamBindInfo[i].dwFlags := DBPARAMFLAGS_ISINPUT + DBPARAMFLAGS_ISNULLABLE; + pdOutput, pdResult: + rgParamBindInfo[i].dwFlags := DBPARAMFLAGS_ISOUTPUT + DBPARAMFLAGS_ISNULLABLE; + pdUnknown, pdInputOutput: + rgParamBindInfo[i].dwFlags := DBPARAMFLAGS_ISINPUT + DBPARAMFLAGS_ISOUTPUT + DBPARAMFLAGS_ISNULLABLE; + end; + + rgParamBindInfo[i].pwszName := nil; + + {OFS(ParamDesc.GetName); + OFS(' ' + Marshal.PtrToStringUni(rgParamBindInfo[i].pwszDataSourceType)); + OFS(' ulParamSize = ' + IntToStr(rgParamBindInfo[i].ulParamSize)); + OFS(' dwFlags = ' + IntToStr(rgParamBindInfo[i].dwFlags)); + OFS(' bPrecision = ' + IntToStr(rgParamBindInfo[i].bPrecision)); + OFS(' bScale = ' + IntToStr(rgParamBindInfo[i].bScale));//} + + end; + {$IFDEF CLR} + try + rgParamOrdinalsGC := GCHandle.Alloc(rgParamOrdinals, GCHandleType.Pinned); + prgParamOrdinals := Marshal.UnsafeAddrOfPinnedArrayElement(rgParamOrdinals, 0); + + rgParamBindInfoGC := GCHandle.Alloc(rgParamBindInfo, GCHandleType.Pinned); + prgParamBindInfo := Marshal.UnsafeAddrOfPinnedArrayElement(rgParamBindInfo, 0); + + {$ELSE} + + prgParamOrdinals := @rgParamOrdinals[0]; + prgParamBindInfo := @rgParamBindInfo[0]; + {$ENDIF} + + {OFS('prgParamOrdinals'); + OFS(prgParamOrdinals, ParamCount * 4, OFSFileName); + OFS('prgParamBindInfo'); + OFS(prgParamBindInfo, ParamCount * sizeof(rgParamBindInfo[0]), OFSFileName);//} + hr := CommandWithParameters.SetParameterInfo(ParamCount, prgParamOrdinals, prgParamBindInfo); + {$IFDEF CLR} + finally + if IntPtr(rgParamOrdinalsGC) <> nil then + rgParamOrdinalsGC.Free; + if IntPtr(rgParamBindInfoGC) <> nil then + rgParamBindInfoGC.Free; + end; + {$ENDIF} + + if hr <> DB_S_TYPEINFOOVERRIDDEN then + Check(hr); + end; +end; + +procedure TOLEDBCommand.Prepare; +begin + if GetPrepared then + Exit; + + QueryInterfaces(True); + try + FRPCCall := FIsSProc and __UseRPCCallStyle; + SetCommandProp; + if FRPCCall or (not ParamsInfoOldBehavior) then + SetParameterInfo; + + Check(FICommandPrepare.Prepare(0)); // If statement is wrong in some cases exception may be occured in other place + {$IFDEF SDAC_TEST} + Inc(__ServerPrepareCount); + {$ENDIF} + + inherited; + FPrepared := True; + except + ReleaseInterfaces; + raise; + end; +end; + +procedure TOLEDBCommand.Unprepare; +begin + if GetPrepared then begin + FIUnknown := nil; + RequestParamsIfPossible; + + if (FICommandPrepare <> nil) and not FRPCCall then + Check(FICommandPrepare.UnPrepare); + inherited; + FPrepared := False; + FRPCCall := False; + + ReleaseInterfaces; + end; +end; + +function TOLEDBCommand.GetPrepared: boolean; +begin + Result := FPrepared; +end; + +{$IFNDEF VER6P} +type + _TParamDesc = class (TParamDesc); +{$ENDIF} + +procedure FillBindingForParam(Ordinal: integer; ParamDesc: TOLEDBParamDesc; Connection: TOLEDBConnection; + var pBind: TDBBinding; var BindMemorySize: UINT; const ValueAvaliable: boolean; const IsWide: boolean); + + procedure SetBindDefaults; + begin + pBind.dwPart := DBPART_STATUS or DBPART_LENGTH or DBPART_VALUE; // WAR Length is not always need and may be removed in some cases + {$IFNDEF CLR} + pointer(pBind.pTypeInfo) := nil; + {$ENDIF} + pBind.pBindExt := nil; + pBind.dwMemOwner := DBMEMOWNER_CLIENTOWNED; + pBind.dwFlags := 0; + pBind.bPrecision := 11; + pBind.bScale := 0; + end; + + procedure SetBindData; + function GetMaxLen: integer; // Also correct pBind.wType. Must be called AFTER ConvertInternalTypeToOLEDB + var + IsUnicode: boolean; + DataType: word; + begin + DataType := ParamDesc.GetDataType; + case DataType of + dtUnknown: + Result := sizeof(OleVariant); + dtString: + if not ValueAvaliable then + Result := MaxNonBlobFieldLen + else + Result := ParamDesc.GetSize + 1{#0}; + dtWideString: + Result := (ParamDesc.GetSize + 1{#0}) * sizeof(WideChar); + dtBytes, dtVarBytes: + Result := ParamDesc.GetSize; + dtInt8: + Result := sizeof(byte); + dtInt16, dtWord: + if Connection.FProvider = prCompact then begin + if (ParamDesc.OLEDBType = DBTYPE_UI1) then begin + Result := SizeOf(Byte); + pBind.wType := DBTYPE_UI1; + end + else + Result := sizeof(word); + end + else + Result := sizeof(word); + dtInt32: + Result := sizeof(dword); + dtFloat: + if Connection.FProvider = prCompact then begin + if (ParamDesc.OLEDBType = DBTYPE_R4) then begin + Result := SizeOf(Single); + pBind.wType := DBTYPE_R4; + end + else + if (ParamDesc.OLEDBType = DBTYPE_NUMERIC) then begin + Result := SizeOfTDBNumeric; + pBind.wType := DBTYPE_NUMERIC; + end + else + Result := SizeOf(double); + end + else + Result := sizeof(double); + dtCurrency: + Result := sizeof(double); + // Result := sizeof(Currency); Currency type cannot be used over TCurrencyField uses double to store + dtDate: + Result := sizeof(TDateTime); + dtDateTime, dtTime: + begin + Result := sizeof(TDBTimeStamp); + pBind.wType := DBTYPE_DBTIMESTAMP; + end; + dtBoolean: + Result := sizeof(WordBool); + dtInt64: + Result := sizeof(Int64); + dtBlob, dtMemo, dtWideMemo, dtMSXML: + if Connection.FProvider <> prCompact then + if IsOutputLOB(ParamDesc, Connection.DBMSPrimaryVer, Connection.ProviderPrimaryVer) then + Result := SizeOf(TOLEDBStream) // varchar(max) + else + Result := 0 // Only Input, store ByRef + else begin + if ((DataType = dtMemo) or (DataType = dtWideMemo)) and (ParamDesc.OLEDBType in [DBTYPE_STR, DBTYPE_WSTR]) then begin + Result := TBlob(ParamDesc.GetObject).Size; + pBind.wType := ParamDesc.OLEDBType; + end + else + Result := SizeOf(TOLEDBStream); + end; + {$IFDEF VER5P} + dtGuid: + Result := sizeof(TGuid); + dtVariant: + Result := sizeof(OleVariant); + {$ENDIF} + dtBCD: + if Connection.FProvider <> prCompact then + Result := sizeof(Currency) + else begin + Result := SizeOfTDBNumeric; + pBind.wType := DBTYPE_NUMERIC; + end; + {$IFDEF VER6P} + dtFmtBCD: + if Connection.FProvider <> prCompact then + Result := SizeOfTBcd * 2 + else + Result := SizeOfTDBNumeric; + {$ENDIF} + else + Result := 0; + end; + + if (Connection.FProvider = prCompact) and IsLargeDataTypeUsed(ParamDesc) and ParamDesc.GetNull then begin + Result := 0; + case ParamDesc.GetDataType of + dtBlob: + pBind.wType := DBTYPE_BYTES; + dtMemo, dtWideMemo: + pBind.wType := DBTYPE_WSTR; + else + Assert(False); + end; + end; + + // Optimization for input-only parameters + if (((ParamDesc.GetParamType = pdInput) and (DataType in CharsByRef + BytesByRef) {$IFDEF CLR}and (DataType <> dtString){$ENDIF}) + or (DataType = dtBlob) + or (DataType = dtMemo) + or (DataType = dtWideMemo) + or (DataType = dtMSXML)) + and (Connection.FProvider <> prCompact) + and (not IsOutputLOB(ParamDesc, Connection.DBMSPrimaryVer, Connection.ProviderPrimaryVer)) then begin + // Only Input, store ByRef + Result := 4; + if (DataType in BytesByRef) then // This is Bytes by Ref + pBind.wType := DBTYPE_BYREF or DBTYPE_BYTES + else // This is (Wide)String by Ref + begin + {$IFDEF CLR} + if not ValueAvaliable then + IsUnicode := (ParamDesc.GetDataType in [dtWideString, dtExtWideString]) or IsWide + else + IsUnicode := (VarType(ParamDesc.Value) = varOleStr) or (VarType(ParamDesc.Value) = varString); + if not IsUnicode + and (ParamDesc.Value <> nil) + and (ParamDesc.Value is TBlob) then + IsUnicode := TBlob(ParamDesc.Value).IsUnicode; + {$ELSE} + if not ValueAvaliable then + IsUnicode := (ParamDesc.GetDataType in [dtWideString, dtExtWideString]) or IsWide + else + IsUnicode := VarType(ParamDesc.Value) = varOleStr; + if not IsUnicode + and (VarType(ParamDesc.Value) = varByRef) + and (TVarData(ParamDesc.Value).VPointer <> nil) then begin + // Assert(TObject(TVarData(ParamDesc.Value).VPointer) is TBlob); - trial + IsUnicode := TBlob(TVarData(ParamDesc.Value).VPointer).IsUnicode; + end; + {$ENDIF} + + if IsUnicode then // WideString + pBind.wType := DBTYPE_BYREF or DBTYPE_WSTR + else // (VType = varString) String + pBind.wType := DBTYPE_BYREF or DBTYPE_STR; + end; + end + else + if (ParamDesc.GetParamType in [pdOutput, pdInputOutput]) // Truncate params, if too long + and (DataType in [dtString, dtWideString, dtBytes, dtVarBytes]) then begin + if not ((Connection.DBMSPrimaryVer >= 9) and (Connection.ProviderPrimaryVer >=9) and (Result > MaxNonBlobFieldLen)) then + if DataType = dtString then + Result := MaxNonBlobFieldLen + 1 + else + Result := MaxNonBlobFieldLen; + end; + + Assert(Result >= 0); +// Assert(Result <= MaxNonBlobFieldLen + 1); + end; + + var + ServerVersion: integer; + begin +{ if pBind.iOrdinal = 1 then + OFS('=========================================='); + OFS('--------------------------'); + OFS('ParamDesc.GetName ' + ParamDesc.GetName); + OFS('VarType(ParamDesc.Value) = ' + IntToStr(VarType(ParamDesc.Value)));} + + pBind.iOrdinal := Ordinal; + pBind.eParamIO := ConvertCRParamTypeToOLEDB(ParamDesc.GetParamType); + if IsLargeDataTypeUsed(ParamDesc) and // "text", "ntext", "image" + (pBind.eParamIO in [DBPARAMIO_OUTPUT, DBPARAMIO_INPUT + DBPARAMIO_OUTPUT]) then + if not IsOutputLOB(ParamDesc, Connection.DBMSPrimaryVer, Connection.ProviderPrimaryVer) then // "varchar(max)" + DatabaseErrorFmt(SBadOutputParam, [ParamDesc.GetName]); + + // int64 parameters conversion + if ((Connection.ProviderPrimaryVer < 8) and not IsWindowsVista) and (Connection.FProvider <> prCompact) and + (ParamDesc.GetDataType = dtInt64) then + ParamDesc.SetDataType(dtFloat); + + // currency parameters conversion + if (ParamDesc.GetDataType = dtCurrency) and (VarType(ParamDesc.Value) = varCurrency) then + ParamDesc.SetDataType(dtBCD); // To prevent SQL Server exception on setting float value to smallmoney parameter + + if Connection <> nil then + ServerVersion := Connection.DBMSPrimaryVer + else + ServerVersion := 0; + pBind.wType := ConvertInternalTypeToOLEDB(ParamDesc.GetDataType, True, ServerVersion); + (* Not used + if pBind.wType = DBTYPE_IUNKNOWN then begin + GetMem1(pBind.pObject, sizeof(DBOBJECT)); + pBind.pObject^.iid := IID_ISequentialStream; + if pBind.eParamIO = DBPARAMIO_INPUT then + pBind.pObject^.dwFlags := STGM_READ + else + pBind.pObject^.dwFlags := STGM_READWRITE; + end;*) + + pBind.obStatus := BindMemorySize; + pBind.obLength := BindMemorySize + sizeof(DWORD); + pBind.obValue := BindMemorySize + sizeof(DWORD) + sizeof(UINT); + + pBind.cbMaxLen := GetMaxLen; // Also correct pBind.wType. Must be called AFTER ConvertInternalTypeToOLEDB + if not ((ServerVersion = 3) and ((pBind.wType = DBTYPE_BYTES) or (pBind.wType = DBTYPE_WSTR))) then + Assert(pBind.cbMaxLen > 0, Format('Unknown datatype for param %s[%d] = %X', [ParamDesc.GetName, Ordinal, ParamDesc.GetDataType])); + BindMemorySize := pBind.obValue + pBind.cbMaxLen; + + {OFS('iOrdinal = ' + IntToStr(pBind.iOrdinal)); + OFS('obValue = ' + IntToStr(pBind.obValue)); + OFS('obLength = ' + IntToStr(pBind.obLength)); + OFS('obStatus = ' + IntToStr(pBind.obStatus)); + OFS('pTypeInfo = ' + IntToStr(Integer(pBind.pTypeInfo))); + OFS('pObject = ' + IntToStr(Integer(pBind.pObject))); + OFS('pBindExt = ' + IntToStr(Integer(pBind.pBindExt))); + OFS('dwPart = ' + IntToStr(pBind.dwPart)); + OFS('dwMemOwner = ' + IntToStr(pBind.dwMemOwner)); + OFS('eParamIO = ' + IntToStr(pBind.eParamIO)); + OFS('cbMaxLen = ' + IntToStr(pBind.cbMaxLen)); + OFS('dwFlags = ' + IntToStr(pBind.dwFlags)); + OFS('wType = ' + IntToStr(pBind.wType)); + OFS('bPrecision = ' + IntToStr(pBind.bPrecision)); + OFS('bScale = ' + IntToStr(pBind.bScale));} + end; + +begin + SetBindDefaults; + SetBindData; +end; + +procedure SaveParamValue(const ParamDesc: TParamDesc; const pBind: TDBBinding; + var ParamsAccessorData: TParamsAccessorData{$IFDEF HAVE_COMPRESS}; + const CompressBlobMode: TCompressBlobMode{$ENDIF} + {$IFDEF CLR}; var ParamsGC: TIntPtrDynArray{$ENDIF}; ServerVersion, ClientVersion: integer); +var + pStatus: PDWORD; + pLength: PUINT; + pValue: IntPtr; + // pParamData: PVarData; + ParamVarType: TVarType; + ParamVarPtr: IntPtr; + + s: string; + l: UINT; + ws: WideString; + + c: Currency; + i64: Int64; + + Blob: TBlob; +{$IFDEF CLR} + d: double; + b: TBytes; +{$ENDIF} +{$IFDEF VER6P} + DotPos: integer; + Bcd: TBcd; +{$ENDIF} +{$IFDEF HAVE_COMPRESS} + Compress: boolean; +{$ENDIF} + dt: TDateTime; + AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; + DBTimeStamp: TDBTimeStamp; + DBNumeric: TDBNumeric; + Stream: ISequentialStream; + OLEDBStream: TOLEDBStream; +begin + {OFS('-------'); + OFS('[' + IntToStr(pBind.iOrdinal) + ']'); + OFS('pBind.eParamIO=' + IntToStr(pBind.eParamIO)); + OFS('pBind.obValue=' + IntToStr(pBind.obValue)); + OFS('pBind.obLength=' + IntToStr(pBind.obLength)); + OFS('pBind.obStatus=' + IntToStr(pBind.obStatus)); + OFS('pBind.wType=' + IntToStr(pBind.wType)); + OFS('pBind.dwFlags=' + IntToStr(pBind.dwFlags)); + OFS('pBind.bPrecision=' + IntToStr(pBind.bPrecision)); + OFS('pBind.bScale=' + IntToStr(pBind.bScale)); + OFS('pBind.cbMaxLen=' + IntToStr(pBind.cbMaxLen)); + OFS('ParamDesc.GetNull=' + BoolToStr(ParamDesc.GetNull, True)); + OFS('ParamDesc.GetParamType=' + IntToStr(Integer(ParamDesc.GetParamType))); + OFS('ParamDesc.GetDataType=' + IntToStr(ParamDesc.GetDataType));} + if pBind.eParamIO in [DBPARAMIO_INPUT, DBPARAMIO_INPUT + DBPARAMIO_OUTPUT] then begin + pStatus := PDWORD(UINT(Integer(ParamsAccessorData.ExecuteParams.pData)) + pBind.obStatus); + pValue := IntPtr(UINT(Integer(ParamsAccessorData.ExecuteParams.pData)) + pBind.obValue); // Destination + + if TOLEDBParamDesc(ParamDesc).UseDefaultValue then begin + FillChar(pValue, pBind.cbMaxLen, 0); + Marshal.WriteInt32(pStatus, Integer(DBSTATUS_S_DEFAULT)); + end + else + if ParamDesc.GetNull then begin + FillChar(pValue, pBind.cbMaxLen, 0); + Marshal.WriteInt32(pStatus, Integer(DBSTATUS_S_ISNULL)); + end + else + begin + Marshal.WriteInt32(pStatus, Integer(DBSTATUS_S_OK)); + + pLength := PUINT(UINT(Integer(ParamsAccessorData.ExecuteParams.pData)) + pBind.obLength); + ParamVarType := VarType(ParamDesc.Value); + // pParamData := @TVarData(ParamDesc.Value); // Source + + if (((ParamDesc.GetParamType = pdInput) and (ParamDesc.GetDataType in CharsByRef + BytesByRef){$IFDEF CLR}and (ParamDesc.GetDataType <> dtString){$ENDIF}) + or (ParamDesc.GetDataType in [dtBlob, dtMemo, dtWideMemo, dtMSXML])) and (ServerVersion <> 3) and (not IsOutputLOB(ParamDesc, ServerVersion, ClientVersion)) + then begin + // Optimization for input-only parameters, store by ref + if ParamVarType = varArray + varByte then begin + {$IFDEF CLR} + l := Length(ParamsGC); + SetLength(ParamsGC, l + 1); + ParamsGC[l] := AllocGCHandle(ParamDesc.Value, True); + ParamVarPtr := GetAddrOfPinnedObject(ParamsGC[l]); + l := VarArrayHighBound(ParamDesc.Value, 1) - VarArrayLowBound(ParamDesc.Value, 1) + 1; + {$ELSE} + ParamVarPtr := TVarData(ParamDesc.Value).VArray.Data; + l := TVarData(ParamDesc.Value).VArray.Bounds[0].ElementCount; + {$ENDIF} + Marshal.WriteIntPtr(pValue, ParamVarPtr); + Marshal.WriteInt32(pLength, l); + end + else + {$IFDEF CLR} + if ParamDesc.Value is TBlob then begin + Assert(ParamDesc.Value <> nil); + Blob := TBlob(ParamDesc.Value); + {$ELSE} + if ParamVarType = varByRef then begin + Assert(TVarData(ParamDesc.Value).VPointer <> nil); + // Assert(TObject(TVarData(ParamDesc.Value).VPointer) is TBlob); - trial + Blob := TVarData(ParamDesc.Value).VPointer; + {$ENDIF} + Blob.Defrag; + {$IFDEF HAVE_COMPRESS} + Compress := Blob is TCompressedBlob; + if Compress then + TCompressedBlob(Blob).Compressed := (CompressBlobMode = cbServer) or (CompressBlobMode = cbClientServer); + if Compress and TCompressedBlob(Blob).Compressed then + Marshal.WriteInt32(pLength, Integer(TCompressedBlob(Blob).CompressedSize)) + else + {$ENDIF} + Marshal.WriteInt32(pLength, Integer(Blob.Size)); + if IntPtr(Blob.FirstPiece) = nil then + Marshal.WriteIntPtr(pValue, nil) + else + Marshal.WriteIntPtr(pValue, IntPtr(Integer(Blob.FirstPiece) + sizeof(TPieceHeader))); + end + else + begin // CharsByRef Input parameter + {$IFDEF CLR} + l := Length(ParamsGC); + SetLength(ParamsGC, l + 1); + ParamsGC[l] := AllocGCHandle(ParamDesc.Value, True); + ParamVarPtr := GetAddrOfPinnedObject(ParamsGC[l]); + {$ELSE} + ParamVarPtr := TVarData(ParamDesc.Value).VPointer; + if (ParamVarPtr = nil) and (ParamDesc.Value = '') then + ParamVarPtr := PChar(EmptyString); + {$ENDIF} + Marshal.WriteIntPtr(pValue, ParamVarPtr); + if (ParamDesc.GetDataType in CharsByRef) then + if ParamVarPtr <> nil then begin + {$IFDEF CLR} + l := Length(ParamDesc.Value) * SizeOf(WideChar); + {$ELSE} + if ParamVarType = varOleStr then // WideString + l := Integer(StrLenW(ParamVarPtr) * SizeOf(WideChar)) + else // Pascal string + l := StrLen(ParamVarPtr) + {$ENDIF} + end + else + l := 0 + else + l := Integer(ParamDesc.GetSize); + Marshal.WriteInt32(pLength, l); + end; + end + else + case ParamDesc.GetDataType of + dtUnknown: + SetOleVariant(pValue, ParamDesc.Value); + dtString: + begin + s := ParamDesc.Value; + l := Length(s); + if l > pBind.cbMaxLen - 1{#0} then // Truncate too long values + l := pBind.cbMaxLen - 1{#0}; + Marshal.WriteInt32(pLength, l); + + if l > 0 then + CopyBufferAnsi(s, pValue, l + 1{#0}); + end; + dtWideString: + begin + ws := ParamDesc.Value; + l := Length(ws) * sizeof(WideChar); + if l > (pBind.cbMaxLen - 1{#0}) * sizeof(WideChar) then // Truncate too long values + l := (pBind.cbMaxLen - 1{#0}) * sizeof(WideChar); + Marshal.WriteInt32(pLength, l); + + if l > 0 then + CopyBufferUni(ws, pValue, l + 2{#0#0}); + end; + dtBytes, dtVarBytes: + begin + case ParamVarType of + varArray + varByte: + begin + {$IFDEF CLR} + b := ParamDesc.Value; + l := Length(b); + if l > pBind.cbMaxLen then // Truncate too long values + l := pBind.cbMaxLen; + Marshal.Copy(b, 0, pValue, l); + {$ELSE} + l := TVarData(ParamDesc.Value).VArray.Bounds[0].ElementCount; + if l > pBind.cbMaxLen then // Truncate too long values + l := pBind.cbMaxLen; + Move(TVarData(ParamDesc.Value).VArray.Data^, pValue^, l); + {$ENDIF} + Marshal.WriteInt32(pLength, l); + end; + varOleStr: + begin + s := ParamDesc.Value; + l := Length(s); + if l > pBind.cbMaxLen {without #0} then // Truncate too long values + l := pBind.cbMaxLen {without #0}; + Marshal.WriteInt32(pLength, l); + + if l > 0 then + CopyBufferAnsi(s, pValue, l); + end; + else + {$IFDEF LITE} + raise Exception.Create('Unknown BLOB field type (must be varArray + varByte, varOleStr)'); + {$ELSE} + raise EDatabaseError.Create('Unknown BLOB field type (must be varArray + varByte, varOleStr)'); + {$ENDIF} + end; + end; + dtInt8: + Marshal.WriteInt16(pValue, Byte(ParamDesc.Value)); + dtInt16: + Marshal.WriteInt16(pValue, SmallInt(ParamDesc.Value)); + dtWord: + if (ServerVersion = 3) and (pBind.wType = DBTYPE_UI1) then + Marshal.WriteByte(pValue, Byte(ParamDesc.Value)) + else + Marshal.WriteInt16(pValue, SmallInt(Word(ParamDesc.Value))); + dtInt32: + Marshal.WriteInt32(pValue, Integer(ParamDesc.Value)); + dtFloat: + if ServerVersion = 3 then begin + if (pBind.wType = DBTYPE_R4) then + Marshal.WriteInt32(pValue, BitConverter.ToInt32(BitConverter.GetBytes(Single(ParamDesc.Value)), 0)) + else + if (pBind.wType = DBTYPE_NUMERIC) then begin + DBNumeric := DoubleToDBNumeric(Double(ParamDesc.Value), pBind.bPrecision, pBind.bScale); + {$IFDEF CLR} + Marshal.StructureToPtr(TObject(DBNumeric), pValue, False); + {$ELSE} + PDBNumeric(pValue)^ := DBNumeric; + {$ENDIF} + end + else + Marshal.WriteInt64(pValue, BitConverter.DoubleToInt64Bits(Double(ParamDesc.Value))); + end + else + Marshal.WriteInt64(pValue, BitConverter.DoubleToInt64Bits(Double(ParamDesc.Value))); + dtCurrency: begin + if (ServerVersion = 3) and (pBind.wType = DBTYPE_CY) then begin + {$IFDEF CLR} + c := ParamDesc.Value; + d := c; + d := d * 10000; + i64 := Convert.ToInt64(d); + Marshal.WriteInt64(pValue, i64); + {$ELSE} + PCurrency(pValue)^ := ParamDesc.Value; + {$ENDIF} + end + else + Marshal.WriteInt64(pValue, BitConverter.DoubleToInt64Bits(Double(ParamDesc.Value))); + // PCurrency(pValue)^ := ParamDesc.Value; Currency type cannot be used over TCurrencyField uses double to store + end; + dtDate: + Marshal.WriteInt64(pValue, BitConverter.DoubleToInt64Bits(TDateTime(ParamDesc.Value))); + dtDateTime, dtTime: + begin + dt := TDateTime(ParamDesc.Value); + DecodeDateTime(dt, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond); + DBTimeStamp.year := AYear; + DBTimeStamp.month := AMonth; + DBTimeStamp.day := ADay; + DBTimeStamp.hour := AHour; + DBTimeStamp.minute := AMinute; + DBTimeStamp.second := ASecond; + DBTimeStamp.fraction := AMilliSecond * 1000000 ; // milliseconds to billionths of a second + {$IFDEF CLR} + Marshal.StructureToPtr(TObject(DBTimeStamp), pValue, False); + {$ELSE} + PDBTimeStamp(pValue)^ := DBTimeStamp; + {$ENDIF} + end; + dtBoolean: + Marshal.WriteInt16(pValue, SmallInt(WordBool(Boolean(ParamDesc.Value)))); // Convert to boolean is useful to bypass Delphi bug + dtInt64: + begin + {$IFDEF VER6P} + i64 := ParamDesc.Value; // Explicit Convert! + Marshal.WriteInt64(pValue, i64); + {$ELSE} + if ParamVarType in [$000E, $0014] then + PInt64(pValue)^ := PInt64(@TVarData(ParamDesc.Value).VInteger)^ + else + PInt64(pValue)^ := TVarData(ParamDesc.Value).VInteger; + {$ENDIF} + end; + {$IFDEF VER5P} + dtGuid: + {$IFDEF CLR} + Marshal.StructureToPtr(TObject(StringToGUID(ParamDesc.Value)), pValue, False); + {$ELSE} + PGuid(pValue)^ := StringToGUID(ParamDesc.Value); + {$ENDIF} + dtVariant: + SetOleVariant(pValue, ParamDesc.Value); + {$ENDIF} + dtBCD: + if (ServerVersion = 3) then begin + Assert(pBind.wType = DBTYPE_NUMERIC); + DBNumeric := DoubleToDBNumeric(ParamDesc.Value, 0, 0); + {$IFDEF CLR} + Marshal.StructureToPtr(TObject(DBNumeric), pValue, False); + {$ELSE} + PDBNumeric(pValue)^ := DBNumeric; + {$ENDIF} + end + else begin + {$IFNDEF VER6P} + if ParamVarType in [$000E, $0014] then + PCurrency(pValue)^ := PInt64(@TVarData(ParamDesc.Value).VInteger)^ + else + {$ENDIF} + begin + c := ParamDesc.Value; + {$IFDEF CLR} + d := c; + d := d * 10000; + i64 := Convert.ToInt64(d); + {$ELSE} + i64 := PInt64(@c)^; + {$ENDIF} + Marshal.WriteInt64(pValue, i64); + end; + end; + {$IFDEF VER6P} + dtFmtBCD: + if (ServerVersion = 3) then begin + Assert(pBind.wType = DBTYPE_NUMERIC); + if VarIsFMTBcd(ParamDesc.Value) then + //Assert(VarIsFMTBcd(ParamDesc.Value)); + DBNumeric := BcdToDBNumeric(VarToBcd(ParamDesc.Value)) + else begin + s := ParamDesc.Value; + if DecimalSeparator <> '.' then begin + DotPos := Pos(DecimalSeparator, s); + if DotPos <> 0 then + s[DotPos] := '.'; + end; + Bcd := StrToBcd(s); + DBNumeric := BcdToDBNumeric(Bcd); + end; + {$IFDEF CLR} + Marshal.StructureToPtr(TObject(DBNumeric), pValue, False); + {$ELSE} + PDBNumeric(pValue)^ := DBNumeric; + {$ENDIF} + end + else + begin + s := ParamDesc.Value; + if DecimalSeparator <> '.' then begin + DotPos := Pos(DecimalSeparator, s); + if DotPos <> 0 then + s[DotPos] := '.'; + end; + l := Length(s); + Marshal.WriteInt32(pLength, l); + + if l > 0 then + CopyBufferAnsi(s, pValue, l + 1{#0}); + end; + {$ENDIF} + dtMemo, dtWideMemo, dtBlob: + if pBind.wType = DBTYPE_IUNKNOWN then begin + // Create stream + OLEDBStream := TOLEDBStream.Create(ParamDesc.GetObject as TBlob, nil{FStreamList}); + Stream := OLEDBStream; + Marshal.WriteIntPtr(pValue, Marshal.GetIUnknownForObject(OLEDBStream)); + // Set stream size + Marshal.WriteInt32(pLength, Integer(OLEDBStream.Size)); + end + else begin + ws := (ParamDesc.GetObject as TBlob).AsWideString; + l := Length(ws) * sizeof(WideChar); + if l > (pBind.cbMaxLen - 1{#0}) * sizeof(WideChar) then // Truncate too long values + l := (pBind.cbMaxLen - 1{#0}) * sizeof(WideChar); + Marshal.WriteInt32(pLength, l); + + if l > 0 then + CopyBufferUni(ws, pValue, l + 2{#0#0}); + end; + else + Assert(False, Format('ParamDesc - %s, Unknown DataType = %d', [ParamDesc.GetName, ParamDesc.GetDataType])); + end; + end; + end; +end; + +procedure TOLEDBCommand.CreateAndFillParamAccs; +var + ParamCnt: integer; + + procedure PrepareParamAcc(out BindMemorySize: UINT); // Set preliminary binding data + var + i: integer; + begin + Assert(Length(FParamsAccessorData.rgBindings) <> 0); + for i := 0 to ParamCnt - 1 do + FParamsAccessorData.rgBindings[i].pObject := nil; + + BindMemorySize := 0; + for i := 0 to ParamCnt - 1 do + FillBindingForParam(i + 1, TOLEDBParamDesc(FParams[i]), FConnection, FParamsAccessorData.rgBindings[i], BindMemorySize, True, False); + end; + +var +{$IFDEF CLR} + rgBindingsGC: GCHandle; +{$ENDIF} + rgBindings: PDBBinding; + rgStatus: PUINT; + i: integer; + BindMemorySize: UINT; + +begin + Assert(FICommandText <> nil, 'FICommandText must be setted to CreateAndFillParamAccs'); + Assert(not FParamsAccessorDataAvaible, 'procedure CreateAndFillParamAccs already called'); + ParamCnt := FParams.Count; + rgStatus := Marshal.AllocHGlobal(ParamCnt * SizeOf(UINT)); +{$IFNDEF CLR} + IntPtr(FParamsAccessorData.Accessor) := nil; +{$ENDIF} + + FCanReadParams := False; + + try + try + FParamsAccessorData.ExecuteParams.HACCESSOR := 0; + FParamsAccessorData.ExecuteParams.pData := nil; + FParamsAccessorData.ExecuteParams.cParamSets := 1; + + SetLength(FParamsAccessorData.rgBindings, ParamCnt); + PrepareParamAcc(BindMemorySize); + + FParamsAccessorData.ExecuteParams.pData := Marshal.AllocHGlobal(BindMemorySize); + FillChar(FParamsAccessorData.ExecuteParams.pData, BindMemorySize, 0); + + for i := 0 to ParamCnt - 1 do + SaveParamValue(FParams[i], FParamsAccessorData.rgBindings[i], + FParamsAccessorData{$IFDEF HAVE_COMPRESS}, FCompressBlob{$ENDIF} + {$IFDEF CLR}, FParamsGC{$ENDIF}, FConnection.DBMSPrimaryVer, FConnection.ProviderPrimaryVer); + + + QueryIntf(FICommandText, {$IFDEF CLR}IAccessor{$ELSE}IID_IAccessor{$ENDIF}, FParamsAccessorData.Accessor); + {$IFDEF CLR} + rgBindingsGC := GCHandle.Alloc(FParamsAccessorData.rgBindings, GCHandleType.Pinned); + rgBindings := Marshal.UnsafeAddrOfPinnedArrayElement(FParamsAccessorData.rgBindings, 0); + {$ELSE} + rgBindings := @FParamsAccessorData.rgBindings[0]; + {$ENDIF} + Check(FParamsAccessorData.Accessor.CreateAccessor( + DBACCESSOR_PARAMETERDATA, ParamCnt, rgBindings, BindMemorySize, + FParamsAccessorData.ExecuteParams.HACCESSOR, rgStatus)); + FParamsAccessorDataAvaible := True; + except + if FParamsAccessorData.ExecuteParams.pData <> nil then + Marshal.FreeHGlobal(FParamsAccessorData.ExecuteParams.pData); + FParamsAccessorData.ExecuteParams.pData := nil; + + if Length(FParamsAccessorData.rgBindings) <> 0 then begin + for i := 0 to ParamCnt - 1 do + begin + if FParamsAccessorData.rgBindings[i].pObject <> nil then + Marshal.FreeHGlobal(FParamsAccessorData.rgBindings[i].pObject); + end; + SetLength(FParamsAccessorData.rgBindings, 0); + end; + + FParamsAccessorDataAvaible := False; + raise; + end; + finally + Marshal.FreeHGlobal(rgStatus); + {$IFDEF CLR} + if IntPtr(rgBindingsGC) <> nil then + rgBindingsGC.Free; + {$ENDIF} + end; +end; + +procedure TOLEDBCommand.Execute(Iters: integer = 1); + procedure DoExecute; + var + AsynchComplete: boolean; + + function OpenOrExec: IUnknown; + var + Params: DBPARAMS; + RequestInt: TGUID; + hr: HRESULT; + + begin + if not GetPrepared then + SetCommandProp; + + if FRequestIUnknown or (FNonBlocking and (not FRequestIUnknown)) then + RequestInt := IID_IUnknown + else + RequestInt := IID_NULL; + + FWaitForBreak := False; + try + + if FRPCCall then + SetParameterInfo; + if FParams.Count = 0 then begin + Params.HACCESSOR := 0; + Params.pData := nil; + Params.cParamSets := 0; + hr := ICommand(FICommandText).Execute(nil, RequestInt, Params, FRowsAffected, Result); + end + else + begin + CreateAndFillParamAccs; + hr := ICommand(FICommandText).Execute(nil, RequestInt, FParamsAccessorData.ExecuteParams, FRowsAffected, Result); + end; + + AsynchComplete := True; + if FNonBlocking and (hr = DB_S_ASYNCHRONOUS) then + AsynchComplete := False + else + CheckAndAnalyze(hr); + + {$IFDEF SDAC_TEST} + Inc(__ServerExecuteCount); + {$ENDIF} + except + on E: Exception do begin + if (E is EOLEDBError) and (EOLEDBError(E).ErrorCode = DB_E_ABORTLIMITREACHED) then + Unprepare; + Result := nil; + FIUnknown := nil; + ClearIMultipleResults; + FISSAsynchStatus := nil; + + raise; + end; + end; + end; + + var + IUnk: IUnknown; + begin + Assert(FIUnknown = nil); + FLastExecWarning := False; + if FIMultipleResults = nil then begin + IUnk := OpenOrExec; // After call IUnk may be [nil, IUnknown (message), IUnknown (cursor)] + Assert(FRequestIUnknown or FNonBlocking or (IUnk = nil)); + + if FRequestIUnknown and (IUnk <> nil) then begin + if FRequestMultipleResults then + QueryIntf(IUnk, {$IFDEF CLR}IMultipleResults{$ELSE}IID_IMultipleResults{$ENDIF}, FIMultipleResults) + else // This is a server cursor or DbxSda call + FIUnknown := IUnk; + IUnk := nil; + end; + + if not FRequestIUnknown and FNonBlocking and not AsynchComplete then begin + Assert(IUnk <> nil); + QueryIntf(IUnk, {$IFNDEF CLR}IID_ISSAsynchStatus{$ELSE}ISSAsynchStatus{$ENDIF}, FISSAsynchStatus); + end; + end; + + if FRequestIUnknown and (FIMultipleResults <> nil) then + if FIUnknownNext = nil then + GetNextResult(FIUnknown, FRowsAffected) + else + begin + FIUnknown := FIUnknownNext; + FIUnknownNext := nil; + FRowsAffected := FRowsAffectedNext; + end; + end; +begin + if (FCursorState <> csInactive) and (FCursorState <> csPrepared) then + Exit; + + FExecuting := True; + SetCursorState(csExecuting); + QueryInterfaces(False); // If QueryInterfaces already called then do nothing + try + DoExecute; + if FNonBlocking and (FISSAsynchStatus <> nil) then begin + Assert(FExecutor = nil); + FExecutor := TOLEDBThreadWrapper.Create(TExecuteThread, True); + FExecutor.OnException := DoExecuteException; + FExecutor.OnTerminate := DoExecuteTerminate; + TExecuteThread(FExecutor.FThread).FRunMethod := WaitAsynchCompletion; + FExecutor.FreeOnTerminate := True; + FExecutor.Resume; + end; + except + on E: Exception do begin + if (not FNonBlocking) or FRequestIUnknown or (FISSAsynchStatus = nil) then + EndExecute(E); + raise; + end; + end; + if (not FNonBlocking) or FRequestIUnknown or (FISSAsynchStatus = nil) then + EndExecute(nil); +end; + +procedure TOLEDBCommand.DoExecuteTerminate(Sender: TObject); // MainThread context +begin + EndExecute(FExecutor.FException); + FExecutor := nil; +end; + +procedure TOLEDBCommand.DoExecuteException(Sender: TObject; E: Exception; var Fail: boolean); // MainThread context +begin + if (E is EOLEDBError) then + FConnection.DoError(EOLEDBError(E), Fail); +end; + +procedure TOLEDBCommand.WaitAsynchCompletion; // FExecuter.FThread context +var + hr: HRESULT; + Completed: boolean; +begin + if (FISSAsynchStatus <> nil) then begin + try + Completed := False; + while not TExecuteThread(FExecutor.FThread).Terminated do begin + hr := FISSAsynchStatus.WaitForAsynchCompletion(100); + Completed := hr <> DB_S_ASYNCHRONOUS; + if Completed then + break; + end; + if not Completed then + FISSAsynchStatus.Abort(DB_NULL_HCHAPTER, DBASYNCHOP_OPEN); + finally + ClearISSAsynchStatus; + end; + end; +end; + +procedure TOLEDBCommand.EndExecute(E: Exception); // MainThread context +begin + try + RequestParamsIfPossible; + ReleaseInterfaces; + + + if FIUnknown = nil then + FCursorState := csInactive + else + FCursorState := csExecuted; + + if Assigned(FAfterExecute) then // Must be after RequestParamsIfPossible + FAfterExecute(E = nil); + finally + FExecuting := False; + end; +end; + +function TOLEDBCommand.CreateProcCall(Name: string; const NeedDescribe: boolean; const WideStrings: boolean; + const EnableBcd: boolean; const EnableFmtBcd: boolean): string; + + procedure DescribeParams(const MasterDatabase: boolean; out OriginalDatabase: string); + var + ParamsMetaInfo: TOLEDBRecordSet; + + procedure FillParams; + function GetOffsetByName(const Name: string): integer; + var + i: integer; + begin + for i := 0 to ParamsMetaInfo.Fields.Count - 1 do + if ParamsMetaInfo.Fields[i].Name = Name then begin + Result := ParamsMetaInfo.Fields[i].Offset; + Exit; + end; + Result := - maxint; + Assert(False, 'Unknown field name ' + Name); + end; + + var + NameFld, TypeNameFld, TypeFld, HasDefaultFld, DefaultFld, DataTypeFld, OctetLengthFld, CharMaxLenFld: integer; // offsets + + Param: TParamDesc; + ParamType: TParamDirection; + + s, ParamName: string; + DataType: word; + + IsLong: boolean; + + RecBuf: IntPtr; + ws: WideString; + dt: integer; + begin + FParams.Clear; + + NameFld := GetOffsetByName('PARAMETER_NAME'); // DataSize = 129 + TypeNameFld := GetOffsetByName('TYPE_NAME'); // DataSize = 129 + TypeFld := GetOffsetByName('PARAMETER_TYPE'); // DataSize = 4 + HasDefaultFld := GetOffsetByName('PARAMETER_HASDEFAULT'); // DataSize = 2 + DefaultFld := GetOffsetByName('PARAMETER_DEFAULT'); // DataSize = 256 + DataTypeFld := GetOffsetByName('DATA_TYPE'); // DataSize = 4 + OctetLengthFld := GetOffsetByName('CHARACTER_OCTET_LENGTH'); // DataSize = 4 + CharMaxLenFld := GetOffsetByName('CHARACTER_MAXIMUM_LENGTH'); // DataSize = 4 + + RecBuf := nil; + ParamsMetaInfo.AllocRecBuf(IntPtr(RecBuf)); + try + while True do begin + ParamsMetaInfo.GetNextRecord(RecBuf); + if ParamsMetaInfo.Eof then + Break; + + IsLong := Marshal.ReadInt32(RecBuf, OctetLengthFld) >= maxInt - 1; + dt := Marshal.ReadInt32(RecBuf, DataTypeFld); + + if ConvertOLEDBTypeToInternalFormat(dt, IsLong, EnableBcd, {$IFDEF VER6P}EnableFMTBCD{$ELSE}False{$ENDIF}, WideStrings, True, DataType, FConnection.DBMSPrimaryVer) then begin + ParamType := ConvertOLEDBParamTypeToCR(Marshal.ReadInt32(RecBuf, TypeFld)); + Param := TOLEDBParamDesc.Create; + Param.SetParamType(ParamType); + FParams.Add(Param); + + //Choice "Bytes" and "VarBytes" + s := Marshal.PtrToStringUni(IntPtr(Integer(RecBuf) + TypeNameFld)); + if (DataType = dtBytes) and (s = 'varbinary') then // WAR user-defined types? + DataType := dtVarBytes; + Param.SetDataType(DataType); + + ParamName := GetParamNameWODog(Marshal.PtrToStringUni(IntPtr(Integer(RecBuf) + NameFld))); + Param.SetName(ParamName); + + if Word(Marshal.ReadInt16(RecBuf, HasDefaultFld)) <> 0 then begin + ws := Marshal.PtrToStringUni(IntPtr(Integer(RecBuf) + DefaultFld)); + Param.SetValue(ws); + end; + + if IsLargeDataTypeUsed(Param) and + ((ParamType = pdOutput) or (ParamType = pdInputOutput)) then + Param.SetParamType(pdInput); + + Param.SetSize(Marshal.ReadInt32(RecBuf, CharMaxLenFld)); + end + else begin + s := Marshal.PtrToStringUni(IntPtr(Integer(RecBuf) + TypeNameFld)); + DatabaseErrorFmt(SBadFieldType, [s, dt]); + end; + end; + finally + if RecBuf <> nil then + ParamsMetaInfo.FreeRecBuf(RecBuf); + end; + end; + + procedure ParseFullName(out Database: string; out Owner: string; out ProcName: string); + begin + UnbracketIfPossible(Name, OriginalDatabase, Owner, ProcName); + if OriginalDatabase <> '' then + Database := OriginalDatabase + else + if not MasterDatabase then + Database := FConnection.FDatabase + else + Database := DefaultSDACDatabase; + end; + var + Database, Owner, ProcName: string; + rgRestrictions: TRestrictions; + + Rowset: IRowset; + + begin + ParseFullName(Database, Owner, ProcName); + SetLength(rgRestrictions, 3); + if (Length(ProcName) > 1) and (ProcName[1] = '#') then // for temporary stored procedures + rgRestrictions[0] := 'tempdb' + else + rgRestrictions[0] := DataBase; + rgRestrictions[1] := Owner; + rgRestrictions[2] := ProcName; + + + Rowset := FConnection.GetSchemaRowset(DBSCHEMA_PROCEDURE_PARAMETERS, rgRestrictions); + + ParamsMetaInfo := nil; + try + ParamsMetaInfo := TOLEDBRecordSet.Create; + ParamsMetaInfo.SetConnection(FConnection); + ParamsMetaInfo.SetProp(prFetchAll, True); + + ParamsMetaInfo.SetIRowset(Rowset, False); + ParamsMetaInfo.Open; + + FillParams; + finally + if ParamsMetaInfo <> nil then begin + ParamsMetaInfo.Close; + ParamsMetaInfo.UnPrepare; + ParamsMetaInfo.Free; + end; + end; + end; + +var + i: integer; + BracketAdded: boolean; + Database, s, s1: string; + ParamName: string; +begin + if FConnection = nil then + DatabaseError(SConnectionNotDefined); + + FConnection.Connect(''); + + if NeedDescribe then begin + DescribeParams(False, Database); + if (FParams.Count = 0) and (Database = '') then begin + s := LowerCase(Copy(Name, 1, 3)); + if (s = 'sp_') or (s = 'xp_') then + DescribeParams(True, Database); + end; + end; + + i := Pos(';', Name); + if i = 0 then + s := 'CALL ' + BracketIfNeed(Name, Char('"'), Char('"'){May be bug in MS SQL Server}) + ' ' + else begin + s := Name; + s1 := Copy(Name, i, 1024); + Delete(s, i, 1024); + s := 'CALL ' + BracketIfNeed(s, Char('"'), Char('"'){May be bug in MS SQL Server}) + s1 + end; + + BracketAdded := False; + for i := 0 to FParams.Count - 1 do begin + ParamName := FParams[i].GetName; + if ParamName = '' then + ParamName := '?' + else + ParamName := ':' + ParamName; + if FParams[i].GetParamType = pdResult then + s := ParamName + ' = ' + s + else begin + if BracketAdded then + s := s + ', ' + ParamName + else begin + BracketAdded := True; + s := s + '(' + ParamName + end; + end; + end; + if BracketAdded then + s := s + ')'; + FSQL := '{' + s + '}'; + Result := FSQL; +end; + +procedure ConvertStreamToBlob(const pValue: IntPtr; const Length: integer; Blob: TBlob; + {$IFDEF HAVE_COMPRESS}CompressBlobMode: TCompressBlobMode;{$ENDIF} OmitXMLPreamble: boolean = False); +var + Stream: ISequentialStream; + BytesReadedFromStream: Longint; + p, pXML: IntPtr; + + Piece: PPieceHeader; + PieceSize: integer; +{$IFDEF CLR} + o: System.Object; + otype: System.Type; +{$ENDIF} + pBytesReadedFromStream: IntPtr; + FirstRead: boolean; + BlobSize: integer; + SizeAvailable: boolean; +begin + p := Marshal.ReadIntPtr(pValue); + Assert(p <> nil); + + BlobSize := Length; + SizeAvailable := BlobSize > 0; +{$IFDEF CLR} + otype := System.Type.GetTypeFromCLSID(CLSID_SQLOLEDB); + o := Marshal.GetObjectForIUnknown(p); + Stream := ISequentialStream(Marshal.CreateWrapperOfType(o, otype)); + o := nil; +{$ELSE} + IntPtr(Stream) := IntPtr(p); +{$ENDIF} + pBytesReadedFromStream := Marshal.AllocHGlobal(SizeOf(Integer)); + try + Assert(Stream <> nil); + + if OmitXMLPreamble then begin + // Skip FF FE bytes, CR 16149 + pXML := Marshal.AllocHGlobal(SizeOf(WideChar)); + try + Stream.Read(pXML, SizeOf(WideChar), pBytesReadedFromStream); + if SizeAvailable then + Dec(BlobSize, SizeOf(WideChar)); + finally + Marshal.FreeHGlobal(pXML); + end; + end; + + PieceSize := 10 * 1024; + FirstRead := True; + repeat + if (BlobSize >= DefaultPieceSize) or not SizeAvailable then begin + if not FirstRead then + PieceSize := DefaultPieceSize; + end + else + PieceSize := BlobSize; + + Blob.AllocPiece(Piece, PieceSize); + try + {$IFDEF CLR} + Stream.Read(IntPtr(Integer(Piece) + SizeOf(TPieceHeader)), PieceSize, pBytesReadedFromStream); + BytesReadedFromStream := Marshal.ReadInt32(pBytesReadedFromStream); + {$ELSE} + Stream.Read(IntPtr(Integer(Piece) + SizeOf(TPieceHeader)), PieceSize, @BytesReadedFromStream); + {$ENDIF} + Piece.Used := BytesReadedFromStream; + if SizeAvailable then + Dec(BlobSize, BytesReadedFromStream); + finally + Blob.CompressPiece(Piece); + if IntPtr(Piece) <> nil then + Blob.AppendPiece(Piece); + FirstRead := False; + end; + until ((BlobSize = 0) and SizeAvailable) or ((PieceSize <> BytesReadedFromStream) and not SizeAvailable); + {$IFDEF HAVE_COMPRESS} + if (Blob is TCompressedBlob) and ((CompressBlobMode = cbClient) or (CompressBlobMode = cbClientServer)) then + TCompressedBlob(Blob).Compressed := True; + {$ENDIF} + finally + {$IFDEF CLR} + Marshal.ReleaseComObject(Stream); + Marshal.Release(p); + {$ENDIF} + Marshal.FreeHGlobal(pBytesReadedFromStream); + end; +end; + +procedure TOLEDBCommand.RequestParamsIfPossible; // Call RequestAndFreeParamAccs if interfaces is cleared + procedure RequestAndFreeParamAccs; + procedure ProcessParam(ParamDesc: TParamDesc; var pBind: TDBBinding); + var + pStatus: PDWORD; + Status: DWORD; + pValue: IntPtr; + pLength: PUINT; + l: UINT; + + c: Currency; + i64: Int64; + + {$IFDEF CLR} + Bcd: TBcd; + b: TBytes; + d: double; + {$ENDIF} + DBTimeStamp: TDBTimeStamp; + dt: TDateTime; + {$IFDEF VER6P} + DBNumeric: TDBNumeric; + {$ENDIF} + Blob: TSharedObject; + begin + if (ParamDesc.GetParamType in [pdUnknown, pdInputOutput, pdOutput, pdResult]) + and not ((ParamDesc.GetParamType = pdUnknown) and (ParamDesc.GetDataType in [dtBlob, dtMemo, dtWideMemo, dtMSXML])) then begin + pStatus := PDWORD(UINT(Integer(FParamsAccessorData.ExecuteParams.pData)) + pBind.obStatus); + Status := DWORD(Marshal.ReadInt32(pStatus)); + if not IsOutputLOB(ParamDesc, FConnection.DBMSPrimaryVer, FConnection.ProviderPrimaryVer) then + ParamDesc.SetNull((Status = DBSTATUS_S_ISNULL) or (Status = DBSTATUS_E_UNAVAILABLE)) + else begin + Blob := ParamDesc.GetObject; + try + ParamDesc.SetNull((Status = DBSTATUS_S_ISNULL) or (Status = DBSTATUS_E_UNAVAILABLE)); + finally + ParamDesc.SetObject(Blob); + end; + end; + + if ParamDesc.GetNull then + Marshal.WriteInt32(pStatus, Integer(DBSTATUS_S_ISNULL)) + else + begin + pValue := IntPtr(UINT(Integer(FParamsAccessorData.ExecuteParams.pData)) + pBind.obValue); + pLength := PUINT(UINT(Integer(FParamsAccessorData.ExecuteParams.pData)) + pBind.obLength); + case ParamDesc.GetDataType of + dtUnknown: + ParamDesc.SetValue(GetOleVariant(pValue)); + dtString: + ParamDesc.SetValue(Marshal.PtrToStringAnsi(pValue)); + dtWideString: + ParamDesc.SetValue(Marshal.PtrToStringUni(pValue)); + dtBytes, dtVarBytes: + begin + l := Marshal.ReadInt32(pLength); + if l > 0 then begin + {$IFDEF CLR} + SetLength(b, l); + Marshal.Copy(pValue, b, 0, l); + ParamDesc.Value := b; + {$ELSE} + ParamDesc.SetValue(VarArrayCreate([0, l - 1], varByte)); + CopyBuffer(pValue, TVarData(ParamDesc.Value).VArray.Data, l); + {$ENDIF} + end; + end; + dtInt8: + ParamDesc.SetValue(Byte(Marshal.ReadByte(pValue))); + dtInt16: + ParamDesc.SetValue(SmallInt(Marshal.ReadInt16(pValue))); + dtWord: + ParamDesc.SetValue(Word(Marshal.ReadInt16(pValue))); + dtInt32: + ParamDesc.SetValue(Integer(Marshal.ReadInt32(pValue))); + dtFloat: + ParamDesc.SetValue(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(pValue))); + dtCurrency: + ParamDesc.SetValue(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(pValue))); + // ParamDesc.SetValue(PCurrency(pValue)^); Currency type cannot be used over TCurrencyField uses double to store + dtDate: + ParamDesc.SetValue(TDateTime(BitConverter.Int64BitsToDouble(Marshal.ReadInt64(pValue)))); + dtDateTime, dtTime: + begin + {$IFDEF CLR} + DBTimeStamp := TDBTimeStamp(Marshal.PtrToStructure(pValue, TypeOf(TDBTimeStamp))); + {$ELSE} + DBTimeStamp := PDBTimeStamp(pValue)^; + {$ENDIF} + dt := EncodeDateTime(DBTimeStamp.year, DBTimeStamp.month, DBTimeStamp.day, DBTimeStamp.hour, DBTimeStamp.minute, DBTimeStamp.second, DBTimeStamp.fraction div 1000000{Billionths of a second to milliseconds}); + ParamDesc.SetValue(dt); + end; + dtBoolean: + ParamDesc.SetValue(Boolean(WordBool(Marshal.ReadInt16(pValue)))); + dtInt64: + {$IFDEF VER6P} + ParamDesc.SetValue(Marshal.ReadInt64(pValue)); + {$ELSE} + begin + TVarData(_TParamDesc(ParamDesc).FData).VType := $000E; + PInt64(@TVarData(ParamDesc.Value).VInteger)^ := PInt64(pValue)^; + end; + {$ENDIF} + {$IFDEF VER5P} + dtGuid: + {$IFDEF CLR} + ParamDesc.SetValue(GUIDToString(TGuid(Marshal.PtrToStructure(pValue, TypeOf(TGuid))))); + {$ELSE} + ParamDesc.SetValue(GUIDToString(PGuid(pValue)^)); + {$ENDIF} + dtVariant: + ParamDesc.SetValue(GetOleVariant(pValue)); + {$ENDIF} + dtBCD: + begin + i64 := Marshal.ReadInt64(pValue); + {$IFDEF CLR} + d := i64; + d := d / 10000; + c := d; + {$ELSE} + c := PCurrency(@i64)^; + {$ENDIF} + ParamDesc.SetValue(c); + end; + {$IFDEF VER6P} + dtFmtBCD: + if FConnection.FProvider <> prCompact then + ParamDesc.SetValue(Marshal.PtrToStringAnsi(pValue)) + else begin + {$IFDEF CLR} + DBNumeric := TDBNumeric(Marshal.PtrToStructure(pValue, TypeOf(TDBNumeric))); + {$ELSE} + DBNumeric := PDBNumeric(pValue)^; + {$ENDIF} + ParamDesc.SetValue(VarFMTBcdCreate(DBNumericToBcd(DBNumeric))); + end; + {$ENDIF} + dtMemo, dtWideMemo: begin + Blob := ParamDesc.GetObject; + Assert(Blob <> nil); + TBlob(Blob).Clear; + ConvertStreamToBlob(pValue, 0, TBlob(Blob){$IFDEF HAVE_COMPRESS}, FCompressBlob{$ENDIF}); + end; + else + Assert(False, Format('ParamDesc - %s, Unknown DataType = %d', [ParamDesc.GetName, ParamDesc.GetDataType])); + end; + end; + end; + end; + var + i: integer; + + ParamCnt: integer; + + begin + Assert(FIUnknown = nil, 'Before RequestAndFreeParamAccs interface FIUnknown must be released'); + Assert(FIMultipleResults = nil, 'Before RequestAndFreeParamAccs interface FIMultipleResults must be released'); + + if FParamsAccessorDataAvaible then begin + ParamCnt := FParams.Count; + try + if FConnection <> nil then begin + if FParamsAccessorData.ExecuteParams.HACCESSOR <> 0 then + Check(FParamsAccessorData.Accessor.ReleaseAccessor(FParamsAccessorData.ExecuteParams.HACCESSOR, nil)); + FParamsAccessorData.ExecuteParams.HACCESSOR := 0; + FParamsAccessorData.Accessor := nil; + + for i := 0 to ParamCnt - 1 do + ProcessParam(FParams[i], FParamsAccessorData.rgBindings[i]); + end; + + if FParamsAccessorData.ExecuteParams.pData <> nil then + Marshal.FreeHGlobal(FParamsAccessorData.ExecuteParams.pData); + FParamsAccessorData.ExecuteParams.pData := nil; + + finally + if Length(FParamsAccessorData.rgBindings) <> 0 then begin + for i := 0 to ParamCnt - 1 do + if FParamsAccessorData.rgBindings[i].pObject <> nil then + Marshal.FreeHGlobal(FParamsAccessorData.rgBindings[i].pObject); + SetLength(FParamsAccessorData.rgBindings, 0); + end; + + FParamsAccessorDataAvaible := False; + + (*// Remove unused streams + for i := FStreamList.Count - 1 downto 0 do + TOLEDBStream(FStreamList[i])._Release; + Assert(FStreamList.Count = 0);*) + end; + + FCanReadParams := True; + if Assigned(FReadParams) and (FConnection <> nil) then + FReadParams; + end; + end; + +{$IFDEF CLR} +var + i: integer; +{$ENDIF} + +begin +{$IFDEF CLR} + for i := Low(FParamsGC) to High(FParamsGC) do + FreeGCHandle(FParamsGC[i]); + SetLength(FParamsGC, 0); +{$ENDIF} + + if (FIUnknown = nil) then begin + if (FIMultipleResults <> nil) and not FNextResultRequested then begin + GetNextResult(FIUnknownNext, FRowsAffectedNext); + FNextResultRequested := True; + end; + + if (FIMultipleResults = nil) and (FParams <> nil) and (FParams.Count > 0) then + RequestAndFreeParamAccs; + end; +end; + +procedure TOLEDBCommand.CheckAndAnalyze(const Status: HRESULT); +const + ParamHeader = 'Parameter[%d] %s - %s (Status = %Xh).'; +var + i: integer; + ParamStatus: DWORD; + ParamName: string; + Msg: WideString; +begin + if Status <> S_OK then + try + Check(Status); + except + on E: Exception do + begin + if (Status and $80000000) <> 0 then begin // Severity bit (see OLEDBC.pas line 5489) is not 0 + if Status = DB_E_OBJECTOPEN then + DatabaseError(SObjectOpen) + else + if FParamsAccessorData.ExecuteParams.pData = nil then + raise + else + begin + Msg := ''; + with FParamsAccessorData do + for i := 0 to FParams.Count - 1 do begin + ParamName := FParams[i].GetName; + if ParamName = '' then + ParamName := IntToStr(i) + else + ParamName := ':' + ParamName; + ParamStatus := DWORD(Marshal.ReadInt32(ExecuteParams.pData, rgBindings[i].obStatus)); + case ParamStatus of + DBSTATUS_S_OK, DBSTATUS_S_ISNULL, DBSTATUS_S_DEFAULT:; + DBSTATUS_E_BADACCESSOR: + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SInvalidParamType, ParamStatus]); + DBSTATUS_E_CANTCONVERTVALUE: + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SInvalidValue, ParamStatus]); + DBSTATUS_S_TRUNCATED: + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SDataTruncated, ParamStatus]); + DBSTATUS_E_SIGNMISMATCH: + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SSignMismatch, ParamStatus]); + DBSTATUS_E_DATAOVERFLOW: + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SDataOverflow, ParamStatus]); + DBSTATUS_E_CANTCREATE: + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SOutOfMemory, ParamStatus]); + DBSTATUS_E_UNAVAILABLE: + {AddInfoToErr(Msg, ParamHeader, [i, ParamName, SUnavaible, ParamStatus])}; + DBSTATUS_E_INTEGRITYVIOLATION: + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SIntegrityViolation, ParamStatus]); + DBSTATUS_E_SCHEMAVIOLATION: + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SShemaViolation, ParamStatus]); + DBSTATUS_E_BADSTATUS: + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SBadStatus, ParamStatus]); + else + AddInfoToErr(Msg, ParamHeader, [i, ParamName, SUnknownStatus, ParamStatus]); + end; + end; // for + AddInfoToErr(E, Msg, []); + raise E; + end; // if Status = DB_E_OBJECTOPEN + end + else // if (Status and $80000000) <> 0 then begin + if Status = DB_S_ERRORSOCCURRED then + FLastExecWarning := True; + end; // on E: Exception do begin + end; // try..except..end; +end; + +procedure TOLEDBCommand.GetNextResult(out ResultSet: IUnknown; out RowsAffected: integer); +var + hr: HRESULT; + OldRowsAffected: integer; +begin + try + repeat + OldRowsAffected := FRowsAffected; + hr := FIMultipleResults.GetResult(nil, 0, IID_IUnknown, RowsAffected, ResultSet); + + if (hr <> DB_S_NORESULT) then + CheckAndAnalyze(hr); + FConnection.OLEDBError(0, Component); // Check Info messages + + if ResultSet <> nil then begin + OldRowsAffected := RowsAffected; + Break; + end; + + if FWaitForBreak then begin + FWaitForBreak := False; + FConnection.OLEDBError(DB_E_CANCELED, Component); + end; + + until hr <> S_OK; + RowsAffected := OldRowsAffected; + finally + if ResultSet = nil then + ClearIMultipleResults; // Rowsets not also provided + end; + +end; + +procedure TOLEDBCommand.SetConnection(Value: TCRConnection); +begin + if Value <> FConnection then begin + inherited; + + FConnection := TOLEDBConnection(Value); + end; +end; + +function TOLEDBCommand.GetCursorState: TCursorState; +begin + Result := FCursorState; +end; + +procedure TOLEDBCommand.SetCursorState(Value: TCursorState); +begin + FCursorState := Value; +end; + +function TOLEDBCommand.GetProp(Prop: integer; var Value: variant): boolean; +begin + Result := True; + + case Prop of + prRowsProcessed: + if FRowsAffected = -1 then + Value := 0 + else + Value := FRowsAffected; + prScanParams: + Value := False; + prCanReadParams: + Value := FCanReadParams; + prIsSProc: + Value := FIsSProc; + prNonBlocking: + Value := FNonBlocking; + else + Result := inherited GetProp(Prop, Value); + end; +end; + +function TOLEDBCommand.SetProp(Prop: integer; const Value: variant): boolean; +begin + Result := True; + case Prop of + prScanParams:; + prCommandTimeout: + FCommandTimeout := Value; + prIsSProc: + FIsSProc := Boolean(Value); + prCanReadParams: + FCanReadParams := Value; + prSmartRefresh: + FSmartRefresh := Value; + prSmartRefreshMsg: + FSmartRefreshMsg := Value; + prSmartRefreshService: + FSmartRefreshService := Value; + prNonBlocking: + FNonBlocking := Value; + else + Result := inherited SetProp(Prop, Value); + end; +end; + +function TOLEDBCommand.IUnknownIsNull: boolean; +begin + Result := FIUnknown = nil; +end; + +function TOLEDBCommand.IUnknownNextIsNull: boolean; +begin + Result := FIUnknownNext = nil; +end; + +function TOLEDBCommand.IMultipleResultsIsNull: boolean; +begin + Result := FIMultipleResults = nil; +end; + +function TOLEDBCommand.ISSAsynchStatusIsNull: boolean; +begin + Result := FISSAsynchStatus = nil; +end; + +procedure TOLEDBCommand.ClearIUnknown; +begin + FIUnknown := nil; +end; + +procedure TOLEDBCommand.ClearIUnknownNext; +begin + FIUnknownNext := nil; +end; + +procedure TOLEDBCommand.ClearIMultipleResults; +begin +{$IFDEF CLR} + if FIMultipleResults <> nil then + Marshal.ReleaseComObject(FIMultipleResults); +{$ENDIF} + FIMultipleResults := nil; // Rowsets not also provided +end; + +procedure TOLEDBCommand.ClearISSAsynchStatus; +begin + FISSAsynchStatus := nil; +end; + +procedure TOLEDBCommand.BreakExec; +begin + if FNonBlocking and not ISSAsynchStatusIsNull then + FExecutor.Terminate + else begin + FBreakExecCS.Acquire; + try + if FICommandText <> nil then + Check(ICommand(FICommandText).Cancel); + FWaitForBreak := True; + finally + FBreakExecCS.Release; + end; + end; +end; + +function TOLEDBCommand.GetParamDescType: TParamDescClass; +begin + Result := TOLEDBParamDesc; +end; + +function TOLEDBCommand.AddParam: TParamDesc; +begin + Result := TOLEDBParamDesc.Create; + FParams.Add(Result); +end; + +function TOLEDBCommand.GetParam(Index: integer): TOLEDBParamDesc; +begin + Result := TOLEDBParamDesc(FParams[Index]); +end; + +{ TOLEDBFieldDesc } + +function TOLEDBFieldDesc.ActualNameQuoted(RecordSet: TCRRecordSet; const QuoteNames: boolean): string; +begin + if FActualNameQuoted[QuoteNames] <> '' then + Result := FActualNameQuoted[QuoteNames] + else + begin + if FTableInfo <> nil then begin + if QuoteNames then + Result := FTableInfo.Quote(BaseColumnName, LeftQuote, RightQuote) + else + Result := BaseColumnName; + FActualNameQuoted[QuoteNames] := Result; + end + else begin + if QuoteNames then + Result := TOLEDBRecordSet(RecordSet).GetTableInfoClass.Quote(BaseColumnName, LeftQuote, RightQuote) + else + Result := BaseColumnName; + FActualNameQuoted[QuoteNames] := Result; + end; + end; +end; + +{ TMSTableInfo } + +class function TOLEDBTableInfo.LeftQuote: Char; +begin + Result := {$IFDEF CLR}CoreLab.Sdac.{$ENDIF}OLEDBAccess.LeftQuote; +end; + +class function TOLEDBTableInfo.RightQuote: Char; +begin + Result := {$IFDEF CLR}CoreLab.Sdac.{$ENDIF}OLEDBAccess.RightQuote; +end; + +{ TOLEDBRecorSet } + +constructor TOLEDBRecordSet.Create; +begin + FEnableBCD := False; + FUniqueRecords := False; + FRequestSQLObjects := False; + FCursorUpdate := True; + FCursorTypeChanged := nil; + + FLockClearMultipleResults := False; + FroAfterUpdate := False; + + FWideStrings := True; // Native fields mapping + + inherited; + FNativeRowset := True; + FCursorType := ctDefaultResultSet; + FFetchRows := 25; +end; + +destructor TOLEDBRecordSet.Destroy; +begin + Assert((not FNativeRowset) or (FIRowset = nil), 'TOLEDBRecordSet.Destroy - interfaces not released'); + inherited; +end; + +function TOLEDBRecordSet.GetFieldDescType: TFieldDescClass; +begin + Result := TOLEDBFieldDesc; +end; + +procedure TOLEDBRecordSet.ClearHRowIfNeed; +{$IFDEF CLR} +var + rghRows: PUintArray; + GCHandle: IntPtr; +{$ENDIF} +begin + if FHRowAccessible and (FCursorType in ServerCursorTypes) then begin + Assert(FIRowset <> nil, 'TOLEDBRecordSet.ClearHRowIfNeed - FIRowset must be setted'); + + {$IFDEF CLR} + GCHandle := AllocGCHandle(TObject(FHRow), True); + try + rghRows := GetAddrOfPinnedObject(GCHandle); + Check(FIRowset.ReleaseRows(1, rghRows, nil, nil, nil)); + finally + FreeGCHandle(GCHandle); + end; + {$ELSE} + Check(FIRowset.ReleaseRows(1, @FHRow, nil, nil, nil)); + {$ENDIF} + FHRow := MaxLongint; + FHRowAccessible := False; + end; +end; + +function TOLEDBRecordSet.GetIndicatorSize: word; +begin + Result := FieldCount * OLE_DB_INDICATOR_SIZE; +end; + +function TOLEDBRecordSet.IsBlobFieldType(DataType: word): boolean; +begin + Result := inherited IsBlobFieldType(DataType) or (DataType = dtMSXML); +end; + +procedure TOLEDBRecordSet.CreateComplexField(RecBuf: IntPtr; FieldIndex: integer; WithBlob: boolean); +var + Blob: TSharedObject; + FieldDesc: TFieldDesc; +begin + FieldDesc := Fields[FieldIndex]; + case FieldDesc.DataType of + dtBlob, dtMemo, dtWideMemo, dtMSXML: + if WithBlob then begin + {$IFDEF HAVE_COMPRESS} + if FieldDesc.DataType = dtBlob then + Blob := TCompressedBlob.Create + else + {$ENDIF} + Blob := TBlob.Create; + TBlob(Blob).EnableRollback; + SetObject(FieldIndex + 1, RecBuf, Blob); + end; + else + inherited; + end; +end; + +procedure TOLEDBRecordSet.CreateComplexFields(RecBuf: IntPtr; WithBlob: boolean); +var + i: integer; + Blob: TBlob; + Field: TFieldDesc; +begin + inherited; + + if WithBlob then + for i := 0 to FieldCount - 1 do begin + Field := Fields[i]; + if (Field.FieldDescKind <> fdkCalculated) and (((Field.DataType = dtMemo) or (Field.DataType = dtWideMemo)) and ((Field.SubDataType and dtWide) <> 0)) or (Field.DataType = dtMSXML) then begin + Blob := TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(RecBuf, Field.Offset))); + Blob.IsUnicode := True; + end + end; +end; + +procedure TOLEDBRecordSet.FreeComplexFields(RecBuf: IntPtr; WithBlob: boolean); +var + i: integer; + Handle: IntPtr; + so: TSharedObject; + b: boolean; + Field: TFieldDesc; +begin + inherited; + + for i := 0 to FieldCount - 1 do begin + Field := Fields[i]; + if (Field.FieldDescKind <> fdkCalculated) and (Field.DataType = dtMSXML) and WithBlob then begin + Handle := Marshal.ReadIntPtr(RecBuf, Field.Offset); + so := TSharedObject(GetGCHandleTarget(Handle)); + b := (so <> nil) and (so.RefCount = 1); + so.Free; + if b then + Marshal.WriteIntPtr(RecBuf, Field.Offset, nil); + end; + end; +end; + +function TOLEDBRecordSet.GetStatus(FieldNo: word; RecBuf: IntPtr): DWORD; +begin + Result := DWORD(Marshal.ReadInt32(RecBuf, DataSize + FieldNo{numeration from 0?} * OLE_DB_INDICATOR_SIZE)); +end; + +procedure TOLEDBRecordSet.SetStatus(FieldNo: word; RecBuf: IntPtr; Value: DWORD); +begin + Marshal.WriteInt32(RecBuf, DataSize + FieldNo{numeration from 0?} * OLE_DB_INDICATOR_SIZE, Integer(Value)); +end; + +function TOLEDBRecordSet.GetNull(FieldNo: word; RecBuf: IntPtr): boolean; +begin + Result := GetStatus(FieldNo - 1 {numeration from 1?}, RecBuf) = DBSTATUS_S_ISNULL; + if Result then + Result := GetNullByBlob(FieldNo, RecBuf); +end; + +procedure TOLEDBRecordSet.SetNull(FieldNo: word; RecBuf: IntPtr; Value: boolean); +begin + if Value then + SetStatus(FieldNo - 1 {numeration from 1?}, RecBuf, DBSTATUS_S_ISNULL) + else + SetStatus(FieldNo - 1 {numeration from 1?}, RecBuf, DBSTATUS_S_OK); +end; + +procedure TOLEDBRecordSet.GetFieldData(Field: TFieldDesc; RecBuf: IntPtr; Dest: IntPtr); +begin + case Field.DataType of + dtString, dtWideString, dtMemo, dtWideMemo, dtMSXML: + begin + if Field.Length = 0 then + CopyBuffer(IntPtr(Integer(RecBuf) + Field.Offset), Dest, sizeof(IntPtr) {ISeqStream}) + else + inherited; + end; + dtBlob: + CopyBuffer(IntPtr(Integer(RecBuf) + Field.Offset), Dest, sizeof(TBlob)); + dtBCD: + begin + CheckBCDOverflow(Field.FieldNo, RecBuf); + inherited; + end; + else + inherited; + end; +end; + +procedure TOLEDBRecordSet.GetFieldAsVariant(FieldNo: word; RecBuf: IntPtr; var Value: variant); +begin + CheckBCDOverflow(FieldNo, RecBuf); + + inherited; +end; + +procedure TOLEDBRecordSet.PutFieldData(Field: TFieldDesc; RecBuf: IntPtr; Source: IntPtr); +begin + case Field.DataType of + dtString, dtWideString, dtMemo, dtWideMemo, dtMSXML: + begin + if Field.Length = 0 then + CopyBuffer(Source, IntPtr(Integer(RecBuf) + Field.Offset), sizeof(IntPtr) {ISeqStream}) + else + inherited; + end; + dtBlob: + CopyBuffer(Source, IntPtr(Integer(RecBuf) + Field.Offset), sizeof(TBlob)); + else + inherited; + end; +end; + +{ Open/Close } + +function TOLEDBRecordSet.NeedInitFields: boolean; +begin + Result := FCommand.FIsSProc and Prepared; +end; + +procedure TOLEDBRecordSet.InternalPrepare; +var + ColumnsInfo: IColumnsInfo; + + cColumns: UINT; + prgInfo: PDBCOLUMNINFO; + pStringsBuffer: IntPtr; + + //Malloc: IMalloc; +begin + QueryCommandInterfaces(True); + try + SetCommandProp; + inherited; + finally + ReleaseCommandInterfaces; /// FCommand.QueryIntCnt counter is increased in inherited + end; + + try + // Detect CommandType + if FNativeRowset and not FCommand.FRPCCall then begin + // If statement is wrong in some cases exception may be occured now + QueryIntf(FCommand.FICommandPrepare, {$IFDEF CLR}IColumnsInfo{$ELSE}IID_IColumnsInfo{$ENDIF}, ColumnsInfo); + Assert(ColumnsInfo <> nil); + + pStringsBuffer := nil; + try + // If statement is wrong in some cases exception may be occured now + Check(ColumnsInfo.GetColumnInfo(cColumns, PDBCOLUMNINFO(prgInfo), pStringsBuffer)); + + if cColumns > 0 then + CommandType := ctCursor + else + CommandType := ctStatement; + finally + FreeCoMem(prgInfo); + FreeCoMem(pStringsBuffer); + end; + end; + except + InternalUnPrepare; + raise; + end; +end; + +procedure TOLEDBRecordSet.InternalUnPrepare; +begin + try + inherited; + finally + if FNativeRowset then begin + // ReleaseCommandInterfaces; + if not FLockClearMultipleResults then begin + FCommand.ClearIMultipleResults; + FCommand.FIUnknownNext := nil; + end; + FCommand.FIUnknown := nil; + ReleaseRecordSetInterfaces; + end; + CommandType := ctUnknown; + end; +end; + +procedure TOLEDBRecordSet.InsertRecord(RecBuf: IntPtr); + procedure AppItem; + var + Block: PBlockHeader; + Item: PItemHeader; + begin + Assert(IntPtr(BlockMan.FirstBlock) = nil); + + // Nearly copied from TBlockManager.AddFreeBlock + BlockMan.AllocBlock(Block, 1); + Item := IntPtr(Integer(Block) + sizeof(TBlockHeader)); + Item.Prev := nil; + Item.Next := nil; + Item.Block := Block; + Item.Flag := flFree; + + BlockMan.FirstFree := Item; + Block.UsedItems := 0; + //------------------ + + CurrentItem := AppendItem; + end; + +var + Appended: boolean; + i: integer; +begin +// ODS(Format('+ TOLEDBRecordSet.InsertRecord FI = %d, CI = %d, LI = %d, BOF = %s, EOF = %s', [Integer(FirstItem), Integer(CurrentItem), Integer(LastItem), BoolToStr(BOF, True), BoolToStr(EOF, True)])); + if (FIRowsetUpdate <> nil) then begin + if IntPtr(CurrentItem) = nil then begin + if IntPtr(FirstItem) <> nil then + CurrentItem := FirstItem + else + if IntPtr(LastItem) <> nil then + CurrentItem := LastItem; + end; + + Appended := IntPtr(CurrentItem) = nil; + if Appended then + AppItem + else + if HasComplexFields then + FreeComplexFields(IntPtr(Integer(CurrentItem.Block) + sizeof(TBlockHeader) + sizeof(TItemHeader)), True); + + InternalAppend(RecBuf); + PutRecord(RecBuf); + ReorderItems(CurrentItem, roInsert); + + if FCursorType = ctKeySet then begin + FirstItem := nil; + CurrentItem := nil; + LastItem := nil; + + SetToEnd; + end + else + begin + Assert(FCursorType = ctDynamic); + if HasBlobFields then + for i := 0 to FieldCount - 1 do + if IsBlobFieldType(Fields[i].DataType) then + TBlob(GetObject(Fields[i].FieldNo, RecBuf)).Commit; + + FirstItem := nil; + CurrentItem := nil; + LastItem := nil; + + FLastFetchBack := False; + SetToEnd; + end; + end + else + if ((FCursorType in ServerCursorTypes) and not FCursorUpdate) then begin + if FRecordCount = 0 then + begin + InternalAppend(RecBuf); + + AppItem; + PutRecord(RecBuf); + ReorderItems(CurrentItem, roInsert); + + CurrentItem := nil; +// SetToEnd; - no sense for keyset cursors + FBof := False; +{ SetToEnd; + + FBof := FirstItem = nil; + FEof := LastItem = nil;} + end + else + begin + InternalAppend(RecBuf); + + if HasComplexFields then + FreeComplexFields(RecBuf, True); + SetToEnd; + CurrentItem := LastItem; + + FBof := IntPtr(FirstItem) = nil; + FEof := IntPtr(LastItem) = nil; + end; + end + else + inherited; +// ODS(Format('+ TOLEDBRecordSet.InsertRecord FI = %d, CI = %d, LI = %d, BOF = %s, EOF = %s', [Integer(FirstItem), Integer(CurrentItem), Integer(LastItem), BoolToStr(BOF, True), BoolToStr(EOF, True)])); +end; + +procedure TOLEDBRecordSet.UpdateRecord(RecBuf: IntPtr); +begin + inherited; + if (FCursorType in ServerCursorTypes) and FroAfterUpdate then + FetchToBookmarkValue; +end; + +procedure TOLEDBRecordSet.DeleteRecord; +begin + if (FIRowsetUpdate <> nil) + or ((FCursorType in ServerCursorTypes) and not FCursorUpdate) then begin + InternalDelete; + RemoveRecord; + if FCursorType = ctDynamic then + FRecordCount := - 1; + + Fetch; + CurrentItem := FirstItem; + + if IntPtr(CurrentItem) = nil then begin + Fetch(True); + CurrentItem := FirstItem; + end; + end + else + inherited; +end; + +procedure TOLEDBRecordSet.SetIndexFieldNames(Value: string); +begin + if FCursorType in ServerCursorTypes then + DatabaseError(SLocalSortingServerCursor); + + inherited SetIndexFieldNames(Value); +end; + +procedure TOLEDBRecordSet.SetToBegin; +begin + case FCursorType of + ctStatic, ctKeyset: + try + FFetchFromBookmark := True; + FBookmarkSize := sizeof(byte); + FBookmarkValue := DBBMK_FIRST; + Fetch; + finally + FFetchFromBookmark := False; + FBookmarkSize := sizeof(FBookmarkValue); + end; + ctDynamic: + while Fetch(True) do; + end; + inherited; +end; + +procedure TOLEDBRecordSet.SetToEnd; +begin + if FCursorType in [ctStatic, ctKeyset] then + try + FFetchFromBookmark := True; + FBookmarkSize := sizeof(byte); + FBookmarkValue := DBBMK_LAST; + Fetch; + finally + FFetchFromBookmark := False; + FBookmarkSize := sizeof(FBookmarkValue); + end + else + FetchAll; + inherited; +end; + +function TOLEDBRecordSet.FetchToBookmarkValue(FetchBack: boolean = False): boolean; // Fetch to Bookmark. Bookmark value is stored in FBookmarkValue. Bookmark value used only for ctStatic and ctKeyset. For ctDynamic method refetched current record in specified direction +begin + Assert(FCursorType in ServerCursorTypes); + try + FFetchFromBookmark := True; + Result := Fetch(FetchBack); + finally + FFetchFromBookmark := False; + end; +end; + +procedure TOLEDBRecordSet.SetToBookmark(Bookmark: PRecBookmark); +begin + if FCursorType in [ctStatic, ctKeyset] then begin + // Cannot optimize - used to RefreshRecord + // if (FBookmarkValue <> Bookmark.Order) or (CurrentItem = nil) then begin + FBookmarkValue := Bookmark.Order; + FetchToBookmarkValue; + end; + + inherited; +end; + +function TOLEDBRecordSet.CompareBookmarks(Bookmark1, Bookmark2: PRecBookmark): integer; +const + RetCodes: array[Boolean, Boolean] of ShortInt = ((2,-1),(1,0)); +begin + if FCursorType in [ctKeyset, ctStatic] then begin + // Copied from TData.CompareBookmarks + Result := RetCodes[IntPtr(Bookmark1) = nil, IntPtr(Bookmark2) = nil]; + if Result = 2 then begin + if Bookmark1.Order >= Bookmark2.Order then + if Bookmark1.Order = Bookmark2.Order then + Result := 0 + else + Result := 1 + else + Result := -1 + end; + end + else + Result := inherited CompareBookmarks(Bookmark1, Bookmark2); + +end; + +function TOLEDBRecordSet.CanFetchBack: boolean; +begin + Result := FCursorType in ServerCursorTypes; +end; + +procedure TOLEDBRecordSet.DoFetchTerminate(Sender: TObject); // MainThread context +begin + EndFetchAll(FFetchExecutor.FException); + FFetchExecutor := nil; +end; + +procedure TOLEDBRecordSet.DoFetchException(Sender: TObject; E: Exception; var Fail: boolean); // MainThread context +begin + if (E is EOLEDBError) then + FCommand.FConnection.DoError(EOLEDBError(E), Fail); +end; + +const + FE_AFTERFETCH = 1; + +procedure TOLEDBRecordSet.DoFetchSendEvent(Sender: TObject; Event: TObject); +begin + if Integer(Event) = FE_AFTERFETCH then + DoAfterFetch; +end; + +procedure TOLEDBRecordSet.FetchAll; +begin + if (FCommand.GetCursorState < csFetchingAll) or (FCursorType = ctDynamic) then begin + FCommand.SetCursorState(csFetchingAll); + if FCommand.FNonBlocking then begin + FFetchExecutor := TOLEDBThreadWrapper.Create(TExecuteThread, True); + TExecuteThread(FFetchExecutor.FThread).FRunMethod := DoFetchAll; + FFetchExecutor.OnException := DoFetchException; + FFetchExecutor.OnTerminate := DoFetchTerminate; + FFetchExecutor.OnSendEvent := DoFetchSendEvent; + FFetchExecutor.FreeOnTerminate := True; + StringHeap.ThreadSafety := True; + // FFetchExecutor.Resume; // moved to TCustomMSDataSet.SetActive + end + else + DoFetchAll; + end; +end; + +procedure TOLEDBRecordSet.DoFetchAll; // FFetchExecutor.FThread context +begin + FFetching := True; + try + while Fetch do + if (FFetchExecutor <> nil) and FWaitForFetchBreak then + Break; + finally + FFetching := False; + end; +end; + +procedure TOLEDBRecordSet.EndFetchAll(E: Exception); // MainThread context +begin + if FCommand.FNonBlocking then + StringHeap.ThreadSafety := True; +end; + +procedure TOLEDBRecordSet.BreakFetch; +begin + inherited; + + if FCommand.FNonBlocking and (FFetchExecutor <> nil) and not FFetchExecutor.Thread.Suspended then + FFetchExecutor.Terminate; +end; + +function TOLEDBRecordSet.CanDisconnect: boolean; +begin + Result := inherited CanDisconnect + and (FCommand.FIUnknown = nil) + and (FIRowset = nil) + and (FCommand.FIUnknownNext = nil) + and (FCommand.FIMultipleResults = nil); +end; + +function TOLEDBRecordSet.RowsReturn: boolean; +begin + if CommandType <> ctUnknown then + Result := inherited RowsReturn + else //we need to know this info even if CommandType is not set(TCustomDADataSet.DoAfterExecute) + Result := (FCommand.FIUnknown <> nil) or (FIRowset <> nil); +end; + +procedure TOLEDBRecordSet.RowsetUpdateCommit; +const + RowHeader = '%s (Status = %Xh).'; +var +{$IFDEF CLR} + rghRows: PUintArray; + GCHandle: IntPtr; +{$ENDIF} + pRowStatus: PDBRowStatus; + RowStatus: DBRowStatus; + Msg: WideString; +begin + try + {$IFDEF CLR} + GCHandle := AllocGCHandle(TObject(FHRow), True); + try + rghRows := GetAddrOfPinnedObject(GCHandle); + Check(FIRowsetUpdate.Update(DB_NULL_HCHAPTER, 1, rghRows, nil, nil, pRowStatus)); + finally + FreeGCHandle(GCHandle); + end; + {$ELSE} + Check(FIRowsetUpdate.Update(DB_NULL_HCHAPTER, 1, @FHRow, nil, nil, pRowStatus)); + {$ENDIF} + except + on e: Exception do begin + if pRowStatus <> nil then begin + Msg := ''; + RowStatus := DBRowStatus(Marshal.ReadInt32(pRowStatus)); + case RowStatus of + DBROWSTATUS_S_OK:; + DBROWSTATUS_S_MULTIPLECHANGES: + AddInfoToErr(Msg, RowHeader, [SRowMultipleChanges, RowStatus]); + DBROWSTATUS_S_PENDINGCHANGES: + AddInfoToErr(Msg, RowHeader, [SRowPendingChanges, RowStatus]); + DBROWSTATUS_E_CANCELED: + AddInfoToErr(Msg, RowHeader, [SRowCanceled, RowStatus]); + //DBROWSTATUS_E_CANTRELEASE = $00000006; + DBROWSTATUS_E_CONCURRENCYVIOLATION: + AddInfoToErr(Msg, RowHeader, [SRowConcurrencyViolation, RowStatus]); + DBROWSTATUS_E_DELETED: + AddInfoToErr(Msg, RowHeader, [SRowDeleted, RowStatus]); + //DBROWSTATUS_E_PENDINGINSERT = $00000009; + //DBROWSTATUS_E_NEWLYINSERTED = $0000000A; + DBROWSTATUS_E_INTEGRITYVIOLATION: + AddInfoToErr(Msg, RowHeader, [SRowIntegrityViolation, RowStatus]); + DBROWSTATUS_E_INVALID: + Assert(False); + //DBROWSTATUS_E_MAXPENDCHANGESEXCEEDED = $0000000D; + //DBROWSTATUS_E_OBJECTOPEN = $0000000E; + //DBROWSTATUS_E_OUTOFMEMORY = $0000000F; + DBROWSTATUS_E_PERMISSIONDENIED: + AddInfoToErr(Msg, RowHeader, [SRowPermissionDenied, RowStatus]); + DBROWSTATUS_E_LIMITREACHED: + AddInfoToErr(Msg, RowHeader, [SRowLimitReached, RowStatus]); + DBROWSTATUS_E_SCHEMAVIOLATION: + AddInfoToErr(Msg, RowHeader, [SRowSchemaViolation, RowStatus]); + DBROWSTATUS_E_FAIL: + AddInfoToErr(Msg, RowHeader, [SRowFail, RowStatus]); + else + AddInfoToErr(Msg, RowHeader, [SUnknownStatus, RowStatus]); + end; + + FreeCoMem(pRowStatus); + AddInfoToErr(E, Msg, []); + end; + + // ----- + RowsetUpdateRollback; + // -----} + + raise E; + end; + end; +end; + +procedure TOLEDBRecordSet.RowsetUpdateRollback; +{$IFDEF CLR} +var + rghRows: PUintArray; + GCHandle: IntPtr; +{$ENDIF} +begin +{$IFDEF CLR} + GCHandle := AllocGCHandle(TObject(FHRow), True); + try + rghRows := GetAddrOfPinnedObject(GCHandle); + Check(FIRowsetUpdate.Undo(0, 1, rghRows, nil, nil, nil)); + finally + FreeGCHandle(GCHandle); + end; +{$ELSE} + Check(FIRowsetUpdate.Undo(0, 1, @FHRow, nil, nil, nil)); +{$ENDIF} +//Assert(cRows = 1); + +{ Check(FIRowsetUpdate.GetRowStatus(0, 1, @FHRow, @pRowStatus)); + FHRowAccessible := True; ClearHRowIfNeed; + + Check(FIRowsetUpdate.GetRowStatus(0, 1, @FHRow, @pRowStatus)); + FHRowAccessible := True; ClearHRowIfNeed; +//Check(FIRowsetUpdate.GetRowStatus(0, 1, @FHRow, @pRowStatus)); +} +end; + +procedure TOLEDBRecordSet.InternalAppend(RecBuf: IntPtr); +begin + if (FIRowsetUpdate <> nil) then begin + ClearHRowIfNeed; + InternalAppendOrUpdate(RecBuf, True); + end + else + inherited; + + if FCursorType = ctKeySet then + Inc(FRecordCount); +end; + +procedure TOLEDBRecordSet.InternalDelete; +var + hr: HResult; +{$IFDEF CLR} + rghRows: PUintArray; + GCHandle: IntPtr; +{$ENDIF} +begin + if FIRowsetUpdate = nil then + inherited + else + begin + Assert(FIRowsetUpdate <> nil, 'FCommand.FIRowsetUpdate must be setted'); + Assert(FHRowAccessible, 'FHRow must be accessible'); + + {$IFDEF CLR} + GCHandle := AllocGCHandle(TObject(FHRow), True); + try + rghRows := GetAddrOfPinnedObject(GCHandle); + hr := IRowsetChange(FIRowsetUpdate).DeleteRows(0, 1, rghRows, nil); + finally + FreeGCHandle(GCHandle); + end; + {$ELSE} + hr := FIRowsetUpdate.DeleteRows(0, 1, @FHRow, nil); + {$ENDIF} + Check(hr); + RowsetUpdateCommit; + end; +end; + +procedure TOLEDBRecordSet.InternalUpdate(RecBuf: IntPtr); +begin + if FIRowsetUpdate = nil then + inherited + else + begin + Assert(FHRowAccessible, 'FHRow must be accessible'); + InternalAppendOrUpdate(RecBuf, False); + end; +end; + +procedure TOLEDBRecordSet.InternalAppendOrUpdate(RecBuf: IntPtr; const IsAppend: boolean); +var + StreamList: TList; + + procedure SetDataToRow(const Row: hRow; const pRec: IntPtr); + procedure PrepareConvertableFields; // Server Cursors. Before send data to OLEDB + var + i: integer; + pValue: IntPtr; + HeapBuf: IntPtr; + Size: integer; + Field: TFieldDesc; + {$IFDEF VER5P} + g: TGUID; + {$ENDIF} + {$IFDEF VER6P} + Bcd: TBcd; + s: string; + DotPos, l: integer; + {$ENDIF} + {$IFDEF CLR} + BcdBuf: TBytes; + {$ENDIF} + begin + {$IFDEF VER8} + SetLength(BcdBuf, 0); // To avoid compiler warning. Delphi8 bug. + {$ENDIF} + for i := 0 to Fields.Count - 1 do begin + Field := Fields[i]; + if Field.FieldDescKind = fdkData then begin + pValue := IntPtr(Integer(pRec) + Field.Offset); + case Field.DataType of + dtBytes: + Marshal.WriteInt32(pValue, Field.Length, Field.Length); + dtVarBytes: + Marshal.WriteInt32(pValue, sizeof(word) + Field.Length, Marshal.ReadInt16(pRec, Field.Offset)); + dtExtVarBytes: + if not GetNull(i + 1, pRec) then + begin + HeapBuf := Marshal.ReadIntPtr(pValue); //HeapBuf := IntPtr(IntPtr(pValue)^); + Size := Marshal.ReadInt16(HeapBuf); + Marshal.WriteInt32(pValue, sizeof(IntPtr {IntPtr to OLEDBBuf/StringHeap}), Size); + Marshal.WriteIntPtr(pValue, IntPtr(Integer(HeapBuf) + sizeof(word))); + end; + {$IFDEF VER6P} + dtFmtBCD: + begin + {$IFDEF CLR} + Marshal.Copy(pValue, BcdBuf, 0, 34); + Bcd := TBcd.FromBytes(BcdBuf); + {$ELSE} + Bcd := PBcd(pValue)^; + {$ENDIF} + // DBNumeric + s := BcdToStr(Bcd); + if DecimalSeparator <> '.' then begin + DotPos := Pos(DecimalSeparator, s); + if DotPos <> 0 then + s[DotPos] := '.'; + end; + l := Length(s); + // Marshal.WriteInt32(pLength, l); + + if l > 0 then + CopyBufferAnsi(s, pValue, l + 1{#0}); + end; + {$ENDIF} + {$IFDEF VER5P} + dtGuid: + if not GetNull(i + 1, pRec) then + begin + g := StringToGUID(Marshal.PtrToStringAnsi(pValue)); + {$IFDEF CLR} + Marshal.StructureToPtr(TObject(g), pValue, False); + {$ELSE} + CopyBuffer(@g, pValue, sizeof(g)); + {$ENDIF} + end; + {$ENDIF} + end; + end; + end; + end; + + procedure PostPlainAccessorBlock( + const AccessorBlock: TAccessorBlock; + out NeedToPost: boolean // Used to skip unchanged BLOB fields + ); + procedure ConvertBlobToStream(BlobField: TFieldDesc; const pValue: IntPtr); + var + OLEDBStream: TOLEDBStream; + Blob: TBlob; + pUnk: IntPtr; + + begin + Blob := TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(pValue))); + + // Assert(FCursorType in [ctKeyset, ctDynamic] and FCursorUpdate); + NeedToPost := Blob.CanRollback; + + if NeedToPost then begin + // Create stream + OLEDBStream := TOLEDBStream.Create(Blob, StreamList); + pUnk := Marshal.GetIUnknownForObject(OLEDBStream); + Marshal.AddRef(pUnk); + Marshal.WriteIntPtr(pValue, pUnk); + + // Set stream size + Marshal.WriteInt32(pRec, BlobField.Offset + sizeof(IntPtr{ISeqStream}), OLEDBStream.Size); + end; + end; + + var + pValue: IntPtr; + BlobField: TFieldDesc; + + begin + NeedToPost := True; + if AccessorBlock.BlobFieldNum = -1 then + Exit; + + BlobField := Fields[AccessorBlock.BlobFieldNum]; + pValue := IntPtr(Integer(pRec) + BlobField.Offset); + if not GetNull(AccessorBlock.BlobFieldNum + 1, pRec) then + ConvertBlobToStream(BlobField, pValue); + end; + + var + FetchBlockOffset: integer; + + procedure PostExternalAccessorBlock(const AccessorBlock: TAccessorBlock); + var + i, l, p: integer; + Blob: TSharedObject; + pValue, pc: IntPtr; + pov: POleVariant; + + Field: TFieldDesc; + FieldNum: integer; + ServerVersion: integer; + + begin + Assert(AccessorBlock.BlobFieldNum = - 1); + ServerVersion := ProviderPrimaryVer; + + for i := 0 to Length(AccessorBlock.FieldNums) - 1 do begin + FieldNum := AccessorBlock.FieldNums[i]; + Field := Fields[FieldNum]; + if IsNeedFetchBlock(Field, ServerVersion) then begin + pValue := IntPtr(Integer(pRec) + Field.Offset); + case Field.DataType of + dtMemo, dtWideMemo, dtMSXML: begin + Blob := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(pValue))); + pc := IntPtr(Integer(FFetchBlock) + FetchBlockOffset + OLE_DB_INDICATOR_SIZE); + + p := 0; + if not GetNull(FieldNum + 1, pRec) then begin + l := TBlob(Blob).Size; + if l > MaxNonBlobFieldLen then // see IncFetchBlockOffset + l := MaxNonBlobFieldLen; + + if l > 0 then + p := TBlob(Blob).Read(0, l, pc); + end; + Marshal.WriteByte(pc, p, 0{#0}); + if TBlob(Blob).IsUnicode then + Marshal.WriteByte(pc, p + 1, 0{#0}); + end; + dtVariant: begin + Blob := TSharedObject(GetGCHandleTarget(Marshal.ReadIntPtr(pValue))); + pov := POleVariant(Integer(FFetchBlock) + FetchBlockOffset + OLE_DB_INDICATOR_SIZE); + Marshal.WriteInt16(pov, varEmpty); // TVarData(pov^).VType := varEmpty; + SetOleVariant(pov, TVariantObject(Blob).Value); + end; + else + Assert(False); + end; + IncFetchBlockOffset(FetchBlockOffset, Field.DataType); + end; + end; + end; + + procedure CopyStatusFBlock(const ToFBlock: boolean); // if ToFBlock is True then status is copied from pRec to FetchBlock. Otherwise - from FetchBlock to pRec + var + i: integer; + FetchBlockOffset: integer; + Status: DWORD; + + begin + FetchBlockOffset := 0; + for i := 0 to Fields.Count - 1 do + if (Fields[i].FieldDescKind = fdkData) and IsNeedFetchBlock(Fields[i], ProviderPrimaryVer) then begin + if ToFBlock then begin + Status := GetStatus(i, pRec); + Marshal.WriteInt32(FFetchBlock, FetchBlockOffset, Integer(Status)); + end + else + begin + Status := DWORD(Marshal.ReadInt32(FFetchBlock, FetchBlockOffset)); + SetStatus(i, pRec, Status); + end; + IncFetchBlockOffset(FetchBlockOffset, Fields[i].DataType); + end; + end; + + var + AccNum: integer; + hr: HResult; + NeedToPost: boolean; + begin + PrepareConvertableFields; + + FetchBlockOffset := 0; + try + for AccNum := 0 to Length(FFetchAccessorData.AccessorBlocks) - 1 do begin + Assert(Length(FFetchAccessorData.AccessorBlocks[AccNum].FieldNums) = 1); // CR 4082 + if not IsAppend // Edit + or not GetNull(FFetchAccessorData.AccessorBlocks[AccNum].FieldNums[0] + 1, pRec) + or (FFetchAccessorData.AccessorBlocks[AccNum].BlockType = abBlob) then begin + case FFetchAccessorData.AccessorBlocks[AccNum].BlockType of + abFetchBlock: begin + // Prepare data + CopyStatusFBlock(True); + PostExternalAccessorBlock(FFetchAccessorData.AccessorBlocks[AccNum]); + // Set data to IRowset + if FHRowAccessible then + hr := FIRowsetUpdate.SetData(FHRow, FFetchAccessorData.AccessorBlocks[AccNum].hAcc, FFetchBlock) + else + hr := FIRowsetUpdate.InsertRow(0, FFetchAccessorData.AccessorBlocks[AccNum].hAcc, FFetchBlock, FHRow); + CopyStatusFBlock(False); + + // Analyze OLE DB result + CheckAndAnalyzeFieldsStatus(hr, pRec); + FHRowAccessible := True; + end; + abOrdinary, abBLOB: begin + // Prepare data + PostPlainAccessorBlock(FFetchAccessorData.AccessorBlocks[AccNum], NeedToPost); + if NeedToPost then begin + // Set data to IRowset + if FHRowAccessible then + hr := FIRowsetUpdate.SetData(FHRow, FFetchAccessorData.AccessorBlocks[AccNum].hAcc, pRec) + else + hr := FIRowsetUpdate.InsertRow(0, FFetchAccessorData.AccessorBlocks[AccNum].hAcc, pRec, FHRow); + + // Analyze OLE DB result + CheckAndAnalyzeFieldsStatus(hr, pRec); + FHRowAccessible := True; + end; + end; + abReadOnly:; + end; + end; + end; + except + if FHRowAccessible then + RowsetUpdateRollback; + raise; + end; + + if FHRowAccessible then + RowsetUpdateCommit; + end; + +var + pRec, pRecOld: IntPtr; + i: integer; + OLEDBStream: TOLEDBStream; + +begin + Assert(FIRowsetUpdate <> nil, 'FCommand.FIRowsetUpdate must be setted'); + + StreamList := nil; + pRecOld := RecBuf; + + /// Store old values to prevent conversion. Blob fields is not stored + pRec := Marshal.AllocHGlobal(RecordSize); + try + StreamList := TList.Create; + CopyBuffer(pRecOld, pRec, RecordSize); + SetDataToRow(FHRow, pRec); + finally + Marshal.FreeHGlobal(pRec); + + // Remove streams + for i := StreamList.Count - 1 downto 0 do begin + OLEDBStream := TOLEDBStream(StreamList[i]); + {$IFDEF CLR} + OLEDBStream.Free; + {$ELSE} + OLEDBStream._Release; + {$ENDIF} + if GUIDToString(ProviderId) = GUIDToString(CLSID_SQLNCLI) then + OLEDBStream.FStreamList := nil; + end; + Assert((StreamList.Count = 0) or (GUIDToString(ProviderId) = GUIDToString(CLSID_SQLNCLI)), 'StreamList.Count = ' + IntToStr(StreamList.Count)); + StreamList.Free; + end; +end; + +procedure TOLEDBRecordSet.SetCommandProp; +var + OLEDBProperties: TOLEDBPropertiesSet; + IRowsetUpdateRequired: boolean; + IsSQLEverywhere: boolean; +begin +{$IFDEF SDAC_TEST} + Inc(__SetRecordSetCommandPropCount); +{$ENDIF} + + Assert(FNativeRowset, 'FNativeRowset must be True'); + Assert(FCommand.FIMultipleResults = nil, 'FCommand.FIMultipleResults must be nil'); + + IsSQLEverywhere := Provider = prCompact; + if FCursorType in ServerCursorTypes then begin + // Server cursor has no sence in disconnected mode + if DisconnectedMode then + DatabaseError(SDMandServerCursors); + FFetchRows := 1; /// !!! + FFetchAll := False; + FCommand.FRequestMultipleResults := False; + end + else + FCommand.FRequestMultipleResults := not IsSQLEverywhere; + + IRowsetUpdateRequired := (ProviderPrimaryVer = 7); + + OLEDBProperties := TOLEDBPropertiesSet.Create(FCommand.FConnection, DBPROPSET_ROWSET); + try + with OLEDBProperties do begin + // AddPropInt(DBPROP_ACCESSORDER, DBPROPVAL_AO_SEQUENTIALSTORAGEOBJECTS); - no performance improvement + AddPropInt(DBPROP_ACCESSORDER, DBPROPVAL_AO_RANDOM); + + case FCursorType of + ctDefaultResultSet: + begin + if not IsSQLEverywhere then + AddPropBool(DBPROP_UNIQUEROWS, FUniqueRecords or not FReadOnly); + AddPropBool(DBPROP_IColumnsRowset, FRequestSQLObjects); + if not IsSQLEverywhere then begin + AddPropBool(DBPROP_IMultipleResults, FCommand.FRequestMultipleResults); + AddPropBool(DBPROP_SERVERCURSOR, False); + end; + AddPropBool(DBPROP_OWNINSERT, False); + AddPropBool(DBPROP_OTHERINSERT, False); + AddPropBool(DBPROP_OTHERUPDATEDELETE, False); + AddPropBool(DBPROP_OWNUPDATEDELETE, False); + AddPropBool(DBPROP_IRowsetChange, False); + AddPropBool(DBPROP_IRowsetUpdate, False); + end; + ctStatic: + begin + {Static RO} + AddPropBool(DBPROP_SERVERCURSOR, True); + AddPropBool(DBPROP_IRowsetChange, False); + AddPropBool(DBPROP_IRowsetUpdate, False); + AddPropBool(DBPROP_OWNINSERT, False); + AddPropBool(DBPROP_OTHERINSERT, False); + AddPropBool(DBPROP_OTHERUPDATEDELETE, False); + AddPropBool(DBPROP_OWNUPDATEDELETE, False); + AddPropBool(DBPROP_REMOVEDELETED, False); + AddPropBool(DBPROP_IRowsetResynch, False); + AddPropBool(DBPROP_CHANGEINSERTEDROWS, False); + AddPropBool(DBPROP_SERVERDATAONINSERT, False); + AddPropBool(DBPROP_UNIQUEROWS, False); + AddPropBool(DBPROP_CANFETCHBACKWARDS, not FUniDirectional); + + // Bookmarks + AddPropBool(DBPROP_IRowsetLocate, True); + AddPropBool(DBPROP_BOOKMARKS, True); + end; + ctKeyset: + begin + {Keyset} + AddPropBool(DBPROP_SERVERCURSOR, True); + AddPropBool(DBPROP_OTHERINSERT, False); + AddPropBool(DBPROP_OTHERUPDATEDELETE, True); + AddPropBool(DBPROP_OWNINSERT, True); + AddPropBool(DBPROP_OWNUPDATEDELETE, True); + AddPropBool(DBPROP_UNIQUEROWS, False); + AddPropBool(DBPROP_IMMOBILEROWS, True); + AddPropBool(DBPROP_CANFETCHBACKWARDS, not FUniDirectional); + + // Bookmarks + AddPropBool(DBPROP_IRowsetLocate, True); + AddPropBool(DBPROP_BOOKMARKS, True); + AddPropBool(DBPROP_REMOVEDELETED, True); + + // RO or RW cursor + AddPropBool(DBPROP_IRowsetUpdate, not FReadOnly and FCursorUpdate, IRowsetUpdateRequired); + AddPropBool(DBPROP_CHANGEINSERTEDROWS, True); + + // Transactions support + AddPropBool(DBPROP_COMMITPRESERVE, True); + AddPropBool(DBPROP_ABORTPRESERVE, True); + + end; + ctDynamic: + begin + {Dynamic} + AddPropBool(DBPROP_SERVERCURSOR, True); + AddPropBool(DBPROP_OTHERINSERT, True); + AddPropBool(DBPROP_OTHERUPDATEDELETE, True); + AddPropBool(DBPROP_OWNINSERT, True); + AddPropBool(DBPROP_OWNUPDATEDELETE, True); + AddPropBool(DBPROP_UNIQUEROWS, False); + AddPropBool(DBPROP_IMMOBILEROWS, False); + AddPropBool(DBPROP_CANFETCHBACKWARDS, not FUniDirectional); + + // Bookmarks + AddPropBool(DBPROP_IRowsetLocate, False); + AddPropBool(DBPROP_BOOKMARKS, False); + AddPropBool(DBPROP_REMOVEDELETED, True); + + // RO or RW cursor + AddPropBool(DBPROP_IRowsetUpdate, not FReadOnly and FCursorUpdate, IRowsetUpdateRequired); + AddPropBool(DBPROP_CHANGEINSERTEDROWS, False); + + AddPropBool(DBPROP_IRowsetScroll, False); + AddPropBool(DBPROP_CANHOLDROWS, False); + AddPropBool(DBPROP_LITERALBOOKMARKS, False); + AddPropBool(DBPROP_SERVERDATAONINSERT, False); + + // Transactions support + AddPropBool(DBPROP_COMMITPRESERVE, True); + AddPropBool(DBPROP_ABORTPRESERVE, True); + + end; + end; + end; + OLEDBProperties.SetProperties(FCommand.FICommandProperties); + finally + OLEDBProperties.Free; + end; +end; + +procedure TOLEDBRecordSet.QueryCommandInterfaces(const QueryPrepare: boolean); // Create ConnectionSwap if need. Call FCommand.QueryInterfaces. +begin + FCommand.QueryInterfaces(QueryPrepare); +end; + +procedure TOLEDBRecordSet.ReleaseCommandInterfaces; +begin + FCommand.ReleaseInterfaces; +end; + +procedure TOLEDBRecordSet.QueryRecordSetInterfaces; +{ procedure GetProperties; + const + PropSetCnt = 1; + PropCnt = 12; + var + RowsetInfo: IRowsetInfo; + + rgPropertyIDSets: PDBPropIDSetArray; + DBPropIDArray: array[0..PropCnt - 1] of DBPROPID; + + rgPropertySets: PDBPropSet; + cPropertySets: UINT; + b: boolean; + i: integer; + st: DBPROPSTATUS; + begin + FIRowset.QueryInterface(IID_IRowsetInfo, RowsetInfo); + + DBPropIDArray[0] := DBPROP_SERVERCURSOR; + DBPropIDArray[1] := DBPROP_IRowsetChange; + DBPropIDArray[2] := DBPROP_IRowsetUpdate; + DBPropIDArray[3] := DBPROP_OWNINSERT; + DBPropIDArray[4] := DBPROP_OTHERINSERT; + DBPropIDArray[5] := DBPROP_OTHERUPDATEDELETE; + DBPropIDArray[6] := DBPROP_OWNUPDATEDELETE; + DBPropIDArray[7] := DBPROP_REMOVEDELETED; + DBPropIDArray[8] := DBPROP_IRowsetResynch; + DBPropIDArray[9] := DBPROP_CHANGEINSERTEDROWS; + DBPropIDArray[10] := DBPROP_SERVERDATAONINSERT; + DBPropIDArray[11] := DBPROP_UNIQUEROWS; + + GetMem1(rgPropertyIDSets, PropSetCnt * sizeof(DBPropIDSet)); + try + rgPropertyIDSets[0].guidPropertySet := DBPROPSET_ROWSET; + rgPropertyIDSets[0].cPropertyIDs := PropCnt; + rgPropertyIDSets[0].rgPropertyIDs := @DBPropIDArray; + + Check(RowsetInfo.GetProperties(PropSetCnt, rgPropertyIDSets, + cPropertySets, PDBPropSet(rgPropertySets))); + + Assert(rgPropertySets <> nil, 'Cannot get properties'); + + for i := 0 to PropCnt - 1 do + begin + b := rgPropertySets.rgProperties[i].vValue; + st := rgPropertySets.rgProperties[i].dwStatus; + b := not b; + end; + + finally + FreeMem1(rgPropertyIDSets); + FCommand.FConnection.Malloc.Free(rgPropertySets.rgProperties); + FCommand.FConnection.Malloc.Free(rgPropertySets); + end; + end; +} +begin + try + if FNativeRowset then begin + Assert(FIRowset = nil, 'Duplicate call to TOLEDBRecordSet.QueryRecordSetInterfaces'); + Assert(FCommand.FIUnknown <> nil, 'FCommand.FIUnknown must be setted'); + + QueryIntf(FCommand.FIUnknown, {$IFDEF CLR}IRowset{$ELSE}IID_IRowset{$ENDIF}, FIRowset); + + if FCursorType in [ctKeyset, ctStatic] then begin + QueryIntf(FIRowset, {$IFDEF CLR}IRowsetLocate{$ELSE}IID_IRowsetLocate{$ENDIF}, FIRowsetLocate); + Assert(FIRowsetLocate <> nil); + end; + + {if (FCursorType in [ctKeyset, ctDynamic]) then + GetProperties;} + if (FCursorType in [ctKeyset, ctDynamic]) + and not FReadOnly + and FCursorUpdate then + QueryIntf(FIRowset, {$IFDEF CLR}IRowsetUpdate{$ELSE}IID_IRowsetUpdate{$ENDIF}, FIRowsetUpdate); + + FCommand.FIUnknown := nil; + end; + except + ReleaseRecordSetInterfaces; + end; +end; + +procedure TOLEDBRecordSet.ReleaseRecordSetInterfaces; +begin + FIRowsetUpdate := nil; + + FIRowset := nil; + FIRowsetLocate := nil; + + if FNativeRowset then + RequestParamsIfPossible; +end; + +procedure TOLEDBRecordSet.ReleaseAllInterfaces(const ReleaseMultipleResults: boolean); +begin + FreeFetchBlock; + FCommand.FIUnknown := nil; + ReleaseRecordSetInterfaces; +end; + +procedure TOLEDBRecordSet.InternalOpen; +begin + FLastFetchBack := False; + FLastFetchOK := True; + FLastFetchEnd := False; + FHRowAccessible := False; + if FCursorType = ctDynamic then + FRecordCount := - 1; + + FProcessDynBofEof := False; + + try + if FNativeRowset then + QueryCommandInterfaces(False); // If QueryInterfaces already called then do nothing. Need to prevent clear FICommandText & FICommandProperties after command.execute before CreateFieldDescByRowset + + inherited; + except + if FNativeRowset then + ReleaseCommandInterfaces; + + if FCommand.GetCursorState = csFetched then + FCommand.SetCursorState(csInactive); + + raise; + end; +end; + +procedure TOLEDBRecordSet.InternalClose; +begin + if FCommand.FNonBlocking and (FFetchExecutor <> nil) then + BreakFetch; + + ClearHRowIfNeed; + FreeFetchBlock; + if FNativeRowset then begin + if not FLockClearMultipleResults then begin + FCommand.ClearIMultipleResults; + FCommand.FIUnknownNext := nil; + end; + FCommand.FIUnknown := nil; + RequestParamsIfPossible; + end; + if FIRowset <> nil then // If FIRowset is not closed on Fetch by any reason + ReleaseRecordSetInterfaces; + + FreeData; // To destroy Blobs + + if Assigned(FAfterExecFetch) then + FAfterExecFetch(True); + + if FNativeRowset then + ReleaseCommandInterfaces; + + FCommand.FCursorState := csInactive; + if not Prepared then + CommandType := ctUnknown; + + FCommand.FNextResultRequested := False; + FLastFetchEnd := False; + + inherited; +end; + +procedure TOLEDBRecordSet.ExecCommand; + procedure ProcessCursorType;// Analyze CursorType changes + var + ActualCursorType: TMSCursorType; // Cursor type after OLEDB execute. + ActualSCReadOnly: boolean; // ReadOnly after OLEDB execute. Only for server cursors and CursorUpdate = True + + procedure AnalyzeCursorType; // Analyzed by FCommand.FIUnknown + var + RowsetInfo: IRowsetInfo; + PropValues: TPropValues; + + begin + with TOLEDBPropertiesGet.Create(FCommand.FConnection, DBPROPSET_ROWSET) do + try + AddPropId(DBPROP_SERVERCURSOR); + AddPropId(DBPROP_OTHERUPDATEDELETE); + AddPropId(DBPROP_IRowsetLocate); + AddPropId(DBPROP_IRowsetUpdate); + + // Getting info interface + if FCommand.FIUnknown <> nil then begin + QueryIntf(FCommand.FIUnknown, {$IFDEF CLR}IRowsetInfo{$ELSE}IID_IRowsetInfo{$ENDIF}, RowsetInfo); + GetProperties(RowsetInfo, PropValues); + end + else + begin + Assert(FCommand.FICommandProperties <> nil); + GetProperties(FCommand.FICommandProperties, PropValues); + end; + finally + Free; + end; + + if {DBPROP_SERVERCURSOR} PropValues[0] = False then + ActualCursorType := ctDefaultResultSet + else + begin // Static, KeySet, Dynamic + if {DBPROP_OTHERUPDATEDELETE} PropValues[1] = False then begin // Static + ActualCursorType := ctStatic; + ActualSCReadOnly := True; + end + else + begin // KeySet, Dynamic + if {DBPROP_IRowsetLocate} PropValues[2] = False then // Dynamic + ActualCursorType := ctDynamic + else + ActualCursorType := ctKeySet; // KeySet + + ActualSCReadOnly := {DBPROP_IRowsetUpdate} PropValues[3] = False; + end; + end; + end; + + var + IsChanged, IsROChanged: boolean; + begin + ActualCursorType := FCursorType; + ActualSCReadOnly := FReadOnly; + AnalyzeCursorType; + + IsROChanged := (FCursorType in ServerCursorTypes) and FCursorUpdate and (FReadOnly <> ActualSCReadOnly); + IsChanged := (FCursorType <> ActualCursorType) + or IsROChanged; + + if IsChanged then begin + FCursorType := ActualCursorType; + if IsROChanged then + FReadOnly := ActualSCReadOnly; + + Assert(Assigned(FCursorTypeChanged)); + try + FCursorTypeChanged; // may be exception + except + FCommand.FIUnknown := nil; + FCommand.ClearIMultipleResults; + raise; + end; + end; + end; + +begin + if not FNativeRowset then + Exit; // CommandExec is not need for non-Native rowsets + + QueryCommandInterfaces(False); + try + if not Prepared + and (FCommand.FIMultipleResults = nil) + and FNativeRowset then // This is a first call to non-prepared DataSet.Command.Execute + SetCommandProp; + inherited; + + if (FCommand.FIUnknown <> nil) + and FCommand.FLastExecWarning then + ProcessCursorType; + + /// Must be after ProcessCursorType to prevent wrong setting CommandType + if (FCommand.FIUnknown <> nil) + or (FIRowset <> nil) then + CommandType := ctCursor + else + CommandType := ctStatement; + + finally + ReleaseCommandInterfaces; + if CommandType <> ctCursor then + FCommand.SetCursorState(csInactive); + end; +end; + +procedure TOLEDBRecordSet.Open; +begin + try + inherited; + except + if FCommand.FQueryIntCnt > 0 then + FCommand.ReleaseInterfaces; + raise; + end; +end; + +procedure TOLEDBRecordSet.Reopen; +begin + if not FNativeRowset then begin + Close; + SetIRowset(FCommand.FConnection.GetSchemaRowset(FSchema, FRestrictions), False); + end; + + inherited; +end; + +function TOLEDBRecordSet.GetSchemaRowset(const Schema: TGUID; rgRestrictions: TRestrictions): IRowset; +begin + FSchema := Schema; + FRestrictions := rgRestrictions; + + Assert(FCommand.FConnection <> nil); + Result := FCommand.FConnection.GetSchemaRowset(FSchema, FRestrictions); +end; + +procedure TOLEDBRecordSet.Disconnect; +begin + Assert(FCommand <> nil); + FCommand.FIUnknown := nil; + // FCommand.FIMultipleRes + + //Cache connection depenednt information + GetProviderPrimaryVer; + GetDBMSPrimaryVer; + GetProviderId; + GetProvider; + GetDisconnectedMode; + GetDatabase; + + ReleaseAllInterfaces(True); + inherited; +end; + +procedure TOLEDBRecordSet.CreateCommand; +var + Cmd: TOLEDBCommand; +begin + Cmd := TOLEDBCommand.Create; + Cmd.FRequestIUnknown := True; + SetCommand(Cmd); +end; + +procedure TOLEDBRecordSet.SetCommand(Value: TCRCommand); +begin + inherited; + + FCommand := TOLEDBCommand(Value); +end; + +function TOLEDBRecordSet.GetIRowset: IRowset; +begin + Result := FIRowset; +end; + +function TOLEDBRecordSet.GetICommandText: ICommandText; +begin + Result := FCommand.FICommandText; +end; + +procedure TOLEDBRecordSet.SetIRowset( + Rowset: IRowset; + const IsColumnsRowset: boolean); // If True then FieldDescs was stored in FColumnsRowsetFieldDescs +begin + Close; + Unprepare; + + FIRowset := Rowset; + FNativeRowset := False; + FReadOnly := True; // Non-native rowset cannot be modified + FCommand.FCursorState := csExecuted; + FFlatBuffers := True; + CommandType := ctUnknown; + FIsColumnsRowset := IsColumnsRowset; +end; + +procedure TOLEDBRecordSet.Check(const Status: HRESULT); +begin + if FNativeRowset then + FCommand.FConnection.Check(Status, Component) + else + if Status <> S_OK then + raise EOLEDBError.Create(Status, Format(SOLEDBError, [Status])); +end; + +procedure TOLEDBRecordSet.RequestParamsIfPossible; +begin + if (FIRowsetLocate = nil) and (FIRowsetUpdate = nil) and (FIRowset = nil) then begin + FCommand.RequestParamsIfPossible; + if (FCommand.FIUnknown = nil) + and ((FCommand.GetCursorState = csFetching) or (FCommand.GetCursorState = csFetchingAll)) then begin + FCommand.SetCursorState(csFetched); + if not Prepared then + ReleaseCommandInterfaces; + end; + end; +end; + +class function TOLEDBRecordSet.GetTableInfoClass: TTableInfoClass; +begin + Result := TOLEDBTableInfo; +end; + +function TOLEDBRecordSet.GetProviderPrimaryVer: integer; +begin + if (FCommand <> nil) and (FCommand.FConnection <> nil) then + FProviderPrimaryVer := FCommand.FConnection.ProviderPrimaryVer; + Result := FProviderPrimaryVer; +end; + +function TOLEDBRecordSet.GetDBMSPrimaryVer: integer; +begin + if (FCommand <> nil) and (FCommand.FConnection <> nil) then + FDBMSPrimaryVer := FCommand.FConnection.DBMSPrimaryVer; + Result := FDBMSPrimaryVer; +end; + +function TOLEDBRecordSet.GetProviderId: TGuid; +begin + if (FCommand <> nil) and (FCommand.FConnection <> nil) then + FProviderId := FCommand.FConnection.FProviderId; + Result := FProviderId; +end; + +function TOLEDBRecordSet.GetProvider: TOLEDBProvider; +begin + if (FCommand <> nil) and (FCommand.FConnection <> nil) then + FProvider := FCommand.FConnection.FProvider; + Result := FProvider; +end; + +function TOLEDBRecordSet.GetDisconnectedMode: boolean; +begin + if (FCommand <> nil) and (FCommand.FConnection <> nil) then + FDisconnectedMode := FCommand.FConnection.DisconnectedMode; + Result := FDisconnectedMode; +end; + +function TOLEDBRecordSet.GetDatabase: string; +begin + if (FCommand <> nil) and (FCommand.FConnection <> nil) then + FDatabase := FCommand.FConnection.FDatabase; + Result := FDatabase; +end; + +procedure TOLEDBRecordSet.CheckBCDOverflow(const FieldNo: integer {from 1}; RecBuf: IntPtr); +begin + if (Fields[FieldNo - 1].DataType = dtBCD) + and (GetStatus(FieldNo - 1, RecBuf) = DBSTATUS_E_DATAOVERFLOW) then + raise Exception.Create(SBCDOverflow); +end; + +procedure TOLEDBRecordSet.CheckAndAnalyzeFieldsStatus(const Status: HRESULT; const pRec: IntPtr); +const + FieldHeader = 'Field[%d] %s - %s (Status = %Xh).'; +var + i: integer; + FieldStatus: DWORD; + FieldName: string; + Msg: WideString; +begin + if (Status <> S_OK) and (Status <> DB_S_ERRORSOCCURRED) then + try + Check(Status); + except + on E: Exception do begin + Msg := ''; + for i := 0 to FFields.Count - 1 do + if FFields[i].FieldDescKind = fdkData then begin + FieldName := FFields[i].Name; + if FieldName = '' then + FieldName := IntToStr(i) + else + FieldName := ':' + FieldName; + FieldStatus := GetStatus(i, pRec); + case FieldStatus of + DBSTATUS_S_OK, DBSTATUS_S_ISNULL, DBSTATUS_S_DEFAULT:; + DBSTATUS_E_BADACCESSOR: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SBadAccessor, FieldStatus]); + DBSTATUS_E_CANTCONVERTVALUE: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SInvalidValue, FieldStatus]); + DBSTATUS_S_TRUNCATED: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SDataTruncated, FieldStatus]); + DBSTATUS_E_SIGNMISMATCH: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SSignMismatch, FieldStatus]); + DBSTATUS_E_DATAOVERFLOW: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SDataOverflow, FieldStatus]); + DBSTATUS_E_CANTCREATE: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SCantCreate, FieldStatus]); + DBSTATUS_E_UNAVAILABLE: + {AddInfoToErr(Msg, FieldHeader, [i, FieldName, SUnavaible, FieldStatus])}; + DBSTATUS_E_PERMISSIONDENIED: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SPermissionDenied, FieldStatus]); + DBSTATUS_E_INTEGRITYVIOLATION: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SIntegrityViolation, FieldStatus]); + DBSTATUS_E_SCHEMAVIOLATION: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SShemaViolation, FieldStatus]); + DBSTATUS_E_BADSTATUS: + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SBadStatus, FieldStatus]); + else + AddInfoToErr(Msg, FieldHeader, [i, FieldName, SUnknownStatus, FieldStatus]); + end; + end; + AddInfoToErr(E, Msg, []); + raise E; + end; + end; +end; + +procedure TOLEDBRecordSet.InternalInitFields; + function ConvertDBCOLUMNINFOToFieldDesc( + // const prgInfoEl: PDBCOLUMNINFO; + const FieldName: string; // prgInfoEl.pwszName + const ActualFieldName: string; // if prgInfoEl.columnid.eKind = DBKIND_NAME then ActualFieldName := prgInfoEl.columnid.uName.pwszName else ActualFieldName := prgInfoEl.pwszName; + const FieldNo: integer; // prgInfoEl.iOrdinal + const OLEDBType: DBTYPE; // prgInfoEl.wType + const dwFlags: DBCOLUMNFLAGS; // prgInfoEl.dwFlags + const IsAutoIncrement: boolean; + const Precision: integer; //prgInfoEl.bPrecision + const Scale: integer; //prgInfoEl.bScale + const ColumnSize: UINT; // prgInfoEl.ulColumnSize + + // Options + const LongStrings: boolean; + // Result + Field: TOLEDBFieldDesc + ): boolean;// return False, if this field type not supported + + function IsFlagSetted(const Flag: UINT): boolean; + begin + Result := (dwFlags and Flag) <> 0; + end; + + procedure ConvertFlags; + begin + // DBCOLUMNFLAGS_ISFIXEDLENGTH, DBCOLUMNFLAGS_ISLONG, + // DBCOLUMNFLAGS_ISNULLABLE, DBCOLUMNFLAGS_MAYBENULL + // DBCOLUMNFLAGS_WRITE, DBCOLUMNFLAGS_WRITEUNKNOWN + // DBCOLUMNFLAGS_ISROWID, DBCOLUMNFLAGS_ISROWVER + // DBCOLUMNFLAGS_SCALEISNEGATIVE + + Field.Fixed := IsFlagSetted(DBCOLUMNFLAGS_ISFIXEDLENGTH); + Field.IsKey := IsFlagSetted(DBCOLUMNFLAGS_KEYCOLUMN); + Field.Required := not IsFlagSetted(DBCOLUMNFLAGS_ISNULLABLE); + Field.FIsTimestamp := IsFlagSetted(DBCOLUMNFLAGS_ISROWVER); + + Field.ReadOnly := + (not IsFlagSetted(DBCOLUMNFLAGS_WRITE) and + not IsFlagSetted(DBCOLUMNFLAGS_WRITEUNKNOWN)); + + if FNativeRowset + and not (FCursorType in ServerCursorTypes) + and Field.ReadOnly then + Field.ReadOnly := Field.FIsTimestamp or IsAutoIncrement; + + Field.FIsAutoIncrement := IsAutoIncrement; + end; + + function CreateUniqueFieldName(const FieldName: string): string; + var + AliasNum: integer; + begin + if FieldName = '' then begin + AliasNum := 1; + repeat + Result := 'COLUMN' + IntToStr(AliasNum); + Inc(AliasNum); + until FindField(Result) = nil; + end + else + Result := FieldName; + end; + + var + InternalType: word; + + begin + Field.SubDataType := dtUnknown; + + Result := ConvertOLEDBTypeToInternalFormat(OLEDBType, IsFlagSetted(DBCOLUMNFLAGS_ISLONG), FEnableBCD, {$IFDEF VER6P}FEnableFMTBCD{$ELSE}False{$ENDIF}, FWideStrings, False, InternalType, DBMSPrimaryVer); + if not Result then + Exit; + + // --- Correct access to SQL 2000 server from 7.0 Client + if FNativeRowset + and ((ProviderPrimaryVer < 8) and not IsWindowsVista) + and (Provider <> prCompact) + and (OLEDBType = DBTYPE_NUMERIC) + and (Precision = 19) then + InternalType := dtInt64; + // --- + + {$IFDEF LITE} + if (InternalType = dtFmtBCD) + and not ((Scale > 4) or (Precision > 14)) then + InternalType := dtBCD; + {$ENDIF} + + Field.DataType := InternalType; + + if FNativeRowset then + Field.Name := CreateUniqueFieldName(FieldName) + else + Field.Name := FieldName; + Field.ActualName := ActualFieldName; + Field.FieldNo := FieldNo; + + ConvertFlags; + // Correct access to 'bigint' fields from Delphi4 + {$IFDEF VER4} + if Field.DataType = dtInt64 then + Field.ReadOnly := True; + {$ENDIF} + + {if FNativeRowset then + Field.Hidden := integer(prgInfoEl.columnid.uGuid.pguid) <> 1; + // :( This is impossible becouse we needs TField for update SQLs and for ColumnsMetaInfo} + + // WAR Field.Size must be syncronized with actual data size in PutFieldData, GetFieldData, and possible PutFieldAsVariant, GetFieldAsVariant + + case InternalType of + // Integer fields + dtBoolean: + Field.Size := sizeof(WordBool); + dtInt8: begin + Field.Size := sizeof(byte); + if DBMSPrimaryVer = 3 then + Field.SubDataType := Field.SubDataType or dtUInt8; + end; + dtWord: begin + if (DBMSPrimaryVer = 3) and (OLEDBType = DBTYPE_UI1) then + Field.SubDataType := Field.SubDataType or dtUInt8; + Field.Size := sizeof(word); + end; + dtInt16: + Field.Size := sizeof(smallint); + dtInt32, dtUInt32: + Field.Size := sizeof(integer); + dtInt64: + Field.Size := sizeof(int64); + + // Float fields + dtFloat: + begin + Field.Size := sizeof(double); + Field.Scale := Scale; + Field.Length := Precision; // Precision cannot be greater then 15 + + if OLEDBType = DBTYPE_R4 then begin + Field.Length := 7; + if DBMSPrimaryVer = 3 then + Field.SubDataType := Field.SubDataType or dtSingle; + end + else + if OLEDBType = DBTYPE_R8 then + Field.Length := 15; + end; + dtCurrency: + begin + Field.Size := sizeof(double); + //Field.Size := sizeof(currency); //Currency type cannot be used over TCurrencyField uses double to store + Field.Scale := Scale; + Field.Length := Precision; // Precision cannot be greater then 15 + end; + + // Multibyte fields + dtBCD: + begin + Field.Size := sizeof(Currency); + Field.Scale := Scale; + Field.Length := Precision; + end; + + {$IFDEF VER6P} + dtFmtBCD: + begin + if Precision < SizeOfTBcd then + Field.Size := SizeOfTBcd + 1{'+/-'} + 1{'.'} + 1{#0} + else + Field.Size := Precision + 1{'.'} + 1 {#0}; // To right notation of large NUMERIC values + Field.Scale := Scale; + Field.Length := Precision; + end; + {$ENDIF} + + dtDateTime: + if DBMSPrimaryVer <> 3 then + Field.Size := sizeof(TDateTime) + else + Field.Size := sizeof(TDBTimeStamp); + dtDate, dtTime: + Field.Size := sizeof(TDateTime); + {$IFDEF VER5P} + dtGuid: + begin + Field.Length := 38; { Length(GuidString) } + Field.Size := Field.Length + 1; + end; + {$ENDIF} + dtString, dtWideString, dtMemo, dtWideMemo, dtMSXML: + begin + Field.Length := 0; // WAR Field.Size must be syncronized with actual data size in PutFieldData, GetFieldData, and possible PutFieldAsVariant, GetFieldAsVariant + {$IFNDEF VER5P} + if prgInfoEl.wType = DBTYPE_GUID then + begin + Field.Length := 38; { Length(GuidString) } + Field.Size := Word(Field.Length + 1); + end + else + {$ENDIF} + if IsFlagSetted(DBCOLUMNFLAGS_ISLONG) then begin + // This is a MS SQL 'text' or 'ntext' field + Field.SubDataType := dtText; + Field.Size := Word(sizeof(IntPtr)) {ISeqStream}; + if not FReadOnly then + Field.Size := Word(Field.Size + Word(sizeof(integer))) {DBLENGTH}; + end + else // This is a MS SQL 'char', 'varchar', 'nchar' or 'nvarchar' field + begin + if not LongStrings and (ColumnSize > 255) then begin + if InternalType = dtWideString then + Field.DataType := dtWideMemo + else + Field.DataType := dtMemo; + Field.Size := Word(sizeof(IntPtr)) {ISeqStream}; + if not FReadOnly then + Field.Size := Word(Field.Size + Word(sizeof(integer))) {DBLENGTH}; + end + else + begin + Field.Length := ColumnSize; + if InternalType = dtWideString then + Field.Size := Word((ColumnSize + 1) * sizeof(WideChar)) + else + Field.Size := Word(ColumnSize + 1); + + if not FFlatBuffers and (Field.Size >= FlatBufferLimit) and (FCursorType = ctDefaultResultSet) then + begin + Field.Size := Word(sizeof(IntPtr)); + if InternalType = dtString then + Field.DataType := dtExtString + else + Field.DataType := dtExtWideString; + end; + end; + end; + + if (OLEDBType = DBTYPE_WSTR) or (OLEDBType = DBTYPE_XML) then + Field.SubDataType := Field.SubDataType or dtWide; + end; + dtBytes, dtVarBytes, dtBlob: + begin + if IsFlagSetted(DBCOLUMNFLAGS_ISLONG) then begin + // This is a MS SQL 'image' field + // WAR Field.Size must be syncronized with actual data size in PutFieldData, GetFieldData, and possible PutFieldAsVariant, GetFieldAsVariant + Field.Size := Word(sizeof(IntPtr)) {ISeqStream}; + if not FReadOnly then + Field.Size := Word(Field.Size + Word(sizeof(integer))) {DBLENGTH}; + end + else + begin + Field.Length := Word(ColumnSize); + + if Field.Fixed then begin + if FReadOnly then + Field.Size := Word(Field.Length) + else + Field.Size := Word(Field.Length + Word(sizeof(UINT))) {OLE DB readed bytes}; + end + else + if FFlatBuffers or (ColumnSize < FlatBufferLimit) or (FCursorType <> ctDefaultResultSet) then + begin + Field.DataType := dtVarBytes; + Field.Size := Word(Word(sizeof(word)) {Readed bytes} + Field.Length + Word(sizeof(UINT))) {OLE DB readed bytes}; + end + else + begin + Field.Length := Word(ColumnSize); + Field.DataType := dtExtVarBytes; + Field.Size := Word(sizeof(IntPtr) {IntPtr to OLEDBBuf/StringHeap} + sizeof(UINT)) {OLE DB readed bytes}; + end; + end; + end; + {$IFDEF VER5P} + dtVariant: + Field.Size := sizeof(TVariantObject); + {$ENDIF} + else + Result := False; + end; + end; + + procedure CreateFieldDescs( + const IUnk: IUnknown; + const ByInfo: boolean // if True, then FieldDescs creates with using ColumnsInfo, otherwise - using ColumnsRowset + ); + + procedure CreateFieldDescsByInfo; + function GetHiddenColumnsCount: UINT; + var + PropValues: TPropValues; + begin + with TOLEDBPropertiesGet.Create(FCommand.FConnection, DBPROPSET_ROWSET) do + try + AddPropId(DBPROP_HIDDENCOLUMNS); + GetProperties(FCommand.FICommandProperties, PropValues); + finally + Free; + end; + Result := PropValues[0]; + end; + + var + ColumnsInfo: IColumnsInfo; + i: integer; + Field, BookmarkField: TOLEDBFieldDesc; + + cColumns: UINT; + prgInfo: PDBCOLUMNINFO; + prgInfoEl: PDBCOLUMNINFO; + rgInfoEl: {$IFDEF CLR}DBCOLUMNINFO{$ELSE}PDBCOLUMNINFO{$ENDIF}; + pStringsBuffer: IntPtr; + + //Malloc: IMalloc; + + ActualFieldName: string; + + begin + if IUnk = nil then + Exit; // This query does not return rowset + + QueryIntf(IUnk, {$IFDEF CLR}IColumnsInfo{$ELSE}IID_IColumnsInfo{$ENDIF}, ColumnsInfo); + Assert(ColumnsInfo <> nil); + + pStringsBuffer := nil; + Check(ColumnsInfo.GetColumnInfo(cColumns, PDBCOLUMNINFO(prgInfo), pStringsBuffer)); + + {$IFDEF LITE} + Assert(not FUniqueRecords); + {$ENDIF} + // Add hidden columns count for SQL 2000 + if FNativeRowset and ((ProviderPrimaryVer >= 8) or IsWindowsVista) and FUniqueRecords then + cColumns := cColumns + GetHiddenColumnsCount; + + if cColumns > 0 then + try + BookmarkField := nil; + prgInfoEl := prgInfo; + for i := 0 to cColumns - 1 do begin + {$IFDEF CLR} + Assert(prgInfoEl <> nil); + rgInfoEl := DBCOLUMNINFO(Marshal.PtrToStructure(prgInfoEl, TypeOf(DBCOLUMNINFO))); + {$ELSE} + rgInfoEl := prgInfoEl; + {$ENDIF} + Field := TOLEDBFieldDesc.Create; + try + if rgInfoEl.columnid.eKind = DBKIND_NAME then + ActualFieldName := Marshal.PtrToStringUni(rgInfoEl.columnid.uName{$IFNDEF CLR}.pwszName{$ENDIF}) + else + ActualFieldName := rgInfoEl.pwszName; + + if ConvertDBCOLUMNINFOToFieldDesc( + // rgInfoEl + rgInfoEl.pwszName, + ActualFieldName, + rgInfoEl.iOrdinal, + rgInfoEl.wType, + rgInfoEl.dwFlags, + False, + rgInfoEl.bPrecision, + rgInfoEl.bScale, + rgInfoEl.ulColumnSize, + FLongStrings, Field) then begin + + Field.FOLEDBType := rgInfoEl.wType; + if Field.FieldNo > 0 then + FFields.Add(Field) + else // Bookmark column have FieldNo = 0 + begin + Field.Hidden := True; + BookmarkField := Field; + FBookmarkOffset := - 1; + end; + end + else + if FNativeRowset then + DatabaseErrorFmt(SBadFieldType, [rgInfoEl.pwszName, rgInfoEl.wType]) + else + Field.Free; + except + Field.Free; + BookmarkField.Free; + raise; + end; + prgInfoEl := IntPtr(Integer(prgInfoEl) + + {$IFDEF CLR} + Marshal.SizeOf(TypeOf(DBCOLUMNINFO)) + {$ELSE} + sizeof(DBCOLUMNINFO) + {$ENDIF}); + end; + if BookmarkField <> nil then + FFields.Add(BookmarkField); + + finally + {if FCommand.FConnection = nil then + CoGetMalloc(1, Malloc) + else + Malloc := FCommand.FConnection.Malloc;} + + FreeCoMem(prgInfo); + FreeCoMem(pStringsBuffer); + //Malloc.Free(prgInfo); + //Malloc.Free(pStringsBuffer); + + //Malloc := nil; + end; + end; + + {$IFNDEF LITE} + procedure CreateFieldDescsByRowset; + var + RecBuf: IntPtr; + ColumnsMetaInfo: TOLEDBRecordSet; + + procedure CheckColumnsMetaInfo; + begin + if FCommand.FConnection.FColumnsMetaInfo <> nil then + ColumnsMetaInfo := FCommand.FConnection.FColumnsMetaInfo + else + begin + ColumnsMetaInfo := TOLEDBRecordSet.Create; + FCommand.FConnection.FColumnsMetaInfo := ColumnsMetaInfo; + + ColumnsMetaInfo.SetConnection(FCommand.FConnection); + ColumnsMetaInfo.SetProp(prFetchAll, False); + ColumnsMetaInfo.SetProp(prFetchRows, 1); + ColumnsMetaInfo.SetProp(prUniDirectional, True); + FCommand.FConnection.FFldCatalogNameIdx := -1; + end; + end; + + procedure CheckColumnsMetaInfoIdx; + begin + Assert(ColumnsMetaInfo <> nil); + if FCommand.FConnection.FFldCatalogNameIdx <> - 1 then + Exit; + + with FCommand.FConnection do begin + FFldCatalogNameIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FindField('DBCOLUMN_BASECATALOGNAME')); // SQL Everywhere + FFldSchemaNameIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FindField('DBCOLUMN_BASESCHEMANAME')); // SQL Everywhere + + FFldTableNameIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_BASETABLENAME')); + FFldColumnNameIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_BASECOLUMNNAME')); + + FFldPrecisionIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_PRECISION')); + FFldScaleIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_SCALE')); + FFldGuidIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_GUID')); + + /// ??? May be swap? + FFldFieldNameIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_IDNAME')); + FFldActualFieldNameIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_NAME')); + + FFldColumnNumberIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_NUMBER')); + + FFldIsAutoIncIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FindField('DBCOLUMN_ISAUTOINCREMENT')); // SQL Everywhere + FFldTypeIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_TYPE')); + FFldFlagsIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_FLAGS')); + FFldColumnSizeIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FieldByName('DBCOLUMN_COLUMNSIZE')); + FFldComputeModeIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FindField('DBCOLUMN_COMPUTEMODE')); + + // xml schema support + FFldXMLSchemaCollCatalogNameIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FindField('DBCOLUMN_XML_SCHEMACOLLECTION_CATALOGNAME')); + FFldXMLSchemaCollSchemaNameIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FindField('DBCOLUMN_XML_SCHEMACOLLECTION_SCHEMANAME')); + FFldXMLSchemaCollNameIdx := FColumnsMetaInfo.Fields.IndexOf(FColumnsMetaInfo.FindField('DBCOLUMN_XML_SCHEMACOLLECTIONNAME')); + end; + + end; + + procedure FillTablesAliases; + var + Parser: TMSParser; + TableName: string;// Table or view name + StLex, Alias: string; + CodeLexem: integer; + TableInfo: TCRTableInfo; + begin + TablesInfo.BeginUpdate; + Parser := TMSParser.Create(FCommand.SQL); + Parser.OmitBlank := False; + Parser.OmitComment := True; + try + if Parser.ToLexem(lxSELECT) <> lcEnd then + if Parser.ToLexem(lxFROM) <> lcEnd then + repeat + repeat + CodeLexem := Parser.GetNext(StLex);// Omit blank + until CodeLexem <> lcBlank; + + // TableName + TableName := StLex; + while True do begin + CodeLexem := Parser.GetNext(StLex); + + if (Length(StLex) > 0) and (StLex[1] = ',') then + Break; + + if {(Length(StLex) > 0) and (StLex[1] in ['[, ' + '], ' + '", ' + '.']) and} (CodeLexem <> 0) and (CodeLexem <> lcBlank) then + TableName := TableName + StLex + else + Break; + end; + + // 'AS' clause + if Parser.GetNext(Alias) = lxAS then + Parser.GetNext(Alias) + else + Parser.Back; + + // Alias + if Parser.GetNext(Alias) = lcIdent then + Parser.GetNext(StLex) + else begin + Alias := ''; + Parser.Back; + end; + + TableName := UnBracketIfPossible(TableName); + Assert(TableName <> '', 'TableName cannot be empty'); // ++++ + + TableInfo := TablesInfo.FindByName(TableName); + if TableInfo = nil then begin + TableInfo := TablesInfo.Add; + TableInfo.TableName := TableName; + TableInfo.TableAlias := ''; + TableInfo.IsView := True; + end; + + if Alias <> '' then + TableInfo.TableAlias := TableInfo.NormalizeName(Alias); + until (StLex <> ','); + finally + Parser.Free; + TablesInfo.EndUpdate; + end; + end; + + function GetStrValue(Idx: integer): string; + var + Field: TOLEDBFieldDesc; + begin + if ColumnsMetaInfo.GetNull(Idx + 1, RecBuf) then + Result := '' + else + begin + Field := TOLEDBFieldDesc(ColumnsMetaInfo.Fields[Idx]); + if (Field.SubDataType and dtWide) = 0 then + Result := Marshal.PtrToStringAnsi(IntPtr(Integer(RecBuf) + Field.Offset)) + else + Result := Marshal.PtrToStringUni(IntPtr(Integer(RecBuf) + Field.Offset)); + end; + end; + + function GetWordValue(Idx: integer): Word; + begin + if ColumnsMetaInfo.GetNull(Idx + 1, RecBuf) then + Result := 0 + else + Result := Word(Marshal.ReadInt16(RecBuf, ColumnsMetaInfo.Fields[Idx].Offset)); + end; + + function GetLongWordValue(Idx: integer): Word; + begin + if ColumnsMetaInfo.GetNull(Idx + 1, RecBuf) then + Result := 0 + else + Result := LongWord(Marshal.ReadInt32(RecBuf, ColumnsMetaInfo.Fields[Idx].Offset)); + end; + + function GetUINTValue(Idx: integer): UINT; + begin + if ColumnsMetaInfo.GetNull(Idx + 1, RecBuf) then + Result := 0 + else + Result := UINT(Marshal.ReadInt32(RecBuf, ColumnsMetaInfo.Fields[Idx].Offset)); + end; + + function GetSmallIntValue(Idx: integer): SmallInt; + begin + if ColumnsMetaInfo.GetNull(Idx + 1, RecBuf) then + Result := 0 + else + Result := SmallInt(Marshal.ReadInt16(RecBuf, ColumnsMetaInfo.Fields[Idx].Offset)); + end; + + var + ColumnsRowset: IColumnsRowset; + CMIRowset: IRowset; + + Field, BookmarkField: TOLEDBFieldDesc; + FieldNo: integer; + TableName: string; + + FieldName, ActualFieldName: string; + iu: IUnknown; + FldGuidValue: string; + + TableInfo: TCRTableInfo; + IsAutoIncrement: boolean; + + ColumnsRecordSet: TOLEDBRecordSet; + Value: variant; + begin + if IUnk = nil then + Exit; // This query does not return rowset + + Assert (FRequestSQLObjects and FNativeRowset); + + QueryIntf(IUnk, {$IFDEF CLR}IColumnsRowset{$ELSE}IID_IColumnsRowset{$ENDIF}, ColumnsRowset); + Check(ColumnsRowset.GetColumnsRowset(nil, 0, nil, IID_IRowset, 0, nil, iu));{Default properties - default result set} + CMIRowset := IRowset(iu); + Assert(CMIRowset <> nil); + try + FBookmarkOffset := - 2; + BookmarkField := nil; + CheckColumnsMetaInfo; + + ColumnsMetaInfo.SetIRowset(CMIRowset, True); + //ColumnsMetaInfo.Prepare; + ColumnsMetaInfo.Open; + + RecBuf := nil; + try + CheckColumnsMetaInfoIdx; + + ColumnsMetaInfo.AllocRecBuf(IntPtr(RecBuf)); + + while True do begin + ColumnsMetaInfo.GetNextRecord(RecBuf); + if ColumnsMetaInfo.Eof then + Break; + + FieldNo := GetLongWordValue(FCommand.FConnection.FFldColumnNumberIdx); + Assert(FieldNo >= 0); // Bookmark column have FieldNo = 0 + + Field := TOLEDBFieldDesc.Create; + try + { + SELECT BaseColumnName AS ColumnAlias ... + + FIConnection.ProviderVer = [07.01.0623, 07.01.0690, 07.01.0819, 07.01.0961] + FieldName = BaseColumnName + ActualName = ColumnAlias + BaseColumnName = BaseColumnName + + FIConnection.ProviderVer = [08.00.0194, 08.00.0528, 08.10.7430, 08.10.9001] + FieldName = ColumnAlias + ActualName = ColumnAlias + BaseColumnName = BaseColumnName + } + + ActualFieldName := GetStrValue(FCommand.FConnection.FFldActualFieldNameIdx); + if (ProviderPrimaryVer < 8) and not IsWindowsVista then + FieldName := ActualFieldName + else + FieldName := GetStrValue(FCommand.FConnection.FFldFieldNameIdx); + + IsAutoIncrement := False; + if FCommand.FConnection.FFldIsAutoIncIdx <> - 1 then + IsAutoIncrement := WordBool(GetWordValue(FCommand.FConnection.FFldIsAutoIncIdx)); + + if ConvertDBCOLUMNINFOToFieldDesc( + // prgInfoEl + FieldName, + ActualFieldName, + FieldNo, + GetWordValue(FCommand.FConnection.FFldTypeIdx), + GetUINTValue(FCommand.FConnection.FFldFlagsIdx), + IsAutoIncrement, + GetWordValue(FCommand.FConnection.FFldPrecisionIdx), + GetSmallIntValue(FCommand.FConnection.FFldScaleIdx), + GetUINTValue(FCommand.FConnection.FFldColumnSizeIdx), + + // Options + FLongStrings, Field) then begin + + Field.FOLEDBType := GetWordValue(FCommand.FConnection.FFldTypeIdx); + if FCommand.FConnection.FFldCatalogNameIdx <> -1 then + Field.FBaseCatalogName := GetStrValue(FCommand.FConnection.FFldCatalogNameIdx); + if FCommand.FConnection.FFldSchemaNameIdx <> -1 then + Field.FBaseSchemaName := GetStrValue(FCommand.FConnection.FFldSchemaNameIdx); + Field.FBaseTableName := GetStrValue(FCommand.FConnection.FFldTableNameIdx); + Field.FBaseColumnName := GetStrValue(FCommand.FConnection.FFldColumnNameIdx); + + if FCommand.FConnection.FFldXMLSchemaCollCatalogNameIdx <> -1 then + Field.FXMLSchemaCollectionCatalogName := GetStrValue(FCommand.FConnection.FFldXMLSchemaCollCatalogNameIdx); + if FCommand.FConnection.FFldXMLSchemaCollSchemaNameIdx <> -1 then + Field.FXMLSchemaCollectionSchemaName := GetStrValue(FCommand.FConnection.FFldXMLSchemaCollSchemaNameIdx); + if FCommand.FConnection.FFldXMLSchemaCollNameIdx <> -1 then + Field.FXMLSchemaCollectionName := GetStrValue(FCommand.FConnection.FFldXMLSchemaCollNameIdx); + Field.FXMLTyped := (Field.XMLSchemaCollectionCatalogName <> '') or (Field.XMLSchemaCollectionSchemaName <> '') or + (Field.FXMLSchemaCollectionName <> ''); + + Field.ReadOnly := Field.ReadOnly or (Field.FBaseColumnName = ''); + + if FCommand.FConnection.FFldComputeModeIdx <> -1 then + Field.ReadOnly := Field.ReadOnly or (GetUINTValue(FCommand.FConnection.FFldComputeModeIdx) <> DBCOMPUTEMODE_NOTCOMPUTED); + + if (not FUniqueRecords) or (FCursorType in ServerCursorTypes) then // Hide implicitly requested columns + if (ProviderPrimaryVer >= 8) or IsWindowsVista then begin + FldGuidValue := LowerCase(GetStrValue(FCommand.FConnection.FFldGuidIdx)); + Field.Hidden := (FldGuidValue <> '') and (FldGuidValue <> '{' + LowerCase(IntToHex(FieldNo, 8))+'-0000-0000-0000-000000000000' + '}') + end + else + Field.Hidden := not ColumnsMetaInfo.GetNull(FCommand.FConnection.FFldGuidIdx + 1, RecBuf); + + // Fill TablesInfo structure + TableName := GenerateTableName(Field.BaseCatalogName, Field.BaseSchemaName, Field.BaseTableName, Database); + if TableName <> '' then begin + TableInfo := TablesInfo.FindByName(TableName); + TablesInfo.BeginUpdate; + try + if TableInfo = nil then begin + TableInfo := TablesInfo.Add; + TableInfo.TableName := TableName; + TableInfo.TableAlias := ''; + end; + finally + TablesInfo.EndUpdate; + end; + Field.TableInfo := TableInfo; + end + else + Field.TableInfo := nil; + + if FieldNo > 0 then + FFields.Add(Field) + else // Bookmark column have FieldNo = 0 + begin + Field.Hidden := True; + BookmarkField := Field; + FBookmarkOffset := - 1; + end; + + end + else + if FNativeRowset then + DatabaseErrorFmt(SBadFieldType, [FieldName, GetWordValue(FCommand.FConnection.FFldTypeIdx)]) + else + Field.Free; + except + Field.Free; + BookmarkField.Free; + raise; + end; + end; + + if BookmarkField <> nil then + FFields.Add(BookmarkField); + + if (Provider = prCompact) and (not FPopulatingKeyInfo) and (FUniqueRecords or not FReadOnly) then begin + if TablesInfo.Count > 0 then begin + TableInfo := TablesInfo[0]; + ColumnsRecordSet := TOLEDBRecordSet.Create; + FPopulatingKeyInfo := True; + try + ColumnsRecordSet.SetConnection(FCommand.FConnection); + ColumnsRecordSet.SetSQL(Format( + 'SELECT' + LineSeparator + + ' A.COLUMN_NAME, B.AUTOINC_INCREMENT' + LineSeparator + + 'FROM' + LineSeparator + + ' INFORMATION_SCHEMA.KEY_COLUMN_USAGE A, INFORMATION_SCHEMA.COLUMNS B' + LineSeparator + + 'WHERE' + LineSeparator + + ' A.TABLE_NAME = B.TABLE_NAME and A.COLUMN_NAME = B.COLUMN_NAME and A.TABLE_NAME = %s', [QuotedStr(TableInfo.TableName)])); + ColumnsRecordSet.Open; + if RecBuf <> nil then + ColumnsMetaInfo.FreeRecBuf(RecBuf); + ColumnsRecordSet.AllocRecBuf(RecBuf); + while True do begin + ColumnsRecordSet.GetNextRecord(RecBuf); + if ColumnsRecordSet.Eof then + Break; + if not ColumnsRecordSet.GetNull(ColumnsRecordSet.FieldByName('COLUMN_NAME').FieldNo, RecBuf) then begin + ColumnsRecordSet.GetFieldAsVariant(ColumnsRecordSet.FieldByName('COLUMN_NAME').FieldNo, RecBuf, Value); + Field := TOLEDBFieldDesc(FFields.FindField(String(Value))); + if Field <> nil then begin + Field.IsKey := True; + Field.FIsAutoIncrement := not ColumnsRecordSet.GetNull(ColumnsRecordSet.FieldByName('AUTOINC_INCREMENT').FieldNo, RecBuf); + if FNativeRowset and not (FCursorType in ServerCursorTypes) then + Field.ReadOnly := Field.FIsTimestamp or Field.IsAutoIncrement; + end; + end; + end; + finally + ColumnsRecordSet.FreeRecBuf(RecBuf); + RecBuf := nil; + ColumnsRecordSet.Close; + ColumnsRecordSet.Free; + FPopulatingKeyInfo := False; + end; + end; + end; + + finally + if RecBuf <> nil then + ColumnsMetaInfo.FreeRecBuf(RecBuf); + if ColumnsMetaInfo <> nil then begin + ColumnsMetaInfo.Close; + ColumnsMetaInfo.UnPrepare; + end; + if IsLibrary then + FreeAndNil(FCommand.FConnection.FColumnsMetaInfo); + end; + finally + {$IFDEF CLR} + if CMIRowset <> nil then + Marshal.ReleaseComObject(CMIRowset); + {$ENDIF} + end; + Assert(not (FCursorType in [ctStatic, ctKeySet]) or (FBookmarkOffset <> - 2)); + + TablesInfo.Normalize; + FillTablesAliases; + // For + // SELECT FieldName FieldAlias FROM TableName TableAlias + // must be + // Field.Name = 'FieldAlias' + // Field.ActualName = 'FieldAlias' + // Field.TableName = '' ??? + // Field.BaseColumnName = 'c_int' + // Field.BaseTableName = 'ALL_TYPES' + + end; + {$ENDIF} + + var + Connection: TOLEDBConnection; + + begin + if ByInfo then begin + if FNativeRowset or not FIsColumnsRowset then + CreateFieldDescsByInfo + else + begin + // Detect true connection + Connection := FCommand.FConnection; + + if Connection.FColumnsRowsetFieldDescs <> nil then + Connection.AssignFieldDescs(Connection.FColumnsRowsetFieldDescs, FFields) + else + begin + CreateFieldDescsByInfo; + Connection.FColumnsRowsetFieldDescs := TFieldDescs.Create; + try + try + Connection.AssignFieldDescs(FFields, Connection.FColumnsRowsetFieldDescs) // Save fields for columnsrowset + except + FreeAndNil(Connection.FColumnsRowsetFieldDescs); + raise; + end; + finally + if IsLibrary then + FreeAndNil(Connection.FColumnsRowsetFieldDescs); + end; + end; + end; + end + else + {$IFNDEF LITE} + CreateFieldDescsByRowset; + {$ELSE} + Assert(False); + {$ENDIF} + end; + +begin + inherited; // Empty proc call + + if not FNativeRowset then + CommandType := ctCursor; + + if CommandType = ctUnknown then begin // This is a FieldDefs.Update call + + QueryCommandInterfaces(False); + try + SetCommandProp; + FCommand.Execute; + finally + ReleaseCommandInterfaces; /// FCommand.QueryIntCnt counter is increased in inherited + end; + CreateFieldDescs(FCommand.FIUnknown, not FRequestSQLObjects); + + // Free interfaces + {$IFDEF CLR} + if FCommand.FIMultipleResults <> nil then + Marshal.ReleaseComObject(FCommand.FIMultipleResults); + if FCommand.FIUnknown <> nil then + Marshal.ReleaseComObject(FCommand.FIUnknown); + {$ENDIF} + FCommand.FIUnknown := nil; + FCommand.ClearIMultipleResults; + + // Free param accessors (must be after clearing interfaces) + RequestParamsIfPossible; + + // We does not need to process non-Native rowsets or ServerCursors + // QueryRecordSetInterfaces not required too + Exit; + end; + + if not FNativeRowset then + CreateFieldDescs(FIRowset, True) + else + begin + Assert(FIRowset = nil); + if Prepared and not FCommand.FRPCCall then + CreateFieldDescs(FCommand.FICommandPrepare, not FRequestSQLObjects) + else + CreateFieldDescs(FCommand.FIUnknown, not FRequestSQLObjects); + end; +end; + +procedure TOLEDBRecordSet.AllocFetchBlock; +var + UseIRowsetUpdate: boolean; + + function AddFieldToABList(const FieldNum: integer): integer; // Add new AB, if need. If AB already present then return its index + function AddAB(const BlockType: TAccessorBlockType): integer; + var + l: integer; + begin + l := Length(FFetchAccessorData.AccessorBlocks); + SetLength(FFetchAccessorData.AccessorBlocks, l + 1); + + FFetchAccessorData.AccessorBlocks[l].BlockType := BlockType; + FFetchAccessorData.AccessorBlocks[l].hAcc := 0; + FFetchAccessorData.AccessorBlocks[l].BlobFieldNum := -1; + + Result := l; + end; + + var + BlockType: TAccessorBlockType; + FieldDesc: TOLEDBFieldDesc; + i: integer; + IsLarge: boolean; + IsDBNumeric: boolean; + begin + Result := -1; + try + FieldDesc := Fields[FieldNum] as TOLEDBFieldDesc; + IsLarge := IsLargeDataTypeUsed(FieldDesc); + IsDBNumeric := (ProviderPrimaryVer = 3) and (FieldDesc.OLEDBType = DBTYPE_NUMERIC); + if IsNeedFetchBlock(FieldDesc, ProviderPrimaryVer) then + BlockType := abFetchBlock // This is a string by ref - long string conversion used + else + if FieldDesc.ReadOnly and UseIRowsetUpdate then + BlockType := abReadOnly + else + if IsLarge and UseIRowsetUpdate then + BlockType := abBLOB + else + BlockType := abOrdinary; + + if not (FCursorType in [ctKeySet, ctDynamic]) // CR 4082 + and (BlockType <> abBLOB) then + for i := 0 to Length(FFetchAccessorData.AccessorBlocks) - 1 do + if FFetchAccessorData.AccessorBlocks[i].BlockType = BlockType then begin + // Test BLOB fields + if IsLarge then begin + if FFetchAccessorData.AccessorBlocks[i].BlobFieldNum = - 1 then + FFetchAccessorData.AccessorBlocks[i].BlobFieldNum := FieldNum + else + begin + BlockType := abBLOB; + Result := AddAB(BlockType); + FFetchAccessorData.AccessorBlocks[Result].BlobFieldNum := FieldNum; + Exit; + end; + end; + // Test numeric fields in Everywhere + if IsDBNumeric then begin + Result := AddAB(BlockType); + Exit; + end; + + Result := i; + Exit; + end; + + // Accessor block not found! Create new + Result := AddAB(BlockType); + if IsLarge then + FFetchAccessorData.AccessorBlocks[Result].BlobFieldNum := FieldNum; + finally + Assert(Result <> - 1); + + i := Length(FFetchAccessorData.AccessorBlocks[Result].FieldNums); + SetLength(FFetchAccessorData.AccessorBlocks[Result].FieldNums, i + 1); + FFetchAccessorData.AccessorBlocks[Result].FieldNums[i] := FieldNum; + end; + + end; + + // Fill internal structures in accessor block + procedure FillBindingStructInAccBlock( + rgBindings: TDBBindingArray; + var AccessorBlock: TAccessorBlock); + var + Cnt, i, l: integer; + FieldNum: integer; + Field: TFieldDesc; + + Obj: OLEDBIntf.DBOBJECT; + begin + Cnt := Length(AccessorBlock.FieldNums); + Assert(Cnt > 0); + //OFS('+FillBindingStructInAccBlock'); + for i := 0 to Cnt - 1 do + with rgBindings[i] do begin + FieldNum := AccessorBlock.FieldNums[i]; + Field := FFields[FieldNum]; + iOrdinal := Field.FieldNo; + + obValue := Field.Offset; + obLength := 0; + obStatus := DataSize + FieldNum * OLE_DB_INDICATOR_SIZE; + + dwPart := DBPART_VALUE or DBPART_STATUS; + dwMemOwner := DBMEMOWNER_CLIENTOWNED; + eParamIO := DBPARAMIO_NOTPARAM; + cbMaxLen := Field.Size; + + if (FCursorType in [ctStatic, ctKeyset]) and (iOrdinal = 0) then + dwFlags := DBCOLUMNFLAGS_ISBOOKMARK + else + dwFlags := 0; + + wType := ConvertInternalTypeToOLEDB(Field.dataType, False, DBMSPrimaryVer); + if (DBMSPrimaryVer = 3) then begin + if (TOLEDBFieldDesc(Field).OLEDBType = DBTYPE_R4) then + wType := DBTYPE_R4; + if (TOLEDBFieldDesc(Field).OLEDBType = DBTYPE_UI1) then begin + wType := DBTYPE_UI1; + cbMaxLen := SizeOf(Word); + end; + if (TOLEDBFieldDesc(Field).OLEDBType = DBTYPE_NUMERIC) then begin + wType := DBTYPE_NUMERIC; + cbMaxLen := SizeOfTDBNumeric; + end; + end; + + if not IsLargeDataTypeUsed(Field) then begin //??? + case Field.DataType of + dtExtString, dtExtWideString: + begin + if Field.DataType = dtExtString then + l := 1 + else + if Field.DataType = dtExtWideString then + l := 2 + else + begin + l := 0; + Assert(False); + end; + + Assert(AccessorBlock.BlockType = abFetchBlock); + dwPart := DBPART_VALUE or DBPART_STATUS or DBPART_LENGTH; + cbMaxLen := MaxNonBlobFieldLen + l; + obStatus := FFetchBlockSize; + obLength := obStatus + OLE_DB_INDICATOR_SIZE; + obValue := obLength + 4; + IncFetchBlockOffset(FFetchBlockSize, Field.DataType); + end; + dtMemo, dtWideMemo, dtMSXML: // Long string conversion used + begin + Assert(AccessorBlock.BlockType = abFetchBlock); + if (Field.SubDataType and dtWide) = 0 then begin + wType := DBTYPE_STR; + l := 1; + end + else + begin + wType := DBTYPE_WSTR; + l := 2; + end; + cbMaxLen := MaxNonBlobFieldLen + l; + obStatus := FFetchBlockSize; + obValue := obStatus + OLE_DB_INDICATOR_SIZE; + IncFetchBlockOffset(FFetchBlockSize, dtMemo); + end; + dtVariant: + begin + Assert(AccessorBlock.BlockType = abFetchBlock); + wType := DBTYPE_VARIANT; + cbMaxLen := sizeof(OleVariant); + obStatus := FFetchBlockSize; + obValue := obStatus + OLE_DB_INDICATOR_SIZE; + IncFetchBlockOffset(FFetchBlockSize, dtVariant); + end; + dtBytes: + if not FReadOnly then begin + dwPart := DBPART_VALUE or DBPART_STATUS or DBPART_LENGTH; + obValue := Field.Offset; + obLength := obValue + Field.Length; + cbMaxLen := Field.Length; + end; + dtVarBytes: + begin + dwPart := DBPART_VALUE or DBPART_STATUS or DBPART_LENGTH; + obValue := Field.Offset + sizeof(word); + obLength := obValue + Field.Length; + cbMaxLen := Field.Length; + end; + dtExtVarBytes: + begin + Assert(AccessorBlock.BlockType = abFetchBlock); + + cbMaxLen := MaxNonBlobFieldLen; // WAR on changing must change FetchExternalAccessorBlock FetchExternalAccessorBlock + dwPart := DBPART_VALUE or DBPART_STATUS or DBPART_LENGTH; + obStatus := FFetchBlockSize; + obValue := obStatus + OLE_DB_INDICATOR_SIZE; + obLength := obValue + cbMaxLen; + IncFetchBlockOffset(FFetchBlockSize, Field.DataType); + end; + dtFloat, dtBcd: + if (DBMSPrimaryVer = 3) and (TOLEDBFieldDesc(Field).OLEDBType = DBTYPE_NUMERIC) then begin + Assert(AccessorBlock.BlockType = abFetchBlock); + wType := DBTYPE_NUMERIC; + cbMaxLen := SizeOfTDBNumeric; + obStatus := FFetchBlockSize; + obValue := obStatus + OLE_DB_INDICATOR_SIZE; + IncFetchBlockOffset(FFetchBlockSize, Field.DataType); + end; + end; + end + else + begin + Assert(Field.DataType in [dtMemo, dtWideMemo, dtBlob, dtMSXML], 'Non-compartible values of Field.DataType and IsStreamUsed'); + + Obj.iid := IID_ISequentialStream; + Obj.dwFlags := STGM_READ; + l := sizeof(DBOBJECT); + pObject := Marshal.AllocHGlobal(l); + {$IFDEF CLR} + Marshal.StructureToPtr(TObject(Obj), pObject, False); + {$ELSE} + DBOBJECT(pObject^) := Obj; + {$ENDIF} + + if not FReadOnly then begin + dwPart := DBPART_VALUE or DBPART_STATUS or DBPART_LENGTH; + obLength := obValue + sizeof(IntPtr); + end; + + end; + + if wType in [DBTYPE_NUMERIC, DBTYPE_VARNUMERIC] then begin + bPrecision := Field.Length; + bScale := Field.Scale; + end; + + {OFS('---'); + OFS('Field.Name = ' + Field.Name); + OFS('iOrdinal = ' + IntToStr(iOrdinal)); + OFS('obValue = ' + IntToStr(obValue)); + OFS('obLength = ' + IntToStr(obLength)); + OFS('obStatus = ' + IntToStr(obStatus)); + OFS('pTypeInfo = ' + IntToStr(Integer(pTypeInfo))); + //OFS('pObject = ' + IntToStr(Integer(pObject))); + OFS('pBindExt = ' + IntToStr(Integer(pBindExt))); + OFS('dwPart = ' + IntToStr(Integer(dwPart))); + //dwMemOwner: DBMEMOWNER; + //eParamIO: DBPARAMIO; + OFS('cbMaxLen = ' + IntToStr(cbMaxLen)); + OFS('dwFlags = ' + IntToStr(dwFlags)); + OFS('wType = ' + IntToStr(Integer(wType))); + OFS('bPrecision = ' + IntToStr(bPrecision)); + OFS('bScale = ' + IntToStr(bScale));} + end; + //OFS('-FillBindingStructInAccBlock'); + end; + +var + i, j: integer; + + rgStatus: PUINT; + rgBindings: TDBBindingArray; +{$IFDEF CLR} + rgBindingsGC: GCHandle; +{$ENDIF} + hr: HResult; + + FieldCntAB: integer; + +begin + rgStatus := nil; + + FFetchBlock := nil; + FFetchBlockSize := 0; + UseIRowsetUpdate := (FCursorType in [ctKeyset, ctDynamic]) and FCursorUpdate; + + QueryIntf(FIRowset, {$IFDEF CLR}IAccessor{$ELSE}IID_IAccessor{$ENDIF}, FFetchAccessorData.Accessor); + + // Separate fields to AccessorBlocks + for i := 0 to Fields.Count - 1 do + if Fields[i].FieldDescKind = fdkData then + AddFieldToABList(i); + + // CreateAccessors + for i := 0 to Length(FFetchAccessorData.AccessorBlocks) - 1 do begin + FieldCntAB := Length(FFetchAccessorData.AccessorBlocks[i].FieldNums); + try + rgStatus := Marshal.AllocHGlobal(FieldCntAB * SizeOf(UINT)); + SetLength(rgBindings, FieldCntAB); + + for j := 0 to FieldCntAB - 1 do + with rgBindings[j] do begin + {$IFDEF CLR} + if pTypeInfo <> nil then + Marshal.Release(pTypeInfo); + {$ELSE} + pTypeInfo := nil; + {$ENDIF} + pObject := nil; + pBindExt := nil; + end; + + FillBindingStructInAccBlock(rgBindings, FFetchAccessorData.AccessorBlocks[i]); + + // Create accessor + {$IFDEF CLR} + rgBindingsGC := GCHandle.Alloc(rgBindings, GCHandleType.Pinned); + try + hr := FFetchAccessorData.Accessor.CreateAccessor(DBACCESSOR_ROWDATA, FieldCntAB, Marshal.UnsafeAddrOfPinnedArrayElement(rgBindings, 0), 0, FFetchAccessorData.AccessorBlocks[i].hAcc, rgStatus); + finally + rgBindingsGC.Free; + end; + {$ELSE} + hr := FFetchAccessorData.Accessor.CreateAccessor(DBACCESSOR_ROWDATA, FieldCntAB, rgBindings, 0, FFetchAccessorData.AccessorBlocks[i].hAcc, rgStatus); + {$ENDIF} + Check(hr); + finally + if Length(rgBindings) <> 0 then begin + for j := 0 to FieldCntAB - 1 do + if rgBindings[j].pObject <> nil then + Marshal.FreeHGlobal(rgBindings[j].pObject); + SetLength(rgBindings, 0); + end; + if rgStatus <> nil then begin + Marshal.FreeHGlobal(rgStatus); + rgStatus := nil; + end; + end; + end; + + if FFetchBlockSize <> 0 then + FFetchBlock := Marshal.AllocHGlobal(FFetchBlockSize); +end; + +procedure TOLEDBRecordSet.FreeFetchBlock; +var + AccNum: integer; +begin + if FFetchAccessorData.Accessor = nil then + Exit; + + with FFetchAccessorData do begin + for AccNum := 0 to Length(AccessorBlocks) - 1 do + Check(Accessor.ReleaseAccessor(AccessorBlocks[AccNum].hAcc, nil)); + {$IFDEF CLR} + Marshal.ReleaseComObject(Accessor); + {$ENDIF} + Accessor := nil; + SetLength(AccessorBlocks, 0); + end; + + if FFetchBlock <> nil then + Marshal.FreeHGlobal(FFetchBlock); +end; + +function TOLEDBRecordSet.Fetch(FetchBack: boolean = False): boolean; +var + OldFetchFromBookmark: boolean; + + procedure GetDataFromRow(const Row: hRow; const pRec: IntPtr); + procedure PrepareConvertableFields; // After get data from OLEDB + var + i: integer; + pValue: IntPtr; + + OleDbBuf: IntPtr; + Field: TOLEDBFieldDesc; + + {$IFDEF VER6P} + {$IFOPT C+} + FieldStatus: DWORD; + {$ENDIF} + {$IFDEF CLR} + BcdOut: TBcd; + g: TGuid; + p: IntPtr; + j: integer; + BcdBuf: TBytes; + s: string; + DBNum: TDBNumeric; + Data: TBytes; + {$ELSE} + FieldLength, FieldScale: word; + {$IFDEF VER9} + Delta: word; + {$ENDIF} + {$ENDIF} + Bcd: TBcd; + {$ENDIF} + DBTimeStamp: TDBTimeStamp; + dt: TDateTime; + d: double; + CurrTimestamp: Int64; + begin + for i := 0 to Fields.Count - 1 do begin + Field := TOLEDBFieldDesc(Fields[i]); + if Field.FieldDescKind <> fdkData then + SetNull(i + 1, pRec, True) + else + begin + pValue := IntPtr(Integer(pRec) + Field.Offset); + + // Get max Timestamp value for RefreshQuick + if Field.IsTimestamp and (Field.TableInfo <> nil) then begin + {$IFDEF CLR} + SetLength(Data, SizeOf(Int64)); + Marshal.Copy(pValue, Data, 0, SizeOf(Int64)); + System.Array.Reverse(Data, 0, SizeOf(Int64)); + CurrTimestamp := BitConverter.ToInt64(Data, 0); + {$ELSE} + CurrTimestamp := Marshal.ReadInt64(pValue); + Reverse8(@CurrTimestamp); + {$ENDIF} + if {$IFDEF VER7P}UInt64{$ENDIF}(TOLEDBTableInfo(Field.TableInfo).FMaxTimestamp) < {$IFDEF VER7P}UInt64{$ENDIF}(CurrTimestamp) then + TOLEDBTableInfo(Field.TableInfo).FMaxTimestamp := CurrTimestamp; + end; + + OleDbBuf := nil; + try + case Field.DataType of + dtVarBytes: + Marshal.WriteInt16(pValue, SmallInt(UINT(Marshal.ReadInt32(pValue, sizeof(word) + Field.Length)))); + {$IFDEF VER6P} + dtFmtBCD: + if not GetNull(i + 1, pRec) then begin + {$IFOPT C+} + FieldStatus := GetStatus(i, pRec); + Assert(FieldStatus = DBSTATUS_S_OK, Field.Name + ': FieldStatus = $' + IntToHex(FieldStatus, 8){ + ', Value = ' + Marshal.PtrToStringAnsi(pValue)}); + {$ENDIF} + {$IFDEF CLR} + DBNum := TDBNumeric(Marshal.PtrToStructure(pValue, TypeOf(TDBNumeric))); + Bcd := DBNumericToBCD(DBNum); + NormalizeBcd(Bcd, BcdOut, Field.Length, Field.Scale); + + // Copied from TBcd.ToBytes + SetLength(BcdBuf, 34); + BcdBuf[0] := BcdOut.Precision; + BcdBuf[1] := BcdOut.SignSpecialPlaces; + for j := 0 to 31 do + BcdBuf[j + 2] := BcdOut.Fraction[j]; + Marshal.Copy(BcdBuf, 0, pValue, 34); + {$ELSE} + Bcd := DBNumericToBCD(TDBNumeric(pValue^)); + + FieldLength := Field.Length; + FieldScale := Field.Scale; + {$IFDEF VER9} // Delphi 9 NormalizeBcd Bug + Delta := FieldLength - FieldScale; + if Delta > 34 then begin + Delta := 34; + FieldLength := FieldScale + Delta; + end; + {$ENDIF} + NormalizeBcd(Bcd, PBcd(pValue)^, FieldLength, FieldScale); + {$ENDIF} + end; + {$ENDIF} + {$IFDEF VER5P} + dtGuid: + if not GetNull(i + 1, pRec) then + {$IFDEF CLR} + begin + g := TGUID(Marshal.PtrToStructure(pValue, TypeOf(TGUID))); + s := '{' + GUIDToString(g) + '}'; + p := Marshal.StringToHGlobalAnsi(s); + try + StrLCopy(pValue, p, 38); + finally + Marshal.FreeHGlobal(p); + end; + end; + {$ELSE} + StrLCopy(pValue, @GUIDToString(PGUID(pValue)^)[1], 38); + {$ENDIF} + {$ENDIF} + dtDateTime: + if (Provider = prCompact) and (not GetNull(i + 1, pRec)) then begin + {$IFDEF CLR} + DBTimeStamp := TDBTimeStamp(Marshal.PtrToStructure(pValue, TypeOf(TDBTimeStamp))); + {$ELSE} + DBTimeStamp := PDBTimeStamp(pValue)^; + {$ENDIF} + dt := {$IFNDEF CLR}MemUtils.{$ENDIF}EncodeDateTime(DBTimeStamp.year, DBTimeStamp.month, DBTimeStamp.day, DBTimeStamp.hour, DBTimeStamp.minute, DBTimeStamp.second, DBTimeStamp.fraction div 1000000{Billionths of a second to milliseconds}); + Marshal.WriteInt64(pValue, BitConverter.DoubleToInt64Bits(Double(dt))); + end; + dtCurrency: + if Provider = prCompact then begin + {$IFDEF CLR} + d := Marshal.ReadInt64(pValue); + d := d / 10000; + {$ELSE} + d := Currency(pValue^); + {$ENDIF} + Marshal.WriteInt64(pValue, BitConverter.DoubleToInt64Bits(d)); + end; + dtFloat: + if (not GetNull(i + 1, pRec)) and (Provider = prCompact) then begin + if (Field.SubDataType and dtSingle) <> 0 then begin + {$IFDEF CLR} + BcdBuf := BitConverter.GetBytes(Marshal.ReadInt64(pValue)); + d := BitConverter.ToSingle(BcdBuf, 0); + {$ELSE} + d := Single(pValue^); + {$ENDIF} + Marshal.WriteInt64(pValue, BitConverter.DoubleToInt64Bits(d)); + end + end; + dtWord: + if (not GetNull(i + 1, pRec)) and (Provider = prCompact) and ((Field.SubDataType and dtUInt8) <> 0) then + Marshal.WriteByte(IntPtr(Integer(pValue) + 1), 0); + end; + finally + if OleDbBuf <> nil then + FreeCoMem(OleDbBuf); + end; + end; + end; + end; + + procedure FetchPlainAccessorBlock(const AccessorBlock: TAccessorBlock); + var + hr: HResult; + Blob: TBlob; + Field: TFieldDesc; + pValue: IntPtr; + Length: integer; + + begin + // Get data from IRowset + hr := FIRowset.GetData(Row, AccessorBlock.hAcc, pRec); + CheckAndAnalyzeFieldsStatus(hr, pRec); + + // ConvertMemoToBlob; + if AccessorBlock.BlobFieldNum <> -1 then begin + Field := Fields[AccessorBlock.BlobFieldNum]; + pValue := IntPtr(Integer(pRec) + Field.Offset); + Length := Marshal.ReadInt32(pRec, Field.Offset + SizeOf(IntPtr)); + if FReadOnly then + Length := 0; + {$IFDEF HAVE_COMPRESS} + if Field.DataType = dtBlob then + Blob := TCompressedBlob.Create((Field.SubDataType and dtWide) <> 0) + else + {$ENDIF} + Blob := TBlob.Create((Field.SubDataType and dtWide) <> 0); + + try + if (GetStatus(AccessorBlock.BlobFieldNum, pRec) <> DBSTATUS_S_ISNULL) then // Can't use GetNull->GetNullByBlob + ConvertStreamToBlob(pValue, Length, Blob{$IFDEF HAVE_COMPRESS}, FCommand.FCompressBlob{$ENDIF}, + (Field is TOLEDBFieldDesc) and (TOLEDBFieldDesc(Field).OLEDBType = DBTYPE_XML)); + finally + Marshal.WriteInt32(pValue, Integer(Blob.GCHandle)); + end; + end; + end; + + var + FetchBlockOffset: integer; + + procedure FetchExternalAccessorBlock(const AccessorBlock: TAccessorBlock); + var + hr: HResult; + i, FieldNum: integer; + Status: DWORD; + Blob: TSharedObject; + pc: IntPtr; + pValue, pFetchBlockValue: IntPtr; + + Field: TFieldDesc; + l: integer; + + Size: word; + HeapBuf: IntPtr; + t: boolean; + DBNumeric: TDBNumeric; + d: double; + {$IFNDEF CLR} + c: currency; + {$ENDIF} + i64: Int64; + + begin + Assert(AccessorBlock.BlobFieldNum = - 1); + // Get data from IRowset + hr := FIRowset.GetData(Row, AccessorBlock.hAcc, FFetchBlock); + + // Copy status from external buf to pRec. Need to correct work CheckAndAnalyzeFieldsStatus + for i := 0 to Length(AccessorBlock.FieldNums) - 1 do begin + FieldNum := AccessorBlock.FieldNums[i]; + Field := Fields[FieldNum]; + if IsNeedFetchBlock(Field, ProviderPrimaryVer) and (Field.FieldDescKind = fdkData) then begin + Status := DWORD(Marshal.ReadInt32(FFetchBlock, FetchBlockOffset)); + SetStatus(FieldNum, pRec, Status); + + pFetchBlockValue := IntPtr(Integer(FFetchBlock) + FetchBlockOffset + OLE_DB_INDICATOR_SIZE); + pValue := IntPtr(Integer(pRec) + Field.Offset); + + case Field.DataType of + dtExtString, dtExtWideString: begin + if GetNull(FieldNum + 1, pRec) then + Marshal.WriteIntPtr(pValue, nil) + else + begin + if Field.Fixed then + t := TrimFixedChar + else + t := TrimVarChar; + l := Marshal.ReadInt32(pFetchBlockValue); + pFetchBlockValue := IntPtr(Integer(pFetchBlockValue) + 4); + if Field.DataType = dtExtString then + Marshal.WriteIntPtr(pValue, StringHeap.AllocStr(pFetchBlockValue, t, l)) + else + Marshal.WriteIntPtr(pValue, StringHeap.AllocWideStr(pFetchBlockValue, t, l div 2)); + end; + end; + dtExtVarBytes: + if GetNull(FieldNum + 1, pRec) then + Marshal.WriteIntPtr(pValue, nil) + else + begin + Size := UINT(Marshal.ReadInt32(pFetchBlockValue, MaxNonBlobFieldLen)); + HeapBuf := StringHeap.NewBuf(Size + sizeof(Word)); + CopyBuffer(pFetchBlockValue, IntPtr(Integer(HeapBuf) + sizeof(Word)), Size); + Marshal.WriteIntPtr(pValue, HeapBuf); + Marshal.WriteInt16(HeapBuf, SmallInt(Word(Size))); + end; + dtMemo, dtWideMemo, dtMSXML: begin + Blob := TBlob.Create((Field.SubDataType and dtWide) <> 0); + if Status <> DBSTATUS_S_ISNULL then begin + pc := pFetchBlockValue; + if TBlob(Blob).IsUnicode then + l := integer(StrLenW(pc)) * integer(sizeof(WideChar)) // D2005 CLR bug + else + l := StrLen(pc); + if l > 0 then begin + TBlob(Blob).Write(0, l, pc); + TBlobUtils.SetModified(TBlob(Blob), False); + end; + end; + Marshal.WriteInt32(pValue, Integer(Blob.GCHandle)); + end; + dtVariant: begin + Blob := TVariantObject.Create; + + TVariantObject(Blob).Value := GetOleVariant(pFetchBlockValue); + OleVarClear(pFetchBlockValue); + + Marshal.WriteInt32(pValue, Integer(Blob.GCHandle)); + end; + dtFloat, dtBcd: + if not GetNull(FieldNum + 1, pRec) then begin + {$IFDEF CLR} + DBNumeric := TDBNumeric(Marshal.PtrToStructure(pFetchBlockValue, TypeOf(TDBNumeric))); + {$ELSE} + DBNumeric := TDBNumeric(pFetchBlockValue^); + {$ENDIF} + d := DBNumericToDouble(DBNumeric); + if Field.DataType = dtFloat then + Marshal.WriteInt64(pValue, BitConverter.DoubleToInt64Bits(d)) + else begin + {$IFDEF CLR} + d := d * 10000; + i64 := Round(d); + {$ELSE} + c := d; + i64 := Int64((@c)^); + {$ENDIF} + Marshal.WriteInt64(pValue, i64); + end; + end; + else + Assert(False); + end; + IncFetchBlockOffset(FetchBlockOffset, Field.DataType); + Assert(FetchBlockOffset <= FFetchBlockSize); + + end; + end; + CheckAndAnalyzeFieldsStatus(hr, pRec); + end; + + var + AccNum: integer; + + begin + FetchBlockOffset := 0; + for AccNum := 0 to Length(FFetchAccessorData.AccessorBlocks) - 1 do + if FFetchAccessorData.AccessorBlocks[AccNum].BlockType = abFetchBlock then + FetchExternalAccessorBlock(FFetchAccessorData.AccessorBlocks[AccNum]) + else + FetchPlainAccessorBlock(FFetchAccessorData.AccessorBlocks[AccNum]); + + PrepareConvertableFields; + end; + + procedure CreateBlockStruct(const pHBlock: PBlockHeader; const RowsObtained: UINT); + var + pHItem: PItemHeader; + i: integer; + ui: UINT; + + begin + // Create Items + pHItem := IntPtr(Integer(pHBlock) + sizeof(TBlockHeader)); + if IntPtr(FirstItem) = nil then + FirstItem := pHItem; + + if IntPtr(LastItem) = nil then begin + LastItem := pHItem; + pHItem.Order := 0; + end; + + for i := 0 to RowsObtained - 1 do begin + pHItem.Prev := LastItem; + pHItem.Next := nil; + pHItem.Block := pHBlock; + pHItem.Flag := flUsed; + pHItem.Rollback := nil; + pHItem.Status := isUnmodified; + pHItem.UpdateResult := urNone; + pHItem.FilterResult := fsNotChecked; + + LastItem.Next := pHItem; + + if not (FCursorType in ServerCursorTypes) then + pHItem.Order := LastItem.Order + 1; + + LastItem := pHItem; + + UpdateCachedBuffer(pHItem, pHItem); + + pHItem := IntPtr(Integer(pHItem) + sizeof(TItemHeader) + RecordSize); + end; + + FirstItem.Prev := nil; + LastItem.Next := nil; + + case FCursorType of + ctDefaultResultSet: + if Filtered and not FFetchAll then + InitFetchedItems(IntPtr(Integer(pHBlock) + sizeof(TBlockHeader)), False, FetchBack) + else + Inc(FRecordCount, RowsObtained); + ctStatic, ctKeySet: + begin + if FBookmarkOffset = - 1 then + FBookmarkOffset := sizeof(TBlockHeader) + sizeof(TItemHeader) + Fields[Fields.Count - 1].Offset; + LastItem.Order := Marshal.ReadInt32(IntPtr(pHBlock), FBookmarkOffset); + FBookmarkValue := LastItem.Order; + end; + ctDynamic:; + end; + + // Free items + ui := UINT(FFetchRows) - RowsObtained; + if ui > 0 then + for i := 0 to ui - 1 do begin + pHItem.Prev := nil; + pHItem.Next := BlockMan.FirstFree; + pHItem.Block := pHBlock; + pHItem.Flag := flFree; + pHItem.Rollback := nil; + + if IntPtr(BlockMan.FirstFree) <> nil then + BlockMan.FirstFree.Prev := pHItem; + BlockMan.FirstFree := pHItem; + + pHItem := IntPtr(Integer(pHItem) + sizeof(TItemHeader) + RecordSize); + end; + + pHBlock.UsedItems := RowsObtained; + end; + + procedure InitBlock(pHBlock: PBlockHeader); + var + i, j: integer; + Ptr: IntPtr; + Field: TFieldDesc; + begin + if not HasComplexFields then + Exit; + + // Create complex filds + for i := 0 to FFetchRows - 1 do begin + Ptr := IntPtr(Integer(pHBlock) + sizeof(TBlockHeader) + i * (RecordSize + sizeof(TItemHeader)) + sizeof(TItemHeader)); + + /// We does not need to call CreateComplexFields(Ptr, True) because (in difference with ODAC) we fetch BLOB(IStream) IntPtrs directly to RecBuf + for j := 0 to FieldCount - 1 do begin + Field := Fields[j]; + if Field.FieldDescKind <> fdkCalculated then + case Field.DataType of + dtBlob, dtMemo, dtWideMemo, dtMSXML, dtVariant, dtExtString, dtExtWideString, dtExtVarBytes: + Marshal.WriteIntPtr(Ptr, Field.Offset, nil); + end; + end; + end; + end; + + procedure ClearBlock(pHBlock: PBlockHeader); + var + i: integer; + Free: PItemHeader; + begin + if IntPtr(pHBlock) = nil then + Exit; + + // Free complex filds + Free := IntPtr(Integer(pHBlock) + sizeof(TBlockHeader)); + for i := 1 to pHBlock.ItemCount do begin + if HasComplexFields and (Free.Flag <> flFree) then + FreeComplexFields(IntPtr(Integer(Free) + sizeof(TItemHeader)), True); + Free := IntPtr(Integer(Free) + sizeof(TItemHeader) + RecordSize); + end; + end; + + function GetRowsFromOLEDB(var RowsObtained: UINT; prghRows: PUintArray): HResult; + var + RowsOffset, RowsRequested: integer; + {$IFDEF CLR} + p: IntPtr; + {$ENDIF} + begin + // Backward fetch processing + if FetchBack then + RowsRequested := - FFetchRows + else + RowsRequested := FFetchRows; + + RowsOffset := 0; + + // Get data from OLEDB + if (FCursorType in [ctKeyset, ctStatic]) then begin + if not FFetchFromBookmark then + if FetchBack then + RowsOffset := - 1 + else + RowsOffset := + 1; + + Assert(FIRowsetLocate <> nil); + /// FIRowsetLocate.GetRowsAt does not change current IRowset fetch position + + {$IFDEF CLR} + p := Marshal.AllocHGlobal(SizeOf(Integer)); + try + Marshal.WriteInt32(p, FBookmarkValue); + Result := FIRowsetLocate.GetRowsAt(0, DB_NULL_HCHAPTER, FBookmarkSize, p, RowsOffset, RowsRequested, RowsObtained, prghRows); + finally + Marshal.FreeHGlobal(p); + end; + {$ELSE} + Result := FIRowsetLocate.GetRowsAt(0, DB_NULL_HCHAPTER, FBookmarkSize, @FBookmarkValue, RowsOffset, RowsRequested, RowsObtained, prghRows); + {$ENDIF} + end + else + begin + if (FCursorType = ctDynamic) then begin + if FLastFetchOK then begin + if FFetchFromBookmark then begin // Reread previous readed row + if FLastFetchBack = FetchBack then begin + if FetchBack then + RowsOffset := + 1 + else + RowsOffset := - 1; + end; + end + else + if FLastFetchBack <> FetchBack then + if FetchBack then + RowsOffset := - 1 + else + RowsOffset := + 1; + end + else + if FLastFetchBack = FetchBack then + if FetchBack then + RowsOffset := + 1 + else + RowsOffset := - 1; + end; + + Result := FIRowset.GetNextRows(DB_NULL_HCHAPTER, RowsOffset, RowsRequested, RowsObtained, prghRows); + end; + FLastFetchBack := FetchBack; + FFetchFromBookmark := False; // Clear flag, setted on InternalOpen + end; + + procedure ProcessNoResult; + begin + case FCursorType of + ctDefaultResultSet: + ReleaseAllInterfaces(False); // Process parameters + ctStatic: + begin + Assert(not FFetchFromBookmark, 'Cannot fetch to bookmark with Static cursor type'); + if not OldFetchFromBookmark {to prevent recursion on empty resultset} then + FetchToBookmarkValue; + end; + ctKeySet: + begin + if FCursorUpdate then + Assert(not FFetchFromBookmark, 'Cannot fetch to bookmark with KeySet cursor type'); +{ else + FBookmarkValue := - 1;} + end; + ctDynamic: + begin + CurrentItem := nil; // FHRow is not accessible and we need to refetch data from server + + if not FProcessDynBofEof then begin + try + FProcessDynBofEof := True; + if FetchBack then begin + FBof := True; + + // Server cursor position is under first row, FHRow is not accessible + // Need to call GetNextRows with params (RowsOffset = 1, RowsRequested = - 1) + FLastFetchOK := True; + if not FetchToBookmarkValue(True) then + FEof := True; + end + else + begin + FEof := True; + + // Server cursor position is below last row, FHRow is not accessible + // Need to call GetNextRows with params (RowsOffset = - 1, RowsRequested = 1) + FLastFetchOK := True; + if not FetchToBookmarkValue then + FBof := True; + end; + + if not FLastFetchOK then begin + FLastFetchOK := True; + FLastFetchBack := False; + end; + finally + FProcessDynBofEof := False; + end; + + if FBof or FEof then + CurrentItem := nil; + end; + end; + end; + end; + + procedure FirstFetch; + var + Field: TOLEDBFieldDesc; + i: integer; + begin + // This is a first call to Fetch. + // Query interfaces, create accessors etc + + Assert(FCommand.GetCursorState >= csExecuted); + if FCommand.GetCursorState = csExecuted then + FCommand.SetCursorState(csFetching); + + QueryRecordSetInterfaces; + AllocFetchBlock; + + if FCursorType in [ctStatic, ctKeySet] then begin + // Setting FRecordCount for ctStatic, ctKeySet + SetToEnd; + if IntPtr(LastItem) <> nil then begin + FRecordCount := LastItem.Order; + SetToBegin; + end; + FFetchFromBookmark := FCursorType in [ctKeyset, ctStatic]; /// First record reading without offsetting + end; + FBookmarkValue := DBBMK_FIRST; + FBookmarkSize := sizeof(FBookmarkValue); + + // Clear MaxTimestamp for RefreshQuick + for i := 0 to Fields.Count - 1 do begin + Field := TOLEDBFieldDesc(Fields[i]); + if Field.IsTimestamp and (Field.TableInfo <> nil) then + TOLEDBTableInfo(Field.TableInfo).FMaxTimestamp := 0; + end; + end; + +var + pHBlock: PBlockHeader; + NewBlock: boolean; + + hr: HResult; + RowsObtained: UINT; + rghRows: TUintArray; + prghRows: PUintArray; + GCHandle: IntPtr; + + i: integer; + pRec, pData: IntPtr; + + Cancel: boolean; + + IsThisFirstFetch: boolean; + InThread: boolean; +begin + Result := False; + Assert(FCommand <> nil); +{$IFDEF CLR} + InThread := FCommand.FNonBlocking and (FFetchExecutor <> nil) and (Thread.CurrentThread = FFetchExecutor.Thread.Handle); +{$ELSE} + InThread := FCommand.FNonBlocking and (FFetchExecutor <> nil) and (GetCurrentThreadId = FFetchExecutor.Thread.ThreadID); +{$ENDIF} + try + if Fields.Count = 0 then + DatabaseError(SNoResultSet, nil); /// Warning - constant SNoResultSet used for detecting in TCustomMSDataSet.OpenNext + + IsThisFirstFetch := + ((FCommand.FIUnknown <> nil) or not FNativeRowset) + and (Length(FFetchAccessorData.AccessorBlocks) = 0); + try + if IsThisFirstFetch then + FirstFetch; // This is a first call to Fetch. FIUnknown tested for prevent recreating accessors after fetching all strings + + DoBeforeFetch(Cancel); + + if Cancel or FWaitForFetchBreak then + Exit; + + if FIRowset = nil then + begin + Result := False; + Exit; + end; + + if (FCursorType = ctKeySet) and not FCursorUpdate and (FBookmarkValue = - 1) then + begin + Result := False; + Exit; + end; + + OldFetchFromBookmark := FFetchFromBookmark; + + // Clear previous obtained rows + ClearHRowIfNeed; + Assert(not FHRowAccessible); + + pHBlock := nil; + GCHandle := nil; + prghRows := nil; + RowsObtained := 0; + SetLength(rghRows, FFetchRows); + try + // Get next rows + GCHandle := AllocGCHandle(rghRows, True); + prghRows := GetAddrOfPinnedObject(GCHandle); + // prghRows := @rghRows[0]; + if FLastFetchEnd then + RowsObtained := 0 + else + begin + hr := GetRowsFromOLEDB(RowsObtained, prghRows); + FLastFetchEnd := FNativeRowset and (FCursorType = ctDefaultResultSet) and (hr = DB_S_ENDOFROWSET); // CR10007 + + // Process rows + if (hr <> DB_S_ENDOFROWSET) + and (hr <> DB_S_ROWLIMITEXCEEDED) + and not ((hr = DB_E_BADBOOKMARK) and (FBookmarkValue = DBBMK_FIRST)) + and not ((hr = DB_E_BADSTARTPOSITION) and (ProviderPrimaryVer = 7))then + Check(hr); + end; + if RowsObtained > 0 then begin + NewBlock := (IntPtr(BlockMan.FirstBlock) = nil) or (not FUniDirectional and not (FCursorType in ServerCursorTypes)); + if NewBlock then + BlockMan.AllocBlock(pHBlock, FFetchRows) + else begin + pHBlock := BlockMan.FirstBlock; + // Refresh block: drop values of blobs + ClearBlock(pHBlock); + end; + InitBlock(pHBlock); + pRec := IntPtr(Integer(pHBlock) + sizeof(TBlockHeader) + sizeof(TItemHeader)); + for i := 0 to RowsObtained - 1 do + begin + pData := IntPtr(Integer(pRec) + i * (RecordSize + sizeof(TItemHeader))); + GetDataFromRow(rghRows[i], pData); + end; + end; + finally + FreeGCHandle(GCHandle); + if RowsObtained > 0 then begin + // Release row handle(s) if need + if FCursorType in ServerCursorTypes then begin + Assert(RowsObtained = 1); + FHRow := rghRows[0]; + FHRowAccessible := True; + end + else + Check(FIRowset.ReleaseRows(RowsObtained, prghRows, nil, nil, nil)); + end; + + if Length(rghRows) <> 0 then + SetLength(rghRows, 0); + end; + Result := RowsObtained > 0; + FLastFetchOK := Result; + + if IntPtr(pHBlock) <> nil then begin + if Result then + CreateBlockStruct(pHBlock, RowsObtained) + else + BlockMan.FreeBlock(pHBlock); + end; + + if FNativeRowset and not Result then + ProcessNoResult; + + Assert(not (FCursorType in [ctDynamic]{ServerCursorTypes}) or FProcessDynBofEof or (FHRowAccessible or (FBOF and FEOF)), 'Row must be accessible after Fetch for non-empty dataset with server cursor'); + except + on e: exception do begin + if FetchBack then + FBOF := True + else + FEOF := True; + + ClearBlock(pHBlock); + FreeFetchBlock; + ReleaseRecordSetInterfaces; + + raise; + end; + end; + finally + if Assigned(FOnAfterFetch) then + if InThread and FAfterFetch then + FFetchExecutor.Thread.SendEvent(TObject(FE_AFTERFETCH)) + else + DoAfterFetch; + end; +end; + +function TOLEDBRecordSet.GetProp(Prop: integer; var Value: variant): boolean; +begin + Result := True; + case Prop of + prReadOnly: + Value := FReadOnly; + prEnableBCD: + Value := FEnableBCD; + {$IFDEF VER6P} + prEnableFMTBCD: + Value := FEnableFMTBCD; + {$ENDIF} + prUniqueRecords: + Value := FUniqueRecords; + prCursorType: + Value := Integer(TMSCursorType(FCursorType)); + prCursorUpdate: + Value := FCursorUpdate; + prLockClearMultipleResults: + Value := FLockClearMultipleResults; + prIsSProc: + FCommand.GetProp(prIsSProc, Value); + prNonBlocking: + FCommand.GetProp(prNonBlocking, Value); +{ prBeforeFetch: + Value := FBeforeFetch; + prAfterFetch: + Value := FAfterFetch;} + else + Result := inherited GetProp(Prop, Value); + end; +end; + +function TOLEDBRecordSet.SetProp(Prop: integer; const Value: variant): boolean; +begin + Result := True; + case Prop of + prReadOnly: + FReadOnly := Value; + prCommandTimeout: + begin + Assert(FCommand <> nil); + FCommand.FCommandTimeout := Value; + end; + prEnableBCD: + FEnableBCD := Value; + {$IFDEF VER6P} + prEnableFMTBCD: + FEnableFMTBCD := Value; + {$ENDIF} + prUniqueRecords: + FUniqueRecords := Value; + prCursorType: + begin + FCursorType := TMSCursorType(Integer(Value)); + if FCursorType in ServerCursorTypes then + FFetchAll := False; + end; + prRequestSQLObjects: + FRequestSQLObjects := Value; + prCursorUpdate: + FCursorUpdate := Value; + prLockClearMultipleResults: + FLockClearMultipleResults := Value; + prRoAfterUpdate: + FroAfterUpdate := Value; + prWideStrings: + FWideStrings := Value; + prIsSProc: + FCommand.SetProp(prIsSProc, Value); + prSmartRefresh: + FCommand.SetProp(prSmartRefresh, Value); + prSmartRefreshMsg: + FCommand.SetProp(prSmartRefreshMsg, Value); + prSmartRefreshService: + FCommand.SetProp(prSmartRefreshService, Value); + prNonBlocking: + FCommand.SetProp(prNonBlocking, Value); +{ prBeforeFetch: + FBeforeFetch := Boolean(Value); + prAfterFetch: + FAfterFetch := Boolean(Value);} + else + Result := inherited SetProp(Prop, Value); + end; +end; + +{ TOLEDBProperties } + +{ TOLEDBPropertiesSet } + +const + MaxPropCount = 20; + +constructor TOLEDBPropertiesSet.Create(Connection: TOLEDBConnection; const GuidPropertySet: TGUID); +begin + inherited Create; + + FConnection := Connection; + + FInitPropSet := Marshal.AllocHGlobal(SizeOf(DBPROPSET)); + FInitPropSet.cProperties := 0; + FInitPropSet.guidPropertySet := GuidPropertySet; + FInitPropSet.rgProperties := nil; + + FInitPropSet.rgProperties := Marshal.AllocHGlobal(MaxPropCount * SizeOfDBProp); + FillChar(FInitPropSet.rgProperties, MaxPropCount * SizeOfDBProp, 0); + +end; + +destructor TOLEDBPropertiesSet.Destroy; +var + i: integer; + rgProperty: PDBProp; +begin + if IntPtr(FInitPropSet) <> nil then begin + if FInitPropSet.rgProperties <> nil then begin + for i := 0 to Integer(FInitPropSet.cProperties) - 1 do begin + rgProperty := GetDBPropPtr(i); + rgProperty.vValue := Unassigned; + end; + + Marshal.FreeHGlobal(FInitPropSet.rgProperties); + end; + + Marshal.FreeHGlobal(FInitPropSet); + end; + + inherited; +end; + +procedure TOLEDBPropertiesSet.Check(const Status: HRESULT); +begin + try + FConnection.Check(Status, nil); + except + on E: Exception do begin + AddInfoToErr(E, GetInitPropSetStatus, []); + raise E; + end; + end; +end; + +function TOLEDBPropertiesSet.GetInitPropSetStatus: string; +var + i: integer; + p: PDBProp; +begin + Result := GUIDToString(FInitPropSet.guidPropertySet); + + for i := 0 to FInitPropSet.cProperties - 1 do begin + p := GetDBPropPtr(i); + if p.dwStatus <> 0 then + Result := Format('%s'#$D#$A'[%d] := $%X. PropId := %d', [Result, i, p.dwStatus, p.dwPropertyID]); + end; + +end; + +function TOLEDBPropertiesSet.GetDBPropPtr(Index: UINT): PDBProp; +begin + Assert(Index <= FInitPropSet.cProperties); + Result := IntPtr(Integer(FInitPropSet.rgProperties) + Integer(Index * SizeOfDBProp)); +end; + +function TOLEDBPropertiesSet.InitProp(const dwPropertyID: DBPROPID; const Required: boolean = False): PDBProp; +begin + Assert(FInitPropSet.cProperties <= MaxPropCount); + + Result := GetDBPropPtr(FInitPropSet.cProperties); + Result.dwPropertyID := dwPropertyID; + if Required then + Result.dwOptions := DBPROPOPTIONS_REQUIRED + else + Result.dwOptions := DBPROPOPTIONS_OPTIONAL; + Result.colid := DB_NULLID; +end; + + +procedure TOLEDBPropertiesSet.AddPropSmallInt(const dwPropertyID: DBPROPID; const Value: Smallint); +var + p: PDBProp; +begin + p := InitProp(dwPropertyID); + + p.vValue := VarAsType(Value, VT_I2); + FInitPropSet.cProperties := FInitPropSet.cProperties + 1; +end; + +procedure TOLEDBPropertiesSet.AddPropInt(const dwPropertyID: DBPROPID; const Value: Integer); +var + p: PDBProp; +begin + p := InitProp(dwPropertyID, True); + + p.vValue := VarAsType(Value, VT_I4); + FInitPropSet.cProperties := FInitPropSet.cProperties + 1; +end; + +procedure TOLEDBPropertiesSet.AddPropBool(const dwPropertyID: DBPROPID; const Value: boolean; const Required: boolean = False); +var + p: PDBProp; +begin + p := InitProp(dwPropertyID, Required); + + p.vValue := VarAsType(Value, VT_BOOL); + + FInitPropSet.cProperties := FInitPropSet.cProperties + 1; +end; + +procedure TOLEDBPropertiesSet.AddPropStr(const dwPropertyID: DBPROPID; const Value: string; const Required: boolean = False); +var + p: PDBProp; +begin + p := InitProp(dwPropertyID, Required); + p.vValue := Value; + + FInitPropSet.cProperties := FInitPropSet.cProperties + 1; +end; + +procedure TOLEDBPropertiesSet.SetProperties(Obj: IDBProperties); +begin + Assert(Obj <> nil); + Check(Obj.SetProperties(1, PDBPropSetArray(FInitPropSet))); +end; + +procedure TOLEDBPropertiesSet.SetProperties(Obj: ISessionProperties); +begin + Assert(Obj <> nil); + Check(Obj.SetProperties(1, PDBPropSetArray(FInitPropSet))); +end; + +procedure TOLEDBPropertiesSet.SetProperties(Obj: ICommandProperties); +begin + Assert(Obj <> nil); + Check(Obj.SetProperties(1, PDBPropSetArray(FInitPropSet))); +end; + +{ TOLEDBPropertiesGet } + +constructor TOLEDBPropertiesGet.Create(Connection: TOLEDBConnection; const GuidPropertySet: TGUID); +begin + inherited Create; + + FConnection := Connection; + + FInitPropSet := Marshal.AllocHGlobal(SizeOf(DBPROPSET)); + FInitPropSet.cProperties := 0; + FInitPropSet.rgProperties := nil; + FInitPropSet.guidPropertySet := GuidPropertySet; +end; + +destructor TOLEDBPropertiesGet.Destroy; +begin + Marshal.FreeHGlobal(FInitPropSet); + inherited; +end; + +procedure TOLEDBPropertiesGet.AddPropId(Id: DBPROPID); +begin + Assert(FPropIdsGC = nil); + SetLength(FPropIds, Length(FPropIds) + 1); + FPropIds[Length(FPropIds) - 1] := Id; +end; + +procedure TOLEDBPropertiesGet.Check(const Status: HRESULT); +begin + FConnection.Check(Status, nil); +end; + +function TOLEDBPropertiesGet.GetDBPropPtr(rgProperties: PDBPropArray; Index: UINT): PDBProp; +begin + Assert(Index <= FInitPropSet.cProperties); + Result := IntPtr(Integer(rgProperties) + Integer(Index * SizeOfDBProp)); +end; + +procedure TOLEDBPropertiesGet.PrepareToGet; +begin + FPropIdsGC := AllocGCHandle(FPropIds, True); + FInitPropSet.rgProperties := GetAddrOfPinnedObject(FPropIdsGC); + FInitPropSet.cProperties := Length(FPropIds); +end; + +procedure TOLEDBPropertiesGet.ProcessResult(rgPropertySets: PDBPropSet; var PropValues: TPropValues); +var + i: integer; +begin + SetLength(PropValues, FInitPropSet.cProperties); + for i := 0 to FInitPropSet.cProperties - 1 do + PropValues[i] := GetDBPropPtr(rgPropertySets.rgProperties, i).vValue; +end; + +procedure TOLEDBPropertiesGet.ClearResult(rgPropertySets: PDBPropSet); +var + i: integer; +begin + FreeGCHandle(FPropIdsGC); + FPropIdsGC := nil; + FInitPropSet.rgProperties := nil; + + for i := 0 to FInitPropSet.cProperties - 1 do + GetDBPropPtr(rgPropertySets.rgProperties, i).vValue := Unassigned; + + FreeCoMem(rgPropertySets.rgProperties); + FreeCoMem(rgPropertySets); + //FConnection.Malloc.Free(rgPropertySets.rgProperties); + //FConnection.Malloc.Free(rgPropertySets); +end; + +procedure TOLEDBPropertiesGet.GetProperties(Obj: IDBProperties; var PropValues: TPropValues); +var + cPropertySets: UINT; + rgPropertySets: PDBPropSet; +begin + Assert(Obj <> nil); + PrepareToGet; + try + Check(Obj.GetProperties(1, PDBPropIDSetArray(FInitPropSet), cPropertySets, rgPropertySets)); + ProcessResult(rgPropertySets, PropValues); + finally + ClearResult(rgPropertySets); + end; +end; + +procedure TOLEDBPropertiesGet.GetProperties(Obj: IRowsetInfo; var PropValues: TPropValues); +var + cPropertySets: UINT; + rgPropertySets: PDBPropSet; +begin + Assert(Obj <> nil); + PrepareToGet; + try + Check(Obj.GetProperties(1, PDBPropIDSetArray(FInitPropSet), cPropertySets, rgPropertySets)); + ProcessResult(rgPropertySets, PropValues); + finally + ClearResult(rgPropertySets); + end; +end; + +procedure TOLEDBPropertiesGet.GetProperties(Obj: ICommandProperties; var PropValues: TPropValues); +var + cPropertySets: UINT; + rgPropertySets: PDBPropSet; +begin + Assert(Obj <> nil); + PrepareToGet; + try + Check(Obj.GetProperties(1, PDBPropIDSetArray(FInitPropSet), cPropertySets, rgPropertySets)); + ProcessResult(rgPropertySets, PropValues); + finally + ClearResult(rgPropertySets); + end; +end; + +{ TOLEDBErrors } + +constructor TOLEDBErrors.Create; +begin + inherited; + FList := TList.Create; +end; + +destructor TOLEDBErrors.Destroy; +begin + Clear; + FList.Free; + inherited; +end; + +procedure TOLEDBErrors.Clear; +var + i: integer; +begin + for i := 0 to FList.Count - 1 do + TObject(FList[i]).Free; + FList.Clear; +end; + +function TOLEDBErrors.GetCount: integer; +begin + Result := FList.Count; +end; + +function TOLEDBErrors.GetError(Index: Integer): EOLEDBError; +begin + Result := EOLEDBError(FList[Index]); +end; + +procedure TOLEDBErrors.Assign(Source: TOLEDBErrors); +var + i: integer; + SrcErr, DstErr: EOLEDBError; +begin + Clear; + for i := 0 to Source.Count - 1 do begin + SrcErr := Source.Errors[i]; + DstErr := nil; + if SrcErr is EMSError then + DstErr := EMSError.Create(SrcErr.ErrorCode, SrcErr.Message) + else + if SrcErr is EOLEDBError then + DstErr := EOLEDBError.Create(SrcErr.ErrorCode, SrcErr.Message) + else + Assert(False); + + DstErr.Assign(SrcErr); + FList.Add(DstErr); + end; +end; + +{ EOLEDBError } + +constructor EOLEDBError.Create(ErrorCode: integer; Msg: WideString); +begin +{$IFDEF LITE} + inherited Create(Msg); + + FErrorCode := ErrorCode; + Message := Msg; +{$ELSE} + inherited Create(ErrorCode, Msg); +{$ENDIF} + FMessageWide := Msg; + + FErrors := TOLEDBErrors.Create; +end; + +destructor EOLEDBError.Destroy; +begin + FErrors.Free; + + inherited; +end; + +function EOLEDBError.GetErrorCount: integer; +begin + Result := FErrors.Count; +end; + +function EOLEDBError.GetError(Index: Integer): EOLEDBError; +begin + Result := FErrors[Index]; +end; + +procedure EOLEDBError.Assign(Source: EOLEDBError); +begin + FOLEDBErrorCode := Source.FOLEDBErrorCode; + Fiid := Source.Fiid; +{$IFNDEF LITE} + Component := Source.Component; +{$ENDIF} + FErrors.Assign(Source.FErrors); +end; + +{ EMSError } + +constructor EMSError.Create(const pServerErrorInfo: SSERRORINFO; OLEDBErrorCode: integer; Msg: WideString); +begin + inherited Create(pServerErrorInfo.lNative, Msg); +{$IFDEF LITE} + FErrorCode := pServerErrorInfo.lNative; +{$ENDIF} + + FMSSQLErrorCode := pServerErrorInfo.lNative; + FServerName := pServerErrorInfo.pwszServer; + FProcName := pServerErrorInfo.pwszProcedure; + FState := pServerErrorInfo.bState; + FSeverityClass := pServerErrorInfo.bClass; + FLineNumber := pServerErrorInfo.wLineNumber; + FLastMessage := pServerErrorInfo.pwszMessage; +end; + +procedure EMSError.Assign(Source: EOLEDBError); +var + Src: EMSError; +begin + inherited; + + if Source is EMSError then begin + Src := EMSError(Source); + FMSSQLErrorCode := Src.FMSSQLErrorCode; + + FServerName := Src.ServerName; + FProcName := Src.ProcName; + FState := Src.State; + FSeverityClass := Src.SeverityClass; + FLineNumber := Src.LineNumber; + FLastMessage := Src.LastMessage; + end; +end; + +var + DataSourceTypes: TBytes; +{$IFDEF CLR} + DataSourceTypesGC: GCHandle; +{$ENDIF} + +procedure InitDataSourceTypes; +var + pDataSourceTypes: IntPtr; + byteIndex: integer; + + function AddType(const TypeName: WideString): IntPtr; + var + Cnt: integer; + begin + Result := IntPtr(Integer(pDataSourceTypes) + byteIndex); + Cnt := Encoding.Unicode.{$IFNDEF VER5}GetBytes{$ELSE}GetBytesWide{$ENDIF}(TypeName, 0, Length(TypeName), DataSourceTypes, byteIndex); + DataSourceTypes[byteIndex + Cnt] := 0; + DataSourceTypes[byteIndex + Cnt + 1] := 0; + byteIndex := byteIndex + Cnt + 2; + Assert(byteIndex + Cnt < Length(DataSourceTypes)); + end; + +begin + //SetLength(DataSourceTypes, 300); + SetLength(DataSourceTypes, 350); +{$IFDEF CLR} + DataSourceTypesGC := GCHandle.Alloc(DataSourceTypes, GCHandleType.Pinned); + pDataSourceTypes := Marshal.UnsafeAddrOfPinnedArrayElement(DataSourceTypes, 0); +{$ELSE} + pDataSourceTypes := @DataSourceTypes[0]; +{$ENDIF} + byteIndex := 0; + + dstSmallint := AddType('smallint'); + dstInt := AddType('int'); + dstReal := AddType('real'); + dstFloat := AddType('float'); + dstMoney := AddType('money'); + dstDateTime := AddType('datetime'); + dstNVarChar := AddType('nvarchar'); + dstNVarCharMax := AddType('nvarchar(max)'); + dstVarChar := AddType('varchar'); + dstVarCharMax := AddType('varchar(max)'); + dstBit := AddType('bit'); + dstTinyInt := AddType('tinyint'); + dstBigint := AddType('bigint'); + dstSql_variant := AddType('sql_variant'); + dstImage := AddType('image'); + dstBinary := AddType('binary'); + dstVarBinary := AddType('varbinary'); + dstGuid := AddType('uniqueidentifier'); +end; + +procedure FinalizeDataSourceTypes; +begin +{$IFDEF CLR} + if IntPtr(DataSourceTypesGC) <> nil then + DataSourceTypesGC.Free; +{$ENDIF} +end; + +var + OSVersionInfo: TOSVersionInfo; + +initialization + __UseRPCCallStyle := True; + InitDataSourceTypes; + ParamsInfoOldBehavior := False; // delete 03.06.2006 + // Windows Vista detecting + OSVersionInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); + Windows.GetVersionEx(OSVersionInfo); + IsWindowsVista := OSVersionInfo.dwMajorVersion = 6; + + +finalization +{$IFDEF DEBUG} if StreamCnt <> 0 then MessageBox(0, PChar(IntToStr(StreamCnt) + ' Stream(s) hasn''t been released'), 'DA warning', MB_OK); {$ENDIF} + FinalizeDataSourceTypes; +{$IFNDEF CLR} + GlobaIMalloc := nil; +{$ENDIF} +end. diff --git a/internal/4.10.0.10/1/Source/OLEDBC.pas b/internal/4.10.0.10/1/Source/OLEDBC.pas new file mode 100644 index 0000000..e898db5 --- /dev/null +++ b/internal/4.10.0.10/1/Source/OLEDBC.pas @@ -0,0 +1,5448 @@ + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit OLEDBC; +{$ENDIF} + + +interface + +uses +{$IFDEF CLR} + System.Runtime.InteropServices, MemUtils, Variants, +{$ELSE} + CLRClasses, +{$ENDIF} + ActiveX, Windows, SysUtils; + +{$HPPEMIT '#include '} +{$HPPEMIT '#include '} + +{$IFNDEF VER6P} +{$IFNDEF VER125} +{$HPPEMIT '#include '} +{$ENDIF} + +{$HPPEMIT 'typedef System::DelphiInterface _di_ITransaction;'} +{$ENDIF} + + +// *********************************************************************// +// GUID declarations // +// *********************************************************************// +const + CLSID_SQLOLEDB_ENUMERATOR: TGUID = '{dfa22b8e-e68d-11d0-97e4-00c04fc2ad98}'; + CLSID_OLEDB_ENUMERATOR: TGUID = '{C8B522D0-5CF3-11CE-ADE5-00AA0044773D}'; {MSDAENUM} + CLSID_EXTENDEDERRORINFO: TGUID = '{C8B522CF-5CF3-11CE-ADE5-00AA0044773D}'; {MSDAERR} + CLSID_MSDAVTM: TGUID = '{0C733A8E-2A1C-11CE-ADE5-00AA0044773D}'; {MSDAVTM} + CLSID_OLEDB_CONVERSIONLIBRARY: TGUID = '{C8B522D1-5CF3-11CE-ADE5-00AA0044773D}'; {MSDADC} + CLSID_OLEDB_ROWPOSITIONLIBRARY: TGUID = '{2048EEE6-7FA2-11D0-9E6A-00A0C9138C29}'; {RowPosition.RowPosition} + CLSID_DATALINKS: TGUID = '{2206CDB2-19C1-11D1-89E0-00C04FD7A829}'; {DataLinks} + +{$IFNDEF VER6P} + {$NODEFINE IID_ITransaction} +{$ENDIF} + + IID_ITransaction: TGUID = '{0FB15084-AF41-11CE-BD2B-204C4F4F5020}'; + IID_ITransactionOptions: TGUID = '{3A6AD9E0-23B9-11CF-AD60-00AA00A74CCD}'; + IID_ITransactionDispenser: TGUID = '{3A6AD9E1-23B9-11CF-AD60-00AA00A74CCD}'; + IID_ITransactionOutcomeEvents: TGUID = '{3A6AD9E2-23B9-11CF-AD60-00AA00A74CCD}'; + IID_IAccessor: TGUID = '{0C733A8C-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowset: TGUID = '{0C733A7C-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetInfo: TGUID = '{0C733A55-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetLocate: TGUID = '{0C733A7D-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetResynch: TGUID = '{0C733A84-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetScroll: TGUID = '{0C733A7E-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetChange: TGUID = '{0C733A05-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetUpdate: TGUID = '{0C733A6D-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetIndex: TGUID = '{0C733A82-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IMultipleResults: TGUID = '{0C733A90-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IConvertType: TGUID = '{0C733A88-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ICommandPrepare: TGUID = '{0C733A26-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ICommandProperties: TGUID = '{0C733A79-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ICommand: TGUID = '{0C733A63-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ICommandWithParameters: TGUID = '{0C733A64-2A1C-11CE-ADE5-00AA0044773D}'; + + IID_ICommandText: TGUID = '{0C733A27-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IColumnsRowset: TGUID = '{0C733A10-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IColumnsInfo: TGUID = '{0C733A11-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IDBCreateCommand: TGUID = '{0C733A1D-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IDBCreateSession: TGUID = '{0C733A5D-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ISourcesRowset: TGUID = '{0C733A1E-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IDBProperties: TGUID = '{0C733A8A-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IDBInitialize: TGUID = '{0C733A8B-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IDBInfo: TGUID = '{0C733A89-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IDBDataSourceAdmin: TGUID = '{0C733A7A-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ISessionProperties: TGUID = '{0C733A85-2A1C-11CE-ADE5-00AA0044773d}'; + IID_IIndexDefinition: TGUID = '{0C733A68-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ITableDefinition: TGUID = '{0C733A86-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IOpenRowset: TGUID = '{0C733A69-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetFastLoad: TGUID = '{5CF4CA13-EF21-11d0-97E7-00C04FC2AD98}'; + IID_IErrorLookup: TGUID = '{0C733A66-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ISQLErrorInfo: TGUID = '{0C733A74-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IGetDataSource: TGUID = '{0C733A75-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ITransactionLocal: TGUID = '{0C733A5F-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ITransactionJoin: TGUID = '{0C733A5E-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ITransactionObject: TGUID = '{0C733A60-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IDBAsynchStatus: TGUID = '{0C733A95-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ISSAsynchStatus: TGUID = '{1FF1F743-8BB0-4c00-ACC4-C10E43B08FC1}'; + IID_IRowsetFind: TGUID = '{0C733A9D-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowPosition: TGUID = '{0C733A94-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowPositionChange: TGUID = '{0997A571-126E-11D0-9F8A-00A0C9A0631E}'; + IID_IViewRowset: TGUID = '{0C733A97-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IViewChapter: TGUID = '{0C733A98-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IViewSort: TGUID = '{0C733A9A-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IViewFilter: TGUID = '{0C733A9B-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetView: TGUID = '{0C733A99-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IMDFind: TGUID = '{A07CCCD2-8148-11D0-87BB-00C04FC33942}'; + IID_IMDRangeRowset: TGUID = '{0C733AA0-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IAlterTable: TGUID = '{0C733AA5-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IAlterIndex: TGUID = '{0C733AA6-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ICommandPersist: TGUID = '{0C733AA7-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetChapterMember: TGUID = '{0C733AA8-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IRowsetRefresh: TGUID = '{0C733AA9-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IParentRowset: TGUID = '{0C733AAA-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ITrusteeGroupAdmin: TGUID = '{0C733AA2-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IObjectAccessControl: TGUID = '{0C733AA3-2A1C-11CE-ADE5-00AA0044773D}'; + IID_ISecurityInfo: TGUID = '{0C733AA4-2A1C-11CE-ADE5-00AA0044773D}'; + IID_IDBPromptInitialize: TGUID = '{2206CCB0-19C1-11D1-89E0-00C04FD7A829}'; + IID_IDataInitialize: TGUID = '{2206CCB1-19C1-11D1-89E0-00C04FD7A829}'; + + DBSCHEMA_TABLES_INFO: TGUID = '{C8B522E0-5CF3-11CE-ADE5-00AA0044773D}'; + MDGUID_MDX: TGUID = '{A07CCCD0-8148-11D0-87BB-00C04FC33942}'; + DBGUID_MDX: TGUID = '{A07CCCD0-8148-11D0-87BB-00C04FC33942}'; + MDSCHEMA_CUBES: TGUID = '{C8B522D8-5CF3-11CE-ADE5-00AA0044773D}'; + MDSCHEMA_DIMENSIONS: TGUID = '{C8B522D9-5CF3-11CE-ADE5-00AA0044773D}'; + MDSCHEMA_HIERARCHIES: TGUID = '{C8B522DA-5CF3-11CE-ADE5-00AA0044773D}'; + MDSCHEMA_LEVELS: TGUID = '{C8B522DB-5CF3-11CE-ADE5-00AA0044773D}'; + MDSCHEMA_MEASURES: TGUID = '{C8B522DC-5CF3-11CE-ADE5-00AA0044773D}'; + MDSCHEMA_PROPERTIES: TGUID = '{C8B522DD-5CF3-11CE-ADE5-00AA0044773D}'; + MDSCHEMA_MEMBERS: TGUID = '{C8B522DE-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_TRUSTEE: TGUID = '{C8B522E1-5CF3-11CE-ADE5-00AA0044773D}'; + + DBOBJECT_TABLE: TGUID = '{C8B522E2-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_COLUMN: TGUID = '{C8B522E4-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_DATABASE: TGUID = '{C8B522E5-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_PROCEDURE: TGUID = '{C8B522E6-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_VIEW: TGUID = '{C8B522E7-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_SCHEMA: TGUID = '{C8B522E8-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_DOMAIN: TGUID = '{C8B522E9-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_COLLATION: TGUID = '{C8B522EA-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_TRUSTEE: TGUID = '{C8B522EB-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_SCHEMAROWSET: TGUID = '{C8B522EC-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_CHARACTERSET: TGUID = '{C8B522ED-5CF3-11CE-ADE5-00AA0044773D}'; + DBOBJECT_TRANSLATION: TGUID = '{C8B522EE-5CF3-11CE-ADE5-00AA0044773D}'; + + DB_PROPERTY_CHECK_OPTION: TGUID = '{C8B5220B-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_CONSTRAINT_CHECK_DEFERRED: TGUID = '{C8B521F0-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_DROP_CASCADE: TGUID = '{C8B521F3-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_UNIQUE: TGUID = '{C8B521F5-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_ON_COMMIT_PRESERVE_ROWS: TGUID = '{C8B52230-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_PRIMARY: TGUID = '{C8B521FC-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_CLUSTERED: TGUID = '{C8B521FF-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_NONCLUSTERED: TGUID = '{C8B52200-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_BTREE: TGUID = '{C8B52201-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_HASH: TGUID = '{C8B52202-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_FILLFACTOR: TGUID = '{C8B52203-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_INITIALSIZE: TGUID = '{C8B52204-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_DISALLOWNULL: TGUID = '{C8B52205-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_IGNORENULL: TGUID = '{C8B52206-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_IGNOREANYNULL: TGUID = '{C8B52207-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_SORTBOOKMARKS: TGUID = '{C8B52208-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_AUTOMATICUPDATE: TGUID = '{C8B52209-5CF3-11CE-ADE5-00AA0044773D}'; + DB_PROPERTY_EXPLICITUPDATE: TGUID = '{C8B5220A-5CF3-11CE-ADE5-00AA0044773D}'; + + DBGUID_LIKE_SQL: TGUID = '{C8B521F6-5CF3-11CE-ADE5-00AA0044773D}'; + DBGUID_LIKE_DOS: TGUID = '{C8B521F7-5CF3-11CE-ADE5-00AA0044773D}'; + DBGUID_LIKE_OFS: TGUID = '{C8B521F8-5CF3-11CE-ADE5-00AA0044773D}'; + DBGUID_LIKE_MAPI: TGUID = '{C8B521F9-5CF3-11CE-ADE5-00AA0044773D}'; + + DBSCHEMA_ASSERTIONS: TGUID = '{C8B52210-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_CATALOGS: TGUID = '{C8B52211-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_CHARACTER_SETS: TGUID = '{C8B52212-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_COLLATIONS: TGUID = '{C8B52213-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_COLUMNS: TGUID = '{C8B52214-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_CHECK_CONSTRAINTS: TGUID = '{C8B52215-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_CONSTRAINT_COLUMN_USAGE: TGUID = '{C8B52216-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_CONSTRAINT_TABLE_USAGE: TGUID = '{C8B52217-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_KEY_COLUMN_USAGE: TGUID = '{C8B52218-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_REFERENTIAL_CONSTRAINTS: TGUID = '{C8B52219-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_TABLE_CONSTRAINTS: TGUID = '{C8B5221A-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_COLUMN_DOMAIN_USAGE: TGUID = '{C8B5221B-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_INDEXES: TGUID = '{C8B5221E-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_COLUMN_PRIVILEGES: TGUID = '{C8B52221-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_TABLE_PRIVILEGES: TGUID = '{C8B52222-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_USAGE_PRIVILEGES: TGUID = '{C8B52223-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_PROCEDURES: TGUID = '{C8B52224-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_SCHEMATA: TGUID = '{C8B52225-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_SQL_LANGUAGES: TGUID = '{C8B52226-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_STATISTICS: TGUID = '{C8B52227-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_TABLES: TGUID = '{C8B52229-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_TRANSLATIONS: TGUID = '{C8B5222A-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_PROVIDER_TYPES: TGUID = '{C8B5222C-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_VIEWS: TGUID = '{C8B5222D-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_VIEW_COLUMN_USAGE: TGUID = '{C8B5222E-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_VIEW_TABLE_USAGE: TGUID = '{C8B5222F-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_PROCEDURE_PARAMETERS: TGUID = '{C8B522B8-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_FOREIGN_KEYS: TGUID = '{C8B522C4-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_PRIMARY_KEYS: TGUID = '{C8B522C5-5CF3-11CE-ADE5-00AA0044773D}'; + DBSCHEMA_PROCEDURE_COLUMNS: TGUID = '{C8B522C9-5CF3-11CE-ADE5-00AA0044773D}'; + + DBCOL_SELFCOLUMNS: TGUID = '{C8B52231-5CF3-11CE-ADE5-00AA0044773D}'; + DBCOL_SPECIALCOL: TGUID = '{C8B52232-5CF3-11CE-ADE5-00AA0044773D}'; + PSGUID_QUERY: TGUID = '{49691C90-7E17-101A-A91C-08002B2ECDA9}'; + + DBPROPSET_COLUMN: TGUID = '{C8B522B9-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_DATASOURCE: TGUID = '{C8B522BA-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_DATASOURCEINFO: TGUID = '{C8B522BB-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_INDEX: TGUID = '{C8B522BD-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_DBINIT: TGUID = '{C8B522BC-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_ROWSET: TGUID = '{C8B522BE-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_SESSION: TGUID = '{C8B522C6-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_TABLE: TGUID = '{C8B522BF-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_PROPERTIESINERROR: TGUID = '{C8B522D4-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_VIEW: TGUID = '{C8B522DF-5CF3-11CE-ADE5-00AA0044773D}'; + + DBPROPSET_COLUMNALL = '{C8B522F0-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_CONSTRAINTALL = '{C8B522FA-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_DATASOURCEALL: TGUID = '{C8B522C0-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_DATASOURCEINFOALL: TGUID = '{C8B522C1-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_DBINITALL: TGUID = '{C8B522CA-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_INDEXALL = '{C8B522F1-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_ROWSETALL: TGUID = '{C8B522C2-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_SESSIONALL: TGUID = '{C8B522C7-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_TABLEALL = '{C8B522F2-5CF3-11CE-ADE5-00AA0044773D}'; + DBPROPSET_TRUSTEEALL = '{C8B522F3-5CF3-11CE-ADE5-00AA0044773D}'; + + // SQL Everywhere Provider Specific Property Sets + DBPROPSET_SSCE_DBINIT: TGUID = '{2B9AB5BA-4F6C-4ddd-BF18-24DD4BD41848}'; + DBPROPSET_SSCE_COLUMN: TGUID = '{352CC8D5-9181-11d3-B27B-00C04F68DBFF}'; + DBPROPSET_SSCE_ROWSET: TGUID = '{5C17C602-A107-11d3-B27B-00C04F68DBFF}'; + DBPROPSET_SSCE_SESSION: TGUID = '{22FE7D33-5E5C-4a45-B723-8BED2374A06B}'; + + DBGUID_DEFAULT: TGUID = '{C8B521FB-5CF3-11CE-ADE5-00AA0044773D}'; + DBGUID_SQL: TGUID = '{C8B522D7-5CF3-11CE-ADE5-00AA0044773D}'; + +// *********************************************************************// +// Constant Declarations // +// *********************************************************************// + +const + MAXCOLS = 4096; + MAXBOUND = 65535; { High bound for arrays } + OLEDBVER = $0210; + {$EXTERNALSYM OLEDBVER} + DB_INVALID_HACCESSOR = $00; + {$EXTERNALSYM DB_INVALID_HACCESSOR} + DB_NULL_HROW = $00; + {$EXTERNALSYM DB_NULL_HROW} + DBWATCHREGION_NULL = nil; + {$EXTERNALSYM DBWATCHREGION_NULL} + DB_NULL_HCHAPTER = $00; + {$EXTERNALSYM DB_NULL_HCHAPTER} + STD_BOOKMARKLENGTH = 1; + {$EXTERNALSYM STD_BOOKMARKLENGTH} + DB_INVALIDCOLUMN = HIGH(ULONG); + {$EXTERNALSYM DB_INVALIDCOLUMN} + DBCIDGUID: TGuid = '{0C733A81-2A1C-11CE-ADE5-00AA0044773D}'; + {$EXTERNALSYM DBCIDGUID} + DB_NULLGUID: TGuid = '{00000000-0000-0000-0000-000000000000}'; + {$EXTERNALSYM DB_NULLGUID} + DBPROPVAL_BMK_NUMERIC = $00000001; + {$EXTERNALSYM DBPROPVAL_BMK_NUMERIC} + DBPROPVAL_BMK_KEY = $00000002; + {$EXTERNALSYM DBPROPVAL_BMK_KEY} + DBPROPVAL_CL_START = $00000001; + {$EXTERNALSYM DBPROPVAL_CL_START} + DBPROPVAL_CL_END = $00000002; + {$EXTERNALSYM DBPROPVAL_CL_END} + DBPROPVAL_CU_DML_STATEMENTS = $00000001; + {$EXTERNALSYM DBPROPVAL_CU_DML_STATEMENTS} + DBPROPVAL_CU_TABLE_DEFINITION = $00000002; + {$EXTERNALSYM DBPROPVAL_CU_TABLE_DEFINITION} + DBPROPVAL_CU_INDEX_DEFINITION = $00000004; + {$EXTERNALSYM DBPROPVAL_CU_INDEX_DEFINITION} + DBPROPVAL_CU_PRIVILEGE_DEFINITION = $00000008; + {$EXTERNALSYM DBPROPVAL_CU_PRIVILEGE_DEFINITION} + DBPROPVAL_CD_NOTNULL = $00000001; + {$EXTERNALSYM DBPROPVAL_CD_NOTNULL} + DBPROPVAL_CB_NULL = $00000001; + {$EXTERNALSYM DBPROPVAL_CB_NULL} + DBPROPVAL_CB_NON_NULL = $00000002; + {$EXTERNALSYM DBPROPVAL_CB_NON_NULL} + DBPROPVAL_FU_NOT_SUPPORTED = $00000001; + {$EXTERNALSYM DBPROPVAL_FU_NOT_SUPPORTED} + DBPROPVAL_FU_COLUMN = $00000002; + {$EXTERNALSYM DBPROPVAL_FU_COLUMN} + DBPROPVAL_FU_TABLE = $00000004; + {$EXTERNALSYM DBPROPVAL_FU_TABLE} + DBPROPVAL_FU_CATALOG = $00000008; + {$EXTERNALSYM DBPROPVAL_FU_CATALOG} + DBPROPVAL_GB_NOT_SUPPORTED = $00000001; + {$EXTERNALSYM DBPROPVAL_GB_NOT_SUPPORTED} + DBPROPVAL_GB_EQUALS_SELECT = $00000002; + {$EXTERNALSYM DBPROPVAL_GB_EQUALS_SELECT} + DBPROPVAL_GB_CONTAINS_SELECT = $00000004; + {$EXTERNALSYM DBPROPVAL_GB_CONTAINS_SELECT} + DBPROPVAL_GB_NO_RELATION = $00000008; + {$EXTERNALSYM DBPROPVAL_GB_NO_RELATION} + DBPROPVAL_HT_DIFFERENT_CATALOGS = $00000001; + {$EXTERNALSYM DBPROPVAL_HT_DIFFERENT_CATALOGS} + DBPROPVAL_HT_DIFFERENT_PROVIDERS = $00000002; + {$EXTERNALSYM DBPROPVAL_HT_DIFFERENT_PROVIDERS} + DBPROPVAL_IC_UPPER = $00000001; + {$EXTERNALSYM DBPROPVAL_IC_UPPER} + DBPROPVAL_IC_LOWER = $00000002; + {$EXTERNALSYM DBPROPVAL_IC_LOWER} + DBPROPVAL_IC_SENSITIVE = $00000004; + {$EXTERNALSYM DBPROPVAL_IC_SENSITIVE} + DBPROPVAL_IC_MIXED = $00000008; + {$EXTERNALSYM DBPROPVAL_IC_MIXED} + DBPROPVAL_LM_NONE = $00000001; + {$EXTERNALSYM DBPROPVAL_LM_NONE} + DBPROPVAL_LM_READ = $00000002; + {$EXTERNALSYM DBPROPVAL_LM_READ} + DBPROPVAL_LM_INTENT = $00000004; + {$EXTERNALSYM DBPROPVAL_LM_INTENT} + DBPROPVAL_LM_RITE = $00000008; + {$EXTERNALSYM DBPROPVAL_LM_RITE} + DBPROPVAL_NP_OKTODO = $00000001; + {$EXTERNALSYM DBPROPVAL_NP_OKTODO} + DBPROPVAL_NP_ABOUTTODO = $00000002; + {$EXTERNALSYM DBPROPVAL_NP_ABOUTTODO} + DBPROPVAL_NP_SYNCHAFTER = $00000004; + {$EXTERNALSYM DBPROPVAL_NP_SYNCHAFTER} + DBPROPVAL_NP_FAILEDTODO = $00000008; + {$EXTERNALSYM DBPROPVAL_NP_FAILEDTODO} + DBPROPVAL_NP_DIDEVENT = $00000010; + {$EXTERNALSYM DBPROPVAL_NP_DIDEVENT} + DBPROPVAL_NC_END = $00000001; + {$EXTERNALSYM DBPROPVAL_NC_END} + DBPROPVAL_NC_HIGH = $00000002; + {$EXTERNALSYM DBPROPVAL_NC_HIGH} + DBPROPVAL_NC_LOW = $00000004; + {$EXTERNALSYM DBPROPVAL_NC_LOW} + DBPROPVAL_NC_START = $00000008; + {$EXTERNALSYM DBPROPVAL_NC_START} + DBPROPVAL_OO_BLOB = $00000001; + {$EXTERNALSYM DBPROPVAL_OO_BLOB} + DBPROPVAL_OO_IPERSIST = $00000002; + {$EXTERNALSYM DBPROPVAL_OO_IPERSIST} + DBPROPVAL_CB_DELETE = $00000001; + {$EXTERNALSYM DBPROPVAL_CB_DELETE} + DBPROPVAL_CB_PRESERVE = $00000002; + {$EXTERNALSYM DBPROPVAL_CB_PRESERVE} + DBPROPVAL_SU_DML_STATEMENTS = $00000001; + {$EXTERNALSYM DBPROPVAL_SU_DML_STATEMENTS} + DBPROPVAL_SU_TABLE_DEFINITION = $00000002; + {$EXTERNALSYM DBPROPVAL_SU_TABLE_DEFINITION} + DBPROPVAL_SU_INDEX_DEFINITION = $00000004; + {$EXTERNALSYM DBPROPVAL_SU_INDEX_DEFINITION} + DBPROPVAL_SU_PRIVILEGE_DEFINITION = $00000008; + {$EXTERNALSYM DBPROPVAL_SU_PRIVILEGE_DEFINITION} + DBPROPVAL_SQ_CORRELATEDSUBQUERIES = $00000001; + {$EXTERNALSYM DBPROPVAL_SQ_CORRELATEDSUBQUERIES} + DBPROPVAL_SQ_COMPARISON = $00000002; + {$EXTERNALSYM DBPROPVAL_SQ_COMPARISON} + DBPROPVAL_SQ_EXISTS = $00000004; + {$EXTERNALSYM DBPROPVAL_SQ_EXISTS} + DBPROPVAL_SQ_IN = $00000008; + {$EXTERNALSYM DBPROPVAL_SQ_IN} + DBPROPVAL_SQ_QUANTIFIED = $00000010; + {$EXTERNALSYM DBPROPVAL_SQ_QUANTIFIED} + DBPROPVAL_SS_ISEQUENTIALSTREAM = $00000001; + {$EXTERNALSYM DBPROPVAL_SS_ISEQUENTIALSTREAM} + DBPROPVAL_SS_ISTREAM = $00000002; + {$EXTERNALSYM DBPROPVAL_SS_ISTREAM} + DBPROPVAL_SS_ISTORAGE = $00000004; + {$EXTERNALSYM DBPROPVAL_SS_ISTORAGE} + DBPROPVAL_SS_ILOCKBYTES = $00000008; + {$EXTERNALSYM DBPROPVAL_SS_ILOCKBYTES} + DBPROPVAL_TI_CHAOS = $00000010; + {$EXTERNALSYM DBPROPVAL_TI_CHAOS} + DBPROPVAL_TI_READUNCOMMITTED = $00000100; + {$EXTERNALSYM DBPROPVAL_TI_READUNCOMMITTED} + DBPROPVAL_TI_BROWSE = $00000100; + {$EXTERNALSYM DBPROPVAL_TI_BROWSE} + DBPROPVAL_TI_CURSORSTABILITY = $00001000; + {$EXTERNALSYM DBPROPVAL_TI_CURSORSTABILITY} + DBPROPVAL_TI_READCOMMITTED = $00001000; + {$EXTERNALSYM DBPROPVAL_TI_READCOMMITTED} + DBPROPVAL_TI_REPEATABLEREAD = $00010000; + {$EXTERNALSYM DBPROPVAL_TI_REPEATABLEREAD} + DBPROPVAL_TI_SERIALIZABLE = $00100000; + {$EXTERNALSYM DBPROPVAL_TI_SERIALIZABLE} + DBPROPVAL_TI_ISOLATED = $00100000; + {$EXTERNALSYM DBPROPVAL_TI_ISOLATED} + DBPROPVAL_TR_COMMIT_DC = $00000001; + {$EXTERNALSYM DBPROPVAL_TR_COMMIT_DC} + DBPROPVAL_TR_COMMIT = $00000002; + {$EXTERNALSYM DBPROPVAL_TR_COMMIT} + DBPROPVAL_TR_COMMIT_NO = $00000004; + {$EXTERNALSYM DBPROPVAL_TR_COMMIT_NO} + DBPROPVAL_TR_ABORT_DC = $00000008; + {$EXTERNALSYM DBPROPVAL_TR_ABORT_DC} + DBPROPVAL_TR_ABORT = $00000010; + {$EXTERNALSYM DBPROPVAL_TR_ABORT} + DBPROPVAL_TR_ABORT_NO = $00000020; + {$EXTERNALSYM DBPROPVAL_TR_ABORT_NO} + DBPROPVAL_TR_DONTCARE = $00000040; + {$EXTERNALSYM DBPROPVAL_TR_DONTCARE} + DBPROPVAL_TR_BOTH = $00000080; + {$EXTERNALSYM DBPROPVAL_TR_BOTH} + DBPROPVAL_TR_NONE = $00000100; + {$EXTERNALSYM DBPROPVAL_TR_NONE} + DBPROPVAL_TR_OPTIMISTIC = $00000200; + {$EXTERNALSYM DBPROPVAL_TR_OPTIMISTIC} + DBPROPVAL_RT_FREETHREAD = $00000001; + {$EXTERNALSYM DBPROPVAL_RT_FREETHREAD} + DBPROPVAL_RT_APTMTTHREAD = $00000002; + {$EXTERNALSYM DBPROPVAL_RT_APTMTTHREAD} + DBPROPVAL_RT_SINGLETHREAD = $00000004; + {$EXTERNALSYM DBPROPVAL_RT_SINGLETHREAD} + DBPROPVAL_UP_CHANGE = $00000001; + {$EXTERNALSYM DBPROPVAL_UP_CHANGE} + DBPROPVAL_UP_DELETE = $00000002; + {$EXTERNALSYM DBPROPVAL_UP_DELETE} + DBPROPVAL_UP_INSERT = $00000004; + {$EXTERNALSYM DBPROPVAL_UP_INSERT} + DBPROPVAL_SQL_NONE = $00000000; + {$EXTERNALSYM DBPROPVAL_SQL_NONE} + DBPROPVAL_SQL_ODBC_MINIMUM = $00000001; + {$EXTERNALSYM DBPROPVAL_SQL_ODBC_MINIMUM} + DBPROPVAL_SQL_ODBC_CORE = $00000002; + {$EXTERNALSYM DBPROPVAL_SQL_ODBC_CORE} + DBPROPVAL_SQL_ODBC_EXTENDED = $00000004; + {$EXTERNALSYM DBPROPVAL_SQL_ODBC_EXTENDED} + DBPROPVAL_SQL_ANSI89_IEF = $00000008; + {$EXTERNALSYM DBPROPVAL_SQL_ANSI89_IEF} + DBPROPVAL_SQL_ANSI92_ENTRY = $00000010; + {$EXTERNALSYM DBPROPVAL_SQL_ANSI92_ENTRY} + DBPROPVAL_SQL_FIPS_TRANSITIONAL = $00000020; + {$EXTERNALSYM DBPROPVAL_SQL_FIPS_TRANSITIONAL} + DBPROPVAL_SQL_ANSI92_INTERMEDIATE = $00000040; + {$EXTERNALSYM DBPROPVAL_SQL_ANSI92_INTERMEDIATE} + DBPROPVAL_SQL_ANSI92_FULL = $00000080; + {$EXTERNALSYM DBPROPVAL_SQL_ANSI92_FULL} + DBPROPVAL_SQL_ESCAPECLAUSES = $00000100; + {$EXTERNALSYM DBPROPVAL_SQL_ESCAPECLAUSES} + DBPROPVAL_IT_BTREE = $00000001; + {$EXTERNALSYM DBPROPVAL_IT_BTREE} + DBPROPVAL_IT_HASH = $00000002; + {$EXTERNALSYM DBPROPVAL_IT_HASH} + DBPROPVAL_IT_CONTENT = $00000003; + {$EXTERNALSYM DBPROPVAL_IT_CONTENT} + DBPROPVAL_IT_OTHER = $00000004; + {$EXTERNALSYM DBPROPVAL_IT_OTHER} + DBPROPVAL_IN_DISALLOWNULL = $00000001; + {$EXTERNALSYM DBPROPVAL_IN_DISALLOWNULL} + DBPROPVAL_IN_IGNORENULL = $00000002; + {$EXTERNALSYM DBPROPVAL_IN_IGNORENULL} + DBPROPVAL_IN_IGNOREANYNULL = $00000004; + {$EXTERNALSYM DBPROPVAL_IN_IGNOREANYNULL} + DBPROPVAL_TC_NONE = $00000000; + {$EXTERNALSYM DBPROPVAL_TC_NONE} + DBPROPVAL_TC_DML = $00000001; + {$EXTERNALSYM DBPROPVAL_TC_DML} + DBPROPVAL_TC_DDL_COMMIT = $00000002; + {$EXTERNALSYM DBPROPVAL_TC_DDL_COMMIT} + DBPROPVAL_TC_DDL_IGNORE = $00000004; + {$EXTERNALSYM DBPROPVAL_TC_DDL_IGNORE} + DBPROPVAL_TC_ALL = $00000008; + {$EXTERNALSYM DBPROPVAL_TC_ALL} + DBPROPVAL_OA_NOTSUPPORTED = $00000001; + {$EXTERNALSYM DBPROPVAL_OA_NOTSUPPORTED} + DBPROPVAL_OA_ATEXECUTE = $00000002; + {$EXTERNALSYM DBPROPVAL_OA_ATEXECUTE} + DBPROPVAL_OA_ATROWRELEASE = $00000004; + {$EXTERNALSYM DBPROPVAL_OA_ATROWRELEASE} + DBPROPVAL_MR_NOTSUPPORTED = $00000000; + {$EXTERNALSYM DBPROPVAL_MR_NOTSUPPORTED} + DBPROPVAL_MR_SUPPORTED = $00000001; + {$EXTERNALSYM DBPROPVAL_MR_SUPPORTED} + DBPROPVAL_MR_CONCURRENT = $00000002; + {$EXTERNALSYM DBPROPVAL_MR_CONCURRENT} + DBPROPVAL_PT_GUID_NAME = $00000001; + {$EXTERNALSYM DBPROPVAL_PT_GUID_NAME} + DBPROPVAL_PT_GUID_PROPID = $00000002; + {$EXTERNALSYM DBPROPVAL_PT_GUID_PROPID} + DBPROPVAL_PT_NAME = $00000004; + {$EXTERNALSYM DBPROPVAL_PT_NAME} + DBPROPVAL_PT_GUID = $00000008; + {$EXTERNALSYM DBPROPVAL_PT_GUID} + DBPROPVAL_PT_PROPID = $00000010; + {$EXTERNALSYM DBPROPVAL_PT_PROPID} + DBPROPVAL_PT_PGUID_NAME = $00000020; + {$EXTERNALSYM DBPROPVAL_PT_PGUID_NAME} + DBPROPVAL_PT_PGUID_PROPID = $00000040; + {$EXTERNALSYM DBPROPVAL_PT_PGUID_PROPID} + DBPROPVAL_NT_SINGLEROW = $00000001; + {$EXTERNALSYM DBPROPVAL_NT_SINGLEROW} + DBPROPVAL_NT_MULTIPLEROWS = $00000002; + {$EXTERNALSYM DBPROPVAL_NT_MULTIPLEROWS} + DBPROPVAL_ASYNCH_INITIALIZE = $00000001; + {$EXTERNALSYM DBPROPVAL_ASYNCH_INITIALIZE} + DBPROPVAL_ASYNCH_SEQUENTIALPOPULATION = $00000002; + {$EXTERNALSYM DBPROPVAL_ASYNCH_SEQUENTIALPOPULATION} + DBPROPVAL_ASYNCH_RANDOMPOPULATION = $00000004; + {$EXTERNALSYM DBPROPVAL_ASYNCH_RANDOMPOPULATION} + DBPROPVAL_OP_EQUAL = $00000001; + {$EXTERNALSYM DBPROPVAL_OP_EQUAL} + DBPROPVAL_OP_RELATIVE = $00000002; + {$EXTERNALSYM DBPROPVAL_OP_RELATIVE} + DBPROPVAL_OP_STRING = $00000004; + {$EXTERNALSYM DBPROPVAL_OP_STRING} + DBPROPVAL_CO_EQUALITY = $00000001; + {$EXTERNALSYM DBPROPVAL_CO_EQUALITY} + DBPROPVAL_CO_STRING = $00000002; + {$EXTERNALSYM DBPROPVAL_CO_STRING} + DBPROPVAL_CO_CASESENSITIVE = $00000004; + {$EXTERNALSYM DBPROPVAL_CO_CASESENSITIVE} + DBPROPVAL_CO_CASEINSENSITIVE = $00000008; + {$EXTERNALSYM DBPROPVAL_CO_CASEINSENSITIVE} + DBPROPVAL_CO_CONTAINS = $00000010; + {$EXTERNALSYM DBPROPVAL_CO_CONTAINS} + DBPROPVAL_CO_BEGINSWITH = $00000020; + {$EXTERNALSYM DBPROPVAL_CO_BEGINSWITH} + DBPROPVAL_ASYNCH_BACKGROUNDPOPULATION = $00000008; + {$EXTERNALSYM DBPROPVAL_ASYNCH_BACKGROUNDPOPULATION} + DBPROPVAL_ASYNCH_PREPOPULATE = $00000010; + {$EXTERNALSYM DBPROPVAL_ASYNCH_PREPOPULATE} + DBPROPVAL_ASYNCH_POPULATEONDEMAND = $00000020; + {$EXTERNALSYM DBPROPVAL_ASYNCH_POPULATEONDEMAND} + DBPROPVAL_LM_SINGLEROW = $00000002; + {$EXTERNALSYM DBPROPVAL_LM_SINGLEROW} + DBPROPVAL_SQL_SUBMINIMUM = $00000200; + {$EXTERNALSYM DBPROPVAL_SQL_SUBMINIMUM} + DBPROPVAL_DST_TDP = $00000001; + {$EXTERNALSYM DBPROPVAL_DST_TDP} + DBPROPVAL_DST_MDP = $00000002; + {$EXTERNALSYM DBPROPVAL_DST_MDP} + DBPROPVAL_DST_TDPANDMDP = $00000003; + {$EXTERNALSYM DBPROPVAL_DST_TDPANDMDP} + MDPROPVAL_AU_UNSUPPORTED = $00000000; + {$EXTERNALSYM MDPROPVAL_AU_UNSUPPORTED} + MDPROPVAL_AU_UNCHANGED = $00000001; + {$EXTERNALSYM MDPROPVAL_AU_UNCHANGED} + MDPROPVAL_AU_UNKNOWN = $00000002; + {$EXTERNALSYM MDPROPVAL_AU_UNKNOWN} + MDPROPVAL_MF_WITH_CALCMEMBERS = $00000001; + {$EXTERNALSYM MDPROPVAL_MF_WITH_CALCMEMBERS} + MDPROPVAL_MF_WITH_NAMEDSETS = $00000002; + {$EXTERNALSYM MDPROPVAL_MF_WITH_NAMEDSETS} + MDPROPVAL_MF_CREATE_CALCMEMBERS = $00000004; + {$EXTERNALSYM MDPROPVAL_MF_CREATE_CALCMEMBERS} + MDPROPVAL_MF_CREATE_NAMEDSETS = $00000008; + {$EXTERNALSYM MDPROPVAL_MF_CREATE_NAMEDSETS} + MDPROPVAL_MF_SCOPE_SESSION = $00000010; + {$EXTERNALSYM MDPROPVAL_MF_SCOPE_SESSION} + MDPROPVAL_MF_SCOPE_GLOBAL = $00000020; + {$EXTERNALSYM MDPROPVAL_MF_SCOPE_GLOBAL} + MDPROPVAL_MMF_COUSIN = $00000001; + {$EXTERNALSYM MDPROPVAL_MMF_COUSIN} + MDPROPVAL_MMF_PARALLELPERIOD = $00000002; + {$EXTERNALSYM MDPROPVAL_MMF_PARALLELPERIOD} + MDPROPVAL_MMF_OPENINGPERIOD = $00000004; + {$EXTERNALSYM MDPROPVAL_MMF_OPENINGPERIOD} + MDPROPVAL_MMF_CLOSINGPERIOD = $00000008; + {$EXTERNALSYM MDPROPVAL_MMF_CLOSINGPERIOD} + MDPROPVAL_MNF_MEDIAN = $00000001; + {$EXTERNALSYM MDPROPVAL_MNF_MEDIAN} + MDPROPVAL_MNF_VAR = $00000002; + {$EXTERNALSYM MDPROPVAL_MNF_VAR} + MDPROPVAL_MNF_STDDEV = $00000004; + {$EXTERNALSYM MDPROPVAL_MNF_STDDEV} + MDPROPVAL_MNF_RANK = $00000008; + {$EXTERNALSYM MDPROPVAL_MNF_RANK} + MDPROPVAL_MNF_AGGREGATE = $00000010; + {$EXTERNALSYM MDPROPVAL_MNF_AGGREGATE} + MDPROPVAL_MNF_COVARIANCE = $00000020; + {$EXTERNALSYM MDPROPVAL_MNF_COVARIANCE} + MDPROPVAL_MNF_CORRELATION = $00000040; + {$EXTERNALSYM MDPROPVAL_MNF_CORRELATION} + MDPROPVAL_MNF_LINREGSLOPE = $00000080; + {$EXTERNALSYM MDPROPVAL_MNF_LINREGSLOPE} + MDPROPVAL_MNF_LINREGVARIANCE = $00000100; + {$EXTERNALSYM MDPROPVAL_MNF_LINREGVARIANCE} + MDPROPVAL_MNF_LINREG2 = $00000200; + {$EXTERNALSYM MDPROPVAL_MNF_LINREG2} + MDPROPVAL_MNF_LINREGPOINT = $00000400; + {$EXTERNALSYM MDPROPVAL_MNF_LINREGPOINT} + MDPROPVAL_MNF_DRILLDOWNLEVEL = $00000800; + {$EXTERNALSYM MDPROPVAL_MNF_DRILLDOWNLEVEL} + MDPROPVAL_MNF_DRILLDOWNMEMBERTOP = $00001000; + {$EXTERNALSYM MDPROPVAL_MNF_DRILLDOWNMEMBERTOP} + MDPROPVAL_MNF_DRILLDOWNMEMBERBOTTOM = $00002000; + {$EXTERNALSYM MDPROPVAL_MNF_DRILLDOWNMEMBERBOTTOM} + MDPROPVAL_MNF_DRILLDOWNLEVELTOP = $00004000; + {$EXTERNALSYM MDPROPVAL_MNF_DRILLDOWNLEVELTOP} + MDPROPVAL_MNF_DRILLDOWNLEVELBOTTOM = $00008000; + {$EXTERNALSYM MDPROPVAL_MNF_DRILLDOWNLEVELBOTTOM} + MDPROPVAL_MNF_DRILLUPMEMBER = $00010000; + {$EXTERNALSYM MDPROPVAL_MNF_DRILLUPMEMBER} + MDPROPVAL_MNF_DRILLUPLEVEL = $00020000; + {$EXTERNALSYM MDPROPVAL_MNF_DRILLUPLEVEL} + MDPROPVAL_MSF_TOPPERCENT = $00000001; + {$EXTERNALSYM MDPROPVAL_MSF_TOPPERCENT} + MDPROPVAL_MSF_BOTTOMPERCENT = $00000002; + {$EXTERNALSYM MDPROPVAL_MSF_BOTTOMPERCENT} + MDPROPVAL_MSF_TOPSUM = $00000004; + {$EXTERNALSYM MDPROPVAL_MSF_TOPSUM} + MDPROPVAL_MSF_BOTTOMSUM = $00000008; + {$EXTERNALSYM MDPROPVAL_MSF_BOTTOMSUM} + MDPROPVAL_MSF_PERIODSTODATE = $00000010; + {$EXTERNALSYM MDPROPVAL_MSF_PERIODSTODATE} + MDPROPVAL_MSF_LASTPERIODS = $00000020; + {$EXTERNALSYM MDPROPVAL_MSF_LASTPERIODS} + MDPROPVAL_MSF_YTD = $00000040; + {$EXTERNALSYM MDPROPVAL_MSF_YTD} + MDPROPVAL_MSF_QTD = $00000080; + {$EXTERNALSYM MDPROPVAL_MSF_QTD} + MDPROPVAL_MSF_MTD = $00000100; + {$EXTERNALSYM MDPROPVAL_MSF_MTD} + MDPROPVAL_MSF_WTD = $00000200; + {$EXTERNALSYM MDPROPVAL_MSF_WTD} + MDPROPVAL_MSF_DRILLDOWNMEMBBER = $00000400; + {$EXTERNALSYM MDPROPVAL_MSF_DRILLDOWNMEMBBER} + MDPROPVAL_MSF_DRILLDOWNLEVEL = $00000800; + {$EXTERNALSYM MDPROPVAL_MSF_DRILLDOWNLEVEL} + MDPROPVAL_MSF_DRILLDOWNMEMBERTOP = $00001000; + {$EXTERNALSYM MDPROPVAL_MSF_DRILLDOWNMEMBERTOP} + MDPROPVAL_MSF_DRILLDOWNMEMBERBOTTOM = $00002000; + {$EXTERNALSYM MDPROPVAL_MSF_DRILLDOWNMEMBERBOTTOM} + MDPROPVAL_MSF_DRILLDOWNLEVELTOP = $00004000; + {$EXTERNALSYM MDPROPVAL_MSF_DRILLDOWNLEVELTOP} + MDPROPVAL_MSF_DRILLDOWNLEVELBOTTOM = $00008000; + {$EXTERNALSYM MDPROPVAL_MSF_DRILLDOWNLEVELBOTTOM} + MDPROPVAL_MSF_DRILLUPMEMBER = $00010000; + {$EXTERNALSYM MDPROPVAL_MSF_DRILLUPMEMBER} + MDPROPVAL_MSF_DRILLUPLEVEL = $00020000; + {$EXTERNALSYM MDPROPVAL_MSF_DRILLUPLEVEL} + MDPROPVAL_MSF_TOGGLEDRILLSTATE = $00040000; + {$EXTERNALSYM MDPROPVAL_MSF_TOGGLEDRILLSTATE} + MDPROPVAL_MD_SELF = $00000001; + {$EXTERNALSYM MDPROPVAL_MD_SELF} + MDPROPVAL_MD_BEFORE = $00000002; + {$EXTERNALSYM MDPROPVAL_MD_BEFORE} + MDPROPVAL_MD_AFTER = $00000004; + {$EXTERNALSYM MDPROPVAL_MD_AFTER} + MDPROPVAL_MSC_LESSTHAN = $00000001; + {$EXTERNALSYM MDPROPVAL_MSC_LESSTHAN} + MDPROPVAL_MSC_GREATERTHAN = $00000002; + {$EXTERNALSYM MDPROPVAL_MSC_GREATERTHAN} + MDPROPVAL_MSC_LESSTHANEQUAL = $00000004; + {$EXTERNALSYM MDPROPVAL_MSC_LESSTHANEQUAL} + MDPROPVAL_MSC_GREATERTHANEQUAL = $00000008; + {$EXTERNALSYM MDPROPVAL_MSC_GREATERTHANEQUAL} + MDPROPVAL_MC_SINGLECASE = $00000001; + {$EXTERNALSYM MDPROPVAL_MC_SINGLECASE} + MDPROPVAL_MC_SEARCHEDCASE = $00000002; + {$EXTERNALSYM MDPROPVAL_MC_SEARCHEDCASE} + MDPROPVAL_MOQ_OUTERREFERENCE = $00000001; + {$EXTERNALSYM MDPROPVAL_MOQ_OUTERREFERENCE} + MDPROPVAL_MOQ_DATASOURCE_CUBE = $00000001; + {$EXTERNALSYM MDPROPVAL_MOQ_DATASOURCE_CUBE} + MDPROPVAL_MOQ_CATALOG_CUBE = $00000002; + {$EXTERNALSYM MDPROPVAL_MOQ_CATALOG_CUBE} + MDPROPVAL_MOQ_SCHEMA_CUBE = $00000004; + {$EXTERNALSYM MDPROPVAL_MOQ_SCHEMA_CUBE} + MDPROPVAL_MOQ_CUBE_DIM = $00000008; + {$EXTERNALSYM MDPROPVAL_MOQ_CUBE_DIM} + MDPROPVAL_MOQ_DIM_HIER = $00000010; + {$EXTERNALSYM MDPROPVAL_MOQ_DIM_HIER} + MDPROPVAL_MOQ_DIMHIER_LEVEL = $00000020; + {$EXTERNALSYM MDPROPVAL_MOQ_DIMHIER_LEVEL} + MDPROPVAL_MOQ_LEVEL_MEMBER = $00000040; + {$EXTERNALSYM MDPROPVAL_MOQ_LEVEL_MEMBER} + MDPROPVAL_MOQ_MEMBER_MEMBER = $00000080; + {$EXTERNALSYM MDPROPVAL_MOQ_MEMBER_MEMBER} + MDPROPVAL_FS_FULL_SUPPORT = $00000001; + {$EXTERNALSYM MDPROPVAL_FS_FULL_SUPPORT} + MDPROPVAL_FS_GENERATED_COLUMN = $00000002; + {$EXTERNALSYM MDPROPVAL_FS_GENERATED_COLUMN} + MDPROPVAL_FS_GENERATED_DIMENSION = $00000003; + {$EXTERNALSYM MDPROPVAL_FS_GENERATED_DIMENSION} + MDPROPVAL_FS_NO_SUPPORT = $00000004; + {$EXTERNALSYM MDPROPVAL_FS_NO_SUPPORT} + MDPROPVAL_NL_NAMEDLEVELS = $00000001; + {$EXTERNALSYM MDPROPVAL_NL_NAMEDLEVELS} + MDPROPVAL_NL_NUMBEREDLEVELS = $00000002; + {$EXTERNALSYM MDPROPVAL_NL_NUMBEREDLEVELS} + MDPROPVAL_MJC_SINGLECUBE = $00000001; + {$EXTERNALSYM MDPROPVAL_MJC_SINGLECUBE} + MDPROPVAL_MJC_MULTICUBES = $00000002; + {$EXTERNALSYM MDPROPVAL_MJC_MULTICUBES} + MDPROPVAL_MJC_IMPLICITCUBE = $00000004; + {$EXTERNALSYM MDPROPVAL_MJC_IMPLICITCUBE} + MDPROPVAL_RR_NORANGEROWSET = $00000001; + {$EXTERNALSYM MDPROPVAL_RR_NORANGEROWSET} + MDPROPVAL_RR_READONLY = $00000002; + {$EXTERNALSYM MDPROPVAL_RR_READONLY} + MDPROPVAL_RR_UPDATE = $00000004; + {$EXTERNALSYM MDPROPVAL_RR_UPDATE} + MDPROPVAL_MS_MULTIPLETUPLES = $00000001; + {$EXTERNALSYM MDPROPVAL_MS_MULTIPLETUPLES} + MDPROPVAL_MS_SINGLETUPLE = $00000002; + {$EXTERNALSYM MDPROPVAL_MS_SINGLETUPLE} + DBPROPVAL_AO_SEQUENTIAL = $00000000; + {$EXTERNALSYM DBPROPVAL_AO_SEQUENTIAL} + DBPROPVAL_AO_SEQUENTIALSTORAGEOBJECTS = $00000001; + {$EXTERNALSYM DBPROPVAL_AO_SEQUENTIALSTORAGEOBJECTS} + DBPROPVAL_AO_RANDOM = $00000002; + {$EXTERNALSYM DBPROPVAL_AO_RANDOM} + DBPROPVAL_BD_ROWSET = $00000000; + {$EXTERNALSYM DBPROPVAL_BD_ROWSET} + DBPROPVAL_BD_INTRANSACTION = $00000001; + {$EXTERNALSYM DBPROPVAL_BD_INTRANSACTION} + DBPROPVAL_BD_XTRANSACTION = $00000002; + {$EXTERNALSYM DBPROPVAL_BD_XTRANSACTION} + DBPROPVAL_BD_REORGANIZATION = $00000003; + {$EXTERNALSYM DBPROPVAL_BD_REORGANIZATION} + BMK_DURABILITY_ROWSET = DBPROPVAL_BD_ROWSET; + {$EXTERNALSYM BMK_DURABILITY_ROWSET} + BMK_DURABILITY_INTRANSACTION = DBPROPVAL_BD_INTRANSACTION; + {$EXTERNALSYM BMK_DURABILITY_INTRANSACTION} + BMK_DURABILITY_XTRANSACTION = DBPROPVAL_BD_XTRANSACTION; + {$EXTERNALSYM BMK_DURABILITY_XTRANSACTION} + BMK_DURABILITY_REORGANIZATION = DBPROPVAL_BD_REORGANIZATION; + {$EXTERNALSYM BMK_DURABILITY_REORGANIZATION} + DBPROPVAL_BO_NOLOG = $00000000; + {$EXTERNALSYM DBPROPVAL_BO_NOLOG} + DBPROPVAL_BO_NOINDEXUPDATE = $00000001; + {$EXTERNALSYM DBPROPVAL_BO_NOINDEXUPDATE} + DBPROPVAL_BO_REFINTEGRITY = $00000002; + {$EXTERNALSYM DBPROPVAL_BO_REFINTEGRITY} + DBPROPVAL_STGM_READ = OF_READ; + {$EXTERNALSYM DBPROPVAL_STGM_READ} + DBPROPVAL_STGM_WRITE = OF_WRITE; + {$EXTERNALSYM DBPROPVAL_STGM_WRITE} + DBPROPVAL_STGM_READWRITE = OF_READWRITE; + {$EXTERNALSYM DBPROPVAL_STGM_READWRITE} + DBPROPVAL_STGM_SHARE_DENY_NONE = OF_SHARE_DENY_NONE; + {$EXTERNALSYM DBPROPVAL_STGM_SHARE_DENY_NONE} + DBPROPVAL_STGM_SHARE_DENY_READ = OF_SHARE_DENY_READ; + {$EXTERNALSYM DBPROPVAL_STGM_SHARE_DENY_READ} + DBPROPVAL_STGM_SHARE_DENY_WRITE = OF_SHARE_DENY_WRITE; + {$EXTERNALSYM DBPROPVAL_STGM_SHARE_DENY_WRITE} + DBPROPVAL_STGM_SHARE_EXCLUSIVE = OF_SHARE_EXCLUSIVE; + {$EXTERNALSYM DBPROPVAL_STGM_SHARE_EXCLUSIVE} + DBPROPVAL_STGM_DIRECT = $00010000; + {$EXTERNALSYM DBPROPVAL_STGM_DIRECT} + DBPROPVAL_STGM_TRANSACTED = $00020000; + {$EXTERNALSYM DBPROPVAL_STGM_TRANSACTED} + DBPROPVAL_STGM_CREATE = OF_CREATE; + {$EXTERNALSYM DBPROPVAL_STGM_CREATE} + DBPROPVAL_STGM_CONVERT = $00040000; + {$EXTERNALSYM DBPROPVAL_STGM_CONVERT} + DBPROPVAL_STGM_FAILIFTHERE = $00080000; + {$EXTERNALSYM DBPROPVAL_STGM_FAILIFTHERE} + DBPROPVAL_STGM_PRIORITY = $00100000; + {$EXTERNALSYM DBPROPVAL_STGM_PRIORITY} + DBPROPVAL_STGM_DELETEONRELEASE = $00200000; + {$EXTERNALSYM DBPROPVAL_STGM_DELETEONRELEASE} + DBPROPVAL_GB_COLLATE = $00000010; + {$EXTERNALSYM DBPROPVAL_GB_COLLATE} + DBPROPVAL_CS_UNINITIALIZED = $00000000; + {$EXTERNALSYM DBPROPVAL_CS_UNINITIALIZED} + DBPROPVAL_CS_INITIALIZED = $00000001; + {$EXTERNALSYM DBPROPVAL_CS_INITIALIZED} + DBPROPVAL_CS_COMMUNICATIONFAILURE = $00000002; + {$EXTERNALSYM DBPROPVAL_CS_COMMUNICATIONFAILURE} + DBPROPVAL_RD_RESETALL = $ffffffff; + {$EXTERNALSYM DBPROPVAL_RD_RESETALL} + DBPROPVAL_OS_RESOURCEPOOLING = $00000001; + {$EXTERNALSYM DBPROPVAL_OS_RESOURCEPOOLING} + DBPROPVAL_OS_TXNENLISTMENT = $00000002; + {$EXTERNALSYM DBPROPVAL_OS_TXNENLISTMENT} + DBPROPVAL_OS_CLIENTCURSOR = $00000004; + {$EXTERNALSYM DBPROPVAL_OS_CLIENTCURSOR} + DBPROPVAL_OS_ENABLEALL = $ffffffff; + {$EXTERNALSYM DBPROPVAL_OS_ENABLEALL} + DBPROPVAL_BI_CROSSROWSET = $00000001; + {$EXTERNALSYM DBPROPVAL_BI_CROSSROWSET} + DB_IMP_LEVEL_ANONYMOUS = $00; + {$EXTERNALSYM DB_IMP_LEVEL_ANONYMOUS} + DB_IMP_LEVEL_IDENTIFY = $01; + {$EXTERNALSYM DB_IMP_LEVEL_IDENTIFY} + DB_IMP_LEVEL_IMPERSONATE = $02; + {$EXTERNALSYM DB_IMP_LEVEL_IMPERSONATE} + DB_IMP_LEVEL_DELEGATE = $03; + {$EXTERNALSYM DB_IMP_LEVEL_DELEGATE} + DBPROMPT_PROMPT = $01; + {$EXTERNALSYM DBPROMPT_PROMPT} + DBPROMPT_COMPLETE = $02; + {$EXTERNALSYM DBPROMPT_COMPLETE} + DBPROMPT_COMPLETEREQUIRED = $03; + {$EXTERNALSYM DBPROMPT_COMPLETEREQUIRED} + DBPROMPT_NOPROMPT = $04; + {$EXTERNALSYM DBPROMPT_NOPROMPT} + DB_PROT_LEVEL_NONE = $00; + {$EXTERNALSYM DB_PROT_LEVEL_NONE} + DB_PROT_LEVEL_CONNECT = $01; + {$EXTERNALSYM DB_PROT_LEVEL_CONNECT} + DB_PROT_LEVEL_CALL = $02; + {$EXTERNALSYM DB_PROT_LEVEL_CALL} + DB_PROT_LEVEL_PKT = $03; + {$EXTERNALSYM DB_PROT_LEVEL_PKT} + DB_PROT_LEVEL_PKT_INTEGRITY = $04; + {$EXTERNALSYM DB_PROT_LEVEL_PKT_INTEGRITY} + DB_PROT_LEVEL_PKT_PRIVACY = $05; + {$EXTERNALSYM DB_PROT_LEVEL_PKT_PRIVACY} + DB_MODE_READ = $01; + {$EXTERNALSYM DB_MODE_READ} + DB_MODE_WRITE = $02; + {$EXTERNALSYM DB_MODE_WRITE} + DB_MODE_READWRITE = $03; + {$EXTERNALSYM DB_MODE_READWRITE} + DB_MODE_SHARE_DENY_READ = $04; + {$EXTERNALSYM DB_MODE_SHARE_DENY_READ} + DB_MODE_SHARE_DENY_WRITE = $08; + {$EXTERNALSYM DB_MODE_SHARE_DENY_WRITE} + DB_MODE_SHARE_EXCLUSIVE = $0c; + {$EXTERNALSYM DB_MODE_SHARE_EXCLUSIVE} + DB_MODE_SHARE_DENY_NONE = $10; + {$EXTERNALSYM DB_MODE_SHARE_DENY_NONE} + DBCOMPUTEMODE_COMPUTED = $01; + {$EXTERNALSYM DBCOMPUTEMODE_COMPUTED} + DBCOMPUTEMODE_DYNAMIC = $02; + {$EXTERNALSYM DBCOMPUTEMODE_DYNAMIC} + DBCOMPUTEMODE_NOTCOMPUTED = $03; + {$EXTERNALSYM DBCOMPUTEMODE_NOTCOMPUTED} + DBPROPVAL_DF_INITIALLY_DEFERRED = $01; + {$EXTERNALSYM DBPROPVAL_DF_INITIALLY_DEFERRED} + DBPROPVAL_DF_INITIALLY_IMMEDIATE = $02; + {$EXTERNALSYM DBPROPVAL_DF_INITIALLY_IMMEDIATE} + DBPROPVAL_DF_NOT_DEFERRABLE = $03; + {$EXTERNALSYM DBPROPVAL_DF_NOT_DEFERRABLE} + DBPARAMTYPE_INPUT = $01; + {$EXTERNALSYM DBPARAMTYPE_INPUT} + DBPARAMTYPE_INPUTOUTPUT = $02; + {$EXTERNALSYM DBPARAMTYPE_INPUTOUTPUT} + DBPARAMTYPE_OUTPUT = $03; + {$EXTERNALSYM DBPARAMTYPE_OUTPUT} + DBPARAMTYPE_RETURNVALUE = $04; + {$EXTERNALSYM DBPARAMTYPE_RETURNVALUE} + DB_PT_UNKNOWN = $01; + {$EXTERNALSYM DB_PT_UNKNOWN} + DB_PT_PROCEDURE = $02; + {$EXTERNALSYM DB_PT_PROCEDURE} + DB_PT_FUNCTION = $03; + {$EXTERNALSYM DB_PT_FUNCTION} + DB_REMOTE = $01; + {$EXTERNALSYM DB_REMOTE} + DB_LOCAL_SHARED = $02; + {$EXTERNALSYM DB_LOCAL_SHARED} + DB_LOCAL_EXCLUSIVE = $03; + {$EXTERNALSYM DB_LOCAL_EXCLUSIVE} + DB_COLLATION_ASC = $01; + {$EXTERNALSYM DB_COLLATION_ASC} + DB_COLLATION_DESC = $02; + {$EXTERNALSYM DB_COLLATION_DESC} + DB_UNSEARCHABLE = $01; + {$EXTERNALSYM DB_UNSEARCHABLE} + DB_LIKE_ONLY = $02; + {$EXTERNALSYM DB_LIKE_ONLY} + DB_ALL_EXCEPT_LIKE = $03; + {$EXTERNALSYM DB_ALL_EXCEPT_LIKE} + DB_SEARCHABLE = $04; + {$EXTERNALSYM DB_SEARCHABLE} + MDTREEOP_CHILDREN = $01; + {$EXTERNALSYM MDTREEOP_CHILDREN} + MDTREEOP_SIBLINGS = $02; + {$EXTERNALSYM MDTREEOP_SIBLINGS} + MDTREEOP_PARENT = $04; + {$EXTERNALSYM MDTREEOP_PARENT} + MDTREEOP_SELF = $08; + {$EXTERNALSYM MDTREEOP_SELF} + MDTREEOP_DESCENDANTS = $10; + {$EXTERNALSYM MDTREEOP_DESCENDANTS} + MDTREEOP_ANCESTORS = $20; + {$EXTERNALSYM MDTREEOP_ANCESTORS} + MD_DIMTYPE_UNKNOWN = $00; + {$EXTERNALSYM MD_DIMTYPE_UNKNOWN} + MD_DIMTYPE_TIME = $01; + {$EXTERNALSYM MD_DIMTYPE_TIME} + MD_DIMTYPE_MEASURE = $02; + {$EXTERNALSYM MD_DIMTYPE_MEASURE} + MD_DIMTYPE_OTHER = $03; + {$EXTERNALSYM MD_DIMTYPE_OTHER} + MDLEVEL_TYPE_UNKNOWN = $0000; + {$EXTERNALSYM MDLEVEL_TYPE_UNKNOWN} + MDLEVEL_TYPE_REGULAR = $0000; + {$EXTERNALSYM MDLEVEL_TYPE_REGULAR} + MDLEVEL_TYPE_ALL = $0001; + {$EXTERNALSYM MDLEVEL_TYPE_ALL} + MDLEVEL_TYPE_CALCULATED = $0002; + {$EXTERNALSYM MDLEVEL_TYPE_CALCULATED} + MDLEVEL_TYPE_TIME = $0004; + {$EXTERNALSYM MDLEVEL_TYPE_TIME} + MDLEVEL_TYPE_RESERVED1 = $0008; + {$EXTERNALSYM MDLEVEL_TYPE_RESERVED1} + MDLEVEL_TYPE_TIME_YEARS = $0014; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_YEARS} + MDLEVEL_TYPE_TIME_HALF_YEAR = $0024; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_HALF_YEAR} + MDLEVEL_TYPE_TIME_QUARTERS = $0044; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_QUARTERS} + MDLEVEL_TYPE_TIME_MONTHS = $0084; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_MONTHS} + MDLEVEL_TYPE_TIME_WEEKS = $0104; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_WEEKS} + MDLEVEL_TYPE_TIME_DAYS = $0204; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_DAYS} + MDLEVEL_TYPE_TIME_HOURS = $0304; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_HOURS} + MDLEVEL_TYPE_TIME_MINUTES = $0404; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_MINUTES} + MDLEVEL_TYPE_TIME_SECONDS = $0804; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_SECONDS} + MDLEVEL_TYPE_TIME_UNDEFINED = $1004; + {$EXTERNALSYM MDLEVEL_TYPE_TIME_UNDEFINED} + MDMEASURE_AGGR_UNKNOWN = $00; + {$EXTERNALSYM MDMEASURE_AGGR_UNKNOWN} + MDMEASURE_AGGR_SUM = $01; + {$EXTERNALSYM MDMEASURE_AGGR_SUM} + MDMEASURE_AGGR_COUNT = $02; + {$EXTERNALSYM MDMEASURE_AGGR_COUNT} + MDMEASURE_AGGR_MIN = $03; + {$EXTERNALSYM MDMEASURE_AGGR_MIN} + MDMEASURE_AGGR_MAX = $04; + {$EXTERNALSYM MDMEASURE_AGGR_MAX} + MDMEASURE_AGGR_AVG = $05; + {$EXTERNALSYM MDMEASURE_AGGR_AVG} + MDMEASURE_AGGR_VAR = $06; + {$EXTERNALSYM MDMEASURE_AGGR_VAR} + MDMEASURE_AGGR_STD = $07; + {$EXTERNALSYM MDMEASURE_AGGR_STD} + MDMEASURE_AGGR_CALCULATED = $7f; + {$EXTERNALSYM MDMEASURE_AGGR_CALCULATED} + MDPROP_MEMBER = $01; + {$EXTERNALSYM MDPROP_MEMBER} + MDPROP_CELL = $02; + {$EXTERNALSYM MDPROP_CELL} + MDMEMBER_TYPE_UNKNOWN = $00; + {$EXTERNALSYM MDMEMBER_TYPE_UNKNOWN} + MDMEMBER_TYPE_REGULAR = $01; + {$EXTERNALSYM MDMEMBER_TYPE_REGULAR} + MDMEMBER_TYPE_ALL = $02; + {$EXTERNALSYM MDMEMBER_TYPE_ALL} + MDMEMBER_TYPE_MEASURE = $03; + {$EXTERNALSYM MDMEMBER_TYPE_MEASURE} + MDMEMBER_TYPE_FORMULA = $04; + {$EXTERNALSYM MDMEMBER_TYPE_FORMULA} + MDMEMBER_TYPE_RESERVE1 = $05; + {$EXTERNALSYM MDMEMBER_TYPE_RESERVE1} + MDMEMBER_TYPE_RESERVE2 = $06; + {$EXTERNALSYM MDMEMBER_TYPE_RESERVE2} + MDMEMBER_TYPE_RESERVE3 = $07; + {$EXTERNALSYM MDMEMBER_TYPE_RESERVE3} + MDMEMBER_TYPE_RESERVE4 = $08; + {$EXTERNALSYM MDMEMBER_TYPE_RESERVE4} + MDDISPINFO_DRILLED_DOWN = $00010000; + {$EXTERNALSYM MDDISPINFO_DRILLED_DOWN} + MDDISPINFO_PARENT_SAME_AS_PREV = $00020000; + {$EXTERNALSYM MDDISPINFO_PARENT_SAME_AS_PREV} + DB_COUNTUNAVAILABLE = -1; + {$EXTERNALSYM DB_COUNTUNAVAILABLE} + MDFF_BOLD = $01; + {$EXTERNALSYM MDFF_BOLD} + MDFF_ITALIC = $02; + {$EXTERNALSYM MDFF_ITALIC} + MDFF_UNDERLINE = $04; + {$EXTERNALSYM MDFF_UNDERLINE} + MDFF_STRIKEOUT = $08; + {$EXTERNALSYM MDFF_STRIKEOUT} + MDAXIS_COLUMNS = $00000000; + {$EXTERNALSYM MDAXIS_COLUMNS} + MDAXIS_ROWS = $00000001; + {$EXTERNALSYM MDAXIS_ROWS} + MDAXIS_PAGES = $00000002; + {$EXTERNALSYM MDAXIS_PAGES} + MDAXIS_SECTIONS = $00000003; + {$EXTERNALSYM MDAXIS_SECTIONS} + MDAXIS_CHAPTERS = $00000004; + {$EXTERNALSYM MDAXIS_CHAPTERS} + MDAXIS_SLICERS = $ffffffff; + {$EXTERNALSYM MDAXIS_SLICERS} + GENERATE_METHOD_EXACT = 0; + {$EXTERNALSYM GENERATE_METHOD_EXACT} + GENERATE_METHOD_PREFIX = 1; + {$EXTERNALSYM GENERATE_METHOD_PREFIX} + GENERATE_METHOD_INFLECT = 2; + {$EXTERNALSYM GENERATE_METHOD_INFLECT} + PROPID_QUERY_RANKVECTOR = $2; + {$EXTERNALSYM PROPID_QUERY_RANKVECTOR} + PROPID_QUERY_RANK = $3; + {$EXTERNALSYM PROPID_QUERY_RANK} + PROPID_QUERY_HITCOUNT = $4; + {$EXTERNALSYM PROPID_QUERY_HITCOUNT} + PROPID_QUERY_ALL = $6; + {$EXTERNALSYM PROPID_QUERY_ALL} + PROPID_STG_CONTENTS = $13; + {$EXTERNALSYM PROPID_STG_CONTENTS} + VECTOR_RANK_MIN = 0; + {$EXTERNALSYM VECTOR_RANK_MIN} + VECTOR_RANK_MAX = 1; + {$EXTERNALSYM VECTOR_RANK_MAX} + VECTOR_RANK_INNER = 2; + {$EXTERNALSYM VECTOR_RANK_INNER} + VECTOR_RANK_DICE = 3; + {$EXTERNALSYM VECTOR_RANK_DICE} + VECTOR_RANK_JACCARD = 4; + {$EXTERNALSYM VECTOR_RANK_JACCARD} + DBSETFUNC_NONE = $0; + {$EXTERNALSYM DBSETFUNC_NONE} + DBSETFUNC_ALL = $1; + {$EXTERNALSYM DBSETFUNC_ALL} + DBSETFUNC_DISTINCT = $2; + {$EXTERNALSYM DBSETFUNC_DISTINCT} + PROXIMITY_UNIT_WORD = 0; + {$EXTERNALSYM PROXIMITY_UNIT_WORD} + PROXIMITY_UNIT_SENTENCE = 1; + {$EXTERNALSYM PROXIMITY_UNIT_SENTENCE} + PROXIMITY_UNIT_PARAGRAPH = 2; + {$EXTERNALSYM PROXIMITY_UNIT_PARAGRAPH} + PROXIMITY_UNIT_CHAPTER = 3; + {$EXTERNALSYM PROXIMITY_UNIT_CHAPTER} + CRESTRICTIONS_DBSCHEMA_ASSERTIONS = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_ASSERTIONS} + CRESTRICTIONS_DBSCHEMA_CATALOGS = 1; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_CATALOGS} + CRESTRICTIONS_DBSCHEMA_CHARACTER_SETS = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_CHARACTER_SETS} + CRESTRICTIONS_DBSCHEMA_COLLATIONS = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_COLLATIONS} + CRESTRICTIONS_DBSCHEMA_COLUMNS = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_COLUMNS} + CRESTRICTIONS_DBSCHEMA_CHECK_CONSTRAINTS = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_CHECK_CONSTRAINTS} + CRESTRICTIONS_DBSCHEMA_CONSTRAINT_COLUMN_USAGE = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_CONSTRAINT_COLUMN_USAGE} + CRESTRICTIONS_DBSCHEMA_CONSTRAINT_TABLE_USAGE = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_CONSTRAINT_TABLE_USAGE} + CRESTRICTIONS_DBSCHEMA_KEY_COLUMN_USAGE = 7; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_KEY_COLUMN_USAGE} + CRESTRICTIONS_DBSCHEMA_REFERENTIAL_CONSTRAINTS = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_REFERENTIAL_CONSTRAINTS} + CRESTRICTIONS_DBSCHEMA_TABLE_CONSTRAINTS = 7; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_TABLE_CONSTRAINTS} + CRESTRICTIONS_DBSCHEMA_COLUMN_DOMAIN_USAGE = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_COLUMN_DOMAIN_USAGE} + CRESTRICTIONS_DBSCHEMA_INDEXES = 5; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_INDEXES} + CRESTRICTIONS_DBSCHEMA_OBJECT_ACTIONS = 1; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_OBJECT_ACTIONS} + CRESTRICTIONS_DBSCHEMA_OBJECTS = 1; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_OBJECTS} + CRESTRICTIONS_DBSCHEMA_COLUMN_PRIVILEGES = 6; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_COLUMN_PRIVILEGES} + CRESTRICTIONS_DBSCHEMA_TABLE_PRIVILEGES = 5; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_TABLE_PRIVILEGES} + CRESTRICTIONS_DBSCHEMA_USAGE_PRIVILEGES = 6; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_USAGE_PRIVILEGES} + CRESTRICTIONS_DBSCHEMA_PROCEDURES = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_PROCEDURES} + CRESTRICTIONS_DBSCHEMA_SCHEMATA = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_SCHEMATA} + CRESTRICTIONS_DBSCHEMA_SQL_LANGUAGES = 0; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_SQL_LANGUAGES} + CRESTRICTIONS_DBSCHEMA_STATISTICS = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_STATISTICS} + CRESTRICTIONS_DBSCHEMA_TABLES = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_TABLES} + CRESTRICTIONS_DBSCHEMA_TRANSLATIONS = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_TRANSLATIONS} + CRESTRICTIONS_DBSCHEMA_PROVIDER_TYPES = 2; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_PROVIDER_TYPES} + CRESTRICTIONS_DBSCHEMA_VIEWS = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_VIEWS} + CRESTRICTIONS_DBSCHEMA_VIEW_COLUMN_USAGE = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_VIEW_COLUMN_USAGE} + CRESTRICTIONS_DBSCHEMA_VIEW_TABLE_USAGE = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_VIEW_TABLE_USAGE} + CRESTRICTIONS_DBSCHEMA_PROCEDURE_PARAMETERS = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_PROCEDURE_PARAMETERS} + CRESTRICTIONS_DBSCHEMA_FOREIGN_KEYS = 6; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_FOREIGN_KEYS} + CRESTRICTIONS_DBSCHEMA_PRIMARY_KEYS = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_PRIMARY_KEYS} + CRESTRICTIONS_DBSCHEMA_PROCEDURE_COLUMNS = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_PROCEDURE_COLUMNS} + CRESTRICTIONS_DBSCHEMA_TABLES_INFO = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_TABLES_INFO} + CRESTRICTIONS_MDSCHEMA_CUBES = 3; + {$EXTERNALSYM CRESTRICTIONS_MDSCHEMA_CUBES} + CRESTRICTIONS_MDSCHEMA_DIMENSIONS = 5; + {$EXTERNALSYM CRESTRICTIONS_MDSCHEMA_DIMENSIONS} + CRESTRICTIONS_MDSCHEMA_HIERARCHIES = 6; + {$EXTERNALSYM CRESTRICTIONS_MDSCHEMA_HIERARCHIES} + CRESTRICTIONS_MDSCHEMA_LEVELS = 7; + {$EXTERNALSYM CRESTRICTIONS_MDSCHEMA_LEVELS} + CRESTRICTIONS_MDSCHEMA_MEASURES = 5; + {$EXTERNALSYM CRESTRICTIONS_MDSCHEMA_MEASURES} + CRESTRICTIONS_MDSCHEMA_PROPERTIES = 9; + {$EXTERNALSYM CRESTRICTIONS_MDSCHEMA_PROPERTIES} + CRESTRICTIONS_MDSCHEMA_MEMBERS = 12; + {$EXTERNALSYM CRESTRICTIONS_MDSCHEMA_MEMBERS} + +// *********************************************************************// +// Declaration of Enumerations // +// *********************************************************************// + +// TX_MISC_CONSTANTS constants + +type + TOleEnum = Integer; + TX_MISC_CONSTANTS = TOleEnum; + {$EXTERNALSYM TX_MISC_CONSTANTS} +const + MAX_TRAN_DESC = $00000028; + {$EXTERNALSYM MAX_TRAN_DESC} + +// ISOLATIONLEVEL constants +type + ISOLATIONLEVEL = TOleEnum; + {$EXTERNALSYM ISOLATIONLEVEL} +const + ISOLATIONLEVEL_UNSPECIFIED = $FFFFFFFF; + {$EXTERNALSYM ISOLATIONLEVEL_UNSPECIFIED} + ISOLATIONLEVEL_CHAOS = $00000010; + {$EXTERNALSYM ISOLATIONLEVEL_CHAOS} + ISOLATIONLEVEL_READUNCOMMITTED = $00000100; + {$EXTERNALSYM ISOLATIONLEVEL_READUNCOMMITTED} + ISOLATIONLEVEL_BROWSE = $00000100; + {$EXTERNALSYM ISOLATIONLEVEL_BROWSE} + ISOLATIONLEVEL_CURSORSTABILITY = $00001000; + {$EXTERNALSYM ISOLATIONLEVEL_CURSORSTABILITY} + ISOLATIONLEVEL_READCOMMITTED = $00001000; + {$EXTERNALSYM ISOLATIONLEVEL_READCOMMITTED} + ISOLATIONLEVEL_REPEATABLEREAD = $00010000; + {$EXTERNALSYM ISOLATIONLEVEL_REPEATABLEREAD} + ISOLATIONLEVEL_SERIALIZABLE = $00100000; + {$EXTERNALSYM ISOLATIONLEVEL_SERIALIZABLE} + ISOLATIONLEVEL_ISOLATED = $00100000; + {$EXTERNALSYM ISOLATIONLEVEL_ISOLATED} + ISOLATIONLEVEL_SNAPSHOT = $01000000; + {$EXTERNALSYM ISOLATIONLEVEL_SNAPSHOT} + +// ISOFLAG constants +type + ISOFLAG = TOleEnum; + {$EXTERNALSYM ISOFLAG} +const + ISOFLAG_RETAIN_COMMIT_DC = $00000001; + {$EXTERNALSYM ISOFLAG_RETAIN_COMMIT_DC} + ISOFLAG_RETAIN_COMMIT = $00000002; + {$EXTERNALSYM ISOFLAG_RETAIN_COMMIT} + ISOFLAG_RETAIN_COMMIT_NO = $00000003; + {$EXTERNALSYM ISOFLAG_RETAIN_COMMIT_NO} + ISOFLAG_RETAIN_ABORT_DC = $00000004; + {$EXTERNALSYM ISOFLAG_RETAIN_ABORT_DC} + ISOFLAG_RETAIN_ABORT = $00000008; + {$EXTERNALSYM ISOFLAG_RETAIN_ABORT} + ISOFLAG_RETAIN_ABORT_NO = $0000000C; + {$EXTERNALSYM ISOFLAG_RETAIN_ABORT_NO} + ISOFLAG_RETAIN_DONTCARE = $00000005; + {$EXTERNALSYM ISOFLAG_RETAIN_ABORT_NO} + ISOFLAG_RETAIN_BOTH = $0000000A; + {$EXTERNALSYM ISOFLAG_RETAIN_BOTH} + ISOFLAG_RETAIN_NONE = $0000000F; + {$EXTERNALSYM ISOFLAG_RETAIN_NONE} + ISOFLAG_OPTIMISTIC = $00000010; + {$EXTERNALSYM ISOFLAG_OPTIMISTIC} + ISOFLAG_READONLY = $00000020; + {$EXTERNALSYM ISOFLAG_READONLY} + +// XACTTC constants +type + XACTTC = TOleEnum; + {$EXTERNALSYM XACTTC} +const + XACTTC_SYNC_PHASEONE = $00000001; + {$EXTERNALSYM XACTTC_SYNC_PHASEONE} + XACTTC_SYNC_PHASETWO = $00000002; + {$EXTERNALSYM XACTTC_SYNC_PHASETWO} + XACTTC_SYNC = $00000002; + {$EXTERNALSYM XACTTC_SYNC} + XACTTC_ASYNC_PHASEONE = $00000004; + {$EXTERNALSYM XACTTC_ASYNC_PHASEONE} + XACTTC_ASYNC = $00000004; + {$EXTERNALSYM XACTTC_ASYNC} + +// XACTRM constants +type + XACTRM = TOleEnum; + {$EXTERNALSYM XACTRM} +const + XACTRM_OPTIMISTICLASTWINS = $00000001; + {$EXTERNALSYM XACTRM_OPTIMISTICLASTWINS} + XACTRM_NOREADONLYPREPARES = $00000002; + {$EXTERNALSYM XACTRM_NOREADONLYPREPARES} + +// XACTCONST constants +type + XACTCONST = TOleEnum; + {$EXTERNALSYM XACTCONST} +const + XACTCONST_TIMEOUTINFINITE = $00000000; + {$EXTERNALSYM XACTCONST_TIMEOUTINFINITE} + +// XACTHEURISTIC constants +type + XACTHEURISTIC = TOleEnum; + {$EXTERNALSYM XACTHEURISTIC} +const + XACTHEURISTIC_ABORT = $00000001; + {$EXTERNALSYM XACTHEURISTIC_ABORT} + XACTHEURISTIC_COMMIT = $00000002; + {$EXTERNALSYM XACTHEURISTIC_COMMIT} + XACTHEURISTIC_DAMAGE = $00000003; + {$EXTERNALSYM XACTHEURISTIC_DAMAGE} + XACTHEURISTIC_DANGER = $00000004; + {$EXTERNALSYM XACTHEURISTIC_DANGER} + +// XACTSTAT constants +type + XACTSTAT = TOleEnum; + {$EXTERNALSYM XACTSTAT} +const + XACTSTAT_NONE = $00000000; + {$EXTERNALSYM XACTSTAT_NONE} + XACTSTAT_OPENNORMAL = $00000001; + {$EXTERNALSYM XACTSTAT_OPENNORMAL} + XACTSTAT_OPENREFUSED = $00000002; + {$EXTERNALSYM XACTSTAT_OPENREFUSED} + XACTSTAT_PREPARING = $00000004; + {$EXTERNALSYM XACTSTAT_PREPARING} + XACTSTAT_PREPARED = $00000008; + {$EXTERNALSYM XACTSTAT_PREPARED} + XACTSTAT_PREPARERETAINING = $00000010; + {$EXTERNALSYM XACTSTAT_PREPARERETAINING} + XACTSTAT_PREPARERETAINED = $00000020; + {$EXTERNALSYM XACTSTAT_PREPARERETAINED} + XACTSTAT_COMMITTING = $00000040; + {$EXTERNALSYM XACTSTAT_COMMITTING} + XACTSTAT_COMMITRETAINING = $00000080; + {$EXTERNALSYM XACTSTAT_COMMITRETAINING} + XACTSTAT_ABORTING = $00000100; + {$EXTERNALSYM XACTSTAT_ABORTING} + XACTSTAT_ABORTED = $00000200; + {$EXTERNALSYM XACTSTAT_ABORTED} + XACTSTAT_COMMITTED = $00000400; + {$EXTERNALSYM XACTSTAT_COMMITTED} + XACTSTAT_HEURISTIC_ABORT = $00000800; + {$EXTERNALSYM XACTSTAT_HEURISTIC_ABORT} + XACTSTAT_HEURISTIC_COMMIT = $00001000; + {$EXTERNALSYM XACTSTAT_HEURISTIC_COMMIT} + XACTSTAT_HEURISTIC_DAMAGE = $00002000; + {$EXTERNALSYM XACTSTAT_HEURISTIC_DAMAGE} + XACTSTAT_HEURISTIC_DANGER = $00004000; + {$EXTERNALSYM XACTSTAT_HEURISTIC_DANGER} + XACTSTAT_FORCED_ABORT = $00008000; + {$EXTERNALSYM XACTSTAT_FORCED_ABORT} + XACTSTAT_FORCED_COMMIT = $00010000; + {$EXTERNALSYM XACTSTAT_FORCED_COMMIT} + XACTSTAT_INDOUBT = $00020000; + {$EXTERNALSYM XACTSTAT_INDOUBT} + XACTSTAT_CLOSED = $00040000; + {$EXTERNALSYM XACTSTAT_CLOSED} + XACTSTAT_OPEN = $00000003; + {$EXTERNALSYM XACTSTAT_OPEN} + XACTSTAT_NOTPREPARED = $0007FFC3; + {$EXTERNALSYM XACTSTAT_NOTPREPARED} + XACTSTAT_ALL = $0007FFFF; + {$EXTERNALSYM XACTSTAT_ALL} + +// XACT_E constants +type + XACT_E = TOleEnum; + {$EXTERNALSYM XACT_E} +const + XACT_E_FIRST = $8004D000; + {$EXTERNALSYM XACT_E_FIRST} + XACT_E_LAST = $8004D01E; + {$EXTERNALSYM XACT_E_LAST} + XACT_S_FIRST = $0004D000; + {$EXTERNALSYM XACT_S_FIRST} + XACT_S_LAST = $0004D009; + {$EXTERNALSYM XACT_S_LAST} + XACT_E_ALREADYOTHERSINGLEPHASE = $8004D000; + {$EXTERNALSYM XACT_E_ALREADYOTHERSINGLEPHASE} + XACT_E_CANTRETAIN = $8004D001; + {$EXTERNALSYM XACT_E_CANTRETAIN} + XACT_E_COMMITFAILED = $8004D002; + {$EXTERNALSYM XACT_E_COMMITFAILED} + XACT_E_COMMITPREVENTED = $8004D003; + {$EXTERNALSYM XACT_E_COMMITPREVENTED} + XACT_E_HEURISTICABORT = $8004D004; + {$EXTERNALSYM XACT_E_HEURISTICABORT} + XACT_E_HEURISTICCOMMIT = $8004D005; + {$EXTERNALSYM XACT_E_HEURISTICCOMMIT} + XACT_E_HEURISTICDAMAGE = $8004D006; + {$EXTERNALSYM XACT_E_HEURISTICDAMAGE} + XACT_E_HEURISTICDANGER = $8004D007; + {$EXTERNALSYM XACT_E_HEURISTICDANGER} + XACT_E_ISOLATIONLEVEL = $8004D008; + {$EXTERNALSYM XACT_E_ISOLATIONLEVEL} + XACT_E_NOASYNC = $8004D009; + {$EXTERNALSYM XACT_E_NOASYNC} + XACT_E_NOENLIST = $8004D00A; + {$EXTERNALSYM XACT_E_NOENLIST} + XACT_E_NOISORETAIN = $8004D00B; + {$EXTERNALSYM XACT_E_NOISORETAIN} + XACT_E_NORESOURCE = $8004D00C; + {$EXTERNALSYM XACT_E_NORESOURCE} + XACT_E_NOTCURRENT = $8004D00D; + {$EXTERNALSYM XACT_E_NOTCURRENT} + XACT_E_NOTRANSACTION = $8004D00E; + {$EXTERNALSYM XACT_E_NOTRANSACTION} + XACT_E_NOTSUPPORTED = $8004D00F; + {$EXTERNALSYM XACT_E_NOTSUPPORTED} + XACT_E_UNKNOWNRMGRID = $8004D010; + {$EXTERNALSYM XACT_E_UNKNOWNRMGRID} + XACT_E_WRONGSTATE = $8004D011; + {$EXTERNALSYM XACT_E_WRONGSTATE} + XACT_E_WRONGUOW = $8004D012; + {$EXTERNALSYM XACT_E_WRONGUOW} + XACT_E_XTIONEXISTS = $8004D013; + {$EXTERNALSYM XACT_E_XTIONEXISTS} + XACT_E_NOIMPORTOBJECT = $8004D014; + {$EXTERNALSYM XACT_E_NOIMPORTOBJECT} + XACT_E_INVALIDCOOKIE = $8004D015; + {$EXTERNALSYM XACT_E_INVALIDCOOKIE} + XACT_E_INDOUBT = $8004D016; + {$EXTERNALSYM XACT_E_INDOUBT} + XACT_E_NOTIMEOUT = $8004D017; + {$EXTERNALSYM XACT_E_NOTIMEOUT} + XACT_E_ALREADYINPROGRESS = $8004D018; + {$EXTERNALSYM XACT_E_ALREADYINPROGRESS} + XACT_E_ABORTED = $8004D019; + {$EXTERNALSYM XACT_E_ABORTED} + XACT_E_LOGFULL = $8004D01A; + {$EXTERNALSYM XACT_E_LOGFULL} + XACT_E_TMNOTAVAILABLE = $8004D01B; + {$EXTERNALSYM XACT_E_TMNOTAVAILABLE} + XACT_E_CONNECTION_DOWN = $8004D01C; + {$EXTERNALSYM XACT_E_CONNECTION_DOWN} + XACT_E_CONNECTION_DENIED = $8004D01D; + {$EXTERNALSYM XACT_E_CONNECTION_DENIED} + XACT_E_REENLISTTIMEOUT = $8004D01E; + {$EXTERNALSYM XACT_E_REENLISTTIMEOUT} + XACT_S_ASYNC = $0004D000; + {$EXTERNALSYM XACT_S_ASYNC} + XACT_S_DEFECT = $0004D001; + {$EXTERNALSYM XACT_S_DEFECT} + XACT_S_READONLY = $0004D002; + {$EXTERNALSYM XACT_S_READONLY} + XACT_S_SOMENORETAIN = $0004D003; + {$EXTERNALSYM XACT_S_SOMENORETAIN} + XACT_S_OKINFORM = $0004D004; + {$EXTERNALSYM XACT_S_OKINFORM} + XACT_S_MADECHANGESCONTENT = $0004D005; + {$EXTERNALSYM XACT_S_MADECHANGESCONTENT} + XACT_S_MADECHANGESINFORM = $0004D006; + {$EXTERNALSYM XACT_S_MADECHANGESINFORM} + XACT_S_ALLNORETAIN = $0004D007; + {$EXTERNALSYM XACT_S_ALLNORETAIN} + XACT_S_ABORTING = $0004D008; + {$EXTERNALSYM XACT_S_ABORTING} + XACT_S_SINGLEPHASE = $0004D009; + {$EXTERNALSYM XACT_S_SINGLEPHASE} + +// DBKINDENUM constants +type + DBKINDENUM = TOleEnum; + {$EXTERNALSYM DBKINDENUM} +const + DBKIND_GUID_NAME = $00000000; + {$EXTERNALSYM DBKIND_GUID_NAME} + DBKIND_GUID_PROPID = $00000001; + {$EXTERNALSYM DBKIND_GUID_PROPID} + DBKIND_NAME = $00000002; + {$EXTERNALSYM DBKIND_NAME} + DBKIND_PGUID_NAME = $00000003; + {$EXTERNALSYM DBKIND_PGUID_NAME} + DBKIND_PGUID_PROPID = $00000004; + {$EXTERNALSYM DBKIND_PGUID_PROPID} + DBKIND_PROPID = $00000005; + {$EXTERNALSYM DBKIND_PROPID} + DBKIND_GUID = $00000006; + {$EXTERNALSYM DBKIND_GUID} + +const + DBTYPE_EMPTY = $00000000; + {$EXTERNALSYM DBTYPE_EMPTY} + DBTYPE_NULL = $00000001; + {$EXTERNALSYM DBTYPE_NULL} + DBTYPE_I2 = $00000002; + {$EXTERNALSYM DBTYPE_I2} + DBTYPE_I4 = $00000003; + {$EXTERNALSYM DBTYPE_I4} + DBTYPE_R4 = $00000004; + {$EXTERNALSYM DBTYPE_R4} + DBTYPE_R8 = $00000005; + {$EXTERNALSYM DBTYPE_R8} + DBTYPE_CY = $00000006; + {$EXTERNALSYM DBTYPE_CY} + DBTYPE_DATE = $00000007; + {$EXTERNALSYM DBTYPE_DATE} + DBTYPE_BSTR = $00000008; + {$EXTERNALSYM DBTYPE_BSTR} + DBTYPE_IDISPATCH = $00000009; + {$EXTERNALSYM DBTYPE_IDISPATCH} + DBTYPE_ERROR = $0000000A; + {$EXTERNALSYM DBTYPE_ERROR} + DBTYPE_BOOL = $0000000B; + {$EXTERNALSYM DBTYPE_BOOL} + DBTYPE_VARIANT = $0000000C; + {$EXTERNALSYM DBTYPE_VARIANT} + DBTYPE_IUNKNOWN = $0000000D; + {$EXTERNALSYM DBTYPE_IUNKNOWN} + DBTYPE_DECIMAL = $0000000E; + {$EXTERNALSYM DBTYPE_DECIMAL} + DBTYPE_UI1 = $00000011; + {$EXTERNALSYM DBTYPE_UI1} + DBTYPE_ARRAY = $00002000; + {$EXTERNALSYM DBTYPE_ARRAY} + DBTYPE_BYREF = $00004000; + {$EXTERNALSYM DBTYPE_BYREF} + DBTYPE_I1 = $00000010; + {$EXTERNALSYM DBTYPE_I1} + DBTYPE_UI2 = $00000012; + {$EXTERNALSYM DBTYPE_UI2} + DBTYPE_UI4 = $00000013; + {$EXTERNALSYM DBTYPE_UI4} + DBTYPE_I8 = $00000014; + {$EXTERNALSYM DBTYPE_I8} + DBTYPE_UI8 = $00000015; + {$EXTERNALSYM DBTYPE_UI8} + DBTYPE_GUID = $00000048; + {$EXTERNALSYM DBTYPE_GUID} + DBTYPE_VECTOR = $00001000; + {$EXTERNALSYM DBTYPE_VECTOR} + DBTYPE_RESERVED = $00008000; + {$EXTERNALSYM DBTYPE_RESERVED} + DBTYPE_BYTES = $00000080; + {$EXTERNALSYM DBTYPE_BYTES} + DBTYPE_STR = $00000081; + {$EXTERNALSYM DBTYPE_STR} + DBTYPE_WSTR = $00000082; + {$EXTERNALSYM DBTYPE_WSTR} + DBTYPE_NUMERIC = $00000083; + {$EXTERNALSYM DBTYPE_NUMERIC} + DBTYPE_UDT = $00000084; + {$EXTERNALSYM DBTYPE_UDT} + DBTYPE_DBDATE = $00000085; + {$EXTERNALSYM DBTYPE_DBDATE} + DBTYPE_DBTIME = $00000086; + {$EXTERNALSYM DBTYPE_DBTIME} + DBTYPE_DBTIMESTAMP = $00000087; + {$EXTERNALSYM DBTYPE_DBTIMESTAMP} + DBTYPE_XML = $0000008D; // introduced in SQL 2005 + {$EXTERNALSYM DBTYPE_XML} + +// DBTYPEENUM constants +type + DBTYPEENUM = TOleEnum; + {$EXTERNALSYM DBTYPEENUM} + +// DBTYPEENUM15 constants +type + DBTYPEENUM15 = TOleEnum; + {$EXTERNALSYM DBTYPEENUM15} +const + DBTYPE_HCHAPTER = $00000088; + {$EXTERNALSYM DBTYPE_HCHAPTER} + +// DBTYPEENUM20 constants +type + DBTYPEENUM20 = TOleEnum; + {$EXTERNALSYM DBTYPEENUM20} +const + DBTYPE_FILETIME = $00000040; + {$EXTERNALSYM DBTYPE_FILETIME} + DBTYPE_DBFILETIME = $00000089; + {$EXTERNALSYM DBTYPE_DBFILETIME} + DBTYPE_PROPVARIANT = $0000008A; + {$EXTERNALSYM DBTYPE_PROPVARIANT} + DBTYPE_VARNUMERIC = $0000008B; + {$EXTERNALSYM DBTYPE_VARNUMERIC} + +// DBPARTENUM constants +type + DBPARTENUM = TOleEnum; + {$EXTERNALSYM DBPARTENUM} +const + DBPART_INVALID = $00000000; + {$EXTERNALSYM DBPART_INVALID} + DBPART_VALUE = $00000001; + {$EXTERNALSYM DBPART_VALUE} + DBPART_LENGTH = $00000002; + {$EXTERNALSYM DBPART_LENGTH} + DBPART_STATUS = $00000004; + {$EXTERNALSYM DBPART_STATUS} + +// DBPARAMIOENUM constants +type + DBPARAMIOENUM = TOleEnum; + {$EXTERNALSYM DBPARAMIOENUM} +const + DBPARAMIO_NOTPARAM = $00000000; + {$EXTERNALSYM DBPARAMIO_NOTPARAM} + DBPARAMIO_INPUT = $00000001; + {$EXTERNALSYM DBPARAMIO_INPUT} + DBPARAMIO_OUTPUT = $00000002; + {$EXTERNALSYM DBPARAMIO_OUTPUT} + +// DBBINDFLAGENUM constants +type + DBBINDFLAGENUM = TOleEnum; + {$EXTERNALSYM DBBINDFLAGENUM} +const + DBBINDFLAG_HTML = $00000001; + {$EXTERNALSYM DBBINDFLAG_HTML} + +// DBMEMOWNERENUM constants +type + DBMEMOWNERENUM = TOleEnum; + {$EXTERNALSYM DBMEMOWNERENUM} +const + DBMEMOWNER_CLIENTOWNED = $00000000; + {$EXTERNALSYM DBMEMOWNER_CLIENTOWNED} + DBMEMOWNER_PROVIDEROWNED = $00000001; + {$EXTERNALSYM DBMEMOWNER_PROVIDEROWNED} + +// DBSTATUSENUM constants +type + DBSTATUSENUM = TOleEnum; + {$EXTERNALSYM DBSTATUSENUM} +const + DBSTATUS_S_OK = $00000000; + {$EXTERNALSYM DBSTATUS_S_OK} + DBSTATUS_E_BADACCESSOR = $00000001; + {$EXTERNALSYM DBSTATUS_E_BADACCESSOR} + DBSTATUS_E_CANTCONVERTVALUE = $00000002; + {$EXTERNALSYM DBSTATUS_E_CANTCONVERTVALUE} + DBSTATUS_S_ISNULL = $00000003; + {$EXTERNALSYM DBSTATUS_S_ISNULL} + DBSTATUS_S_TRUNCATED = $00000004; + {$EXTERNALSYM DBSTATUS_S_TRUNCATED} + DBSTATUS_E_SIGNMISMATCH = $00000005; + {$EXTERNALSYM DBSTATUS_E_SIGNMISMATCH} + DBSTATUS_E_DATAOVERFLOW = $00000006; + {$EXTERNALSYM DBSTATUS_E_DATAOVERFLOW} + DBSTATUS_E_CANTCREATE = $00000007; + {$EXTERNALSYM DBSTATUS_E_CANTCREATE} + DBSTATUS_E_UNAVAILABLE = $00000008; + {$EXTERNALSYM DBSTATUS_E_UNAVAILABLE} + DBSTATUS_E_PERMISSIONDENIED = $00000009; + {$EXTERNALSYM DBSTATUS_E_PERMISSIONDENIED} + DBSTATUS_E_INTEGRITYVIOLATION = $0000000A; + {$EXTERNALSYM DBSTATUS_E_INTEGRITYVIOLATION} + DBSTATUS_E_SCHEMAVIOLATION = $0000000B; + {$EXTERNALSYM DBSTATUS_E_SCHEMAVIOLATION} + DBSTATUS_E_BADSTATUS = $0000000C; + {$EXTERNALSYM DBSTATUS_E_BADSTATUS} + DBSTATUS_S_DEFAULT = $0000000D; + {$EXTERNALSYM DBSTATUS_S_DEFAULT} + +// DBSTATUSENUM20 constants +type + DBSTATUSENUM20 = TOleEnum; + {$EXTERNALSYM DBSTATUSENUM20} +const + MDSTATUS_S_CELLEMPTY = $0000000E; + {$EXTERNALSYM MDSTATUS_S_CELLEMPTY} + DBSTATUS_S_IGNORE = $0000000F; + {$EXTERNALSYM DBSTATUS_S_IGNORE} + +// DBROWSTATUSENUM constants +type + DBROWSTATUSENUM = TOleEnum; + {$EXTERNALSYM DBROWSTATUSENUM} +const + DBROWSTATUS_S_OK = $00000000; + {$EXTERNALSYM DBROWSTATUS_S_OK} + DBROWSTATUS_S_MULTIPLECHANGES = $00000002; + {$EXTERNALSYM DBROWSTATUS_S_MULTIPLECHANGES} + DBROWSTATUS_S_PENDINGCHANGES = $00000003; + {$EXTERNALSYM DBROWSTATUS_S_PENDINGCHANGES} + DBROWSTATUS_E_CANCELED = $00000004; + {$EXTERNALSYM DBROWSTATUS_E_CANCELED} + DBROWSTATUS_E_CANTRELEASE = $00000006; + {$EXTERNALSYM DBROWSTATUS_E_CANTRELEASE} + DBROWSTATUS_E_CONCURRENCYVIOLATION = $00000007; + {$EXTERNALSYM DBROWSTATUS_E_CONCURRENCYVIOLATION} + DBROWSTATUS_E_DELETED = $00000008; + {$EXTERNALSYM DBROWSTATUS_E_DELETED} + DBROWSTATUS_E_PENDINGINSERT = $00000009; + {$EXTERNALSYM DBROWSTATUS_E_PENDINGINSERT} + DBROWSTATUS_E_NEWLYINSERTED = $0000000A; + {$EXTERNALSYM DBROWSTATUS_E_NEWLYINSERTED} + DBROWSTATUS_E_INTEGRITYVIOLATION = $0000000B; + {$EXTERNALSYM DBROWSTATUS_E_INTEGRITYVIOLATION} + DBROWSTATUS_E_INVALID = $0000000C; + {$EXTERNALSYM DBROWSTATUS_E_INVALID} + DBROWSTATUS_E_MAXPENDCHANGESEXCEEDED = $0000000D; + {$EXTERNALSYM DBROWSTATUS_E_MAXPENDCHANGESEXCEEDED} + DBROWSTATUS_E_OBJECTOPEN = $0000000E; + {$EXTERNALSYM DBROWSTATUS_E_OBJECTOPEN} + DBROWSTATUS_E_OUTOFMEMORY = $0000000F; + {$EXTERNALSYM DBROWSTATUS_E_OUTOFMEMORY} + DBROWSTATUS_E_PERMISSIONDENIED = $00000010; + {$EXTERNALSYM DBROWSTATUS_E_PERMISSIONDENIED} + DBROWSTATUS_E_LIMITREACHED = $00000011; + {$EXTERNALSYM DBROWSTATUS_E_LIMITREACHED} + DBROWSTATUS_E_SCHEMAVIOLATION = $00000012; + {$EXTERNALSYM DBROWSTATUS_E_SCHEMAVIOLATION} + DBROWSTATUS_E_FAIL = $00000013; + {$EXTERNALSYM DBROWSTATUS_E_FAIL} + +// DBROWSTATUSENUM20 constants +type + DBROWSTATUSENUM20 = TOleEnum; + {$EXTERNALSYM DBROWSTATUSENUM20} +const + DBROWSTATUS_S_NOCHANGE = $00000014; + {$EXTERNALSYM DBROWSTATUS_S_NOCHANGE} + +// DBCOLUMNFLAGSENUM constants +type + DBCOLUMNFLAGSENUM = TOleEnum; + {$EXTERNALSYM DBCOLUMNFLAGSENUM} +const + DBCOLUMNFLAGS_ISBOOKMARK = $00000001; + {$EXTERNALSYM DBCOLUMNFLAGS_ISBOOKMARK} + DBCOLUMNFLAGS_MAYDEFER = $00000002; + {$EXTERNALSYM DBCOLUMNFLAGS_MAYDEFER} + DBCOLUMNFLAGS_WRITE = $00000004; + {$EXTERNALSYM DBCOLUMNFLAGS_WRITE} + DBCOLUMNFLAGS_WRITEUNKNOWN = $00000008; + {$EXTERNALSYM DBCOLUMNFLAGS_WRITEUNKNOWN} + DBCOLUMNFLAGS_ISFIXEDLENGTH = $00000010; + {$EXTERNALSYM DBCOLUMNFLAGS_ISFIXEDLENGTH} + DBCOLUMNFLAGS_ISNULLABLE = $00000020; + {$EXTERNALSYM DBCOLUMNFLAGS_ISNULLABLE} + DBCOLUMNFLAGS_MAYBENULL = $00000040; + {$EXTERNALSYM DBCOLUMNFLAGS_MAYBENULL} + DBCOLUMNFLAGS_ISLONG = $00000080; + {$EXTERNALSYM DBCOLUMNFLAGS_ISLONG} + DBCOLUMNFLAGS_ISROWID = $00000100; + {$EXTERNALSYM DBCOLUMNFLAGS_ISROWID} + DBCOLUMNFLAGS_ISROWVER = $00000200; + {$EXTERNALSYM DBCOLUMNFLAGS_ISROWVER} + DBCOLUMNFLAGS_CACHEDEFERRED = $00001000; + {$EXTERNALSYM DBCOLUMNFLAGS_CACHEDEFERRED} + +// DBCOLUMNFLAGSENUM20 constants +type + DBCOLUMNFLAGSENUM20 = TOleEnum; + {$EXTERNALSYM DBCOLUMNFLAGSENUM20} +const + DBCOLUMNFLAGS_SCALEISNEGATIVE = $00004000; + {$EXTERNALSYM DBCOLUMNFLAGS_SCALEISNEGATIVE} + DBCOLUMNFLAGS_KEYCOLUMN = $00008000; + {$EXTERNALSYM DBCOLUMNFLAGS_KEYCOLUMN} + +// DBCOLUMNFLAGS15ENUM constants +type + DBCOLUMNFLAGS15ENUM = TOleEnum; + {$EXTERNALSYM DBCOLUMNFLAGS15ENUM} +const + DBCOLUMNFLAGS_ISCHAPTER = $00002000; + {$EXTERNALSYM DBCOLUMNFLAGS_ISCHAPTER} + +// DBBOOKMARK constants +type + DBBOOKMARK = TOleEnum; + {$EXTERNALSYM DBBOOKMARK} +const + DBBMK_INVALID = $00000000; + {$EXTERNALSYM DBBMK_INVALID} + DBBMK_FIRST = $00000001; + {$EXTERNALSYM DBBMK_FIRST} + DBBMK_LAST = $00000002; + {$EXTERNALSYM DBBMK_LAST} + +// DBPROPENUM constants +type + DBPROPENUM = TOleEnum; + {$EXTERNALSYM DBPROPENUM} +const + DBPROP_ABORTPRESERVE = $00000002; + {$EXTERNALSYM DBPROP_ABORTPRESERVE} + DBPROP_ACTIVESESSIONS = $00000003; + {$EXTERNALSYM DBPROP_ACTIVESESSIONS} + DBPROP_APPENDONLY = $000000BB; + {$EXTERNALSYM DBPROP_APPENDONLY} + DBPROP_ASYNCTXNABORT = $000000A8; + {$EXTERNALSYM DBPROP_ASYNCTXNABORT} + DBPROP_ASYNCTXNCOMMIT = $00000004; + {$EXTERNALSYM DBPROP_ASYNCTXNCOMMIT} + DBPROP_AUTH_CACHE_AUTHINFO = $00000005; + {$EXTERNALSYM DBPROP_AUTH_CACHE_AUTHINFO} + DBPROP_AUTH_ENCRYPT_PASSWORD = $00000006; + {$EXTERNALSYM DBPROP_AUTH_ENCRYPT_PASSWORD} + DBPROP_AUTH_INTEGRATED = $00000007; + {$EXTERNALSYM DBPROP_AUTH_INTEGRATED} + DBPROP_AUTH_MASK_PASSWORD = $00000008; + {$EXTERNALSYM DBPROP_AUTH_MASK_PASSWORD} + DBPROP_AUTH_PASSWORD = $00000009; + {$EXTERNALSYM DBPROP_AUTH_PASSWORD} + DBPROP_AUTH_PERSIST_ENCRYPTED = $0000000A; + {$EXTERNALSYM DBPROP_AUTH_PERSIST_ENCRYPTED} + DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO = $0000000B; + {$EXTERNALSYM DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO} + DBPROP_AUTH_USERID = $0000000C; + {$EXTERNALSYM DBPROP_AUTH_USERID} + DBPROP_BLOCKINGSTORAGEOBJECTS = $0000000D; + {$EXTERNALSYM DBPROP_BLOCKINGSTORAGEOBJECTS} + DBPROP_BOOKMARKS = $0000000E; + {$EXTERNALSYM DBPROP_BOOKMARKS} + DBPROP_BOOKMARKSKIPPED = $0000000F; + {$EXTERNALSYM DBPROP_BOOKMARKSKIPPED} + DBPROP_BOOKMARKTYPE = $00000010; + {$EXTERNALSYM DBPROP_BOOKMARKTYPE} + DBPROP_BYREFACCESSORS = $00000078; + {$EXTERNALSYM DBPROP_BYREFACCESSORS} + DBPROP_CACHEDEFERRED = $00000011; + {$EXTERNALSYM DBPROP_CACHEDEFERRED} + DBPROP_CANFETCHBACKWARDS = $00000012; + {$EXTERNALSYM DBPROP_CANFETCHBACKWARDS} + DBPROP_CANHOLDROWS = $00000013; + {$EXTERNALSYM DBPROP_CANHOLDROWS} + DBPROP_CANSCROLLBACKWARDS = $00000015; + {$EXTERNALSYM DBPROP_CANSCROLLBACKWARDS} + DBPROP_CATALOGLOCATION = $00000016; + {$EXTERNALSYM DBPROP_CATALOGLOCATION} + DBPROP_CATALOGTERM = $00000017; + {$EXTERNALSYM DBPROP_CATALOGTERM} + DBPROP_CATALOGUSAGE = $00000018; + {$EXTERNALSYM DBPROP_CATALOGUSAGE} + DBPROP_CHANGEINSERTEDROWS = $000000BC; + {$EXTERNALSYM DBPROP_CHANGEINSERTEDROWS} + DBPROP_COL_AUTOINCREMENT = $0000001A; + {$EXTERNALSYM DBPROP_COL_AUTOINCREMENT} + DBPROP_COL_DEFAULT = $0000001B; + {$EXTERNALSYM DBPROP_COL_DEFAULT} + DBPROP_COL_DESCRIPTION = $0000001C; + {$EXTERNALSYM DBPROP_COL_DESCRIPTION} + DBPROP_COL_FIXEDLENGTH = $000000A7; + {$EXTERNALSYM DBPROP_COL_FIXEDLENGTH} + DBPROP_COL_NULLABLE = $0000001D; + {$EXTERNALSYM DBPROP_COL_NULLABLE} + DBPROP_COL_PRIMARYKEY = $0000001E; + {$EXTERNALSYM DBPROP_COL_PRIMARYKEY} + DBPROP_COL_UNIQUE = $0000001F; + {$EXTERNALSYM DBPROP_COL_UNIQUE} + DBPROP_COLUMNDEFINITION = $00000020; + {$EXTERNALSYM DBPROP_COLUMNDEFINITION} + DBPROP_COLUMNRESTRICT = $00000021; + {$EXTERNALSYM DBPROP_COLUMNRESTRICT} + DBPROP_COMMANDTIMEOUT = $00000022; + {$EXTERNALSYM DBPROP_COMMANDTIMEOUT} + DBPROP_COMMITPRESERVE = $00000023; + {$EXTERNALSYM DBPROP_COMMITPRESERVE} + DBPROP_CONCATNULLBEHAVIOR = $00000024; + {$EXTERNALSYM DBPROP_CONCATNULLBEHAVIOR} + DBPROP_CURRENTCATALOG = $00000025; + {$EXTERNALSYM DBPROP_CURRENTCATALOG} + DBPROP_DATASOURCENAME = $00000026; + {$EXTERNALSYM DBPROP_DATASOURCENAME} + DBPROP_DATASOURCEREADONLY = $00000027; + {$EXTERNALSYM DBPROP_DATASOURCEREADONLY} + DBPROP_DBMSNAME = $00000028; + {$EXTERNALSYM DBPROP_DBMSNAME} + DBPROP_DBMSVER = $00000029; + {$EXTERNALSYM DBPROP_DBMSVER} + DBPROP_DEFERRED = $0000002A; + {$EXTERNALSYM DBPROP_DEFERRED} + DBPROP_DELAYSTORAGEOBJECTS = $0000002B; + {$EXTERNALSYM DBPROP_DELAYSTORAGEOBJECTS} + DBPROP_DSOTHREADMODEL = $000000A9; + {$EXTERNALSYM DBPROP_DSOTHREADMODEL} + DBPROP_GROUPBY = $0000002C; + {$EXTERNALSYM DBPROP_GROUPBY} + DBPROP_HETEROGENEOUSTABLES = $0000002D; + {$EXTERNALSYM DBPROP_HETEROGENEOUSTABLES} + DBPROP_IAccessor = $00000079; + {$EXTERNALSYM DBPROP_IAccessor} + DBPROP_IColumnsInfo = $0000007A; + {$EXTERNALSYM DBPROP_IColumnsInfo} + DBPROP_IColumnsRowset = $0000007B; + {$EXTERNALSYM DBPROP_IColumnsRowset} + DBPROP_IConnectionPointContainer = $0000007C; + {$EXTERNALSYM DBPROP_IConnectionPointContainer} + DBPROP_IConvertType = $000000C2; + {$EXTERNALSYM DBPROP_IConvertType} + DBPROP_IRowset = $0000007E; + {$EXTERNALSYM DBPROP_IRowset} + DBPROP_IRowsetChange = $0000007F; + {$EXTERNALSYM DBPROP_IRowsetChange} + DBPROP_IRowsetIdentity = $00000080; + {$EXTERNALSYM DBPROP_IRowsetIdentity} + DBPROP_IRowsetIndex = $0000009F; + {$EXTERNALSYM DBPROP_IRowsetIndex} + DBPROP_IRowsetInfo = $00000081; + {$EXTERNALSYM DBPROP_IRowsetInfo} + DBPROP_IRowsetLocate = $00000082; + {$EXTERNALSYM DBPROP_IRowsetLocate} + DBPROP_IRowsetResynch = $00000084; + {$EXTERNALSYM DBPROP_IRowsetResynch} + DBPROP_IRowsetScroll = $00000085; + {$EXTERNALSYM DBPROP_IRowsetScroll} + DBPROP_IRowsetUpdate = $00000086; + {$EXTERNALSYM DBPROP_IRowsetUpdate} + DBPROP_ISupportErrorInfo = $00000087; + {$EXTERNALSYM DBPROP_ISupportErrorInfo} + DBPROP_ILockBytes = $00000088; + {$EXTERNALSYM DBPROP_ILockBytes} + DBPROP_ISequentialStream = $00000089; + {$EXTERNALSYM DBPROP_ISequentialStream} + DBPROP_IStorage = $0000008A; + {$EXTERNALSYM DBPROP_IStorage} + DBPROP_IStream = $0000008B; + {$EXTERNALSYM DBPROP_IStream} + DBPROP_IDENTIFIERCASE = $0000002E; + {$EXTERNALSYM DBPROP_IDENTIFIERCASE} + DBPROP_IMMOBILEROWS = $0000002F; + {$EXTERNALSYM DBPROP_IMMOBILEROWS} + DBPROP_INDEX_AUTOUPDATE = $00000030; + {$EXTERNALSYM DBPROP_INDEX_AUTOUPDATE} + DBPROP_INDEX_CLUSTERED = $00000031; + {$EXTERNALSYM DBPROP_INDEX_CLUSTERED} + DBPROP_INDEX_FILLFACTOR = $00000032; + {$EXTERNALSYM DBPROP_INDEX_FILLFACTOR} + DBPROP_INDEX_INITIALSIZE = $00000033; + {$EXTERNALSYM DBPROP_INDEX_INITIALSIZE} + DBPROP_INDEX_NULLCOLLATION = $00000034; + {$EXTERNALSYM DBPROP_INDEX_NULLCOLLATION} + DBPROP_INDEX_NULLS = $00000035; + {$EXTERNALSYM DBPROP_INDEX_NULLS} + DBPROP_INDEX_PRIMARYKEY = $00000036; + {$EXTERNALSYM DBPROP_INDEX_PRIMARYKEY} + DBPROP_INDEX_SORTBOOKMARKS = $00000037; + {$EXTERNALSYM DBPROP_INDEX_SORTBOOKMARKS} + DBPROP_INDEX_TEMPINDEX = $000000A3; + {$EXTERNALSYM DBPROP_INDEX_TEMPINDEX} + DBPROP_INDEX_TYPE = $00000038; + {$EXTERNALSYM DBPROP_INDEX_TYPE} + DBPROP_INDEX_UNIQUE = $00000039; + {$EXTERNALSYM DBPROP_INDEX_UNIQUE} + DBPROP_INIT_DATASOURCE = $0000003B; + {$EXTERNALSYM DBPROP_INIT_DATASOURCE} + DBPROP_INIT_HWND = $0000003C; + {$EXTERNALSYM DBPROP_INIT_HWND} + DBPROP_INIT_IMPERSONATION_LEVEL = $0000003D; + {$EXTERNALSYM DBPROP_INIT_IMPERSONATION_LEVEL} + DBPROP_INIT_LCID = $000000BA; + {$EXTERNALSYM DBPROP_INIT_LCID} + DBPROP_INIT_LOCATION = $0000003E; + {$EXTERNALSYM DBPROP_INIT_LOCATION} + DBPROP_INIT_MODE = $0000003F; + {$EXTERNALSYM DBPROP_INIT_MODE} + DBPROP_INIT_PROMPT = $00000040; + {$EXTERNALSYM DBPROP_INIT_PROMPT} + DBPROP_INIT_PROTECTION_LEVEL = $00000041; + {$EXTERNALSYM DBPROP_INIT_PROTECTION_LEVEL} + DBPROP_INIT_PROVIDERSTRING = $000000A0; + {$EXTERNALSYM DBPROP_INIT_PROVIDERSTRING} + DBPROP_INIT_TIMEOUT = $00000042; + {$EXTERNALSYM DBPROP_INIT_TIMEOUT} + DBPROP_LITERALBOOKMARKS = $00000043; + {$EXTERNALSYM DBPROP_LITERALBOOKMARKS} + DBPROP_LITERALIDENTITY = $00000044; + {$EXTERNALSYM DBPROP_LITERALIDENTITY} + DBPROP_MARSHALLABLE = $000000C5; + {$EXTERNALSYM DBPROP_MARSHALLABLE} + DBPROP_MAXINDEXSIZE = $00000046; + {$EXTERNALSYM DBPROP_MAXINDEXSIZE} + DBPROP_MAXOPENROWS = $00000047; + {$EXTERNALSYM DBPROP_MAXOPENROWS} + DBPROP_MAXPENDINGROWS = $00000048; + {$EXTERNALSYM DBPROP_MAXPENDINGROWS} + DBPROP_MAXROWS = $00000049; + {$EXTERNALSYM DBPROP_MAXROWS} + DBPROP_MAXROWSIZE = $0000004A; + {$EXTERNALSYM DBPROP_MAXROWSIZE} + DBPROP_MAXROWSIZEINCLUDESBLOB = $0000004B; + {$EXTERNALSYM DBPROP_MAXROWSIZEINCLUDESBLOB} + DBPROP_MAXTABLESINSELECT = $0000004C; + {$EXTERNALSYM DBPROP_MAXTABLESINSELECT} + DBPROP_MAYWRITECOLUMN = $0000004D; + {$EXTERNALSYM DBPROP_MAYWRITECOLUMN} + DBPROP_MEMORYUSAGE = $0000004E; + {$EXTERNALSYM DBPROP_MEMORYUSAGE} + DBPROP_MULTIPLEPARAMSETS = $000000BF; + {$EXTERNALSYM DBPROP_MULTIPLEPARAMSETS} + DBPROP_MULTIPLERESULTS = $000000C4; + {$EXTERNALSYM DBPROP_MULTIPLERESULTS} + DBPROP_MULTIPLESTORAGEOBJECTS = $00000050; + {$EXTERNALSYM DBPROP_MULTIPLESTORAGEOBJECTS} + DBPROP_MULTITABLEUPDATE = $00000051; + {$EXTERNALSYM DBPROP_MULTITABLEUPDATE} + DBPROP_NOTIFICATIONGRANULARITY = $000000C6; + {$EXTERNALSYM DBPROP_NOTIFICATIONGRANULARITY} + DBPROP_NOTIFICATIONPHASES = $00000052; + {$EXTERNALSYM DBPROP_NOTIFICATIONPHASES} + DBPROP_NOTIFYCOLUMNSET = $000000AB; + {$EXTERNALSYM DBPROP_NOTIFYCOLUMNSET} + DBPROP_NOTIFYROWDELETE = $000000AD; + {$EXTERNALSYM DBPROP_NOTIFYROWDELETE} + DBPROP_NOTIFYROWFIRSTCHANGE = $000000AE; + {$EXTERNALSYM DBPROP_NOTIFYROWFIRSTCHANGE} + DBPROP_NOTIFYROWINSERT = $000000AF; + {$EXTERNALSYM DBPROP_NOTIFYROWINSERT} + DBPROP_NOTIFYROWRESYNCH = $000000B1; + {$EXTERNALSYM DBPROP_NOTIFYROWRESYNCH} + DBPROP_NOTIFYROWSETCHANGED = $000000D3; + {$EXTERNALSYM DBPROP_NOTIFYROWSETCHANGED} + DBPROP_NOTIFYROWSETRELEASE = $000000B2; + {$EXTERNALSYM DBPROP_NOTIFYROWSETRELEASE} + DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE = $000000B3; + {$EXTERNALSYM DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE} + DBPROP_NOTIFYROWUNDOCHANGE = $000000B4; + {$EXTERNALSYM DBPROP_NOTIFYROWUNDOCHANGE} + DBPROP_NOTIFYROWUNDODELETE = $000000B5; + {$EXTERNALSYM DBPROP_NOTIFYROWUNDODELETE} + DBPROP_NOTIFYROWUNDOINSERT = $000000B6; + {$EXTERNALSYM DBPROP_NOTIFYROWUNDOINSERT} + DBPROP_NOTIFYROWUPDATE = $000000B7; + {$EXTERNALSYM DBPROP_NOTIFYROWUPDATE} + DBPROP_NULLCOLLATION = $00000053; + {$EXTERNALSYM DBPROP_NULLCOLLATION} + DBPROP_OLEOBJECTS = $00000054; + {$EXTERNALSYM DBPROP_OLEOBJECTS} + DBPROP_ORDERBYCOLUMNSINSELECT = $00000055; + {$EXTERNALSYM DBPROP_ORDERBYCOLUMNSINSELECT} + DBPROP_ORDEREDBOOKMARKS = $00000056; + {$EXTERNALSYM DBPROP_ORDEREDBOOKMARKS} + DBPROP_OTHERINSERT = $00000057; + {$EXTERNALSYM DBPROP_OTHERINSERT} + DBPROP_OTHERUPDATEDELETE = $00000058; + {$EXTERNALSYM DBPROP_OTHERUPDATEDELETE} + DBPROP_OUTPUTPARAMETERAVAILABILITY = $000000B8; + {$EXTERNALSYM DBPROP_OUTPUTPARAMETERAVAILABILITY} + DBPROP_OWNINSERT = $00000059; + {$EXTERNALSYM DBPROP_OWNINSERT} + DBPROP_OWNUPDATEDELETE = $0000005A; + {$EXTERNALSYM DBPROP_OWNUPDATEDELETE} + DBPROP_PERSISTENTIDTYPE = $000000B9; + {$EXTERNALSYM DBPROP_PERSISTENTIDTYPE} + DBPROP_PREPAREABORTBEHAVIOR = $0000005B; + {$EXTERNALSYM DBPROP_PREPAREABORTBEHAVIOR} + DBPROP_PREPARECOMMITBEHAVIOR = $0000005C; + {$EXTERNALSYM DBPROP_PREPARECOMMITBEHAVIOR} + DBPROP_PROCEDURETERM = $0000005D; + {$EXTERNALSYM DBPROP_PROCEDURETERM} + DBPROP_PROVIDERNAME = $00000060; + {$EXTERNALSYM DBPROP_PROVIDERNAME} + DBPROP_PROVIDERFILENAME = DBPROP_PROVIDERNAME; + {$EXTERNALSYM DBPROP_PROVIDERFILENAME} + DBPROP_PROVIDEROLEDBVER = $00000061; + {$EXTERNALSYM DBPROP_PROVIDEROLEDBVER} + DBPROP_PROVIDERVER = $00000062; + {$EXTERNALSYM DBPROP_PROVIDERVER} + DBPROP_QUICKRESTART = $00000063; + {$EXTERNALSYM DBPROP_QUICKRESTART} + DBPROP_QUOTEDIDENTIFIERCASE = $00000064; + {$EXTERNALSYM DBPROP_QUOTEDIDENTIFIERCASE} + DBPROP_REENTRANTEVENTS = $00000065; + {$EXTERNALSYM DBPROP_REENTRANTEVENTS} + DBPROP_REMOVEDELETED = $00000066; + {$EXTERNALSYM DBPROP_REMOVEDELETED} + DBPROP_REPORTMULTIPLECHANGES = $00000067; + {$EXTERNALSYM DBPROP_REPORTMULTIPLECHANGES} + DBPROP_RETURNPENDINGINSERTS = $000000BD; + {$EXTERNALSYM DBPROP_RETURNPENDINGINSERTS} + DBPROP_ROWRESTRICT = $00000068; + {$EXTERNALSYM DBPROP_ROWRESTRICT} + DBPROP_ROWSETCONVERSIONSONCOMMAND = $000000C0; + {$EXTERNALSYM DBPROP_ROWSETCONVERSIONSONCOMMAND} + DBPROP_ROWTHREADMODEL = $00000069; + {$EXTERNALSYM DBPROP_ROWTHREADMODEL} + DBPROP_SCHEMATERM = $0000006A; + {$EXTERNALSYM DBPROP_SCHEMATERM} + DBPROP_SCHEMAUSAGE = $0000006B; + {$EXTERNALSYM DBPROP_SCHEMAUSAGE} + DBPROP_SERVERCURSOR = $0000006C; + {$EXTERNALSYM DBPROP_SERVERCURSOR} + DBPROP_SESS_AUTOCOMMITISOLEVELS = $000000BE; + {$EXTERNALSYM DBPROP_SESS_AUTOCOMMITISOLEVELS} + DBPROP_SQLSUPPORT = $0000006D; + {$EXTERNALSYM DBPROP_SQLSUPPORT} + DBPROP_STRONGIDENTITY = $00000077; + {$EXTERNALSYM DBPROP_STRONGIDENTITY} + DBPROP_STRUCTUREDSTORAGE = $0000006F; + {$EXTERNALSYM DBPROP_STRUCTUREDSTORAGE} + DBPROP_SUBQUERIES = $00000070; + {$EXTERNALSYM DBPROP_SUBQUERIES} + DBPROP_SUPPORTEDTXNDDL = $000000A1; + {$EXTERNALSYM DBPROP_SUPPORTEDTXNDDL} + DBPROP_SUPPORTEDTXNISOLEVELS = $00000071; + {$EXTERNALSYM DBPROP_SUPPORTEDTXNISOLEVELS} + DBPROP_SUPPORTEDTXNISORETAIN = $00000072; + {$EXTERNALSYM DBPROP_SUPPORTEDTXNISORETAIN} + DBPROP_TABLETERM = $00000073; + {$EXTERNALSYM DBPROP_TABLETERM} + DBPROP_TBL_TEMPTABLE = $0000008C; + {$EXTERNALSYM DBPROP_TBL_TEMPTABLE} + DBPROP_TRANSACTEDOBJECT = $00000074; + {$EXTERNALSYM DBPROP_TRANSACTEDOBJECT} + DBPROP_UPDATABILITY = $00000075; + {$EXTERNALSYM DBPROP_UPDATABILITY} + DBPROP_USERNAME = $00000076; + {$EXTERNALSYM DBPROP_USERNAME} + +// DBPROPENUM15 constants +type + DBPROPENUM15 = TOleEnum; + {$EXTERNALSYM DBPROPENUM15} +const + DBPROP_FILTEROPS = $000000D0; + {$EXTERNALSYM DBPROP_FILTEROPS} + DBPROP_FILTERCOMPAREOPS = $000000D1; + {$EXTERNALSYM DBPROP_FILTERCOMPAREOPS} + DBPROP_FINDCOMPAREOPS = $000000D2; + {$EXTERNALSYM DBPROP_FINDCOMPAREOPS} + DBPROP_IChapteredRowset = $000000CA; + {$EXTERNALSYM DBPROP_IChapteredRowset} + DBPROP_IDBAsynchStatus = $000000CB; + {$EXTERNALSYM DBPROP_IDBAsynchStatus} + DBPROP_IRowsetFind = $000000CC; + {$EXTERNALSYM DBPROP_IRowsetFind} + DBPROP_IRowsetView = $000000D4; + {$EXTERNALSYM DBPROP_IRowsetView} + DBPROP_IViewChapter = $000000D5; + {$EXTERNALSYM DBPROP_IViewChapter} + DBPROP_IViewFilter = $000000D6; + {$EXTERNALSYM DBPROP_IViewFilter} + DBPROP_IViewRowset = $000000D7; + {$EXTERNALSYM DBPROP_IViewRowset} + DBPROP_IViewSort = $000000D8; + {$EXTERNALSYM DBPROP_IViewSort} + DBPROP_INIT_ASYNCH = $000000C8; + {$EXTERNALSYM DBPROP_INIT_ASYNCH} + DBPROP_MAXOPENCHAPTERS = $000000C7; + {$EXTERNALSYM DBPROP_MAXOPENCHAPTERS} + DBPROP_MAXORSINFILTER = $000000CD; + {$EXTERNALSYM DBPROP_MAXORSINFILTER} + DBPROP_MAXSORTCOLUMNS = $000000CE; + {$EXTERNALSYM DBPROP_MAXSORTCOLUMNS} + DBPROP_ROWSET_ASYNCH = $000000C9; + {$EXTERNALSYM DBPROP_ROWSET_ASYNCH} + DBPROP_SORTONINDEX = $000000CF; + {$EXTERNALSYM DBPROP_SORTONINDEX} + +// DBPROPENUM20 constants +type + DBPROPENUM20 = TOleEnum; + {$EXTERNALSYM DBPROPENUM20} +const + DBPROP_IMultipleResults = $000000D9; + {$EXTERNALSYM DBPROP_IMultipleResults} + DBPROP_DATASOURCE_TYPE = $000000FB; + {$EXTERNALSYM DBPROP_DATASOURCE_TYPE} + MDPROP_AXES = $000000FC; + {$EXTERNALSYM MDPROP_AXES} + MDPROP_FLATTENING_SUPPORT = $000000FD; + {$EXTERNALSYM MDPROP_FLATTENING_SUPPORT} + MDPROP_MDX_JOINCUBES = $000000FE; + {$EXTERNALSYM MDPROP_MDX_JOINCUBES} + MDPROP_NAMED_LEVELS = $000000FF; + {$EXTERNALSYM MDPROP_NAMED_LEVELS} + MDPROP_RANGEROWSET = $00000100; + {$EXTERNALSYM MDPROP_RANGEROWSET} + MDPROP_MDX_SLICER = $000000DA; + {$EXTERNALSYM MDPROP_MDX_SLICER} + MDPROP_MDX_CUBEQUALIFICATION = $000000DB; + {$EXTERNALSYM MDPROP_MDX_CUBEQUALIFICATION} + MDPROP_MDX_OUTERREFERENCE = $000000DC; + {$EXTERNALSYM MDPROP_MDX_OUTERREFERENCE} + MDPROP_MDX_QUERYBYPROPERTY = $000000DD; + {$EXTERNALSYM MDPROP_MDX_QUERYBYPROPERTY} + MDPROP_MDX_CASESUPPORT = $000000DE; + {$EXTERNALSYM MDPROP_MDX_CASESUPPORT} + MDPROP_MDX_STRING_COMPOP = $000000E0; + {$EXTERNALSYM MDPROP_MDX_STRING_COMPOP} + MDPROP_MDX_DESCFLAGS = $000000E1; + {$EXTERNALSYM MDPROP_MDX_DESCFLAGS} + MDPROP_MDX_SET_FUNCTIONS = $000000E2; + {$EXTERNALSYM MDPROP_MDX_SET_FUNCTIONS} + MDPROP_MDX_MEMBER_FUNCTIONS = $000000E3; + {$EXTERNALSYM MDPROP_MDX_MEMBER_FUNCTIONS} + MDPROP_MDX_NUMERIC_FUNCTIONS = $000000E4; + {$EXTERNALSYM MDPROP_MDX_NUMERIC_FUNCTIONS} + MDPROP_MDX_FORMULAS = $000000E5; + {$EXTERNALSYM MDPROP_MDX_FORMULAS} + MDPROP_MDX_AGGREGATECELL_UPDATE = $000000E6; + {$EXTERNALSYM MDPROP_MDX_AGGREGATECELL_UPDATE} + DBPROP_ACCESSORDER = $000000E7; + {$EXTERNALSYM DBPROP_ACCESSORDER} + DBPROP_BOOKMARKINFO = $000000E8; + {$EXTERNALSYM DBPROP_BOOKMARKINFO} + DBPROP_INIT_CATALOG = $000000E9; + {$EXTERNALSYM DBPROP_INIT_CATALOG} + DBPROP_ROW_BULKOPS = $000000EA; + {$EXTERNALSYM DBPROP_ROW_BULKOPS} + DBPROP_PROVIDERFRIENDLYNAME = $000000EB; + {$EXTERNALSYM DBPROP_PROVIDERFRIENDLYNAME} + DBPROP_LOCKMODE = $000000EC; + {$EXTERNALSYM DBPROP_LOCKMODE} + DBPROP_MULTIPLECONNECTIONS = $000000ED; + {$EXTERNALSYM DBPROP_MULTIPLECONNECTIONS} + DBPROP_UNIQUEROWS = $000000EE; + {$EXTERNALSYM DBPROP_UNIQUEROWS} + DBPROP_SERVERDATAONINSERT = $000000EF; + {$EXTERNALSYM DBPROP_SERVERDATAONINSERT} + DBPROP_STORAGEFLAGS = $000000F0; + {$EXTERNALSYM DBPROP_STORAGEFLAGS} + DBPROP_CONNECTIONSTATUS = $000000F4; + {$EXTERNALSYM DBPROP_CONNECTIONSTATUS} + DBPROP_ALTERCOLUMN = $000000F5; + {$EXTERNALSYM DBPROP_ALTERCOLUMN} + DBPROP_COLUMNLCID = $000000F6; + {$EXTERNALSYM DBPROP_COLUMNLCID} + DBPROP_RESETDATASOURCE = $000000F7; + {$EXTERNALSYM DBPROP_RESETDATASOURCE} + DBPROP_INIT_OLEDBSERVICES = $000000F8; + {$EXTERNALSYM DBPROP_INIT_OLEDBSERVICES} + DBPROP_IRowsetRefresh = $000000F9; + {$EXTERNALSYM DBPROP_IRowsetRefresh} + DBPROP_SERVERNAME = $000000FA; + {$EXTERNALSYM DBPROP_SERVERNAME} + DBPROP_IParentRowset = $00000101; + {$EXTERNALSYM DBPROP_IParentRowset} + DBPROP_HIDDENCOLUMNS = $00000102; + {$EXTERNALSYM DBPROP_HIDDENCOLUMNS} + DBPROP_PROVIDERMEMORY = $00000103; + {$EXTERNALSYM DBPROP_PROVIDERMEMORY} + DBPROP_CLIENTCURSOR = $00000104; + {$EXTERNALSYM DBPROP_CLIENTCURSOR} + +// DBPROPENUM21 constants +type + DBPROPENUM21 = TOleEnum; + {$EXTERNALSYM DBPROPENUM21} +const + DBPROP_TRUSTEE_USERNAME = $000000F1; + {$EXTERNALSYM DBPROP_TRUSTEE_USERNAME} + DBPROP_TRUSTEE_AUTHENTICATION = $000000F2; + {$EXTERNALSYM DBPROP_TRUSTEE_AUTHENTICATION} + DBPROP_TRUSTEE_NEWAUTHENTICATION = $000000F3; + {$EXTERNALSYM DBPROP_TRUSTEE_NEWAUTHENTICATION} + +// DBPROPENUM25 constants +type + DBPROPENUM25 = TOleEnum; + {$EXTERNALSYM DBPROPENUM25} +const + DBPROP_ICommandCost = $0000008D; + {$EXTERNALSYM DBPROP_ICommandCost} + DBPROP_ICommandTree = $0000008E; + {$EXTERNALSYM DBPROP_ICommandTree} + DBPROP_ICommandValidate = $0000008F; + {$EXTERNALSYM DBPROP_ICommandValidate} + DBPROP_IDBSchemaCommand = $00000090; + {$EXTERNALSYM DBPROP_IDBSchemaCommand} + DBPROP_IProvideMoniker = $0000007D; + {$EXTERNALSYM DBPROP_IProvideMoniker} + DBPROP_IQuery = $00000092; + {$EXTERNALSYM DBPROP_IQuery} + DBPROP_IReadData = $00000093; + {$EXTERNALSYM DBPROP_IReadData} + DBPROP_IRowsetAsynch = $00000094; + {$EXTERNALSYM DBPROP_IRowsetAsynch} + DBPROP_IRowsetKeys = $00000097; + {$EXTERNALSYM DBPROP_IRowsetKeys} + DBPROP_IRowsetNewRowAfter = $00000098; + {$EXTERNALSYM DBPROP_IRowsetNewRowAfter} + DBPROP_IRowsetNextRowset = $00000099; + {$EXTERNALSYM DBPROP_IRowsetNextRowset} + DBPROP_IRowsetWatchAll = $0000009B; + {$EXTERNALSYM DBPROP_IRowsetWatchAll} + DBPROP_IRowsetWatchNotify = $0000009C; + {$EXTERNALSYM DBPROP_IRowsetWatchNotify} + DBPROP_IRowsetWatchRegion = $0000009D; + {$EXTERNALSYM DBPROP_IRowsetWatchRegion} + DBPROP_IRowsetWithParameters = $0000009E; + {$EXTERNALSYM DBPROP_IRowsetWithParameters} + +// SQL Everywhere Provider specific properties +const + DBPROP_SSCE_COL_ROWGUID = $000001F9; // SSCE_COLUMN + DBPROP_SSCE_MAXBUFFERSIZE = $000001FA; // SSCE_DBINIT + DBPROP_SSCE_DBPASSWORD = $000001FB; // SSCE_DBINIT + DBPROP_SSCE_ENCRYPTDATABASE = $000001FC; // SSCE_DBINIT + DBPROP_SSCE_DEFAULT_LOCK_ESCALATION = $000001FD; // SSCE_DBINIT + DBPROP_SSCE_TEMPFILE_DIRECTORY = $000001FE; // SSCE_DBINIT + DBPROP_SSCE_DEFAULT_LOCK_TIMEOUT = $000001FF; // SSCE_DBINIT + DBPROP_SSCE_TRANSACTION_COMMIT_MODE = $00000200; // SSCE_SESSION + DBPROP_SSCE_LOCK_TIMEOUT = $00000201; // SSCE_SESSION + DBPROP_SSCE_AUTO_SHRINK_THRESHOLD = $00000202; // SSCE_DBINIT + DBPROP_SSCE_FLUSH_INTERVAL = $00000206; // SSCE_DBINIT + DBPROP_SSCE_MAX_DATABASE_SIZE = $0000020B; // SSCE_DBINIT + DBPROP_SSCE_LOCK_ESCALATION = $0000020C; // SSCE_SESSION + DBPROP_SSCE_LOCK_HINT = $0000020D; // SSCE_ROWSET + DBPROP_SSCE_TEMPFILE_MAX_SIZE = $0000020E; // SSCE_DBINIT + +// Enumeration values for DBPROP_SSCE_LOCK_HINT: +const + DBPROPVAL_SSCE_LH_ROWLOCK = $00000001; // Row-level locking + DBPROPVAL_SSCE_LH_PAGLOCK = $00000002; // Page-level locking + DBPROPVAL_SSCE_LH_TABLOCK = $00000004; // Table-level locking + DBPROPVAL_SSCE_LH_DBLOCK = $00000008; // Database-level locking + DBPROPVAL_SSCE_LH_NOLOCK = $00000010; // No lock option + DBPROPVAL_SSCE_LH_HOLDLOCK = $00000020; // Hold lock option + DBPROPVAL_SSCE_LH_UPDLOCK = $00000040; // Update lock type + DBPROPVAL_SSCE_LH_XLOCK = $00000080; // Exclusive lock type + +// Enumeration values for DBPROP_SSCE_TRANSACTION_COMMIT_MODE: +const + DBPROPVAL_SSCE_TCM_DEFAULT = $00000000; // Asynchronously commit transactions to disk + DBPROPVAL_SSCE_TCM_FLUSH = $00000001; // Synchronously commit transactions to disk + + // Bit mask specifying which properties in DBPROPSET_SSCE_DBINIT + // were not honored when creating / opening the data source. This + // bit mask is returned as the first parameter in the error object + // if the minor error code is SSCE_M_INITPROPCONFLICT + SSCE_DBINIT_CONFLICT_MAXBUFFERSIZE = $00000001; + SSCE_DBINIT_CONFLICT_AUTO_SHRINK_THRESHOLD = $00000004; + SSCE_DBINIT_CONFLICT_FLUSH_INTERVAL = $00000008; + SSCE_DBINIT_CONFLICT_MAX_DATABASE_SIZE = $00000020; + SSCE_DBINIT_CONFLICT_TEMPFILE_DIRECTORY = $00000040; + SSCE_DBINIT_CONFLICT_DEFAULTESCALATION = $00000080; + SSCE_DBINIT_CONFLICT_DEFAULTTIMEOUT = $00000100; + SSCE_DBINIT_CONFLICT_MAX_TMPDB_SIZE = $00000200; + +// DBPROPENUMDEPRECATED constants +type + DBPROPENUMDEPRECATED = TOleEnum; + {$EXTERNALSYM DBPROPENUMDEPRECATED} +const + DBPROP_IRowsetExactScroll = $0000009A; + {$EXTERNALSYM DBPROP_IRowsetExactScroll} + +// DBCOMMANDOPENUM constants +type + DBCOMMANDOPENUM = TOleEnum; + {$EXTERNALSYM DBCOMMANDOPENUM} +const + DBOP_scalar_constant = $00000000; + {$EXTERNALSYM DBOP_scalar_constant} + DBOP_DEFAULT = $00000001; + {$EXTERNALSYM DBOP_DEFAULT} + DBOP_NULL = $00000002; + {$EXTERNALSYM DBOP_NULL} + DBOP_bookmark_name = $00000003; + {$EXTERNALSYM DBOP_bookmark_name} + DBOP_catalog_name = $00000004; + {$EXTERNALSYM DBOP_catalog_name} + DBOP_column_name = $00000005; + {$EXTERNALSYM DBOP_column_name} + DBOP_schema_name = $00000006; + {$EXTERNALSYM DBOP_schema_name} + DBOP_outall_name = $00000007; + {$EXTERNALSYM DBOP_outall_name} + DBOP_qualifier_name = $00000008; + {$EXTERNALSYM DBOP_qualifier_name} + DBOP_qualified_column_name = $00000009; + {$EXTERNALSYM DBOP_qualified_column_name} + DBOP_table_name = $0000000A; + {$EXTERNALSYM DBOP_table_name} + DBOP_nested_table_name = $0000000B; + {$EXTERNALSYM DBOP_nested_table_name} + DBOP_nested_column_name = $0000000C; + {$EXTERNALSYM DBOP_nested_column_name} + DBOP_row = $0000000D; + {$EXTERNALSYM DBOP_row} + DBOP_table = $0000000E; + {$EXTERNALSYM DBOP_table} + DBOP_sort = $0000000F; + {$EXTERNALSYM DBOP_sort} + DBOP_distinct = $00000010; + {$EXTERNALSYM DBOP_distinct} + DBOP_distinct_order_preserving = $00000011; + {$EXTERNALSYM DBOP_distinct_order_preserving} + DBOP_alias = $00000012; + {$EXTERNALSYM DBOP_alias} + DBOP_cross_join = $00000013; + {$EXTERNALSYM DBOP_cross_join} + DBOP_union_join = $00000014; + {$EXTERNALSYM DBOP_union_join} + DBOP_inner_join = $00000015; + {$EXTERNALSYM DBOP_inner_join} + DBOP_left_semi_join = $00000016; + {$EXTERNALSYM DBOP_left_semi_join} + DBOP_right_semi_join = $00000017; + {$EXTERNALSYM DBOP_right_semi_join} + DBOP_left_anti_semi_join = $00000018; + {$EXTERNALSYM DBOP_left_anti_semi_join} + DBOP_right_anti_semi_join = $00000019; + {$EXTERNALSYM DBOP_right_anti_semi_join} + DBOP_left_outer_join = $0000001A; + {$EXTERNALSYM DBOP_left_outer_join} + DBOP_right_outer_join = $0000001B; + {$EXTERNALSYM DBOP_right_outer_join} + DBOP_full_outer_join = $0000001C; + {$EXTERNALSYM DBOP_full_outer_join} + DBOP_natural_join = $0000001D; + {$EXTERNALSYM DBOP_natural_join} + DBOP_natural_left_outer_join = $0000001E; + {$EXTERNALSYM DBOP_natural_left_outer_join} + DBOP_natural_right_outer_join = $0000001F; + {$EXTERNALSYM DBOP_natural_right_outer_join} + DBOP_natural_full_outer_join = $00000020; + {$EXTERNALSYM DBOP_natural_full_outer_join} + DBOP_set_intersection = $00000021; + {$EXTERNALSYM DBOP_set_intersection} + DBOP_set_union = $00000022; + {$EXTERNALSYM DBOP_set_union} + DBOP_set_left_difference = $00000023; + {$EXTERNALSYM DBOP_set_left_difference} + DBOP_set_right_difference = $00000024; + {$EXTERNALSYM DBOP_set_right_difference} + DBOP_set_anti_difference = $00000025; + {$EXTERNALSYM DBOP_set_anti_difference} + DBOP_bag_intersection = $00000026; + {$EXTERNALSYM DBOP_bag_intersection} + DBOP_bag_union = $00000027; + {$EXTERNALSYM DBOP_bag_union} + DBOP_bag_left_difference = $00000028; + {$EXTERNALSYM DBOP_bag_left_difference} + DBOP_bag_right_difference = $00000029; + {$EXTERNALSYM DBOP_bag_right_difference} + DBOP_bag_anti_difference = $0000002A; + {$EXTERNALSYM DBOP_bag_anti_difference} + DBOP_division = $0000002B; + {$EXTERNALSYM DBOP_division} + DBOP_relative_sampling = $0000002C; + {$EXTERNALSYM DBOP_relative_sampling} + DBOP_absolute_sampling = $0000002D; + {$EXTERNALSYM DBOP_absolute_sampling} + DBOP_transitive_closure = $0000002E; + {$EXTERNALSYM DBOP_transitive_closure} + DBOP_recursive_union = $0000002F; + {$EXTERNALSYM DBOP_recursive_union} + DBOP_aggregate = $00000030; + {$EXTERNALSYM DBOP_aggregate} + DBOP_remote_table = $00000031; + {$EXTERNALSYM DBOP_remote_table} + DBOP_select = $00000032; + {$EXTERNALSYM DBOP_select} + DBOP_order_preserving_select = $00000033; + {$EXTERNALSYM DBOP_order_preserving_select} + DBOP_project = $00000034; + {$EXTERNALSYM DBOP_project} + DBOP_project_order_preserving = $00000035; + {$EXTERNALSYM DBOP_project_order_preserving} + DBOP_top = $00000036; + {$EXTERNALSYM DBOP_top} + DBOP_top_percent = $00000037; + {$EXTERNALSYM DBOP_top_percent} + DBOP_top_plus_ties = $00000038; + {$EXTERNALSYM DBOP_top_plus_ties} + DBOP_top_percent_plus_ties = $00000039; + {$EXTERNALSYM DBOP_top_percent_plus_ties} + DBOP_rank = $0000003A; + {$EXTERNALSYM DBOP_rank} + DBOP_rank_ties_equally = $0000003B; + {$EXTERNALSYM DBOP_rank_ties_equally} + DBOP_rank_ties_equally_and_skip = $0000003C; + {$EXTERNALSYM DBOP_rank_ties_equally_and_skip} + DBOP_navigate = $0000003D; + {$EXTERNALSYM DBOP_navigate} + DBOP_nesting = $0000003E; + {$EXTERNALSYM DBOP_nesting} + DBOP_unnesting = $0000003F; + {$EXTERNALSYM DBOP_unnesting} + DBOP_nested_apply = $00000040; + {$EXTERNALSYM DBOP_nested_apply} + DBOP_cross_tab = $00000041; + {$EXTERNALSYM DBOP_cross_tab} + DBOP_is_NULL = $00000042; + {$EXTERNALSYM DBOP_is_NULL} + DBOP_is_NOT_NULL = $00000043; + {$EXTERNALSYM DBOP_is_NOT_NULL} + DBOP_equal = $00000044; + {$EXTERNALSYM DBOP_equal} + DBOP_not_equal = $00000045; + {$EXTERNALSYM DBOP_not_equal} + DBOP_less = $00000046; + {$EXTERNALSYM DBOP_less} + DBOP_less_equal = $00000047; + {$EXTERNALSYM DBOP_less_equal} + DBOP_greater = $00000048; + {$EXTERNALSYM DBOP_greater} + DBOP_greater_equal = $00000049; + {$EXTERNALSYM DBOP_greater_equal} + DBOP_equal_all = $0000004A; + {$EXTERNALSYM DBOP_equal_all} + DBOP_not_equal_all = $0000004B; + {$EXTERNALSYM DBOP_not_equal_all} + DBOP_less_all = $0000004C; + {$EXTERNALSYM DBOP_less_all} + DBOP_less_equal_all = $0000004D; + {$EXTERNALSYM DBOP_less_equal_all} + DBOP_greater_all = $0000004E; + {$EXTERNALSYM DBOP_greater_all} + DBOP_greater_equal_all = $0000004F; + {$EXTERNALSYM DBOP_greater_equal_all} + DBOP_equal_any = $00000050; + {$EXTERNALSYM DBOP_equal_any} + DBOP_not_equal_any = $00000051; + {$EXTERNALSYM DBOP_not_equal_any} + DBOP_less_any = $00000052; + {$EXTERNALSYM DBOP_less_any} + DBOP_less_equal_any = $00000053; + {$EXTERNALSYM DBOP_less_equal_any} + DBOP_greater_any = $00000054; + {$EXTERNALSYM DBOP_greater_any} + DBOP_greater_equal_any = $00000055; + {$EXTERNALSYM DBOP_greater_equal_any} + DBOP_anybits = $00000056; + {$EXTERNALSYM DBOP_anybits} + DBOP_allbits = $00000057; + {$EXTERNALSYM DBOP_allbits} + DBOP_anybits_any = $00000058; + {$EXTERNALSYM DBOP_anybits_any} + DBOP_allbits_any = $00000059; + {$EXTERNALSYM DBOP_allbits_any} + DBOP_anybits_all = $0000005A; + {$EXTERNALSYM DBOP_anybits_all} + DBOP_allbits_all = $0000005B; + {$EXTERNALSYM DBOP_allbits_all} + DBOP_between = $0000005C; + {$EXTERNALSYM DBOP_between} + DBOP_between_unordered = $0000005D; + {$EXTERNALSYM DBOP_between_unordered} + DBOP_match = $0000005E; + {$EXTERNALSYM DBOP_match} + DBOP_match_unique = $0000005F; + {$EXTERNALSYM DBOP_match_unique} + DBOP_match_partial = $00000060; + {$EXTERNALSYM DBOP_match_partial} + DBOP_match_partial_unique = $00000061; + {$EXTERNALSYM DBOP_match_partial_unique} + DBOP_match_full = $00000062; + {$EXTERNALSYM DBOP_match_full} + DBOP_match_full_unique = $00000063; + {$EXTERNALSYM DBOP_match_full_unique} + DBOP_scalar_parameter = $00000064; + {$EXTERNALSYM DBOP_scalar_parameter} + DBOP_scalar_function = $00000065; + {$EXTERNALSYM DBOP_scalar_function} + DBOP_plus = $00000066; + {$EXTERNALSYM DBOP_plus} + DBOP_minus = $00000067; + {$EXTERNALSYM DBOP_minus} + DBOP_times = $00000068; + {$EXTERNALSYM DBOP_times} + DBOP_over = $00000069; + {$EXTERNALSYM DBOP_over} + DBOP_div = $0000006A; + {$EXTERNALSYM DBOP_div} + DBOP_modulo = $0000006B; + {$EXTERNALSYM DBOP_modulo} + DBOP_power = $0000006C; + {$EXTERNALSYM DBOP_power} + DBOP_like = $0000006D; + {$EXTERNALSYM DBOP_like} + DBOP_sounds_like = $0000006E; + {$EXTERNALSYM DBOP_sounds_like} + DBOP_like_any = $0000006F; + {$EXTERNALSYM DBOP_like_any} + DBOP_like_all = $00000070; + {$EXTERNALSYM DBOP_like_all} + DBOP_is_INVALID = $00000071; + {$EXTERNALSYM DBOP_is_INVALID} + DBOP_is_TRUE = $00000072; + {$EXTERNALSYM DBOP_is_TRUE} + DBOP_is_FALSE = $00000073; + {$EXTERNALSYM DBOP_is_FALSE} + DBOP_and = $00000074; + {$EXTERNALSYM DBOP_and} + DBOP_or = $00000075; + {$EXTERNALSYM DBOP_or} + DBOP_xor = $00000076; + {$EXTERNALSYM DBOP_xor} + DBOP_equivalent = $00000077; + {$EXTERNALSYM DBOP_equivalent} + DBOP_not = $00000078; + {$EXTERNALSYM DBOP_not} + DBOP_implies = $00000079; + {$EXTERNALSYM DBOP_implies} + DBOP_overlaps = $0000007A; + {$EXTERNALSYM DBOP_overlaps} + DBOP_case_condition = $0000007B; + {$EXTERNALSYM DBOP_case_condition} + DBOP_case_value = $0000007C; + {$EXTERNALSYM DBOP_case_value} + DBOP_nullif = $0000007D; + {$EXTERNALSYM DBOP_nullif} + DBOP_cast = $0000007E; + {$EXTERNALSYM DBOP_cast} + DBOP_coalesce = $0000007F; + {$EXTERNALSYM DBOP_coalesce} + DBOP_position = $00000080; + {$EXTERNALSYM DBOP_position} + DBOP_extract = $00000081; + {$EXTERNALSYM DBOP_extract} + DBOP_char_length = $00000082; + {$EXTERNALSYM DBOP_char_length} + DBOP_octet_length = $00000083; + {$EXTERNALSYM DBOP_octet_length} + DBOP_bit_length = $00000084; + {$EXTERNALSYM DBOP_bit_length} + DBOP_substring = $00000085; + {$EXTERNALSYM DBOP_substring} + DBOP_upper = $00000086; + {$EXTERNALSYM DBOP_upper} + DBOP_lower = $00000087; + {$EXTERNALSYM DBOP_lower} + DBOP_trim = $00000088; + {$EXTERNALSYM DBOP_trim} + DBOP_translate = $00000089; + {$EXTERNALSYM DBOP_translate} + DBOP_convert = $0000008A; + {$EXTERNALSYM DBOP_convert} + DBOP_string_concat = $0000008B; + {$EXTERNALSYM DBOP_string_concat} + DBOP_current_date = $0000008C; + {$EXTERNALSYM DBOP_current_date} + DBOP_current_time = $0000008D; + {$EXTERNALSYM DBOP_current_time} + DBOP_current_timestamp = $0000008E; + {$EXTERNALSYM DBOP_current_timestamp} + DBOP_content_select = $0000008F; + {$EXTERNALSYM DBOP_content_select} + DBOP_content = $00000090; + {$EXTERNALSYM DBOP_content} + DBOP_content_freetext = $00000091; + {$EXTERNALSYM DBOP_content_freetext} + DBOP_content_proximity = $00000092; + {$EXTERNALSYM DBOP_content_proximity} + DBOP_content_vector_or = $00000093; + {$EXTERNALSYM DBOP_content_vector_or} + DBOP_delete = $00000094; + {$EXTERNALSYM DBOP_delete} + DBOP_update = $00000095; + {$EXTERNALSYM DBOP_update} + DBOP_insert = $00000096; + {$EXTERNALSYM DBOP_insert} + DBOP_min = $00000097; + {$EXTERNALSYM DBOP_min} + DBOP_max = $00000098; + {$EXTERNALSYM DBOP_max} + DBOP_count = $00000099; + {$EXTERNALSYM DBOP_count} + DBOP_sum = $0000009A; + {$EXTERNALSYM DBOP_sum} + DBOP_avg = $0000009B; + {$EXTERNALSYM DBOP_avg} + DBOP_any_sample = $0000009C; + {$EXTERNALSYM DBOP_any_sample} + DBOP_stddev = $0000009D; + {$EXTERNALSYM DBOP_stddev} + DBOP_stddev_pop = $0000009E; + {$EXTERNALSYM DBOP_stddev_pop} + DBOP_var = $0000009F; + {$EXTERNALSYM DBOP_var} + DBOP_var_pop = $000000A0; + {$EXTERNALSYM DBOP_var_pop} + DBOP_first = $000000A1; + {$EXTERNALSYM DBOP_first} + DBOP_last = $000000A2; + {$EXTERNALSYM DBOP_last} + DBOP_in = $000000A3; + {$EXTERNALSYM DBOP_in} + DBOP_exists = $000000A4; + {$EXTERNALSYM DBOP_exists} + DBOP_unique = $000000A5; + {$EXTERNALSYM DBOP_unique} + DBOP_subset = $000000A6; + {$EXTERNALSYM DBOP_subset} + DBOP_proper_subset = $000000A7; + {$EXTERNALSYM DBOP_proper_subset} + DBOP_superset = $000000A8; + {$EXTERNALSYM DBOP_superset} + DBOP_proper_superset = $000000A9; + {$EXTERNALSYM DBOP_proper_superset} + DBOP_disjoint = $000000AA; + {$EXTERNALSYM DBOP_disjoint} + DBOP_pass_through = $000000AB; + {$EXTERNALSYM DBOP_pass_through} + DBOP_defined_by_GUID = $000000AC; + {$EXTERNALSYM DBOP_defined_by_GUID} + DBOP_text_command = $000000AD; + {$EXTERNALSYM DBOP_text_command} + DBOP_SQL_select = $000000AE; + {$EXTERNALSYM DBOP_SQL_select} + DBOP_prior_command_tree = $000000AF; + {$EXTERNALSYM DBOP_prior_command_tree} + DBOP_add_columns = $000000B0; + {$EXTERNALSYM DBOP_add_columns} + DBOP_column_list_anchor = $000000B1; + {$EXTERNALSYM DBOP_column_list_anchor} + DBOP_column_list_element = $000000B2; + {$EXTERNALSYM DBOP_column_list_element} + DBOP_command_list_anchor = $000000B3; + {$EXTERNALSYM DBOP_command_list_anchor} + DBOP_command_list_element = $000000B4; + {$EXTERNALSYM DBOP_command_list_element} + DBOP_from_list_anchor = $000000B5; + {$EXTERNALSYM DBOP_from_list_anchor} + DBOP_from_list_element = $000000B6; + {$EXTERNALSYM DBOP_from_list_element} + DBOP_project_list_anchor = $000000B7; + {$EXTERNALSYM DBOP_project_list_anchor} + DBOP_project_list_element = $000000B8; + {$EXTERNALSYM DBOP_project_list_element} + DBOP_row_list_anchor = $000000B9; + {$EXTERNALSYM DBOP_row_list_anchor} + DBOP_row_list_element = $000000BA; + {$EXTERNALSYM DBOP_row_list_element} + DBOP_scalar_list_anchor = $000000BB; + {$EXTERNALSYM DBOP_scalar_list_anchor} + DBOP_scalar_list_element = $000000BC; + {$EXTERNALSYM DBOP_scalar_list_element} + DBOP_set_list_anchor = $000000BD; + {$EXTERNALSYM DBOP_set_list_anchor} + DBOP_set_list_element = $000000BE; + {$EXTERNALSYM DBOP_set_list_element} + DBOP_sort_list_anchor = $000000BF; + {$EXTERNALSYM DBOP_sort_list_anchor} + DBOP_sort_list_element = $000000C0; + {$EXTERNALSYM DBOP_sort_list_element} + DBOP_alter_character_set = $000000C1; + {$EXTERNALSYM DBOP_alter_character_set} + DBOP_alter_collation = $000000C2; + {$EXTERNALSYM DBOP_alter_collation} + DBOP_alter_domain = $000000C3; + {$EXTERNALSYM DBOP_alter_domain} + DBOP_alter_index = $000000C4; + {$EXTERNALSYM DBOP_alter_index} + DBOP_alter_procedure = $000000C5; + {$EXTERNALSYM DBOP_alter_procedure} + DBOP_alter_schema = $000000C6; + {$EXTERNALSYM DBOP_alter_schema} + DBOP_alter_table = $000000C7; + {$EXTERNALSYM DBOP_alter_table} + DBOP_alter_trigger = $000000C8; + {$EXTERNALSYM DBOP_alter_trigger} + DBOP_alter_view = $000000C9; + {$EXTERNALSYM DBOP_alter_view} + DBOP_coldef_list_anchor = $000000CA; + {$EXTERNALSYM DBOP_coldef_list_anchor} + DBOP_coldef_list_element = $000000CB; + {$EXTERNALSYM DBOP_coldef_list_element} + DBOP_create_assertion = $000000CC; + {$EXTERNALSYM DBOP_create_assertion} + DBOP_create_character_set = $000000CD; + {$EXTERNALSYM DBOP_create_character_set} + DBOP_create_collation = $000000CE; + {$EXTERNALSYM DBOP_create_collation} + DBOP_create_domain = $000000CF; + {$EXTERNALSYM DBOP_create_domain} + DBOP_create_index = $000000D0; + {$EXTERNALSYM DBOP_create_index} + DBOP_create_procedure = $000000D1; + {$EXTERNALSYM DBOP_create_procedure} + DBOP_create_schema = $000000D2; + {$EXTERNALSYM DBOP_create_schema} + DBOP_create_synonym = $000000D3; + {$EXTERNALSYM DBOP_create_synonym} + DBOP_create_table = $000000D4; + {$EXTERNALSYM DBOP_create_table} + DBOP_create_temporary_table = $000000D5; + {$EXTERNALSYM DBOP_create_temporary_table} + DBOP_create_translation = $000000D6; + {$EXTERNALSYM DBOP_create_translation} + DBOP_create_trigger = $000000D7; + {$EXTERNALSYM DBOP_create_trigger} + DBOP_create_view = $000000D8; + {$EXTERNALSYM DBOP_create_view} + DBOP_drop_assertion = $000000D9; + {$EXTERNALSYM DBOP_drop_assertion} + DBOP_drop_character_set = $000000DA; + {$EXTERNALSYM DBOP_drop_character_set} + DBOP_drop_collation = $000000DB; + {$EXTERNALSYM DBOP_drop_collation} + DBOP_drop_domain = $000000DC; + {$EXTERNALSYM DBOP_drop_domain} + DBOP_drop_index = $000000DD; + {$EXTERNALSYM DBOP_drop_index} + DBOP_drop_procedure = $000000DE; + {$EXTERNALSYM DBOP_drop_procedure} + DBOP_drop_schema = $000000DF; + {$EXTERNALSYM DBOP_drop_schema} + DBOP_drop_synonym = $000000E0; + {$EXTERNALSYM DBOP_drop_synonym} + DBOP_drop_table = $000000E1; + {$EXTERNALSYM DBOP_drop_table} + DBOP_drop_translation = $000000E2; + {$EXTERNALSYM DBOP_drop_translation} + DBOP_drop_trigger = $000000E3; + {$EXTERNALSYM DBOP_drop_trigger} + DBOP_drop_view = $000000E4; + {$EXTERNALSYM DBOP_drop_view} + DBOP_foreign_key = $000000E5; + {$EXTERNALSYM DBOP_foreign_key} + DBOP_grant_privileges = $000000E6; + {$EXTERNALSYM DBOP_grant_privileges} + DBOP_index_list_anchor = $000000E7; + {$EXTERNALSYM DBOP_index_list_anchor} + DBOP_index_list_element = $000000E8; + {$EXTERNALSYM DBOP_index_list_element} + DBOP_primary_key = $000000E9; + {$EXTERNALSYM DBOP_primary_key} + DBOP_property_list_anchor = $000000EA; + {$EXTERNALSYM DBOP_property_list_anchor} + DBOP_property_list_element = $000000EB; + {$EXTERNALSYM DBOP_property_list_element} + DBOP_referenced_table = $000000EC; + {$EXTERNALSYM DBOP_referenced_table} + DBOP_rename_object = $000000ED; + {$EXTERNALSYM DBOP_rename_object} + DBOP_revoke_privileges = $000000EE; + {$EXTERNALSYM DBOP_revoke_privileges} + DBOP_schema_authorization = $000000EF; + {$EXTERNALSYM DBOP_schema_authorization} + DBOP_unique_key = $000000F0; + {$EXTERNALSYM DBOP_unique_key} + +// DBPARAMFLAGSENUM constants +type + DBPARAMFLAGSENUM = TOleEnum; + {$EXTERNALSYM DBPARAMFLAGSENUM} +const + DBPARAMFLAGS_ISINPUT = $00000001; + {$EXTERNALSYM DBPARAMFLAGS_ISINPUT} + DBPARAMFLAGS_ISOUTPUT = $00000002; + {$EXTERNALSYM DBPARAMFLAGS_ISOUTPUT} + DBPARAMFLAGS_ISSIGNED = $00000010; + {$EXTERNALSYM DBPARAMFLAGS_ISSIGNED} + DBPARAMFLAGS_ISNULLABLE = $00000040; + {$EXTERNALSYM DBPARAMFLAGS_ISNULLABLE} + DBPARAMFLAGS_ISLONG = $00000080; + {$EXTERNALSYM DBPARAMFLAGS_ISLONG} + +// DBPARAMFLAGSENUM20 constants +type + DBPARAMFLAGSENUM20 = TOleEnum; + {$EXTERNALSYM DBPARAMFLAGSENUM20} +const + DBPARAMFLAGS_SCALEISNEGATIVE = $00000100; + {$EXTERNALSYM DBPARAMFLAGS_SCALEISNEGATIVE} + +// DBPROPFLAGSENUM constants +type + DBPROPFLAGSENUM = TOleEnum; + {$EXTERNALSYM DBPROPFLAGSENUM} +const + DBPROPFLAGS_NOTSUPPORTED = $00000000; + {$EXTERNALSYM DBPROPFLAGS_NOTSUPPORTED} + DBPROPFLAGS_COLUMN = $00000001; + {$EXTERNALSYM DBPROPFLAGS_COLUMN} + DBPROPFLAGS_DATASOURCE = $00000002; + {$EXTERNALSYM DBPROPFLAGS_DATASOURCE} + DBPROPFLAGS_DATASOURCECREATE = $00000004; + {$EXTERNALSYM DBPROPFLAGS_DATASOURCECREATE} + DBPROPFLAGS_DATASOURCEINFO = $00000008; + {$EXTERNALSYM DBPROPFLAGS_DATASOURCEINFO} + DBPROPFLAGS_DBINIT = $00000010; + {$EXTERNALSYM DBPROPFLAGS_DBINIT} + DBPROPFLAGS_INDEX = $00000020; + {$EXTERNALSYM DBPROPFLAGS_INDEX} + DBPROPFLAGS_ROWSET = $00000040; + {$EXTERNALSYM DBPROPFLAGS_ROWSET} + DBPROPFLAGS_TABLE = $00000080; + {$EXTERNALSYM DBPROPFLAGS_TABLE} + DBPROPFLAGS_COLUMNOK = $00000100; + {$EXTERNALSYM DBPROPFLAGS_COLUMNOK} + DBPROPFLAGS_READ = $00000200; + {$EXTERNALSYM DBPROPFLAGS_READ} + DBPROPFLAGS_WRITE = $00000400; + {$EXTERNALSYM DBPROPFLAGS_WRITE} + DBPROPFLAGS_REQUIRED = $00000800; + {$EXTERNALSYM DBPROPFLAGS_REQUIRED} + DBPROPFLAGS_SESSION = $00001000; + {$EXTERNALSYM DBPROPFLAGS_SESSION} + +// DBPROPFLAGSENUM21 constants +type + DBPROPFLAGSENUM21 = TOleEnum; + {$EXTERNALSYM DBPROPFLAGSENUM21} +const + DBPROPFLAGS_TRUSTEE = $00002000; + {$EXTERNALSYM DBPROPFLAGS_TRUSTEE} + +// DBPROPOPTIONSENUM constants +type + DBPROPOPTIONSENUM = TOleEnum; + {$EXTERNALSYM DBPROPOPTIONSENUM} +const + DBPROPOPTIONS_REQUIRED = $00000000; + {$EXTERNALSYM DBPROPOPTIONS_REQUIRED} + DBPROPOPTIONS_SETIFCHEAP = $00000001; + {$EXTERNALSYM DBPROPOPTIONS_SETIFCHEAP} + DBPROPOPTIONS_OPTIONAL = $00000001; + {$EXTERNALSYM DBPROPOPTIONS_OPTIONAL} + +// DBPROPSTATUSENUM constants +type + DBPROPSTATUSENUM = TOleEnum; + {$EXTERNALSYM DBPROPSTATUSENUM} +const + DBPROPSTATUS_OK = $00000000; + {$EXTERNALSYM DBPROPSTATUS_OK} + DBPROPSTATUS_NOTSUPPORTED = $00000001; + {$EXTERNALSYM DBPROPSTATUS_NOTSUPPORTED} + DBPROPSTATUS_BADVALUE = $00000002; + {$EXTERNALSYM DBPROPSTATUS_BADVALUE} + DBPROPSTATUS_BADOPTION = $00000003; + {$EXTERNALSYM DBPROPSTATUS_BADOPTION} + DBPROPSTATUS_BADCOLUMN = $00000004; + {$EXTERNALSYM DBPROPSTATUS_BADCOLUMN} + DBPROPSTATUS_NOTALLSETTABLE = $00000005; + {$EXTERNALSYM DBPROPSTATUS_NOTALLSETTABLE} + DBPROPSTATUS_NOTSETTABLE = $00000006; + {$EXTERNALSYM DBPROPSTATUS_NOTSETTABLE} + DBPROPSTATUS_NOTSET = $00000007; + {$EXTERNALSYM DBPROPSTATUS_NOTSET} + DBPROPSTATUS_CONFLICTING = $00000008; + {$EXTERNALSYM DBPROPSTATUS_CONFLICTING} + +// DBPROPSTATUSENUM21 constants +type + DBPROPSTATUSENUM21 = TOleEnum; + {$EXTERNALSYM DBPROPSTATUSENUM21} +const + DBPROPSTATUS_NOTAVAILAVLE = $00000009; + {$EXTERNALSYM DBPROPSTATUS_NOTAVAILAVLE} + +// DBINDEX_COL_ORDERENUM constants +type + DBINDEX_COL_ORDERENUM = TOleEnum; + {$EXTERNALSYM DBINDEX_COL_ORDERENUM} +const + DBINDEX_COL_ORDER_ASC = $00000000; + {$EXTERNALSYM DBINDEX_COL_ORDER_ASC} + DBINDEX_COL_ORDER_DESC = $00000001; + {$EXTERNALSYM DBINDEX_COL_ORDER_DESC} + +// DBCOLUMNDESCFLAGSENUM constants +type + DBCOLUMNDESCFLAGSENUM = TOleEnum; + {$EXTERNALSYM DBCOLUMNDESCFLAGSENUM} +const + DBCOLUMNDESCFLAGS_TYPENAME = $00000001; + {$EXTERNALSYM DBCOLUMNDESCFLAGS_TYPENAME} + DBCOLUMNDESCFLAGS_ITYPEINFO = $00000002; + {$EXTERNALSYM DBCOLUMNDESCFLAGS_ITYPEINFO} + DBCOLUMNDESCFLAGS_PROPERTIES = $00000004; + {$EXTERNALSYM DBCOLUMNDESCFLAGS_PROPERTIES} + DBCOLUMNDESCFLAGS_CLSID = $00000008; + {$EXTERNALSYM DBCOLUMNDESCFLAGS_CLSID} + DBCOLUMNDESCFLAGS_COLSIZE = $00000010; + {$EXTERNALSYM DBCOLUMNDESCFLAGS_COLSIZE} + DBCOLUMNDESCFLAGS_DBCID = $00000020; + {$EXTERNALSYM DBCOLUMNDESCFLAGS_DBCID} + DBCOLUMNDESCFLAGS_WTYPE = $00000040; + {$EXTERNALSYM DBCOLUMNDESCFLAGS_WTYPE} + DBCOLUMNDESCFLAGS_PRECISION = $00000080; + {$EXTERNALSYM DBCOLUMNDESCFLAGS_PRECISION} + DBCOLUMNDESCFLAGS_SCALE = $00000100; + {$EXTERNALSYM DBCOLUMNDESCFLAGS_SCALE} + +// DBEVENTPHASEENUM constants +type + DBEVENTPHASEENUM = TOleEnum; + {$EXTERNALSYM DBEVENTPHASEENUM} +const + DBEVENTPHASE_OKTODO = $00000000; + {$EXTERNALSYM DBEVENTPHASE_OKTODO} + DBEVENTPHASE_ABOUTTODO = $00000001; + {$EXTERNALSYM DBEVENTPHASE_ABOUTTODO} + DBEVENTPHASE_SYNCHAFTER = $00000002; + {$EXTERNALSYM DBEVENTPHASE_SYNCHAFTER} + DBEVENTPHASE_FAILEDTODO = $00000003; + {$EXTERNALSYM DBEVENTPHASE_FAILEDTODO} + DBEVENTPHASE_DIDEVENT = $00000004; + {$EXTERNALSYM DBEVENTPHASE_DIDEVENT} + +// DBREASONENUM constants +type + DBREASONENUM = TOleEnum; + {$EXTERNALSYM DBREASONENUM} +const + DBREASON_ROWSET_FETCHPOSITIONCHANGE = $00000000; + {$EXTERNALSYM DBREASON_ROWSET_FETCHPOSITIONCHANGE} + DBREASON_ROWSET_RELEASE = $00000001; + {$EXTERNALSYM DBREASON_ROWSET_RELEASE} + DBREASON_COLUMN_SET = $00000002; + {$EXTERNALSYM DBREASON_COLUMN_SET} + DBREASON_COLUMN_RECALCULATED = $00000003; + {$EXTERNALSYM DBREASON_COLUMN_RECALCULATED} + DBREASON_ROW_ACTIVATE = $00000004; + {$EXTERNALSYM DBREASON_ROW_ACTIVATE} + DBREASON_ROW_RELEASE = $00000005; + {$EXTERNALSYM DBREASON_ROW_RELEASE} + DBREASON_ROW_DELETE = $00000006; + {$EXTERNALSYM DBREASON_ROW_DELETE} + DBREASON_ROW_FIRSTCHANGE = $00000007; + {$EXTERNALSYM DBREASON_ROW_FIRSTCHANGE} + DBREASON_ROW_INSERT = $00000008; + {$EXTERNALSYM DBREASON_ROW_INSERT} + DBREASON_ROW_RESYNCH = $00000009; + {$EXTERNALSYM DBREASON_ROW_RESYNCH} + DBREASON_ROW_UNDOCHANGE = $0000000A; + {$EXTERNALSYM DBREASON_ROW_UNDOCHANGE} + DBREASON_ROW_UNDOINSERT = $0000000B; + {$EXTERNALSYM DBREASON_ROW_UNDOINSERT} + DBREASON_ROW_UNDODELETE = $0000000C; + {$EXTERNALSYM DBREASON_ROW_UNDODELETE} + DBREASON_ROW_UPDATE = $0000000D; + {$EXTERNALSYM DBREASON_ROW_UPDATE} + DBREASON_ROWSET_CHANGED = $0000000E; + {$EXTERNALSYM DBREASON_ROWSET_CHANGED} + +// DBREASONENUM15 constants +type + DBREASONENUM15 = TOleEnum; + {$EXTERNALSYM DBREASONENUM15} +const + DBREASON_ROWPOSITION_CHANGED = $0000000F; + {$EXTERNALSYM DBREASON_ROWPOSITION_CHANGED} + DBREASON_ROWPOSITION_CHAPTERCHANGED = $00000010; + {$EXTERNALSYM DBREASON_ROWPOSITION_CHAPTERCHANGED} + DBREASON_ROWPOSITION_CLEARED = $00000011; + {$EXTERNALSYM DBREASON_ROWPOSITION_CLEARED} + DBREASON_ROW_ASYNCHINSERT = $00000012; + {$EXTERNALSYM DBREASON_ROW_ASYNCHINSERT} + +// DBREASONENUM25 constants +type + DBREASONENUM25 = TOleEnum; + {$EXTERNALSYM DBREASONENUM25} +const + DBREASON_ROWSET_ROWSADDED = $00000013; + {$EXTERNALSYM DBREASON_ROWSET_ROWSADDED} + DBREASON_ROWSET_POPULATIONCOMPLETE = $00000014; + {$EXTERNALSYM DBREASON_ROWSET_POPULATIONCOMPLETE} + DBREASON_ROWSET_POPULATIONSTOPPED = $00000015; + {$EXTERNALSYM DBREASON_ROWSET_POPULATIONSTOPPED} + +// DBCOMPAREOPSENUM constants +type + DBCOMPAREOPSENUM = TOleEnum; + {$EXTERNALSYM DBCOMPAREOPSENUM} +const + DBCOMPAREOPS_LT = $00000000; + {$EXTERNALSYM DBCOMPAREOPS_LT} + DBCOMPAREOPS_LE = $00000001; + {$EXTERNALSYM DBCOMPAREOPS_LE} + DBCOMPAREOPS_EQ = $00000002; + {$EXTERNALSYM DBCOMPAREOPS_EQ} + DBCOMPAREOPS_GE = $00000003; + {$EXTERNALSYM DBCOMPAREOPS_GE} + DBCOMPAREOPS_GT = $00000004; + {$EXTERNALSYM DBCOMPAREOPS_GT} + DBCOMPAREOPS_BEGINSWITH = $00000005; + {$EXTERNALSYM DBCOMPAREOPS_BEGINSWITH} + DBCOMPAREOPS_CONTAINS = $00000006; + {$EXTERNALSYM DBCOMPAREOPS_CONTAINS} + DBCOMPAREOPS_NE = $00000007; + {$EXTERNALSYM DBCOMPAREOPS_NE} + DBCOMPAREOPS_IGNORE = $00000008; + {$EXTERNALSYM DBCOMPAREOPS_IGNORE} + DBCOMPAREOPS_CASESENSITIVE = $00001000; + {$EXTERNALSYM DBCOMPAREOPS_CASESENSITIVE} + DBCOMPAREOPS_CASEINSENSITIVE = $00002000; + {$EXTERNALSYM DBCOMPAREOPS_CASEINSENSITIVE} + +// DBCOMPAREOPSENUM20 constants +type + DBCOMPAREOPSENUM20 = TOleEnum; + {$EXTERNALSYM DBCOMPAREOPSENUM20} +const + DBCOMPAREOPS_NOTBEGINSWITH = $00000009; + {$EXTERNALSYM DBCOMPAREOPS_NOTBEGINSWITH} + DBCOMPAREOPS_NOTCONTAINS = $0000000A; + {$EXTERNALSYM DBCOMPAREOPS_NOTCONTAINS} + +// DBASYNCHOPENUM constants +type + DBASYNCHOPENUM = TOleEnum; + {$EXTERNALSYM DBASYNCHOPENUM} +const + DBASYNCHOP_OPEN = $00000000; + {$EXTERNALSYM DBASYNCHOP_OPEN} + +// DBASYNCHPHASEENUM constants +type + DBASYNCHPHASEENUM = TOleEnum; + {$EXTERNALSYM DBASYNCHPHASEENUM} +const + DBASYNCHPHASE_INITIALIZATION = $00000000; + {$EXTERNALSYM DBASYNCHPHASE_INITIALIZATION} + DBASYNCHPHASE_POPULATION = $00000001; + {$EXTERNALSYM DBASYNCHPHASE_POPULATION} + DBASYNCHPHASE_COMPLETE = $00000002; + {$EXTERNALSYM DBASYNCHPHASE_COMPLETE} + DBASYNCHPHASE_CANCELED = $00000003; + {$EXTERNALSYM DBASYNCHPHASE_CANCELED} + +// DBSORTENUM constants +type + DBSORTENUM = TOleEnum; + {$EXTERNALSYM DBSORTENUM} +const + DBSORT_ASCENDING = $00000000; + {$EXTERNALSYM DBSORT_ASCENDING} + DBSORT_DESCENDING = $00000001; + {$EXTERNALSYM DBSORT_DESCENDING} + +// DBACCESSORFLAGSENUM constants +type + DBACCESSORFLAGSENUM = TOleEnum; + {$EXTERNALSYM DBACCESSORFLAGSENUM} +const + DBACCESSOR_INVALID = $00000000; + {$EXTERNALSYM DBACCESSOR_INVALID} + DBACCESSOR_PASSBYREF = $00000001; + {$EXTERNALSYM DBACCESSOR_PASSBYREF} + DBACCESSOR_ROWDATA = $00000002; + {$EXTERNALSYM DBACCESSOR_ROWDATA} + DBACCESSOR_PARAMETERDATA = $00000004; + {$EXTERNALSYM DBACCESSOR_PARAMETERDATA} + DBACCESSOR_OPTIMIZED = $00000008; + {$EXTERNALSYM DBACCESSOR_OPTIMIZED} + +// DBACCESSORFLAGSENUM25 constants +type + DBACCESSORFLAGSENUM25 = TOleEnum; + {$EXTERNALSYM DBACCESSORFLAGSENUM25} +const + DBACCESSOR_INHERITED = $00000010; + {$EXTERNALSYM DBACCESSOR_INHERITED} + +// DBBINDSTATUSENUM constants +type + DBBINDSTATUSENUM = TOleEnum; + {$EXTERNALSYM DBBINDSTATUSENUM} +const + DBBINDSTATUS_OK = $00000000; + {$EXTERNALSYM DBBINDSTATUS_OK} + DBBINDSTATUS_BADORDINAL = $00000001; + {$EXTERNALSYM DBBINDSTATUS_BADORDINAL} + DBBINDSTATUS_UNSUPPORTEDCONVERSION = $00000002; + {$EXTERNALSYM DBBINDSTATUS_UNSUPPORTEDCONVERSION} + DBBINDSTATUS_BADBINDINFO = $00000003; + {$EXTERNALSYM DBBINDSTATUS_BADBINDINFO} + DBBINDSTATUS_BADSTORAGEFLAGS = $00000004; + {$EXTERNALSYM DBBINDSTATUS_BADSTORAGEFLAGS} + DBBINDSTATUS_NOINTERFACE = $00000005; + {$EXTERNALSYM DBBINDSTATUS_NOINTERFACE} + DBBINDSTATUS_MULTIPLESTORAGE = $00000006; + {$EXTERNALSYM DBBINDSTATUS_MULTIPLESTORAGE} + +// DBCOMPAREENUM constants +type + DBCOMPAREENUM = TOleEnum; + {$EXTERNALSYM DBCOMPAREENUM} +const + DBCOMPARE_LT = $00000000; + {$EXTERNALSYM DBCOMPARE_LT} + DBCOMPARE_EQ = $00000001; + {$EXTERNALSYM DBCOMPARE_EQ} + DBCOMPARE_GT = $00000002; + {$EXTERNALSYM DBCOMPARE_GT} + DBCOMPARE_NE = $00000003; + {$EXTERNALSYM DBCOMPARE_NE} + DBCOMPARE_NOTCOMPARABLE = $00000004; + {$EXTERNALSYM DBCOMPARE_NOTCOMPARABLE} + +// DBPOSITIONFLAGSENUM constants +type + DBPOSITIONFLAGSENUM = TOleEnum; + {$EXTERNALSYM DBPOSITIONFLAGSENUM} +const + DBPOSITION_OK = $00000000; + {$EXTERNALSYM DBPOSITION_OK} + DBPOSITION_NOROW = $00000001; + {$EXTERNALSYM DBPOSITION_NOROW} + DBPOSITION_BOF = $00000002; + {$EXTERNALSYM DBPOSITION_BOF} + DBPOSITION_EOF = $00000003; + {$EXTERNALSYM DBPOSITION_EOF} + +// DBPENDINGSTATUSENUM constants +type + DBPENDINGSTATUSENUM = TOleEnum; + {$EXTERNALSYM DBPENDINGSTATUSENUM} +const + DBPENDINGSTATUS_NEW = $00000001; + {$EXTERNALSYM DBPENDINGSTATUS_NEW} + DBPENDINGSTATUS_CHANGED = $00000002; + {$EXTERNALSYM DBPENDINGSTATUS_CHANGED} + DBPENDINGSTATUS_DELETED = $00000004; + {$EXTERNALSYM DBPENDINGSTATUS_DELETED} + DBPENDINGSTATUS_UNCHANGED = $00000008; + {$EXTERNALSYM DBPENDINGSTATUS_UNCHANGED} + DBPENDINGSTATUS_INVALIDROW = $00000010; + {$EXTERNALSYM DBPENDINGSTATUS_INVALIDROW} + +// DBSEEKENUM constants +type + DBSEEKENUM = TOleEnum; + {$EXTERNALSYM DBSEEKENUM} +const + DBSEEK_INVALID = $00000000; + {$EXTERNALSYM DBSEEK_INVALID} + DBSEEK_FIRSTEQ = $00000001; + {$EXTERNALSYM DBSEEK_FIRSTEQ} + DBSEEK_LASTEQ = $00000002; + {$EXTERNALSYM DBSEEK_LASTEQ} + DBSEEK_GE = $00000004; + {$EXTERNALSYM DBSEEK_GE} + DBSEEK_GT = $00000008; + {$EXTERNALSYM DBSEEK_GT} + DBSEEK_LE = $00000010; + {$EXTERNALSYM DBSEEK_LE} + DBSEEK_LT = $00000020; + {$EXTERNALSYM DBSEEK_LT} + +// DBRANGEENUM constants +type + DBRANGEENUM = TOleEnum; + {$EXTERNALSYM DBRANGEENUM} +const + DBRANGE_INCLUSIVESTART = $00000000; + {$EXTERNALSYM DBRANGE_INCLUSIVESTART} + DBRANGE_INCLUSIVEEND = $00000000; + {$EXTERNALSYM DBRANGE_INCLUSIVEEND} + DBRANGE_EXCLUSIVESTART = $00000001; + {$EXTERNALSYM DBRANGE_EXCLUSIVESTART} + DBRANGE_EXCLUSIVEEND = $00000002; + {$EXTERNALSYM DBRANGE_EXCLUSIVEEND} + DBRANGE_EXCLUDENULLS = $00000004; + {$EXTERNALSYM DBRANGE_EXCLUDENULLS} + DBRANGE_PREFIX = $00000008; + {$EXTERNALSYM DBRANGE_PREFIX} + DBRANGE_MATCH = $00000010; + {$EXTERNALSYM DBRANGE_MATCH} + +// DBRANGEENUM20 constants +type + DBRANGEENUM20 = TOleEnum; + {$EXTERNALSYM DBRANGEENUM20} +const + DBRANGE_MATCH_N_SHIFT = $00000018; + {$EXTERNALSYM DBRANGE_MATCH_N_SHIFT} + DBRANGE_MATCH_N_MASK = $000000FF; + {$EXTERNALSYM DBRANGE_MATCH_N_MASK} + +// DBWATCHNOTIFYENUM constants +type + DBWATCHNOTIFYENUM = TOleEnum; + {$EXTERNALSYM DBWATCHNOTIFYENUM} +const + DBWATCHNOTIFY_ROWSCHANGED = $00000001; + {$EXTERNALSYM DBWATCHNOTIFY_ROWSCHANGED} + DBWATCHNOTIFY_QUERYDONE = $00000002; + {$EXTERNALSYM DBWATCHNOTIFY_QUERYDONE} + DBWATCHNOTIFY_QUERYREEXECUTED = $00000003; + {$EXTERNALSYM DBWATCHNOTIFY_QUERYREEXECUTED} + +// DBWATCHMODEENUM constants +type + DBWATCHMODEENUM = TOleEnum; + {$EXTERNALSYM DBWATCHMODEENUM} +const + DBWATCHMODE_ALL = $00000001; + {$EXTERNALSYM DBWATCHMODE_ALL} + DBWATCHMODE_EXTEND = $00000002; + {$EXTERNALSYM DBWATCHMODE_EXTEND} + DBWATCHMODE_MOVE = $00000004; + {$EXTERNALSYM DBWATCHMODE_MOVE} + DBWATCHMODE_COUNT = $00000008; + {$EXTERNALSYM DBWATCHMODE_COUNT} + +// DBROWCHANGEKINDENUM constants +type + DBROWCHANGEKINDENUM = TOleEnum; + {$EXTERNALSYM DBROWCHANGEKINDENUM} +const + DBROWCHANGEKIND_INSERT = $00000000; + {$EXTERNALSYM DBROWCHANGEKIND_INSERT} + DBROWCHANGEKIND_DELETE = $00000001; + {$EXTERNALSYM DBROWCHANGEKIND_DELETE} + DBROWCHANGEKIND_UPDATE = $00000002; + {$EXTERNALSYM DBROWCHANGEKIND_UPDATE} + DBROWCHANGEKIND_COUNT = $00000003; + {$EXTERNALSYM DBROWCHANGEKIND_COUNT} + +// DBCONVERTFLAGSENUM constants +type + DBCONVERTFLAGSENUM = TOleEnum; + {$EXTERNALSYM DBCONVERTFLAGSENUM} +const + DBCONVERTFLAGS_COLUMN = $00000000; + {$EXTERNALSYM DBCONVERTFLAGS_COLUMN} + DBCONVERTFLAGS_PARAMETER = $00000001; + {$EXTERNALSYM DBCONVERTFLAGS_PARAMETER} + +// DBCONVERTFLAGSENUM20 constants +type + DBCONVERTFLAGSENUM20 = TOleEnum; + {$EXTERNALSYM DBCONVERTFLAGSENUM20} +const + DBCONVERTFLAGS_ISLONG = $00000002; + {$EXTERNALSYM DBCONVERTFLAGS_ISLONG} + DBCONVERTFLAGS_ISFIXEDLENGTH = $00000004; + {$EXTERNALSYM DBCONVERTFLAGS_ISFIXEDLENGTH} + DBCONVERTFLAGS_FROMVARIANT = $00000008; + {$EXTERNALSYM DBCONVERTFLAGS_FROMVARIANT} + +// DBRESOURCEKINDENUM constants +type + DBRESOURCEKINDENUM = TOleEnum; + {$EXTERNALSYM DBRESOURCEKINDENUM} +const + DBRESOURCE_INVALID = $00000000; + {$EXTERNALSYM DBRESOURCE_INVALID} + DBRESOURCE_TOTAL = $00000001; + {$EXTERNALSYM DBRESOURCE_TOTAL} + DBRESOURCE_CPU = $00000002; + {$EXTERNALSYM DBRESOURCE_CPU} + DBRESOURCE_MEMORY = $00000003; + {$EXTERNALSYM DBRESOURCE_MEMORY} + DBRESOURCE_DISK = $00000004; + {$EXTERNALSYM DBRESOURCE_DISK} + DBRESOURCE_NETWORK = $00000005; + {$EXTERNALSYM DBRESOURCE_NETWORK} + DBRESOURCE_RESPONSE = $00000006; + {$EXTERNALSYM DBRESOURCE_RESPONSE} + DBRESOURCE_ROWS = $00000007; + {$EXTERNALSYM DBRESOURCE_ROWS} + DBRESOURCE_OTHER = $00000008; + {$EXTERNALSYM DBRESOURCE_OTHER} + +// DBCOSTUNITENUM constants +type + DBCOSTUNITENUM = TOleEnum; + {$EXTERNALSYM DBCOSTUNITENUM} +const + DBUNIT_INVALID = $00000000; + {$EXTERNALSYM DBUNIT_INVALID} + DBUNIT_WEIGHT = $00000001; + {$EXTERNALSYM DBUNIT_WEIGHT} + DBUNIT_PERCENT = $00000002; + {$EXTERNALSYM DBUNIT_PERCENT} + DBUNIT_MAXIMUM = $00000004; + {$EXTERNALSYM DBUNIT_MAXIMUM} + DBUNIT_MINIMUM = $00000008; + {$EXTERNALSYM DBUNIT_MINIMUM} + DBUNIT_MICRO_SECOND = $00000010; + {$EXTERNALSYM DBUNIT_MICRO_SECOND} + DBUNIT_MILLI_SECOND = $00000020; + {$EXTERNALSYM DBUNIT_MILLI_SECOND} + DBUNIT_SECOND = $00000040; + {$EXTERNALSYM DBUNIT_SECOND} + DBUNIT_MINUTE = $00000080; + {$EXTERNALSYM DBUNIT_MINUTE} + DBUNIT_HOUR = $00000100; + {$EXTERNALSYM DBUNIT_HOUR} + DBUNIT_BYTE = $00000200; + {$EXTERNALSYM DBUNIT_BYTE} + DBUNIT_KILO_BYTE = $00000400; + {$EXTERNALSYM DBUNIT_KILO_BYTE} + DBUNIT_MEGA_BYTE = $00000800; + {$EXTERNALSYM DBUNIT_MEGA_BYTE} + DBUNIT_GIGA_BYTE = $00001000; + {$EXTERNALSYM DBUNIT_GIGA_BYTE} + DBUNIT_NUM_MSGS = $00002000; + {$EXTERNALSYM DBUNIT_NUM_MSGS} + DBUNIT_NUM_LOCKS = $00004000; + {$EXTERNALSYM DBUNIT_NUM_LOCKS} + DBUNIT_NUM_ROWS = $00008000; + {$EXTERNALSYM DBUNIT_NUM_ROWS} + DBUNIT_OTHER = $00010000; + {$EXTERNALSYM DBUNIT_OTHER} + +// DBEXECLIMITSENUM constants +type + DBEXECLIMITSENUM = TOleEnum; + {$EXTERNALSYM DBEXECLIMITSENUM} +const + DBEXECLIMITS_ABORT = $00000001; + {$EXTERNALSYM DBEXECLIMITS_ABORT} + DBEXECLIMITS_STOP = $00000002; + {$EXTERNALSYM DBEXECLIMITS_STOP} + DBEXECLIMITS_SUSPEND = $00000003; + {$EXTERNALSYM DBEXECLIMITS_SUSPEND} + +// DBCOMMANDREUSEENUM constants +type + DBCOMMANDREUSEENUM = TOleEnum; + {$EXTERNALSYM DBCOMMANDREUSEENUM} +const + DBCOMMANDREUSE_NONE = $00000000; + {$EXTERNALSYM DBCOMMANDREUSE_NONE} + DBCOMMANDREUSE_PROPERTIES = $00000001; + {$EXTERNALSYM DBCOMMANDREUSE_PROPERTIES} + DBCOMMANDREUSE_PARAMETERS = $00000002; + {$EXTERNALSYM DBCOMMANDREUSE_PARAMETERS} + +// DBVALUEKINDENUM constants +type + DBVALUEKINDENUM = TOleEnum; + {$EXTERNALSYM DBVALUEKINDENUM} +const + DBVALUEKIND_BYGUID = $00000100; + {$EXTERNALSYM DBVALUEKIND_BYGUID} + DBVALUEKIND_COLDESC = $00000101; + {$EXTERNALSYM DBVALUEKIND_COLDESC} + DBVALUEKIND_ID = $00000102; + {$EXTERNALSYM DBVALUEKIND_ID} + DBVALUEKIND_CONTENT = $00000103; + {$EXTERNALSYM DBVALUEKIND_CONTENT} + DBVALUEKIND_CONTENTVECTOR = $00000104; + {$EXTERNALSYM DBVALUEKIND_CONTENTVECTOR} + DBVALUEKIND_GROUPINFO = $00000105; + {$EXTERNALSYM DBVALUEKIND_GROUPINFO} + DBVALUEKIND_PARAMETER = $00000106; + {$EXTERNALSYM DBVALUEKIND_PARAMETER} + DBVALUEKIND_PROPERTY = $00000107; + {$EXTERNALSYM DBVALUEKIND_PROPERTY} + DBVALUEKIND_SETFUNC = $00000108; + {$EXTERNALSYM DBVALUEKIND_SETFUNC} + DBVALUEKIND_SORTINFO = $00000109; + {$EXTERNALSYM DBVALUEKIND_SORTINFO} + DBVALUEKIND_TEXT = $0000010A; + {$EXTERNALSYM DBVALUEKIND_TEXT} + DBVALUEKIND_COMMAND = $0000010B; + {$EXTERNALSYM DBVALUEKIND_COMMAND} + DBVALUEKIND_MONIKER = $0000010C; + {$EXTERNALSYM DBVALUEKIND_MONIKER} + DBVALUEKIND_ROWSET = $0000010D; + {$EXTERNALSYM DBVALUEKIND_ROWSET} + DBVALUEKIND_LIKE = $0000010E; + {$EXTERNALSYM DBVALUEKIND_LIKE} + DBVALUEKIND_CONTENTPROXIMITY = $0000010F; + {$EXTERNALSYM DBVALUEKIND_CONTENTPROXIMITY} + DBVALUEKIND_IDISPATCH = $00000009; + {$EXTERNALSYM DBVALUEKIND_IDISPATCH} + DBVALUEKIND_IUNKNOWN = $0000000D; + {$EXTERNALSYM DBVALUEKIND_IUNKNOWN} + DBVALUEKIND_EMPTY = $00000000; + {$EXTERNALSYM DBVALUEKIND_EMPTY} + DBVALUEKIND_NULL = $00000001; + {$EXTERNALSYM DBVALUEKIND_NULL} + DBVALUEKIND_I2 = $00000002; + {$EXTERNALSYM DBVALUEKIND_I2} + DBVALUEKIND_I4 = $00000003; + {$EXTERNALSYM DBVALUEKIND_I4} + DBVALUEKIND_R4 = $00000004; + {$EXTERNALSYM DBVALUEKIND_R4} + DBVALUEKIND_R8 = $00000005; + {$EXTERNALSYM DBVALUEKIND_R8} + DBVALUEKIND_CY = $00000006; + {$EXTERNALSYM DBVALUEKIND_CY} + DBVALUEKIND_DATE = $00000007; + {$EXTERNALSYM DBVALUEKIND_DATE} + DBVALUEKIND_BSTR = $00000008; + {$EXTERNALSYM DBVALUEKIND_BSTR} + DBVALUEKIND_ERROR = $0000000A; + {$EXTERNALSYM DBVALUEKIND_ERROR} + DBVALUEKIND_BOOL = $0000000B; + {$EXTERNALSYM DBVALUEKIND_BOOL} + DBVALUEKIND_VARIANT = $0000000C; + {$EXTERNALSYM DBVALUEKIND_VARIANT} + DBVALUEKIND_VECTOR = $00001000; + {$EXTERNALSYM DBVALUEKIND_VECTOR} + DBVALUEKIND_ARRAY = $00002000; + {$EXTERNALSYM DBVALUEKIND_ARRAY} + DBVALUEKIND_BYREF = $00004000; + {$EXTERNALSYM DBVALUEKIND_BYREF} + DBVALUEKIND_I1 = $00000010; + {$EXTERNALSYM DBVALUEKIND_I1} + DBVALUEKIND_UI1 = $00000011; + {$EXTERNALSYM DBVALUEKIND_UI1} + DBVALUEKIND_UI2 = $00000012; + {$EXTERNALSYM DBVALUEKIND_UI2} + DBVALUEKIND_UI4 = $00000013; + {$EXTERNALSYM DBVALUEKIND_UI4} + DBVALUEKIND_I8 = $00000014; + {$EXTERNALSYM DBVALUEKIND_I8} + DBVALUEKIND_UI8 = $00000015; + {$EXTERNALSYM DBVALUEKIND_UI8} + DBVALUEKIND_GUID = $00000048; + {$EXTERNALSYM DBVALUEKIND_GUID} + DBVALUEKIND_BYTES = $00000080; + {$EXTERNALSYM DBVALUEKIND_BYTES} + DBVALUEKIND_STR = $00000081; + {$EXTERNALSYM DBVALUEKIND_STR} + DBVALUEKIND_WSTR = $00000082; + {$EXTERNALSYM DBVALUEKIND_WSTR} + DBVALUEKIND_NUMERIC = $00000083; + {$EXTERNALSYM DBVALUEKIND_NUMERIC} + DBVALUEKIND_DBDATE = $00000085; + {$EXTERNALSYM DBVALUEKIND_DBDATE} + DBVALUEKIND_DBTIME = $00000086; + {$EXTERNALSYM DBVALUEKIND_DBTIME} + DBVALUEKIND_DBTIMESTAMP = $00000087; + {$EXTERNALSYM DBVALUEKIND_DBTIMESTAMP} + +// DBSOURCETYPEENUM constants +type + DBSOURCETYPEENUM = TOleEnum; + {$EXTERNALSYM DBSOURCETYPEENUM} +const + DBSOURCETYPE_DATASOURCE = $00000001; + {$EXTERNALSYM DBSOURCETYPE_DATASOURCE} + DBSOURCETYPE_ENUMERATOR = $00000002; + {$EXTERNALSYM DBSOURCETYPE_ENUMERATOR} + +// DBSOURCETYPEENUM20 constants +type + DBSOURCETYPEENUM20 = TOleEnum; + {$EXTERNALSYM DBSOURCETYPEENUM20} +const + DBSOURCETYPE_DATASOURCE_TDP = $00000001; + {$EXTERNALSYM DBSOURCETYPE_DATASOURCE_TDP} + DBSOURCETYPE_DATASOURCE_MDP = $00000003; + {$EXTERNALSYM DBSOURCETYPE_DATASOURCE_MDP} + +// DBLITERALENUM constants +type + DBLITERALENUM = TOleEnum; + {$EXTERNALSYM DBLITERALENUM} +const + DBLITERAL_INVALID = $00000000; + {$EXTERNALSYM DBLITERAL_INVALID} + DBLITERAL_BINARY_LITERAL = $00000001; + {$EXTERNALSYM DBLITERAL_BINARY_LITERAL} + DBLITERAL_CATALOG_NAME = $00000002; + {$EXTERNALSYM DBLITERAL_CATALOG_NAME} + DBLITERAL_CATALOG_SEPARATOR = $00000003; + {$EXTERNALSYM DBLITERAL_CATALOG_SEPARATOR} + DBLITERAL_CHAR_LITERAL = $00000004; + {$EXTERNALSYM DBLITERAL_CHAR_LITERAL} + DBLITERAL_COLUMN_ALIAS = $00000005; + {$EXTERNALSYM DBLITERAL_COLUMN_ALIAS} + DBLITERAL_COLUMN_NAME = $00000006; + {$EXTERNALSYM DBLITERAL_COLUMN_NAME} + DBLITERAL_CORRELATION_NAME = $00000007; + {$EXTERNALSYM DBLITERAL_CORRELATION_NAME} + DBLITERAL_CURSOR_NAME = $00000008; + {$EXTERNALSYM DBLITERAL_CURSOR_NAME} + DBLITERAL_ESCAPE_PERCENT = $00000009; + {$EXTERNALSYM DBLITERAL_ESCAPE_PERCENT} + DBLITERAL_ESCAPE_UNDERSCORE = $0000000A; + {$EXTERNALSYM DBLITERAL_ESCAPE_UNDERSCORE} + DBLITERAL_INDEX_NAME = $0000000B; + {$EXTERNALSYM DBLITERAL_INDEX_NAME} + DBLITERAL_LIKE_PERCENT = $0000000C; + {$EXTERNALSYM DBLITERAL_LIKE_PERCENT} + DBLITERAL_LIKE_UNDERSCORE = $0000000D; + {$EXTERNALSYM DBLITERAL_LIKE_UNDERSCORE} + DBLITERAL_PROCEDURE_NAME = $0000000E; + {$EXTERNALSYM DBLITERAL_PROCEDURE_NAME} + DBLITERAL_QUOTE = $0000000F; + {$EXTERNALSYM DBLITERAL_QUOTE} + DBLITERAL_SCHEMA_NAME = $00000010; + {$EXTERNALSYM DBLITERAL_SCHEMA_NAME} + DBLITERAL_TABLE_NAME = $00000011; + {$EXTERNALSYM DBLITERAL_TABLE_NAME} + DBLITERAL_TEXT_COMMAND = $00000012; + {$EXTERNALSYM DBLITERAL_TEXT_COMMAND} + DBLITERAL_USER_NAME = $00000013; + {$EXTERNALSYM DBLITERAL_USER_NAME} + DBLITERAL_VIEW_NAME = $00000014; + {$EXTERNALSYM DBLITERAL_VIEW_NAME} + +// DBLITERALENUM20 constants +type + DBLITERALENUM20 = TOleEnum; + {$EXTERNALSYM DBLITERALENUM20} +const + DBLITERAL_CUBE_NAME = $00000015; + {$EXTERNALSYM DBLITERAL_CUBE_NAME} + DBLITERAL_DIMENSION_NAME = $00000016; + {$EXTERNALSYM DBLITERAL_DIMENSION_NAME} + DBLITERAL_HIERARCHY_NAME = $00000017; + {$EXTERNALSYM DBLITERAL_HIERARCHY_NAME} + DBLITERAL_LEVEL_NAME = $00000018; + {$EXTERNALSYM DBLITERAL_LEVEL_NAME} + DBLITERAL_MEMBER_NAME = $00000019; + {$EXTERNALSYM DBLITERAL_MEMBER_NAME} + DBLITERAL_PROPERTY_NAME = $0000001A; + {$EXTERNALSYM DBLITERAL_PROPERTY_NAME} + DBLITERAL_SCHEMA_SEPARATOR = $0000001B; + {$EXTERNALSYM DBLITERAL_SCHEMA_SEPARATOR} + DBLITERAL_QUOTE_SUFFIX = $0000001C; + {$EXTERNALSYM DBLITERAL_QUOTE_SUFFIX} + +// ACCESS_MASKENUM constants +type + ACCESS_MASKENUM = TOleEnum; + {$EXTERNALSYM ACCESS_MASKENUM} +const + PERM_EXCLUSIVE = $00000200; + {$EXTERNALSYM PERM_EXCLUSIVE} + PERM_READDESIGN = $00000400; + {$EXTERNALSYM PERM_READDESIGN} + PERM_WRITEDESIGN = $00000800; + {$EXTERNALSYM PERM_WRITEDESIGN} + PERM_WITHGRANT = $00001000; + {$EXTERNALSYM PERM_WITHGRANT} + PERM_REFERENCE = $00002000; + {$EXTERNALSYM PERM_REFERENCE} + PERM_CREATE = $00004000; + {$EXTERNALSYM PERM_CREATE} + PERM_INSERT = $00008000; + {$EXTERNALSYM PERM_INSERT} + PERM_DELETE = $00010000; + {$EXTERNALSYM PERM_DELETE} + PERM_READCONTROL = $00020000; + {$EXTERNALSYM PERM_READCONTROL} + PERM_WRITEPERMISSIONS = $00040000; + {$EXTERNALSYM PERM_WRITEPERMISSIONS} + PERM_WRITEOWNER = $00080000; + {$EXTERNALSYM PERM_WRITEOWNER} + PERM_MAXIMUM_ALLOWED = $02000000; + {$EXTERNALSYM PERM_MAXIMUM_ALLOWED} + PERM_ALL = $10000000; + {$EXTERNALSYM PERM_ALL} + PERM_EXECUTE = $20000000; + {$EXTERNALSYM PERM_EXECUTE} + PERM_READ = $80000000; + {$EXTERNALSYM PERM_READ} + PERM_UPDATE = $40000000; + {$EXTERNALSYM PERM_UPDATE} + PERM_DROP = $00000100; + {$EXTERNALSYM PERM_DROP} + +//MULTIPLE_TRUSTEE_OPERATION constants +type + MULTIPLE_TRUSTEE_OPERATION = TOleEnum; + {$EXTERNALSYM MULTIPLE_TRUSTEE_OPERATION} +const + NO_MULTIPLE_TRUSTEE = $00000000; + {$EXTERNALSYM NO_MULTIPLE_TRUSTEE} + TRUSTEE_IS_IMPERSONATE = $00000001; + {$EXTERNALSYM TRUSTEE_IS_IMPERSONATE} + +// TRUSTEE_FORM constants +type + TRUSTEE_FORM = TOleEnum; + {$EXTERNALSYM TRUSTEE_FORM} +const + TRUSTEE_IS_SID = $00000000; + {$EXTERNALSYM TRUSTEE_IS_SID} + TRUSTEE_IS_NAME = $00000001; + {$EXTERNALSYM TRUSTEE_IS_NAME} + TRUSTEE_BAD_FORM = $00000002; + {$EXTERNALSYM TRUSTEE_BAD_FORM} + +// TRUSTEE_TYPE constants +type + TRUSTEE_TYPE = TOleEnum; + {$EXTERNALSYM TRUSTEE_TYPE} +const + TRUSTEE_IS_UNKNOWN = $00000000; + {$EXTERNALSYM TRUSTEE_IS_UNKNOWN} + TRUSTEE_IS_USER = $00000001; + {$EXTERNALSYM TRUSTEE_IS_USER} + TRUSTEE_IS_GROUP = $00000002; + {$EXTERNALSYM TRUSTEE_IS_GROUP} + TRUSTEE_IS_DOMAIN = $00000003; + {$EXTERNALSYM TRUSTEE_IS_DOMAIN} + TRUSTEE_IS_ALIAS = $00000004; + {$EXTERNALSYM TRUSTEE_IS_ALIAS} + TRUSTEE_IS_WELL_KNOWN_GROUP = $00000005; + {$EXTERNALSYM TRUSTEE_IS_WELL_KNOWN_GROUP} + TRUSTEE_IS_DELETED = $00000006; + {$EXTERNALSYM TRUSTEE_IS_DELETED} + TRUSTEE_IS_INVALID = $00000007; + {$EXTERNALSYM TRUSTEE_IS_INVALID} + +// ACCESS_MODE constants +type + ACCESS_MODE = TOleEnum; + {$EXTERNALSYM ACCESS_MODE} +const + NOT_USED_ACCESS = $00000000; + {$EXTERNALSYM NOT_USED_ACCESS} + GRANT_ACCESS = $00000001; + {$EXTERNALSYM GRANT_ACCESS} + SET_ACCESS = $00000002; + {$EXTERNALSYM SET_ACCESS} + DENY_ACCESS = $00000003; + {$EXTERNALSYM DENY_ACCESS} + REVOKE_ACCESS = $00000004; + {$EXTERNALSYM REVOKE_ACCESS} + SET_AUDIT_SUCCESS = $00000005; + {$EXTERNALSYM SET_AUDIT_SUCCESS} + SET_AUDIT_FAILURE = $00000006; + {$EXTERNALSYM SET_AUDIT_FAILURE} + +// DBPROPTOPTIONS constants +type + DBPROMPTOPTIONS = TOleEnum; + {$EXTERNALSYM DBPROMPTOPTIONS} +const + DBPROMPTOPTIONS_NONE = 0; + {$EXTERNALSYM DBPROMPTOPTIONS_NONE} + DBPROMPTOPTIONS_WIZARDSHEET = $1; + {$EXTERNALSYM DBPROMPTOPTIONS_WIZARDSHEET} + DBPROMPTOPTIONS_PROPERTYSHEET = $2; + {$EXTERNALSYM DBPROMPTOPTIONS_PROPERTYSHEET} + DBPROMPTOPTIONS_BROWSEONLY = $8; + {$EXTERNALSYM DBPROMPTOPTIONS_BROWSEONLY} + DBPROMPTOPTIONS_DISABLE_PROVIDER_SELECTION = $10; + {$EXTERNALSYM DBPROMPTOPTIONS_DISABLE_PROVIDER_SELECTION} + +type + +// *********************************************************************// +// Declaration of structures, unions and aliases. // +// *********************************************************************// + + DBSTATUS = DWORD; + {$EXTERNALSYM DBSTATUS} + DBTYPE = Word; + {$EXTERNALSYM DBTYPE} + DBKIND = UINT; + {$EXTERNALSYM DBKIND} + DBPARAMIO = UINT; + {$EXTERNALSYM DBPARAMIO} + DBMEMOWNER = UINT; + {$EXTERNALSYM DBMEMOWNER} + DBPART = UINT; + {$EXTERNALSYM DBPART} + DBPROPSTATUS = UINT; + {$EXTERNALSYM DBPROPSTATUS} + DBPROPOPTIONS = UINT; + {$EXTERNALSYM DBPROPOPTIONS} + DBPROPFLAGS = UINT; + {$EXTERNALSYM DBPROPFLAGS} + DBBINDSTATUS = UINT; + {$EXTERNALSYM DBBINDSTATUS} + HWATCHREGION = UINT; + {$EXTERNALSYM HWATCHREGION} + DBINDEX_COL_ORDER = UINT; + {$EXTERNALSYM DBINDEX_COL_ORDER} + DBCOLUMNFLAGS = UINT; + {$EXTERNALSYM DBCOLUMNFLAGS} + DBCOMMANDOP = Word; + {$EXTERNALSYM DBCOMMANDOP} + DBASYNCHOP = UINT; + {$EXTERNALSYM DBASYNCHOP} + DBREASON = UINT; + {$EXTERNALSYM DBREASON} + DBEVENTPHASE = UINT; + {$EXTERNALSYM DBEVENTPHASE} + DBCOLUMNDESCFLAGS = UINT; + {$EXTERNALSYM DBCOLUMNDESCFLAGS} + DBPARAMFLAGS = UINT; + {$EXTERNALSYM DBPARAMFLAGS} + + HACCESSOR = UINT; + PHACCESSOR = ^HACCESSOR; + {$EXTERNALSYM HACCESSOR} + + HCHAPTER = UINT; + PHCHAPTER = HCHAPTER; + {$EXTERNALSYM HCHAPTER} + + HROW = UINT; + PHROW = ^HROW; + PPHROW = ^PHROW; + {$EXTERNALSYM HROW} + + DBROWSTATUS = UINT; + PDBROWSTATUS = IntPtr; // ^DBROWSTATUS; + PPDBROWSTATUS = IntPtr; // ^PDBROWSTATUS; + {$EXTERNALSYM DBROWSTATUS} + + DBPENDINGSTATUS = DWORD; + PDBPENDINGSTATUS = ^DBPENDINGSTATUS; + PPDBPENDINGSTATUS = ^PDBPENDINGSTATUS; + {$EXTERNALSYM DBPENDINGSTATUS} + + DBROWOPTIONS = UINT; + PDBROWOPTIONS = ^DBROWOPTIONS; + {$EXTERNALSYM DBROWOPTIONS} + + DBSOURCETYPE = DWORD; + PDBSOURCETYPE = ^DBSOURCETYPE; + {$EXTERNALSYM DBSOURCETYPE} + +// *********************************************************************// +// Error Constants from OLEDBERR.H +// *********************************************************************// + +// +// Values are 32 bit values layed out as follows: +// +// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 +// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +// +-+-+-+-+-+---------------------+-------------------------------+ +// |S|R|C|N|r| Facility | Code | +// +-+-+-+-+-+---------------------+-------------------------------+ +// +// where +// +// S - Severity - indicates success/fail +// +// 0 - Success +// 1 - Fail (COERROR) +// +// R - reserved portion of the facility code, corresponds to NT's +// second severity bit. +// +// C - reserved portion of the facility code, corresponds to NT's +// C field. +// +// N - reserved portion of the facility code. Used to indicate a +// mapped NT status value. +// +// r - reserved portion of the facility code. Reserved for internal +// use. Used to indicate HRESULT values that are not status +// values, but are instead message ids for display strings. +// +// Facility - is the facility code +// +// Code - is the facility's status code +// +// +// Define the facility codes +// +const + FACILITY_WINDOWS = $8; + {$EXTERNALSYM FACILITY_WINDOWS} + FACILITY_ITF = $4; + {$EXTERNALSYM FACILITY_ITF} + + +// +// Define the severity codes +// + STATUS_SEVERITY_SUCCESS = $0; + {$EXTERNALSYM STATUS_SEVERITY_SUCCESS} + STATUS_SEVERITY_COERROR = $2; + {$EXTERNALSYM STATUS_SEVERITY_COERROR} + + +// +// MessageId: DB_E_BOGUS +// +// MessageText: +// +// Dummy error - need this error so that mc puts the above defines +// inside the FACILITY_WINDOWS guard, instead of leaving it empty +// + DB_E_BOGUS = HResult($80040EFF); + {$EXTERNALSYM DB_E_BOGUS} + + +// +// Codes 0x0e00-0x0eff are reserved for the OLE DB group of +// interfaces. +// +// Free codes are: +// +// Error: +// -none- +// +// Success: +// 0x0eea +// 0x0ed7 +// + + +// +// MessageId: DB_E_BADACCESSORHANDLE +// +// MessageText: +// +// Invalid accessor +// + DB_E_BADACCESSORHANDLE = HResult($80040E00); + {$EXTERNALSYM DB_E_BADACCESSORHANDLE} + +// +// MessageId: DB_E_ROWLIMITEXCEEDED +// +// MessageText: +// +// Creating another row would have exceeded the total number of active +// rows supported by the rowset +// + DB_E_ROWLIMITEXCEEDED = HResult($80040E01); + {$EXTERNALSYM DB_E_ROWLIMITEXCEEDED} + +// +// MessageId: DB_E_READONLYACCESSOR +// +// MessageText: +// +// Unable to write with a read-only accessor +// + DB_E_READONLYACCESSOR = HResult($80040E02); + {$EXTERNALSYM DB_E_READONLYACCESSOR} + +// +// MessageId: DB_E_SCHEMAVIOLATION +// +// MessageText: +// +// Given values violate the database schema +// + DB_E_SCHEMAVIOLATION = HResult($80040E03); + {$EXTERNALSYM DB_E_SCHEMAVIOLATION} + +// +// MessageId: DB_E_BADROWHANDLE +// +// MessageText: +// +// Invalid row handle +// + DB_E_BADROWHANDLE = HResult($80040E04); + {$EXTERNALSYM DB_E_BADROWHANDLE} + +// +// MessageId: DB_E_OBJECTOPEN +// +// MessageText: +// +// An object was open +// + DB_E_OBJECTOPEN = HResult($80040E05); + {$EXTERNALSYM DB_E_OBJECTOPEN} + +// @@@+ V1.5 +// +// MessageId: DB_E_BADCHAPTER +// +// MessageText: +// +// Invalid chapter +// + DB_E_BADCHAPTER = HResult($80040E06); + {$EXTERNALSYM DB_E_BADCHAPTER} + +// @@@- V1.5 + +// +// MessageId: DB_E_CANTCONVERTVALUE +// +// MessageText: +// +// A literal value in the command could not be converted to the +// correct type due to a reason other than data overflow +// + DB_E_CANTCONVERTVALUE = HResult($80040E07); + {$EXTERNALSYM DB_E_CANTCONVERTVALUE} + +// +// MessageId: DB_E_BADBINDINFO +// +// MessageText: +// +// Invalid binding info +// + DB_E_BADBINDINFO = HResult($80040E08); + {$EXTERNALSYM DB_E_BADBINDINFO} + +// +// MessageId: DB_SEC_E_PERMISSIONDENIED +// +// MessageText: +// +// Permission denied +// + DB_SEC_E_PERMISSIONDENIED = HResult($80040E09); + {$EXTERNALSYM DB_SEC_E_PERMISSIONDENIED} + +// +// MessageId: DB_E_NOTAREFERENCECOLUMN +// +// MessageText: +// +// Specified column does not contain bookmarks or chapters +// + DB_E_NOTAREFERENCECOLUMN = HResult($80040E0A); + {$EXTERNALSYM DB_E_NOTAREFERENCECOLUMN} + +// @@@+ V2.5 +// +// MessageId: DB_E_LIMITREJECTED +// +// MessageText: +// +// Some cost limits were rejected +// + DB_E_LIMITREJECTED = HResult($80040E0B); + {$EXTERNALSYM DB_E_LIMITREJECTED} + +// @@@- V2.5 + +// +// MessageId: DB_E_NOCOMMAND +// +// MessageText: +// +// No command has been set for the command object +// + DB_E_NOCOMMAND = HResult($80040E0C); + {$EXTERNALSYM DB_E_NOCOMMAND} + +// @@@+ V2.5 +// +// MessageId: DB_E_COSTLIMIT +// +// MessageText: +// +// Unable to find a query plan within the given cost limit +// + DB_E_COSTLIMIT = HResult($80040E0D); + {$EXTERNALSYM DB_E_COSTLIMIT} + +// @@@- V2.5 + +// +// MessageId: DB_E_BADBOOKMARK +// +// MessageText: +// +// Invalid bookmark +// + DB_E_BADBOOKMARK = HResult($80040E0E); + {$EXTERNALSYM DB_E_BADBOOKMARK} + +// +// MessageId: DB_E_BADLOCKMODE +// +// MessageText: +// +// Invalid lock mode +// + DB_E_BADLOCKMODE = HResult($80040E0F); + {$EXTERNALSYM DB_E_BADLOCKMODE} + +// +// MessageId: DB_E_PARAMNOTOPTIONAL +// +// MessageText: +// +// No value given for one or more required parameters +// + DB_E_PARAMNOTOPTIONAL = HResult($80040E10); + {$EXTERNALSYM DB_E_PARAMNOTOPTIONAL} + +// +// MessageId: DB_E_BADCOLUMNID +// +// MessageText: +// +// Invalid column ID +// + DB_E_BADCOLUMNID = HResult($80040E11); + {$EXTERNALSYM DB_E_BADCOLUMNID} + +// +// MessageId: DB_E_BADRATIO +// +// MessageText: +// +// Invalid ratio +// + DB_E_BADRATIO = HResult($80040E12); + {$EXTERNALSYM DB_E_BADRATIO} + +// @@@+ V2.0 +// +// MessageId: DB_E_BADVALUES +// +// MessageText: +// +// Invalid value +// + DB_E_BADVALUES = HResult($80040E13); + {$EXTERNALSYM DB_E_BADVALUES} + +// @@@- V2.0 + +// +// MessageId: DB_E_ERRORSINCOMMAND +// +// MessageText: +// +// The command contained one or more errors +// + DB_E_ERRORSINCOMMAND = HResult($80040E14); + {$EXTERNALSYM DB_E_ERRORSINCOMMAND} + +// +// MessageId: DB_E_CANTCANCEL +// +// MessageText: +// +// The executing command cannot be canceled +// + DB_E_CANTCANCEL = HResult($80040E15); + {$EXTERNALSYM DB_E_CANTCANCEL} + +// +// MessageId: DB_E_DIALECTNOTSUPPORTED +// +// MessageText: +// +// The provider does not support the specified dialect +// + DB_E_DIALECTNOTSUPPORTED = HResult($80040E16); + {$EXTERNALSYM DB_E_DIALECTNOTSUPPORTED} + +// +// MessageId: DB_E_DUPLICATEDATASOURCE +// +// MessageText: +// +// A data source with the specified name already exists +// + DB_E_DUPLICATEDATASOURCE = HResult($80040E17); + {$EXTERNALSYM DB_E_DUPLICATEDATASOURCE} + +// +// MessageId: DB_E_CANNOTRESTART +// +// MessageText: +// +// The rowset was built over a live data feed and cannot be restarted +// + DB_E_CANNOTRESTART = HResult($80040E18); + {$EXTERNALSYM DB_E_CANNOTRESTART} + +// +// MessageId: DB_E_NOTFOUND +// +// MessageText: +// +// No key matching the described characteristics could be found within +// the current range +// + DB_E_NOTFOUND = HResult($80040E19); + {$EXTERNALSYM DB_E_NOTFOUND} + +// +// MessageId: DB_E_NEWLYINSERTED +// +// MessageText: +// +// The provider is unable to determine identity for newly inserted +// rows +// + DB_E_NEWLYINSERTED = HResult($80040E1B); + {$EXTERNALSYM DB_E_NEWLYINSERTED} + +// @@@+ V2.5 +// +// MessageId: DB_E_CANNOTFREE +// +// MessageText: +// +// Ownership of this tree has been given to the provider +// + DB_E_CANNOTFREE = HResult($80040E1A); + {$EXTERNALSYM DB_E_CANNOTFREE} + +// +// MessageId: DB_E_GOALREJECTED +// +// MessageText: +// +// No nonzero weights specified for any goals supported, so goal was +// rejected; current goal was not changed +// + DB_E_GOALREJECTED = HResult($80040E1C); + {$EXTERNALSYM DB_E_GOALREJECTED} + +// @@@- V2.5 + +// +// MessageId: DB_E_UNSUPPORTEDCONVERSION +// +// MessageText: +// +// Requested conversion is not supported +// + DB_E_UNSUPPORTEDCONVERSION = HResult($80040E1D); + {$EXTERNALSYM DB_E_UNSUPPORTEDCONVERSION} + +// +// MessageId: DB_E_BADSTARTPOSITION +// +// MessageText: +// +// lRowsOffset would position you past either end of the rowset, +// regardless of the cRows value specified; cRowsObtained is 0 +// + DB_E_BADSTARTPOSITION = HResult($80040E1E); + {$EXTERNALSYM DB_E_BADSTARTPOSITION} + +// @@@+ V2.0 +// +// MessageId: DB_E_NOQUERY +// +// MessageText: +// +// Information was requested for a query, and the query was not set +// + DB_E_NOQUERY = HResult($80040E1F); + {$EXTERNALSYM DB_E_NOQUERY} + +// @@@- V2.0 + +// +// MessageId: DB_E_NOTREENTRANT +// +// MessageText: +// +// Provider called a method from IRowsetNotify in the consumer and the +// method has not yet returned +// + DB_E_NOTREENTRANT = HResult($80040E20); + {$EXTERNALSYM DB_E_NOTREENTRANT} + +// +// MessageId: DB_E_ERRORSOCCURRED +// +// MessageText: +// +// Errors occurred +// + DB_E_ERRORSOCCURRED = HResult($80040E21); + {$EXTERNALSYM DB_E_ERRORSOCCURRED} + +// +// MessageId: DB_E_NOAGGREGATION +// +// MessageText: +// +// A non-NULL controlling IUnknown was specified and the object being +// created does not support aggregation +// + DB_E_NOAGGREGATION = HResult($80040E22); + {$EXTERNALSYM DB_E_NOAGGREGATION} + +// +// MessageId: DB_E_DELETEDROW +// +// MessageText: +// +// A given HROW referred to a hard- or soft-deleted row +// + DB_E_DELETEDROW = HResult($80040E23); + {$EXTERNALSYM DB_E_DELETEDROW} + +// +// MessageId: DB_E_CANTFETCHBACKWARDS +// +// MessageText: +// +// The rowset does not support fetching backwards +// + DB_E_CANTFETCHBACKWARDS = HResult($80040E24); + {$EXTERNALSYM DB_E_CANTFETCHBACKWARDS} + +// +// MessageId: DB_E_ROWSNOTRELEASED +// +// MessageText: +// +// All HROWs must be released before new ones can be obtained +// + DB_E_ROWSNOTRELEASED = HResult($80040E25); + {$EXTERNALSYM DB_E_ROWSNOTRELEASED} + +// +// MessageId: DB_E_BADSTORAGEFLAG +// +// MessageText: +// +// One of the specified storage flags was not supported +// + DB_E_BADSTORAGEFLAG = HResult($80040E26); + {$EXTERNALSYM DB_E_BADSTORAGEFLAG} + +// @@@+ V1.5 +// +// MessageId: DB_E_BADCOMPAREOP +// +// MessageText: +// +// The comparison operator was invalid +// + DB_E_BADCOMPAREOP = HResult($80040E27); + {$EXTERNALSYM DB_E_BADCOMPAREOP} + +// @@@- V1.5 + +// +// MessageId: DB_E_BADSTATUSVALUE +// +// MessageText: +// +// The specified status flag was neither DBCOLUMNSTATUS_OK nor +// DBCOLUMNSTATUS_ISNULL +// + DB_E_BADSTATUSVALUE = HResult($80040E28); + {$EXTERNALSYM DB_E_BADSTATUSVALUE} + +// +// MessageId: DB_E_CANTSCROLLBACKWARDS +// +// MessageText: +// +// The rowset cannot scroll backwards +// + DB_E_CANTSCROLLBACKWARDS = HResult($80040E29); + {$EXTERNALSYM DB_E_CANTSCROLLBACKWARDS} + +// @@@+ V2.5 +// +// MessageId: DB_E_BADREGIONHANDLE +// +// MessageText: +// +// Invalid region handle +// + DB_E_BADREGIONHANDLE = HResult($80040E2A); + {$EXTERNALSYM DB_E_BADREGIONHANDLE} + +// +// MessageId: DB_E_NONCONTIGUOUSRANGE +// +// MessageText: +// +// The specified set of rows was not contiguous to or overlapping the +// rows in the specified watch region +// + DB_E_NONCONTIGUOUSRANGE = HResult($80040E2B); + {$EXTERNALSYM DB_E_NONCONTIGUOUSRANGE} + +// +// MessageId: DB_E_INVALIDTRANSITION +// +// MessageText: +// +// A transition from ALL* to MOVE* or EXTEND* was specified +// + DB_E_INVALIDTRANSITION = HResult($80040E2C); + {$EXTERNALSYM DB_E_INVALIDTRANSITION} + +// +// MessageId: DB_E_NOTASUBREGION +// +// MessageText: +// +// The specified region is not a proper subregion of the region +// identified by the given watch region handle +// + DB_E_NOTASUBREGION = HResult($80040E2D); + {$EXTERNALSYM DB_E_NOTASUBREGION} + +// @@@- V2.5 + +// +// MessageId: DB_E_MULTIPLESTATEMENTS +// +// MessageText: +// +// The provider does not support multi-statement commands +// + DB_E_MULTIPLESTATEMENTS = HResult($80040E2E); + {$EXTERNALSYM DB_E_MULTIPLESTATEMENTS} + +// +// MessageId: DB_E_INTEGRITYVIOLATION +// +// MessageText: +// +// A specified value violated the integrity constraints for a column or +// table +// + DB_E_INTEGRITYVIOLATION = HResult($80040E2F); + {$EXTERNALSYM DB_E_INTEGRITYVIOLATION} + +// +// MessageId: DB_E_BADTYPENAME +// +// MessageText: +// +// The given type name was unrecognized +// + DB_E_BADTYPENAME = HResult($80040E30); + {$EXTERNALSYM DB_E_BADTYPENAME} + +// +// MessageId: DB_E_ABORTLIMITREACHED +// +// MessageText: +// +// Execution aborted because a resource limit has been reached; no +// results have been returned +// + DB_E_ABORTLIMITREACHED = HResult($80040E31); + {$EXTERNALSYM DB_E_ABORTLIMITREACHED} + +// @@@+ V2.0 +// +// MessageId: DB_E_ROWSETINCOMMAND +// +// MessageText: +// +// Cannot clone a command object whose command tree contains a rowset +// or rowsets +// + DB_E_ROWSETINCOMMAND = HResult($80040E32); + {$EXTERNALSYM DB_E_ROWSETINCOMMAND} + +// +// MessageId: DB_E_CANTTRANSLATE +// +// MessageText: +// +// Cannot represent the current tree as text +// + DB_E_CANTTRANSLATE = HResult($80040E33); + {$EXTERNALSYM DB_E_CANTTRANSLATE} + +// @@@- V2.0 + +// +// MessageId: DB_E_DUPLICATEINDEXID +// +// MessageText: +// +// The specified index already exists +// + DB_E_DUPLICATEINDEXID = HResult($80040E34); + {$EXTERNALSYM DB_E_DUPLICATEINDEXID} + +// +// MessageId: DB_E_NOINDEX +// +// MessageText: +// +// The specified index does not exist +// + DB_E_NOINDEX = HResult($80040E35); + {$EXTERNALSYM DB_E_NOINDEX} + +// +// MessageId: DB_E_INDEXINUSE +// +// MessageText: +// +// The specified index was in use +// + DB_E_INDEXINUSE = HResult($80040E36); + {$EXTERNALSYM DB_E_INDEXINUSE} + +// +// MessageId: DB_E_NOTABLE +// +// MessageText: +// +// The specified table does not exist +// + DB_E_NOTABLE = HResult($80040E37); + {$EXTERNALSYM DB_E_NOTABLE} + +// +// MessageId: DB_E_CONCURRENCYVIOLATION +// +// MessageText: +// +// The rowset was using optimistic concurrency and the value of a +// column has been changed since it was last read +// + DB_E_CONCURRENCYVIOLATION = HResult($80040E38); + {$EXTERNALSYM DB_E_CONCURRENCYVIOLATION} + +// +// MessageId: DB_E_BADCOPY +// +// MessageText: +// +// Errors were detected during the copy +// + DB_E_BADCOPY = HResult($80040E39); + {$EXTERNALSYM DB_E_BADCOPY} + +// +// MessageId: DB_E_BADPRECISION +// +// MessageText: +// +// A specified precision was invalid +// + DB_E_BADPRECISION = HResult($80040E3A); + {$EXTERNALSYM DB_E_BADPRECISION} + +// +// MessageId: DB_E_BADSCALE +// +// MessageText: +// +// A specified scale was invalid +// + DB_E_BADSCALE = HResult($80040E3B); + {$EXTERNALSYM DB_E_BADSCALE} + +// +// MessageId: DB_E_BADTABLEID +// +// MessageText: +// +// Invalid table ID +// + DB_E_BADTABLEID = HResult($80040E3C); + {$EXTERNALSYM DB_E_BADTABLEID} + +// DB_E_BADID is deprecated; use DB_E_BADTABLEID instead + DB_E_BADID = DB_E_BADTABLEID; + {$EXTERNALSYM DB_E_BADID} + +// +// MessageId: DB_E_BADTYPE +// +// MessageText: +// +// A specified type was invalid +// + DB_E_BADTYPE = HResult($80040E3D); + {$EXTERNALSYM DB_E_BADTYPE} + +// +// MessageId: DB_E_DUPLICATECOLUMNID +// +// MessageText: +// +// A column ID was occurred more than once in the specification +// + DB_E_DUPLICATECOLUMNID = HResult($80040E3E); + {$EXTERNALSYM DB_E_DUPLICATECOLUMNID} + +// +// MessageId: DB_E_DUPLICATETABLEID +// +// MessageText: +// +// The specified table already exists +// + DB_E_DUPLICATETABLEID = HResult($80040E3F); + {$EXTERNALSYM DB_E_DUPLICATETABLEID} + +// +// MessageId: DB_E_TABLEINUSE +// +// MessageText: +// +// The specified table was in use +// + DB_E_TABLEINUSE = HResult($80040E40); + {$EXTERNALSYM DB_E_TABLEINUSE} + +// +// MessageId: DB_E_NOLOCALE +// +// MessageText: +// +// The specified locale ID was not supported +// + DB_E_NOLOCALE = HResult($80040E41); + {$EXTERNALSYM DB_E_NOLOCALE} + +// +// MessageId: DB_E_BADRECORDNUM +// +// MessageText: +// +// The specified record number is invalid +// + DB_E_BADRECORDNUM = HResult($80040E42); + {$EXTERNALSYM DB_E_BADRECORDNUM} + +// +// MessageId: DB_E_BOOKMARKSKIPPED +// +// MessageText: +// +// Although the bookmark was validly formed, no row could be found to +// match it +// + DB_E_BOOKMARKSKIPPED = HResult($80040E43); + {$EXTERNALSYM DB_E_BOOKMARKSKIPPED} + +// +// MessageId: DB_E_BADPROPERTYVALUE +// +// MessageText: +// +// The value of a property was invalid +// + DB_E_BADPROPERTYVALUE = HResult($80040E44); + {$EXTERNALSYM DB_E_BADPROPERTYVALUE} + +// +// MessageId: DB_E_INVALID +// +// MessageText: +// +// The rowset was not chaptered +// + DB_E_INVALID = HResult($80040E45); + {$EXTERNALSYM DB_E_INVALID} + +// +// MessageId: DB_E_BADACCESSORFLAGS +// +// MessageText: +// +// Invalid accessor +// + DB_E_BADACCESSORFLAGS = HResult($80040E46); + {$EXTERNALSYM DB_E_BADACCESSORFLAGS} + +// +// MessageId: DB_E_BADSTORAGEFLAGS +// +// MessageText: +// +// Invalid storage flags +// + DB_E_BADSTORAGEFLAGS = HResult($80040E47); + {$EXTERNALSYM DB_E_BADSTORAGEFLAGS} + +// +// MessageId: DB_E_BYREFACCESSORNOTSUPPORTED +// +// MessageText: +// +// By-ref accessors are not supported by this provider +// + DB_E_BYREFACCESSORNOTSUPPORTED = HResult($80040E48); + {$EXTERNALSYM DB_E_BYREFACCESSORNOTSUPPORTED} + +// +// MessageId: DB_E_NULLACCESSORNOTSUPPORTED +// +// MessageText: +// +// Null accessors are not supported by this provider +// + DB_E_NULLACCESSORNOTSUPPORTED = HResult($80040E49); + {$EXTERNALSYM DB_E_NULLACCESSORNOTSUPPORTED} + +// +// MessageId: DB_E_NOTPREPARED +// +// MessageText: +// +// The command was not prepared +// + DB_E_NOTPREPARED = HResult($80040E4A); + {$EXTERNALSYM DB_E_NOTPREPARED} + +// +// MessageId: DB_E_BADACCESSORTYPE +// +// MessageText: +// +// The specified accessor was not a parameter accessor +// + DB_E_BADACCESSORTYPE = HResult($80040E4B); + {$EXTERNALSYM DB_E_BADACCESSORTYPE} + +// +// MessageId: DB_E_WRITEONLYACCESSOR +// +// MessageText: +// +// The given accessor was write-only +// + DB_E_WRITEONLYACCESSOR = HResult($80040E4C); + {$EXTERNALSYM DB_E_WRITEONLYACCESSOR} + +// +// MessageId: DB_SEC_E_AUTH_FAILED +// +// MessageText: +// +// Authentication failed +// + DB_SEC_E_AUTH_FAILED = HResult($80040E4D); + {$EXTERNALSYM DB_SEC_E_AUTH_FAILED} + +// +// MessageId: DB_E_CANCELED +// +// MessageText: +// +// The change was canceled during notification; no columns are changed +// + DB_E_CANCELED = HResult($80040E4E); + {$EXTERNALSYM DB_E_CANCELED} + +// @@@+ V2.0 +// +// MessageId: DB_E_CHAPTERNOTRELEASED +// +// MessageText: +// +// The rowset was single-chaptered and the chapter was not released +// + DB_E_CHAPTERNOTRELEASED = HResult($80040E4F); + {$EXTERNALSYM DB_E_CHAPTERNOTRELEASED} + +// @@@- V2.0 + +// +// MessageId: DB_E_BADSOURCEHANDLE +// +// MessageText: +// +// Invalid source handle +// + DB_E_BADSOURCEHANDLE = HResult($80040E50); + {$EXTERNALSYM DB_E_BADSOURCEHANDLE} + +// +// MessageId: DB_E_PARAMUNAVAILABLE +// +// MessageText: +// +// The provider cannot derive parameter info and SetParameterInfo has +// not been called +// + DB_E_PARAMUNAVAILABLE = HResult($80040E51); + {$EXTERNALSYM DB_E_PARAMUNAVAILABLE} + +// +// MessageId: DB_E_ALREADYINITIALIZED +// +// MessageText: +// +// The data source object is already initialized +// + DB_E_ALREADYINITIALIZED = HResult($80040E52); + {$EXTERNALSYM DB_E_ALREADYINITIALIZED} + +// +// MessageId: DB_E_NOTSUPPORTED +// +// MessageText: +// +// The provider does not support this method +// + DB_E_NOTSUPPORTED = HResult($80040E53); + {$EXTERNALSYM DB_E_NOTSUPPORTED} + +// +// MessageId: DB_E_MAXPENDCHANGESEXCEEDED +// +// MessageText: +// +// The number of rows with pending changes has exceeded the set limit +// + DB_E_MAXPENDCHANGESEXCEEDED = HResult($80040E54); + {$EXTERNALSYM DB_E_MAXPENDCHANGESEXCEEDED} + +// +// MessageId: DB_E_BADORDINAL +// +// MessageText: +// +// The specified column did not exist +// + DB_E_BADORDINAL = HResult($80040E55); + {$EXTERNALSYM DB_E_BADORDINAL} + +// +// MessageId: DB_E_PENDINGCHANGES +// +// MessageText: +// +// There are pending changes on a row with a reference count of zero +// + DB_E_PENDINGCHANGES = HResult($80040E56); + {$EXTERNALSYM DB_E_PENDINGCHANGES} + +// +// MessageId: DB_E_DATAOVERFLOW +// +// MessageText: +// +// A literal value in the command overflowed the range of the type of +// the associated column +// + DB_E_DATAOVERFLOW = HResult($80040E57); + {$EXTERNALSYM DB_E_DATAOVERFLOW} + +// +// MessageId: DB_E_BADHRESULT +// +// MessageText: +// +// The supplied HRESULT was invalid +// + DB_E_BADHRESULT = HResult($80040E58); + {$EXTERNALSYM DB_E_BADHRESULT} + +// +// MessageId: DB_E_BADLOOKUPID +// +// MessageText: +// +// The supplied LookupID was invalid +// + DB_E_BADLOOKUPID = HResult($80040E59); + {$EXTERNALSYM DB_E_BADLOOKUPID} + +// +// MessageId: DB_E_BADDYNAMICERRORID +// +// MessageText: +// +// The supplied DynamicErrorID was invalid +// + DB_E_BADDYNAMICERRORID = HResult($80040E5A); + {$EXTERNALSYM DB_E_BADDYNAMICERRORID} + +// +// MessageId: DB_E_PENDINGINSERT +// +// MessageText: +// +// Unable to get visible data for a newly-inserted row that has not +// yet been updated +// + DB_E_PENDINGINSERT = HResult($80040E5B); + {$EXTERNALSYM DB_E_PENDINGINSERT} + +// +// MessageId: DB_E_BADCONVERTFLAG +// +// MessageText: +// +// Invalid conversion flag +// + DB_E_BADCONVERTFLAG = HResult($80040E5C); + {$EXTERNALSYM DB_E_BADCONVERTFLAG} + +// +// MessageId: DB_E_BADPARAMETERNAME +// +// MessageText: +// +// The given parameter name was unrecognized +// + DB_E_BADPARAMETERNAME = HResult($80040E5D); + {$EXTERNALSYM DB_E_BADPARAMETERNAME} + +// +// MessageId: DB_E_MULTIPLESTORAGE +// +// MessageText: +// +// Multiple storage objects can not be open simultaneously +// + DB_E_MULTIPLESTORAGE = HResult($80040E5E); + {$EXTERNALSYM DB_E_MULTIPLESTORAGE} + +// +// MessageId: DB_E_CANTFILTER +// +// MessageText: +// +// The requested filter could not be opened +// + DB_E_CANTFILTER = HResult($80040E5F); + {$EXTERNALSYM DB_E_CANTFILTER} + +// +// MessageId: DB_E_CANTORDER +// +// MessageText: +// +// The requested order could not be opened +// + DB_E_CANTORDER = HResult($80040E60); + {$EXTERNALSYM DB_E_CANTORDER} + +// @@@+ V2.0 +// +// MessageId: MD_E_BADTUPLE +// +// MessageText: +// +// Bad tuple +// + MD_E_BADTUPLE = HResult($80040E61); + {$EXTERNALSYM MD_E_BADTUPLE} + +// +// MessageId: MD_E_BADCOORDINATE +// +// MessageText: +// +// Bad coordinate +// + MD_E_BADCOORDINATE = HResult($80040E62); + {$EXTERNALSYM MD_E_BADCOORDINATE} + +// +// MessageId: MD_E_INVALIDAXIS +// +// MessageText: +// +// The given aixs was not valid for this Dataset +// + MD_E_INVALIDAXIS = HResult($80040E63); + {$EXTERNALSYM MD_E_INVALIDAXIS} + +// +// MessageId: MD_E_INVALIDCELLRANGE +// +// MessageText: +// +// One or more of the given cell ordinals was invalid +// + MD_E_INVALIDCELLRANGE = HResult($80040E64); + {$EXTERNALSYM MD_E_INVALIDCELLRANGE} + +// +// MessageId: DB_E_NOCOLUMN +// +// MessageText: +// +// The supplied columnID was invalid +// + DB_E_NOCOLUMN = HResult($80040E65); + {$EXTERNALSYM DB_E_NOCOLUMN} + +// +// MessageId: DB_E_COMMANDNOTPERSISTED +// +// MessageText: +// +// The supplied command does not have a DBID +// + DB_E_COMMANDNOTPERSISTED = HResult($80040E67); + {$EXTERNALSYM DB_E_COMMANDNOTPERSISTED} + +// +// MessageId: DB_E_DUPLICATEID +// +// MessageText: +// +// The supplied DBID already exists +// + DB_E_DUPLICATEID = HResult($80040E68); + {$EXTERNALSYM DB_E_DUPLICATEID} + +// +// MessageId: DB_E_OBJECTCREATIONLIMITREACHED +// +// MessageText: +// +// The maximum number of Sessions supported by the provider has +// already been created. The consumer must release one or more +// currently held Sessions before obtaining a new Session Object +// + DB_E_OBJECTCREATIONLIMITREACHED = HResult($80040E69); + {$EXTERNALSYM DB_E_OBJECTCREATIONLIMITREACHED} + +// +// MessageId: DB_E_BADINDEXID +// +// MessageText: +// +// The index ID is invalid +// + DB_E_BADINDEXID = HResult($80040E72); + {$EXTERNALSYM DB_E_BADINDEXID} + +// +// MessageId: DB_E_BADINITSTRING +// +// MessageText: +// +// The initialization string specified does not conform to specificiation +// + DB_E_BADINITSTRING = HResult($80040E73); + {$EXTERNALSYM DB_E_BADINITSTRING} + +// +// MessageId: DB_E_NOPROVIDERSREGISTERED +// +// MessageText: +// +// The OLE DB root enumerator did not return any providers that +// matched any of the SOURCES_TYPEs requested +// + DB_E_NOPROVIDERSREGISTERED = HResult($80040E74); + {$EXTERNALSYM DB_E_NOPROVIDERSREGISTERED} + +// +// MessageId: DB_E_MISMATCHEDPROVIDER +// +// MessageText: +// +// The initialization string specifies a provider which does not match the currently active provider +// + DB_E_MISMATCHEDPROVIDER = HResult($80040E75); + {$EXTERNALSYM DB_E_MISMATCHEDPROVIDER} + +// +// MessageId: SEC_E_BADTRUSTEEID +// +// MessageText: +// +// Invalid trustee value +// + SEC_E_BADTRUSTEEID = HResult($80040E6A); + {$EXTERNALSYM SEC_E_BADTRUSTEEID} + +// +// MessageId: SEC_E_NOTRUSTEEID +// +// MessageText: +// +// The trustee is not for the current data source +// + SEC_E_NOTRUSTEEID = HResult($80040E6B); + {$EXTERNALSYM SEC_E_NOTRUSTEEID} + +// +// MessageId: SEC_E_NOMEMBERSHIPSUPPORT +// +// MessageText: +// +// The trustee does not support memberships/collections +// + SEC_E_NOMEMBERSHIPSUPPORT = HResult($80040E6C); + {$EXTERNALSYM SEC_E_NOMEMBERSHIPSUPPORT} + +// +// MessageId: SEC_E_INVALIDOBJECT +// +// MessageText: +// +// The object is invalid or unknown to the provider +// + SEC_E_INVALIDOBJECT = HResult($80040E6D); + {$EXTERNALSYM SEC_E_INVALIDOBJECT} + +// +// MessageId: SEC_E_NOOWNER +// +// MessageText: +// +// No owner exists for the object +// + SEC_E_NOOWNER = HResult($80040E6E); + {$EXTERNALSYM SEC_E_NOOWNER} + +// +// MessageId: SEC_E_INVALIDACCESSENTRYLIST +// +// MessageText: +// +// The access entry list supplied is invalid +// + SEC_E_INVALIDACCESSENTRYLIST = HResult($80040E6F); + {$EXTERNALSYM SEC_E_INVALIDACCESSENTRYLIST} + +// +// MessageId: SEC_E_INVALIDOWNER +// +// MessageText: +// +// The trustee supplied as owner is invalid or unknown to the provider +// + SEC_E_INVALIDOWNER = HResult($80040E70); + {$EXTERNALSYM SEC_E_INVALIDOWNER} + +// +// MessageId: SEC_E_INVALIDACCESSENTRY +// +// MessageText: +// +// The permission supplied in the access entry list is invalid +// + SEC_E_INVALIDACCESSENTRY = HResult($80040E71); + {$EXTERNALSYM SEC_E_INVALIDACCESSENTRY} + + SEC_E_PERMISSIONDENIED = DB_SEC_E_PERMISSIONDENIED; + {$EXTERNALSYM SEC_E_PERMISSIONDENIED} +// @@@- V2.1 + +// +// MessageId: DB_S_ROWLIMITEXCEEDED +// +// MessageText: +// +// Fetching requested number of rows would have exceeded total number +// of active rows supported by the rowset +// + DB_S_ROWLIMITEXCEEDED = $00040EC0; + {$EXTERNALSYM DB_S_ROWLIMITEXCEEDED} + +// +// MessageId: DB_S_COLUMNTYPEMISMATCH +// +// MessageText: +// +// One or more column types are incompatible; conversion errors will +// occur during copying +// + DB_S_COLUMNTYPEMISMATCH = $00040EC1; + {$EXTERNALSYM DB_S_COLUMNTYPEMISMATCH} + +// +// MessageId: DB_S_TYPEINFOOVERRIDDEN +// +// MessageText: +// +// Parameter type information has been overridden by caller +// + DB_S_TYPEINFOOVERRIDDEN = $00040EC2; + {$EXTERNALSYM DB_S_TYPEINFOOVERRIDDEN} + +// +// MessageId: DB_S_BOOKMARKSKIPPED +// +// MessageText: +// +// Skipped bookmark for deleted or non-member row +// + DB_S_BOOKMARKSKIPPED = $00040EC3; + {$EXTERNALSYM DB_S_BOOKMARKSKIPPED} + +// @@@+ V2.0 +// +// MessageId: DB_S_NONEXTROWSET +// +// MessageText: +// +// There are no more rowsets +// + DB_S_NONEXTROWSET = $00040EC5; + {$EXTERNALSYM DB_S_NONEXTROWSET} + +// @@@- V2.0 + +// +// MessageId: DB_S_ENDOFROWSET +// +// MessageText: +// +// Reached start or end of rowset or chapter +// + DB_S_ENDOFROWSET = $00040EC6; + {$EXTERNALSYM DB_S_ENDOFROWSET} + +// +// MessageId: DB_S_COMMANDREEXECUTED +// +// MessageText: +// +// The provider re-executed the command +// + DB_S_COMMANDREEXECUTED = $00040EC7; + {$EXTERNALSYM DB_S_COMMANDREEXECUTED} + +// +// MessageId: DB_S_BUFFERFULL +// +// MessageText: +// +// Variable data buffer full +// + DB_S_BUFFERFULL = $00040EC8; + {$EXTERNALSYM DB_S_BUFFERFULL} + +// +// MessageId: DB_S_NORESULT +// +// MessageText: +// +// There are no more results +// + DB_S_NORESULT = $00040EC9; + {$EXTERNALSYM DB_S_NORESULT} + +// +// MessageId: DB_S_CANTRELEASE +// +// MessageText: +// +// Server cannot release or downgrade a lock until the end of the +// transaction +// + DB_S_CANTRELEASE = $00040ECA; + {$EXTERNALSYM DB_S_CANTRELEASE} + +// @@@+ V2.5 +// +// MessageId: DB_S_GOALCHANGED +// +// MessageText: +// +// Specified weight was not supported or exceeded the supported limit +// and was set to 0 or the supported limit +// + DB_S_GOALCHANGED = $00040ECB; + {$EXTERNALSYM DB_S_GOALCHANGED} + +// @@@- V2.5 + +// @@@+ V1.5 +// +// MessageId: DB_S_UNWANTEDOPERATION +// +// MessageText: +// +// Consumer is uninterested in receiving further notification calls for +// this reason +// + DB_S_UNWANTEDOPERATION = $00040ECC; + {$EXTERNALSYM DB_S_UNWANTEDOPERATION} + +// @@@- V1.5 + +// +// MessageId: DB_S_DIALECTIGNORED +// +// MessageText: +// +// Input dialect was ignored and text was returned in different +// dialect +// + DB_S_DIALECTIGNORED = $00040ECD; + {$EXTERNALSYM DB_S_DIALECTIGNORED} + +// +// MessageId: DB_S_UNWANTEDPHASE +// +// MessageText: +// +// Consumer is uninterested in receiving further notification calls for +// this phase +// + DB_S_UNWANTEDPHASE = $00040ECE; + {$EXTERNALSYM DB_S_UNWANTEDPHASE} + +// +// MessageId: DB_S_UNWANTEDREASON +// +// MessageText: +// +// Consumer is uninterested in receiving further notification calls for +// this reason +// + DB_S_UNWANTEDREASON = $00040ECF; + {$EXTERNALSYM DB_S_UNWANTEDREASON} + +// @@@+ V1.5 +// +// MessageId: DB_S_ASYNCHRONOUS +// +// MessageText: +// +// The operation is being processed asynchronously +// + DB_S_ASYNCHRONOUS = $00040ED0; + {$EXTERNALSYM DB_S_ASYNCHRONOUS} + +// @@@- V1.5 + +// +// MessageId: DB_S_COLUMNSCHANGED +// +// MessageText: +// +// In order to reposition to the start of the rowset, the provider had +// to reexecute the query; either the order of the columns changed or +// columns were added to or removed from the rowset +// + DB_S_COLUMNSCHANGED = $00040ED1; + {$EXTERNALSYM DB_S_COLUMNSCHANGED} + +// +// MessageId: DB_S_ERRORSRETURNED +// +// MessageText: +// +// The method had some errors; errors have been returned in the error +// array +// + DB_S_ERRORSRETURNED = $00040ED2; + {$EXTERNALSYM DB_S_ERRORSRETURNED} + +// +// MessageId: DB_S_BADROWHANDLE +// +// MessageText: +// +// Invalid row handle +// + DB_S_BADROWHANDLE = $00040ED3; + {$EXTERNALSYM DB_S_BADROWHANDLE} + +// +// MessageId: DB_S_DELETEDROW +// +// MessageText: +// +// A given HROW referred to a hard-deleted row +// + DB_S_DELETEDROW = $00040ED4; + {$EXTERNALSYM DB_S_DELETEDROW} + +// @@@+ V2.5 +// +// MessageId: DB_S_TOOMANYCHANGES +// +// MessageText: +// +// The provider was unable to keep track of all the changes; the client +// must refetch the data associated with the watch region using another +// method +// + DB_S_TOOMANYCHANGES = $00040ED5; + {$EXTERNALSYM DB_S_TOOMANYCHANGES} + +// @@@- V2.5 + +// +// MessageId: DB_S_STOPLIMITREACHED +// +// MessageText: +// +// Execution stopped because a resource limit has been reached; results +// obtained so far have been returned but execution cannot be resumed +// + DB_S_STOPLIMITREACHED = $00040ED6; + {$EXTERNALSYM DB_S_STOPLIMITREACHED} + +// +// MessageId: DB_S_LOCKUPGRADED +// +// MessageText: +// +// A lock was upgraded from the value specified +// + DB_S_LOCKUPGRADED = $00040ED8; + {$EXTERNALSYM DB_S_LOCKUPGRADED} + +// +// MessageId: DB_S_PROPERTIESCHANGED +// +// MessageText: +// +// One or more properties were changed as allowed by provider +// + DB_S_PROPERTIESCHANGED = $00040ED9; + {$EXTERNALSYM DB_S_PROPERTIESCHANGED} + +// +// MessageId: DB_S_ERRORSOCCURRED +// +// MessageText: +// +// Errors occurred +// + DB_S_ERRORSOCCURRED = $00040EDA; + {$EXTERNALSYM DB_S_ERRORSOCCURRED} + +// +// MessageId: DB_S_PARAMUNAVAILABLE +// +// MessageText: +// +// A specified parameter was invalid +// + DB_S_PARAMUNAVAILABLE = $00040EDB; + {$EXTERNALSYM DB_S_PARAMUNAVAILABLE} + +// +// MessageId: DB_S_MULTIPLECHANGES +// +// MessageText: +// +// Updating this row caused more than one row to be updated in the +// data source +// + DB_S_MULTIPLECHANGES = $00040EDC; + {$EXTERNALSYM DB_S_MULTIPLECHANGES} + +const + DBPROPSET_SQLSERVERDBINIT: TGUID = + '{5cf4ca10-ef21-11d0-97e7-00c04fc2ad98}'; + DBPROPSET_SQLSERVERROWSET: TGUID = + '{5cf4ca11-ef21-11d0-97e7-00c04fc2ad98}'; + DBPROPSET_SQLSERVERDATASOURCE: TGUID = + '{28efaee4-2d2c-11d1-9807-00c04fc2ad98}'; + + // PropIds for DBPROPSET_SQLSERVERDBINIT + SSPROP_INIT_CURRENTLANGUAGE = 4; + SSPROP_INIT_NETWORKADDRESS = 5; + SSPROP_INIT_NETWORKLIBRARY = 6; + SSPROP_INIT_USEPROCFORPREP = 7; + SSPROP_INIT_AUTOTRANSLATE = 8; + SSPROP_INIT_PACKETSIZE = 9; + SSPROP_INIT_APPNAME = 10; + SSPROP_INIT_WSID = 11; + SSPROP_INIT_FILENAME = 12; + + // PropIds for DBPROPSET_SQLSERVERDBINIT - MS SQL Server 2000 specific + SSPROP_INIT_ENCRYPT = 13; + // SSPROP_AUTH_REPL_SERVER_NAME = 14; + // SSPROP_INIT_TAGCOLUMNCOLLATION = 15; + + SSPROP_INIT_MARSCONNECTION = 16; // MS SQL Server 2005 specific + SSPROP_INIT_FAILOVERPARTNER = 18; // MS SQL Server 2005 specific + SSPROP_AUTH_OLD_PASSWORD = 19; // MS SQL Server 2005 specific + + // PropIds for DBPROPSET_SQLSERVERROWSET + SSPROP_ENABLEFASTLOAD = 2; + SSPROP_FASTLOADOPTIONS = 9; + SSPROP_FASTLOADKEEPNULLS = 10; + SSPROP_FASTLOADKEEPIDENTITY = 11; + SSPROP_DEFERPREPARE = 13; + SSPROP_QP_NOTIFICATION_TIMEOUT = 17; + SSPROP_QP_NOTIFICATION_MSGTEXT = 18; + SSPROP_QP_NOTIFICATION_OPTIONS = 19; + + // Values for SSPROP_QP_NOTIFICATION_TIMEOUT + SSPROPVAL_DEFAULT_NOTIFICATION_TIMEOUT = 432000; // in seconds + SSPROPVAL_MAX_NOTIFICATION_TIMEOUT = $7FFFFFFF; // in seconds + + DBPROP_IRowsetBookmark = $124; + + IID_IDBSchemaRowset: TGUID = + '{0c733a7b-2a1c-11ce-ade5-00aa0044773d}'; + + IID_NULL: TGUID = + '{00000000-0000-0000-0000-000000000000}'; + + DBSCHEMA_LINKEDSERVERS: TGUID = + '{9093caf4-2eac-11d1-9809-00c04fc2ad98}'; + DBSCHEMA_SQL_ASSEMBLIES: TGUID = + '{7c1112c8-c2d3-4f6e-949a-983d38a58f46}'; + DBSCHEMA_SQL_ASSEMBLY_DEPENDENCIES: TGUID = + '{cb0f837b-974c-41b8-909d-649caf45ad2f}'; + DBSCHEMA_SQL_USER_TYPES: TGUID = + '{f1198bd8-a424-4ea3-8d4c-607eee2bab60}'; + DBSCHEMA_XML_COLLECTIONS: TGUID = + '{56bfad8c-6e8f-480d-91de-3516d99a5d10}'; + + CRESTRICTIONS_DBSCHEMA_LINKEDSERVERS = 1; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_LINKEDSERVERS} + + CRESTRICTIONS_DBSCHEMA_SQL_ASSEMBLIES = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_SQL_ASSEMBLIES} + + CRESTRICTIONS_DBSCHEMA_SQL_ASSEMBLY_DEPENDENCIES = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_SQL_ASSEMBLY_DEPENDENCIES} + + CRESTRICTIONS_DBSCHEMA_SQL_USER_TYPES = 3; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_SQL_USER_TYPES} + + CRESTRICTIONS_DBSCHEMA_XML_COLLECTIONS = 4; + {$EXTERNALSYM CRESTRICTIONS_DBSCHEMA_XML_COLLECTIONS} + + IID_IRowsetBookmark: TGUID = + '{0c733ac2-2a1c-11ce-ade5-00aa0044773d}'; + + IID_IErrorRecords: TGUID = + '{0c733a67-2a1c-11ce-ade5-00aa0044773d}'; + {$EXTERNALSYM IID_IErrorRecords} + + IID_ISQLServerErrorInfo: TGUID = + '{5cf4ca12-ef21-11d0-97e7-00c04fc2ad98}'; + + CLSID_SQLOLEDB: TGUID = + '{0C7FF16C-38E3-11d0-97AB-00C04FC2AD98}'; {SQLOLEDB CLSID} + CLSID_SQLNCLI: TGUID = + '{85ECAFCC-BDD9-4B03-97A8-FA65CBE3859B}'; {SQLNCLI CLSID} + CLSID_SQLSERVERCE_3_0: TGUID = '{32CE2952-2585-49a6-AEFF-1732076C2945}'; + +(* CLSID_ORAOLEDB: TGUID = + '{E8CC4CBE-FDFF-11D0-B865-00A0C9081C1D}'; + CLSID_NULL: TGUID = + '{00000000-0000-0000-0000-000000000000}';*) + IID_IUnknown: TGUID = + '{00000000-0000-0000-c000-000000000046}'; +(* IID_IStream: TGUID = + '{0000000C-0000-0000-C000-000000000046}'; *) + IID_ISequentialStream: TGUID = + '{0c733a30-2a1c-11ce-ade5-00aa0044773d}'; + +const + // --------------------------------------------------------------------------- + // Copied from SQLFRONT.H + + // Netlib Error problem codes. ConnectionError() should return one of + // these as the dblib-mapped problem code, so the corresponding string + // is sent to the dblib app's error handler as dberrstr. Return NE_E_NOMAP + // for a generic DB-Library error string (as in prior versions of dblib). + + NE_E_NOMAP = 0; // No string; uses dblib default. + NE_E_NOMEMORY = 1; // Insufficient memory. + NE_E_NOACCESS = 2; // Access denied. + NE_E_CONNBUSY = 3; // Connection is busy. + NE_E_CONNBROKEN = 4; // Connection broken. + NE_E_TOOMANYCONN = 5; // Connection limit exceeded. + NE_E_SERVERNOTFOUND = 6; // Specified SQL server not found. + NE_E_NETNOTSTARTED = 7; // The network has not been started. + NE_E_NORESOURCE = 8; // Insufficient network resources. + NE_E_NETBUSY = 9; // Network is busy. + NE_E_NONETACCESS = 10; // Network access denied. + NE_E_GENERAL = 11; // General network error. Check your documentation. + NE_E_CONNMODE = 12; // Incorrect connection mode. + NE_E_NAMENOTFOUND = 13; // Name not found in directory service. + NE_E_INVALIDCONN = 14; // Invalid connection. + NE_E_NETDATAERR = 15; // Error reading or writing network data. + NE_E_TOOMANYFILES = 16; // Too many open file handles. + NE_E_CANTCONNECT = 17; // SQL Server does not exist or access denied. + + NE_MAX_NETERROR = 17; + // --------------------------------------------------------------------------- + + SizeOfDBProp = 52; + + DACProductName = 'SDAC'; + +implementation + + + +initialization + + +finalization + + +end. diff --git a/internal/4.10.0.10/1/Source/OLEDBIntf.pas b/internal/4.10.0.10/1/Source/OLEDBIntf.pas new file mode 100644 index 0000000..fc33c57 --- /dev/null +++ b/internal/4.10.0.10/1/Source/OLEDBIntf.pas @@ -0,0 +1,832 @@ + +unit OLEDBIntf; + +interface + +{$I Dac.inc} + +uses +{$IFDEF VER6P} + FMTBcd, +{$ELSE} + DB, +{$ENDIF} + OLEDBC, + CLRClasses, + ActiveX, + Windows; + +type + PIUnknown = ^IUnknown; + PUintArray = IntPtr; + TUintArray = array of UINT; + PPByte = ^PByte; + PPByteArray = IntPtr; + TPByteArray = array of PByte; + +type + PDBTimeStamp = ^TDBTimeStamp; + DBTIMESTAMP = packed record + year: Smallint; + month: Word; + day: Word; + hour: Word; + minute: Word; + second: Word; + fraction: UINT; + end; + TDBTimeStamp = DBTIMESTAMP; + {$EXTERNALSYM DBTIMESTAMP} + +type + PBoid = ^TBoid; + BOID = packed record + rgb_: array[0..15] of Byte; + end; + TBoid = BOID; + {$EXTERNALSYM BOID} + + XACTTRANSINFO = packed record + uow: BOID; + isoLevel: Integer; + isoFlags: UINT; + grfTCSupported: UINT; + grfRMSupported: UINT; + grfTCSupportedRetaining: UINT; + grfRMSupportedRetaining: UINT; + end; + TXactTransInfo = XACTTRANSINFO; + {$EXTERNALSYM XACTTRANSINFO} + + XACTOPT = packed record + ulTimeout: UINT; + szDescription: array[0..39] of Shortint; + end; + TXActOpt = XACTOPT; + {$EXTERNALSYM XACTOPT} + + XACTSTATS = packed record + cOpen: UINT; + cCommitting: UINT; + cCommitted: UINT; + cAborting: UINT; + cAborted: UINT; + cInDoubt: UINT; + cHeuristicDecision: UINT; + timeTransactionsUp: FILETIME; + end; + TXactStats = XACTSTATS; + {$EXTERNALSYM XACTSTATS} + + PDBBindExt = ^TDBBindExt; + DBBINDEXT = packed record + pExtension: IntPtr; // PByte; + ulExtension: UINT; + end; + TDBBindExt = DBBINDEXT; + {$EXTERNALSYM DBBINDEXT} + + DBOBJECT = packed record + dwFlags: UINT; + iid: TGUID; + end; + TDBObject = DBOBJECT; + {$EXTERNALSYM DBOBJECT} + + PDBBinding = ^TDBBinding; + DBBINDING = packed record + iOrdinal: UINT; + obValue: UINT; + obLength: UINT; + obStatus: UINT; + pTypeInfo: IntPtr; // IUnknown; + pObject: IntPtr; // PDBObject; + pBindExt: IntPtr; // PDBBindExt; + dwPart: DBPART; + dwMemOwner: DBMEMOWNER; + eParamIO: DBPARAMIO; + cbMaxLen: UINT; + dwFlags: UINT; + wType: DBTYPE; + bPrecision: Byte; + bScale: Byte; + end; + TDBBinding = DBBINDING; +{ $IFNDEF VER125} + { $EXTERNALSYM DBBINDING} +{ $ENDIF} + +// PDBBindingArray = ^TDBBindingArray; +// TDBBindingArray = array[0..MAXBOUND] of TDBBinding; + PDBBindingArray = IntPtr; + TDBBindingArray = array of TDBBinding; + + DBIDNAME = record + case Integer of + 0: (pwszName: PWideChar); + 1: (ulPropid: UINT); + end; + TDBIDName = DBIDNAME; + + DBIDGUID = record + case Integer of + 0: (guid: TGUID); + 1: (pguid: ^TGUID); + end; + TDBIDGuid = DBIDGUID; + + DBPROPID = UINT; + {$EXTERNALSYM DBPROPID} + PDBPROPID = ^DBPROPID; + PDBPropIDArray = ^TDBPropIDArray; + TDBPropIDArray = array[0..MAXBOUND] of DBPROPID; + + PPDBID = ^PDBID; + PDBID = ^DBID; + DBID = packed record + uGuid: DBIDGUID; + eKind: DBKIND; + uName: DBIDNAME; + end; + TDBID = DBID; + {$EXTERNALSYM DBID} + + PDBIDArray = ^TDBIDArray; + TDBIDArray = array[0..MAXBOUND] of TDBID; + + PDBPropIDSet = ^TDBPropIDSet; + DBPROPIDSET = packed record + rgPropertyIDs: IntPtr; // PDBPropIDArray; + cPropertyIDs: UINT; + guidPropertySet: TGUID; + end; + TDBPropIDSet = DBPROPIDSET; + {$EXTERNALSYM DBPROPIDSET} + + PDBPropIDSetArray = ^TDBPropIDSetArray; + TDBPropIDSetArray = array[0..MAXBOUND] of TDBPropIDSet; + + PDBProp = ^TDBProp; + DBPROP = packed record + dwPropertyID: DBPROPID; + dwOptions: DBPROPOPTIONS; + dwStatus: DBPROPSTATUS; + colid: DBID; + vValue: OleVariant; + end; + TDBProp = DBPROP; + {$EXTERNALSYM DBPROP} + + PDBPropArray = IntPtr; + TDBPropArray = array[0..MAXBOUND] of TDBProp; + + + PPDBPropSet = ^PDBPropSet; + PDBPropSet = ^TDBPropSet; + DBPROPSET = packed record + rgProperties: PDBPropArray; + cProperties: UINT; + guidPropertySet: TGUID; + end; + TDBPropSet = DBPROPSET; + {$EXTERNALSYM DBPROPSET} + + PDBPropSetArray = ^TDBPropSetArray; + TDBPropSetArray = array[0..MAXBOUND] of TDBPropSet; + + PDBPropInfo = ^TDBPropInfo; + DBPROPINFO = packed record + pwszDescription: PWideChar; + dwPropertyID: DBPROPID; + dwFlags: DBPROPFLAGS; + vtType: Word; + vValues: OleVariant; + end; + TDBPropInfo = DBPROPINFO; + {$EXTERNALSYM DBPROPINFO} + + PDBPropInfoArray = ^TDBPropInfoArray; + TDBPropInfoArray = array[0..MAXBOUND] of TDBPropInfo; + + PDBPropInfoSet = IntPtr; +(* + PDBPropInfoSet = ^TDBPropInfoSet; + DBPROPINFOSET = packed record + rgPropertyInfos: PDBPropInfoArray; + cPropertyInfos: UINT; + guidPropertySet: TGUID; + end; + TDBPropInfoSet = DBPROPINFOSET; + {$EXTERNALSYM DBPROPINFOSET} + *) + + PDBParams = ^TDBPARAMS; + DBPARAMS = packed record + pData: IntPtr; + cParamSets: UINT; + HACCESSOR: HACCESSOR; + end; + TDBParams = DBPARAMS; + {$EXTERNALSYM DBPARAMS} + + PDBColumnInfo = ^TDBColumnInfo; + DBCOLUMNINFO = packed record + pwszName: PWideChar; + pTypeInfo: IntPtr; + iOrdinal: UINT; + dwFlags: DBCOLUMNFLAGS; + ulColumnSize: UINT; + wType: DBTYPE; + bPrecision: Byte; + bScale: Byte; + columnid: DBID; + end; + TDBColumnInfo = DBCOLUMNINFO; + {$EXTERNALSYM DBCOLUMNINFO} + + PDBColumnInfoArray = ^TDBColumnInfoArray; + TDBColumnInfoArray = array[0..MAXCOLS] of TDBColumnInfo; + + PDBLiteralInfo = ^DBLiteralInfo; + DBLITERALINFO = packed record + pwszLiteralValue: PWideChar; + pwszInvalidChars: PWideChar; + pwszInvalidStartingChars: PWideChar; + lt: UINT; + fSupported: BOOL; + cchMaxLen: UINT; + end; + TDBLiteralInfo = DBLITERALINFO; + {$EXTERNALSYM DBLITERALINFO} + + PDBLiteralInfoArray = ^TDBLiteralInfoArray; + TDBLiteralInfoArray = array[0..MAXBOUND] of TDBLiteralInfo; + + PDBColumnDesc = ^TDBColumnDesc; + DBCOLUMNDESC = packed record + pwszTypeName: PWideChar; + pTypeInfo: IntPtr; + rgPropertySets: IntPtr; + pclsid: IntPtr; + cPropertySets: UINT; + ulColumnSize: UINT; + dbcid: DBID; + wType: DBTYPE; + bPrecision: Byte; + bScale: Byte; + end; + TDBColumnDesc = DBCOLUMNDESC; + {$EXTERNALSYM DBCOLUMNDESC} + + PErrorInfo = ^TErrorInfo; + ERRORINFO = packed record + hrError: HResult; + dwMinor: UINT; + clsid: TGUID; + iid: TGUID; + dispid: Integer; + end; + TErrorInfo = ERRORINFO; + {$EXTERNALSYM ERRORINFO} + + PDBParamInfo = IntPtr; +(* PDBParamInfo = ^TDBParamInfo; + DBPARAMINFO = packed record + dwFlags: DBPARAMFLAGS; + iOrdinal: UINT; + pwszName: PWideChar; + pTypeInfo: ITypeInfo; + ulParamSize: UINT; + wType: DBTYPE; + bPrecision: Byte; + bScale: Byte; + end; + TDBParamInfo = DBPARAMINFO; + {$EXTERNALSYM DBPARAMINFO}*) + + PDBParamBindInfo = ^TDBParamBindInfo; + DBPARAMBINDINFO = packed record + pwszDataSourceType: PWideChar; + pwszName: PWideChar; + ulParamSize: UINT; + dwFlags: DBPARAMFLAGS; + bPrecision: Byte; + bScale: Byte; + end; + TDBParamBindInfo = DBPARAMBINDINFO; + {$EXTERNALSYM DBPARAMBINDINFO} + + PDBNumeric = ^TDBNumeric; + DB_NUMERIC = packed record + precision: Byte; + scale: Byte; + sign: Byte; + val: array[0..15] of Byte; + end; + TDBNumeric = DB_NUMERIC; + {$EXTERNALSYM DB_NUMERIC} +const + SizeOfTDBNumeric = SizeOf(TDBNumeric); + +type + PDBParamBindInfoArray = ^TDBParamBindInfoArray; + TDBParamBindInfoArray = array[0..MAXBOUND] of TDBParamBindInfo; + +// *********************************************************************// +// DBID Values +// *********************************************************************// +const + DB_NULLID: DBID = (uguid: (guid: (D1: 0; D2: 0; D3:0; D4: (0, 0, 0, 0, 0, 0, 0, 0))); ekind: DBKIND_GUID_PROPID; uname: (ulpropid:0)); + {$EXTERNALSYM DB_NULLID} + +type + TVariantArray = array [0..0] of OleVariant; + PVariantArray = ^TVariantArray; + + TGUIDArray = array [0..0] of TGUID; + PGUIDArray = ^TGUIDArray; + +// *********************************************************************// +// Interface: ITransaction +// GUID: {0FB15084-AF41-11CE-BD2B-204C4F4F5020} +// *********************************************************************// +{$IFNDEF VER6P} + {$NODEFINE ITransaction} +{$ENDIF} + ITransaction = interface(IUnknown) + ['{0FB15084-AF41-11CE-BD2B-204C4F4F5020}'] + function Commit(fRetaining: BOOL; grfTC: UINT; grfRM: UINT): HResult; stdcall; + function Abort(pboidReason: PBOID; fRetaining: BOOL; fAsync: BOOL): HResult; stdcall; + function GetTransactionInfo(out pinfo: XACTTRANSINFO): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ITransactionOptions +// GUID: {3A6AD9E0-23B9-11CF-AD60-00AA00A74CCD} +// *********************************************************************// + ITransactionOptions = interface(IUnknown) + ['{3A6AD9E0-23B9-11CF-AD60-00AA00A74CCD}'] + function SetOptions(var pOptions: XACTOPT): HResult; stdcall; + function GetOptions(var pOptions: XACTOPT): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IAccessor +// GUID: {0C733A8C-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IAccessor = interface(IUnknown) + ['{0C733A8C-2A1C-11CE-ADE5-00AA0044773D}'] + function AddRefAccessor(HACCESSOR: HACCESSOR; pcRefCount: PUINT): HResult; stdcall; + function CreateAccessor(dwAccessorFlags: UINT; cBindings: UINT; rgBindings: PDBBindingArray; + cbRowSize: UINT; var phAccessor: HACCESSOR; rgStatus: PUintArray): HResult; stdcall; + function GetBindings(HACCESSOR: HACCESSOR; pdwAccessorFlags: PUINT; var pcBindings: UINT; + out prgBindings: PDBBinding): HResult; stdcall; + function ReleaseAccessor(HACCESSOR: HACCESSOR; pcRefCount: PUINT): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IRowset +// GUID: {0C733A7C-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IRowset = interface(IUnknown) + ['{0C733A7C-2A1C-11CE-ADE5-00AA0044773D}'] + function AddRefRows(cRows: UINT; rghRows: PUintArray; rgRefCounts: PUintArray; + rgRowStatus: PUintArray): HResult; stdcall; + function GetData(HROW: HROW; HACCESSOR: HACCESSOR; pData: IntPtr): HResult; stdcall; + function GetNextRows(hReserved: HCHAPTER; lRowsOffset: Integer; cRows: Integer; + out pcRowsObtained: UINT; var prghRows: PUintArray): HResult; stdcall; + function ReleaseRows( + cRows: UINT; + rghRows: PUintArray; + rgRowOptions, + rgRefCounts, + rgRowStatus: PUintArray): HResult; stdcall; + function RestartPosition(hReserved: HCHAPTER): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IRowsetInfo +// GUID: {0C733A55-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IRowsetInfo = interface(IUnknown) + ['{0C733A55-2A1C-11CE-ADE5-00AA0044773D}'] + function GetProperties(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + out pcPropertySets: UINT; out prgPropertySets: PDBPropSet): HResult; stdcall; + function GetReferencedRowset(iOrdinal: UINT; const riid: TGUID; + out ppReferencedRowset: IUnknown): HResult; stdcall; + function GetSpecification(const riid: TGUID; out ppSpecification: IUnknown): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IRowsetLocate +// GUID: {0C733A7D-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IRowsetLocate = interface(IRowset) + ['{0C733A7D-2A1C-11CE-ADE5-00AA0044773D}'] + function Compare(hReserved: HCHAPTER; cbBookmark1: UINT; pBookmark1: PByte; + cbBookmark2: UINT; pBookmark2: PByte; out pComparison: UINT): HResult; stdcall; + function GetRowsAt(hReserved1: HWATCHREGION; hReserved2: HCHAPTER; cbBookmark: UINT; + pBookmark: PByte; lRowsOffset: Integer; cRows: Integer; + out pcRowsObtained: UINT; var prghRows: PUintArray): HResult; stdcall; + function GetRowsByBookmark(hReserved: HCHAPTER; cRows: UINT; rgcbBookmarks: PUintArray; + rgpBookmarks: PPByteArray; rghRows, rgRowStatus: PUintArray): HResult; stdcall; + function Hash(hReserved: HCHAPTER; cBookmarks: UINT; rgcbBookmarks: PUintArray; + rgpBookmarks: PPByteArray; rgHashedValues, + rgBookmarkStatus: PUintArray): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IRowsetChange +// GUID: {0C733A05-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IRowsetChange = interface(IUnknown) + ['{0C733A05-2A1C-11CE-ADE5-00AA0044773D}'] + function DeleteRows(hReserved: HCHAPTER; cRows: UINT; rghRows: PUintArray; + rgRowStatus: PUintArray): HResult; stdcall; + function SetData(HROW: HROW; HACCESSOR: HACCESSOR; pData: IntPtr): HResult; stdcall; + function InsertRow(hReserved: HCHAPTER; HACCESSOR: HACCESSOR; pData: IntPtr; + out phRow: HROW): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IRowsetUpdate +// GUID: {0C733A6D-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IRowsetUpdate = interface(IRowsetChange) + ['{0C733A6D-2A1C-11CE-ADE5-00AA0044773D}'] + function GetOriginalData(HROW: HROW; HACCESSOR: HACCESSOR; pData: IntPtr): HResult; stdcall; + function GetPendingRows(hReserved: HCHAPTER; dwRowStatus: DBPENDINGSTATUS; pcPendingRows: PUINT; + prgPendingRows: PPHROW; prgPendingStatus: PPDBPENDINGSTATUS): HResult; stdcall; + function GetRowStatus(hReserved: HCHAPTER; cRows: UINT; rghRows: PUintArray; + rgPendingStatus: PUintArray): HResult; stdcall; + function Undo( + hReserved: HCHAPTER; + cRows: UINT; + rghRows: PUintArray; + pcRowsUndone: PUINT; + prgRowsUndone: PPHROW; + prgRowStatus: PPDBROWSTATUS + ): HResult; stdcall; + function Update( + hReserved: HCHAPTER; + cRows: UINT; + rghRows: PUintArray; + pcRows: PUINT; + prgRows: PPHROW; + out prgRowStatus: PDBROWSTATUS + ): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IMultipleResults +// GUID: {0C733A90-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IMultipleResults = interface(IUnknown) + ['{0C733A90-2A1C-11CE-ADE5-00AA0044773D}'] + function GetResult( + const punkOuter: IUnknown; + reserved: Integer; + const riid: TGUID; + out pcRowsAffected: Integer; + out ppRowset: IUnknown): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ICommandPrepare +// GUID: {0C733A26-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + ICommandPrepare = interface(IUnknown) + ['{0C733A26-2A1C-11CE-ADE5-00AA0044773D}'] + function Prepare(cExpectedRuns: UINT): HResult; stdcall; + function Unprepare: HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ICommandProperties +// GUID: {0C733A79-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + + ICommandProperties = interface(IUnknown) + ['{0C733A79-2A1C-11CE-ADE5-00AA0044773D}'] + function GetProperties(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + var pcPropertySets: UINT; out prgPropertySets: PDBPropSet): HResult; stdcall; + function SetProperties(cPropertySets: UINT; rgPropertySets: PDBPropSetArray): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ICommand +// GUID: {0C733A63-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + ICommand = interface(IUnknown) + ['{0C733A63-2A1C-11CE-ADE5-00AA0044773D}'] + function Cancel: HResult; stdcall; + function Execute( + const punkOuter: IUnknown; + const riid: TGUID; + var pParams: DBPARAMS; + out pcRowsAffected: Integer; + out ppRowset: IUnknown): HResult; stdcall; + function GetDBSession(const riid: TGUID; out ppSession: IUnknown): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ICommandText +// GUID: {0C733A27-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + ICommandText = interface(ICommand) + ['{0C733A27-2A1C-11CE-ADE5-00AA0044773D}'] + function GetCommandText( + var pguidDialect: TGUID; + out ppwszCommand: PWideChar): HResult; stdcall; + function SetCommandText( + const rguidDialect: TGUID; + pwszCommand: PWideChar): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ICommandWithParameters +// GUID: {0C733A64-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + ICommandWithParameters = interface(IUnknown) + ['{0C733A64-2A1C-11CE-ADE5-00AA0044773D}'] + function GetParameterInfo(var pcParams: UINT32; out prgParamInfo: PDBPARAMINFO; + ppNamesBuffer: PPOleStr): HResult; stdcall; + function MapParameterNames(cParamNames: UINT; rgParamNames: POleStrList; + rgParamOrdinals: PUintArray): HResult; stdcall; + function SetParameterInfo(cParams: UINT; rgParamOrdinals: PUintArray; + rgParamBindInfo: PDBParamBindInfoArray): HResult; stdcall; + end; + + // *********************************************************************// +// Interface: IColumnsRowset +// GUID: {0C733A10-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IColumnsRowset = interface(IUnknown) + ['{0C733A10-2A1C-11CE-ADE5-00AA0044773D}'] + function GetAvailableColumns(var pcOptColumns: UINT; + var prgOptColumns: PDBID): HResult; stdcall; + function GetColumnsRowset(const punkOuter: IUnknown; cOptColumns: UINT; + rgOptColumns: PDBIDArray; const riid: TGUID; cPropertySets: UINT; + rgPropertySets: PDBPropSetArray; out pColRowset: IUnknown): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IColumnsInfo +// GUID: {0C733A11-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IColumnsInfo = interface(IUnknown) + ['{0C733A11-2A1C-11CE-ADE5-00AA0044773D}'] + function GetColumnInfo(var pcColumns: UINT; out prgInfo: PDBColumnInfo; + out ppStringsBuffer: IntPtr): HResult; stdcall; + function MapColumnIDs(cColumnIDs: UINT; rgColumnIDs: PDBIDArray; + rgColumns: PUintArray): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IDBCreateCommand +// GUID: {0C733A1D-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IDBCreateCommand = interface(IUnknown) + ['{0C733A1D-2A1C-11CE-ADE5-00AA0044773D}'] + function CreateCommand(const punkOuter: IUnknown; const riid: TGUID; + out ppCommand: IUnknown): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IDBCreateSession +// GUID: {0C733A5D-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IDBCreateSession = interface(IUnknown) + ['{0C733A5D-2A1C-11CE-ADE5-00AA0044773D}'] + function CreateSession(const punkOuter: IUnknown; const riid: TGUID; + out ppDBSession: IUnknown): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ISourcesRowset +// GUID: {0C733A1E-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + ISourcesRowset = interface(IUnknown) + ['{0C733A1E-2A1C-11CE-ADE5-00AA0044773D}'] + function GetSourcesRowset(const punkOuter: IUnknown; const riid: TGUID; cPropertySets: UINT; + rgProperties: PDBPropSetArray; out ppSourcesRowset: IUnknown): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IDBProperties +// GUID: {0C733A8A-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IDBProperties = interface(IUnknown) + ['{0C733A8A-2A1C-11CE-ADE5-00AA0044773D}'] + function GetProperties(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + var pcPropertySets: UINT; out prgPropertySets: PDBPropSet): HResult; stdcall; + function GetPropertyInfo(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + var pcPropertyInfoSets: UINT; out prgPropertyInfoSets: PDBPropInfoSet; + ppDescBuffer: PPOleStr): HResult; stdcall; + function SetProperties(cPropertySets: UINT; rgPropertySets: PDBPropSetArray): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IDBInitialize +// GUID: {0C733A8B-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IDBInitialize = interface(IUnknown) + ['{0C733A8B-2A1C-11CE-ADE5-00AA0044773D}'] + function Initialize: HResult; stdcall; + function Uninitialize: HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IDBDataSourceAdmin +// GUID: {0C733A7A-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + IDBDataSourceAdmin = interface(IUnknown) + ['{0C733A7A-2A1C-11CE-ADE5-00AA0044773D}'] + function CreateDataSource(cPropertySets: UINT; rgPropertySets: PDBPropSetArray; + const punkOuter: IUnknown; const riid: TGUID; out ppDBSession: IUnknown): HResult; stdcall; + function DestroyDataSource: HResult; stdcall; + function GetCreationProperties(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + pcPropertyInfoSets: PUINT; out prgPropertyInfoSets: PDBPropInfoSet; + ppDescBuffer: PPOleStr): HResult; stdcall; + function ModifyDataSource(cPropertySets: UINT; rgPropertySets: PDBPropSetArray): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ISessionProperties +// GUID: {0C733A85-2A1C-11CE-ADE5-00AA0044773d} +// *********************************************************************// + ISessionProperties = interface(IUnknown) + ['{0C733A85-2A1C-11CE-ADE5-00AA0044773d}'] + function GetProperties(cPropertyIDSets: UINT; rgPropertyIDSets: PDBPropIDSetArray; + var pcPropertySets: UINT; out prgPropertySets: PDBPropSet): HResult; stdcall; + function SetProperties(cPropertySets: UINT; rgPropertySets: PDBPropSetArray): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ITransactionLocal +// GUID: {0C733A5F-2A1C-11CE-ADE5-00AA0044773D} +// *********************************************************************// + ITransactionLocal = interface(ITransaction) + ['{0C733A5F-2A1C-11CE-ADE5-00AA0044773D}'] + function GetOptionsObject(out ppOptions: ITransactionOptions): HResult; stdcall; + function StartTransaction(isoLevel: Integer; isoFlags: UINT; + const pOtherOptions: ITransactionOptions; pulTransactionLevel: PUINT): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IDBPromptInitialize +// GUID: {2206CCB0-19C1-11D1-89E0-00C04FD7A829} +// *********************************************************************// + IDBPromptInitialize = interface(IUnknown) + ['{2206CCB0-19C1-11D1-89E0-00C04FD7A829}'] + function PromptDataSource(const pUnkOuter: IUnknown; hWndParent: HWND; + dwPromptOptions: DBPROMPTOPTIONS; cSourceTypeFilter: ULONG; + rgSourceTypeFilter: PDBSOURCETYPE; pszProviderFilter: POleStr; + const riid: TIID; var DataSource: IUnknown): HResult; stdcall; + function PromptFileName(hWndParent: HWND; dwPromptOptions: DBPROMPTOPTIONS; + pwszInitialDirectory, pwszInitialFile: POleStr; + var ppwszSelectedFile: POleStr): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IDataInitialize +// GUID: {2206CCB1-19C1-11D1-89E0-00C04FD7A829} +// *********************************************************************// + IDataInitialize = interface(IUnknown) + ['{2206CCB1-19C1-11D1-89E0-00C04FD7A829}'] + function GetDataSource( + const pUnkOuter: IUnknown; + dwClsCtx: DWORD; + pwszInitializationString: POleStr; + const riid: TIID; + var DataSource: IUnknown): HResult; stdcall; + function GetInitializationString( + const DataSource: IUnknown; + fIncludePassword: Boolean; + out pwszInitString: POleStr): HResult; stdcall; + function CreateDBInstance(const clsidProvider: TGUID; + const pUnkOuter: IUnknown; + dwClsCtx: DWORD; pwszReserved: POleStr; + riid: TIID; + var DataSource: IUnknown): HResult; stdcall; + function CreateDBInstanceEx( + const clsidProvider: TGUID; + const pUnkOuter: IUnknown; + dwClsCtx: DWORD; + pwszReserved: POleStr; + pServerInfo: PCoServerInfo; + cmq: ULONG; + rgmqResults: PMultiQI): HResult; stdcall; + function LoadStringFromStorage( + pwszFileName: POleStr; + out pwszInitializationString: POleStr): HResult; stdcall; + function WriteStringToStorage( + pwszFileName, pwszInitializationString: POleStr; + dwCreationDisposition: DWORD): HResult; stdcall; + end; + + IDBSchemaRowset = interface (IUnknown) + ['{0c733a7b-2a1c-11ce-ade5-00aa0044773d}'] + function GetRowset (const pUnkOuter: IUnknown; const rguidSchema: TGUID; + cRestrictions: UINT; rgRestrictions: PVariantArray; const riid: TGUID; + cPropertySets: UINT; rgPropertySets: PDBPropSetArray; + out ppRowset: IUnknown): HResult; stdcall; + function GetSchemas (out pcSchemas: UINT; out prgSchemas: PGUIDArray; + prgRestrictionSupport: PUINTArray): HResult; stdcall; + end; + + IOpenRowset = interface(IUnknown) + ['{0c733a69-2a1c-11ce-ade5-00aa0044773d}'] + function OpenRowset(const punkOuter: IUnknown; pTableID: PDBID; + pIndexID: PDBID; const riid: TGUID; cPropertySets: UINT; + rgPropertySets: PDBPropIDSetArray; out ppReferencedRowset: IUnknown): HRESULT; stdcall; + end; + + IRowsetFastLoad = interface(IUnknown) + ['{5CF4CA13-EF21-11d0-97E7-00C04FC2AD98}'] + function InsertRow(HACCESSOR: HACCESSOR; pData: Pointer): HRESULT; stdcall; + function Commit(fDone: boolean): HRESULT; stdcall; + end; + + IDBAsynchStatus = interface(IUnknown) + ['{0c733a95-2a1c-11ce-ade5-00aa0044773d}'] + function Abort(Chapter: HCHAPTER; Operation: DBASYNCHOP): HRESULT; stdcall; + function GetStatus(Chapter: HCHAPTER; Operation: DBASYNCHOP; var Progress: UINT; + var ProgressMax: UINT; var AsynchPhase: DWORD; var StatusText: PWideChar): HRESULT; stdcall; + end; + + ISSAsynchStatus = interface(IDBAsynchStatus) + ['{1FF1F743-8BB0-4c00-ACC4-C10E43B08FC1}'] + function WaitForAsynchCompletion(MillisecTimeOut: DWORD): HRESULT; stdcall; + end; + + IErrorRecords = interface (IUnknown) + ['{0c733a67-2a1c-11ce-ade5-00aa0044773d}'] + function (* [local] *) AddErrorRecord( + (* [in] *) const pErrorInfo: ERRORINFO; + (* [in] *) dwLookupID: DWORD; + (* [in] *) const pdispparams: DISPPARAMS; + (* [in] *) const punkCustomError: IUnknown; + (* [in] *) dwDynamicErrorID: DWORD): HResult; stdcall; + + function (* [local] *) GetBasicErrorInfo( + (* [in] *) ulRecordNum: ULONG; + (* [out] *) out pErrorInfo: ERRORINFO): HResult; stdcall; + + function (* [local] *) GetCustomErrorObject( + (* [in] *) ulRecordNum: ULONG; + (* [in] *) const riid: TGUID; + (* [iid_is][out] *) out ppObject: IUnknown): HResult; stdcall; + + function (* [local] *) GetErrorInfo( + (* [in] *) ulRecordNum: ULONG; + (* [in] *) lcid: LCID; + (* [out] *) out ppErrorInfo: IErrorInfo): HResult; stdcall; + + function (* [local] *) GetErrorParameters( + (* [in] *) ulRecordNum: ULONG; + (* [out] *) out pdispparams: DISPPARAMS): HResult; stdcall; + + function (* [local] *) GetRecordCount( + (* [out] *) out pcRecords: ULONG): HResult; stdcall; + end; + {$EXTERNALSYM IErrorRecords} + +// the structure returned by ISQLServerErrorInfo::GetSQLServerInfo + SSERRORINFO_ = record + pwszMessage: PWideChar; + pwszServer: PWideChar; + pwszProcedure: PWideChar; + lNative: UINT; + bState: BYTE; + bClass: BYTE; + wLineNumber: WORD; + end; + SSERRORINFO = record + pwszMessage: WideString; + pwszServer: WideString; + pwszProcedure: WideString; + lNative: UINT; + bState: BYTE; + bClass: BYTE; + wLineNumber: WORD; + end; + PSSERRORINFO = ^SSERRORINFO_; + + +type + ISQLServerErrorInfo = interface (IUnknown) + function GetErrorInfo( + (* [out] *) out ppErrorInfo: PSSERRORINFO; + (* [out] *) out ppStringsBuffer: IntPtr{PWideChar}): HResult; stdcall; + end; + + /// WARINING - in 64bit OSes DBBKMARK is int64 + DBBKMARK = integer; + +implementation + +initialization + Assert(SizeOf(DBProp) = SizeOfDBProp); + +end. diff --git a/internal/4.10.0.10/1/Source/Sdac.inc b/internal/4.10.0.10/1/Source/Sdac.inc new file mode 100644 index 0000000..be35d32 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Sdac.inc @@ -0,0 +1,13 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +////////////////////////////////////////////////// + +// Type of build + +{$I Dac.inc} + +{$DEFINE _TRIAL} // TRIAL + +{$DEFINE _DEBUG} // DEBUG \ No newline at end of file diff --git a/internal/4.10.0.10/1/Source/SdacGui.inc b/internal/4.10.0.10/1/Source/SdacGui.inc new file mode 100644 index 0000000..71af69e --- /dev/null +++ b/internal/4.10.0.10/1/Source/SdacGui.inc @@ -0,0 +1,107 @@ +type + +{ TMSConnectDialog } + + TMSConnectDialog = class(TCustomConnectDialog) + private + function GetConnection: TMSConnection; + + protected + FDatabaseLabel: string; + function DefDialogClass: TClass; override; + function GetKeyPath: string; override; + function GetServerStoreName: string; override; + + {$IFDEF MSWINDOWS} + procedure SaveInfoToRegistry(Registry: TRegistry); override; + procedure LoadInfoFromRegistry(Registry: TRegistry); override; + {$ENDIF} + public + constructor Create(Owner: TComponent); override; + property Connection: TMSConnection read GetConnection; + procedure GetServerList(List: TStrings); override; + + published + property Retries; + property SavePassword; + property DialogClass; + + property Caption; + property UsernameLabel; + property PasswordLabel; + property ServerLabel; + property DatabaseLabel: string read FDatabaseLabel write FDatabaseLabel; + property ConnectButton; + property CancelButton; + + property LabelSet; + property StoreLogInfo; + end; + +function DefConnectDialogClass: TClass; + +implementation + +{$IFDEF MSWINDOWS} +uses + Windows; +{$ENDIF} + +function DefConnectDialogClass: TClass; +begin + Result := TMSConnectDialog; +end; + +const + KeyPath = '\SOFTWARE\CoreLab\SDAC\'; + +{ TConnectDialog } + +function TMSConnectDialog.DefDialogClass: TClass; +begin + Result := TMSConnectForm; +end; + +function TMSConnectDialog.GetKeyPath: string; +begin + Result := KeyPath; +end; + +constructor TMSConnectDialog.Create(Owner: TComponent); +begin + inherited; + FDatabaseLabel := 'Database'; +end; + +function TMSConnectDialog.GetServerStoreName: string; +begin + Result := 'Server'; +end; + +procedure TMSConnectDialog.SaveInfoToRegistry(Registry: TRegistry); +begin + inherited; + + Registry.WriteString('Database', Connection.Database); +end; + +procedure TMSConnectDialog.LoadInfoFromRegistry(Registry: TRegistry); +begin + inherited; + if Registry.ValueExists('Database') then + TMSConnection(Connection).Database := Registry.ReadString('Database'); +end; + +procedure TMSConnectDialog.GetServerList(List: TStrings); +begin + MSAccess.GetServerList(List); +end; + +function TMSConnectDialog.GetConnection: TMSConnection; +begin + Result := (inherited Connection) as TMSConnection; +end; + +initialization + DefConnectDialogClassProc := DefConnectDialogClass; +end. diff --git a/internal/4.10.0.10/1/Source/SdacVcl.pas b/internal/4.10.0.10/1/Source/SdacVcl.pas new file mode 100644 index 0000000..27a4323 --- /dev/null +++ b/internal/4.10.0.10/1/Source/SdacVcl.pas @@ -0,0 +1,14 @@ + +{$IFNDEF CLR} + +{$I Sdac.inc} + +unit SdacVcl; +{$ENDIF} + +interface + +uses + SysUtils, Classes, Registry, DacVcl, DBAccess, MSConnectForm, MSAccess, OLEDBAccess, CRParser; + +{$I SdacGui.inc} diff --git a/internal/4.10.0.10/1/Source/SdacVer.inc b/internal/4.10.0.10/1/Source/SdacVer.inc new file mode 100644 index 0000000..14b5dfb --- /dev/null +++ b/internal/4.10.0.10/1/Source/SdacVer.inc @@ -0,0 +1,9 @@ + +////////////////////////////////////////////////// +// SQL Server Data Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +////////////////////////////////////////////////// + +const + SdacVersion = '4.10.0.10'; + diff --git a/internal/4.10.0.10/1/Source/VirtualTable.pas b/internal/4.10.0.10/1/Source/VirtualTable.pas new file mode 100644 index 0000000..6858e83 --- /dev/null +++ b/internal/4.10.0.10/1/Source/VirtualTable.pas @@ -0,0 +1,1849 @@ +////////////////////////////////////////////////// +// Copyright © 1998-2007 Core Lab. All right reserved. +// Virtual table +// Created: 11.12.98 +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit VirtualTable; +{$ENDIF} +interface +uses +{$IFDEF VER6P} + StrUtils, Variants, +{$ENDIF} +{$IFDEF LINUX} + Libc, Classes, SysUtils, DB, MemDS, MemData; +{$ELSE} + Windows, Classes, SysUtils, DB, MemDS, MemData; +{$ENDIF} + +type + TCRFileFormat = (ffVTD, ffXML); + + TVirtualTableOption = (voPersistentData, voStored); + TVirtualTableOptions = set of TVirtualTableOption; + + TVirtualTable = class(TMemDataSet) + private + FOptions: TVirtualTableOptions; + FStreamedActive: boolean; + FAvoidRefreshData: boolean; + FAvoidReload: integer; + FRecordDataStream: TMemoryStream; + + procedure ReadBinaryData(Stream: TStream); + procedure WriteBinaryData(Stream: TStream); + + function IsFieldDefsStored: boolean; + function GetFieldDefs: TFieldDefs; + procedure SetFieldDefs(Value: TFieldDefs); + + protected + FFieldDefsByField: boolean; + + procedure Loaded; override; + + procedure CreateIRecordSet; override; + + procedure OpenCursor(InfoQuery: boolean); override; + procedure InternalOpen; override; + procedure InternalClose; override; + function IsCursorOpen: boolean; override; + + procedure CreateFieldDefs; override; + procedure DefChanged(Sender: TObject); override; + procedure Reload; + {$IFDEF CLR} + procedure DataEvent(Event: TDataEvent; Info: TObject); override; + {$ELSE} + procedure DataEvent(Event: TDataEvent; Info: longint); override; + {$ENDIF} + + procedure DefineProperties(Filer: TFiler); override; + + procedure AssignDataSet(Source: TDataSet); + + procedure SetActive(Value:boolean); override; + + public + constructor Create(Owner: TComponent); override; + destructor Destroy; override; + + function IsSequenced: boolean; override; + + procedure AddField(Name: string; FieldType: TFieldType; Size: integer = 0; Required: boolean = False); + procedure DeleteField(Name: string); + procedure DeleteFields; + + procedure Clear; + + { Stream/File } + procedure LoadFromStream(Stream: TStream; LoadFields: boolean = True); + procedure SaveToStream(Stream: TStream; StoreFields: boolean = True); + + procedure LoadFromFile(const FileName: string); + procedure SaveToFile(const FileName: string); + + procedure Assign(Source: TPersistent); override; + + published + property Options: TVirtualTableOptions read FOptions write FOptions default [voPersistentData, voStored]; + + property Active; + property AutoCalcFields; + property Filtered; + property Filter; + property FilterOptions; + property IndexFieldNames; + property BeforeOpen; + property AfterOpen; + property BeforeClose; + property AfterClose; + property BeforeInsert; + property AfterInsert; + property BeforeEdit; + property AfterEdit; + property BeforePost; + property AfterPost; + property BeforeCancel; + property AfterCancel; + property BeforeDelete; + property AfterDelete; + property BeforeScroll; + property AfterScroll; + property OnCalcFields; + property OnDeleteError; + property OnEditError; + property OnFilterRecord; + property OnNewRecord; + property OnPostError; + + //property Fields stored False; + property FieldDefs: TFieldDefs read GetFieldDefs write SetFieldDefs stored IsFieldDefsStored; + end; + +var + VTOldBehavior: boolean; + +implementation +uses + CRParser, DAConsts, MemUtils, +{$IFDEF VER6P} + FMTBcd, +{$ENDIF} +{$IFDEF CLR} + System.XML, System.IO, System.Runtime.InteropServices, System.Text, DateUtils, RTLConsts; +{$ELSE} + CLRClasses, CRXml; +{$ENDIF} + +const + // Must be sync with 'case' in AddFieldDesc and 'case' in SaveToStream + SupportFieldTypes = [ftString, ftWideString, ftSmallint, ftInteger, ftAutoInc, + ftWord, ftBoolean, ftLargeint, ftFloat, ftCurrency, ftDate, ftTime, + ftDateTime, ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}, ftGuid, ftBCD, {$IFDEF VER6P}ftFmtBcd,{$ENDIF} + ftBytes, ftVarBytes, ftVariant]; + SNotSupportFieldType = 'Field type is not supported by TVirtualTable. '#13 + + 'Valid types is String, WideString, Smallint, Integer, Word, Boolean, Largeint, Float, Currency, Date, Time, DateTime, Blob, Memo, Guid, Bcd, ' + {$IFDEF VER6P} 'FmtBcd, ' + {$ENDIF} 'Bytes, VarBytes, Variant'; + +type + TVirtualData = class (TMemData) + protected + Owner: TDataSet; + + procedure InternalOpen; override; + procedure InternalInitFields; override; + + public + constructor Create; + end; + +{ TVirtualData } + +constructor TVirtualData.Create; +begin + inherited; + + Owner := nil; +end; + +procedure TVirtualData.InternalInitFields; + procedure AddFieldDesc(const FieldName: string; const FieldType: TFieldType; + const FieldSize: integer; const Precision: integer; const Scale: integer; + const Required: boolean; const Fixed: boolean); + var + Field: TFieldDesc; + begin + Field := TFieldDesc.Create; + try + Field.FieldNo := FFields.Count + 1; + Field.Name := FieldName; + Field.DataType := GetDataType(FieldType); + + case FieldType of + ftString: begin + Field.Size := FieldSize + 1; + Field.Length := FieldSize; + end; + ftWideString: begin + Field.Size := (FieldSize + 1) * sizeof(WideChar); + Field.Length := FieldSize; + end; + ftSmallint: + if (Precision <= 4) and (Precision <> 0) then begin + Field.DataType := dtInt8; + Field.Size := sizeof(SmallInt); + Field.Length := Precision; + end + else + Field.Size := sizeof(SmallInt); + ftInteger, ftAutoInc: + Field.Size := sizeof(Integer); + ftWord: + Field.Size := sizeof(word); + ftBoolean: + Field.Size := sizeof(Wordbool); + ftLargeint: + if (Precision <= 10) and (Precision <> 0) then begin + Field.DataType := dtUInt32; + Field.Size := sizeof(Integer); + Field.Length := Precision; + end + else + Field.Size := sizeof(Largeint); + ftFloat: begin + Field.Size := sizeof(Double); + Field.Length := Precision; + end; + ftCurrency: + Field.Size := sizeof(Double); + ftDate, ftTime, ftDateTime: begin + Field.Size := sizeof(TDateTime); + Field.Length := Precision; + end; + ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}: + Field.Size := sizeof(Pointer); + ftGuid: begin + Field.Size := FieldSize + 1; + Field.Length := FieldSize; + end; + ftBCD: begin + Field.Size := sizeof(Currency); + Field.Scale := Scale; + Field.Length := Precision; + end; + {$IFDEF VER6P} + ftFmtBcd: begin + if Precision < SizeOfTBcd then + Field.Size := SizeOfTBcd + else + Field.Size := Precision + 1{'.'} + 1 {#0}; // To right notation of large NUMERIC values + Field.Scale := Scale; + Field.Length := Precision; + end; + {$ENDIF} + ftBytes: begin + Field.Size := FieldSize; + Field.Length := FieldSize; + end; + ftVarbytes: begin + Field.Size := sizeof(word) + FieldSize; + Field.Length := FieldSize; + end; + {$IFDEF VER5P} + ftVariant: begin + Field.Size := sizeof(TVariantObject); + end; + {$ENDIF} + +{ ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, + ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, + ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, + ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd, ftVariant + } + + else + DatabaseError(SNotSupportFieldType); + end; + Field.Required := Required; + Field.Fixed := Fixed; + FFields.Add(Field); + except + Field.Free; + end; + end; + +var + i: integer; + OwnerField: TField; + OwnerFieldDef: TFieldDef; + DataFieldCount: integer; +begin + inherited; + + DataFieldCount := 0; + for i := 0 to Owner.FieldCount - 1 do + if Owner.Fields[i].FieldKind = fkData then + Inc(DataFieldCount); + + if not Owner.DefaultFields and ((DataFieldCount > Owner.FieldDefs.Count) or (TVirtualTable(Owner).FFieldDefsByField and not VTOldBehavior)) then + // From fields + for i := 0 to Owner.FieldCount - 1 do begin + if Owner.Fields[i].FieldKind = fkData then begin + OwnerField := Owner.Fields[i]; + AddFieldDesc(OwnerField.FieldName, OwnerField.DataType, OwnerField.Size, 0, 0, False, False); + end + end + else + // From FieldDefs + for i := 0 to Owner.FieldDefs.Count - 1 do begin + OwnerFieldDef := Owner.FieldDefs[i]; + + AddFieldDesc(OwnerFieldDef.Name, OwnerFieldDef.DataType, OwnerFieldDef.Size, OwnerFieldDef.Precision, + OwnerFieldDef.Size, faRequired in OwnerFieldDef.Attributes, faFixed in OwnerFieldDef.Attributes); + end +end; + +procedure TVirtualData.InternalOpen; +begin + InitFields; + + inherited; +end; + +{ TVirtualTable } + +constructor TVirtualTable.Create(Owner: TComponent); +begin + inherited; + + Data.EnableEmptyStrings := True; + FOptions := [voPersistentData,voStored]; + FStreamedActive := False; + FRecordDataStream := TMemoryStream.Create; +end; + +destructor TVirtualTable.Destroy; +begin + Data.Close; // Clear data + FRecordDataStream.Free; + + inherited; +end; + +procedure TVirtualTable.Loaded; +begin + inherited; + + try + try + FRecordDataStream.Seek(0, soFromBeginning); + if FRecordDataStream.Size > 0 then + LoadFromStream(FRecordDataStream, False); + finally + FRecordDataStream.Clear; + end; + if FStreamedActive then + Active := True; + except + if csDesigning in ComponentState then + InternalHandleException + else + raise; + end; +end; + +procedure TVirtualTable.CreateIRecordSet; +begin + FCreateCalcFieldDescs := False; + + SetIRecordSet(TVirtualData.Create); + TVirtualData(Data).Owner := Self; +end; + +procedure TVirtualTable.OpenCursor(InfoQuery: boolean); +begin + Inc(FAvoidReload); + try + inherited; + finally + Dec(FAvoidReload); + end; +end; + +procedure TVirtualTable.InternalOpen; +begin + if FAvoidReload = 0 then + FFieldDefsByField := False; + inherited; +end; + +procedure TVirtualTable.InternalClose; +begin + Inc(FAvoidReload); + try + BindFields(False); + if DefaultFields then + DestroyFields; + + if not (voPersistentData in FOptions) then + Data.Close + else + Data.SetToBegin; + finally + Dec(FAvoidReload); + end; +end; + +function TVirtualTable.IsCursorOpen: boolean; +begin + Result := inherited IsCursorOpen; +end; + +procedure TVirtualTable.CreateFieldDefs; +var + DataFieldCount: integer; + OldFieldDefsCount: integer; + i: integer; +begin + OldFieldDefsCount := FieldDefs.Count; + DataFieldCount := 0; + for i := 0 to FieldCount - 1 do + if Fields[i].FieldKind = fkData then + Inc(DataFieldCount); + + if not DefaultFields and + ((DataFieldCount > FieldDefs.Count) or FFieldDefsByField)then + try + // Used to prevent save/load table DefChanged + Inc(FAvoidReload); + inherited; + if FFieldDefsByField then + FFieldDefsByField := (DataFieldCount = FieldDefs.Count) + else + FFieldDefsByField := (OldFieldDefsCount = 0) and (FieldDefs.Count > 0); + finally + Dec(FAvoidReload); + end; +end; + +procedure TVirtualTable.Reload; +var + OldActive: boolean; + Stream: TMemoryStream; +begin + if Data.RecordCount > 0 then begin + OldActive := Active; + Stream := TMemoryStream.Create; + DisableControls; + try + SaveToStream(Stream, False); + Close; + Clear; + finally + LoadFromStream(Stream, False); + Active := OldActive; + Stream.Free; + EnableControls; + end; + end + else begin + OldActive := Active; + Close; + Clear; + Active := OldActive; + end; +end; + +procedure TVirtualTable.DefChanged(Sender: TObject); +var + FieldDef: TFieldDef; + i: integer; +begin + if not FAvoidRefreshData then begin + if Active then + FFieldDefsByField := False; + for i := 0 to TFieldDefs(Sender).Count - 1 do begin + FieldDef := TFieldDefs(Sender)[i]; + if FieldDef.DataType = ftUnknown then begin + FAvoidRefreshData := True; + FieldDef.DataType := ftString; + FieldDef.Size := 20; + FAvoidRefreshData := False; + end; + end; + + if FAvoidReload = 0 then + Reload; + end; +end; + +{$IFDEF CLR} +procedure TVirtualTable.DataEvent(Event: TDataEvent; Info: TObject); +{$ELSE} +procedure TVirtualTable.DataEvent(Event: TDataEvent; Info: longint); +{$ENDIF} +begin + if FFieldDefsByField and (Event = deFieldListChange) and (FAvoidReload = 0) and not VTOldBehavior then begin + Inc(FAvoidReload); + try + FieldDefs.Updated := False; + if Data.Active {and (voPersistentData in FOptions)} then + Reload; + finally + Dec(FAvoidReload); + end; + end; + inherited DataEvent(Event, Info); +end; + +procedure TVirtualTable.Assign(Source: TPersistent); +var + Stream: TMemoryStream; +begin + if Source is TVirtualTable then begin + Stream := TMemoryStream.Create; + try + TVirtualTable(Source).SaveToStream(Stream); + LoadFromStream(Stream); + finally + Stream.Free; + end; + FFieldDefsByField := TVirtualTable(Source).FFieldDefsByField; + end + else + if Source is TDataSet then + AssignDataSet(TDataSet(Source)) + else + inherited; +end; + +procedure TVirtualTable.AssignDataSet(Source: TDataSet); + + procedure CreateFieldDefs(Fields: TFields; FieldDefs: TFieldDefs); + var + I: Integer; + F: TField; + FieldDef: TFieldDef; + SourceFieldDef: TFieldDef; + NewDataType: TFieldType; + begin + FieldDefs.BeginUpdate; + try + for I := 0 to Fields.Count - 1 do + begin + F := Fields[I]; + SourceFieldDef := Source.FieldDefs.Find(F.FieldName); + with F do begin + case DataType of + ftOraBlob: NewDataType := ftBlob; + ftOraClob: NewDataType := ftMemo; + else + NewDataType := DataType; + end; + if (FieldKind = fkData) and (NewDataType in SupportFieldTypes) + then begin + FieldDef := FieldDefs.AddFieldDef; + FieldDef.Name := FieldName; + FieldDef.DataType := NewDataType; + FieldDef.Size := Size; + if Required then + FieldDef.Attributes := [faRequired]; + if ReadOnly then + FieldDef.Attributes := FieldDef.Attributes + [faReadonly]; + if faFixed in SourceFieldDef.Attributes then + FieldDef.Attributes := FieldDef.Attributes + [faFixed]; + if (DataType = ftBCD) and (F is TBCDField) then + FieldDef.Precision := TBCDField(F).Precision; + if F is TObjectField then + CreateFieldDefs(TObjectField(F).Fields, FieldDef.ChildDefs); + end; + end; + end; + + finally + FieldDefs.EndUpdate; + end; + end; + +var + OldActive: boolean; + Bookmark: string; + i: integer; + SourceField: TField; + + FieldsRO: array of boolean; + Value: variant; +begin + OldActive := Active; + Close; + Clear; + DeleteFields; + + CreateFieldDefs(Source.Fields, FieldDefs); + + if Source.Active then begin + DisableControls; + Source.DisableControls; + Bookmark := Source.Bookmark; + Source.First; + + Open; + + // Temporary clear Field.ReadOnly flag + SetLength(FieldsRO, Fields.Count); + for i := 0 to Fields.Count - 1 do begin + FieldsRO[i] := Fields[i].ReadOnly; + Fields[i].ReadOnly := False; + end; + + try + while not Source.EOF do begin + Append; + for i := 0 to Fields.Count - 1 do begin + SourceField := Source.FieldByName(Fields[i].FieldName); + if not SourceField.IsNull then + if Fields[i] is TLargeIntField then + TLargeIntField(Fields[i]).AsLargeInt := TLargeIntField(SourceField).AsLargeInt + else begin + // To avoid memory leaks + Value := Unassigned; + Value := SourceField.Value; + Fields[i].Value := Value; + end; + end; + Post; + Source.Next; + end; + finally + First; + + // Restore Field.ReadOnly flag + for i := 0 to Fields.Count - 1 do + Fields[i].ReadOnly := FieldsRO[i]; + + if Source.RecordCount > 0 then + Source.Bookmark := Bookmark; + + Source.EnableControls; + EnableControls + end; + end; + Active := OldActive; +end; + +procedure TVirtualTable.DefineProperties(Filer: TFiler); + function WriteData: boolean; + begin + Result := True; + end; +begin + inherited DefineProperties(Filer); + + Filer.DefineBinaryProperty('Data', ReadBinaryData, WriteBinaryData, + WriteData); +end; + +procedure TVirtualTable.ReadBinaryData(Stream: TStream); +begin + if voStored in FOptions then begin + FRecordDataStream.Clear; + FRecordDataStream.CopyFrom(Stream, Stream.Size - Stream.Position); + end; +end; + +procedure TVirtualTable.WriteBinaryData(Stream: TStream); +begin + if voStored in FOptions then + SaveToStream(Stream, False); +end; + +function TVirtualTable.IsSequenced: boolean; +begin + Result := True; +end; + +procedure TVirtualTable.AddField(Name: string; FieldType: TFieldType; Size: integer; Required: boolean); +begin + if not (FieldType in SupportFieldTypes) then + DatabaseError(SNotSupportFieldType); + + FieldDefs.Add(Name, FieldType, Size, Required); +end; + +procedure TVirtualTable.DeleteField(Name: string); +var + Stream: TMemoryStream; + OldActive: boolean; + FieldDef: TFieldDef; +begin + FieldDef := FieldDefs.Find(Name); + if VTOldBehavior then begin + OldActive := Active; + Stream := TMemoryStream.Create; + try + SaveToStream(Stream, False); + Close; + Clear; + + FieldDef.Free; + //FieldDefs.Delete(FieldDef.Index); + finally + LoadFromStream(Stream, False); + Active := OldActive; + Stream.Free; + end; + end + else + FieldDef.Free; +end; + +procedure TVirtualTable.DeleteFields; +begin + Clear; + FieldDefs.Clear; +{$IFDEF VER3} + while FieldCount > 0 do + Fields[0].Free; +{$ELSE} + Fields.Clear; +{$ENDIF} +end; + +procedure TVirtualTable.Clear; +begin + if State in [dsInsert,dsEdit] then + Cancel; + Data.Close; + if Active then begin + Data.Open; + Resync([]); + end; +end; + +{ Stream/File } + +{ Storage format: + Version 2 // 0 = 2.00, 1 = 2.10, 2 = 5.10.1.8 (Blob storage) +-- FieldDefs + FieldCount 2 + NameLength 2 + Name Length(Name) + DataType 2 + Size 2 + +-- Fields + FieldCount 2 -| + NameLength 2 | + Name Length(Name) | for 1 + Kind 2 | + DataType 2 | + Size 2 -| + + RecordCount 4 + Size 2 (4 from Version = 2) + Value Size +} + +function XMLDecode(const AStr: String): String; +var + sb: StringBuilder; +begin + sb := StringBuilder.Create(AStr, Length(AStr)); + try + sb.Replace(''', ''''); + sb.Replace('"', '"'); + sb.Replace('<', '<'); + sb.Replace('>', '>'); + sb.Replace('&', '&'); + Result := sb.ToString; + finally + sb.Free; + end; +end; + +type +{$IFDEF VER6P} + TStringListQ = class(TStringList) + protected + function CompareStrings(const S1, S2: string): Integer; override; + end; + +function TStringListQ.CompareStrings(const S1, S2: string): Integer; // +10% to performance +begin + if S1 > S2 then + Result := 1 + else + if S1 < S2 then + Result := -1 + else + Result := 0; +end; +{$ELSE} + TStringListQ = TStringList; +{$ENDIF} + +procedure TVirtualTable.LoadFromStream(Stream: TStream; LoadFields: boolean); +var + LocFieldDefs: TFieldDefs; + FieldAliases: TStringList; + StrReader: StringReader; + Reader: XMLTextReader; + StreamXML: string; + Version: word; + + procedure ReadArray(var A: TBytes; Count: integer; const Offset: integer = 0); + begin + {$IFDEF CLR} + if (Count <> 0) and (Stream.Read(A, Offset, Count) <> Count) then + raise EReadError.Create(SReadError); + {$ELSE} + Stream.ReadBuffer(A[Offset], Count); + {$ENDIF} + end; + + function DetectFileFormat: TCRFileFormat; + var + Signature: TBytes; + Offset: integer; + {$IFDEF CLR} + Bytes: TBytes; + {$ENDIF} + begin + Result := ffVTD; + Stream.Position := 0; + SetLength(Signature, 5); + ReadArray(Signature, 5); + Stream.Position := 0; + + if (Signature[0] = $EF) and (Signature[1] = $BB) and (Signature[2] = $BF) then begin // UTF8 preamble + Stream.Position := 3; + ReadArray(Signature, 5); + end; + + if Signature[0] <> Byte('<') then + Exit; + if Signature[1] = Byte('?') then + Offset := 1 + else + Offset := 0; + if + ((Signature[1 + Offset] <> Byte('x')) and (Signature[1 + Offset] <> Byte('X'))) or + ((Signature[2 + Offset] <> Byte('m')) and (Signature[2 + Offset] <> Byte('M'))) or + ((Signature[3 + Offset] <> Byte('l')) and (Signature[3 + Offset] <> Byte('L'))) + then + Exit; + + Result := ffXML; + StreamXML := ''; + SetLength(StreamXML, Stream.Size); + {$IFDEF CLR} + Bytes := Encoding.Default.GetBytes(StreamXML); + Stream.Read(Bytes, Length(StreamXML)); + StreamXML := Encoding.Default.GetString(Bytes); + {$ELSE} + Stream.Read(StreamXML[1], Length(StreamXML)); + {$ENDIF} + end; + + procedure ReadFieldDefsVTD; + var + FieldCount: word; + i: integer; + D2: word; + FieldName: TBytes; + FieldType: word; + FieldSize: word; + FieldPrecision: integer; + FieldDef: TFieldDef; + begin + Stream.Read(FieldCount, 2); + for i := 0 to FieldCount - 1 do begin + Stream.Read(D2, 2); + SetLength(FieldName, D2); + ReadArray(FieldName, D2); + Stream.Read(FieldType, 2); + Stream.Read(FieldSize, 2); + + if Version >= 3 then + Stream.Read(FieldPrecision, 4); + + LocFieldDefs.Add(Encoding.Default.GetString(FieldName), TFieldType(FieldType), FieldSize, False); + FieldDef := LocFieldDefs.Items[LocFieldDefs.Count - 1]; + + if TFieldType(FieldType) in [ftCurrency, ftFloat, ftInteger, ftSmallInt, ftLargeInt, ftDate, ftTime, ftDateTime] then + FieldDef.Precision := FieldPrecision; + end; + end; + + procedure ReadFieldDefsXML; + function FieldTypeFromXML(FieldType: string; FieldDBType: string; + const IsLong: boolean; const FixedLength: boolean): TFieldType; + var + InternalType: Word; + begin + FieldType := LowerCase(FieldType); + FieldDBType := LowerCase(FieldDBType); + + if (FieldType = 'i8') and (FieldDBType = '') {and FixedLength} then + InternalType := dtInt64 + else + if (FieldType = 'bin.hex') and (FieldDBType = '') then + if IsLong then + InternalType := dtBlob + else + InternalType := dtBytes + else + if (FieldType = 'boolean') and (FieldDBType = '') {and FixedLength} then + InternalType := dtBoolean + else + if (FieldType = 'string') and (FieldDBType = 'variant') then + {$IFDEF VER5P} + InternalType := dtVariant + {$ELSE} + InternalType := dtString + {$ENDIF} + else + if (FieldType = 'string') and (FieldDBType = '') then + if IsLong then + InternalType := {$IFDEF VER10P}dtWideMemo{$ELSE}dtMemo{$ENDIF} + else + InternalType := dtWideString + else + if (FieldType = 'string') and ((FieldDBType = 'str') or (FieldDBType = 'string')) then + if IsLong then + InternalType := dtMemo + else + InternalType := dtString + else + if (FieldType = 'i8') and (FieldDBType = 'currency') {and FixedLength} then + InternalType := dtCurrency + else + if (FieldType = 'number') and (FieldDBType = 'currency') {and FixedLength} then + InternalType := dtCurrency + else + if (FieldType = 'datetime') and (FieldDBType = 'variantdate') {and FixedLength} then + InternalType := dtDateTime + else + if (FieldType = 'date') and (FieldDBType = '') {and FixedLength} then + InternalType := dtDate + else + if (FieldType = 'time') and (FieldDBType = '') {and FixedLength} then + InternalType := dtTime + else + if (FieldType = 'datetime') and (FieldDBType = 'timestamp') {and FixedLength} then + InternalType := dtDateTime + else + if (FieldType = 'number') and (FieldDBType = 'decimal') {and FixedLength} then + InternalType := dtCurrency + else + if (FieldType = 'float') and (FieldDBType = '') {and FixedLength} then + InternalType := dtFloat + else + if (FieldType = 'uuid') and (FieldDBType = '') and FixedLength then + {$IFDEF VER5P} + InternalType := dtGuid + {$ELSE} + InternalType := dtString + {$ENDIF} + else + if (FieldType = 'int') and (FieldDBType = '') {and FixedLength} then + InternalType := dtInt32 + else + if (FieldType = 'number') and (FieldDBType = 'numeric') {and FixedLength} then + {$IFDEF VER6P} + InternalType := dtFmtBCD + {$ELSE} + InternalType := dtBCD + {$ENDIF} + else + if (FieldType = 'r4') and (FieldDBType = '') {and FixedLength} then + InternalType := dtFloat + else + if (FieldType = 'i2') and (FieldDBType = '') {and FixedLength} then + InternalType := dtInt16 + else + if (FieldType = 'i1') and (FieldDBType = '') {and FixedLength} then + InternalType := dtInt8 + else + if (FieldType = 'ui8') and (FieldDBType = '') {and FixedLength} then + InternalType := dtInt64 + else + if (FieldType = 'ui4') and (FieldDBType = '') {and FixedLength} then + InternalType := dtUInt32 + else + if (FieldType = 'ui2') and (FieldDBType = '') {and FixedLength} then + InternalType := dtWord + else + if (FieldType = 'ui1') and (FieldDBType = '') {and FixedLength} then + InternalType := dtWord + else begin + DatabaseError(SDataTypeNotSupported, Self); + InternalType := 0; // to prevent compiler warning + end; + Result := GetFieldType(InternalType); + end; + + var + i: integer; + AttrName, AttrValue: string; + AttributeCount: integer; + FieldDef: TFieldDef; + FieldName: string; + FieldAlias: string; + FieldDataType: TFieldType; + FieldSize: integer; + FieldPrecision: integer; + FieldScale: integer; + FieldRequired: boolean; + FieldFixed: boolean; + FieldType, FieldDBType: string; + FieldIsLong: boolean; + HaveLength: boolean; + TmpValue: string; + begin + while Reader.Read do begin + if (UpperCase(Reader.Name) = 'S:SCHEMA') and (Reader.NodeType = ntEndElement) then + break; + if (UpperCase(Reader.Name) = 'S:ATTRIBUTETYPE') and (Reader.NodeType <> ntEndElement) then begin + AttributeCount := Reader.AttributeCount; + for i := 0 to AttributeCount - 1 do begin + Reader.MoveToAttribute(i); + if LowerCase(Reader.Name) = 'name' then + FieldName := Reader.Value; + if LowerCase(Reader.Name) = 'rs:name' then begin + FieldAlias := Reader.Value; + {$IFDEF CLR} + FieldAlias := XMLDecode(FieldAlias); + {$ENDIF} + end; + end; + if FieldAlias <> '' then begin + TmpValue := FieldName; + FieldName := FieldAlias; + FieldAlias := TmpValue; + FieldAliases.Add(FieldName + '=' + FieldAlias); + end; + while not ((UpperCase(Reader.Name) = 'S:DATATYPE') and (Reader.NodeType <> ntEndElement)) do begin + Reader.Read; + if Reader.EOF then + raise Exception.Create(SInvalidXML); + end; + FieldSize := 0; + FieldPrecision := 0; + FieldScale := 0; + FieldType := ''; + FieldDBType := ''; + FieldIsLong := False; + FieldRequired := False; + FieldFixed := False; + HaveLength := False; + AttributeCount := Reader.AttributeCount; + for i := 0 to AttributeCount - 1 do begin + Reader.MoveToAttribute(i); + AttrName := LowerCase(Reader.Name); + AttrValue := LowerCase(Reader.Value); + + if AttrName = 'rs:fixedlength' then + FieldFixed := StrToBool(AttrValue) + else + if AttrName = 'rs:maybenull' then + FieldRequired := not StrToBool(AttrValue) + else + if AttrName = 'dt:maxlength' then begin + FieldSize := Integer(Round(StrToFloat(AttrValue)) and $7FFFFFFF); + HaveLength := True; + end + else + if AttrName = 'rs:precision' then + FieldPrecision := StrToInt(AttrValue) + else + if AttrName = 'rs:scale' then + FieldScale := StrToInt(AttrValue) + else + if AttrName = 'dt:type' then + FieldType := AttrValue + else + if AttrName = 'rs:dbtype' then + FieldDBType := AttrValue + else + if AttrName = 'rs:long' then + FieldIsLong := StrToBool(AttrValue); + end; + + if (FieldType = '') and (FieldDBType = '') then + raise Exception.Create(SInvalidXML); + + if (not HaveLength) and (FieldDBType = '') then + FieldDBType := 'variant'; + FieldDataType := FieldTypeFromXML(FieldType, FieldDBType, FieldIsLong, FieldFixed); + + if not (FieldDataType in [ftString, ftWideString, ftVariant, ftGuid, ftBcd{$IFDEF VER6P}, ftFmtBcd{$ENDIF}, + ftBytes, ftVarBytes, ftBlob, ftMemo, ftFixedChar{$IFDEF VER6P}, ftTimeStamp{$ENDIF}{$IFDEF VER10P}, ftWideMemo{$ENDIF}]) then + FieldSize := 0; + + if FieldIsLong then + FieldSize := 0; + + if FieldDataType = ftGuid then + FieldSize := 38; + + if (FieldDataType = ftBytes) and not FieldFixed then + FieldDataType := ftVarBytes; + + LocFieldDefs.Add(FieldName, FieldDataType, FieldSize, FieldRequired); + FieldDef := LocFieldDefs.Items[LocFieldDefs.Count - 1]; + + if FieldDataType in [ftCurrency, ftFloat, ftInteger, ftSmallInt, ftLargeInt, ftDate, ftTime, ftDateTime] then + FieldDef.Precision := FieldPrecision + else + if FieldDataType in [ftBCD{$IFDEF VER6P}, ftFMTBCD{$ENDIF}] then begin + FieldDef.Precision := FieldPrecision; + FieldDef.Size := FieldScale; + end; + + {$IFDEF VER5P} + if FieldFixed then + FieldDef.Attributes := FieldDef.Attributes + [DB.faFixed]; + {$ENDIF} + end; + end; + end; + + procedure SetXMLValueToField(Field: TField; const FieldValue: string); + var + Year: integer; + Month: Word; + Day: Word; + Hour: Word; + Minute: Word; + Second: Word; + + function GetNext(const Value: string; Offset: integer; Digits: Integer): string; + var + i: Integer; + begin + SetLength(Result, Digits); + for i := 1 to Digits do begin + if (Value[Offset + i] >= '0') and (Value[Offset + i] <= '9') then + Result[i] := Value[Offset + i] + else + raise Exception.Create(SInvalidXML); + end; + end; + + procedure ConvertDate(const Value: string); + var + Offset: integer; + begin + Offset := 0; + if Value[1] = '-' then + Inc(Offset); + Year := StrToInt(GetNext(Value, Offset, 4)); + Inc(Offset, 5); + Month := StrToInt(GetNext(Value, Offset, 2)); + Inc(Offset, 3); + Day := StrToInt(GetNext(Value, Offset, 2)); + end; + + procedure ConvertTime(const Value: string); + var + Offset: integer; + begin + if Length(Value) < 8 then + raise Exception.Create(SInvalidXML); + Offset := 0; + Hour := StrToInt(GetNext(Value, Offset, 2)); + Inc(Offset, 3); + Minute := StrToInt(GetNext(Value, Offset, 2)); + Inc(Offset, 3); + Second := StrToInt(GetNext(Value, Offset, 2)); + end; + + function DecodeXMLDateTime(const XMLDateTime: string): TDateTime; + var + TimePosition: integer; + begin + TimePosition := Pos('T', XMLDateTime); + if TimePosition > 0 then begin + ConvertDate(Copy(XMLDateTime, 1, TimePosition -1)); + ConvertTime(Copy(XMLDateTime, TimePosition + 1, Length(XMLDateTime) - TimePosition)); + end else begin + Hour := 0; + Minute := 0; + Second := 0; + ConvertDate(XMLDateTime); + end; + Result := {$IFNDEF CLR}MemUtils.{$ENDIF}EncodeDateTime(Year, Month, Day, Hour, Minute, Second, 0); + end; + + function DecodeXMLTime(const XMLTime: string): TDateTime; + begin + Year := 1000; + Month := 1; + Day := 1; + ConvertTime(XMLTime); + Result := {$IFNDEF CLR}MemUtils.{$ENDIF}EncodeDateTime(Year, Month, Day, Hour, Minute, Second, 0); + end; + + var + FieldDesc: TFieldDesc; + {$IFDEF VER6P} + Bcd: TBCD; + TmpBcd: TBCD; + FieldLength, FieldScale: integer; + {$IFDEF VER9P} + Delta: word; + {$ENDIF} + {$ENDIF} + Buffer: TBytes; + i: Integer; + IsValidChar: boolean; + TextOffset, BuffOffset, Count: integer; + {$IFDEF CLR} + TextBytes: TBytes; + {$ENDIF} + begin + FieldDesc := GetFieldDesc(Field); + case FieldDesc.DataType of + dtBoolean: + Field.AsBoolean := StrToBool(FieldValue); + dtInt8, dtInt16, dtInt32, dtInt64, dtUInt16, dtUInt32: + Field.AsString := FieldValue; + dtFloat: + Field.AsFloat := StrToFloat(ChangeDecimalSeparator(FieldValue, '.', DecimalSeparator)); + dtDate, dtDateTime: + Field.AsDateTime := DecodeXMLDateTime(FieldValue); + dtTime: + Field.AsDateTime := DecodeXMLTime(FieldValue); + dtCurrency, dtBcd: + Field.AsCurrency := StrToCurr(ChangeDecimalSeparator(FieldValue, '.', DecimalSeparator)); + {$IFDEF VER6P} + dtFmtBCD: begin + BCD := StrToBCD(ChangeDecimalSeparator(FieldValue, '.', DecimalSeparator)); + FieldLength := FieldDesc.Length; + FieldScale := FieldDesc.Scale; + {$IFDEF VER9P} // Delphi 9 NormalizeBcd Bug + Delta := FieldLength - FieldScale; + if Delta > 34 then begin + Delta := 34; + FieldLength := FieldScale + Delta; + end; + {$ENDIF} + NormalizeBcd(Bcd, TmpBcd, FieldLength, FieldScale); + Field.AsBCD := TmpBcd; + end; + {$ENDIF} + dtBlob, dtBytes, dtVarBytes, dtExtVarBytes: begin + {$IFDEF CLR} + TextBytes := Encoding.Default.GetBytes(FieldValue); + {$ENDIF} + TextOffset := 0; + BuffOffset := 0; + SetLength(Buffer, Length(FieldValue) div 2); + for i := 1 to Length(FieldValue) do begin + IsValidChar := not ((FieldValue[i] = #$D) or (FieldValue[i] = #$A) or (FieldValue[i] = #9)); + if ((not IsValidChar) or (i = Length(FieldValue))) then begin + Count := i - TextOffset; + if not IsValidChar then + Dec(Count); + if Count > 0 then begin + {$IFNDEF CLR} + HexToBin(PChar(Integer(@FieldValue[1]) + TextOffset), PChar(Integer(@Buffer[0]) + BuffOffset), Count); + {$ELSE} + HexToBin(TextBytes, TextOffset, Buffer, BuffOffset, Count div 2); + {$ENDIF} + Inc(BuffOffset, Count div 2); + end; + TextOffset := i; + end; + end; + if Length(Buffer) > BuffOffset then + SetLength(Buffer, BuffOffset); + Field.AsString := Encoding.Default.GetString(Buffer); + end; + else + Field.AsString := FieldValue; + end; + end; + + procedure ProcessXMLData; + var + AttributeCount: integer; + p, i, j: integer; + Field: TField; + FieldList: TStringList; + FieldIndex: integer; + ActualName, Alias: string; + begin + FieldList := TStringListQ.Create; + try + {$IFDEF VER6P} + FieldList.CaseSensitive := True; + {$ENDIF} + FieldList.Sorted := True; + while Reader.Read do + if (UpperCase(Reader.Name) = 'Z:ROW') and (Reader.NodeType <> ntEndElement) then begin + Append; + try + AttributeCount := Reader.AttributeCount; + for i := 0 to AttributeCount - 1 do begin + Reader.MoveToAttribute(i); + FieldIndex := FieldList.IndexOf(Reader.Name); + if FieldIndex > -1 then + Field := FieldList.Objects[FieldIndex] as TField + else begin + Field := FindField(Reader.Name); + FieldList.AddObject(Reader.Name, Field); + if Field = nil then + for j := 0 to FieldAliases.Count - 1 do begin + p := Pos('=', FieldAliases[j]); + if p > 0 then begin + ActualName := LowerCase(Copy(FieldAliases[j], 0, p - 1)); + Alias := Copy(FieldAliases[j], p + 1, Length(FieldAliases[j]) - p); + if Reader.Name = Alias then begin + Field := FindField(ActualName); + if Field <> nil then + break; + end; + end; + end; + end; + if Field = nil then + raise Exception.Create(SInvalidXML); + SetXMLValueToField(Field, UTF8Decode(Reader.Value)); + end; + Post; + finally + Cancel; + end; + end; + finally + FieldList.Free; + end; + end; + +var + D2: word; + D4: cardinal; + FieldName: TBytes; + FieldType: word; + FieldSize: word; + FieldKind: word; + RecordCount: integer; + i, j: integer; + OldActive: boolean; + St: TBytes; + WSt: TBytes; + FieldClass: TFieldClass; + Field: TField; + FieldArr: Array of TField; + Handle: IntPtr; + + FileFormat: TCRFileFormat; + +begin + Inc(FAvoidReload); + try + OldActive := Active; + Close; + Clear; + if LoadFields then begin + LocFieldDefs := FieldDefs; + DeleteFields; + end + else + LocFieldDefs := TFieldDefs.Create(Self); + + Stream.Seek(0, soFromBeginning); + FileFormat := DetectFileFormat; + + Stream.Seek(0, soFromBeginning); + Stream.Read(Version, 2); // Version + + StrReader := nil; + Reader := nil; + + FieldAliases := nil; + try + // FieldDefs + FAvoidRefreshData := True; + try + case FileFormat of + ffVTD: + ReadFieldDefsVTD; + ffXML: begin + FieldAliases := TStringList.Create; + StrReader := StringReader.Create(StreamXML); + Reader := XMLTextReader.Create(StrReader); + ReadFieldDefsXML; + end; + end; + finally + FAvoidRefreshData := False; + end; + + with Stream do begin + if (FileFormat = ffVTD) and (Version >= 1) then begin + // Fields + Read(D2, 2); + for i := 0 to D2 - 1 do begin + Read(D2, 2); + SetLength(FieldName, D2); + ReadArray(FieldName, D2); + Read(FieldKind, 2); + Read(FieldType, 2); + Read(FieldSize, 2); + + if TFieldKind(FieldKind) = fkLookup then continue; + FieldClass := GetFieldClass(TFieldType(FieldType)); + + Field := FieldClass.Create(Self.Owner);// Self); + try + Field.FieldName := Encoding.Default.GetString(FieldName); + Field.FieldKind := TFieldKind(FieldKind); + case TFieldType(FieldType) of + ftString: + Field.Size := FieldSize; + ftWideString: + Field.Size := FieldSize * sizeof(WideChar); + end; + Field.DataSet := Self; + except + Field.Free; + raise; + end; + end; + end; + if FileFormat = ffVTD then + Read(RecordCount, 4); + + if (FileFormat = ffXML) or ((FileFormat = ffVTD) and (RecordCount > 0)) then begin + DisableControls; + if not (csReading in ComponentState) then + Open + else begin + DoBeforeOpen; + try + OpenCursor(False); + SetState(dsBrowse) + except + SetState(dsInactive); + CloseCursor; + raise; + end; + DoAfterOpen; + DoAfterScroll; + end; + + try + case FileFormat of + ffXML: + ProcessXMLData; + ffVTD: begin + SetLength(FieldArr, LocFieldDefs.Count); + for i := 0 to LocFieldDefs.Count - 1 do + FieldArr[i] := FindField(LocFieldDefs[i].Name); + + for j := 0 to RecordCount - 1 do begin + Append; + try + for i := 0 to LocFieldDefs.Count - 1 do begin + Field := FieldArr[i]; + + if Version < 2 then begin + Read(D2, 2); + D4 := D2; + end + else + Read(D4, 4); + + if D4 > 0 then begin + if (Field <> nil) and (Field.DataType = ftWideString) then begin + SetLength(WSt, D4); + ReadArray(WSt, D4); + TWideStringField(Field).Value := + Encoding.Unicode.{$IFDEF CLR}GetString{$ELSE}GetWideString{$ENDIF}(WSt); + end + else + begin + if (Field <> nil) and (Field.DataType = ftVarBytes) then begin + SetLength(St, D4 + 2); + D2 := D4; + St[0] := Lo(D2); + St[1] := Hi(D2); + ReadArray(St, D4, 2); + end + else begin + SetLength(St, D4); + ReadArray(St, D4); + end; + + if Field <> nil then + case Field.DataType of + ftString, ftBlob, ftMemo: + Field.AsString := Encoding.Default.GetString(St); + {$IFDEF VER10P} + ftWideMemo: + TWideMemoField(Field).Value := Encoding.Unicode.{$IFDEF CLR}GetString{$ELSE}GetWideString{$ENDIF}(St); + {$ENDIF} + else + Handle := AllocGCHandle(St, True); + try + Field.SetData(GetAddrOfPinnedObject(Handle)); + finally + FreeGCHandle(Handle); + end; + end; + end; + end; + end; + finally + Post; + end; + end; + end; + else + Assert(False); + end; + finally + First; + EnableControls; + end; + + if not OldActive and (voPersistentData in FOptions) then + if csReading in ComponentState then begin + SetState(dsInactive); + CloseCursor; + end + else + Close; + end + else + Active := OldActive; + end; + + finally + if LocFieldDefs <> FieldDefs then + LocFieldDefs.Free; + FieldAliases.Free; + Reader.Free; + StrReader.Free; + end; + finally + Dec(FAvoidReload); + end; +end; + +{$IFDEF CLR} +function StrLen(S: IntPtr): integer; +begin + Result := 0; + while Marshal.ReadByte(S, Result) <> 0 do + Inc(Result); +end; + +function StrLenW(S: IntPtr): integer; +begin + Result := 0; + while Marshal.ReadInt16(S, Result * 2) <> 0 do + Inc(Result); +end; +{$ENDIF} + +procedure TVirtualTable.SaveToStream(Stream: TStream; StoreFields: boolean); +var + D2: word; + D4: cardinal; + St: {$IFDEF CLR}TBytes{$ELSE}string{$ENDIF}; + i: integer; + OldRecNo: integer; + OldActive: boolean; + TempFields: TFields; + Field: TField; + FieldDesc: TFieldDesc; + FieldArr: array of TField; + FieldDescArr: array of TFieldDesc; + Buffer: TBytes; + pBuffer: IntPtr; + RecBuf: TRecordBuffer; + IsNull: boolean; + Piece: PPieceHeader; + BufLen: cardinal; + Blob: TBlob; + BlobBuffer: TBytes; + Handle: IntPtr; + + procedure AssignFields(Dest: TFields; Source: TFields); + var + Field:TField; + begin + Dest.Clear; + while Source.Count > 0 do begin + Field := Source[0]; + Source.Remove(Field); + Dest.Add(Field); + end; + end; + + procedure WriteArray(const A: TBytes; Count: integer; const Offset: integer = 0); + begin + {$IFDEF CLR} + if (Count <> 0) and (Stream.Write(A, Offset, Count) <> Count) then + raise EWriteError.Create(SWriteError); + {$ELSE} + Stream.WriteBuffer(A[Offset], Count); + {$ENDIF} + end; + +var + Offset: integer; + +begin + Inc(FAvoidReload); + try + OldActive := Active; + with Stream do begin + D2 := 3; + Write(D2, 2); // Version 0 - 2.00 1 - 2.10 + + // FieldDefs + D2 := FieldDefs.Count; + Write(D2, 2); + for i := 0 to FieldDefs.Count - 1 do begin + D2 := Length(FieldDefs[i].Name); + Write(D2, 2); + {$IFDEF CLR} + St := Encoding.Default.GetBytes(FieldDefs[i].Name); + WriteArray(St, D2); + {$ELSE} + St := FieldDefs[i].Name; + Write(PChar(St)^, Length(St)); + {$ENDIF} + D2 := Word(FieldDefs[i].DataType); + Write(D2, 2); + D2 := FieldDefs[i].Size; + Write(D2, 2); + D4 := FieldDefs[i].Precision; + Write(D4, 4); + end; + + // Fields + if DefaultFields or not StoreFields then begin + D2 := 0; + Write(D2, 2); + end + else begin + D2 := FieldCount; + for i := 0 to FieldCount - 1 do + if Fields[i].FieldKind = fkLookup then Dec(D2); + Write(D2, 2); + for i := 0 to FieldCount - 1 do begin + if Fields[i].FieldKind = fkLookup then continue; + D2 := Length(Fields[i].FieldName); + Write(D2, 2); + {$IFDEF CLR} + St := Encoding.Default.GetBytes(Fields[i].FieldName); + WriteArray(St, D2); + {$ELSE} + St := Fields[i].FieldName; + Write(PChar(St)^, Length(St)); + {$ENDIF} + D2 := Word(Fields[i].FieldKind); // for ver 1 + Write(D2, 2); + D2 := Word(Fields[i].DataType); + Write(D2, 2); + D2 := Fields[i].Size; + Write(D2, 2); + end; + end; + + if FieldDefs.Count = 0 then begin + D4 := 0; + Write(D4, 4); + end + else begin + DisableControls; + if Active then + OldRecNo := RecNo + else + OldRecNo := -1; + + if not DefaultFields then begin + Close; + TempFields := TFields.Create(nil); + AssignFields(TempFields, Fields); + Fields.Clear; + end + else + TempFields := nil; + + Open; + First; + + BufLen := 0; + SetLength(FieldArr, FieldDefs.Count); + SetLength(FieldDescArr, FieldDefs.Count); + for i := 0 to FieldDefs.Count - 1 do begin + FieldArr[i] := FindField(FieldDefs[i].Name); + FieldDescArr[i] := Data.FindField(FieldDefs[i].Name); + if (FieldDescArr[i] <> nil) and (FieldDescArr[i].Size > BufLen) then + BufLen := FieldDescArr[i].Size; + end; + + SetLength(Buffer, BufLen); + Handle := AllocGCHandle(Buffer, True); + pBuffer := GetAddrOfPinnedObject(Handle); + + try + D4 := RecordCount; + Write(D4, 4); + + while not EOF do begin + for i := 0 to FieldDefs.Count - 1 do begin + Field := FieldArr[i]; + FieldDesc := FieldDescArr[i]; + + // get field desc and data from record buffer + if FieldDesc <> nil then begin + GetActiveRecBuf(RecBuf); + if FieldDesc.DataType = dtVariant then + FillChar(pBuffer, Length(Buffer), 0); + Data.GetField(FieldDesc.FieldNo, RecBuf, pBuffer, IsNull); + end + else + IsNull := True; + + Blob := nil; + Offset := 0; + if (Field = nil) or (FieldDesc = nil) or IsNull then + D4 := 0 + else begin + // to write field data there must be Field and FieldDesc + case FieldDesc.DataType of + dtString: + D4 := StrLen(pBuffer); + dtWideString: + D4 := StrLenW(pBuffer) * sizeof(WideChar); + dtInt8, dtInt16, dtInt32, dtInt64, dtUInt16, dtUInt32, + dtBoolean, dtCurrency, dtFloat, dtGuid, dtBytes: + D4 := FieldDesc.Size; + dtDateTime, dtDate, dtTime: + D4 := sizeof(TDateTime); + dtBlob, dtMemo{$IFDEF VER10P}, dtWideMemo{$ENDIF}: begin + Blob := TBlob(GetGCHandleTarget(Marshal.ReadIntPtr(pBuffer))); + D4 := Blob.Size; + end; + dtVarBytes: begin + D4 := Marshal.ReadInt16(pBuffer); + Offset := 2; + end; + {$IFDEF VER6P} + dtFMTBCD: + D4 := SizeOfTBcd; + {$ENDIF} + else + Assert(False, SUnknownDataType + ' FieldDesc.DataType=' + IntToStr(Integer(FieldDesc.DataType))); + end; + end; + Write(D4, 4); + if D4 > 0 then begin + if FieldDesc.DataType in [dtBlob, dtMemo{$IFDEF VER10P}, dtWideMemo{$ENDIF}] then begin + // save blob to stream + Piece := Blob.FirstPiece; + + while IntPtr(Piece) <> nil do begin + BufLen := Piece.Used; + + SetLength(BlobBuffer, BufLen); + Marshal.Copy(IntPtr(integer(Piece) + Sizeof(TPieceHeader)), BlobBuffer, 0, BufLen); + WriteArray(BlobBuffer, BufLen); + + Piece := Piece.Next; + end; + end + else + WriteArray(Buffer, D4, Offset); + end; + end; + Next; + end; + finally + FreeGCHandle(Handle); + if TempFields <> nil then begin + Close; + AssignFields(Fields, TempFields); + TempFields.Free; + end; + + Active := OldActive; + if OldActive and (RecordCount > 0) then + RecNo := OldRecNo; + EnableControls; + end; + end; + end; + finally + Dec(FAvoidReload); + end; +end; + +{$IFNDEF D3_CB3} +function TVirtualTable.IsFieldDefsStored: boolean; +begin + Result := FieldDefs.Count > 0; +end; +{$ENDIF} + +procedure TVirtualTable.LoadFromFile(const FileName: string); +var + Stream: TStream; +begin + Stream := TFileStream.Create(FileName, fmOpenRead); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TVirtualTable.SaveToFile(const FileName: string); +var + Stream:TStream; +begin + Stream := TFileStream.Create(FileName, fmCreate); + try + SaveToStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TVirtualTable.SetActive(Value: boolean); +begin + if (csReading in ComponentState) then begin + if not FStreamedActive then + FStreamedActive := Value + end + else + inherited; +end; + +function TVirtualTable.GetFieldDefs: TFieldDefs; +begin + Result := inherited FieldDefs; +end; + +procedure TVirtualTable.SetFieldDefs(Value: TFieldDefs); +begin + inherited FieldDefs := Value; +end; + +initialization + VTOldBehavior := False; + +end. diff --git a/internal/4.10.0.10/1/Source/Win32Timer.pas b/internal/4.10.0.10/1/Source/Win32Timer.pas new file mode 100644 index 0000000..e47fe79 --- /dev/null +++ b/internal/4.10.0.10/1/Source/Win32Timer.pas @@ -0,0 +1,164 @@ + +////////////////////////////////////////////////// +// DB Access Components +// Copyright © 1998-2007 Core Lab. All right reserved. +// SQLMonitor supports +// Created: 17.11.99 +////////////////////////////////////////////////// + +{$IFNDEF CLR} + +{$I Dac.inc} + +unit Win32Timer; +{$ENDIF} + +interface + +uses +{$IFDEF LINUX} + QExtCtrls; +{$ENDIF} +{$IFDEF CLR} + ExtCtrls; +{$ENDIF} +{$IFDEF WIN32} + Classes, Windows, Messages, MemData, DAConsts; +{$ENDIF} + +type +{$IFDEF WIN32} + + TWin32Timer = class(TComponent) + private + FInterval: Cardinal; + FWindowHandle: HWND; + FOnTimer: TNotifyEvent; + FEnabled: Boolean; + procedure UpdateTimer; + procedure SetEnabled(Value: Boolean); + procedure SetInterval(Value: Cardinal); + procedure SetOnTimer(Value: TNotifyEvent); + protected + procedure Timer; dynamic; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Enabled: Boolean read FEnabled write SetEnabled default True; + property Interval: Cardinal read FInterval write SetInterval default 1000; + property OnTimer: TNotifyEvent read FOnTimer write SetOnTimer; + end; +{$ELSE} + TWin32Timer = TTimer; +{$ENDIF} + + +implementation + +{$IFDEF WIN32} +function TimerWndProc(Window: HWND; Message, WParam: Longint; + LParam: Longint): Longint; stdcall; +var + Timer: TWin32Timer; +begin + Result := 1; + Timer := TWin32Timer(GetWindowLong(Window, GWL_USERDATA)); + if Message = WM_TIMER then + try + Timer.Timer; + except + ApplicationHandleException(Timer); + end + else + Result := DefWindowProc(Window, Message, WParam, LParam); +end; + +var + AlerterWindowClass: TWndClass = ( + style: 0; + lpfnWndProc: @TimerWndProc; + cbClsExtra: 0; + cbWndExtra: 0; + hInstance: 0; + hIcon: 0; + hCursor: 0; + hbrBackground: 0; + lpszMenuName: nil; + lpszClassName: 'TOraAlerterWindow'); + +{ TWin32Timer } + +constructor TWin32Timer.Create(AOwner: TComponent); +var + TempClass: TWndClass; + ClassRegistered: Boolean; +begin + inherited Create(AOwner); + FEnabled := True; + FInterval := 1000; + + // allocate timer window + AlerterWindowClass.hInstance := HInstance; + ClassRegistered := GetClassInfo(HInstance, AlerterWindowClass.lpszClassName, + TempClass); + if not ClassRegistered or (TempClass.lpfnWndProc <> @TimerWndProc) then + begin + if ClassRegistered then + Windows.UnregisterClass(AlerterWindowClass.lpszClassName, HInstance); + Windows.RegisterClass(AlerterWindowClass); + end; + FWindowHandle := CreateWindowEx(WS_EX_TOOLWINDOW, AlerterWindowClass.lpszClassName, + '', WS_POPUP {!0}, 0, 0, 0, 0, 0, 0, HInstance, nil); + + // pass Self to window + SetWindowLong(FWindowHandle, GWL_USERDATA, Longint(Self)); +end; + +destructor TWin32Timer.Destroy; +begin + FEnabled := False; + UpdateTimer; + DestroyWindow(FWindowHandle); + inherited Destroy; +end; + +procedure TWin32Timer.UpdateTimer; +begin + KillTimer(FWindowHandle, 1); + if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then + if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then + raise EOutOfResources.Create(SNoTimers); +end; + +procedure TWin32Timer.SetEnabled(Value: Boolean); +begin + if Value <> FEnabled then + begin + FEnabled := Value; + UpdateTimer; + end; +end; + +procedure TWin32Timer.SetInterval(Value: Cardinal); +begin + if Value <> FInterval then + begin + FInterval := Value; + UpdateTimer; + end; +end; + +procedure TWin32Timer.SetOnTimer(Value: TNotifyEvent); +begin + FOnTimer := Value; + UpdateTimer; +end; + +procedure TWin32Timer.Timer; +begin + if Assigned(FOnTimer) then FOnTimer(Self); +end; +{$ENDIF} + +end. diff --git a/internal/4.10.0.10/1/Source/dac.bmk b/internal/4.10.0.10/1/Source/dac.bmk new file mode 100644 index 0000000..21780df --- /dev/null +++ b/internal/4.10.0.10/1/Source/dac.bmk @@ -0,0 +1,216 @@ +# +# This is modified default.bmk +# +# added -I$(INCLUDEPATH) for .pas +# + +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = %VERSION% +# --------------------------------------------------------------------------- +PROJECT = %PROJECT% +OBJFILES = %OBJFILES% +RESFILES = %RESFILES% +MAINSOURCE = %MAINSOURCE% +RESDEPEN = %RESDEPEN% +LIBFILES = %LIBFILES% +IDLFILES = %IDLFILES% +IDLGENFILES = %IDLGENFILES% +LIBRARIES = %LIBRARIES% +PACKAGES = %PACKAGES% +SPARELIBS = %SPARELIBS% +DEFFILE = %DEFFILE% +# --------------------------------------------------------------------------- +PATHCPP = %PATHCPP% +PATHASM = %PATHASM% +PATHPAS = %PATHPAS% +PATHRC = %PATHRC% +DEBUGLIBPATH = %DEBUGLIBPATH% +RELEASELIBPATH = %RELEASELIBPATH% +USERDEFINES = %USERDEFINES% +SYSDEFINES = %SYSDEFINES% +INCLUDEPATH = %INCLUDEPATH% +LIBPATH = %LIBPATH% +WARNINGS= %WARNINGS% +# --------------------------------------------------------------------------- +CFLAG1 = %CFLAG1% +IDLCFLAGS = %IDLCFLAGS% +PFLAGS = %PFLAGS% +RFLAGS = %RFLAGS% +AFLAGS = %AFLAGS% +LFLAGS = %LFLAGS% +# --------------------------------------------------------------------------- +ALLOBJ = %ALLOBJ% +ALLRES = %ALLRES% +ALLLIB = %ALLLIB% +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +!endif +%FILE:.c.cpp.cc:.obj:OBJFILES% +%TARGET%: %DEPENDENCY% + $(BCB)\BIN\$(BCC32) $(CFLAG1) %CFLAG1% %WARNOPTSTR% [-I]%INCLUDEPATH%?$(INCLUDEPATH) [-D]%USERDEFINES%?$(USERDEFINES) -D$(SYSDEFINES) -n$(@D) {$** } + +%END FILE% +%FILE:idl2cpp% +%TOOL% +!if !$d(IDL2CPP) +IDL2CPP = idl2cpp +!endif + +%END TOOL% +!if "$(USERDEFINES)" != "" +DUSERDEFINES = -D$(USERDEFINES:;= -D) +!else +DUSERDEFINES = +!endif +!if "$(SYSDEFINES)" != "" +DSYSDEFINES = -D$(SYSDEFINES:;= -D) +!else +DSYSDEFINES = +!endif +%DEPENDENTS%: %DEPENDENCY% + $(IDL2CPP) $(IDLCFLAGS) %IDLCFLAGS% %IDLROOTDIR% $(DUSERDEFINES) $(DSYSDEFINES) $? + +%END FILE% +%FILE:.asm:.obj:OBJFILES% +%TARGET%: %DEPENDENCY% + $(BCB)\BIN\$(TASM32) $(AFLAGS) %AFLAGS% [-i]%INCLUDEPATH:;= -i%?$(INCLUDEPATH:;= -i) [-d]%USERDEFINES:;= -d%?$(USERDEFINES:;= -d) -d$(SYSDEFINES:;= -d) $**, $@ + +%END FILE% +%FILE:.rc:.res:RESFILES% +%TARGET%: %DEPENDENCY% + $(BCB)\BIN\$(BRCC32) $(RFLAGS) %RFLAGS% [-i]%INCLUDEPATH%?$(INCLUDEPATH) [-d]%USERDEFINES%?$(USERDEFINES) -d$(SYSDEFINES:;= -d) -fo$@ $** + +%END FILE% + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if "$(USERDEFINES)" != "" +AUSERDEFINES = -d$(USERDEFINES:;= -d) +!else +AUSERDEFINES = +!endif + +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +%TOOLS% +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) -L$(LIBPATH) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -U$(LIBPATH) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES);$(DccDef) -O$(INCLUDEPATH) --BCB {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -U$(LIBPATH) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES);$(DccDef) -O$(INCLUDEPATH) --BCB {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES);$(DccDef) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES);$(DccDef) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES);$(DccDef) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES);$(DccDef) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES);$(DccDef) -fo$@ $< diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Dac.CRBatchMove.TCRBatchMove.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ed11210326dd61bb9eaa245bd6ff3a0df1a01be6 GIT binary patch literal 1782 zcmZ?r{l>-s24+A~1BfM{m=VlkU^oDjKf(vWV1+>909C|Ns9$PyPGz=kKqde}8=a^Y!EJPj7#{ zd-?OtQ-}#fngcWhi2nZrnTCc)G6&)wAo>5_zkh#z|NZ&n&-c%NKEMC{;SEXVK-~lO z9ai^TE_FYbWsVsp$RhCY0l5bP{{8*?``6!}-~N323~|quGWT`R>OVbUUO)*=EIgfQTdf+x`;YbjYCZ`Y+@(k6&32xLRt z156uu5-qZpl(|0nOCuBKxFHKd%mF41kU2nrk!YXaIGf~W1ktkc!0fIKrCsYQfZQc} zr(&9eC()iezBaB^fos9a7}ALr ItB-(!0F$}B{r~^~ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Dac.CRBatchMove.TCRBatchMove16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Dac.CRBatchMove.TCRBatchMove16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..226cc6f5bf74d8ceb581a5482bed34fd570aaaa6 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;AK`;whyVk_fddC_8|gt1gbgQw46FdC7%mRc z_^iM8?&Z_To~D=xs1i**Ls z8UF3@ZHRifV;~Hm$^U-;{QL7en#tdv-NmYY_p<4Ke|*2RcLf|lOuk&|ej(Qm&2S(W zsQ%xtUw^-U`ThC*ulFy1ym|yN`ErT-g*4Z?-1jGpOa+#+PsDgqG!s>c;Ca4jaS z!lrG)aP^p>m*NGAM+g8a1~PIMhCsMjLod_MWNB9bP$dv8KQIfb6HH+Zy>r;&1)_`8 G&;tM(F8+c5 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Dac.CRBatchMove.TCRBatchMove32.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Dac.CRBatchMove.TCRBatchMove32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8d143dfda8a08a1f6f717aa67757d726dd6319c5 GIT binary patch literal 3126 zcmeHIOH30{6s>#WT6Zqgm>5}*SPhYd5@V!M7h=MKg-MGa{3I+CgJ=T8FCv1$8mbT@ zu@xi4xKOK8sx4{=mQsF#sai2prkY?<>Hp(tFFYnw+H`6{T=??l<<5QYoqO(iZ|>~a zqs&tzn-b#&JZt8k6^d1`&@gXZNe?*`3iGnGPX+nZDH?1S$H8`)OtAlwf&>|88Sq~| z(5iQD&ayAE?d=hhq=@3UY!>(q&M?Y#d!~jxlQv;uP#7PW8F>$n+ir0Wz2R+Ue$d1Z za^R2wKb=0nkHsPg5e@hvK5y7N8~Wu5{^a5D^PhdwlXG9kemflqA;t$)77IqIKC)y% zEM&p(2~eyC*P zi2u3oi~KcH7s@}@9RUB)(+m9N$inddWdnBu-$Ir>heYUZ%lc)Aqr4mL+jp~|@Y3qy zYwOCiMdB&4fiL%$AqDyHY-iK@{QA7&rnS;3vzhoOzLYF#W9oKz`t4lV?V^&FjU_iW zr7i$IzDVF_QyWva+eZ6!#;X+_Dt%vjwLzV_fbpj&R7sYsjT)6wvc1Q0uer6h{_)8t z)-Ft0?XM&Y@XGkl*Om0O@$mk_hcB9I^al^!RcYE($2v=E44ON}#sP;V6_$CHk#{@jxa6%yTNHpX|{w5xvAmh4Uh9v*0WZ<9tBoD*zuZWLuNw` z+l1r%2v-=BEtv!84F|vd%B2g=m7jbG3R}X=gza2CcibwR>G{1xbXD}ZBkmQ^w@$?i z;t~Z{LU4k>epOjZY=f){j!%MPZrd>@IA#IJISVsmZik%-F6H!MTF?(1;TrE^Rr(zl= z!Qc;t;!LLCVj2`^gPMIg>J=8}o7KnEHKHp-Wg(U5+m&*ZlS^vQQR%3b3|HUI4}}tz zYB?1cgn++^X;fAL6y+3XR91oPgr(0-<006@I&A}0hPNZAWRwe(L*Fi`<)F!-P_)UF zM4+BSQG7WP!%aoAWaYhqBsOSf|Ip`z}tO{BFVT zsbn83VzQj!%jv|c5Q9@ng-fZBk_;+*K;iwwyN~vCy&dtmv_`F6tE$yX>#f)A=@DO;=T|S*I;Ig`9l&mhnVFyGL*9Y71L{_1>ajOI;QVkvqmy0$3`b7=h9jG7Hgr z#uM2M?;pGc7<&u8m>l;JUp#Tj$J_bC4e4M#x4$Cp+S5BW!D&rxS$M}xV$~d7nu^#> m;l;_IZ5;or%e#nQd->+)Q=66t$1M2Ra-UzA_y>=Xzn@RI0P#5h literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Dac.VirtualTable.TVirtualTable32.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Dac.VirtualTable.TVirtualTable32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..294751201ae2f0b3c0e2be1d54eb62976a2ef268 GIT binary patch literal 3126 zcmdT_TW?fV6t3^aXCHm^2WXA@U^F3-1fz*2KJefJ3AR;>BBhp;q^V#f5HAEMt$=_~ z#2Z0N3vKZdN?V?Kzd&i{bmq*p)487e+53#&+IxB!&V;HDeeiV6be}c*d~2`oTWg(H zUaNh)MqIV{ej1;r%Adz-p2P|lejk29ex#$O=FiQ)5UTIDUc~9|y@oXwzQ@1)>-RtW zgJ3QFzGvfwkG6UE2q7IS(Mi~dGoZib|VBE zxh||fbQ{(u4WWJf!Jf{ko8MO&w{&i3OfR@v&Mju0LfXx(+S!D?7Pr$;?6i_AW+G(9 zmyPIsBXZA(Ea)rqx-zSWX7uGLgb3i5IP*B;%;Bzs$GL4H1T%}S3{l9q`LvTuIT?hA zVS}BDm`TNohs@ZL8C|3h;RRip)0G)LG>t@p_?{<1xSo%18_c8>n3iY7tXo)f@~d_( zX=f6Izp7fPu$5Rb;~^uqWT-L(Qb35=YJ5CWX`W+q+p6@)wUb+QvPrD%bj(^+t2e-- zugq2Bmr5m%{y4J09`4%QvA6}63~m-h79@n5Uqc9NaD)(6DndfU6*IPMLJ0MqPD0Fu zMymKh0E)pq&ha={Du;j&rp^q6$dlHEjFV3jJ_!-G(oqT_Sb`9SDnf)8P)-5<@kphW zcv*-_C)TWp5NlXC*_0F_umQKwx*A^|U*>>4s3kJj@my=YmNaDHYI(PqA$%bOWdR{l zQfsgjqHJhZ!4gJO06&nXOef&Ptw$Z9 z3w#<))f?bJM_~E|@T>SKJ0wkIme!k&@TuwYjHaJpiL#*4WT#O}k$;abgeIb>mY6Gq zFoDm75TfaX5ILHD=m;4?85<0oKalAo`Js-m3E$Sa5F+p(ZlSeuCy4(je%Ad|uCgOA zHvl5E#sHTC7EN6qu%aUp{}o@<5(c;oAzl!o>F6DSrY^sRG7e@qUPBq+4^{G$`r$Av zdHGQCQb(faK>R{`{Cr#VOsjgjCDOe&+__sh-l!aHSpM?erNcY!fBw$mXWQ?7`u0NG zTl4#0pWC->rg`hko-Nb6U!MH%rHRHDC*FTyyrFiy?!o&J;QVGcj16_M!INy@1iNwE zy?)f~`^xS8!uj=xbM=sYrNjQ|fc0a$b-B&DwBNkA&-||0IKS68yGK9sk$$>S`{o0! z>piWjzSvo(o!B{E|BV0s_3`;o7cb)3wYv%YtQ^~=d<}kfE*%m49Nd1l9sImG-}=T} e%eL9(SErk{ObLD_iJ#{u8lJ1<$4}&cxA+?paU7EX literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.DataAdapter.MSDataAdapter.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.DataAdapter.MSDataAdapter.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5385e73749ca822d1161b0e2bd49280cb31a734b GIT binary patch literal 822 zcmZ`$O-LJ25Z+?X)kDETz1L$?F!Z8@UZe*Pf;W51L4~G5YY&0}Nlhg!c+^86rxH90 zN))8mUV1Pzq$v@Du4c2FpWRJ1yZe52lg`Vtk0l|GZ-!y!``*mF_j(~bCiPDk{506a zy*-eg^z#zb7a+;(|LI9RX&bD^!DH|oA|DI{2a-GvYJ<#Ren2IJ-_Cx8V&6H|Qm6b* zsGesI!1Ev&N3w;u<}MZJi~WnonXTDD8A=dT!M6E zHu)4cDyYUJqxe3uJ-fYoy#8``@>%R505OR?l8@c5*^SWWacUXQEaE?YAP${?^5g`*LOS6#j_0BY7nD_nS^yg>UHGJ3@3w!eY=$S1o?dlwcF5zfP{6a z;`$xdWX=aB1jFz;Ej}1Av`~CJc@!0VVz=NWiLN3|b}Co4{1-~TWAUwF{VzxFaI-4- zFvIU3hXT&+C6qkmcur?FIfYs^V%CYF3VxRmSd$HGXt0{AT(SFM7uPXO1zS4*N6uF> zJC$@yKKNMPTP-Et7Pl7jpXPJXIoN9$@G@#9!T9?h%6luN#PXlmVt!*j_x_c5x`E&y DkF)vU literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSConnection.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSConnection.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7c71aaca27a314552c8069c1224f1021f30f49d9 GIT binary patch literal 1782 zcmbVMYfMsM7(T7m*3Z`3>Q8I+r$7DbwpHtXou#epqTO>XZwL|yLW-6r6C=4LibzC= zKx$>ACR34+A|(wivztyU)D>Oim|;pU96FuBYSr0$zP;b`KJT;d*>~Bnb96cq_?E-C z2>v<2e@Y-j5Oc5|AO!~>;)6i4;P)p)4hS9u{x?au4$(y}5#a9tyL!;wAGb9qT)S&>OCt-T_;T_U(qn0H-_YA-p*HHA`{JucMRuCMO{#yx+W@FJtaukE`!3j$bF+_yB!7ZX6k}^NcHpyv&}_$Y!^wvJpxay~3=MH){OWYLudCxuB}> zfM=ASmKV2&b0jh?W;=cFX6o+sI1@(LzKYf-23yDVmi9ZXPMh-?QMz$C z*Ik@AC_ULPIQB9(_Gxx>2RHIz+ICy&W(#FqQ{tM`=uJ2o4iX$EqA?_?F3$g=NO>D)K4YJ!7C|xpz?)D2K`X-{qiVF({g}fm>E8yj8@nkf7R&8LIOvIgch`CkW^#p!Wypq9uv| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSConnection16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSConnection16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..82c48bdc9b7757fc64fe4e4b57c6b090aa12a101 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbff2 zR;gitptxBs$l_?a;2MF79kZ2E=lNW`b{ei8t{AQi$bhih))xbjNsEwMuLeXtkX*j+ zdg8>DnO$=Yi+dGvCQe#=1TFRZ^kFU+f68?~*4D??_~uF8aP0~VZ!gQ!3Mg>}ta z^@=%%R?a!NV)mZJ)3(g%Uo)j+Nl*Qpmhx$}g%I_Di%!R01Dk*T3*)lqR=wMR>i_@y zH|6$}oJ(K7KfLkz`sq&>4$Y{Cs`p!RF5%Xnc`v^Dp8mqH^tDO%W}tc?+P`e(&IOY< z&gfY=v1MUr^~}Z+h?6olUR?L>FC4|LI5fAZ_~V?s7n4%&c0^yU4Ln)wzCX*ZG{PO| zWuV7bUAi~(@`I`8uFt!0b@BDPD^6To)K>9*QSrN3*-s}V-fE3FU*&hKz@;L_8yKX( zfCXv+dIS>G5Fah;uKlyD;_Ljv*V8f{_QYLl2t8BgRTCcolm$i{F!~_z2vH0qS5IvI zzpDDzlCn=gS4~d2*AacGHlQ&z1Skbe7{KIV+bIW3Dsc51rgZ?-|6N)6ePQwYnb}V! uB;9HaZ^?`VDgY)tcp`+W-#n{l-ITVK{SAvcD(5y9O{>nCP@3A67Y6`3ZIr$M literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSConnection32.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSConnection32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1067b55c1d82ce2adc3ea0230dd52741e4857805 GIT binary patch literal 3126 zcmcguSx}Q#6ppn{J5!(f)Q7h4RPEFmXF5}7`qXLbXsdwWhM-|9C?b1EOn`*2B`kpi z0)#D)5V8psWke7G4JfNg0K*zKS;D>~Kmr0u5B@QYf5gG*Ofxrk&N=^gzI*@sCHI`) z98Vm^y!o7f`6ztt&EErlhWg(N+lwDz{=ne?`FG@l-%}1n z^8Dng=J%3A5aCD7miS&-5I-Jy_*m>0?zzAG5c3(m0w;Q!H#RbCi%0fpiCepf4YTE` zwQ(%=^U%^O%AU3+Wt|KACujDLu!J?>KiYVa$H1TpAyKP)Z}KkSgjj{D#g?{nU_|`1 zBS~0AU<>gXrMGkMQiYH2G0 z^og>;<9W@F%=<+T8asOi_aa2aU-l_(6gjqa$x!j&l1JX{OH{R%Kd)y^u3wSs>>e(D zBAz}}^6G5<6K+`z3cr^-F**h(25*4^T;x1(Rv5@?9d8cd*VWcUoBZOTVQuJY=f6b1^K zfA{?DnKA;~eEu>?!4pwleJQ7wpIuX&Syjla%x6^OB$u=4QdWW}jVef?@aR!R3B-bU zLOwNuL%|{2z?L*v^Sddu_VD|G{g+JHF=hBn5ds5#lW_-zac661)3Bx2ZLTaB7Bp*` zQSDg&lDcc5r){pYX}Y6+ss7cl%OOwq(Q%tk`C)VzPGnIBf!+1}hXtiN7e-dLK|&yMRR)GNcP#XkA`%jQ{y zOw;}thK1kv&NFQHM&{J|J?%#M@@B?_;g)LcRMYa22XjAjTj=~sguhW*D3j!a1a%-m zNp>|NK^`Ij?X3i4UQ!e{kyIE*$fHIei8RTJI*sX>&eXDHY~M1xX0gcjrF}i@o|avJV(Mh5U-xG zWJ%jpmHi|126ofxMu*X;FdAD7TlI5Gm3_l^o0avgofagYPSh3#FXjf!W?i3R`HZD{ z4AI^D6E3S_&UZ$gdvW_rEAI63u#-)}zY?#VwPb-&)u{*&UGQI@51F&1*E}+F;_9-q?%XWM>7*p&kEc3+_~u zr;~L$T-tDT+g^Rv7_h}@F`EMXIxk$u4PMH-HJ5!ulkwLphUakd)qw=p9_odzXlFUm zp*`XcvX`@UF7QL?fdT|&2#G^sg3Hz#1Gbb&-4fm25Jar;!nB1!{|dqI7zQEY5h0vF zh!~&qs9Y$WP(Y!KLNSGs3WXKQD+*J_ir*2FUJD8O65MKW=t@E00_P?OG0F5EOTntG zgoyRMh{^>QmVh<@ngM7DpfP~<0EH=MCm5xX+hXFT5Wgz~*CK@Pc=|g+#9hCP%0*mg zV@MKTXlbCaf%XQ4`I}8M-H9?vN!z=pgxB-JwcHSk5aSHbktDMa3I49AT*QSo44N@Z zV}`<1WYd8k#*T!vB_esCTc!aw4z5QzcqsNDUy_i~c%X3@(thd&C^4on~@pR|6?IxvSO_#6jYL(JPg~e5atnn#3$~O`uW&2`i#&_O zU!c>U1A0tb4qoQd*sv_5no7&+wDeX(Yc^1QN3WLU-7UD9i{t8fj!g+1yT;o`1J2gN zr-fXm#AiScsDdq2+k)3lK0lpV_pvi_!b?5UdiAn6wk0Iuv^67#6G2Z@gUz)z#e0zK8&RJKX rYgt>ItY(rG_Qm$xlim5p;`{jTH=`R*Z>&#T`}XKc|9V{5qb>gezk@^~ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSDataSource16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSDataSource16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2933844f683c75b455ba51272062de0874a928ee GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbfek zjjRDvJx~OfVu+b=EpTOUE$X!_5QJ<6el{-kKygfs5J5~Sh#_d=Xk1Lw2#Tb5m?r^| zmr0VRX$la5*~uQpKtZf}x38G`|JV0Rdzb(D_VN3t_rG2~`1b7n_h)w#J&m!d-@A0? zg}o~-?_U1z`|Q?g|KGpo_bmVQ7%Q6gCpa9yoI31}6@vaRG@72$Yx>4y6(TRcb>hv{j2xMJie#4NW7pX+f%# z1Sk~>ioJHA;(`=W|6IAzq_I<)w)v~=^~OJ0uh;uCv$MlDS+t65r`-sO#OUq#&6~I1 z`{vEJetA!LM`&Y&F+YRnslT7cLQlfO!2X^myvGZKLOjI(0}GuAja)zP7lMxnmY6-; zyz8e0cecX!5d3n%0b4SCd^p%@0rZa0^2)ZBTj6`i|FAh=;^DW+Rkptf%X}NEmUkwaE_lbiqU< zva@e@I0%PyY>ac)b?AIL!5xa>*t%=#u2ymCRjO7O-c~V}r*H(V-^xS5)AF&xLGCbLYp zsj+5_HY!9b;|TV830*SF1yi|i$cvUI4a>hA`G4OYpLu^iLYBW&7X{c0N z$3>9!GP*>ovRy6^W!We$;fmYw+vS>!ehcJmDvqAGoN~tCBQk>^x|E4-^h6Q~si}=N z#*NY{k(c^j@4z4UEhT=FpdToRXERa96)vNc6AB42qXDB$)zYdsf>kfUa0E+PhKl-n z1b+{(efE!*j*X)^80bF}N)j4!m{6%>8o(z_jWkrI)tFktEtsmT%S(o`(oz5I{I5ra zezHlSA5q8^7Xd$)7HWZL=Q453H!_pCHBW?Q05 z_}m%|OJ65?)lpSiUnA85O5k6@2YG-~iG5W}oL`fM<;k=8=s@Ae!TiLjm9dYOMm|_L zxBt%Y+w%i^Zx8Oxo!*`MG%|nkwOc1%nK|~tjU(Zi!-4)ED%VDM<_b-HN2f27U%xhf zxujhiHhvm16JO}jQ+D(;OrQM3oH%J+?bmmA3xF@Km5ms9rWLRkaFUplDHsC z=Zdi*CHkc@F(7~6pC3Jb@8Y4w3kMd4-uZKI-|aJR-TLfJ@Xz*l&z^WSd;F!@qc6@L K?V$e_{J#J``}dRp literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSMetadata.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSMetadata.bmp new file mode 100644 index 0000000000000000000000000000000000000000..459bb3f4902477c06b23d7fb564fb20ce66b2805 GIT binary patch literal 1782 zcmZ?r{l>-s24+A~1BfM{m=VlkU^oDj_Z5I(utFg5pW#0cF*HCKa5hi`f*=ZrBr(l_ zYebfU3*urx6eE*Bl|U{@h9GN!>&0V&N(}=LVRaI+E;t)vCY%e`h{qhb8hSE-?y>Kd zr`*P}mGMBMG8P38Z`AVrGqEa$809<30IMvfpmsfH=7K;>ai9pqC?JVd79too)5Wk^ zz@Ui_XpT-jm(N6fp!kFx^+4|cNr;*?$L9mNQM2rEnd8u}iT05#unRIhXdXxV&fOt6LYbBA^v;bKt=R3_xHo!o`6MpgI5l{|6fN@6VsVzkdGx z@%7KwkH0^?{q^qU&o@tjCd17EMjSBufLef235-x+w4#{Uc*0>(Hnfgu}$>>i-2{{Q>;@6YeQKY#rB{`t@6_rE{9ftv$V2~5}!_n?^o;X=X( z2Ncn7 zjWui*02&K)43GiTj;tOl8>j|oED+&wKUR$p!QIQICwrP=B3xR4>VJLx`1{klU+-T0 zc=_nt)4N|E-2iHbsE2q2=qaGr;O77R@%_@?6>#+J@ok8DU?>3*Ft~t$2Dc7q{=Z+p z{(k@R`}6x>?_d6S_2~PvyKwU{BjUxfmZ$S-A5Aa5*OzgtHRgIv;N?>H3%Pc11JM{S embHS^Pb<3Dmwu}?`dV$^P3VMAL^kHBCJp;Xdkj5&997fAxkRB z4TX#}6D0aFWtXieWs%j^?}fF@n02?nU~_k!*_rLXp1cj?&M?ka!=1~SbI$#pbMD-G z4(4UA=a!yq%-iv1{(jeRn<3$WJuib^QgB>?OZuZOzz-Ar3cAD_Vf7d^-~O~AsF_8hI{{S(ezH5mwjKw3UJ zdgtJaR|8#^`pm5AjaqIjL|)@gEuWS8_rs2c=apw#4i(5mOp9eX6N(kT5^^7*!7?XG)FnN_uc$s~03 zw}OV8kuVMq?iW5WuvaQi)1QnWp&t}L?Qu> zEJ?B`N{dmd0vc2i3w??5epC?{dZXmyqT#v$h^vPSh--+;sKuuwDGJF50fDL@4gLk= zqeXy^c7djW)`13sHj)yaOkg>G@RN@mmqh_p0K4=rzM+a}aAwZ?f$^~ljSlS&O%JV4 zi%fbtKcIn4sbWS5%v1#_aiWxbtkr4P%82UxsR&5|mi-HysNk4e#aBXfvC3|%^S|;!%M>9sew@K`2 z6rSA>y6YC7R7cy(B5fBVE!GA5*>F=)_|9oh@jfkxjy{=x2jyS>^-un%e6MJBtD>zx literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSQuery.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSQuery.bmp new file mode 100644 index 0000000000000000000000000000000000000000..548552d68659093e2851e2d7997694ef2d059701 GIT binary patch literal 1784 zcmd6mOKcNY6o$>F8#ahlcWhX6S5yiSLV^}li3){>SRfVzAp%i~74xcqD2TTp7$hEn z(C`$YQ6NAF4hVrvOxmgvkC;FdW`g68kg*+m{2b5o-m&?|7mY>>N9ao!}?3gjxbltDBJ|o-a!O8j4UU);OOcX#sL zKK?OuhY#H00v!<6xvtw>pdKQOiiI`9{Wi?Z8KS*jg27C}CfOv(#Pw867b9BYoy8Fak`+I2QZZEs$%DNUIi{hRx{Cc&$=OU6 z=n28%BqQJuSkA=ZPKyl6Lw)GdIA30>|&nZyDBs%t^Q8tqWK$SRA_^oYQ1JuUmC1P|yPYPUD`})OYAAMhNXR5NPNJK`X zQfL&~%l+enDHNGZgc)k-sqe)o&j&i(D}HiviUnFQiB*rGIqP}V)kgE_$eSRQb4hX7 zdIh-@L)Bidz)AbPqTI=`a|?!U8mg(Wl5!-Up-SG{UIROg{=F1aDeZfD5!2P@=7Y0i z?J_5)h|4rVD-f$HTYZ5xsz}dzd_NqRg53JfO%RKHPcGotdshD9IQ+kN zQI&Nh6il-)i~i%QQ6pjJ`H5fmLSwCmV=V`x&HIE)yGGCN9QkAGaD!*)MD^g&%255< zkhd~?(j7jtCEVZ{@UH8xTh{BD7pyLOUiG7041?&sSS6ia-%~a7zu;KbTI(%eSM~~*Enn~8 z>vYY~@#;ZuW#~}F!2VU-?iKyD<$c>1z1q6)rDy&N_uSxbWjzjGc47aAz~y=mljWoh literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSQuery16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSQuery16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1ea161bd4ab26a166d6e9cab46be7072f4464fc7 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbfek zjjRDvJx~OfVu+bQ*^NtPL6iX*aCWk%DH;N*-@R=5rM)Yz>|OQp+9?paeg?__bDy6- z^z7V$XJ__3JF^$47oz^(zdt}Ne}8=Y^X>ER&+mVIc=hZ3>u0ymtJE;0&UgR$_Sx5m z*MVB#>Vb+u>VN-&Fo5LmPj7+hfqH*`eDmwwi*Ju_0&Rh-|Ns9#P|d%;fB*gd{rBg0 zpe=vCegvwIo8wTmCIP7B$IFK=E*^%fhZqad1!P~|zxvPjuR!(F_cj5YwDfTQ?~iX^ z-#DA*YYA~bL?w^}fq#Gg{rUax_b;G&ppUB7CIPiz-Y>0wJ|+A4>fSf|SN6@1jO^8p=+T-vH|E*K>F2V{ zf$G0+o$~+K(*Nhyf=D3RJLmu2DG#R?KUviLa_ihzyB59JKJUrO?wcJ6mx`QW<^!$3 bV$1s}$TN-Zhcw8h$#h+yfq zr66Ei#3BSQ1$v>Sgtkbqx9zrtc6WBW+r8iCK4)hA&dhdLX4BZl#3#4^PR}`e&iDQQ z_y7NyH{X8wahv|xfakOLKArnMVtWcBo9$8j{^VoES6{#*Ys>xzW~;U}_BNPA7-I!f zJPphL)!erB!D{#hf=Rb_K+8@O9|Qbk0W?Ce99h?NHGBj4Uy1`yfK%GM)AGFB(Pr>s z0Nb_s#r2vQqv5Cb?hOyMA!F*fGw8W<-5BG^{5inf?q_cI!JPfw%vdio3cKcpja=33 ziu)F<$1pf!;`epgrv`q?H&x_Ro+VsbVUtQGA*Z8CG9o2{QY;`v{n#mnJVMYd1YEp- zfnU1EFU@hDS&o_E+z!q)1qus(RwbHBR3fX2jN_^#fPx4a#h^&Xl~hzthUGXYma#z! zF9{)!6!MB;YC^yb7LIXpjDvGeBM>XTrs))lX5vdc5oid6O_5AONyp?=L`sIFc#z^p zd{WdWC&KzVs3T&~L!+P+Gllp#l5d(Usgjt#VvK766fwN$zNW9r$*N z9}<=qIhqKkd!#@g5Kse9NL-HJS*E8Ht#=aglII z8Vj4mib=7x={cH+h#yUD(ckJn2=GA^Pzg<^mn#u@BC==-*I$FQt}sRF(I9*}9`hJc zblyCIHpK1mPx!Q0L7)qjQ%R#u4GPXbf48*j9ca>Wy_WVMt*$hjr-j=06?7}ax9DJm zV_C#hLq|xw*D?CXL?_VTbJxiC!_MFA12ve!CKra*=)XZ>$dprQrRnC!dQ?Sh8LTrf z&1cuGqsR;Hz(W5E^j}$^iKar)S|W;`2*EMbjVMr8Ovu?XSPPX9g*z~fM4)b^n4cNz zv*>S;VpV-;M@ZPLN*qlwSd665n=nc5*hC0d6W$RP{1tcUe;m)B>SJ22Mn~Y@poz#` z;JM`Lw*;;Zdi%+-;Ck^5jaHgYe?jO?N8b@>>fCE6F5?b|K5^jp=ldW2xe*pR-w--i zAMC0NbkqdSR{Kv?`A$|Ywe9!X_cF)Jm}4cbBOfg`?ppZfgZp1^pRav?uKK;%gIk>k zwm2#_JN9jw-uuSnryD2AUYjU=b-ZN5c+rFRBf!;xHW=w|C4DWVx0zf!u3SB)^n9oM z{;mA$Vfk`{bg5ptP$zcRi07-ta|eaa1Hz9L{Mr5d>3!U(&$yFi?1@j<){oiN;*7nB zZQeaz{DS%ZHSyK{RyBv;M6Nu9FJG*eezD+x!JjGTPk+t>zkQF6Uy^AlX6;28;1@lF z|3IJ4L(pgWOtt@qDqnl0udN*Vc$)SwN1@N|#lyNjhqlkxK%aMKtF}2Sx6D+$HC?`G ZO4nzS>hsD($xHeAn1TF1uqa@&{SC6W#hw5F literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSSQL.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSSQL.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4c58d5d2d5707b45ca86aa2d833ee962894109ea GIT binary patch literal 1782 zcmZ?r{l>-s24+A~1BfM{m=VlkU^oDk2P=XS{~7)R5kmtIgBWl&Py~YD;>0j8&4KGe zmVyi7Vn7rllR%X~E=h(UYk}(})dYwOk#)h@5HsOiTz(m%;DC7&eIKXz`! zZdCsA{m~bZ%>lWmYR)EPbAarWd2dt;KS`v1l*sv*GXFK2ERb8U>TuM>FA(>@{B^H< z&PGg?O8K9}(>_Y%eUvQwn7RnvsG_w;LeGDh^6YEZqpv3W-!UwG&M^CK)x0fma}J(= z;yB@pN&RPq>`xNuAam5}KKM*~+qD(NgN<8Gv_Ad4<@4_yUw+Sf`K$EiH@}1LCa&EF zHwVb5UHjUw`m=22CyC6Dl7$~7D?TF2LfC6gUf%uU&5ffa>8q=bU08ke{MOT#j$OKO>-JqVbC&LZ z28=9;?2nSgAEl~4NjH5mne+io4UycG*{{9(-g-}Z3k)2enQwjOy{+5yl1RNnQ5gWa Ctyf$C literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSSQL16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSSQL16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f3edcd7dba1c946845f7ad1debb5062c3475e98f GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbfek zjjRDvJx~OfVu+b=EpTP{wIEvuWCzW8yYJj%G(kMvrcEz(yFcR6vV7n5#EC02yXG3^ z_bOyeoV4}`&?wjGAMIMdVAbL_X=nVc{|n#z2*3D^X~lEvzAZrYv-UoBneoNE{xhZ) z-vuY*Z~R&C>RZ^kFU+f68?~*4I5lG4TZi5+MwRGV0v4QzgQ!3Mg>}ta^@=$V^_xyS z)o=N%QS?c_1Vu~WqSLY0z~-O-!no|YRqr;4dLZdG<-KbDC#9lK21vH}EjgEP>(9Iw zUwu!1VOaXwq|O2WuKHA jKIwIRgp1>107F%==95z0C#B|3O6{NAroG3d5|=mtOo@|x literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSSQL32.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSSQL32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9259b697ca719655fd970adfc3262d011715ab41 GIT binary patch literal 3126 zcmeH``%@EF6vqSD@rU*g=uc!5A4A8{K7O#BT8A06^cVZEGwn=&aHe$X3=dNYBorTj zK%qeh*0v(TW+Vv+Ob{J0t%0Hto(Yah2#+LE8Yu5#l5-aqAB?@(jkh~7Q9?WY$(_4* zzW1JUKj-YZXLo(L{S^`SY{zpPeyPA4C3+Pr`~>X$f}bCY9{&$RbX-)@QcMD2jd$=8 z&-@TtiQDQ$I6hAx;Z_d}@+5pLuqg=0e?riah?e2_Jo#T12WP_bgJ!ZHQK})G`8mDSAlHP-EgM=WWVL+R8cQlGir3qZMrd3(cGS0*_fuT&QNQW<%V3ni8l2Q zIDY4`>Ml<~Cs+q3B8_tGw&QejXKr&}QP*&#V_N0%e9^b?X4BY~O6%?)jEXZCY{O2> z#AHP~oA&FHdEn28LgdgF5<92U?cTCUq+7UGFwT5p^~V0P7*jX9Uhm#?&aP=N^1w44 z^KujWRRd$b6+wukGX36GU#iVlI>`w6(e<-YTK9U5Gv}0^Bz&NW`Lf~OXEf?qb%?|h z+C64ZlHI4~`1#{#AD2JoM{C_LX`FHuP53(V%>LS?k1LjT7BiaG8M6NjkyxsGzsH+m z59FUe&Jcc-Zem@PD@|1;JT9yE>@8>FRm>YlQKjkmA-+CYo8adIpFgR8R2{C*L=5f9 zC^;wO8!b~G{KULhgtlcN$w4@K^*JF9{8*pR?M;2c$NBU3%kkZquPoCF`B-N*{Pk`D z+M)m|6~u=?d44{~LAXphZ4mNt{`>m9vBt${F8_73^JzZr)%fq>wG0p^`}vdtlC=v$ zrckF;G;#dE{rdTV`<=u66GJ=YrPV@zUKcjaZ9W9CDI8x3)KN&T2^~UKbqU`usgHo~ z?;o6hdYO*!RmS<zP}YI>5Pn~u=LNf=h z5wow$|NJYm%>ilzBBzQ45C(bX zzPP^3aJsJ!awq}KAtob3jhb2cWKQLk&eXZlw#bG6T?I4;6Tw}J%zzkmwy$7uhA)~S U$jXRe1GNLgib6whS;W8q01lEa)c^nh literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSStoredProc16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSStoredProc16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..147386cfd146b64dee8df9cb0916f2b9cc78154e GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbff8 zcBx&8jNsyMm2kZf22gR=y$_*>o>^^q2xP<6qbY-EhnTD{qKY4^-weRCqaI@E%*-IHw&N0{srqN9_7xb414+2;5Wm1lxHymj zR5mBla&M-?R8Mud7NAPZNP#F`niF`nFZ*tH%9%3X>Au0p*3bAs8$GB>pq}rvqYWVCde}3AYHy28sZ= zKoWwGW#P(*XW%j)VglScGy`2~m*PTbD&gh>89*sC10h~O(*ooI4X?faHtFOG-+fQ) zw?8u6a9?HBUCAZ4f#PV2ahVS>8CT!{&6)Vw%oqtCteKC#*MP;dQxtmXraf*S&4!?_SPoC{Y2 zWB|=s`1;4(mtTADe=NQHCgR95k3EmAwm!r(A6XaiY@j(4U;F}EG3UjX?t34KF1`*u z^vr$tV=9_o_3-zUmq07N&wBo)Mckd= z_;O{}izO{j=hr@(QG9460#L7Un;?CUq mrMW?vhGW%8ydcC1U~~gxgzAPvoB=czn4)N8IDVfpFaQA5p_23f literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSTable.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSTable.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4e54b702d4c1d8a4994a3392d0439a4f59cda792 GIT binary patch literal 1784 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSUpdateSQL.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSUpdateSQL.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2097e6dc74e970ce809d65017d21b8d24a17e225 GIT binary patch literal 1784 zcmd6m$xjne7{Keri#JdH3Eo{u^kAYFJmAF>iNP2UEI|-KL_k>zvImhufuIl|h=i@I zMp8jM3j_*IOG|gU(Y>?JYyBQWCQTcR988?~-pe=decvzNHn%gF^RnaTI_#HWT{>Ck zjy0KV9qun)5ZAFGY;kyN@Ggp|!!C++{x?c0NAgO%k`7N(MB~IAEaCG^kVF^B_pAgl zLhw?L_KPCvB2)a#zI*KtBBi-9rV{9g?#JTR(x`5ILAO4y`wlXvTbm=+)F5z9tj-dv zGsHKLX+i@s^-D8FXeNQ5$l2D6i^7NfT*%7>Je<$T9@!a>m2sKjini}lRvl^Cqs&_J zU?*zaiW)WnmBc{|CD2i@=c56MDJqQHia8D=W!KYIf->)sCT;X!n>1`fR7o7kSBQrA zNPrLd_@IaNyV#>c#%qIH#%WsaYo70Jm}sjStb493f6`L)FqMNi2C+2Q3shKQiVEv> zV2<0o+}pI=+pO-Y`_xkLq2}59vRo+CY4IRBDv%)|667O3E_B2NT&(X9b37I(6mw{# z?Rv^aP?kN?tc98AAUi~p zh>Gwe6v_{Ug5JR`d*om}fHL>LdD>B$P1*F6!uRNm4i*!HU$h-0{I5@TOW}Me>tz!u1WrMuB3r+9j#?~A|W0qdbt0F`D XGJWSHubZ3sX&VW7NrC+jicIz!9k8zK literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSUpdateSQL16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSUpdateSQL16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..17e11919b81108432414e3f975c0f474e9ce4977 GIT binary patch literal 822 zcma)&Jxjx25XU2a0Y^WAU%;wsHwBlDuAS6LGIr^ZG2jvqq@xiLGdOgTh%Zp2lvJu! z94fv*p0+5DP;J`0`cE!>s7k@hyPBDn63ZaY;hstFDQPyzOKF{6C>D!F z3D?L-Ba)BOKc0d?mNb>e^?1Wy9+^on%|!KhZ3d>Hy@2?l+?-}8Fh{pb$gY-Ak!vH$w;_0;@qHP9k>lw#g< zNg%qsi#X^!A8l`uV~gOUC_*(1g3$AVp+j4c!InYy#j#u1!s_ROM+r_{q|pL_EyH&k z^YLNq`cm*jBE}Z_q32=?c$`IiPrFeOJk1140ue2U*y1NG*wVha5A%5XG)GMD@@KZd5PTGSit{x%34&>Bg=>*+$=?=7M0c5 hjY90Y9F=58%UkP<;M2*Iwy0}d$+1EfPCQ!vZ{G(e?27;Z literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSUpdateSQL32.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSAccess.TMSUpdateSQL32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..de7b8a372566220c54304142bf38406633a9de9d GIT binary patch literal 3128 zcmeHI*-urgvOMX#pS^+HU`R0VVFDn49vnTcfaS3zjMwoo!-erh>1_meD~(ubMN_m=llJ> z?>n!)_Wa{E_S=U0)3~0>U60tF#K>lQ6z`vSj9+X5x2!GuADGQ<>l*3IJHi+;yP(we7Inhc5JUzZk$O zc0RjR%g4y~>HX_>54GR;qv!6gp1Z&BG48^j)b^ut|z0~`l=R(iy%Hw zSAB9sP(p4w=#m3V)P;9J6y`)>Ms!aj5G%fEG8ej;$5$morXd)aq>)bOshE~rQ`aME zJWTP|{K~3V347#_TMD`)KX-u;;9|BIA4>|&)KsD>g)@Att*>c`2*zqOsK7!z;dFiL{o?YmLwvlSrk+VJsE=we4xcb!+jk?U$qW) ze>Biq-*dR?SY5gO?Y+(AyD9$7B7We2`XDADSPqtQE+B*~8WLP2sn)5umW)#TczD>^ z0T)-Pi6)o48@ZH06nZA9r{ff#2|?2-8gv}k_i@FZwC}zgbklV8FS&17 z_g{dY#qum6reT-{je-iH$_7hUUJ>{}Pa$2Y))3-YZP_Q4Z^~hT8gePHT#Sz;g_cFS znp6mjaUn2?C^V`yDk4I~tu0g5e3T`YPAF;%|JMD(0e*-AETQOFx*CdPD3m3JpD39> z0T=qlKjG74g#$)ZjwO>8H7z>eBb`d+4_HELvfx{I;Ne&%@o3VD5E(viO|);YDrkWa zXiYSoA|7-<3w{wlxd~2Fj-`#FqxiJwk_PR5aRf5d)2h+#7gVF@8@|osGodL_G?xsW z2_XZYFd9X%sx2sy101&R(V z;iN0v|LS*Lu*hI%(S*)~!2;Cuu)8SjS~V@_kV z&lovr+&H0MKdxWoiKZLLS*slIy!9OgWYmm-$Eq0De3@b;6h6r_$BU_&K_N(E)z; m%(uKg*R*T4amRGS_9@2CJ<87ulQqv3@{ZtVHs|hA=jL=w(?Fc_0~Ts3wcdH;c3V2#p7ZjYbDsC%z3065#wM@q zXKnt%A+li{-5UEg8H?2m`^mm&YziT`;9uyD2#7;Opx5_8{`aA?m|OJXP6UaW5tK09 z$%Hal>xiM}9h%&?eMw@)qec~JFf&u=+?^ayCC_BabZWkKX+3}X_mK`KOJvKDd_+D- zz~sntTf_Tx-5J&msbeK?)alp0z-nB)R@O>8cqfgDN?MTBq|C6aO6QjIEI<6-&$H_7 zsdziR>z$k~IFMPBf;71@^1&#>r_P=xa6gw9+^LMmN_<0#eZVKM;9&F%e-P)kXwpq9 z68lQF+3EAn!II9T@IH7kfvn(SpRC$c(16e7(m*7B+@{O6t~D(DESgvj>sdP7Jbzo% z>BT3g=#ccwDyM(jrf=^m{cke`Rv2~42HXCg%L*wnk zW4)$vYGe%3BZOpBWq(W+6-z^+ixiVV0xcj)tZUP`W!@oFm^ip9wuU-aW8hR9FgGZy z`YYfhu0B>V$dL>NfCv+)W960@nI+l{^Ja8&@HsA`*iF{(a&4B};N9n< zSRGYP-jHhID#!pXd5WiDf?cWSv`vPVYcpjO?L(hA+ydMMy^hGkRwIW`#(kdlKzzqk z5SQS0k02S`KJ)-^=m+Qu)KN^UP@G7Ro74JcJa9#BfdibH_y%Igf^GyK=uGHO=u)Nw z@CZI}sbT1zYTCbyKnShU1Ig~6!FXgH;r=Wjz}tc9p;wp$#+qsg~mC$7$EU)hHD+G9D(L#*Vf5+q-;9{AMWfrZvO|RGizsfnn)p;Qmua4 zy34&ITZ~8KPi!Q-x1GS%bX8Am8zB;7FprFUZ4AJPZ42;Nyel(aXfWQQmeX|3>%?NR z(vhT?1CrQfXLHFQo+?NFw|_ixJ*J7(0~oHt`0CJ#fwLlggjgR|F@Tlp0IBu6Khz&P Cd?OnG literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSDump.TMSDump16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSDump.TMSDump16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..57c805c65f926d050fd7d4943e647c7fa3c308b9 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbfek zjjRDvJx~O$xO>NG!`dYflsS7l#7wvrxH7nwa{FD1k{3Gef{cegC;(pGW|wgi228!znypeAp}AE3lS%t)M?s= zhVbhJD%P8HRAVL(R$oeCFBUVh4W(IumW7j@>G)meJo zuzo8<3gT;^_kn=`R}5qTt?=A_&t>}q&)tvB7hj#R?JQgt9JoepsCve-H*kiBFW}F0ChgBs+FnjGK(*;)y7GBkveaU3m OEzK#Xd}bcTr5*sj`F3Xj literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSDump.TMSDump32.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSDump.TMSDump32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1b64aa6ec9361620f2ce506ff31c600fc554c041 GIT binary patch literal 3126 zcmcgtZA@EL7`{eL_QMfP{9&RQV~ZOj7+3_<4F+MLFuQ?EhKMnSed*#K;|Mb|PCyo6 zi$cps3x#$J7z_%mWrfU*3bwtyw7sl=K%ta&Wn&v17H!MtWWMyW!?n=sl^-_Gy?M?# z@B5r{-`n@Ou?Hhwz&yVQxCg?ub>(^ndj%N$VEy2W)J08T*c0r@{{SotyZCcH+6Xwz zz!2^f=&LA_N7lLGZ*KWK$c>d&ABssd1@}# z;)=(oH(#5=Y9DM8oAZQCbbV?UbcZFhuh*IB!<14fhn&e8b5_}BaxG5K_iM3Z)pwt* z7|kfCMfxCxvVfx@#nBLA(uMD#NFb^F)}$WyQ~l-hBmJ)mYUq*w$`yKfJ0Xd_ur(yd z4+VcLlqdC|^FP(UynO!5qIwj@Ow@*sg6ml)MVw<5iP0Cf?ELn*pzk(ODW6o{NFv?Y zp89-m_2@U-v1NVJ*QHmPWvSKTw%laio2SIdH?>lji8%i<=%d6>FWo}=p7-nUYkB0U zzbT`bmHwC2AJui1A;FOB&4>d@uU5RTcb_vm#gj8xW@nVr@qFVXc4-_dAIT_bphs?u zpQ!6RVsKv^cQ-ob1ovmZ7;x?Ba`<0+@KV)ij##!aO?uY(HbUz9t84DDW^qZoxTJr) z^y~am^B;?q<8G0(gC4mt-bxP12F>lZhl(i|J~OX&%`5EF@==?V>{sfS`}b{uCR(6= zr$imhRR$KSDEJquJixbcH30>xph9IZPrZYy3gqFtcxtbcXie5ua!{h`Y3R~Py0mi5 zZIxlLf7lFR2Smi4n%@p-od6EuIzYG*DQNy&A%u%V&K@!>`2VDOwUm7Q@=$!0A*cxV z+QQc`T&PROAAU|wG2MTvgu^YXm1m=g zVouBYj^7-E4=6K|8-`HIe7&Yt$T9-DBbcW;(@e75 z1@uqh_wy$f7?5q5eM6v6klQ#n?!~o?gg2NH%h|d_T7A#EjmAvNA~SXu@X8yB_}s@GO2L~J-QytrR#4dtm~8i&BIz=8ydewOv2!giOF rvDaj(wuuwfLZh?VJ4@o?w%{ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSLoader.TMSLoader.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSLoader.TMSLoader.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5d92dea07563006c8be8b42a2c6a82cdf339bf6e GIT binary patch literal 1782 zcmb7?TTIhX7{_ajCO#M+)i>jlzNx`WqVYkEVI)Q$G~O~VKq4Bvpg|PHAc`795ibmI z62!4?V|YbncAZ3EXcWdS=w#{)2<_O|gst1!($=pOn;9{(<(!lM`M&f0`v1<^x=qoU z$oOvstczgIo0!wa6@s)(zGh8&-Y_?shFC8p%yzl3x+afOqx zO$w4&BG)EMkQ^pf$y#E{Te+84A6z${y(!SVIHZ1_U5go7I_1>VMP+kG7T$Z)8!RK4 z)$QR~b>4;Ltwzi`b%Jy~y=uJu!^--Mi4^kz4RLbihQcoavzvkC8CCfSA^tO0_Z3?r^5w^z1eQ4>#q#vjm6>VF_A6GxfGq^2FB;!DF*48=iGSb) zn;=-j(dO@j$=Zc$RRS*v0`D|yg)x?+C^|Ai{|v-JWIRa3{rxoQjSqT&COgMn9^?BS zgSES%-S+&w!|HHD%7j(`p&QpZa2+pj4zr=#g2LKk(b>!>1RXd^6W_t7%$ZbxA5OF* zbm2N-jOXb%7aQfNQFb)Qj0EXnAL}284*h`ECM}nP7+PUBqb^+hG~h%(xXzC0dvHDY z0auWs13%#QpyZ?5R&BbjtlF@oXwKq-88QTf3GPSq!-0R%7{{?=ah{Hj#Ue~B#Ec9x zAwNA#WTdT-sybcP<67m~k_AgI&i<2A^~sFdFg@6S?!c8D*Vrw3r$w~XV;1j?`RSAH z`HRQh)`jg;rykL4S5~h}@LP@i09?l6}toTb6b@+qIU; zE00bT8&3d1ZMvGs2{e@Y4Oa>6W%5DMz=Ohp%A9Yd8J$|hp KbY=bL|MLqaDRb!n literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSLoader.TMSLoader16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSLoader.TMSLoader16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3bb672b744c21065b4aca609e3dfd6ce8575ac2c GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbff8 zUcT>o;?xxx{c{Y9dlhmfPFi~et_DpPgzGkGXZ)@I3*Y<*zxa)5#dGVvEfDo^#SjKu z(09Sf_#1x~y!sY)?hEs(*G6q?Ay(re1D2kMgQ!3Mg>}ta^@=&TR6@i9m!FQk1~&iv z7sh4Jt$MfNSMRs-Y{IQS^Im-QJ^h7Y>1&hj&G^-)Z@bX_{{Pw^|GVD*kG%UocEzC- z5A!4-@-j*CG)(~_Fgw}97$^udYSpECGcP}wdhYtX3s)Ckzq{hZ#qBGm{{Qv;(%$8N zzJ2`u>HV*l557IS|NYtBL{DR^R_|Rp^TOU0mv=A!_x;P2Ju5EkSp{VOc<~Tu5mxoP zmrwow_wV^V%YXg&@%P*3UmsrneD~_-nhd1$_2=h%^g-zRpA?o+9o%8S4&l^WK{Q3Uv&*%5wUcLD9@$HZI z?=k~SAqs$sfsCAmArS7%m0gb)G(MSIb9ZLh&8Y=9Iuowc2W>7knN?{DR0%}O56pt7 mgpjY+^gUnP@OXCR{V92Ox)QH9gj}ugK9^^AEF0k-Wc2`Hnxvlq literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSLoader.TMSLoader32.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSLoader.TMSLoader32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e40ca2a767988f1abc667ee018c80ae9af2247ec GIT binary patch literal 3126 zcmchXdrVVj6u?0=TQ>jjzwNKZY+0t8F`H4;CCfIA4m%fhYOS?z9WVq>x|=YBoseBb?j z=R4=zuKFf1UD=R-<&NNP zk9yb;z5hjgmK-xVsy1cRNAqV%t%*Y8>jGWgxhtGk;xbc9glpQ}do`Z3VSbUpw<#Py z@Mj5)b82;&rvz~UIh#}Yb!$4G$6sXdNBD_#tNd6Ng zke~4+fj+DBQd~gJ=3VEdYdesPfB6tUTi-C>2>hI~I?gL`nR_c5qWKX2rXJ*-7U!&R z{IdnR>~djTK+fj$3yop^Onn*tOnq(8KS=^zCjXW4v%lsh)Hjl!C_d9a5dWc9%TMOz zCaCYesQ#acpUIE$O@Z!crId5!xXfR~cQQ3Tff;S_VfTYXdyxDKC2t^j`8fJhAF|<= z`JA{pE+A(!|7Kf{73-cPyAZM?_#b)bCVB@5QS&``<+h|IZQZh+yyVoBr8{{`cBU+6 zWZkkKdCA~smZBte-7*ly!&_Q%p;Fw{-_SqOVz8*}o=#s7L^S7am0bSrb12&<}l;-$&hUvvl>y8E;ymz!CRp< zn&boehR!~*s$10BDQfMw*48b5q<%CoJTyAS-d8E9pedRnX|+NEKX4Eg^xp0p z5_ItNffKT%5{GjlVKykPhSMkwSjRDoA&oZ^KX5vGm8q-B8SsJN(@4U8bfzx}x5 zi9*&^Q+O@oQ2h^$_b(3)^|tr6a`>%crhhbYrhk}&D5emgYn4p5K+_JWq%ilYL|XaP z9{J@{bvrivwrJ_`c}sHVeSYTM-L>mW|H$o9-y0bj=8#!aA-Vuv17yfHLx)UGo6i^YyD`6$KoHzBg*i=d1pG^IP%%wMeVJKyW=c|Q5gnft=bP#ZCxwTNl|LIw z_vlV;*B5^`n7?_raI^NvdhM^g!Q8b^vsU-*U)h_U+_!HjL*gSKeo;0m%njD&_%CI8Yxn!B(xjzHnw%7M)*8)$&(s;8 NsxzMVe>9Mz{{sN8E0F*I literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp new file mode 100644 index 0000000000000000000000000000000000000000..edce1aa5f082587fd27cb01beb398d162efbeed4 GIT binary patch literal 1782 zcmd6m+f!0&7{*uAOf&rl`?{urvAdY{ee-A<^0zBcdznAn zIk(gmUa|%kg-;@hw?euLHwjLsSu=}r0rk2LP;5Z?)oD)wb%rr|n(i%58kFq4e`@!? zf*o!Z-`aW6^D#289375EJ#&$(6M<`)XrJ+W-Z)zrmSFH<|`e0vg!zqQl>mo z9E_n7hs1mT6YjcKxT}jW>X`D-L;1l6CHqH;5(jbAPH|cSX&)ILgQg8cqP}g(iKxlKG?@ zPzN5!_Kg(L2E}`%>9iGg@_3`UZqa$_Q*$9^%m3KOd*6`z#>j!0ztm<-XjnK3W-dSA zlO+vHX|jxcq;ZAlaTq_hN&q$g6@|xFhoh#n5MLU^hoegAfI7|o<`+dp^|mxDw@W{_ ziWi;2dAk5Rmp6;@Lgs9UZ(2vh$9k%a$0yHZP`y;$*Jg>jik90XfLegA?1C^pbBHe+ zW{EwbUY7a0us{1hJWOA-)-XZ00f4SoxufoK&ip zs)2K>-O}qc-)OGCW~+6h)t61`4ujHFBX_Fd&muzQ1*T%2Ud*W$uvNTts`uB_UjQ+q BFpvNM literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c6f0e50eaf9f4e32114fe6d2e289c717e21eb63d GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbfek zjjRDvJx~N9xP0IB#EC02yXG3^_bOyeoV4}`#7wvr2m>zYHfd-4t^W(({0P7JjcLVm ztKQAX7Gbh|7o3d0@n^xSZ(--YFt2)T*t{B9&Ek%#88x}Rg^A5+VO6m{K&gNQC*mOL z&wpWE^VYCwC9--TdtP(t;G)y9*TCkV|H8QJxpDhip!nKJEz5iA7POVm zsxO#QnblvM+>smGoEBc280fqBXu{3k^Im-QJ^h7Y>1&hjO+fV>bK15{kov={mkqalT#n{ z#@}v>xLO}{uF~gJiQC?u{0Zwf&pL8*-i51+uiss9;v!J}_W2WkEH3#xFaOQ-%x4pl z?{~%AXbHVk>wmV~>v)lCeNqrm4KmohaLVtcWnUK*eVCo|YHIr9zJxpNkyjgnFI4%S zF7;?i3qw{6Wba)v{qKs(pG!)=%rAU5Gwb=}l!x7Mw_3t4*9V@h^lr*{zr4v&7?jAFn>spcm(Qxh#!ni z%Wn;F+GoW>E801`$Y{TG*ZPD0**D7B6Viz=)$P$qGkMF$^aJNt5VL4cX!*>=Kv0gVgubTaIaFl0=%%5?%_lYF4Ew@QjB>;2L0kNRzTki_ zuD<~KDKZ@?_`%?=uA;44+#=`eiqcfstWqvR7#G5e^vei6#|`>9rs`L!KAhio#CD?7 zdIUfJG0gl)eZo}DODa!`DQ1S}(gV{jd9eac5%Y1X>$tv)FVc7MeFgP%6f?6WTI#V4 zvfRd!Y`rL>t{@f5<5crlimZf+^w`oAhBP@+%nC1xzYO^iL&`VipFO@-Ix~`9J3Qj^}uf zWqKLY&$8>fcm|HfodX81oHSC}UTut}K@`UX(^Y zmxV8gk;RNKc)B3)i6CH-@AoLjXEevRN6fs{TH7(udvDrw+p_qFX}53Eaevr;!)R{q z9UggXqUyJ)O5SSO>$NPqhWVyCepMNZgP?;2fOsYj#VvxsVk$3SBG(sLWP1A7#U$&e)+1h9?+*2@(KtR-PM>kxwV6yFb(Q}%fy zvN)3+;Z0R@kGpHjb{bN)^c=_%0)bega>7|NmP&zj#4`!X5@KC=kpMxkHfEg5iS%>V zq|V%_tJrN!+o@04)I*lQf@Q;)P)+~>SigjF0@esb*i#X(Mj((yF0l3<%ktt!`BT;0 z<9oV_z2@}Y#?)=F&~X67Mol6rCulll46=ZxE2UXv2OtWArt@*uJOo0(2z1w^&h*q* zIh)h>n$mU}Qn&S77i$byBa7Ec)Yqu#qi2$D7G zYaB!gVm)0LXc7d75<;nJ?(xHB_50SWcP*JtLk2vB3xunj{%JZK1m4%u2v^gAMSfsO zVz|2|b*9gt0e!+^zZopjaEk*FH7o=IIs*C{v8FEqYbYo5f<@&dVbiE;?s0z$)@M-n zHmM#oD0}n@`19(nE9=B$?P~EYW%2b&;nlJN_%CY`=hPQxXoYDt`CN4_Tb0eM%#15b Qy&~h#-8KK8`D6zE2Iqo;wEzGB literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSScript.TMSScript.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSScript.TMSScript.bmp new file mode 100644 index 0000000000000000000000000000000000000000..68a9efebee2469bdf3a8fd42bcf7eaf44e165d7a GIT binary patch literal 1782 zcmb7^*-sNu6vpd|e}jpM1c*?vhLTX!ur(|Oup;{4!kYvYV|)?OL}Q{)N>th@OQ(P! zDu^tSVg*DX#?DNqlmS{SGi~W&10{-E0)Ye`@W_yB(5c;63&?OYyO7NRQXV?jk zJ2DAPLAg71;46fz?ooF|A6I5zLBq@o-u9}2EjO~)jqKe4?sh+St;g0zaS@M3+TBNR zb0$t6ttDlcNva`uqBImw3}%jbOdhN<$uKfrO-QxW0X6l^G#%zv&_t){9fhNdCrwK# zYN>!;$`_zwRthIqqpFC#bar<-&#xrw$I|Pek7#(iWLo0Z8z#&Oe6CRQmBCdJ?)z2_ z;bVF40;>0OIXx~#hdaNX4D%^&A3xT~-Sn-AlT<^U8xBAxUb22yzILb@!+k6cFMJS+ z>7S+CYK(>yo-VO@@}hGs+u)aL31ue>{Rk}vZ5~z+JU$ublIoc(W1z^gC_xq2l6$V?{(~0yZTPPV#HX)~8GUL-?Z=}*o{l{q literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSScript.TMSScript16.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSScript.TMSScript16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b8d396bde8081db10b10f49ed025970acd68be35 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbfek zjjRDvJx~OfVu+bQ*|P07A<8Ou-T@*AJ8R1gy{RYcW}n)4>L%QZY5T82)L@dTla5Kv zxL`Erg8rn#yUyN%Xfd05#ANC*r!_YmSKn|zML_jRv(9R)ylpo9ME06<5cRIJkJ(K> z8Z`g7^Ngcf6OXD*K8}nuW}Y$Hc;9&XiOkh!;ZA}u@;6*InsU^6=OZ-avi+gn#3NJo zUO`rW{PJDnNk`n)Tnjz)3=Mg$xnVTvFtTDG+hWQQ_oWw;4?j}uKLSC8*FO7S1sr+j zvHPXQgrj@ZTg=AYwRgQ4JM!^7_C5Q+outudwGMPc#(M=am0tallSE{XLeCKhahN z7jygMr*;oHA6S0&A3L2B>`@z5Z9yyH=?Zwd(mbs(qdQp8DhtK|Sul+SRhdww36&es zLL*jTBV6cQ_Pn8JN(p0)V@vw*rY^jx4{zy0n{9N4Ll?~Gs0VG-{kFh1t-zr(xnED` z8t?;lHrGxUnf)FtktM~)qcmh?^~{z;j-!9%8n6Ssk!RcqfXq3gvJ!MOC6?k7FWu~j zycfJDk=C(Po(X@}6F=BL$Dwr4Z(nA_^gGAHWk#}oBq5RN0rn8=%X2b$7v?#N2I7Yu zq?kT(gOwZbBLg#s`&q4rfxcmZQ#~+KGc>!Kx(kuIi`&!;&K8*Pd!kMUh($bDy!m3Z>H5!-m{>aI4u3H*E2g$T4ml|Ocv}DC9Wh#`mX41vyg0Q87M%D# z1$7gV#KL|Z!N?_lqTC+PPo~=@7Gx$|2IEC$pB(WQ+lW#-sqUdFT*0co5Y*2!jK)u4 zEA<}c^B-72DZyZ4AN}Udr4PfaQh5F5Vj1ES)Da9a@r6=^I5W4Fg%0-DkLVR{!LdGO z2#*U&2?jf-V)`qwj?l_$lgR=T27aG~Fji#76&7EK)vvM<?ydp3=$5Sd zZ+YX-d7>Z8Z#90G;!4C9DjytZj{tAn$=i2Nk!uat(v_~zJJfGn<9L_4*FGBS7!^H8 zL49tq3oXNQuTX!!5!-q!FA?h+Pqbzzy4^U2>_T5AJdNETS={xt{YCYlN;@U zzfOi8WTD(0t@g}l5nKbK;2**bI$I;=pL;Nte*bE;(neI-1Ld|rF+yfRVIdoxQJ@d4_}g@~Ij6iN}H3m3W)tDyftZQZ$0QBr9s)S|W< zTOY+DR%%^nLeZK@8%;7!+N4RE$-I)8Wby!s-{geL7{g@3$>GbHdw%&iIX7p|TRXYt z>lE@KybrYAJDQ5)mRrx8hgxYR7({S)I1)^wLc!`@#Qz-Dg-46iPp)O*kpm4HMR4pxUqogfliWDD!Pz2uT1Qp_39y@pZ?%rb~K5%-5 zcAvR-5RYo6UMVP+CPBA;@w5P)Ml&HNC?e2xbi{XksvkDM>Al}We(GhTYU(&( zskxGzHgd^g#$Fy&Qv6q%2{fE= zRN5YtjcU#W0>RB_7aqK(#Xun66{_~2q>`M)pzN8aMZJlFlUq@9|67H7F7-c} zZzC{2gmTX<&NJzvf1xACy?Apja3x|*NY>y_!}m(&CbNBy-{BkKuxmKUx8JM`3bhw% zbvRKzv83;tRR+dCkn^sq>*V-9hhFNn;Gf27qp?(PjOOb8_x4_SSzRaRTU1<(ZOpET zb9{V099xdWzpuw^j)&ECayn{oysR$kWjltg!|t&fgi s7w6H1+XoJABJLw@C4)e~k8P>j>QW2-4akp^K$273SC22c>9_|d(4 zH*Z~mu;C_ue)Z(z(|hk9-ng)DBT(gsCwJiLAKblb)h>l_GpgYblOgs3&8%6KVb&_9 zUdsYRuO8n6y7}YFN0=r9)dNxe>TH81KA)U4_`TgVDuWz3N84x!E89)SA24_ITfm(ii`SAV2o3C%40Y%_`gewEO1jq)u jDrbTxL<<@TR|#Z5yb1I#(AUV~c-X*@1coOb1;|nWdvyz^ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSServiceBroker.TMSServiceBroker32.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.MSServiceBroker.TMSServiceBroker32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3597e58f0bfcdf3ee388f4495043c23cafb5886b GIT binary patch literal 3126 zcmcJQOKcle6o!oei3LPLV!;Z!qhiwqA`2u`2??PJ5Z!dqMTM#gB*X@x2(bYYXeDSD zk)S-AlC}W~Y1$Aw@tKAR#+^ZY?cHG;V_kF&{Vc}}7(}4O^lK;P(uh)0v(r3&IY|LPYo|<=+ zZEM}Q7oP~s-Q-VSAK3M5yN%+c2q|m^BtE?YZ15xgONLz1D+R42s)dXqrseE<^>(71 zj+KPfBEMYVB2w(S6b*^1!N9~Yg4u%4k^@c$!RJ;3UOr`s^1&@9byVN~Hl(u!Fne+%!0#{d0i$#HSBkhl?=Je!X$c_YVUD}3A3 zEnTf?GF<4@qFxq3R;09?6JR8-FO-F~(B)Ck@^PF@C+8G-kzZ+rU$<&a7iu-){{zhC z;g{0Y>^g>5M^6=T_>;?d_wa*Bktf4*|H?KxcJl?Qtwq;tTR?`&>4Y{aSoI5)l|wxrKq9Su0&LG0we+(5=*n*$Ui-Hmf%M(9Nhi+Gj9#~iOLC-DDZtl>H7!b@Am(|IGc?m7sDj++wFa)9R7P>{7hJ$<2LhK zoY{AL;1nkCDvvICs4G8k_ zu`5k}`wGeU=YuzYTj4GWxv7FOrgIVF|HJC>~exTCQCr|Dcl{ z?Bfbu_QhfP<<5tiHW{*${K4X9})sM-?@ddursb z9<3~|t}6RdF8G>v%a6$SK@9eVd{4E!ycTxlYh7j=M-VCl+QQ|oTlDs z;4F?RvOYZF$I?C`PGeEZnWP+GQF1lzwns^G1h=fYtSn{@I4z&|sSeq8bA)`F`)81@ z6hp2vMB0m)7Vj7}v!;b9qjtusoi#2@1BWH7uxMPE`b#@=cu;%LmP7gcqs#k!{~h2c z#}paHo%IobDrRGRE-qLmUd$v-+UW>kkK#6AC7a-L>FR6uKDOk#*0?r?E4!bRT@TCp zsOG`DD4%sdi7dr95;PH~$OOHb@H$zKJt3-Naa#nlhFqqGiKSmcg}d2;DpwecJZ>cN z@9C1Ax9$n`x!#juJcyHI@Dz=&`>>eT6>~dNlpRn|C6FedT;}lyE3={4pSdk#k+<;t zquj=4cZX45^}8g4Qd!L#DRR)gPv?akd|eLEYwPr zmZV)!qB!M9c!U9nk+vvd1%m+y0|Z+MI*ssm)s_1Y2j*GiP>_;euPX98e337Jx}s=L z$lMXP!cH?7Ngd2H5(rx`;Vf@kTyUiFkzg6xS4gDk5rYReBzTA*~ts+cw2b%eE3>x@M>#t z;B>I}J4SKRf4RZiQA@Q~Q|Awp=RU!IJm5P0ful+8`1T#!H*eV+-n1RBFxBlvoY>8_ z?Zv+Bg`RDVVn^Mzt-Q27*HM^lFHE;>-TrNJ^5@NopSH%%ZjLl>3^#H^r}6_Q*9Ypk z-ug`UvAp7_weB^cE~K4=@iM6}ejdF&>eecU9w8)=ixZW6O81*7X^ZxT@aaCYw8nYm}?&fNp;&5Z_K zn!#>^wW+!q44d`5p?Z!3Y^_$S0lu1GA1u~d`j5TNKo7<~7ah{^7~Y#ZI)H?*Z^ z`0@0oI`dZ*4i7qKO^o(DyM8LPw!yoy+x8aobr?JKWXp>MQ>^?fvvzV>ZJdyH^iRT( z@1?`%asE@=#y_9Od_dj!O5S>Nw8DFwMS)g$T8YP`1fd{OV#y3crkT)D&tgYZ?;lVb zJS)2%y~q6vJd;n-OY<}S4^xZ2nSk##l=$bTTD?o1OnGdz)c#d9xTU7SH^9%j9jd@W ziB^=gVy>*p{<-NiA|Sl@E;yLeCfBuxIqeM6I=mnC{`NwOQ$)5P&~S?qr{s7fmmty{ zIT4P#h@^d)8Vg3oDdb%U0Y3-xi(EanFF$ex*}BnyiR(Yd-aAd-IUc>$ zMqD=r`t}EV_lB?T!SjgDYl72~cw$Zt_n@Im>_8{|;4F3j1bO!udApUkaX4%_6fy4$ K)_7d?pY}H>DefZx literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.SdacVcl.TMSConnectDialog32.bmp b/internal/4.10.0.10/1/_Images_/CoreLab.Sdac.SdacVcl.TMSConnectDialog32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2cb61bda58ff6dc0bf8ed5b9212eeca7418cd367 GIT binary patch literal 3126 zcmdT_+fx%)9L7th5A7e&C#O%H&h*Wx&a{qwsMe15GTKh3)6TRrShXTj1-!J@qD4g% zl;S8T7r6&SYmJm!0(L|K$VEuVWwV>hW)nyt2?=ZhL4@=>d%`y2r9O40JHMRyo!v9v z?>oQmJ16gdvi8*k=~;{MP5fSu{gx%Xh73>aJDt!mnh^aDBH?&Kj_QnD2sz$hijhYA zS9uu{tIctD&{W*m@k`N-)N|$O=PC{sTt8ObQq?|S;_ULuXW`QYayfZDO?nNMDs|7P z#@?(>W083@n+tr^<6V8z`c_fzhWy5iQl-IUp(|y4BzUs~kZxfKIHp+@%AK8~Y5L%K zr&#HoK4A}S?G3JK@~^1%yj@bOmMpnf8#3zpPSNS2tJ%@r%y+d|yPB+; zR!3J0-`UD*n(f_C5Vn7oJ& z{#0KH-vRtX=PM|FyP_~)XMzrf;`gg>BL-Br2h_Lv+ioGhuTo+<&gp=Rq)(;nZ&mKT zbUhv){I~T5S2g;VOZ-=sum>0M)wP5_@KMEYH%B9r^P(>*`eQNWi-vrt0(`{6^z=g5 zi%)wl-<0rU`V#z@zGLvuiV`+8x190^{*;56Jf-U$Av0?x#)7UET(We8O|bjHei110y3)kdLVB%lg}TYVwr zh`&n9WnH^n)!x&qV;1{U5OlEtCz``z3%2f-Xmla^0*??BHMY@49e1nGSl7~C+kB^9 zeYaJuI(%R+V|7q)j5xnRCx;RuS|pf(|LBF_A7kKR^droWn;GQ0nznCwTLwqcQd1zh zNPj{C=MxxQ5qy_Q8j-wcj5FFXW^l|rfXieFew(6*kat>1mtawJ$z_ziMD0p+w-PPL zy&(mJfStz7IvP0IATRN6N!+|9oVQvpK6w6JQa7AUvl@&2po3eo?N%QiJ? z2}nW!T&lvMT?pzWQbM|8WiQEgqW?hz-#q*j{)$3$9{zy}NFW3b0x1!{g~h86cBL2K zKX#S2;AahP&VUj=vu@Xx)$#uEUOzKdpY5s5_9?PQt4_KqGDpiYoFzwuq8}ZF>5faO z{Dl-gFUg*}%W~#B?({e8$*-ATzc6KdX8L)n@u!dV2RG}}Kh&pf9Nhn&Zr}RBX z@5JMe*XKstis#y|JZ!rhRTs>+A}-Fg+KOb!XkRr`$D}p7Koh z)eKk35tqcDzqsF?zt{d-k|k#+dp42F`j+rN{v~tlbHmZCdhkEIWhi}s z8UF3@ZHRifV;~Hm$^U-;{QL7en#tdv-NmYY_p<4Ke|*2RcLf|lOuk&|ej(Qm&2S(W zsQ%xtUw^-U`ThC*ulFy1ym|yN`ErT-g*4Z?-1jGpOa+#+PsDgqG!s>c;Ca4jaS z!lrG)aP^p>m*NGAM+g8a1~PIMhCsMjLod_MWNB9bP$dv8KQIfb6HH+Zy>r;&1)_`8 G&;tM(F8+c5 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Dac.VirtualTable.TVirtualTable.bmp b/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Dac.VirtualTable.TVirtualTable.bmp new file mode 100644 index 0000000000000000000000000000000000000000..49baee2a99d225375b3be2072a0ba76004b9abc2 GIT binary patch literal 822 zcmbV}ze@sP7{@Q#qp?3Bh=LZUXmF|_aI+<$!J!DE28kkYYO0~3B`9f#)<`7!0U4;M z;IB)mOHYZ@^Dqsh{B?L|Uw!iJhKT5e_shfg`8?l;_s%?L8svJ%1Rcd4{<;I)NYCfc z_YKh{gX6qjFUnsOE!JfQG7WP!%aoAWaYhqBsOSf|Ip`z}tO{BFVT zsbn83VzQj!%jv|c5Q9@ng-fZBk_;+*K;iwwyN~vCy&dtmv_`F6tE$yX>#f)A=@DO;=T|S*I;Ig`9l&mhnVFyGL*9Y71L{_1>ajOI;QVkvqmy0$3`b7=h9jG7Hgr z#uM2M?;pGc7<&u8m>l;JUp#Tj$J_bC4e4M#x4$Cp+S5BW!D&rxS$M}xV$~d7nu^#> m;l;_IZ5;or%e#nQd->+)Q=66t$1M2Ra-UzA_y>=Xzn@RI0P#5h literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSConnection.bmp b/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSConnection.bmp new file mode 100644 index 0000000000000000000000000000000000000000..82c48bdc9b7757fc64fe4e4b57c6b090aa12a101 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbff2 zR;gitptxBs$l_?a;2MF79kZ2E=lNW`b{ei8t{AQi$bhih))xbjNsEwMuLeXtkX*j+ zdg8>DnO$=Yi+dGvCQe#=1TFRZ^kFU+f68?~*4D??_~uF8aP0~VZ!gQ!3Mg>}ta z^@=%%R?a!NV)mZJ)3(g%Uo)j+Nl*Qpmhx$}g%I_Di%!R01Dk*T3*)lqR=wMR>i_@y zH|6$}oJ(K7KfLkz`sq&>4$Y{Cs`p!RF5%Xnc`v^Dp8mqH^tDO%W}tc?+P`e(&IOY< z&gfY=v1MUr^~}Z+h?6olUR?L>FC4|LI5fAZ_~V?s7n4%&c0^yU4Ln)wzCX*ZG{PO| zWuV7bUAi~(@`I`8uFt!0b@BDPD^6To)K>9*QSrN3*-s}V-fE3FU*&hKz@;L_8yKX( zfCXv+dIS>G5Fah;uKlyD;_Ljv*V8f{_QYLl2t8BgRTCcolm$i{F!~_z2vH0qS5IvI zzpDDzlCn=gS4~d2*AacGHlQ&z1Skbe7{KIV+bIW3Dsc51rgZ?-|6N)6ePQwYnb}V! uB;9HaZ^?`VDgY)tcp`+W-#n{l-ITVK{SAvcD(5y9O{>nCP@3A67Y6`3ZIr$M literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSDataSource.bmp b/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSDataSource.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2933844f683c75b455ba51272062de0874a928ee GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbfek zjjRDvJx~OfVu+b=EpTOUE$X!_5QJ<6el{-kKygfs5J5~Sh#_d=Xk1Lw2#Tb5m?r^| zmr0VRX$la5*~uQpKtZf}x38G`|JV0Rdzb(D_VN3t_rG2~`1b7n_h)w#J&m!d-@A0? zg}o~-?_U1z`|Q?g|KGpo_bmVQ2Ncn7 zjWui*02&K)43GiTj;tOl8>j|oED+&wKUR$p!QIQICwrP=B3xR4>VJLx`1{klU+-T0 zc=_nt)4N|E-2iHbsE2q2=qaGr;O77R@%_@?6>#+J@ok8DU?>3*Ft~t$2Dc7q{=Z+p z{(k@R`}6x>?_d6S_2~PvyKwU{BjUxfmZ$S-A5Aa5*OzgtHRgIv;N?>H3%Pc11JM{S embHS^Pb<3Dmwu}?`dV$^|OQp+9?paeg?__bDy6- z^z7V$XJ__3JF^$47oz^(zdt}Ne}8=Y^X>ER&+mVIc=hZ3>u0ymtJE;0&UgR$_Sx5m z*MVB#>Vb+u>VN-&Fo5LmPj7+hfqH*`eDmwwi*Ju_0&Rh-|Ns9#P|d%;fB*gd{rBg0 zpe=vCegvwIo8wTmCIP7B$IFK=E*^%fhZqad1!P~|zxvPjuR!(F_cj5YwDfTQ?~iX^ z-#DA*YYA~bL?w^}fq#Gg{rUax_b;G&ppUB7CIPiz-Y>0wJ|+A4>fSf|SN6@1jO^8p=+T-vH|E*K>F2V{ zf$G0+o$~+K(*Nhyf=D3RJLmu2DG#R?KUviLa_ihzyB59JKJUrO?wcJ6mx`QW<^!$3 bV$1s}$RZ^kFU+f68?~*4I5lG4TZi5+MwRGV0v4QzgQ!3Mg>}ta^@=$V^_xyS z)o=N%QS?c_1Vu~WqSLY0z~-O-!no|YRqr;4dLZdG<-KbDC#9lK21vH}EjgEP>(9Iw zUwu!1VOaXwq|O2WuKHA jKIwIRgp1>107F%==95z0C#B|3O6{NAroG3d5|=mtOo@|x literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSStoredProc.bmp b/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSAccess.TMSStoredProc.bmp new file mode 100644 index 0000000000000000000000000000000000000000..147386cfd146b64dee8df9cb0916f2b9cc78154e GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbff8 zcBx&8jNsyMm2kZf22gR=y$_*>o>^^q2xP<6qbY-EhnTD{qKY4^-weRCqaI@E%*-IHw&N0{srqN9_7xb414+2;5Wm1lxHymj zR5mBla&M-?R8Mud7NAPZNP#F`niF`nFZ*tH%9%3X>AuYU6viXIfTNG#3s`mSrr^@iwUat#?9!oQ#(*FljfjxJp_4@X14T+nrCPo8u9?mS7X5#eZV4pAusq^d0zY_fE;a<}^y0ebm`&yh2 z^;9IUta0hs=T801saxnJK8nU@35SF6pda+P|Ir)0J8(SbY4G~^_1yYwH_;+_9L0R# zlR))(4|V8vq=PMz7ec^~!Y~SgaOBYzIM_1my?9O=TUg^l@-&3HNTUUUwvfYat|U(+ zY8=rx3Vdt&I-Q2SJ6e)5Vjdtq*WG{E-G4_W+6^P6=l`a Z^Y->C_;m8DE!q|@s7k@hyPBDn63ZaY;hstFDQPyzOKF{6C>D!F z3D?L-Ba)BOKc0d?mNb>e^?1Wy9+^on%|!KhZ3d>Hy@2?l+?-}8Fh{pb$gY-Ak!vH$w;_0;@qHP9k>lw#g< zNg%qsi#X^!A8l`uV~gOUC_*(1g3$AVp+j4c!InYy#j#u1!s_ROM+r_{q|pL_EyH&k z^YLNq`cm*jBE}Z_q32=?c$`IiPrFeOJk1140ue2U*y1NG*wVha5A%5XG)GMD@@KZd5PTGSit{x%34&>Bg=>*+$=?=7M0c5 hjY90Y9F=58%UkP<;M2*Iwy0}d$+1EfPCQ!vZ{G(e?27;Z literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSDump.TMSDump.bmp b/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSDump.TMSDump.bmp new file mode 100644 index 0000000000000000000000000000000000000000..57c805c65f926d050fd7d4943e647c7fa3c308b9 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbfek zjjRDvJx~O$xO>NG!`dYflsS7l#7wvrxH7nwa{FD1k{3Gef{cegC;(pGW|wgi228!znypeAp}AE3lS%t)M?s= zhVbhJD%P8HRAVL(R$oeCFBUVh4W(IumW7j@>G)meJo zuzo8<3gT;^_kn=`R}5qTt?=A_&t>}q&)tvB7hj#R?JQgt9JoepsCve-H*kiBFW}F0ChgBs+FnjGK(*;)y7GBkveaU3m OEzK#Xd}bcTr5*sj`F3Xj literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSLoader.TMSLoader.bmp b/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSLoader.TMSLoader.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3bb672b744c21065b4aca609e3dfd6ce8575ac2c GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbff8 zUcT>o;?xxx{c{Y9dlhmfPFi~et_DpPgzGkGXZ)@I3*Y<*zxa)5#dGVvEfDo^#SjKu z(09Sf_#1x~y!sY)?hEs(*G6q?Ay(re1D2kMgQ!3Mg>}ta^@=&TR6@i9m!FQk1~&iv z7sh4Jt$MfNSMRs-Y{IQS^Im-QJ^h7Y>1&hj&G^-)Z@bX_{{Pw^|GVD*kG%UocEzC- z5A!4-@-j*CG)(~_Fgw}97$^udYSpECGcP}wdhYtX3s)Ckzq{hZ#qBGm{{Qv;(%$8N zzJ2`u>HV*l557IS|NYtBL{DR^R_|Rp^TOU0mv=A!_x;P2Ju5EkSp{VOc<~Tu5mxoP zmrwow_wV^V%YXg&@%P*3UmsrneD~_-nhd1$_2=h%^g-zRpA?o+9o%8S4&l^WK{Q3Uv&*%5wUcLD9@$HZI z?=k~SAqs$sfsCAmArS7%m0gb)G(MSIb9ZLh&8Y=9Iuowc2W>7knN?{DR0%}O56pt7 mgpjY+^gUnP@OXCR{V92Ox)QH9gj}ugK9^^AEF0k-Wc2`Hnxvlq literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp b/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.MSSQLMonitor.TMSSQLMonitor.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c6f0e50eaf9f4e32114fe6d2e289c717e21eb63d GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTt!p`n2R2w?!i29gj26GoxoYJj2;Hbfek zjjRDvJx~N9xP0IB#EC02yXG3^_bOyeoV4}`#7wvr2m>zYHfd-4t^W(({0P7JjcLVm ztKQAX7Gbh|7o3d0@n^xSZ(--YFt2)T*t{B9&Ek%#88x}Rg^A5+VO6m{K&gNQC*mOL z&wpWE^VYCwC9--TdtP(t;G)y9*TCkV|H8QJxpDhip!nKJEz5iA7POVm zsxO#QnblvM+>smGoEBc280fqBXu{3k^Im-QJ^h7Y>1&hjO+fV>bK15{kov={mkqalT#n{ z#@}v>xLO}{uF~gJiQC?u{0Zwf&pL8*-i51+uiss9;v!J}_W2WkEH3#xFaOQ-%x4pl z?{~%AXbHVk>wmV~>v)lCeNqrm4KmohaLVtcWnUK*eVCo|YHIr9zJxpNkyjgnFI4%S zF7;?i3qw{6Wba)v{qKs(pG!)=%rAU5Gwb=}l!x7Mw_3t4*9V@h^lrL%QZY5T82)L@dTla5Kv zxL`Erg8rn#yUyN%Xfd05#ANC*r!_YmSKn|zML_jRv(9R)ylpo9ME06<5cRIJkJ(K> z8Z`g7^Ngcf6OXD*K8}nuW}Y$Hc;9&XiOkh!;ZA}u@;6*InsU^6=OZ-avi+gn#3NJo zUO`rW{PJDnNk`n)Tnjz)3=Mg$xnVTvFtTDG+hWQQ_oWw;4?j}uKLSC8*FO7S1sr+j zvHPXQgrj273SC22c>9_|d(4 zH*Z~mu;C_ue)Z(z(|hk9-ng)DBT(gsCwJiLAKblb)h>l_GpgYblOgs3&8%6KVb&_9 zUdsYRuO8n6y7}YFN0=r9)dNxe>TH81KA)U4_`TgVDuWz3N84x!E89)SA24_ITfm(ii`SAV2o3C%40Y%_`gewEO1jq)u jDrbTxL<<@TR|#Z5yb1I#(AUV~c-X*@1coOb1;|nWdvyz^ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.SdacVcl.TMSConnectDialog.bmp b/internal/4.10.0.10/1/_Images_/Delphi8/CoreLab.Sdac.SdacVcl.TMSConnectDialog.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1eeca6af399edd25ca8bd454ffd7ba26071e99d9 GIT binary patch literal 822 zcma)&TWAwe5I|Fl|9<-Aul@;ADyS%mV(ddi@P*ct)(28)NL5fliGqdN8fqm8ky4bJ z7>cE~K4=@iM6}ejdF&>eecU9w8)=ixZW6O81*7X^ZxT@aaCYw8nYm}?&fNp;&5Z_K zn!#>^wW+!q44d`5p?Z!3Y^_$S0lu1GA1u~d`j5TNKo7<~7ah{^7~Y#ZI)H?*Z^ z`0@0oI`dZ*4i7qKO^o(DyM8LPw!yoy+x8aobr?JKWXp>MQ>^?fvvzV>ZJdyH^iRT( z@1?`%asE@=#y_9Od_dj!O5S>Nw8DFwMS)g$T8YP`1fd{OV#y3crkT)D&tgYZ?;lVb zJS)2%y~q6vJd;n-OY<}S4^xZ2nSk##l=$bTTD?o1OnGdz)c#d9xTU7SH^9%j9jd@W ziB^=gVy>*p{<-NiA|Sl@E;yLeCfBuxIqeM6I=mnC{`NwOQ$)5P&~S?qr{s7fmmty{ zIT4P#h@^d)8Vg3oDdb%U0Y3-xi(EanFF$ex*}BnyiR(Yd-aAd-IUc>$ zMqD=r`t}EV_lB?T!SjgDYl72~cw$Zt_n@Im>_8{|;4F3j1bO!udApUkaX4%_6fy4$ K)_7d?pY}H>DefZx literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Delphi8/Thumbs.db b/internal/4.10.0.10/1/_Images_/Delphi8/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..304de0f9d69404d3ff95b3f6d19620f60c6371f2 GIT binary patch literal 8704 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/_Images_/Thumbs.db b/internal/4.10.0.10/1/_Images_/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..451ed81938278a9a774e44938f9532ccb31a404d GIT binary patch literal 56832 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

yjM$=| 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DAMacrosFrame.dcu b/internal/4.10.0.10/1/Lib/D11/DAMacrosFrame.dcu new file mode 100644 index 0000000000000000000000000000000000000000..7e32db40d09d469e0abcbead76ca471c407f91ce GIT binary patch literal 6116 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DAMenu.dcu b/internal/4.10.0.10/1/Lib/D11/DAMenu.dcu new file mode 100644 index 0000000000000000000000000000000000000000..f3bbd857ed051cdc5a26079a30db8278a2f89ec4 GIT binary patch literal 12063 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DAParamValueEditor.dcu b/internal/4.10.0.10/1/Lib/D11/DAParamValueEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..b5db20c18ec3c76c757a2e192089260bc6914c07 GIT binary patch literal 5293 zcmeHKYiu0V6~1TUtdGp%Y#ql5!6aTFA&{_5NKF!&qS(9ZU5vmZPfGSiVYOBh^p=#+1MHQqK;!zb!9wk+)s#HQr&zafB zOuY18|JBm^&YkbO-@W&|?ww17XnDR>h{N}0*DM@+qFpF0nXWCWqYiIV&63ROhG#pE zh}e3kZRY!wo*&L8l{F2;#*C_^3`^slQmjWUsxE^+IQ1H+8!?2mbARPyDrQZE~xcWTZ_8t$$nWd$R49d)s<%o^Fr`;$M9s%Bg&f$ zwTGabnwM!>Yj&R|i=JUyrRjaGy**RmsY-MoXIbgqZ37W^yMG?p*S2?O-NwPds z<}+nMgyKlrU||1+j9wB!ORi@RcbT*k@~w2dZke|oxtNKIKZCf%b`3U32b0>uq>QB1 z*rVGm{Zht~5zN+Z>z74S)ntYq)22a2yo_lVhG`q67eF^TM!~Q;nGo4B69W5Y_pu+` zHB4zgMXAk80opK;Ve?=WZ6>x|6}V_8eR)s*_L7)XYJ9@ADmDkSW&93_jN zcE4d-Yn4W8tiNm*I`x#v_kkjbsHOZ#ogIC`}`v}ezj`Nomt$(esv_6%O zVPB$Lpk86_XUJB$z1B8E?mbLYy1`@&)wB!2RUqf-Y0u%SKz{bXjdIw2eOBUzLM-J! zKmXQWCyC!(@;q{mf8(LMOqoxY3OeAb9VOEp5c-2#Bnh5BkS=$)z&-u=k^2hGsmQwn z_ET?jActstM36BlKc)WOPyTT6xiI;o0>95NxiLICV{^s*fDv*;6yfw3p<4W5-Elc} zME->l3aaQhx)mDk&_|3>(F>NFD7F3c6=#8wX5k$ z>QzoaA+FLoD<`EzW2#a6W0tFi?N14+2I#B4KqW$tP_GuEKi4|_82trv%ElMsb!};D zYGCHa&X~A-=bGMTamCy^;JD}+AN*Hhjgq>mN3@8}noU3Q#VbZVLA{z)Pif2A>xgl{ z`(IyUV)z;BA+dHcmPj__q?vCMiP$AED#28_+C&VsNm!>e3Xw?6sjo!2QC6~8>DBSp zkWzBCkL5+|6B5c+gcj9X5*LE>kZKj=m@rwYEi5IHv7EGY>9h$&A+5fOR!2Q8+Fms{ z$Arylu}Q2gOmtMYh=SC1{Z}>GVo0sXYD#o%!8Y3j^3sfoSls`#Gxqyu{+Qq|Jh3x* zuvKVJD9h?byWqb>5}9&lqd@9h(AZPNC5phf=xRL6iHGet)o>-*i3T31!ePTq zHLRkY)944v@T$NlLW!N3L%SMVr(_js{pU$IRAy-z-ersbcFx(eXTSF31|kU)&fCOo z=&ymE$3cki(vSb1qxSw;!SnzB|L-gSVu~z1?pxZAIuM`pXA4DJy@D0EiM`fX53aa( zNYu#$A#&R${yuSR;?0S>dFF|+BE`-Gp6zSDWykc^iBo;K16w~OJp1WKyq48dTZgt$ ztDjw|ALxjTAsP)^vHIx5G(8+bTGr~Rn+FH=1BszsG~|J@#Po3%I{CL9gS)0*gbHNbS5Mc;m8N#CoS0LPv@C3qIgsTy*LAV*A2jLqC z*CXsixCP-Jgxv@S5pG4$5%LHRBYX>C55i*zCPF{L0KzteFC+X2p@^^^!9nm4Mi8z= z*nqGf;ZB5Zgbc!U2=^guLfDM31>re_mk|ylOd{NcFoy65!jlNkAiRL^LxdL*-at5t z@Oy+e5so4J5#eowcM#q~_!CkMK`Imoe@6H)PS#jTwfuUR!Z;NkhF)&w0KdHN-kwz#sOHQq<6eV6#nxUjDfXkJI)DoPCD-G0(pRXJghhj=X pD8sXqmZ!zHo0|F*p@`$N)^YRCSyYS^@$Xr?xPbY)P>>oK~;jNtDnsNUFsVB0lFzu4@g2VeWWOie#No%2S!QeXmj{E6R)zWT*IQ0_ zOf`YE3>D{jJ&IhqE=MdTl~m>Mh2+qw$ND{DeJ~=gp(lyWUD@2iL{!QbT=t_M&+%lG z&2#u&KDo;4cldm*B;ihJbOgN)f7orl|F3ST9#nm6i@dPo@7W&FzRnvaGZenf5q6Z$ zJUrbat#Jh5&h)8|+;#pbkLli^i`hzSdvi;;^*&-}l(AX7>t*I#ykOD+&q#Ita(}CR zol|b1Jg8ZSs~^I9W6~>r$V3{!@+(o zR-AwZoU3Z(7N5f@+wfTF^UD747f9?Dqu5+ItU&h$y&kWB8VMxWsSDJiD@`XjAvXjo zgbpV`JJ1hjW!D7>M{?OGqf8?CP2VYgHSU5_qT4|ArP9G^?-@1BXx1Np*TZ4H#)0 zfM6r7&J_gY8v&%;5%GnUga$Veo{+3+{~CwSOS64vh*Bg9( zodK!}I3uCQ2pM6tMDgi+3SV{2iY%0~t>gHw|GX5I8ThuK!&BW%tNeAsMjA1@-?7ps zyM94HjuEKx1&}Yl=a+;O4~J0M)p-$I+F4GMSf(yk6L7d>*Bitfr88^g)e)3ETZ88l zCxo+F>-g;ugzR4saLFGKGGIN%sMcQ~AWNSIz(Q>BzawtGk*n5{*XAX49}bzQLPahT zGFl%=jnj*~D)F6oZm<=N-jEkT4AH1;eH5%%;&p|a!o*H6t{#hIbs`tpBd#4>cbXyB zb8p!<7yFx<%u@&7J?crdYUHyIb&vFj&B1$D{l~^XOmVuBssh1g>eplHD_OT==NxM# z>z&HU=U3LhZNu6$!i%Ufl|J+)p(q{0V0fWK?F?ZEz5!DdzeT|9^>t2c7Csb=ajS4W z0CA=NPqF{^Hd4wBr2;pJ$9VN*>(;6}Bt*2;b?>$eD|rlO5r z5=0YX8^}9@M=p-Y!B#rk2Hn^ve@$?KVWe^dU`bPs-4_N+)H&R8B~GLIf$+~HF`|Bv z91Ou&GF~|k^%hsHMo4hXY6yGTp-IBL^?|x@@N(72XFX;-)Ca(tJ~ci3!GC%rjmEj} zDhApr%AHP}#Sp*LdhMm;m9=+#L|N15yImdbKH9~oi4#vfidR#DzEHw(c$v63n?5Tv84xv~~zr7EPN(@E#+DZgj6taGZK zxLC^O)J9ls0X8wZ`gi|Wu%5O)T^JZ%4!ohJJ%pgr1`yf_sDeY=2|_6uppe?V)V{Qn zByKfIBpgLTtY9C3kW-e_m?HU}R6Li5C}z8V9D2!PDFaQfYV^u>%MWWB@b&->UMn_l z+S=@t(`@B+i)-|t$RpI+z>C2L9( zbK1ar(tRM5T@h(n=A34DQ(6IP;8p4CptOyP<5oJSY1{DY(4cPtzlYSo9`GTkf$qt} zh=Kl@1j^7yzDVRicen>6Tk;FoAZeNXY3EWTzmviYKm!^ZQ_Xb7!rLA3`&zzK*$cA`H;k$3mnvkj2lJfmZlq<x7UlhiDhI*e)*yWHIP{vr__ z(&gsFtBPteZuiYp*P&s{q@Q($DEAPlz9VHA)o@uV;@7x2%Y~w(Mk-S`m+>BS@4K09 z&0uV;m>|l-=2TSvKVr2d3p46alp zQNN0`JC)de-mmJLHB#P>JO`3AIh@S*de!L zHPZ(B2-EcBM!79y+Z4eVEpzdJZK=9wE?0u3&N2h-<(l@vxyBjFn2ac?FHSP5Hx{8# z#9Q6m7WVUmOns_~5x=LFH*#jn;NJ@(*Ry7-9B*RlY923n`aPsj(R z&+6hgs+iO6lBStB+k$ynUmj}YH<{GT%#wkCb3zHMY*zuN-7Vc?;;QCyaBt4@X;sT4 zyNQ#mTya{tDV;xhecJ@CB*nLK5tS8Z&Mk%;oowu!%n~#B^t*|gfCtbNKyeMCA=C@O zF9&~z#y1c26V9Bs7|?DFN^>gOlwo-eV2|pUI+Ln$HL%AuOajJg19N>7z>^w~qBaQ5 zoWBG7A8LF_D<;ld@FakJ8UPFQRnM6Vp9l7wj`@sO?onXRYgn>xB_$5?zX|q>I$K%x znErQQA5z)Ytbq_H9f31nI&bPgTh}DA4Uy1AE|SPmO(Z>``9Z^Ff=_5L=FmOCR~gP# zkVq0CaY~c07<&@XY(h_KXu1|6ZEyp@Z>n%fMwQlE=#UlS#Oase;oBOVS*0&;6`#eY zVO!9&ry1H9Ctey$y5HA8i?NXaEhqGM8Y*c=q8@Rb!_?KqU(}FP_TojqDZ`*gSLiaYLtRPZxh#gEA5i7(L>H=(b(_Uv+%YDM3udrVoL? z>jH^eeUHdv?}otVn!w0mcI+N83EMI3;FFZ?WJ)p%C;XalJrjK?+H9is#2&l&Bvs03 zqa|F%xS2O@+}O0YjHGI~>l|mAH&waMpQ%W3*Z1lVzJ2pW2xcUnvn^l=q`>e4{TzvA z4?294Ed5~C8+1?XrcC*ub2(|^NmTt|S_dD}Nr--iS6ici?DMP8MJj^0+f=Jx!~OVR z4-8}e|8e*TWH7cCxSy#HJ-DZH@8Gk8akMRA8>0*x!FC;{Ui~mAo-;K4J&a*&^<8X0 znxVn(WgNY&KLt|Yv}XPcC~Qz#e|i?A$Qc{=el{BV^aglIIf7PJn#&LCx zv2(E(d~h^&GM05?=TxkU*c-8}>(DknBGoJIKUN2kV+8hrj*TKNgMc)~F2~-*$hxVz zaN`n)w^1@<(Jl0ub)z}#c|@6p2*0y*I_LS1N^=K_j*^Hw0{OC z_3*~}+iz^RYi{XPZCE^KO)N(6EZYt-k`sF;Q2~bYRrf~TjBfmli)0VcAKS&eSFGLA z6J8Is%yQithHKW`uUMmpoLTcF#Tv!$U4+fDeX5#b9Icvi)?kVej*7jW_I1m}Y<6en5@nf%t;snJ+b5QfED`&f0rhyrC;$Ojq2#R~6c;3h7BY zhH%8~U8+h|%)VcnLb2%(a;p}P{j3V9&Z;4btNB&)`kb0qWU}peAM#gvs&heK=YlJ- zcRTIZXob&!N@azY_8`8*dS)QESoHg8p?605SuO9R!Y+%Xp*)XK3QBtKpcN2h%>ezG z;J8>8L;u)Gt3C5z{bo@WCBf}%Dd~$hJfE2Ri8TFb2k2Af-F+@%r;*#E z3Nsd6M-OV}Yunh*g>R2RJzPA?oa#4hm#BORAX7f@q0Qbj2bxenhjCMiOf8~bwTQ6S z_QkduQ(YDjOMlZ_kjSL`KcXam+2&+8x|L-D)zU-+YXgi>9;uVkeosdwDk&z!vQ5O6 z--HWqqCUD|a|#Co&h!dDa!$x^s*!QFp*Fprj+lG#|o#yKQ+ zdObgl_-OqwZohJv-b0x=YF+=gzUi@-wl4s#oVBdZR$jTRE)WSipRyOt$>kB`4i zW%AjOSN_b9{(jBv@cJS_89e0v0Xo&HJLOwoDGgRnJ3A5HtQa?H4h>FTCMAwm5A&h- zD~VZe+jxzO%t#DlS$IMsLyv2$ezRmyHclakc5F@#r zQRzH+NPCg)*`@){zD4_&Vy5C5V+`Y2i~(`6Pj`zkI+pc`da||-lPof4IUVci^oD{| z&TW4hu%J>jv_l-Ea}K?XxE`kV*G(^BigA#N(yQ2_*e`y{KZ(%_Up+niTvx{yyk4C# zEPvH++-Wzu21z`&b<;ZMBV&{;R+)qPf<9Dt>Q~ALCZbiK4qgF>HO;`dx}|A}P*1Y| z*Nd7;^LE|e8|>Xzx2FVvI)DH2V{Kmq$??aU9~C(ZzK!Rnn5OgQEd00N+i!lFX)-uj zxW-%XH8}re(@cW!%{G6J=`N62xW-$`L6@8Ia7nx!7v0N&(G?dY{&rj$5?_p4mc;Lr z_z@DHBk>m`-X-y2iN6EDGZMd5;yWb%rxKqHdK9iPxW?i-Bk@fV@0R!nB>oABe^BD1 z62C>__e%T^B>pLhe_G;yB=OHm{7)o)zr?>G@dqUSpu}&N_-=`RSmGa%_&pNeCGlq^ z{vC<;N&GJ*-Y@a*NqmdM2PJ-u#IKY1^%B29;x|kDe@Xm962DF2zb)~PN&Gp9e^=sv zEAcyE&2C(+xE%1Z6;~&&-MC)CbsE<`Qvm{(g$U&!0*g)fy`7c6h)7;GP2`hAE1xY+ z!0%70_&$mMRN}8l{8fqXmn`@N0irjNMXysRu{cb#go{FkrP)--+Xb_bYq7MN@`St$ zOQ)$qC@d7lzr#MC77phNhi3^t%MczFvMjqzB`~K+7~d^CF60Tzg&JY}INUA?Q-lKH zNP*Ck1>7u5Din?^6pr9CA9R*bqWrfA*6EggsDgc_`A{$k*9r^~rU_L-PpVOE=nduU0C=SBHFA74>L}gl+5}(p)nsk78V*%yE|qz zBk#=068K<^fRkAuHi2M>LLQY%|47e(cq3kl>di>mw^gH=?%%J!{`z}$&**YO8t-o>Wah!%4XuS|mlI(@BDOuxa}&L? zVraR~km}93g}$zcoEquv5Ht*UN_s>EMHpveLHa-2KJ3?kJrUFSK2 zz%Ny;8#zTyzj*aMpHGEis;(s6cDiPZMg0Bs+gsChTW%CpIm`PLRm^55eskyOsZ>pm zre(RPURe1#p04T>vpUzm_sse9BAXjiCwj*vK58hMiUZP@ZAoYBU|oE~>G-p(T~Oc@u)oW#Ay!0cu95%?D{< z{+y_&T(&5Sk+Q@`$#K!(mLXdaz1)Z9bweA8WkE0S7kH?Lr?ebjiNuv3LLAU^1KTU(ux{If^W%4 zu0Iz9+qq$w-_xJSiRrB)7_i?*Y>^l1RmHtoF8?zE9bTX> ztBD5WDtaubze$C--R$3wA3dLU_?pw(q7v-b@4)3m* zb&&7RL;W%RydKduui#R~+ktd#g>07+MabtKE7`0d(?5=|PwSm_W)E@|f_Ee0kY6P$ zLO}%QOPdhzxy&rukYCp!;=^^pLhh(uA!s^TW=O@>fLzdeXtH|U%@zkVa4WC z>DBX7aT_*8*ahk(v~fGtDAHR;$1MSKTOJLf>I1IGH31i5{qtjYA315J698?-=7hed38dprl#r@pzL8 zLAf0ng;SJjOvaX_Fg2WZ#LA38o>m~bCSDV}FQW5YcvlW~4KrbXgb*0Vg_2^5$KhP( z9@owxqj6|}=X4MTli3HRvmJf=LH9&YOp@Tt1q#7_Va8=5W-I^4M}NF7-Co`sfo1iJ zAS##C@;Qlbc<$X(AI0iZcvjYXk+o_*S+I|AI4D7^Ske$y>c${X<+z@?%LXmW?u8aCzMqe{j;o0e z_Q5vA!4Pc7evU7R7H}K25cK5$Z1vfVH!Xp|@j>f70o)D6-ENqhVp1HlymR)Se%x6O zVtF?g@eYDeQM@DL84iayO;sVCpv=FA6i9g=#oSVV4~QgR79WJzcGc(vrrS0(=^a=6 zsWRE{@FVD~G9GGdR|@p~1IU7?Dr3R=p<=)$#O1%4pMjxaGp3LM4lk3D(9neTT=9&k zruoCjT>U37q5Kq)i{|#P)2iQ(04T|!L@c>|o9#4zW(WB+n^GZ^+pmJysasE=E&PWd>m?ZCET0KX}QM{?W{n-ZQC?S%(_M5Dda7# z;3YIX_dSN-vUxzWnS_30d-3Y9WmF zcfN4yEzw+;zZ<=h#8Zn?4$i*)-XA4-k!hV9xXN=PyvExuO*L6c`TO&?p5PLP5P>}! zYLHV5c-X3euKQ3YObn|7{rA~_IP{ftBl^$ZfA4*FoR^~hF9`*5$IN3t6r`y8Js>DW zOK-rdp<$iepbD>%qMmo)tDseS30?~=J9B^;k)qC-d>=?~cfT2vxG_q0&4`i=Z}pEL0Y{CU1{cT$;Snu-}xu%b-BB;JEh7Q4OWl{8?Ag#gFE|UbwjY&};(!r;fknMqE zt2;Y_NuEumNauNJnl=Y&2x;i7U(+`4SSKwDM8@&s?(i1USq;P6oZ<6NjY(S|9EWxV z-LW`zd+jY***a&X2>YLQ2F(QDn@>aQ4W>#lkPONSPuG={ zA|<8jP^tcp5(Y|ngefTOdaq*Du3~izWDPsAy5?7`tTYzLK9u35WRQD6Ryt)9UggOX1| zp^o}#`k+1G+ROBeTb}`257=P`Ti{z1358>TK5C|jg>p`Z1Arjnn1?OHfep8nQ0l1sb)AXATtFFwNLaRl8 z63Gtx+csNDU_`7kWz=7~bm_h?Y(Z9b`_gTA_xytJe2fzEI$ZcW2lqEjkyiWv|NeO_ z5P+IM$ahW4mooMTX4{*mr=f=ue|A!`)Kqewtej^ng=y>``o3l!h7%(h;;%Y{>?ppo z{c!IG*Us+9+yjHN^F;+f){rPCxTY(0K@3LdY!|9P-hesR$RiVc?@ ze+LE>Puu+6b6}6jljoB=cY#r0Ma9C5BVelcee5`f9rZ6x{sPi!s`mmK?tKtp8*UCo z-Utwg#L>??qg`3WBcq_fhl0j@pkv?Sah&|shj4Ci&W_CK(#)^czqsT5BD-`HbKh~? z*^p^ubG*}+5l}s6X)x--)DaYD`{V69Zr?o&K0zZ+;&jDkn8dQ-?zzK9u*)*;Tykge zcffkp!*DHm`)*6ZL7=~K+!2s(J`u1??{UxWx#FZrJL#d(3fkEnHtmduR#i!h*feyk zISWiGRMKi(mt*MF0vR?h>pKWMd-|-eA$DKL;@RIsd_1d~1CA+Wh9Jg5I~v=JijU!w z6KKWBaWKrlwck5IzX(GtMeRJqWb=lTJrFzw-t9&y@Cc$m0G{jA!_a_!bHTPJ|9dyM z5tP9|>2hUWs)EPTxV6x*`R8w&n_Pz=of~;sAYmFHlm^;qRe-@AuLkq#7Z^Rm=oc9M z5~GaKuP_>7G|cF;jCM0>F#7L|-p}X*j6Te$%;@WkKEddZ7@cDD8AduwhMnL zgoT#l;kH0n5QP@u{7u4(;c!=At?;j#L8~poTbqRc*d+X-LEu6+bo2?!L&Azyc)CVt zX$?nVj$ej^_HZ~Bs0;T81R)v-g@*%8W^bc_y&PH`=IvY|MCZ z?LI1mgesv0R=E$Z24NK_+Y~+&sH2AhOK5GN74Fd05Eg>a3NH|jkfYT?BN0XdLerxH z`E+CBe%K?)dx2)W)dt(}wjkJrw}rtd-j)X8dw5jUo#&jHBqzg=1Pn1u10*~GggDD9%3AA}$4nr8K|>}1k%wMp?o37}GsB%b zA)wWvfCVpUeSbhxi>_E#_jCR1f`P7n(fGpJ7AaNi`k?g%hAO(+1{cZxe)lzZCSmRF z*FQIU=ic*szt6dsX@rdLnoUUGHt%Jw)B|ONjrG*|S{j5%q)`$&#rsL_71Fp2kUJ3U z^j5IT?D0I0;CF|keq6D57FAqGAe;npeH#<9*hxq*ukD(3H;R7wmQS8I9n7nb#Ui2* z{d&qz#b9nimcr4{fjKw-Ea<3!uA*WUTLnznYCMCr# z6w7Oy!LNqSxXL$HUDZjFu(2T`o%`v}CK?10Y4u}|U#YL^5}~^$9_tN_(Z~aVRxx;Q z@eSV4MY=6@(T(12zZl1esDj7TdSX#ggK3(YV*;=xw4kn9QL+wX*J(z3-)%b@a@MvA z;e>_7AIO8OHATY^19)B$js{{I68OxQiiv~}61Bx*Nr-oZ{n`RjBTKOeEP`X&fJI*~ z{?0!yhOnmrZU|^N6m5$YUh(XEp^L4U1|eFPlw-c|Cb1Zi6S9!t1fV7$YElMDtqLI= z712*1xfn@GGe{&+kVP$hF2qhAiPiknXeJ@ev<#YLLXLITMZk6_9H@_aF&LA?DM&cw z0)#EGL>LoOjzncvB99mZb6ccX93+LsLPo2MaB$tW^b zL<7?iSCN5>`EP0!;}O9xdf>4k5*DNKOeFh`m29ynYp83aa3~zDL4piBO@dbF?Mo4z zksCy7mErA{K||s)B*};cka)zduwO(%v0Gk*6dBpOIwpsMVZVT}^dL5)GFn9;;FBS} zS0O4R7d}yL5hPGsFZgc?NwH)!umXuP%Ffpj+o0RH5|MMP{k2dTB7;%6AiAr=7ucPsdM#(H$PhmmRaB)NeDG{V%xupxQnbf zZ&X+p5d*(MM6ngo7>Pl?qM_FiQ!yF_%gz^u;NtlFHIfyYWH__Lz!3yaFoCV&`XrRS z+JkRpDgD4lmoyO;egyBXNosFP({`w za=evii5L!b$U%f>IKMoc2t)1?h)6pR(%PU2y_rz72cYW#>JQ{J#-vUd^e_k-)TyW* z7TgW$jD;8por&MN|GE=;*otn!3fAV;>xhLCvoM1KExJb$H>1txhs`7c^<&*R0yhGO zHjZ%G?4Nwai=nBblj5A#OE_@==_*I3!~I58rI*6fNP7YGCT&x6d05=ghoqB76|02; zM!_$UX40rM>Q)5~K8qw}qmt-Dz8@*Z)WzcweFlD9di@??u|V9~STTz=0EY+I0n+kYgs2!9{Q2G~ zC_`QR=H^@1gGHKj)uKFgG~j6iOD)zJhm%cIc5CyiRSbn;58QZEn0r10y<8uotzs0q z_;-lL8Dem+kYMJh`^6jCoXe7;w6O^`At?yk;+u#rvv6uVzM2&62znx$!Y2epJUyFv z_zWq=x3!2;0*poDwd2oVMI-pi;h5DfhcV)z{5C1v*@~U&ec??J&yC?udz)!j}|-?lL>CN>p(J`7p))M>r? z%!b(~gD@G?ZuHba*F>SYV5^ z1)@u=Xoxuo$MJhL;wD&eog$#T-C?CBP86O`Zjn=PSkY?;Rv3x4#&1Vta>_v5~8g2@3(c7IL!4Q~-Fv~3xzzT979dB?i~R_T|#D`5pL>2GmyktN}i&Pb4!nc!#T{+!VmofMJMp8{`GAlF*eq`6^Mu1tW z^!vC>*W3<`!%`lE+{OH}uzxI{b=(;PCq-`Qa}|;1UPo1h9m+XaLaIo4E*wwbZKZ@b zh`*OkvgHv{R8=@j9ZYGb-OvH(c#3qPjP>^I?z9kIkpo+CQY;~rxgcYq z#E`!t-wa%kRGk5D#b`j3N(f`+c`!OV;k#3il%FiOf#cvcSb9w)0A(5^dV1a%@+_+{fcU+_JdmYG5=DQ`dP_#F#uAL=enXs7 z{r(u!v?%4I}yZD zPyqzLHV7Q)x+jjJd4PJ|K;@~Ld@Z1>4&c8x;JK=<`JieUfZsB}MW9qBpOZdA(0LHd&?DgplKC^$CH74^HRkVS;BdSb7>KGv> z;QIf+zdZtZqy-|@uSQLqGB3b0CB|%d1y+oVm?*CS*hVaK$Pe8T!mPu8J6C zQrJm}YH0R^n505SG_f`orl`mZ&Vmc@Y6Bqaz=!pd`G=6aEGnbw8cAj~LN6S+^BwRl z^$C-56IfIvr=1Y>z{K(d0B(10+p7zN^7&S#A7===XDjn;HYvtX4YJ!tP9MT z#y(KZBwkHr`+}o`>?vwt(jHUYD~LQ!X=$!kZZ|~?jz#h2QW*dNyqcwjm?-eP@ZRT@ z+f9YrAHc9(zjoC?yK;I#e|yIQh(Ta@ZeU0GL3p1hhnB!kUpM?{miJ$`a%EsgQOD%~ z88`($WN>KB^O!4`IKwmH-f;P99~`__`(jDSFRs>(+^aJWw(yUjD*ZU1UkYDK%GZhI zu`W@P!T~V~FyC_J_=3METOweaQZ#&bHRMW}00_;Bt^M-kEaZ^~O{{We@R}^_|AMvn z;H@C(&|diII|4siT3&(x!Q%hwBYfJzf6an_?+U^jYf=(HmQOjZXl1Dzo9c#9tf~Y5 zN|Y^Fw>x%W2wqNgz%Twmo;4mdUk7slbR+!Nlsvo4x5GPx2|NR_(h{h6hcI|UK-ANI zM&ZND$`tRJp7wK^Pu`)z11ZdYHI>H5>!4oNo>~mdJ>JtT$f~MV22jL8jQ44%tC_-$M8?EYj|v@id@! zc)vu4c3T}v_3gw^B&UP0|ItF__+YN${ZhGhQIGcnF!zL^U4h46A-8Go2S``D5Cc@* z)BbjPRi@xd^D^y=<;m!Vz38|1OVxV4DkL2 zUqMoj_n10*RE8d}mM&fF`>T`>*9`nU>k#@LO9;vlgPnrlYSmMCV2fHDOtPPUCHY;w z?zZ*IQ+nEmlr1=1b&rOOlG^h9b0ld@t}VDPVN5$r=Y9ynd-Ql_`E_#D%9U$y27x8Z zl`k}7;-eUoD_;cWlqqjmOc)%COY9ddWbNmaT+KFkdP#jUZP=jNkP*`}YgcKyp@)Fs zxT1#~P4psr0LOofqA6q@>$uh`)|hk70`^?>$N-`i@D#|=v$ z>H*^!`p|n$N#R`3$njJ#;1lG3S`aUgjqg&NH= z9Gs|*_6LEVDA3WG22~ww66xc! zda1$&#lK|?Dz9MDt+T|OeX2agNYRjz>V^O>II0RCIY9>Jr~yY&YG$|esS{r=)Ws<6 z+7!~*jbZU~s!r=ec!XCmSxxmmBn!s{Zl^{&Q^|=PBu|BF=HQ~jr)#i42OF%L&~QsN zY@%}w+{}@<;)Cab>kys``W`j3E4WL7Nq^UEQa_f=0I^ze4dbRq%=W5=g?SJe*m4OX z=|Jc2ZNv#L^z<>uQl-e38w{|p5(NMQ;E~@oECHXET2^+ooOW<}H>W2!{S&7jaQYFab-=uY(?(9O;`CNd*K&FTrvXk=oc@5*t(@M@ z=^dQzxGA@?BOzJjjaH*mBZ!0i@98=oRvN4 zY_e77;twk>2$te7ojF4kl#1C#?V<|=|^B|HXzY(9`hb+Tf%p1A;C#LB@S7hA?k z*qIVGeLlcktg?vB0`L>gB*;qI7J-oI?2!`o#S&NnPD7VCH`^w|$Gau$k;&|lV)jKb zt8&5G!1mb6SalKYv0cR;EoYCq;7LOjJ9mTJ-DtC|6s~f%nW3SNFt@|jU(B9&u(`#~ zeGvbBK)25}6%22r7_Wu%+4NTJsT!GWJpi0vO#k9wLk@OnGkAF^cnDGo*bC)sn;MeI z%`5368D^~l;+r6aEC|~Ihh?+&av!Ha#t=J zPgtjo6`!(^drC{!*a#!}_9WiM+IQn^oP8hOCfN7mZH67bQ7|&wUW2zw>`i!^XK%+_ VjeRrTzGv^jTb+Fp-kR*fe*?GLC(r-@ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DASQLEditor.dcu b/internal/4.10.0.10/1/Lib/D11/DASQLEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..26cd6a452e9cead4dd37f51daff9c427f8fea9c8 GIT binary patch literal 9245 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DASQLFrame.dcu b/internal/4.10.0.10/1/Lib/D11/DASQLFrame.dcu new file mode 100644 index 0000000000000000000000000000000000000000..6aa5df337e0da53505c505be75fca6a809eef49a GIT binary patch literal 6705 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 HzeD&hys9-N literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DASQLGeneratorFrame.dcu b/internal/4.10.0.10/1/Lib/D11/DASQLGeneratorFrame.dcu new file mode 100644 index 0000000000000000000000000000000000000000..32afc8fcde1515ea3055936f0ccd6d4756088fec GIT binary patch literal 20085 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DASQLMonitor.dcu b/internal/4.10.0.10/1/Lib/D11/DASQLMonitor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..4ae728e5ae0f0c9e42bdd2121327362b4b5d39f4 GIT binary patch literal 25138 zcmdsf4|r77weOyjGczZ{A(_OG28whN2@MoeAOWdGUP3Z~U;-h3_@knZ$@~fC?_`3c zijD><$uU;i(uzeZx2?6krLAqHz-#YK1x4S}UbSkmq8BW^4Gq%R54njK$os8*&OUQy z7_oZo_ucQ&9{1UMt-aRTYp=c5+IyeL6^v!hyM?iRTfJ9(dhE?Rn534M)~%|lZf|Rj zw1>aJJ`vXd4L))!w?YFfpU;DcY z0cT}f#2@sBQ+EcQ3Mgg1a8q-euch+EmYinxphxZcfG67rRzpWC~d~J>X zUlJfo04l8Q)@Xmm}rYz(Of35r1wE<^Mdo!Uu z{MVcv0cA~lxQT|oW59nlsFYN8m9_Y~y1w?Q2X_ZE1S8(G!q@75jQA@hRnS{$S8)5} zS9S%{d95Pc-l{9JwrXrzFqJo!`64S$-rVuD(W9&-e8Ug_d2ukUL?31aX|bh;W7sQv zEnWUDQlwhK*_DO;zKH+NlUE-MW|mx})30RrUW@i6{y=-!U+y<`eL$}J=io%00&i~b zIrsFj`-4hpS66ee&ELfE4+wk&;jpgLUmxm;M<0IQphe?fgVyKwzPJWW^h!;{rs=J_H-bDhSro#nhC+1w(l~MI{1J-? znI+{tZ5+XD=W0tc+sk0P;Zfi2wL;mx2*)sIqKH>z@22JmAC;>Fwi4jouI%4;1Jq8! z*0*yznV$9BVaUued|i=SOJ06Fc$qP6rENXlO^yBzGHp(CLP>dhn_q9EhJZ{qwPM>? zh9J@2(X;rmo?iu0YiQ94Lkv#Pr=h8-)*twK*3Dknk{G5wcB0nUu}Q&u zL!`N-3$v&|y!!TK{!QN8Po0m|s`{nV!PNS2b8BsLFck3~`n}%(VtnsbT=t`2YB?;c zz8%%Rmw(hB1K#)E8{I)iMSHl_7x~KNv;GyVxheX=E#RszYj5qqK-(g{rJoK2CltmS z0+Ysm8T@ptURdrAG`IO{!tEXYaHQGaHRzjjA^0f^!ix4tbD+7=M@oE#fLRt`t>4#F z7lDk=5+u_C!R*sAe1Y00TiP2snt)#G4>os2!aXl1f>--mnstOW^!^=zCs}&02{%Vz z(xC8KV$W6G{%{ZUtUHz86L_kn=SA!9SRzK9FW@i3GB-`;uY{3RU*ivVL0D+BP+yw$ z?SIa#=)`C*f(%o8hJ~x{8r}k-KuTfJ{AWvEUmKjz*oF0uB@X{y{g>B36H&O-A1Q0^Zj0Qz;!RH+$EtQ;lfUU{bZBgn%9p_S(khz$ zElu@39e$dSu35jj{0W$d+4$*{AHpO95!e_c_~wtk|3Gj;AX3r1$=^ig|2j3Ofk@1k z9Ho}a>T7&qUn|MMUx@q{SDpVGD4TV==ZU_cvm;X3*3lig`?()a4JsXxmE954woq-N z0n(f9H4tk3T?jAzRC5F(WdA=QhL{Jzu(XS>isn}T5^xNadr-%i%euo|?cvu5>O`-eh`(!}fx6lk=Jo%LI#w5YfvFGbbeDE? zv>5B5zB$t3|HHKpT!rOczNECV(ceW2FtxtCluO(7>)U1y1um;E>+XuQx0aV8*0$*r zctv@^TLHyeUg`~p+r!^_XzH1OB6=+jJenSGo1KU+R@2zP>sJOdu#^p2M)OhMFYgMd zW-GFgl&4&|!HF?MH2uepp)jmONJX<&iKOH0Z!V6~A~7feks!70w{?{U0+7?+boJYx z*&p`>fVhYPZqc4J6XG+Z2|vWepxU$G18&0b&l13 z-`x)d)kp^q%e*CwmOy&FA!;>d%op^3Gjz{rFqPI6pP<*OGCv?vlfSV$;vXVZRBOWi4qw>+HdPfO-P+n5IZ8DbDY>QP7GLA7 z|4wy>KT-`&@8Z4DufWvIxKZoh2=C)B-tLa3H2R&TSo|CPYiUuJwKu?lG)J1@Fu&w~ z$cNk|wXPc$=*RNE`Ey%N2i3B6ibXnte9d2bg6^_*-64ro?7}qn?}AxnRdr?cYj3Jt zQB%9J?4~+z?P_oBPd5K~ZtyY#Qnj+Iw8{YN1E6t!T)rD+H|@Ls-=xO*W-co?&X0w{ zO^x#{vG7X(nW3t`aX$A^d(mjFuw%fFEv6HV^Dj26bB*&8?Z_rI<~w<82uJ!Ei4Wf= zhEVy>a7m6238qU*3Y^Q|L6X4Bp-^!3&5izkrs<7tLL=MhXZPzZnIxRPTKd^`y)A2&inY&|RYi+0 zxQ)Gk`TH}FrYf z1mKEA-_LH*n`I)Q`;>m>*V`QVsjcmLF5T46LVBYzD@`oJl{`n=#{PKj$nIsc%+;wk zL$vQU|GZ=QtO@li+aL#D#@krB9Qs?;tV|3dCL6b`ZS2~A9s17|GqU1*pdo#f&GMd? zYuK!qSB`bx#+G(|=I6DZjJi2=LYtrT^}))u6}H=21`WqFkSyyDwmW{=BhEH~9` z&t@LQdMa6^|rObORD`CSuTWMuv@URl8u)Ah%cRH*xqDEt2Q;%nJxM#^=yxpJMqC6LW( zUAeZxY<7bq*HOCiwl;s5XK}3W`*)y(h{ZCxYR*b_+qp zAP6E}L1bDoB9PBmy;1gcqH}jje~eCzVo_>C55 z1(yoG)06Q}Dl*0&U6+B*cSJ3oVz&)||~$)>x2qr3e|L?4L+Ho5L!eE2dZ_PodyM zyVq>C$W-$T=5Rv~yM?exU7+C66=mPy>P@*kS4>}k)r<dcHbp--;Ht0W;KZFd=y>TtiY;smnV)hIrbMW$;QmCqU+0u^bP{XWVEMk-Z$VSdIq^K6bv4%@#N;c>|I@ zI9YDvbvT=FjK&-GkVmGi1^^=vxl)K+@F5~wlE8ivIwMYKM>3(w`G26$GuVQhk1KSi z5cb%ujZstcRGD+8?xdUx&xe zkHd|vonO#PY9I}5i4?y?6c@%3gjAh^O43bQX_J2W)XKx#?L=WTUIEZ4d?_74^ax5x z$0rVE>ToUNYl*Tuh*qYR7RziA{$jMwHDK%1KOr2J^%xH#|8@Fn!3f?n7iT)7t1i zUX~sq%V&~Bmz8aneD&^syfiz7G)Z0F$~JK`5@mOhFz?3sDTStlC(E(SpP%kd6y3OO z&0uQ$Eb+WQVU}WMWNU_*jd;kG5m>PIqO;!pmy~mvuglzFK0G8ULgCAwL5uF){5%C?-H|gw^h5U`Tig>e$2xM6a5cBs00hNE%)chs>Wk;0J z7cA_C+y|~>jgLqL2^W00B48{pS0Uhqawaj{fSk9TPbn*vq!%Q%TPkN+=Tnx?kzWF+ zyllWGos`(C(lVx?wOD!wt;?2`+T8C-%yZoa5lS5(lq=W!H$@x_mlrZ!PB~aPYh22d z_as)!P%>8ggOrLU<-Eic4=c5eNekbSXRz7M3VoQ2DL3!3O;mJOHhV&adCi5J_=;Pw zJr*FP!ib)XEf4InO%m!mhTz)i}6hpgglLdG}g-BKClPqP!F5Be-lv*M32F6?+ zyKK1v;9h}iSnK^PI&OkT5^z_Ad2Pm6vCX#2Hq!tVrkV)@W2bjGw(YWADL}ZG5eWcb zy9qW|P@GT^yBcG1RW3-*7yTT%MGeZ1cbpGmuPxdqSgeJ~r{5#sH3FC>Ms1{ga*p2t zc&UK9FG}I$DV>Dj6&R{DJp=t761Y-8(}e2ulnd~!1g{qGR5L>XXb*u_36N^d2>^YS zpbY}*iunw{_B#PvCtx6Icv^sZ2((^+CRiLFfIA836F~Gcq6I+f2;>(ar;!2xFh+7T z3qX2890x)w^=uUglafYQpyd-o{R;7g*_nkl5SGd1HjILm;?g2*zE8JUxTvW~aa~<+bb( z_*=75I3A1QE?= zcG>m_mnRgoZia6R8u+*4_^G@$4(0&0@<20Lh`Xz$?T0osb zqj|GV65uxipqLx^yxBGxkf#O2Wzk?>;bek6CtyyYxxCYJ3GjjdOpMo9-sw^Tza+q} zSTtpMr;j_Ku~!9*uD^MbXI^XM%~>bkzsvTzz{n679F1R1 zr@@jU-ZMa-cj!0mgHrbVl#CSY8w|i4r*UOIC|&TT%(d^boi`wJ9Yze3lndzy+0lv0 z4hKqUmksGYzk{FavP4L!LPyI`G7xFmp2;|}7I;n(E~Vu<(j;X!(VB*xgTS%#sKcZx z9b>*SpU7~|2+9UlBhmo0BJO8g^sR=2t*{?RznfSCvW1ZXTLf~z^3 zbbP^Z*Q50tlu0Sfo7zC@wi9c^vVd z5~YwJT+W0Ke7K|ppnv9vMsZ&kSwATOYK*97h@33ui>ReRQ`vRXDF(Z7_%j=%QzAe8y~M*t&M1JZG9u+)t=ENfdU(%|7;nIWNBZ1 z5p&9`{69rUhCPW$=~~4cD~5LP#_JC@Xs7NzGSx@?>-lL7G1T2yjt{fZOyks0UKF*@0 zSTm zCcFjumd<@(y8ul*VeNU$JvUhQg`alY(_8b@Rm0s>6}2*SM2D)dJn1E;hUgH zypylJ72dyYwa)Vo+6eeP!zHw*qb2KJr80x_6Jf-ppK|p0< zKLKMCquW3;^#8;7QZc?*3W|5_RPUiP7+ldCee2KlRiEi=809mlZFbWn{v7z0N!&UZ zDTdl}w1%wOHJHN&wN|5v8`W~g>q>@K=ZEKkPzP`#qls5S*lW zvuZT&xf+97!rUD|w}dq{VoaM`UsN=2B6-G`RF7J{wbNX@X>ofX~~(8F3Jri{2ihiTrSyXnWfLNzq3!3rB9X7XSEo)(-`E9 zG^FL(JLk14dFe`Y?6%jvk=M7Pm%kynfv}I8bt*%n$q`110>e;t@oo~+_j^$G0EXzDdgdh&)7vXuOh>2 zMb96iatP1Mc6Wt z+Pams)Wq8e{#iVj>s35RoTGF^+pHL|tYXF1vv+*HqW6m|az*d|Vv$MXS0UjTFVYTM zl$5F+)-K~?>pdv1=zbY1d7a@hR_&*BgUqP1du-Lc)#u2Ez?8I6GNvzry)Y(ibulL~ zP<>8&O*=eZb2Gx=K$&bbj_Qp~@YVxmdRjC9-_0>YTEm%vGL>V7YCv;*V{vFL$^q|C zjaDZ2d5>vjN}u<{fcMz`CbS>Gqfe>UFodwmdyaRX8t@*e+1CLe@1Yt!?nvlyWWamW z=y8-Lh%A-YHO#qJm(85TCFl&Y94`7nETeuZ<}3!hXJRTfrurFZlA=3wNDCNq%F6agA@u=2h`snEb_6AcaP`^sKs!~R&+mQ zD(W|21wtIz7`}*-WI{A9o_kJo>5j<=Mtbh-HOI0>w;v-J7U>i16)0rK5_yBgU%0JO zgsJN#l`$4c)7GnX$O7xeIW~fy!iokD)*-1qcwj0pxQILnC821aOJ_gg$99I-G(6_Z z4WTnYXd0i_)R%X*q{yAVWe@5h6`CF2sDyG*id>H}_l9$pw7vTrIMU!bN4S%i`0%xg zwwLxH!#RlnyS8!8uvBywIrW0^qR{jYVl`@Ig@|V{=Zi-q0Ik+M3;(l z`ec#8dJyVJN1(-~#fxACL1Yh`mN#KpHNS}z~7R5W<~L2~AdrY@P2 z>8l+@JUQZu?Jo>MM=gYo3PPbd zoZvZl!vhpQbnEgSt65zK_oa(DVo(qC-nE=Xs!6zIoYNFq$R>f&n9CZT0GogZ;ln$_uhu_G4d^LvAQ zp!arI&$SqmE#l?8a@NF1Sd9l8s!?M@MYeO4Y-eH2cF2y)s>bVLw)02m26!nJv^r=Vfss)k@@IIGAqUDc3jX5^~wAa8IR z5v>tKiBIHmN{5@!G~VqFb)X~^)93&ks3wyVj_p|J4vveg>qHDqYdCRf$3{E{xHA!i zjtD}bZJZz+o5e0P?@`mSVNj>y9NRTCl!d~vor)2#j++d@`Cee}6svt*Z zW`am$;vAWUoRN44M}`vs-5*)c0LbQqFB9hi!Vax5m3EJ!J<-RRd59(7rh~JKOfRw- zX6K3A7CK7QHikkYRPN;);cA|Cb5o)D!x@M{%$Nq?5GLx&)G6w&S{0@~_OoW3&& zf8qwa#*_T`Xz+i4PZk4R>LJ6>6diG4|4d0Rjg{7|@u?v9+th{y!%Fac{4rCK_CI&b zDx`~jb;yU!b#bY2)2+b8bG;FBT@vZwsW{E`iH|?-4K|)GXupkR9eTE4OtK@{B$EYR zdXi~AX)W;I8)B#*Hot%0ILU-R=KOAu{$b-(AeH__z$ZDU|DCa>{KLjd`=naquN=^5 zFPc~En2b~_3RJ^%^@M~{tw=f2EG4p-ws9-u178OY_e)5&B;5t+xY}wtF8i3cAw@UD z`268s^iMpLrDKbO!v6TTvJezLg|?dSYVYG*#3Ih}vt{!n5(?~75fO9{-3%x-JZUo; za19XGpyx#DhEyz^-|I;Y9Gr1nqMx@BKYk@d=UciWqPNdy>08M~YAHAv{^F7Jt-nTP zgRTRvh%JNZTYf;JDqG0wHGJo{!M=fo&>Dx>tw;Ld%|ZibDOdH-Rnj7`qysK+X)#Ms>ETNE(Jq7v`)>a-(57o@&ODg@C*<5zL~wAiq?8$m)J zRqyQ!S!AZMC9e@B86C#f0yJZ6IPAyRaLZuaq4@z4+7!nZ+@6xj^?IOh?Oa2M4GcGp zq}iuU8Mdu1rn|88t@ohm>eX{1o3*F5Rm?eC0aMGu&Oa5qPn=%P!PcC=0J}(ztc~7@ zRkEBezq-?{hOw<;k&ujz)GA8&5PI({VUg)H)ecOxIJ~LRDoXT`4J!iE9OLtRjQWk2 zplFPB=ter?HsUWdyRBhdH{reJsIWsA-&R({*K(V&Z1@2@jf1}wqgBQTZog;*Wf*~R z(?;ii#t3fLM{tH4E6k0L3kQC&5g3@}2x!e%ERA;%BjC537(wr$LF345Fm|a#2MJm? zzf^k198vFGCD;Kzh&tA|hC{d!gjo) zecnUQc%PjBvHQHwKjVFI!a&0ze%`i^&W5;T0}X=)4b3~qTl&01xN9Z+Owv$BPD| zAza^oYM|kH155KhZvajWEBok50Q%ItIY#41(OIleO<#pu2l3ee)o`;+A_Ff4 zW1cTHr3>{bCDX^u7%?qp+&em6eWrU)QWtq8x(s+fcz$RTM*omjXb1V_eEJTYLh~x0 z8zTk0{$TpvnquBU0g+ZlKDy~EW1O^vRbgZevr#dY+vxg(y;l;@*5xc3{0_YxY<)A8 zsrWgA?FDH8p1-L0HG}OXsQ~YaiXSxCPD)qfxlhIK8Eo%Jv+=H|_(_8ezeuw=6q}-O z%rUf#NjZ2F+j+@@(rvq6vHg=`%T{cUDz+TOHbt>bRczA~{81yt_FcvHfMR=0vAyF| zY+qGuUsr73P;3t>wucnkF2(kUg1?`n*!*D7i6`H#;OFuRegdu7#_(jIZ6=;ES+Si2 zo(<(>JnQf@kAk;iA+7Y&Ab+ku5)Ewp2JxnmtvT<3=S7zyj&cY`o@3^QNH4mWtg{ zu_`TCq0UF;>OAT3Yz!d_&k|{eBU@UuSoNmhuTM?kwFW6i`f0XQlBTXoS&YA_R4+xR zNR{?Ny_klUYUHsT_nCtDQjY)KNQi)K2>}w3w)!25N=6J*5PHXy_3$J=itdwU&8xwydTH=$rM~0$su(zp1JZAsnnsWrSd#!l_N`C zC+9)Ivs3nENriLpHeFiomhN%mjq6|?&`HkaYO}0LPtC(bxTM0&q=i&`kJ=;8!aPlp zim3qRViak3*5c7;@ZvH}dU2|>WezarNMClN0Ow2;=uTay>n;4%5RRiz2VJ;dsC{yQ zRJ=@@mn{`eS9i-x@W)6z(u!G9q5gjt>TW!9@MKASa<){HgV(%R)g#qrODm?J0m^hs z_4w};X|+y%oBE`@2!C$`qnaxHY?^JNG19Bm40|5_0>&&nZaid+dD5NJqY)>KE*)T4`U7KlLz0de3Es8H&07VB73q>3qcb4fSPK>-5&5?+6r+uoGbF5hf2tpN0JDt=SuUG_A@Wwe4hj`AvRd-^{J1^qA z5N%jN5W678e}>*T6@{DknKw-$X?DizVW%Oajs+14rFGB)#{xlmOBCaI^*MV1{?G!c zJ`bfE&vej6=ULEgv9!lg#lf`DZdQ*2`M8069LUGxkzWNefeAUJjsbbhKpq3~m=$@3 zwBK39!Gye8&2SXJ$?9TcIACQCix@gGfeHCWbtaH!8ptz&Jo92?0_(`7j%l`1j$DWm z)8WCuvZOJ`5>)k7u|Qqrm}*;1eY^w7@z0U>9ryB#y|WAsf) z5qDb=_c$tSdmL-Agr}ga!Q+y)Wl8z))PZdN{}pKClqtHjsINMT@%!u=-r-f~QDCk{ ztFFERb$@%vSTACHN)r)qK@wOQTb` z6Udg{zYbiph_lW$PcO273ntT~jq{|9SyG@DbzQx))pgD}Qob`&?J>%oM!Da)7{4xk z5VWQmM5I6fHIw9iX8;H~nOW*_=QQ;lrz-s-4Q8RL?>SwFqAvBkGtGA1nPam@s7NTig)EP8O4~qDg}kz-bqEOeLEEs?fa?7u)jpbB>PD!CfjY);d1+ADst^} zsmQmNQZdthoW#A-zK&}1?afqt!QMl~HTK<9l-i%9!fStlib^}app#g&{W#TD+2<37 M^>!~6KD+P#0SEM|%m4rY literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DAScript.dcu b/internal/4.10.0.10/1/Lib/D11/DAScript.dcu new file mode 100644 index 0000000000000000000000000000000000000000..509766c6f07cb926dba24a573576e1a5ec3b1410 GIT binary patch literal 25503 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DAStoredProcEditor.dcu b/internal/4.10.0.10/1/Lib/D11/DAStoredProcEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..ba1eb75d0ddd00441ecf10d177729124f9b7fbc7 GIT binary patch literal 6096 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 Nn1!8JVjs>@{tfX2mID9) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DATableEditor.dcu b/internal/4.10.0.10/1/Lib/D11/DATableEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..e38e876dad7aa23e4d29fc1cb965ce2b8cd866f7 GIT binary patch literal 9522 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 W8}U}>l=0?s#_-nUEW%rxQ~V!aEqs~) literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DAUpdateSQLEditor.dcu b/internal/4.10.0.10/1/Lib/D11/DAUpdateSQLEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..33da456f795eca7e33a612cfd08bcdb577de451a GIT binary patch literal 7636 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DAUpdateSQLFrame.dcu b/internal/4.10.0.10/1/Lib/D11/DAUpdateSQLFrame.dcu new file mode 100644 index 0000000000000000000000000000000000000000..dfcdaf8d27c71de449fa1809ff5c9f2b65365c06 GIT binary patch literal 9546 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 aA5EU43~A+d(OWRbQVxerZDE)P5dH!&+e9e< literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DBAccess.dcu b/internal/4.10.0.10/1/Lib/D11/DBAccess.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3c5b5fa9c5b6b224cd81307f5a7efa5df908d3f3 GIT binary patch literal 241485 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"|WQgldjojRVwy~E-Z=O6E*!A%8MM;oEGI7n2Q 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ῼb4hf}Fp(GKSwXhlnI4!PVMy^_ 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DBAccess.res b/internal/4.10.0.10/1/Lib/D11/DBAccess.res new file mode 100644 index 0000000000000000000000000000000000000000..c4d628d4dcdaa3f6502c31b77552098309d8841f GIT binary patch literal 2332 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 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DBMonitorIntf.dcu b/internal/4.10.0.10/1/Lib/D11/DBMonitorIntf.dcu new file mode 100644 index 0000000000000000000000000000000000000000..0c068449811baec23606cf1084027dfdea5c3bbf GIT binary patch literal 2196 zcmZ`(Z)_7~7=PZk+x6Pr+Jehc5lK7gSjw#Yk$}c58@-klw^7>;0jF@gzPBB;*UQ}v zM2!}S$*9I)FcM8gqTfvXYWN_@A~Ak3k%WZA1pi?q5{QY3A^3sK_r1HW?SMDU_3rol z-sgGV=Xu`W69B6}EspgyCd{Q!s zswR~(mw$g=@zRK7h8Vt&m2Z{KY;smI&dgoRDST#9JEB#NX}kAbSya5Exm12~tnkw9 zg{tDuuswz%$%Gka0>h({RxFV;b6Prn^N{|XT=dekGW19Q^0xNlRpH=;_kYClw&lz_ z26m&aB=)dK*r zZX2h0spc#*TyYFI<|9_JqG?37YH-y7JD3+yHRT5WlY?_Ho{`ICm2$5+7$5T!D_1F% zrX~4E4Ssb{KXaQkh%OnV2G<=>h;W2C*$Q zsJwULlU`O6!O}+*+CCRI9302H3I&69G+R+MYaZ@gKk4m_`wICN#Fn&=ch|-J&7RJ~iATQqC9)kS zHm9Kv1_XO})Yl|St!PzXGXzu7)9XP#hX+>94?PAzD9SVIV)9drhoHX)dhdCXk0UI? za4+C{o^dUb1`oYvgB=r6nE>XXjtXA7F&rG^Mahy_xhTxn(Owt!*=Kd}P#x`a@y@+c zX^wHjb#%bND3jHbIcSCp_hR2*(KKIBO5im~!PBHen;Gl20L4f@<;wvuhZx)>z zXvjmZf!{NIn2x9Ihen-tVeg(}8Zm4%Qb)yx7l-VeQy8ct#WnbBx{GhBqgfa45{W4r zs?MqnSlCfVhaHPt(D(@mgo@|>J@wn2tE*1$fQA0e7r)1l@b4nlUSgQ6LA01ON{Q`> z1QY%|y&;nAtV&NEuOrR11T&^P3L~P1xVD9;le%&J6EHM z13=TZ9D^(Z?Pp(*cE1{2T3UMR{4kq@F<1ofYzdE2YvhN}$-~i(JSiz0M4*q?-ITjA z2p~Uz67{;Na}Oc(aZc{kga3gZ`aI+23ipwf3RDmZ=_kX&5WY*?UY5)8 zzb7kmn#IvzQ6X13W{xNd9RyNjh+6?zJYPEDUD+eDqGuhnHl7w~K&)6@>_JzXWVY*M zQykkAaajgiw67_6tt!`)HdoIYBIYVr`+c_4Y*imSPy0dhY}c_i@w(qlpea}(x|exw zU5#%#MD`NslVPh`RE_Opi;mY4`@cU(utmlg1Fh^s`<71XYVzINTNfs0W0YN7+EhFh zS?Xjvw=NvmzrT1YG&@K?F5P6%t-CK@I{74fLzl|Wg3uQc)<=XPKto&5&@)&N0f|o| z@qmy9lujT%wEPoB0gVozbO@!_3lo4QBB*yl$OTX?jIwJ`PQc-ifICoD=*Fkv1CCx{ NT=ro82Alzq{s*YWS)%{| literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DBToolsClient.dcu b/internal/4.10.0.10/1/Lib/D11/DBToolsClient.dcu new file mode 100644 index 0000000000000000000000000000000000000000..f8bd49098ed3ddb6cb7a8195d6aaf71c886cbc7d GIT binary patch literal 56212 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 N%Ys#FQLtv+{1Gwsq_qG5 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DBToolsClient.res b/internal/4.10.0.10/1/Lib/D11/DBToolsClient.res new file mode 100644 index 0000000000000000000000000000000000000000..54d2e5f0077617ebafa24cc05c701eb37c61b262 GIT binary patch literal 7032 zcmeI0X;4(z6~|kW%9m8CCP`H)YgLk}Nlm3DDJI6*tTD{u)HtG`C{g1=sUYg0sGy*f zfJ+kx1r%9TT4WIr6&H{eun`>gRhp&Qng*JEX`uJ*<^Q;F=jAmvYE?d@W?mgG=f3{m z<(=O<_ug)SKp^-%{uqY*!Tqo6t=|X)j<~}x4uUm;m4dZ`je=EzPX#XU+~$;yZ~W?q z^Nrqu6NSGw@V7+pOL7~1@GpiPk;#rZ6R>^tqDI88p{ETObXI!#AMrnma=}l(vo~Y6 zZ;RQoxv{mQBJNVmhK<}ffS1*5HckxbhkJF(PEAjXy0c-XwQ~CTv#EN?WVLvrA{R7i zlULQ#hPDnct#x&MJFblKdUPY&bM<>KX}k{q=>J#Vo&Voz)H>IDyS)#uSOHilxetQ) zGYn(3m@EdJSu<^%8Z(S4bpzd6MXS1_ex{{TRW0W6f}S+78gwHO9)-?7gXw3R*y_1s z!N2&`T4Keyx1HCy{3X8PY}>@Hm^2~-FQaC9SXMtIt?aKaQB)SnOLIGlZp$8}H{TOA z-HLBWzf_YHR+V@fOnE*3*z*^!fsDWC%-4CHzf9F{%jbtSeRgnzlh67U`&^fMul-<; zGv2*-J-=LLYv_>Zxf(ov{N{g#e(^=I?^gx8Jf7^?(SG>QGf&U-gZmG@_dc1!?KmMf z{y=u+@~1o-{n}vDP>?fH)XN`>Xj@AQ z99%6m6&RQJDHl$0c|lM3;wj*O7i$q7Ce;|ii>#b}UPARODT&lwF3plNd1>*vq9B8^ z(Ar;U=)T`w5P8AJZD-IaZj?x$W}VusRqr|fiUPN!JX$lkeL|*X!_~Y(gWoc}9t*uFA;B^6@>j z!R^xaZ6yZ|f)`y6b48Je5YW&P@n?B8)S)zvDb=!CE-#{|+ZG#MWZC>K#?#O9V)H9A zPH5688LPo)QR}CA^opkgrSX1SzvKoAkI!~jn*d(yQ_rZ*Ww5;TBmKHT`LgQ0;HBwo z#EwRzM4LOF{9yf!tuKSDrJ?%zCZ{M@$Aq1qmp#5mda$2gt!0JM()`Ba+-h-lMPBAN z_tQ%5BGIlrPLHEAi3r?dHJef+L#-x5)NyZ|2Ttx@Z_#Od+*X*i)5s}24oa*WdtE-n zphVBpjEM8wFJ98*<&I}&be$8n1P6jwv7cX&-`o*eoDvN#G{vaXDrK|Gq#D(9HF9}D z&jOm?w(#!3XqBgD*F!l&QtWB&t&x5iPBsib!;c0Xq5+3fbTb~EV+*qy z4Hmr?$ng4Mc`=R;8b4#L6Bp8W za&u3JD=f#uDQc4=sL>u?B}^UI52pGJ=|EX52Wgl-#;TXA&EF@I^ha_vbGp z;DHTJxWnpSaP_BWbcm7~PKDHk1SM_T&g~ZKFc<+1F6xNIVrDkWkk{DjxxApqAavUz z1JWu_Kf8a;u7?bR17UgoUA2CkVWuqFj_%5ouMcd-se?}D&v)AcpVUT;F&`BVCA7&e z%4b4rmFzM*J!zU8F^mte-#D;+_sIqt%V?Bn^Oaw(^^pX?SY!dq;n0tW(-iDc8y(Ut z&hD))WRV3p)u)Ab%G$`McJizAPEuFhH=Q+4Wt9@?Gi2Gr+3hTQc00RHXOa{an0UrN zF7!}zuus&9y%&yoojbBK%y;`4pMQn!br1G(3)SweVo;*D)hIgKx~^X7 zO-mje83V869Uk;S5TehjRr{69@+V3*L<((a!!Tuz>_$?{s*5Qv`+78lUa#z;dXisc z|3a3vRF!~QeNlF9>bWH0A@TJHIukhS+f7R!$%BV2JIV&4Rm?ki^6N@%jrU#{)({|j zH-UlalwBhojWkNMhc!_f!6>CYXF*tyHTb%AKg}N=9q$ot?m4@$uc4H-weQsA-6Z)1 zYQzCGl4upV8D7qFCvDP6(YCj_z1goqxu}5K8$$FqUWkSalouTAWn5m1>d}O&pI;Bz z{R_54BJGz+TdSVd7Tjrg@_;)N_(3B~^b{k}Gk1s7W zTMnz({SFl?PrIo@R#F7^t7x^Tfc8wB1wy3y78f=SWD2p@(|@}jvb&gciG*1qlEQEf z;mriqKV-=^N)&*lVk{3wwea6B=(n1U7NdUdgg=E7{t!<13-a0$zw{rob zQGxBO77CG)0*gJlAK!NxAK#_x+k$!vdp6LRH8Zw)cc3BXd1mfZkE*+b!FOld$>8OQ zoneq!x0N%cCe{~mULHCt;@IXFc-ih*+);*_s`@j}Hwkw&csmutJe(fw+gOR8cV>S_ zwNsM(V#{>l(3OC}%Lmvj3)|8k>e?6JgcRep1%;QdLTO*m?Fznah{9WY+25v228%(9 z_yZREgVp>Ky{g__l7(eZWn!`zwj@rLeBu0BCo}#%zvuiEv!$djYKq;z&X(4eJ!bH^Tc zJhRNqx^@a=)zT_IRhyQoYSC?|cxnaW0SOcd9->ASk&pZt>j1iR!qCW^=NQ(?-(P?2U;3UIZWviroaLF{ex$cDM`VRKdtTMw z(xqvW%qxzeSYF@RlSg&2c-(r-vLCl57T&q53$E|w*I#+!C%Sala*e>N|1M72*2)o< z*f)P8-qxie_v+}1O1N?*IXtddnn}hCOEJx@+sl==Rjrk!ShNfefIXiuEX{u0W%;%g zPE5}hihumex0(5{>KPkkftke;%Wc%Eu5(0}X66)~9CjRK>%(VmT~rUo%Tj}-E6?4) z>cM&u66(Q5v@Z5i57*6J>OnGUe(#LpDC>kJU)rjW8t`ZxyVj2PE9vzLON;*8@D!>|~aBRmYlF%qqD6zYj=4Z{LXRkV&PyR4DsX zz)}h8>>g9rY-gT0u3=jj;FsV3@IV(p;+_h_iYa~`C?KC4u`P?R!rNBS((Q9_^AC3x zy7TQL_WC;OV*N7$@TKS9xw|jlUfL=0J5vMRo6fvcocpdhsu`Z`oP(=RC^s{KY0j=X zDme#_F5Y-Cmv7^&z%*rhhHenXZoPjw+mlZf!_S=~&W6DyL$40HeM5NQz!>a@{jxt- z#u+TSy-QKmh%TDb|0$7$}-) zW!&ymf4cE;!N@aMq-ZvP)nldM;T_rp)0Q~6FV(+upa6F;;e3dR1;tbNoB5P-!DMT>z=Ev<KM- zYZPe_#x)Hr316p3k1(#AC5kp}nOilShKDFxjWDijU~TX)MQb6pmtl>f*Kj+0gCa8k z4~S7P!0Edw*3X)zv;Y1RMOMfXf)8h<4LGM6CE`>fPf_@~r`5Fv%L!SD5-SwoMBrz+ z++cVCgSTJ|q^_nGyun)F7n)BLZ@?oIZE!^{HPFrr)A+(*tavjHQM4Iy(wtKuuCZbf zC-5P`FhyrVyp7}aJl>lzifWOW3w?7N zj8pVvXl@xXZI^vYJ4{gY!_dfQqaLG%J7AKcXCjRGiD8{EMbWtcQ%h&WaggLEFFyU} ze^&;lE`Bh0qkL-UudHZo(^h>iUr^8Hz4&ZBJ?kqd-iyUo(aXvlKnM3uBg8 ztOJZ8L5ZU00)|@h#0j=;zV**5XIFprr}5WrezMr|{=_8~KQ-bI#Um_-VAtZo=PA0x zg?*`kRMZn*4R);Z$O{y`7{YB_#8-A%amjRfjcuho@+pd53K^}O;a69NMT%Yy&C=*5 zQLBF38cxD#ie3qk4z|H*MJsYTx>+&VIpFZ7EmQR4kdHkC1V?;L8Ah~J$!$b zCahZS-B?vWBTfq&4YG+rfLwwf$$K&E3nMmpZ!ohyQ;3K?@i0AscvoB8VGm@*ibFQ| z##AqAU!2hgIf3}cKFcYbohCw7j@Ht>++=s{Vpg*K#l;U$oJ-x|IbO^>TE2PzMvb;zMC?U6t`fj z)pcTdemdr_S`uslC!4NvY?1RD&yFAG`P^OacNvDVOOgLev;Ul#irwcpfSQiIH{&-h z5w^D*qTqVBo9K+=m@FM`_ EKlZ!aTL1t6 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DacReg.dcu b/internal/4.10.0.10/1/Lib/D11/DacReg.dcu new file mode 100644 index 0000000000000000000000000000000000000000..30dc74bf27aeb0830b730ca0174cf4d630d75b27 GIT binary patch literal 870 zcmZ{gO=uHQ5Xa}eY&WHSO=GMYO4YVj300SVr7cpSA8FBphqS5C60y&>FWZI9ChTr2 zRm6bwPzq8JJP55H7Z08UkzRyCsF0HvuU^HVSD|(5Sdq&+9wOsDXFfe+J+PcN3Oq*KPN^v2(%XGhJe%&@b0LJ|j7IlRfzzB(TOz~G| zB9qQ$Y;Jq*-M4KI7;l`I9;Y5#ypdVvVj_~L$+g0%xY4B5qGOxCUNcT^nvS);KGITvMbgh5sFKl;-_`3x2dGQj$ zQlt3Bs7Kq!7~`%B@!VBeho#d;i~|Cdji2gd75&#gyZ*C(XLj+t5b32JeXYGzHuUez z&&}y;!Np6WkT1#}KlX0rA6=Faa{c>lA)megWI#ckVKmTyPhKH|D(VZOwlEqLDM5WB mWH^9^!>GFz4HFy;60D%^5b7gMcmtlO7z0lGu(AM80q9@)s|B3^ literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/DacVcl.dcu b/internal/4.10.0.10/1/Lib/D11/DacVcl.dcu new file mode 100644 index 0000000000000000000000000000000000000000..9607ce60ec302611059062374ea7b04ce5a896f5 GIT binary patch literal 12883 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 MNs}Dx8;k}20UVz6YXATM literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/Download.dcu b/internal/4.10.0.10/1/Lib/D11/Download.dcu new file mode 100644 index 0000000000000000000000000000000000000000..58e741f8b92195243aa8f274d248f9075ec9ceae GIT binary patch literal 11729 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 JV{{TB?jP(?OAP=3 literal 0 HcmV?d00001 diff --git a/internal/4.10.0.10/1/Lib/D11/MSAccess.dcu b/internal/4.10.0.10/1/Lib/D11/MSAccess.dcu new file mode 100644 index 0000000000000000000000000000000000000000..c06bba0ac5419a8c7119c16a7fa9df1a07471ffd GIT binary patch literal 179921 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