Browse Source

* Fixed memleaks (issue #7324)

git-svn-id: trunk@4706 -
joost 19 years ago
parent
commit
6ae8c61928
1 changed files with 14 additions and 5 deletions
  1. 14 5
      fcl/db/bufdataset.inc

+ 14 - 5
fcl/db/bufdataset.inc

@@ -77,17 +77,28 @@ end;
 procedure TBufDataset.InternalClose;
 
 var pc : pchar;
+    r  : integer;
 
 begin
   FOpen:=False;
   FCurrentRecBuf := FFirstRecBuf;
-  SetLength(FUpdateBuffer,0);
   while assigned(FCurrentRecBuf) do
     begin
     pc := pointer(FCurrentRecBuf);
     FCurrentRecBuf := FCurrentRecBuf^.next;
     FreeRecordBuffer(pc);
     end;
+
+  if Length(FUpdateBuffer) > 0 then
+    begin
+    for r := 0 to length(FUpdateBuffer)-1 do with FUpdateBuffer[r] do
+      begin
+      if assigned(BookmarkData) then
+        FreeRecordBuffer(OldValuesBuffer);
+      end;
+    end;
+  SetLength(FUpdateBuffer,0);
+
   FFirstRecBuf:= nil;
   SetLength(FFieldBufPositions,0);
 end;
@@ -498,7 +509,6 @@ procedure TBufDataset.ApplyUpdates(MaxErrors: Integer);
 var SaveBookmark : pchar;
     r            : Integer;
     FailedCount  : integer;
-    EUpdErr      : EUpdateError;
     Response     : TResolverResponse;
     StoreRecBuf  : PBufRecLinkItem;
 
@@ -525,9 +535,8 @@ begin
           Inc(FailedCount);
           if failedcount > word(MaxErrors) then Response := rrAbort
           else Response := rrSkip;
-          EUpdErr := EUpdateError.Create(SOnUpdateError,E.Message,0,0,E);
-          if assigned(FOnUpdateError) then FOnUpdateError(Self,Self,EUpdErr,FUpdateBuffer[r].UpdateKind,Response)
-          else if Response = rrAbort then Raise EUpdErr
+          if assigned(FOnUpdateError) then FOnUpdateError(Self,Self,EUpdateError.Create(SOnUpdateError,E.Message,0,0,E),FUpdateBuffer[r].UpdateKind,Response)
+          else if Response = rrAbort then Raise EUpdateError.Create(SOnUpdateError,E.Message,0,0,E)
           end
         else
           raise;