summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2017-10-03 00:13:58 +0000
committerVladislav Vaintroub <wlad@mariadb.com>2017-10-03 00:13:58 +0000
commite6862cf1ff3ab11189f5d312055eccb56212a300 (patch)
treec40fb64071ccfd0ad90e05f708302051a6ac1e61
parentde4a00d4f7b4a299cf8fba7bb501fbbbe558ae17 (diff)
downloadmariadb-git-e6862cf1ff3ab11189f5d312055eccb56212a300.tar.gz
Windows MSI : dump server error log to MSI log on installation failure.
On failure, installer executes rollback actions, among them removing newly created data directory with all files in it. This patch makes installer at dump mariadb error log to installer log, before removing the files. This should make troubleshooting a little easier.
-rw-r--r--win/packaging/ca/CustomAction.cpp45
1 files changed, 44 insertions, 1 deletions
diff --git a/win/packaging/ca/CustomAction.cpp b/win/packaging/ca/CustomAction.cpp
index 56df4ae791e..98c8c844b6b 100644
--- a/win/packaging/ca/CustomAction.cpp
+++ b/win/packaging/ca/CustomAction.cpp
@@ -767,6 +767,49 @@ extern "C" UINT __stdcall PresetDatabaseProperties(MSIHANDLE hInstall)
LExit:
return WcaFinalize(er);
}
+
+static BOOL FindErrorLog(const wchar_t *dir, wchar_t * ErrorLogFile, size_t ErrorLogLen)
+{
+ WIN32_FIND_DATA FindFileData;
+ HANDLE hFind;
+ wchar_t name[MAX_PATH];
+ wcsncpy_s(name,dir, MAX_PATH);
+ wcsncat_s(name,L"\\*.err", MAX_PATH);
+ hFind = FindFirstFileW(name,&FindFileData);
+ if (hFind != INVALID_HANDLE_VALUE)
+ {
+ _snwprintf(ErrorLogFile, ErrorLogLen,
+ L"%s\\%s",dir, FindFileData.cFileName);
+ FindClose(hFind);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void DumpErrorLog(const wchar_t *dir)
+{
+ wchar_t filepath[MAX_PATH];
+ if (!FindErrorLog(dir, filepath, MAX_PATH))
+ return;
+ FILE *f= _wfopen(filepath, L"r");
+ if (!f)
+ return;
+ char buf[2048];
+ WcaLog(LOGMSG_STANDARD,"=== dumping error log %S === ",filepath);
+ while (fgets(buf, sizeof(buf), f))
+ {
+ /* Strip off EOL chars. */
+ size_t len = strlen(buf);
+ if (len > 0 && buf[len-1] == '\n')
+ buf[--len]= 0;
+ if (len > 0 && buf[len-1] == '\r')
+ buf[--len]= 0;
+ WcaLog(LOGMSG_STANDARD,"%s",buf);
+ }
+ fclose(f);
+ WcaLog(LOGMSG_STANDARD,"=== end of error log ===");
+}
+
/* Remove service and data directory created by CreateDatabase operation */
extern "C" UINT __stdcall CreateDatabaseRollback(MSIHANDLE hInstall)
{
@@ -774,7 +817,6 @@ extern "C" UINT __stdcall CreateDatabaseRollback(MSIHANDLE hInstall)
UINT er = ERROR_SUCCESS;
wchar_t* service= 0;
wchar_t* dir= 0;
-
hr = WcaInitialize(hInstall, __FUNCTION__);
ExitOnFailure(hr, "Failed to initialize");
WcaLog(LOGMSG_STANDARD, "Initialized.");
@@ -804,6 +846,7 @@ extern "C" UINT __stdcall CreateDatabaseRollback(MSIHANDLE hInstall)
}
if(dir)
{
+ DumpErrorLog(dir);
ExecRemoveDataDirectory(dir);
}
LExit: