mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00
Simplify updatecheck: Make unit updatedownload superflous by moving relevant code to updatecheck.pas. Resign from displaying a progressbar for the mostly short download time, instead use the existing status label for a textual progress information.
This commit is contained in:
@ -35,8 +35,7 @@ uses
|
|||||||
data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm},
|
data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm},
|
||||||
runsqlfile in '..\..\source\runsqlfile.pas' {RunSQLFileForm},
|
runsqlfile in '..\..\source\runsqlfile.pas' {RunSQLFileForm},
|
||||||
createdatabase in '..\..\source\createdatabase.pas' {CreateDatabaseForm},
|
createdatabase in '..\..\source\createdatabase.pas' {CreateDatabaseForm},
|
||||||
updatecheck in '..\..\source\updatecheck.pas' {frmUpdateCheck},
|
updatecheck in '..\..\source\updatecheck.pas' {frmUpdateCheck};
|
||||||
updatedownload in '..\..\source\updatedownload.pas' {frmUpdateDownload};
|
|
||||||
|
|
||||||
{$R *.RES}
|
{$R *.RES}
|
||||||
|
|
||||||
|
@ -35,8 +35,7 @@ uses
|
|||||||
data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm},
|
data_sorting in '..\..\source\data_sorting.pas' {DataSortingForm},
|
||||||
runsqlfile in '..\..\source\runsqlfile.pas' {RunSQLFileForm},
|
runsqlfile in '..\..\source\runsqlfile.pas' {RunSQLFileForm},
|
||||||
createdatabase in '..\..\source\createdatabase.pas' {CreateDatabaseForm},
|
createdatabase in '..\..\source\createdatabase.pas' {CreateDatabaseForm},
|
||||||
updatecheck in '..\..\source\updatecheck.pas' {frmUpdateCheck},
|
updatecheck in '..\..\source\updatecheck.pas' {frmUpdateCheck};
|
||||||
updatedownload in '..\..\source\updatedownload.pas' {frmUpdateDownload};
|
|
||||||
|
|
||||||
{$R *.RES}
|
{$R *.RES}
|
||||||
|
|
||||||
|
@ -137,9 +137,6 @@
|
|||||||
<DCCReference Include="..\..\source\updatecheck.pas">
|
<DCCReference Include="..\..\source\updatecheck.pas">
|
||||||
<Form>frmUpdateCheck</Form>
|
<Form>frmUpdateCheck</Form>
|
||||||
</DCCReference>
|
</DCCReference>
|
||||||
<DCCReference Include="..\..\source\updatedownload.pas">
|
|
||||||
<Form>frmUpdateDownload</Form>
|
|
||||||
</DCCReference>
|
|
||||||
<DCCReference Include="..\..\source\usermanager.pas">
|
<DCCReference Include="..\..\source\usermanager.pas">
|
||||||
<Form>UserManagerForm</Form>
|
<Form>UserManagerForm</Form>
|
||||||
</DCCReference>
|
</DCCReference>
|
||||||
|
@ -26,6 +26,8 @@ type
|
|||||||
ReleaseURL, BuildURL : String;
|
ReleaseURL, BuildURL : String;
|
||||||
procedure Status(txt: String);
|
procedure Status(txt: String);
|
||||||
procedure ReadCheckFile;
|
procedure ReadCheckFile;
|
||||||
|
procedure URLOnDownloadProgress(Sender: TDownLoadURL; Progress, ProgressMax: Cardinal;
|
||||||
|
StatusCode: TURLDownloadStatus; StatusText: String; var Cancel: Boolean);
|
||||||
public
|
public
|
||||||
{ Public declarations }
|
{ Public declarations }
|
||||||
AutoClose: Boolean; // Automatically close dialog after detecting no available downloads
|
AutoClose: Boolean; // Automatically close dialog after detecting no available downloads
|
||||||
@ -34,7 +36,7 @@ type
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses helpers, main, UpdateDownload;
|
uses helpers, main;
|
||||||
|
|
||||||
{$R *.dfm}
|
{$R *.dfm}
|
||||||
|
|
||||||
@ -196,8 +198,94 @@ end;
|
|||||||
Download latest build and replace running exe
|
Download latest build and replace running exe
|
||||||
}
|
}
|
||||||
procedure TfrmUpdateCheck.btnBuildClick(Sender: TObject);
|
procedure TfrmUpdateCheck.btnBuildClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
Download: TDownLoadURL;
|
||||||
|
ScriptFile: Textfile;
|
||||||
|
ExeName, ScriptFilename, ScriptContent: String;
|
||||||
begin
|
begin
|
||||||
DoUpdateDownload(Self, BuildURL, Application.ExeName);
|
Download := TDownLoadURL.Create(Self);
|
||||||
|
Download.URL := BuildURL;
|
||||||
|
ExeName := ExtractFileName(Application.ExeName);
|
||||||
|
|
||||||
|
// Save the file in a temp directory
|
||||||
|
Download.Filename := GetTempDir + ExeName;
|
||||||
|
Download.OnDownloadProgress := URLOnDownloadProgress;
|
||||||
|
|
||||||
|
// Delete probably previously downloaded file
|
||||||
|
if FileExists(Download.Filename) then
|
||||||
|
DeleteFile(Download.Filename);
|
||||||
|
|
||||||
|
// Do the download
|
||||||
|
Download.ExecuteTarget(nil);
|
||||||
|
|
||||||
|
// Check if downloaded file exists
|
||||||
|
if not FileExists(Download.Filename) then
|
||||||
|
Raise Exception.Create('Downloaded file not found: '+Download.Filename);
|
||||||
|
|
||||||
|
// The Visual Basic Script code which kills this exe and moves the
|
||||||
|
// downloaded file to the application directory.
|
||||||
|
// This file moving can fail due to several reasons. Especially in Vista
|
||||||
|
// where users are normally not admins, they'll get a "Permission denied".
|
||||||
|
// However, the script does several write attempts and quits with a clear
|
||||||
|
// error message if it couldn't move the file.
|
||||||
|
// TODO: move this code to a seperate file for easier debugging
|
||||||
|
Status('Update in progress ...');
|
||||||
|
ScriptContent := ''' This is a temporary script which shall update your ' + APPNAME + CRLF +
|
||||||
|
''' with a nightly build.' + CRLF +
|
||||||
|
CRLF +
|
||||||
|
'ExeName = "'+ExeName+'"' + CRLF +
|
||||||
|
'DownloadFileName = "'+Download.Filename+'"' + CRLF +
|
||||||
|
'TargetFileName = "'+Application.ExeName+'"' + CRLF +
|
||||||
|
CRLF +
|
||||||
|
'WScript.Echo "Terminating """&ExeName&""" ..."' + CRLF +
|
||||||
|
'Set Shell = WScript.CreateObject("WScript.Shell")' + CRLF +
|
||||||
|
'Shell.Run("taskkill /im """&ExeName&""" /f")' + CRLF +
|
||||||
|
CRLF +
|
||||||
|
'Set FileSystem = CreateObject("Scripting.FileSystemObject")' + CRLF +
|
||||||
|
'Set DownloadFile = FileSystem.GetFile(DownloadFileName)' + CRLF +
|
||||||
|
'Set TargetFile = FileSystem.GetFile(TargetFileName)' + CRLF +
|
||||||
|
'On Error Resume Next' + CRLF +
|
||||||
|
'MaxAttempts = 10' + CRLF +
|
||||||
|
'for x = 1 to MaxAttempts' + CRLF +
|
||||||
|
' WScript.Echo "Deleting "&ExeName&" (attempt "&x&" of "&MaxAttempts&") ..."' + CRLF +
|
||||||
|
' TargetFile.Delete' + CRLF +
|
||||||
|
' If Err.Number = 0 Then' + CRLF +
|
||||||
|
' Err.Clear' + CRLF +
|
||||||
|
' Exit For' + CRLF +
|
||||||
|
' End If' + CRLF +
|
||||||
|
' Err.Clear' + CRLF +
|
||||||
|
' WScript.Sleep(2000)' + CRLF +
|
||||||
|
'Next' + CRLF +
|
||||||
|
'If Err.Number <> 0 Then' + CRLF +
|
||||||
|
' WScript.Echo "Error: Cannot delete file "&TargetFileName' + CRLF +
|
||||||
|
' WScript.Sleep(10000)' + CRLF +
|
||||||
|
' Wscript.Quit' + CRLF +
|
||||||
|
'End If' + CRLF +
|
||||||
|
'Err.Clear' + CRLF +
|
||||||
|
CRLF +
|
||||||
|
'WScript.Echo "Installing new build ..."' + CRLF +
|
||||||
|
'DownloadFile.Move TargetFileName' + CRLF +
|
||||||
|
CRLF +
|
||||||
|
'WScript.Echo "Restarting ..."' + CRLF +
|
||||||
|
'Shell.Run(""""&TargetFileName&"""")';
|
||||||
|
// Write script file to disk
|
||||||
|
ScriptFilename := GetTempDir + APPNAME + '_Update.vbs';
|
||||||
|
AssignFile(ScriptFile, ScriptFilename);
|
||||||
|
Rewrite(ScriptFile);
|
||||||
|
Write(Scriptfile, ScriptContent);
|
||||||
|
CloseFile(ScriptFile);
|
||||||
|
// Calling the script will now terminate the running exe...
|
||||||
|
WinExec(PAnsiChar('cscript.exe "'+ScriptFilename+'"'), 1);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{**
|
||||||
|
Download progress event
|
||||||
|
}
|
||||||
|
procedure TfrmUpdateCheck.URLOnDownloadProgress;
|
||||||
|
begin
|
||||||
|
Status('Downloading: '+FormatByteNumber(Progress)+' / '+FormatByteNumber(ProgressMax) + ' ...');
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
object frmUpdateDownload: TfrmUpdateDownload
|
|
||||||
Left = 0
|
|
||||||
Top = 0
|
|
||||||
BorderStyle = bsDialog
|
|
||||||
Caption = 'Downloading update file ...'
|
|
||||||
ClientHeight = 95
|
|
||||||
ClientWidth = 286
|
|
||||||
Color = clBtnFace
|
|
||||||
Font.Charset = DEFAULT_CHARSET
|
|
||||||
Font.Color = clWindowText
|
|
||||||
Font.Height = -11
|
|
||||||
Font.Name = 'Tahoma'
|
|
||||||
Font.Style = []
|
|
||||||
OldCreateOrder = False
|
|
||||||
Position = poOwnerFormCenter
|
|
||||||
DesignSize = (
|
|
||||||
286
|
|
||||||
95)
|
|
||||||
PixelsPerInch = 96
|
|
||||||
TextHeight = 13
|
|
||||||
object lblStatus: TLabel
|
|
||||||
Left = 8
|
|
||||||
Top = 31
|
|
||||||
Width = 270
|
|
||||||
Height = 28
|
|
||||||
Anchors = [akLeft, akTop, akRight]
|
|
||||||
AutoSize = False
|
|
||||||
Caption = 'lblStatus'
|
|
||||||
WordWrap = True
|
|
||||||
end
|
|
||||||
object progressDownload: TProgressBar
|
|
||||||
Left = 8
|
|
||||||
Top = 8
|
|
||||||
Width = 270
|
|
||||||
Height = 17
|
|
||||||
Anchors = [akLeft, akTop, akRight]
|
|
||||||
TabOrder = 0
|
|
||||||
end
|
|
||||||
object btnCancel: TButton
|
|
||||||
Left = 104
|
|
||||||
Top = 62
|
|
||||||
Width = 68
|
|
||||||
Height = 25
|
|
||||||
Anchors = [akLeft, akTop, akRight]
|
|
||||||
Cancel = True
|
|
||||||
Caption = 'Cancel'
|
|
||||||
ModalResult = 2
|
|
||||||
TabOrder = 1
|
|
||||||
OnClick = btnCancelClick
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,165 +0,0 @@
|
|||||||
unit updatedownload;
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
|
||||||
Dialogs, StdCtrls, ComCtrls, ExtActns, Helpers;
|
|
||||||
|
|
||||||
type
|
|
||||||
TfrmUpdateDownload = class(TForm)
|
|
||||||
progressDownload: TProgressBar;
|
|
||||||
lblStatus: TLabel;
|
|
||||||
btnCancel: TButton;
|
|
||||||
procedure btnCancelClick(Sender: TObject);
|
|
||||||
private
|
|
||||||
{ Private declarations }
|
|
||||||
Download: TDownLoadURL;
|
|
||||||
DoCancel: Boolean;
|
|
||||||
FilePath: String;
|
|
||||||
procedure DoDownload;
|
|
||||||
procedure URLOnDownloadProgress(Sender: TDownLoadURL; Progress, ProgressMax: Cardinal;
|
|
||||||
StatusCode: TURLDownloadStatus; StatusText: String; var Cancel: Boolean);
|
|
||||||
public
|
|
||||||
{ Public declarations }
|
|
||||||
end;
|
|
||||||
|
|
||||||
function DoUpdateDownload(AOwner: TComponent; URL, FilePath: String): Boolean;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
{$R *.dfm}
|
|
||||||
|
|
||||||
|
|
||||||
{**
|
|
||||||
Initiate the download + update process
|
|
||||||
}
|
|
||||||
function DoUpdateDownload(AOwner: TComponent; URL, FilePath: String): Boolean;
|
|
||||||
var
|
|
||||||
frm: TfrmUpdateDownload;
|
|
||||||
begin
|
|
||||||
Result := False;
|
|
||||||
frm := TfrmUpdateDownload.Create(AOwner);
|
|
||||||
frm.Download := TDownLoadURL.Create(frm);
|
|
||||||
frm.Download.URL := URL;
|
|
||||||
frm.FilePath := FilePath;
|
|
||||||
frm.DoDownload;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{**
|
|
||||||
Cancel clicked
|
|
||||||
}
|
|
||||||
procedure TfrmUpdateDownload.btnCancelClick(Sender: TObject);
|
|
||||||
begin
|
|
||||||
DoCancel := True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{**
|
|
||||||
Start the download + update process
|
|
||||||
}
|
|
||||||
procedure TfrmUpdateDownload.DoDownload;
|
|
||||||
var
|
|
||||||
ScriptFile: Textfile;
|
|
||||||
ScriptFilename, ScriptContent: String;
|
|
||||||
begin
|
|
||||||
Show;
|
|
||||||
|
|
||||||
// Save the file in a temp directory
|
|
||||||
Download.Filename := GetTempDir + ExtractFileName(Filepath);
|
|
||||||
Download.OnDownloadProgress := URLOnDownloadProgress;
|
|
||||||
|
|
||||||
// Delete probably previously downloaded file
|
|
||||||
if FileExists(Download.Filename) then
|
|
||||||
DeleteFile(Download.Filename);
|
|
||||||
|
|
||||||
// Do the download
|
|
||||||
Download.ExecuteTarget(nil);
|
|
||||||
|
|
||||||
// Check if downloaded file exists
|
|
||||||
if not FileExists(Download.Filename) then
|
|
||||||
Raise Exception.Create('Downloaded file not found: '+Download.Filename);
|
|
||||||
|
|
||||||
if FilePath = Application.ExeName then begin
|
|
||||||
// The Visual Basic Script code which kills this exe and moves the
|
|
||||||
// downloaded file to the application directory.
|
|
||||||
// This file moving can fail due to several reasons. Especially in Vista
|
|
||||||
// where users are normally not admins, they'll get a "Permission denied".
|
|
||||||
// However, the script does several write attempts and quits with a clear
|
|
||||||
// error message if it couldn't move the file.
|
|
||||||
// TODO: move this code to a seperate file for easier debugging
|
|
||||||
ScriptContent := ''' This is a temporary script which shall update your ' + APPNAME + CRLF +
|
|
||||||
''' with a nightly build.' + CRLF +
|
|
||||||
CRLF +
|
|
||||||
'ExeName = "'+ExtractFilename(FilePath)+'"' + CRLF +
|
|
||||||
'DownloadFileName = "'+Download.Filename+'"' + CRLF +
|
|
||||||
'TargetFileName = "'+FilePath+'"' + CRLF +
|
|
||||||
CRLF +
|
|
||||||
'WScript.Echo "Terminating """&ExeName&""" ..."' + CRLF +
|
|
||||||
'Set Shell = WScript.CreateObject("WScript.Shell")' + CRLF +
|
|
||||||
'Shell.Run("taskkill /im """&ExeName&""" /f")' + CRLF +
|
|
||||||
CRLF +
|
|
||||||
'Set FileSystem = CreateObject("Scripting.FileSystemObject")' + CRLF +
|
|
||||||
'Set DownloadFile = FileSystem.GetFile(DownloadFileName)' + CRLF +
|
|
||||||
'Set TargetFile = FileSystem.GetFile(TargetFileName)' + CRLF +
|
|
||||||
'On Error Resume Next' + CRLF +
|
|
||||||
'MaxAttempts = 10' + CRLF +
|
|
||||||
'for x = 1 to MaxAttempts' + CRLF +
|
|
||||||
' WScript.Echo "Deleting "&ExeName&" (attempt "&x&" of "&MaxAttempts&") ..."' + CRLF +
|
|
||||||
' TargetFile.Delete' + CRLF +
|
|
||||||
' If Err.Number = 0 Then' + CRLF +
|
|
||||||
' Err.Clear' + CRLF +
|
|
||||||
' Exit For' + CRLF +
|
|
||||||
' End If' + CRLF +
|
|
||||||
' Err.Clear' + CRLF +
|
|
||||||
' WScript.Sleep(2000)' + CRLF +
|
|
||||||
'Next' + CRLF +
|
|
||||||
'If Err.Number <> 0 Then' + CRLF +
|
|
||||||
' WScript.Echo "Error: Cannot delete file "&TargetFileName' + CRLF +
|
|
||||||
' WScript.Sleep(10000)' + CRLF +
|
|
||||||
' Wscript.Quit' + CRLF +
|
|
||||||
'End If' + CRLF +
|
|
||||||
'Err.Clear' + CRLF +
|
|
||||||
CRLF +
|
|
||||||
'WScript.Echo "Installing new build ..."' + CRLF +
|
|
||||||
'DownloadFile.Move TargetFileName' + CRLF +
|
|
||||||
CRLF +
|
|
||||||
'WScript.Echo "Restarting ..."' + CRLF +
|
|
||||||
'Shell.Run(""""&TargetFileName&"""")';
|
|
||||||
// Write script file to disk
|
|
||||||
ScriptFilename := GetTempDir + APPNAME + '_Update.vbs';
|
|
||||||
AssignFile(ScriptFile, ScriptFilename);
|
|
||||||
Rewrite(ScriptFile);
|
|
||||||
Write(Scriptfile, ScriptContent);
|
|
||||||
CloseFile(ScriptFile);
|
|
||||||
// Calling the script will now terminate the running exe...
|
|
||||||
WinExec(PAnsiChar('cscript.exe "'+ScriptFilename+'"'), 1);
|
|
||||||
end else begin
|
|
||||||
// We're not replacing the running exe, so just move file to destination
|
|
||||||
MoveFile(PChar(Download.Filename), PChar(FilePath));
|
|
||||||
end;
|
|
||||||
|
|
||||||
// Close form
|
|
||||||
ModalResult := mrOK;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{**
|
|
||||||
Download progress event
|
|
||||||
}
|
|
||||||
procedure TfrmUpdateDownload.URLOnDownloadProgress(Sender: TDownLoadURL; Progress, ProgressMax: Cardinal;
|
|
||||||
StatusCode: TURLDownloadStatus; StatusText: String; var Cancel: Boolean);
|
|
||||||
begin
|
|
||||||
progressDownload.Max := ProgressMax;
|
|
||||||
progressDownload.Position := Progress;
|
|
||||||
lblStatus.Caption := StatusText;
|
|
||||||
// Notification if cancel button was pressed
|
|
||||||
Cancel := DoCancel;
|
|
||||||
Application.ProcessMessages;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end.
|
|
Reference in New Issue
Block a user