diff options
author | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-04-17 19:26:36 +0000 |
---|---|---|
committer | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-04-17 19:26:36 +0000 |
commit | 1f7b870aeac1b4f9af18e05a1f5bf966e65cf2df (patch) | |
tree | 332533cf87d2eb2e2528d1b471c9975df4f027b7 /packages/fcl-db/src | |
parent | 6f876201d4d1bdba3d9c410991e4dc8664fbdcf3 (diff) | |
download | fpc-1f7b870aeac1b4f9af18e05a1f5bf966e65cf2df.tar.gz |
* Globally take into account forcedclose when committing/rollbacking, so all operations succeed
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@30627 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-db/src')
-rw-r--r-- | packages/fcl-db/src/base/database.inc | 7 | ||||
-rw-r--r-- | packages/fcl-db/src/sqldb/sqldb.pp | 36 |
2 files changed, 38 insertions, 5 deletions
diff --git a/packages/fcl-db/src/base/database.inc b/packages/fcl-db/src/base/database.inc index 1642889279..bbf81c9eb2 100644 --- a/packages/fcl-db/src/base/database.inc +++ b/packages/fcl-db/src/base/database.inc @@ -95,7 +95,12 @@ begin If Assigned(FTransactions) then begin For I:=FTransactions.Count-1 downto 0 do - TDBTransaction(FTransactions[i]).EndTransaction; + try + TDBTransaction(FTransactions[i]).EndTransaction; + except + if not ForcedClose then + Raise; + end; end; end; diff --git a/packages/fcl-db/src/sqldb/sqldb.pp b/packages/fcl-db/src/sqldb/sqldb.pp index 07b44871d6..289d3c2e58 100644 --- a/packages/fcl-db/src/sqldb/sqldb.pp +++ b/packages/fcl-db/src/sqldb/sqldb.pp @@ -163,6 +163,8 @@ type function GetPort: cardinal; procedure SetOptions(AValue: TSQLConnectionOptions); procedure SetPort(const AValue: cardinal); + function AttemptCommit(trans : TSQLHandle) : boolean; + function AttemptRollBack(trans : TSQLHandle) : boolean; protected FConnOptions : TConnOptions; FSQLFormatSettings : TFormatSettings; @@ -1264,6 +1266,30 @@ begin Delete(IndexOfName('Port')); end; +function TSQLConnection.AttemptCommit(trans: TSQLHandle): boolean; +begin + try + Result:=Commit(trans); + except + if ForcedClose then + Result:=True + else + Raise; + end; +end; + +function TSQLConnection.AttemptRollBack(trans: TSQLHandle): boolean; +begin + try + Result:=Rollback(trans); + except + if ForcedClose then + Result:=True + else + Raise; + end; +end; + procedure TSQLConnection.GetDBInfo(const ASchemaType : TSchemaType; const ASchemaObjectName, AReturnField : string; AList: TStrings); var qry : TCustomSQLQuery; @@ -1624,7 +1650,8 @@ begin end; -function TSQLConnection.ConstructInsertSQL(Query : TCustomSQLQuery; Var ReturningClause : Boolean) : string; +function TSQLConnection.ConstructInsertSQL(Query: TCustomSQLQuery; + var ReturningClause: Boolean): string; var x : integer; sql_fields : string; @@ -1665,7 +1692,8 @@ begin end; -function TSQLConnection.ConstructUpdateSQL(Query: TCustomSQLQuery; Var ReturningClause : Boolean): string; +function TSQLConnection.ConstructUpdateSQL(Query: TCustomSQLQuery; + var ReturningClause: Boolean): string; var x : integer; F : TField; @@ -1983,7 +2011,7 @@ begin CloseDataSets; If LogEvent(detCommit) then Log(detCommit,SCommitting); - if (stoUseImplicit in Options) or SQLConnection.Commit(FTrans) then + if (stoUseImplicit in Options) or SQLConnection.AttemptCommit(FTrans) then begin CloseTrans; FreeAndNil(FTrans); @@ -2010,7 +2038,7 @@ begin CloseDataSets; If LogEvent(detRollback) then Log(detRollback,SRollingBack); - if SQLConnection.RollBack(FTrans) then + if SQLConnection.AttemptRollBack(FTrans) then begin CloseTrans; FreeAndNil(FTrans); |