Skip to content

Commit 153e61d

Browse files
committed
feat: prevent loading an SQL file multiple times into an editor
Shows an information dialog when a loaded file is being selected again through the various load-file mechanism: load-file dialog, recent files menu, dropping on editor, passing on command line Refs #1403
1 parent 86a96bd commit 153e61d

File tree

2 files changed

+58
-36
lines changed

2 files changed

+58
-36
lines changed

source/lazaruscompat.pas

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ TVTHeaderHelper = class helper for TVTHeader
3737
TStringsHelper = class helper for TStrings
3838
public
3939
function Contains(const S: String): Boolean;
40+
function IsEmpty: Boolean;
4041
end;
4142

4243
const
@@ -251,5 +252,10 @@ function TStringsHelper.Contains(const S: String): Boolean;
251252
Result := IndexOf(S) >= 0;
252253
end;
253254

255+
function TStringsHelper.IsEmpty: Boolean;
256+
begin
257+
Result := Count = 0;
258+
end;
259+
254260
end.
255261

source/main.pas

Lines changed: 52 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,7 @@ TMainForm = class(TExtForm)
13241324
procedure SetSnippetFilenames;
13251325
function TreeClickHistoryPrevious(MayBeNil: Boolean=False): PVirtualNode;
13261326
procedure OperationRunning(Runs: Boolean);
1327+
procedure OpenQueryFiles(Filenames: TStrings; Encoding: TEncoding; ForceRun: Boolean);
13271328
function RunQueryFiles(Filenames: TStrings; Encoding: TEncoding; ForceRun: Boolean): Boolean;
13281329
function RunQueryFile(Filename: String; Encoding: TEncoding; Conn: TDBConnection;
13291330
FilesizeSum: Int64; var CurrentPosition: Int64): Boolean;
@@ -2143,7 +2144,6 @@ procedure TMainForm.AfterFormCreate;
21432144
StatsCall: THttpDownload;
21442145
StatsURL: String;
21452146
SessionPaths: TStringlist;
2146-
Tab: TQueryTab;
21472147
begin
21482148
// Check for connection parameters on commandline or show connections form.
21492149
if AppSettings.ReadBool(asUpdatecheck) then begin
@@ -2259,14 +2259,7 @@ procedure TMainForm.AfterFormCreate;
22592259
end;
22602260

22612261
// Load SQL file(s) by command line
2262-
if not RunQueryFiles(FileNames, nil, false) then begin
2263-
for i:=0 to FileNames.Count-1 do begin
2264-
Tab := GetOrCreateEmptyQueryTab(False);
2265-
Tab.LoadContents(FileNames[i], True, nil);
2266-
if i = FileNames.Count-1 then
2267-
SetMainTab(Tab.TabSheet);
2268-
end;
2269-
end;
2262+
OpenQueryFiles(FileNames, nil, False);
22702263

22712264
MainFormAfterCreateDone := True;
22722265
end;
@@ -3936,10 +3929,9 @@ procedure TMainForm.actLaunchCommandlineExecute(Sender: TObject);
39363929
// Load SQL-file, make sure that SheetQuery is activated
39373930
procedure TMainForm.actLoadSQLExecute(Sender: TObject);
39383931
var
3939-
i, ProceedResult: Integer;
3932+
ProceedResult: Integer;
39403933
Dialog: TExtFileOpenDialog;
39413934
Encoding: TEncoding;
3942-
Tab: TQueryTab;
39433935
begin
39443936
AppSettings.ResetPath;
39453937
Dialog := TExtFileOpenDialog.Create(Self);
@@ -3961,21 +3953,59 @@ procedure TMainForm.actLoadSQLExecute(Sender: TObject);
39613953
end;
39623954

39633955
if ProceedResult = mrYes then begin
3964-
if not RunQueryFiles(Dialog.Files, Encoding, Sender=actRunSQL) then begin
3965-
for i:=0 to Dialog.Files.Count-1 do begin
3966-
Tab := GetOrCreateEmptyQueryTab(False);
3967-
Tab.LoadContents(Dialog.Files[i], True, Encoding);
3968-
if i = Dialog.Files.Count-1 then
3969-
SetMainTab(Tab.TabSheet);
3970-
end;
3971-
end;
3956+
OpenQueryFiles(Dialog.Files, Encoding, Sender=actRunSQL);
39723957
end;
39733958
AppSettings.WriteInt(asFileDialogEncoding, Dialog.EncodingIndex, Self.Name);
39743959
end;
39753960
Dialog.Free;
39763961
end;
39773962

39783963

3964+
procedure TMainForm.OpenQueryFiles(Filenames: TStrings; Encoding: TEncoding; ForceRun: Boolean);
3965+
var
3966+
Tab, FileInTab: TQueryTab;
3967+
FileHints: TStringList;
3968+
i: Integer;
3969+
begin
3970+
// Decides whether to run or load files, prevents duplicates etc.
3971+
if RunQueryFiles(Filenames, Encoding, ForceRun) then
3972+
Exit;
3973+
3974+
FileHints := TStringList.Create;
3975+
3976+
for i:=0 to Filenames.Count-1 do begin
3977+
3978+
FileInTab := nil;
3979+
for Tab in QueryTabs do begin
3980+
if Tab.MemoFilename = Filenames[i] then begin
3981+
FileInTab := Tab;
3982+
FileHints.Add(f_('This file is already open in query tab #%d.', [FileInTab.Number]) + ' ' + ExtractFileName(Filenames[i]));
3983+
if i = Filenames.Count-1 then
3984+
SetMainTab(FileInTab.TabSheet);
3985+
Break;
3986+
end;
3987+
end;
3988+
3989+
if not Assigned(FileInTab) then begin
3990+
Tab := GetOrCreateEmptyQueryTab(False);
3991+
Tab.LoadContents(Filenames[i], True, Encoding);
3992+
if i = Filenames.Count-1 then
3993+
SetMainTab(Tab.TabSheet);
3994+
end;
3995+
end;
3996+
3997+
if not FileHints.IsEmpty then begin
3998+
if MainFormAfterCreateDone then
3999+
MessageDialog(FileHints.Text, mtInformation, [mbOK])
4000+
else begin
4001+
for i:=0 to FileHints.Count-1 do
4002+
LogSQL(FileHints[i]);
4003+
end;
4004+
end;
4005+
FileHints.Free;
4006+
end;
4007+
4008+
39794009
function TMainForm.RunQueryFiles(Filenames: TStrings; Encoding: TEncoding; ForceRun: Boolean): Boolean;
39804010
var
39814011
i, FilesProcessed: Integer;
@@ -5189,7 +5219,6 @@ procedure TMainform.popupQueryLoadClick(Sender: TObject);
51895219
Filename: String;
51905220
FileList: TStringList;
51915221
p: Integer;
5192-
Tab: TQueryTab;
51935222
begin
51945223
// Click on the popupQueryLoad
51955224
Filename := (Sender as TMenuItem).Caption;
@@ -5202,10 +5231,7 @@ procedure TMainform.popupQueryLoadClick(Sender: TObject);
52025231
end;
52035232
FileList := TStringList.Create;
52045233
FileList.Add(Filename);
5205-
if not RunQueryFiles(FileList, nil, false) then begin
5206-
Tab := GetOrCreateEmptyQueryTab(True);
5207-
Tab.LoadContents(Filename, True, nil);
5208-
end;
5234+
OpenQueryFiles(FileList, nil, False);
52095235
FileList.Free;
52105236
end;
52115237

@@ -7769,12 +7795,7 @@ procedure TMainForm.FormDropFiles(Sender: TObject;
77697795
// query-memo - load their contents into seperate tabs
77707796
Files := TStringList.Create;
77717797
Files.AddStrings(FileNames);
7772-
if not RunQueryFiles(Files, nil, False) then begin
7773-
for i:=0 to Files.Count-1 do begin
7774-
Tab := GetOrCreateEmptyQueryTab(True);
7775-
Tab.LoadContents(Files[i], False, nil);
7776-
end;
7777-
end;
7798+
OpenQueryFiles(Files, nil, False);
77787799
Files.Free;
77797800
end;
77807801

@@ -13637,12 +13658,7 @@ procedure TMainForm.actDataResetSortingExecute(Sender: TObject);
1363713658
LogSQL(f_('Preventing second application instance - disabled in %s > %s > %s.', [_('Tools'), _('Preferences'), _('General')]), lcInfo);
1363813659
ConnectionParams := nil;
1363913660
ParseCommandLine(ParamBlobToStr(Msg.CopyDataStruct.lpData), ConnectionParams, FileNames, RunFrom);
13640-
if not RunQueryFiles(FileNames, nil, False) then begin
13641-
for i:=0 to FileNames.Count-1 do begin
13642-
Tab := GetOrCreateEmptyQueryTab(True);
13643-
Tab.LoadContents(FileNames[i], True, nil);
13644-
end;
13645-
end;
13661+
OpenQueryFiles(FileNames, nil, False);
1364613662
if ConnectionParams <> nil then
1364713663
InitConnection(ConnectionParams, True, Connection);
1364813664
end else

0 commit comments

Comments
 (0)