summaryrefslogtreecommitdiff
path: root/packages/fcl-db/src
diff options
context:
space:
mode:
authormichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-04-17 19:26:36 +0000
committermichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-04-17 19:26:36 +0000
commit1f7b870aeac1b4f9af18e05a1f5bf966e65cf2df (patch)
tree332533cf87d2eb2e2528d1b471c9975df4f027b7 /packages/fcl-db/src
parent6f876201d4d1bdba3d9c410991e4dc8664fbdcf3 (diff)
downloadfpc-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.inc7
-rw-r--r--packages/fcl-db/src/sqldb/sqldb.pp36
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);