git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.jvcl@19 7f62d464-2af8-f54e-996c-e91b33f51cbe
517 lines
16 KiB
ObjectPascal
517 lines
16 KiB
ObjectPascal
{-----------------------------------------------------------------------------
|
|
The contents of this file are subject to the Mozilla Public License
|
|
Version 1.1 (the "License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
http://www.mozilla.org/MPL/MPL-1.1.html
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
|
the specific language governing rights and limitations under the License.
|
|
|
|
The Original Code is: JvOdacSmartQuery.PAS, released on 2002-05-26.
|
|
|
|
The Initial Developer of the Original Code is Jens Fudickar
|
|
All Rights Reserved.
|
|
|
|
Contributor(s):
|
|
|
|
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
|
located at http://jvcl.delphi-jedi.org
|
|
|
|
Description:
|
|
Oracle Dataset with Threaded Functions
|
|
|
|
Known Issues:
|
|
-----------------------------------------------------------------------------}
|
|
// $Id: JvOracleDataSet.pas 12461 2009-08-14 17:21:33Z obones $
|
|
|
|
unit JvOracleDataSet;
|
|
|
|
{$I jvcl.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF UNITVERSIONING}
|
|
JclUnitVersioning,
|
|
{$ENDIF UNITVERSIONING}
|
|
SysUtils, Classes, StdCtrls, ExtCtrls, Forms, Controls, DB,
|
|
OracleData,
|
|
JvThread, JvThreadDialog, JvDynControlEngine, JvBaseDBThreadedDataSet;
|
|
|
|
type
|
|
TJvDoaThreadedDatasetAllowedContinueRecordFetchOptions =
|
|
class(TJvBaseThreadedDatasetAllowedContinueRecordFetchOptions)
|
|
public
|
|
constructor Create; override;
|
|
published
|
|
property All;
|
|
property Cancel;
|
|
property Pause;
|
|
end;
|
|
|
|
TJvDoaThreadedDatasetEnhancedOptions = class(TJvBaseThreadedDatasetEnhancedOptions)
|
|
private
|
|
function GetAllowedContinueRecordFetchOptions: TJvDoaThreadedDatasetAllowedContinueRecordFetchOptions;
|
|
procedure SetAllowedContinueRecordFetchOptions(const Value: TJvDoaThreadedDatasetAllowedContinueRecordFetchOptions);
|
|
protected
|
|
function CreateAllowedContinueRecordFetchOptions: TJvBaseThreadedDatasetAllowedContinueRecordFetchOptions; override;
|
|
published
|
|
property AllowedContinueRecordFetchOptions: TJvDoaThreadedDatasetAllowedContinueRecordFetchOptions read
|
|
GetAllowedContinueRecordFetchOptions write SetAllowedContinueRecordFetchOptions;
|
|
end;
|
|
|
|
TJvOracleDatasetThreadHandler = class(TJvBaseDatasetThreadHandler)
|
|
private
|
|
function GetEnhancedOptions: TJvDoaThreadedDatasetEnhancedOptions;
|
|
procedure SetEnhancedOptions(const Value: TJvDoaThreadedDatasetEnhancedOptions);
|
|
protected
|
|
function CreateEnhancedOptions: TJvBaseThreadedDatasetEnhancedOptions; override;
|
|
published
|
|
property EnhancedOptions: TJvDoaThreadedDatasetEnhancedOptions read GetEnhancedOptions write SetEnhancedOptions;
|
|
end;
|
|
|
|
TJvOracleDataset = class(TOracleDataset, IJvThreadedDatasetInterface)
|
|
procedure BreakExecution;
|
|
function DoGetInheritedNextRecord: Boolean;
|
|
procedure DoInheritedAfterOpen;
|
|
procedure DoInheritedAfterRefresh;
|
|
procedure DoInheritedAfterScroll;
|
|
procedure DoInheritedBeforeOpen;
|
|
procedure DoInheritedBeforeRefresh;
|
|
procedure DoInheritedInternalLast;
|
|
procedure DoInheritedInternalRefresh;
|
|
procedure DoInheritedSetActive(Active: Boolean);
|
|
procedure DoInternalOpen;
|
|
function GetDatasetFetchAllRecords: Boolean;
|
|
function IsThreadAllowed: Boolean;
|
|
procedure SetDatasetFetchAllRecords(const Value: Boolean);
|
|
private
|
|
FAfterFetchRecord: TAfterFetchRecordEvent;
|
|
FThreadHandler: TJvBaseDatasetThreadHandler;
|
|
function GetAfterOpenFetch: TDataSetNotifyEvent;
|
|
function GetBeforeThreadExecution: TJvThreadedDatasetThreadEvent;
|
|
function GetAfterThreadExecution: TJvThreadedDatasetThreadEvent;
|
|
function GetDialogOptions: TJvThreadedDatasetDialogOptions;
|
|
function GetEnhancedOptions: TJvDoaThreadedDatasetEnhancedOptions;
|
|
function GetThreadOptions: TJvThreadedDatasetThreadOptions;
|
|
procedure SetAfterOpenFetch(const Value: TDataSetNotifyEvent);
|
|
procedure SetBeforeThreadExecution(const Value: TJvThreadedDatasetThreadEvent);
|
|
procedure SetAfterThreadExecution(const Value: TJvThreadedDatasetThreadEvent);
|
|
procedure SetDialogOptions(Value: TJvThreadedDatasetDialogOptions);
|
|
procedure SetEnhancedOptions(const Value: TJvDoaThreadedDatasetEnhancedOptions);
|
|
procedure SetThreadOptions(const Value: TJvThreadedDatasetThreadOptions);
|
|
property ThreadHandler: TJvBaseDatasetThreadHandler read FThreadHandler;
|
|
protected
|
|
procedure DoAfterOpen; override;
|
|
procedure DoAfterScroll; override;
|
|
procedure DoAfterRefresh; override;
|
|
procedure DoBeforeOpen; override;
|
|
procedure DoBeforeRefresh; override;
|
|
function GetNextRecord: Boolean; override;
|
|
function GetOnThreadException: TJvThreadedDatasetThreadExceptionEvent;
|
|
procedure InternalLast; override;
|
|
procedure InternalRefresh; override;
|
|
procedure ReplaceAfterFetchRecord(Sender: TOracleDataSet; FilterAccept: Boolean;
|
|
var Action: TAfterFetchRecordAction);
|
|
procedure SetActive(Value: Boolean); override;
|
|
procedure SetOnThreadException(const Value:
|
|
TJvThreadedDatasetThreadExceptionEvent);
|
|
public
|
|
constructor Create(AOwner : TComponent); override;
|
|
destructor Destroy; override;
|
|
function CurrentFetchDuration: TDateTime;
|
|
function CurrentOpenDuration: TDateTime;
|
|
function EofReached: Boolean;
|
|
function ErrorException: Exception;
|
|
function ErrorMessage: string;
|
|
function ThreadIsActive: Boolean;
|
|
published
|
|
property BeforeThreadExecution: TJvThreadedDatasetThreadEvent read GetBeforeThreadExecution write
|
|
SetBeforeThreadExecution;
|
|
property DialogOptions: TJvThreadedDatasetDialogOptions read GetDialogOptions write SetDialogOptions;
|
|
property EnhancedOptions: TJvDoaThreadedDatasetEnhancedOptions read GetEnhancedOptions write SetEnhancedOptions;
|
|
property ThreadOptions: TJvThreadedDatasetThreadOptions read GetThreadOptions write SetThreadOptions;
|
|
property AfterFetchRecord: TAfterFetchRecordEvent read FAfterFetchRecord write FAfterFetchRecord;
|
|
property AfterOpenFetch: TDataSetNotifyEvent read GetAfterOpenFetch write
|
|
SetAfterOpenFetch;
|
|
property AfterThreadExecution: TJvThreadedDatasetThreadEvent read GetAfterThreadExecution write
|
|
SetAfterThreadExecution;
|
|
property OnThreadException: TJvThreadedDatasetThreadExceptionEvent read
|
|
GetOnThreadException write SetOnThreadException;
|
|
end;
|
|
|
|
{$IFDEF UNITVERSIONING}
|
|
const
|
|
UnitVersioning: TUnitVersionInfo = (
|
|
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_39/run/JvOracleDataSet.pas $';
|
|
Revision: '$Revision: 12461 $';
|
|
Date: '$Date: 2009-08-14 19:21:33 +0200 (ven., 14 août 2009) $';
|
|
LogPath: 'JVCL\run'
|
|
);
|
|
{$ENDIF UNITVERSIONING}
|
|
|
|
implementation
|
|
|
|
constructor TJvOracleDataset.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FThreadHandler := TJvOracleDatasetThreadHandler.Create(Self, Self);
|
|
inherited AfterFetchRecord := ReplaceAfterFetchRecord;
|
|
end;
|
|
|
|
destructor TJvOracleDataset.Destroy;
|
|
begin
|
|
FreeAndNil(FThreadHandler);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.BreakExecution;
|
|
begin
|
|
if Assigned(Session) and Session.Connected then
|
|
Session.BreakExecution;
|
|
end;
|
|
|
|
function TJvOracleDataset.CurrentFetchDuration: TDateTime;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.CurrentFetchDuration
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TJvOracleDataset.CurrentOpenDuration: TDateTime;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.CurrentOpenDuration
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.InternalLast;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.InternalLast;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.InternalRefresh;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.InternalRefresh;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.SetActive(Value: Boolean);
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.SetActive(Value);
|
|
end;
|
|
|
|
|
|
procedure TJvOracleDataset.DoAfterOpen;
|
|
begin
|
|
ThreadHandler.AfterOpen;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoAfterScroll;
|
|
begin
|
|
ThreadHandler.AfterScroll;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoAfterRefresh;
|
|
begin
|
|
ThreadHandler.AfterRefresh;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoBeforeOpen;
|
|
begin
|
|
ThreadHandler.BeforeOpen;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoBeforeRefresh;
|
|
begin
|
|
ThreadHandler.BeforeRefresh;
|
|
end;
|
|
|
|
function TJvOracleDataset.DoGetInheritedNextRecord: Boolean;
|
|
begin
|
|
Result := Inherited GetNextRecord;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoInheritedAfterOpen;
|
|
begin
|
|
inherited DoAfterOpen;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoInheritedAfterRefresh;
|
|
begin
|
|
inherited DoAfterRefresh;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoInheritedAfterScroll;
|
|
begin
|
|
inherited DoAfterScroll;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoInheritedBeforeOpen;
|
|
begin
|
|
inherited DoBeforeOpen;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoInheritedBeforeRefresh;
|
|
begin
|
|
inherited DoBeforeRefresh;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoInheritedInternalLast;
|
|
begin
|
|
inherited InternalLast;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoInheritedInternalRefresh;
|
|
begin
|
|
inherited InternalRefresh;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoInheritedSetActive(Active: Boolean);
|
|
begin
|
|
inherited SetActive(Active);
|
|
end;
|
|
|
|
procedure TJvOracleDataset.DoInternalOpen;
|
|
begin
|
|
InternalOpen;
|
|
end;
|
|
|
|
function TJvOracleDataset.ErrorException: Exception;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.ErrorException
|
|
else
|
|
Result := Nil;
|
|
end;
|
|
|
|
function TJvOracleDataset.ErrorMessage: string;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.ErrorMessage
|
|
else
|
|
Result := '';
|
|
end;
|
|
|
|
function TJvOracleDataset.GetBeforeThreadExecution: TJvThreadedDatasetThreadEvent;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.BeforeThreadExecution
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TJvOracleDataset.GetAfterThreadExecution: TJvThreadedDatasetThreadEvent;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.AfterThreadExecution
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TJvOracleDataset.GetDatasetFetchAllRecords: Boolean;
|
|
begin
|
|
Result := QueryAllRecords;
|
|
end;
|
|
|
|
function TJvOracleDataset.GetDialogOptions: TJvThreadedDatasetDialogOptions;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.DialogOptions
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TJvOracleDataset.GetEnhancedOptions: TJvDoaThreadedDatasetEnhancedOptions;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := TJvDoaThreadedDatasetEnhancedOptions(ThreadHandler.EnhancedOptions)
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TJvOracleDataset.EofReached: Boolean;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.EofReached
|
|
else
|
|
Result := False;
|
|
end;
|
|
|
|
function TJvOracleDataset.GetAfterOpenFetch: TDataSetNotifyEvent;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.AfterOpenFetch
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TJvOracleDataset.GetNextRecord: Boolean;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.GetNextRecord
|
|
else
|
|
Result := inherited GetNextRecord;
|
|
end;
|
|
|
|
function TJvOracleDataset.GetOnThreadException:
|
|
TJvThreadedDatasetThreadExceptionEvent;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.OnThreadException
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TJvOracleDataset.GetThreadOptions: TJvThreadedDatasetThreadOptions;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.ThreadOptions
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TJvOracleDataset.IsThreadAllowed: Boolean;
|
|
begin
|
|
if Assigned(Master) and (Master is TJvOracleDataset) then
|
|
Result := not TJvOracleDataset(Master).ThreadHandler.ThreadIsActive
|
|
else
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.ReplaceAfterFetchRecord(Sender: TOracleDataSet;
|
|
FilterAccept: Boolean; var Action: TAfterFetchRecordAction);
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
case ThreadHandler.CheckContinueRecordFetch of
|
|
tdccrContinue:
|
|
Action := afContinue;
|
|
tdccrAll:
|
|
Action := afContinue;
|
|
tdccrCancel:
|
|
Action := afCancel;
|
|
tdccrPause:
|
|
Action := afPause;
|
|
tdccrStop:
|
|
Action := afStop;
|
|
else
|
|
Action := afStop;
|
|
end;
|
|
if Assigned(AfterFetchRecord) then
|
|
AfterFetchRecord(Sender, FilterAccept, Action);
|
|
end;
|
|
|
|
procedure TJvOracleDataset.SetAfterOpenFetch(const Value: TDataSetNotifyEvent);
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.AfterOpenFetch := Value;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.SetBeforeThreadExecution(const Value: TJvThreadedDatasetThreadEvent);
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.BeforeThreadExecution := Value;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.SetAfterThreadExecution(const Value: TJvThreadedDatasetThreadEvent);
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.AfterThreadExecution := Value;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.SetDatasetFetchAllRecords(const Value: Boolean);
|
|
begin
|
|
QueryAllRecords := Value;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.SetDialogOptions(Value: TJvThreadedDatasetDialogOptions);
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.DialogOptions.Assign(Value);
|
|
end;
|
|
|
|
procedure TJvOracleDataset.SetEnhancedOptions(const Value: TJvDoaThreadedDatasetEnhancedOptions);
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.EnhancedOptions.Assign(Value);
|
|
end;
|
|
|
|
procedure TJvOracleDataset.SetOnThreadException(const Value:
|
|
TJvThreadedDatasetThreadExceptionEvent);
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.OnThreadException := Value;
|
|
end;
|
|
|
|
procedure TJvOracleDataset.SetThreadOptions(const Value: TJvThreadedDatasetThreadOptions);
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
ThreadHandler.ThreadOptions.Assign(Value);
|
|
end;
|
|
|
|
function TJvOracleDataset.ThreadIsActive: Boolean;
|
|
begin
|
|
if Assigned(ThreadHandler) then
|
|
Result := ThreadHandler.ThreadIsActive
|
|
else
|
|
Result := False;
|
|
end;
|
|
|
|
function TJvOracleDatasetThreadHandler.CreateEnhancedOptions: TJvBaseThreadedDatasetEnhancedOptions;
|
|
begin
|
|
Result := TJvDoaThreadedDatasetEnhancedOptions.Create;
|
|
end;
|
|
|
|
function TJvOracleDatasetThreadHandler.GetEnhancedOptions: TJvDoaThreadedDatasetEnhancedOptions;
|
|
begin
|
|
Result := TJvDoaThreadedDatasetEnhancedOptions(inherited EnhancedOptions);
|
|
end;
|
|
|
|
procedure TJvOracleDatasetThreadHandler.SetEnhancedOptions(const Value: TJvDoaThreadedDatasetEnhancedOptions);
|
|
begin
|
|
inherited EnhancedOptions := Value;
|
|
end;
|
|
|
|
constructor TJvDoaThreadedDatasetAllowedContinueRecordFetchOptions.Create;
|
|
begin
|
|
inherited Create;
|
|
All := True;
|
|
end;
|
|
|
|
function
|
|
TJvDoaThreadedDatasetEnhancedOptions.CreateAllowedContinueRecordFetchOptions:
|
|
TJvBaseThreadedDatasetAllowedContinueRecordFetchOptions;
|
|
begin
|
|
Result := TJvDoaThreadedDatasetAllowedContinueRecordFetchOptions.Create;
|
|
end;
|
|
|
|
function
|
|
TJvDoaThreadedDatasetEnhancedOptions.GetAllowedContinueRecordFetchOptions:
|
|
TJvDoaThreadedDatasetAllowedContinueRecordFetchOptions;
|
|
begin
|
|
Result := TJvDoaThreadedDatasetAllowedContinueRecordFetchOptions(inherited AllowedContinueRecordFetchOptions);
|
|
end;
|
|
|
|
procedure
|
|
TJvDoaThreadedDatasetEnhancedOptions.SetAllowedContinueRecordFetchOptions(
|
|
const Value: TJvDoaThreadedDatasetAllowedContinueRecordFetchOptions);
|
|
begin
|
|
inherited AllowedContinueRecordFetchOptions := Value;
|
|
end;
|
|
|
|
{$IFDEF UNITVERSIONING}
|
|
initialization
|
|
RegisterUnitVersion(HInstance, UnitVersioning);
|
|
|
|
finalization
|
|
UnregisterUnitVersion(HInstance);
|
|
{$ENDIF UNITVERSIONING}
|
|
|
|
end.
|
|
|