diff options
author | Vladislav Vaintroub <wlad@mariadb.com> | 2017-10-03 00:13:58 +0000 |
---|---|---|
committer | Vladislav Vaintroub <wlad@mariadb.com> | 2017-10-03 00:13:58 +0000 |
commit | e6862cf1ff3ab11189f5d312055eccb56212a300 (patch) | |
tree | c40fb64071ccfd0ad90e05f708302051a6ac1e61 | |
parent | de4a00d4f7b4a299cf8fba7bb501fbbbe558ae17 (diff) | |
download | mariadb-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.cpp | 45 |
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: |