diff options
author | reiniero <reiniero@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-11-23 17:32:36 +0000 |
---|---|---|
committer | reiniero <reiniero@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-11-23 17:32:36 +0000 |
commit | 58bfebd8b68102e1e36192300dc6c61ecfac1eb3 (patch) | |
tree | 885fdabebdd9d4e7211e0fd02646351aa2b84142 /packages/fcl-db/src/base/sqlscript.pp | |
parent | 0df1dcf740e95e6d9117e72b9eda921d2625aabd (diff) | |
download | fpc-58bfebd8b68102e1e36192300dc6c61ecfac1eb3.tar.gz |
* fcl-db: TSQLScript: support explicit COMMIT/COMMIT WORK and COMMIT RETAIN script commands (with UseCommit) to use commit, respectively commit retaining.
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@26120 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-db/src/base/sqlscript.pp')
-rw-r--r-- | packages/fcl-db/src/base/sqlscript.pp | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/packages/fcl-db/src/base/sqlscript.pp b/packages/fcl-db/src/base/sqlscript.pp index ae55a8651c..211fbfba81 100644 --- a/packages/fcl-db/src/base/sqlscript.pp +++ b/packages/fcl-db/src/base/sqlscript.pp @@ -63,12 +63,14 @@ type function Available: Boolean; procedure InternalStatement (Statement: TStrings; var StopExecution: Boolean); procedure InternalDirective (Directive, Argument: String; var StopExecution: Boolean); - procedure InternalCommit; + // Runs commit. If ComitRetaining, use CommitRetraining if possible, else stop/starttransaction + procedure InternalCommit(CommitRetaining: boolean=true); protected procedure DefaultDirectives; virtual; procedure ExecuteStatement (Statement: TStrings; var StopExecution: Boolean); virtual; abstract; procedure ExecuteDirective (Directive, Argument: String; var StopExecution: Boolean); virtual; abstract; - procedure ExecuteCommit; virtual; abstract; + // Executes commit. If possible and CommitRetaining, use CommitRetaining, else + procedure ExecuteCommit(CommitRetaining: boolean=true); virtual; abstract; public constructor Create (AnOwner: TComponent); override; destructor Destroy; override; @@ -100,7 +102,7 @@ type protected procedure ExecuteStatement (SQLStatement: TStrings; var StopExecution: Boolean); override; procedure ExecuteDirective (Directive, Argument: String; var StopExecution: Boolean); override; - procedure ExecuteCommit; override; + procedure ExecuteCommit(CommitRetaining: boolean=true); override; public procedure Execute; override; property Aborted; @@ -344,7 +346,7 @@ begin end; end; -procedure TCustomSQLScript.InternalCommit; +procedure TCustomSQLScript.InternalCommit(CommitRetaining: boolean=true); var cont : boolean; @@ -352,7 +354,7 @@ var begin try - ExecuteCommit; + ExecuteCommit(CommitRetaining); except on E : Exception do begin @@ -404,9 +406,16 @@ begin else If Not FIsSkipping then begin // If AutoCommit, skip any explicit commits. - if FUseCommit and (Directive = 'COMMIT') and not FAutoCommit then - InternalCommit - else if FUseSetTerm and (Directive = 'SET TERM') then + if FUseCommit + and ((Directive = 'COMMIT') or (Directive = 'COMMIT WORK' {SQL standard})) + and not FAutoCommit then + InternalCommit(false) //explicit commit, no commit retaining + else if FUseCommit + and (Directive = 'COMMIT RETAIN') {at least Firebird syntax} + and not FAutoCommit then + InternalCommit(true) + else if FUseSetTerm + and (Directive = 'SET TERM' {Firebird/Interbase only}) then FTerminator:=S else InternalDirective (Directive,S,FAborted) @@ -543,7 +552,11 @@ begin if FUseSetTerm then Add('SET TERM'); if FUseCommit then - Add('COMMIT'); + begin + Add('COMMIT'); {Shorthand used in many dbs, e.g. Firebird} + Add('COMMIT RETAIN'); {Firebird/Interbase; probably won't hurt on other dbs} + Add('COMMIT WORK'); {SQL Standard, equivalent to commit} + end; if FUseDefines then begin Add('#IFDEF'); @@ -650,7 +663,7 @@ begin FOnDirective (Self, Directive, Argument, StopExecution); end; -procedure TEventSQLScript.ExecuteCommit; +procedure TEventSQLScript.ExecuteCommit(CommitRetaining: boolean=true); begin if assigned (FOnCommit) then FOnCommit (Self); |