From b90a390d5c5d8a431ec68d88c9241e6f1c895ad7 Mon Sep 17 00:00:00 2001 From: Akshay Joshi Date: Wed, 5 Feb 2025 10:17:46 +0530 Subject: [PATCH] 1) Run the uninstaller first only if the v8 version is already installed. 2) Delete the MyAppVersion key from the Windows registry during the installation or upgrade. 3) Remove the logic that checks if a 32-bit or 64-bit version of the installer is already installed. --- pkg/win32/installer.iss.in | 126 ++++++++++++++++++++----------------- 1 file changed, 67 insertions(+), 59 deletions(-) diff --git a/pkg/win32/installer.iss.in b/pkg/win32/installer.iss.in index 6fe907cfe..f90503349 100644 --- a/pkg/win32/installer.iss.in +++ b/pkg/win32/installer.iss.in @@ -8,9 +8,8 @@ #define MyAppArchitecturesMode "x64" #define MyAppVCDist MYAPP_VCDIST #define MyAppInvalidPath "Please provide a valid path." -#define MyAppErrorMsgIsWin32 "You already have a 32 bit installation of pgAdmin 4. Please uninstall this before installing the 64 bit version." -#define MyAppErrorMsgIsWin64 "You already have a 64 bit installation of pgAdmin 4. Please uninstall this before installing the 32 bit version." #define MinimumWindowsVer "6.2.9200" +#define CheckOldInstallerVersion "v8" [Setup] AppId={#MyAppName}{#MyAppVersion} @@ -51,7 +50,7 @@ english.NewerVersionExists=A newer version of {#MyAppName} english.InvalidPath={#MyAppInvalidPath} [Icons] -Name: {group}\{#MyAppName} {#MyAppVersion}; Filename: {app}\runtime\{#MyAppExeName}; IconFilename: {app}\pgAdmin4.ico; WorkingDir: {app}\runtime; +Name: {group}\{#MyAppName}; Filename: {app}\runtime\{#MyAppExeName}; IconFilename: {app}\pgAdmin4.ico; WorkingDir: {app}\runtime; [Files] Source: "..\..\win-build\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; @@ -60,10 +59,10 @@ Source: "..\..\win-build\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdi Filename: "{app}\installer\{#MyAppVCDist}"; StatusMsg: "VC runtime redistributable package"; Parameters: "/passive /verysilent /norestart"; Check: InstallVC; [Registry] -Root: HKA; Subkey: "Software\{#MyAppName}\{#MyAppVersion}"; Flags: uninsdeletekeyifempty -Root: HKA; Subkey: "Software\{#MyAppName}\{#MyAppVersion}"; Flags: uninsdeletekey -Root: HKA; Subkey: "Software\{#MyAppName}\{#MyAppVersion}"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}" -Root: HKA; Subkey: "Software\{#MyAppName}\{#MyAppVersion}"; ValueType: string; ValueName: "Version"; ValueData: "{#MyAppFullVersion}" +Root: HKA; Subkey: "Software\{#MyAppName}"; Flags: uninsdeletekeyifempty +Root: HKA; Subkey: "Software\{#MyAppName}"; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\{#MyAppName}"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}" +Root: HKA; Subkey: "Software\{#MyAppName}"; ValueType: string; ValueName: "Version"; ValueData: "{#MyAppFullVersion}" [Code] var @@ -145,68 +144,77 @@ begin Result := 0; end; +// This function is invoked only when the V8 version is already installed. +// It retrieves the path of the uninstaller to remove the installed V8 version. +function GetUninstallerPath(): String; +var + sUnInstRegKey: String; + sUnInstPath: String; +begin + sUnInstRegKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppName}{#CheckOldInstallerVersion}_is1'; + sUnInstPath := ''; + if not RegQueryStringValue(HKLM, sUnInstRegKey, 'UninstallString', sUnInstPath) then + RegQueryStringValue(HKCU, sUnInstRegKey, 'UninstallString', sUnInstPath); + Result := sUnInstPath; +end; + +// This function is invoked only when the V8 version is already installed. +// It is used to uninstall the installed V8 version. +// Return Values: +// 1 - Uninstaller path is empty. +// 2 - Error executing the Uninstaller. +// 3 - Successfully executed the Uninstaller +function UnInstallOldVersion(): Integer; +var + sUnInstallerPath: String; + iResultCode: Integer; +begin + // default return value + Result := 0; + + // get the uninstall path of the old app + sUnInstallerPath := GetUninstallerPath(); + if sUnInstallerPath <> '' then begin + sUnInstallerPath := RemoveQuotes(sUnInstallerPath); + if Exec(sUnInstallerPath, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then + Result := 3 + else + Result := 2; + end else + Result := 1; +end; + function CheckPgAdminAlreadyInstalled: Boolean; var Version: String; - InstallationFound: Boolean; begin - InstallationFound := False; - // Check the installation mode 64 or 32 bit of installer - if Is64BitInstallMode then + if RegKeyExists(HKEY_LOCAL_MACHINE,'Software\{#MyAppName}\{#CheckOldInstallerVersion}') then begin - - // Check if pgAdmin 32 bit is already installed - RegQueryStringValue(HKLM32,'Software\{#MyAppName}\{#MyAppVersion}', 'Version', Version); - - // If version is found then shouldn't install 64bit - abort - if Length(Version) > 0 then + if UnInstallOldVersion() < 3 then begin - MsgBox(ExpandConstant('{#MyAppErrorMsgIsWin32}'), mbCriticalError, MB_OK); - Result := False; - InstallationFound := True; + Result := False; end; - end - else - begin - // Suppose system is running a 32-bit version of Windows then no need to check HKLM64 in RegQueryStringValue - // So IsWin64 - will make sure its should only execute on 64-bit version of windows. - if IsWin64 then - begin - // Check if pgAdmin 64 bit is already installed - RegQueryStringValue(HKLM64,'Software\{#MyAppName}\{#MyAppVersion}', 'Version', Version); - - // If version is found the shouldn't install 32bit - abort - if Length(Version) > 0 then - begin - MsgBox(ExpandConstant('{#MyAppErrorMsgIsWin64}'), mbCriticalError, MB_OK); - Result := False; - InstallationFound := True; - end; - end; - end; - - if not (InstallationFound) then - begin - if RegValueExists(HKEY_LOCAL_MACHINE,'Software\{#MyAppName}\{#MyAppVersion}', 'Version') then - begin - UpgradeMode := True; - RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\{#MyAppName}\{#MyAppVersion}', 'Version', Version); - if CompareVersions(Version, '{#MyAppFullVersion}') = 1 then - begin - MsgBox(ExpandConstant('{cm:NewerVersionExists}' + '(v' + Version + ') is already installed' ), mbInformation, MB_OK); - Result := False; - end - else - begin - Result := True; - end; - end; end; - if ( not (InstallationFound) and not (UpgradeMode) ) then + if RegValueExists(HKEY_LOCAL_MACHINE,'Software\{#MyAppName}', 'Version') then begin - // This is required as it will be passed on to the InitializeSetup function - Result := True; + UpgradeMode := True; + RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\{#MyAppName}', 'Version', Version); + if CompareVersions(Version, '{#MyAppFullVersion}') = 1 then + begin + MsgBox(ExpandConstant('{cm:NewerVersionExists}' + '(v' + Version + ') is already installed' ), mbInformation, MB_OK); + Result := False; + end + else + begin + Result := True; + end; + end; + + if ( not (UpgradeMode) ) then + begin + // This is required as it will be passed on to the InitializeSetup function + Result := True; end; end;