瀏覽代碼

Fix memory leak in querywindow

Reinier Olislagers 11 年之前
父節點
當前提交
710930ccd9
共有 1 個文件被更改,包括 38 次插入25 次删除
  1. 38 25
      querywindow.pas

+ 38 - 25
querywindow.pas

@@ -178,8 +178,8 @@ type
     fQueryPart: string;
     fTab: TTabSheet;
     fmeResult: TMemo;
-    fSqlQuery: TSQLQuery;
-    fSqlScript: TSQLScript;
+    fSQLQuery: TSQLQuery;
+    fSQLScript: TSQLScript;
     faText: string;
     fModifyCount: Integer;
     fCnt: Integer;
@@ -209,6 +209,7 @@ type
     procedure Init(dbIndex: Integer);
     function GetQueryType(AQuery: string): TQueryTypes;
     function GetQuery: string;
+    // Takes existing query or script and uses it to create result tab
     function CreateResultTab(QueryType: TQueryTypes; var aSqlQuery: TSQLQuery; var aSQLScript: TSqlScript;
       var meResult: TMemo; AdditionalTitle: string = ''): TTabSheet;
     // Runs SQL script; returns result
@@ -739,9 +740,11 @@ var
   QT: TQueryThread;
 begin
   RemoveControls;
-  ATab:= CreateResultTab(qtExecute, SqlQuery, SqlScript, meResult);
+  SQLQuery:= TSQLQuery.Create(nil);
+  SQLScript:= TSQLScript.Create(nil);
   QT:= TQueryThread.Create(qaCommit);
   try
+    ATab:= CreateResultTab(qtExecute, SqlQuery, SqlScript, meResult);
     QT.Trans:= fSqlTrans;
     ATab.ImageIndex:= 6;
 
@@ -768,11 +771,11 @@ begin
         OnCommit(self);
       OnCommit:= nil;
     end;
-
   finally
     QT.Free;
+    SQLScript.Free;
+    SQLQuery.Free;
   end;
-
 end;
 
 
@@ -864,9 +867,11 @@ var
   QT: TQueryThread;
 begin
   RemoveControls;
-  ATab:= CreateResultTab(qtExecute, SqlQuery, SqlScript, meResult);
+  SQLQuery:= TSQLQuery.Create(nil);
+  SQLScript:= TSQLScript.Create(nil);
   QT:= TQueryThread.Create(qaRollBack);
   try
+    ATab:= CreateResultTab(qtExecute, SqlQuery, SqlScript, meResult);
     QT.Trans:= fSqlTrans;
     ATab.ImageIndex:= 6;
     QT.Resume;
@@ -890,9 +895,10 @@ begin
       OnCommit:= nil;
       meResult.Font.Color:= $AA6666;
     end;
-
   finally
     QT.Free;
+    SqlQuery.Free;
+    SQLScript.Free
   end;
 end;
 
@@ -1061,7 +1067,8 @@ begin
   if QueryType = qtSelectable then // Select, need record set result
   begin
     // Query
-    aSqlQuery:= TSQLQuery.Create(nil);
+    if not(assigned(aSQLQuery)) then
+      raise Exception.Create('Query object does not yet exist. Pass an existing query object to this function.');
     aSqlQuery.DataBase:= ibConnection;
     aSqlQuery.Transaction:= fSqlTrans;
     aSqlQuery.AfterScroll:= @QueryAfterScroll;
@@ -1128,16 +1135,16 @@ begin
     case QueryType of
       qtExecute:
       begin
-        aSqlQuery:= TSQLQuery.Create(nil);
+        if not(assigned(aSQLQuery)) then
+          raise Exception.Create('Query object does not yet exist. Pass an existing query object to this function.');
         aSqlQuery.DataBase:= ibConnection;
         aSqlQuery.Transaction:= fSqlTrans;
         AddResultControl(ATab, aSqlQuery);
       end;
       qtScript: // Script
       begin
-        //todo: strip out this create stuff; pass existing object to function.
-        // makes it easier to understand who is responsible for clearing up
-        aSQLScript:= TSQLScript.Create(nil);
+        if not(assigned(aSQLScript)) then
+          raise Exception.Create('Script object does not yet exist. Pass an existing script object to this function.');
         aSQLScript.DataBase:= ibConnection;
         aSQLScript.Transaction:= fSqlTrans;
         aSQLScript.CommentsInSQL:= true; //pass on comments. They cannot hurt
@@ -1192,7 +1199,7 @@ begin
       begin
         fTab:= nil;
         try
-          fTab:= CreateResultTab(qtSelectable, fSqlQuery, fSqlScript, fmeResult);
+          fTab:= CreateResultTab(qtSelectable, fSQLQuery, fSQLScript, fmeResult);
           fTab.ImageIndex:= 6;
           fTab.Hint:= fQueryPart;
           fTab.ShowHint:= True;
@@ -1200,7 +1207,7 @@ begin
 
           // Create thread to open dataset
           fQT:= TQueryThread.Create(qaOpen);
-          fQT.Query:= fSqlQuery;
+          fQT.Query:= fSQLQuery;
           // fQT.OnTerminate:= @ThreadTerminated;
           faText:= fTab.Caption;
           fTab.Caption:= 'Running..';
@@ -1227,7 +1234,7 @@ begin
               fTab.TabVisible:= False;
             SetLength(fResultControls, High(fResultControls));
             SetLength(fParentResultControls, High(fParentResultControls));
-            fTab:= CreateResultTab(qtExecute, fSqlQuery, fSqlScript, fmeResult);
+            fTab:= CreateResultTab(qtExecute, fSQLQuery, fSQLScript, fmeResult);
             PageControl1.ActivePage:= fTab;
 
             fmeResult.Text:= e.message;
@@ -1242,7 +1249,7 @@ begin
         if fQueryType = qtExecute then
         begin
           fTab:= nil;
-          fTab:= CreateResultTab(qtExecute, fSqlQuery, fSqlScript, fmeResult);
+          fTab:= CreateResultTab(qtExecute, fSQLQuery, fSQLScript, fmeResult);
 
           fTab.ImageIndex:= 1;
           SqlType:= GetSQLType(fQueryPart, Command);
@@ -1277,8 +1284,8 @@ begin
             end
             else
             begin // DML
-              fSqlQuery.Close;
-              fSqlQuery.SQL.Text:= fQueryPart;
+              fSQLQuery.Close;
+              fSQLQuery.SQL.Text:= fQueryPart;
               fTab.ImageIndex:= 6;
               fTab.Hint:= fQueryPart;
               fTab.ShowHint:= True;
@@ -1287,7 +1294,7 @@ begin
               // Execute the statement in thread
               fQT:= TQueryThread.Create(qaExec);
               try
-                fQT.Query:= fSqlQuery;
+                fQT.Query:= fSQLQuery;
                 fQT.Resume;
                 faText:= fTab.Caption;
                 fTab.Caption:= 'Running..';
@@ -1309,7 +1316,7 @@ begin
               end;
               fTab.Caption:= faText;
               fTab.ImageIndex:= 1;
-              Affected:= fsqlQuery.RowsAffected;
+              Affected:= fSQLQuery.RowsAffected;
             end;
             Inc(fModifyCount);
 
@@ -1334,7 +1341,7 @@ begin
             begin
               if Assigned(fTab) then
                 fTab.TabVisible:= False;
-              fTab:= CreateResultTab(qtExecute, fSqlQuery, fSqlScript, fmeResult);
+              fTab:= CreateResultTab(qtExecute, fSQLQuery, fSQLScript, fmeResult);
               PageControl1.ActivePage:= fTab;
               fmeResult.Text:= e.message;
               fmeResult.Lines.Add(fQueryPart);
@@ -1358,7 +1365,7 @@ begin
             begin
               if Assigned(fTab) then
                 fTab.TabVisible:= False;
-              fTab:= CreateResultTab(qtExecute, fSqlQuery, fSqlScript, fmeResult);
+              fTab:= CreateResultTab(qtExecute, fSQLQuery, fSQLScript, fmeResult);
               PageControl1.ActivePage:= fTab;
               fmeResult.Text:= e.message;
               fmeResult.Lines.Add(fQueryPart);
@@ -1388,7 +1395,7 @@ begin
     begin
       if Assigned(fTab) then
         fTab.TabVisible:= False;
-      fTab:= CreateResultTab(qtExecute, fSqlQuery, fSqlScript, fmeResult);
+      fTab:= CreateResultTab(qtExecute, fSQLQuery, fSQLScript, fmeResult);
       fTab.ImageIndex:= 2;
       PageControl1.ActivePage:= fTab;
 
@@ -1414,7 +1421,8 @@ var
 begin
   StartTime:= Now;
   ATab:= nil;
-  SQLScript:= nil;
+  SQLQuery:= TSQLQuery.Create(nil);
+  SQLScript:= TSQLScript.Create(nil);
   try
     // CreateResultTab creates the SQLScript object for us.
     ATab:= CreateResultTab(qtScript, SqlQuery, SQLScript, meResult);
@@ -1434,6 +1442,7 @@ begin
       meResult.Lines.Add('--------');
       meResult.Lines.Add(Script);
     finally
+      SQLQuery.Free;
       SQLScript.Free;
     end;
   except
@@ -1705,6 +1714,8 @@ begin
   // Initialize new instance of IBConnection and SQLTransaction
   ibConnection:= TIBConnection.Create(nil);
   fSqlTrans:= TSQLTransaction.Create(nil);
+  FSQLQuery:= TSQLQuery.Create(nil);
+  FSQLScript:= TSQLScript.Create(nil);
   SynCompletion1.ItemList.CommaText:= 'create,table,Select,From,INTEGER,FLOAT';
   SortSynCompletion;
 end;
@@ -1712,6 +1723,8 @@ end;
 procedure TfmQueryWindow.FormDestroy(Sender: TObject);
 begin
   // Clean up resources to avoid memory leaks
+  FSQLQuery.Free;
+  FSQLScript.Free;
   fSqlTrans.Free;
   IBConnection.Free;
   FList.Free;
@@ -2152,7 +2165,7 @@ begin
       fTab.TabVisible:= False;
     SetLength(fResultControls, High(fResultControls));
     SetLength(fParentResultControls, High(fParentResultControls));
-    fTab:= CreateResultTab(qtExecute, fSqlQuery, fSqlScript, fmeResult);
+    fTab:= CreateResultTab(qtExecute, fSQLQuery, fSQLScript, fmeResult);
     PageControl1.ActivePage:= fTab;
 
     fmeResult.Text:= fQT.ErrorMsg;