summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2019-11-27 16:02:34 +0100
committerVladislav Vaintroub <wlad@mariadb.com>2019-11-27 16:02:34 +0100
commit29710b2839ed6f87a2ba745059daae6bc3ef5870 (patch)
tree42226e816162eb80ce6523a7cfbfd03c95b1a27a
parentddbbf97670ede6d3d6c6ad597c9b0f826272c85d (diff)
parent96c6b2b64926b7c2d57ce0a85d11039d062dfc3b (diff)
downloadmariadb-git-29710b2839ed6f87a2ba745059daae6bc3ef5870.tar.gz
Merge branch '10.4' into 10.5
# Conflicts: # win/packaging/extra.wxs.in
-rw-r--r--cmake/symlinks.cmake4
-rw-r--r--win/packaging/ca/CMakeLists.txt15
-rw-r--r--win/packaging/ca/CustomAction.cpp464
-rw-r--r--win/packaging/ca/CustomAction.def5
-rw-r--r--win/packaging/ca/symlinks.cc.in6
-rw-r--r--win/packaging/ca/symlinks.h8
-rw-r--r--win/packaging/create_msi.cmake4
-rw-r--r--win/packaging/extra.wxs.in25
8 files changed, 260 insertions, 271 deletions
diff --git a/cmake/symlinks.cmake b/cmake/symlinks.cmake
index 251532892c2..ec638bc82de 100644
--- a/cmake/symlinks.cmake
+++ b/cmake/symlinks.cmake
@@ -1,4 +1,8 @@
# Create lists
+if(COMMAND REGISTER_SYMLINK)
+ return()
+endif()
+
macro(REGISTER_SYMLINK from to)
list(APPEND MARIADB_SYMLINK_FROMS ${from})
list(APPEND MARIADB_SYMLINK_TOS ${to})
diff --git a/win/packaging/ca/CMakeLists.txt b/win/packaging/ca/CMakeLists.txt
index 24a75e356c9..99dc7da01fb 100644
--- a/win/packaging/ca/CMakeLists.txt
+++ b/win/packaging/ca/CMakeLists.txt
@@ -14,9 +14,20 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
INCLUDE_DIRECTORIES(${WIX_DIR}/../SDK/${WIX_MSVC_SUFFIX}/inc)
-SET(WIXCA_SOURCES CustomAction.cpp CustomAction.def)
+SET(WIXCA_SOURCES CustomAction.cpp CustomAction.def ${CMAKE_CURRENT_BINARY_DIR}/symlinks.cc)
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql ${CMAKE_CURRENT_SOURCE_DIR})
+
+INCLUDE(symlinks)
+LIST(LENGTH MARIADB_SYMLINK_FROMS LEN)
+MATH(EXPR max_index "${LEN}-1")
+SET(ALL_SYMLINKS "")
+FOREACH(i RANGE 0 ${max_index})
+ LIST(GET MARIADB_SYMLINK_FROMS ${i} src)
+ LIST(GET MARIADB_SYMLINK_TOS ${i} dst)
+ STRING(APPEND ALL_SYMLINKS "{L\"${src}\",L\"${dst}\"},\n")
+ENDFOREACH()
+CONFIGURE_FILE(symlinks.cc.in symlinks.cc)
# Custom action should not depend on C runtime, since we do not know if CRT is installed.
FORCE_STATIC_CRT()
diff --git a/win/packaging/ca/CustomAction.cpp b/win/packaging/ca/CustomAction.cpp
index 5fca1fdbdf7..4f66e266583 100644
--- a/win/packaging/ca/CustomAction.cpp
+++ b/win/packaging/ca/CustomAction.cpp
@@ -746,7 +746,7 @@ extern "C" UINT __stdcall PresetDatabaseProperties(MSIHANDLE hInstall)
if (BufferPoolsizeParamLen && buff[0])
{
- WcaLog(LOGMSG_STANDARD, "BUFFERPOOLSIZE=%s, len=%u",buff, BufferPoolsizeParamLen);
+ WcaLog(LOGMSG_STANDARD, "BUFFERPOOLSIZE=%S, len=%u",buff, BufferPoolsizeParamLen);
InnodbBufferPoolSize= _wtoi64(buff);
}
else
@@ -1013,304 +1013,268 @@ extern "C" BOOL WINAPI DllMain(
return TRUE;
}
-// check if file exists
-inline bool checkIfFileExists (wstring& name) {
- string sLog = "checkIfFileExists, ";
- string sName(name.begin(), name.end() );
-
- ifstream f(sName);
-
- sLog.append(sName);
- sLog.append(", result: ");
- bool fileExists = f.good();
-
- if (f.good())
- sLog.append("true");
- else
- sLog.append("false");
-
- WcaLog(LOGMSG_STANDARD, sLog.c_str());
-
- return f.good();
+static wstring MakeExePath(const wchar_t *installDir, const wchar_t *basename)
+{
+ wstring path(installDir);
+ if (path.back() != L'\\')
+ path.append(L"\\");
+ path.append(L"bin\\");
+ path.append(basename);
+ path.append(L".exe");
+ return path;
}
-// string to wstring
-std::wstring s2ws(const std::string& s)
+static wstring MakeExePath(const wchar_t *installDir, string basename)
{
- int len;
- int slength = (int)s.length() + 1;
- len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
- wchar_t* buf = new wchar_t[len];
- MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
- std::wstring r(buf);
- delete[] buf;
- return r;
+ wstring path(installDir);
+ if (path.back() != L'\\')
+ path.append(L"\\");
+ path.append(L"bin\\");
+ for (auto c : basename)
+ path+= c;
+ path.append(L".exe");
+ return path;
}
-
-/* MDEV-19781 MariaDB symlinks on Windows */
-extern "C" UINT __stdcall CreateSymlinks(MSIHANDLE hInstall)
+static wstring MakeFixSymlinksLogPath()
{
- HRESULT hr = S_OK;
- UINT er = ERROR_SUCCESS;
- wchar_t customActionData[10000];
- wchar_t installDir[MAX_PATH];
- DWORD len = 10000;
- wchar_t installerVersion[MAX_VERSION_PROPERTY_SIZE];
- DWORD size = MAX_VERSION_PROPERTY_SIZE;
- wchar_t binDir[MAX_PATH];
- size_t blen = NULL;
+ wchar_t buf[MAX_PATH];
+ if (GetTempPathW(MAX_PATH, buf))
+ return wstring(buf) + L"\\mariadb_msi_fix_symlinks.log";
+ return L"";
+}
- hr = WcaInitialize(hInstall, __FUNCTION__);
- WcaLog(LOGMSG_STANDARD, "Initialized.");
+static string w2s(wstring w)
+{
+ string s;
+ for (auto wc : w)
+ s += (char)wc;
+ return s;
+}
- if (MsiGetPropertyW(hInstall, L"CustomActionData", customActionData, &len) != ERROR_SUCCESS)
+/*
+ Remove symlinks if target file does not exist.
+ Create symlink if target exists, but symlink is not.
+*/
+static void fix_symlink(const wchar_t *file, const wchar_t *link,
+ const wchar_t *installdir,
+ vector<string> &rollback_actions)
+{
+ WcaLog(LOGMSG_STANDARD, "fix_symlink %S=>%S", link, file);
+
+ auto tgt= MakeExePath(installdir, file);
+ auto lnk= MakeExePath(installdir, link);
+ auto target_path= tgt.c_str();
+ auto link_path= lnk.c_str();
+
+ auto target_attr= GetFileAttributesW(target_path);
+ auto link_attr= GetFileAttributesW(link_path);
+ WcaLog(LOGMSG_STANDARD, "%S %s", target_path,
+ target_attr == INVALID_FILE_ATTRIBUTES ? "does not exist" : "exists");
+ WcaLog(LOGMSG_STANDARD, "%S %s", link_path,
+ link_attr == INVALID_FILE_ATTRIBUTES ? "does not exist" : "exists");
+
+ if (link_attr != INVALID_FILE_ATTRIBUTES &&
+ ((link_attr & FILE_ATTRIBUTE_REPARSE_POINT) == 0))
{
- hr = HRESULT_FROM_WIN32(GetLastError());
- MsiProcessMessage(hInstall, INSTALLMESSAGE_INFO, hr);
+ WcaLog(LOGMSG_STANDARD, "%S is not a symlink!", link_path);
+ return;
}
- if (MsiGetPropertyW(hInstall, L"ProductVersion", installerVersion, &size) != ERROR_SUCCESS)
+ if (target_attr == INVALID_FILE_ATTRIBUTES)
{
- hr = HRESULT_FROM_WIN32(GetLastError());
- MsiProcessMessage(hInstall, INSTALLMESSAGE_INFO, hr);
+ if (link_attr == INVALID_FILE_ATTRIBUTES)
+ {
+ return;
+ }
+ auto ok= DeleteFileW(link_path);
+ WcaLog(LOGMSG_STANDARD, "DeleteFileW(L\"%S\") returned %s, last error %lu",
+ link_path, ok ? "success" : "error", GetLastError());
+ if (ok)
+ {
+ rollback_actions.push_back(string("create_symlink ") + w2s(link) + " " +
+ w2s(file));
+ }
+ return;
}
- MsiProcessMessage(hInstall, INSTALLMESSAGE_INFO, hr);
+ if (link_attr != INVALID_FILE_ATTRIBUTES)
+ return;
+
+ auto ok= CreateSymbolicLinkW(link_path, target_path, 0);
+ WcaLog(LOGMSG_STANDARD,
+ "CreateSymbolicLinkW(\"%S\",\"%S\", 0) returned %s, last error %d",
+ link_path, target_path, ok ? "success" : "error",
+ (int) GetLastError());
+ if (ok)
+ rollback_actions.push_back(string("delete ") + w2s(link));
+}
- wstring wsCustomActionData(customActionData);
- string sCustomActionData(wsCustomActionData.begin(), wsCustomActionData.end());
- WcaLog(LOGMSG_STANDARD, sCustomActionData.c_str());
+static string rollback_info_path()
+{
+ char tmppath[MAX_PATH];
+ if (!GetTempPathA(MAX_PATH, tmppath))
+ return "";
+ string filepath(tmppath);
+ filepath.append("\\mariadb_symlink_rollback_info.tmp");
+ return filepath;
+}
- stringstream ss;
- ss << sCustomActionData;
- vector<string> vCustomActionData;
- while( ss.good() )
+static void save_symlink_rollback_info(vector<string> rollback_info)
+{
+ std::ofstream ofs;
+ string path = rollback_info_path();
+ ofs.open(path, std::ofstream::out | std::ofstream::trunc);
+ if (!ofs.good())
+ return;
+ WcaLog(LOGMSG_STANDARD,
+ "Storing this rollback script for custom action in %s, in case installation rolls back",
+ path.c_str());
+ for (auto line : rollback_info)
{
- string substr;
- getline( ss, substr, '|' );
- WcaLog(LOGMSG_STANDARD, substr.c_str());
- vCustomActionData.push_back( substr );
+ WcaLog(LOGMSG_STANDARD, "%s", line.c_str());
+ ofs << line << "\n";
}
+ WcaLog(LOGMSG_STANDARD, "End of rollback script");
+}
- int i = 0;
- string sBinPath = "";
- string sPathFrom = "";
- string sPathTo = "";
-
- for(auto const& value: vCustomActionData) {
- if (i == 0) {
- sBinPath = value;
- sBinPath.append("bin\\");
- } else if (i == 1) {
- sPathFrom = value;
- } else if (i == 2) {
- sPathTo = value;
- }
-
- WcaLog(LOGMSG_STANDARD, value.c_str());
- i++;
- }
-
- WcaLog(LOGMSG_STANDARD, sBinPath.c_str());
- WcaLog(LOGMSG_STANDARD, sPathFrom.c_str());
- WcaLog(LOGMSG_STANDARD, sPathTo.c_str());
-
- stringstream ssPathFrom, ssPathTo;
- ssPathFrom << sPathFrom;
- ssPathTo << sPathTo;
- vector<string> vPathFrom;
- vector<string> vPathTo;
-
- while(ssPathFrom.good()) {
- string substr = "";
- getline(ssPathFrom, substr, ';');
- substr = substr.insert(0, sBinPath);
- WcaLog(LOGMSG_STANDARD, substr.c_str());
- vPathFrom.push_back(substr);
- }
+#include <symlinks.h>
+/* MDEV-19781 MariaDB symlinks on Windows */
+extern "C" UINT __stdcall FixSymlinksRollback(MSIHANDLE hInstall)
+{
+ HRESULT hr= S_OK;
+ UINT er= ERROR_SUCCESS;
+ wchar_t targetdir[MAX_PATH];
+ DWORD len= MAX_PATH;
+ hr= WcaInitialize(hInstall, __FUNCTION__);
+ WcaLog(LOGMSG_STANDARD, "Initialized.");
+ std::ifstream ifs;
+ std::string command;
- while(ssPathTo.good()) {
- string substr = "";
- getline(ssPathTo, substr, ';');
- substr = substr.insert(0, sBinPath);
- WcaLog(LOGMSG_STANDARD, substr.c_str());
- vPathTo.push_back(substr);
+ if (MsiGetPropertyW(hInstall, L"CustomActionData", targetdir, &len) !=
+ ERROR_SUCCESS)
+ {
+ hr= HRESULT_FROM_WIN32(GetLastError());
+ ExitOnFailure(hr, "MsiGetPropertyW failed");
}
- i = 0;
-
- for(auto const& value: vPathTo) {
- string &sTmpPathFrom = vPathFrom[i];
- string &sTmpPathTo = vPathTo[i];
-
- sTmpPathFrom.append(".exe");
- sTmpPathTo.append(".exe");
-
- wstring wsPathFrom = s2ws(sTmpPathFrom);
- LPCWSTR lPathFrom = wsPathFrom.c_str();
- wstring wsPathTo = s2ws(sTmpPathTo);
- LPCWSTR lPathTo = wsPathTo.c_str();
-
- int createdSymlink = -1;
-
- if (checkIfFileExists(wsPathFrom))
- createdSymlink = CreateSymbolicLinkW(wsPathTo.c_str(), wsPathFrom.c_str(), 0);
-
- string created = "Created symlink: ";
- created.append(sTmpPathTo);
- created.append(" --> ");
- created.append(sTmpPathFrom);
- created.append(", result= ");
- created.append(to_string(createdSymlink));
-
- WcaLog(LOGMSG_STANDARD, created.c_str());
+ ifs.open(rollback_info_path(), std::ofstream::in);
+ if (!ifs.good())
+ goto LExit;
- i++;
+ while (ifs >> command)
+ {
+ if (command == "create_symlink")
+ {
+ string link;
+ ifs >> link;
+ auto link_path= MakeExePath(targetdir, link);
+ string file;
+ ifs >> file;
+ auto target_path= MakeExePath(targetdir, file);
+ bool ok= CreateSymbolicLinkW(link_path.c_str(), target_path.c_str(), 0);
+ WcaLog(LOGMSG_STANDARD, "CreateSymbolicLinkW(%S,%S) %s, last error %lu",
+ link_path.c_str(), target_path.c_str(), ok ? "success" : "error",
+ GetLastError());
+ }
+ else if (command == "delete")
+ {
+ string link;
+ ifs >> link;
+ auto link_path= MakeExePath(targetdir, link);
+ auto link_attr= GetFileAttributesW(link_path.c_str());
+ if (link_attr != INVALID_FILE_ATTRIBUTES &&
+ (link_attr & FILE_ATTRIBUTE_REPARSE_POINT))
+ {
+ auto ok= DeleteFileW(link_path.c_str());
+ WcaLog(LOGMSG_STANDARD, "DeleteFile(%S) %s, last error %lu",
+ link_path.c_str(), ok ? "success" : "error", GetLastError());
+ }
+ }
+ else
+ {
+ WcaLog(LOGMSG_STANDARD, "Unknown command '%s' in rollback script ",
+ command.c_str());
+ goto LExit;
+ }
}
- ReleaseStr(installDir);
- ReleaseStr(installerVersion);
- ReleaseStr(binDir);
+LExit:
return WcaFinalize(er);
}
-/* MDEV-19781 MariaDB symlinks on Windows */
-extern "C" UINT __stdcall DeleteSymlinks(MSIHANDLE hInstall)
+
+extern "C" UINT __stdcall SymlinksUninstall(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
- wchar_t customActionData[10000];
- wchar_t installDir[MAX_PATH];
- DWORD len = 10000;
- DWORD size = MAX_VERSION_PROPERTY_SIZE;
- wchar_t binDir[MAX_PATH];
- size_t blen = NULL;
-
+ wchar_t targetdir[MAX_PATH];
+ DWORD len = MAX_PATH;
+ int i;
hr = WcaInitialize(hInstall, __FUNCTION__);
- WcaLog(LOGMSG_STANDARD, "DeleteSymlinks initialized.");
+ WcaLog(LOGMSG_STANDARD, "Initialized.");
- if (MsiGetPropertyW(hInstall, L"CustomActionData", customActionData, &len) != ERROR_SUCCESS)
+ if (MsiGetPropertyW(hInstall, L"CustomActionData", targetdir, &len) !=
+ ERROR_SUCCESS)
{
hr = HRESULT_FROM_WIN32(GetLastError());
- MsiProcessMessage(hInstall, INSTALLMESSAGE_INFO, hr);
+ ExitOnFailure(hr, "MsiGetPropertyW failed");
}
- wstring wsCustomActionData(customActionData);
- string sCustomActionData(wsCustomActionData.begin(), wsCustomActionData.end());
- WcaLog(LOGMSG_STANDARD, sCustomActionData.c_str());
-
- stringstream ss;
- ss << sCustomActionData;
- vector<string> vCustomActionData;
-
- while( ss.good() )
+ for (i = 0; all_symlinks[i].file; i++)
{
- string substr;
- getline( ss, substr, '|' );
- WcaLog(LOGMSG_STANDARD, substr.c_str());
- vCustomActionData.push_back( substr );
- }
+ auto link_path = MakeExePath(targetdir, all_symlinks[i].link);
+ auto link_attr = GetFileAttributesW(link_path.c_str());
+ auto filepath = link_path.c_str();
- int i = 0;
- string sBinPath = "";
- string sPathFrom = "";
- string sPathTo = "";
-
- for(auto const& value: vCustomActionData) {
- if (i == 0) {
- sBinPath = value;
- sBinPath.append("bin\\");
- } else if (i == 1) {
- sPathFrom = value;
- } else if (i == 2) {
- sPathTo = value;
+ if (link_attr == INVALID_FILE_ATTRIBUTES)
+ {
+ WcaLog(LOGMSG_STANDARD, " %S does not exist",filepath);
+ continue;
}
- WcaLog(LOGMSG_STANDARD, value.c_str());
-
- i++;
- }
-
- WcaLog(LOGMSG_STANDARD, sBinPath.c_str());
- WcaLog(LOGMSG_STANDARD, sPathFrom.c_str());
- WcaLog(LOGMSG_STANDARD, sPathTo.c_str());
-
- stringstream ssPathFrom, ssPathTo;
- ssPathFrom << sPathFrom;
- ssPathTo << sPathTo;
- vector<string> vPathFrom;
- vector<string> vPathTo;
-
- while(ssPathFrom.good()) {
- string substr = "";
- getline(ssPathFrom, substr, ';');
- substr = substr.insert(0, sBinPath);
- WcaLog(LOGMSG_STANDARD, substr.c_str());
- vPathFrom.push_back(substr);
- }
-
- while(ssPathTo.good()) {
- string substr = "";
- getline(ssPathTo, substr, ';');
- substr = substr.insert(0, sBinPath);
- WcaLog(LOGMSG_STANDARD, substr.c_str());
- vPathTo.push_back(substr);
+ if(!(link_attr & FILE_ATTRIBUTE_REPARSE_POINT))
+ {
+ WcaLog(LOGMSG_STANDARD, " %S is not a symbolic link!",filepath);
+ continue;
+ }
+ BOOL ok = DeleteFileW(filepath);
+ WcaLog(LOGMSG_STANDARD, "DeleteFile(%S) %s, last error %lu",
+ filepath, ok? "succeeded":"failed", GetLastError());
}
- i = 0;
-
- for(auto const& value: vPathTo) {
- string &sTmpPathFrom = vPathFrom[i];
- string &sTmpPathTo = vPathTo[i];
-
- sTmpPathFrom.append(".exe");
- sTmpPathTo.append(".exe");
-
- wstring wsPathFrom = s2ws(sTmpPathFrom);
- LPCWSTR lPathFrom = wsPathFrom.c_str();
- wstring wsPathTo = s2ws(sTmpPathTo);
- LPCWSTR lPathTo = wsPathTo.c_str();
-
- int deletedSymlink = -1;
-
- if (checkIfFileExists(wsPathTo))
- deletedSymlink = DeleteFileW(wsPathTo.c_str());
-
- string deleted = "Deleted symlink: ";
- deleted.append(sTmpPathTo);
- deleted.append(" --> ");
- deleted.append(sTmpPathFrom);
- deleted.append(", result= ");
- deleted.append(to_string(deletedSymlink));
+LExit:
+ return WcaFinalize(er);
+}
- WcaLog(LOGMSG_STANDARD, deleted.c_str());
+/* MDEV-19781 MariaDB symlinks on Windows */
+extern "C" UINT __stdcall FixSymlinks(MSIHANDLE hInstall)
+{
+ HRESULT hr= S_OK;
+ UINT er= ERROR_SUCCESS;
+ wchar_t targetdir[MAX_PATH];
+ vector<string> rollback_actions;
+ DWORD len= MAX_PATH;
+ int i;
+ hr= WcaInitialize(hInstall, __FUNCTION__);
+ WcaLog(LOGMSG_STANDARD, "Initialized.");
- i++;
+ if (MsiGetPropertyW(hInstall, L"CustomActionData", targetdir, &len) !=
+ ERROR_SUCCESS)
+ {
+ hr= HRESULT_FROM_WIN32(GetLastError());
+ ExitOnFailure(hr, "MsiGetPropertyW failed");
}
-/*
-
- for(size_t i = 0; i < std::size(symlink_to); i++) {
- wchar_t pathTo[MAX_PATH];
- wcscpy(pathTo, binDir);
- wcscat(pathTo, symlink_to[i].data());
+ for (i= 0; all_symlinks[i].file; i++)
+ fix_symlink(all_symlinks[i].file, all_symlinks[i].link, targetdir,
+ rollback_actions);
- wstring wsPathTo(pathTo);
+ save_symlink_rollback_info(rollback_actions);
- if ( checkIfFileExists(wsPathTo) ) {
- DeleteFileW(pathTo);
- } else {
- hr = HRESULT_FROM_WIN32(GetLastError());
- ExitOnFailure(hr, "Could not delete symlink");
- }
- }
-
-*/
-
- ReleaseStr(installDir);
- ReleaseStr(binDir);
+LExit:
return WcaFinalize(er);
-} \ No newline at end of file
+}
+
diff --git a/win/packaging/ca/CustomAction.def b/win/packaging/ca/CustomAction.def
index c99951b4cf9..8169968e26b 100644
--- a/win/packaging/ca/CustomAction.def
+++ b/win/packaging/ca/CustomAction.def
@@ -8,5 +8,6 @@ CheckDatabaseProperties
CheckDataDirectoryEmpty
CheckDBInUse
CheckServiceUpgrades
-CreateSymlinks
-DeleteSymlinks
+FixSymlinks
+FixSymlinksRollback
+SymlinksUninstall
diff --git a/win/packaging/ca/symlinks.cc.in b/win/packaging/ca/symlinks.cc.in
new file mode 100644
index 00000000000..62ca9884af8
--- /dev/null
+++ b/win/packaging/ca/symlinks.cc.in
@@ -0,0 +1,6 @@
+#include "symlinks.h"
+symlink all_symlinks[]=
+{
+@ALL_SYMLINKS@
+{nullptr, nullptr}
+};
diff --git a/win/packaging/ca/symlinks.h b/win/packaging/ca/symlinks.h
new file mode 100644
index 00000000000..4fc1f2cb685
--- /dev/null
+++ b/win/packaging/ca/symlinks.h
@@ -0,0 +1,8 @@
+#pragma once
+struct symlink
+{
+ const wchar_t *file;
+ const wchar_t *link;
+};
+
+extern symlink all_symlinks[];
diff --git a/win/packaging/create_msi.cmake b/win/packaging/create_msi.cmake
index ac0e20817dd..0527c6a7787 100644
--- a/win/packaging/create_msi.cmake
+++ b/win/packaging/create_msi.cmake
@@ -1,7 +1,3 @@
-# get the symlink lists
-#INCLUDE(${CMAKE_SOURCE_DIR}/../../cmake/symlinks.cmake)
-#INCLUDE(symlinks)
-INCLUDE(${CMAKE_CURRENT_LIST_DIR}/../../cmake/symlinks.cmake)
MACRO(MAKE_WIX_IDENTIFIER str varname)
STRING(REPLACE "/" "." ${varname} "${str}")
diff --git a/win/packaging/extra.wxs.in b/win/packaging/extra.wxs.in
index d8ea35fac81..7de62907300 100644
--- a/win/packaging/extra.wxs.in
+++ b/win/packaging/extra.wxs.in
@@ -59,9 +59,6 @@
<Property Id="BUFFERPOOLSIZE" Secure="yes"/>
<!-- Innodb page size -->
<Property Id="PAGESIZE" Secure="yes" Value="16K"/>
- <!-- Symlinks -->
- <Property Id="SYMLINK_TOS" Value="@MARIADB_SYMLINK_TOS@" />
- <Property Id="SYMLINK_FROMS" Value="@MARIADB_SYMLINK_FROMS@" />
<CustomAction Id="LaunchUrl" BinaryKey="WixCA" DllEntry="WixShellExec" Execute="immediate" Return="check" Impersonate="yes" />
@@ -601,16 +598,19 @@
<?endif ?>
<!-- Custom action, create symlinks -->
- <CustomAction Id="CreateSymlinks.SetProperty" Return="check" Property="CreateSymlinks" Value="[INSTALLDIR]|[SYMLINK_FROMS]|[SYMLINK_TOS]" />
- <CustomAction Id="CreateSymlinks" BinaryKey="wixca.dll" DllEntry="CreateSymlinks" Execute="deferred" Impersonate="no" Return="ignore" />
- <CustomAction Id="DeleteSymlinks.SetProperty" Return="check" Property="DeleteSymlinks" Value="[INSTALLDIR]|[SYMLINK_FROMS]|[SYMLINK_TOS]" />
- <CustomAction Id='DeleteSymlinks' BinaryKey="wixca.dll" DllEntry="DeleteSymlinks" Execute="deferred" Impersonate="no" Return="ignore" />
-
+ <CustomAction Id="Symlinks.SetProperty" Return="check" Property="Symlinks" Value="[INSTALLDIR]" />
+ <CustomAction Id="Symlinks" BinaryKey="wixca.dll" DllEntry="FixSymlinks" Execute="deferred" Impersonate="no" Return="ignore"/>
+ <CustomAction Id="SymlinksRollback.SetProperty" Return="check" Property="SymlinksRollback" Value="[INSTALLDIR]" />
+ <CustomAction Id="SymlinksRollback" BinaryKey="wixca.dll" DllEntry="FixSymlinksRollback" Execute="rollback" Impersonate="no" Return="ignore"/>
+ <CustomAction Id="SymlinksUninstall.SetProperty" Return="check" Property="SymlinksUninstall" Value="[INSTALLDIR]" />
+ <CustomAction Id="SymlinksUninstall" BinaryKey="wixca.dll" DllEntry="SymlinksUninstall" Execute="deferred" Impersonate="no" Return="ignore"/>
<InstallExecuteSequence>
- <Custom Action="CreateSymlinks.SetProperty" Before="CreateSymlinks">NOT Installed</Custom>
- <Custom Action="CreateSymlinks" Before="InstallFinalize">NOT Installed</Custom>
- <Custom Action="DeleteSymlinks.SetProperty" Before="DeleteSymlinks">Installed AND NOT REINSTALL</Custom>
- <Custom Action="DeleteSymlinks" Before="RemoveFiles">Installed AND NOT REINSTALL</Custom>
+ <Custom Action="Symlinks.SetProperty" Before="Symlinks">NOT Installed OR UPGRADINGPRODUCTCODE</Custom>
+ <Custom Action="Symlinks" After="SymlinksRollback">NOT Installed OR UPGRADINGPRODUCTCODE</Custom>
+ <Custom Action="SymlinksRollback.SetProperty" Before="SymlinksRollback">NOT Installed OR UPGRADINGPRODUCTCODE</Custom>
+ <Custom Action="SymlinksRollback" After="InstallFiles">NOT Installed OR UPGRADINGPRODUCTCODE</Custom>
+ <Custom Action="SymlinksUninstall.SetProperty" Before="SymlinksUninstall">Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
+ <Custom Action="SymlinksUninstall" Before="RemoveFiles">Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
</InstallExecuteSequence>
<!-- Custom action, call mysql_install_db -->
@@ -821,7 +821,6 @@
Name='MinorVersion' Value='@MINOR_VERSION@' Type='string'/>
</Component>
</Feature>
-
<Condition Message=
'Setting the ALLUSERS property is not allowed because [ProductName] is a per-machine application. Setup will now exit.'>
<![CDATA[ALLUSERS = "1"]]>