diff options
author | Vladislav Vaintroub <wlad@montyprogram.com> | 2011-01-30 22:27:59 +0100 |
---|---|---|
committer | Vladislav Vaintroub <wlad@montyprogram.com> | 2011-01-30 22:27:59 +0100 |
commit | 366ee3c791ca6b5e7688a5138dfe347860772d2a (patch) | |
tree | 382224bbff0ec202ac76390e209c286a069b4bda | |
parent | e353bc80f721fc415ab2977f503878d69b43e63e (diff) | |
download | mariadb-git-366ee3c791ca6b5e7688a5138dfe347860772d2a.tar.gz |
Move common functionality (analyze service configuration) into winservice library
-rwxr-xr-x | sql/CMakeLists.txt | 5 | ||||
-rw-r--r-- | sql/Makefile.am | 1 | ||||
-rw-r--r-- | sql/mysql_upgrade_service.cc | 72 | ||||
-rw-r--r-- | win/packaging/CMakeLists.txt | 1 | ||||
-rw-r--r-- | win/packaging/ca/CMakeLists.txt | 3 | ||||
-rw-r--r-- | win/packaging/ca/CustomAction.cpp | 48 | ||||
-rw-r--r-- | win/upgrade_wizard/CMakeLists.txt | 6 | ||||
-rw-r--r-- | win/upgrade_wizard/upgradeDlg.cpp | 110 |
8 files changed, 70 insertions, 176 deletions
diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index 1fd64e8fc76..09a253189a5 100755 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -186,10 +186,13 @@ ADD_CUSTOM_COMMAND( COMPONENT Server) TARGET_LINK_LIBRARIES(mysql_install_db mysys strings dbug) + ADD_LIBRARY(winservice STATIC winservice.c) + MYSQL_ADD_EXECUTABLE(mysql_upgrade_service mysql_upgrade_service.cc COMPONENT Server) - TARGET_LINK_LIBRARIES(mysql_upgrade_service mysys strings dbug) + + TARGET_LINK_LIBRARIES(mysql_upgrade_service mysys strings dbug winservice) # mysql_install_db should be in the same directory as mysqld # to work correctly diff --git a/sql/Makefile.am b/sql/Makefile.am index 899795aa709..4d3289c3dfe 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -153,6 +153,7 @@ BUILT_SOURCES = $(BUILT_MAINT_SRC) lex_hash.h link_sources EXTRA_DIST = udf_example.c udf_example.def $(BUILT_MAINT_SRC) \ nt_servc.cc nt_servc.h mysql_install_db.cc mysql_upgrade_service.cc \ message.mc message.h message.rc MSG00001.bin \ + winservice.c winservice.h CMakeLists.txt CLEANFILES = lex_hash.h sql_yacc.output link_sources diff --git a/sql/mysql_upgrade_service.cc b/sql/mysql_upgrade_service.cc index c688bb8061d..1d1e8ea099d 100644 --- a/sql/mysql_upgrade_service.cc +++ b/sql/mysql_upgrade_service.cc @@ -26,6 +26,7 @@ #include <my_sys.h> #include <m_string.h> #include <mysql_version.h> +#include <winservice.h> #include <stdlib.h> #include <stdio.h> @@ -38,8 +39,8 @@ static char mysqld_path[MAX_PATH]; static char mysqladmin_path[MAX_PATH]; static char mysqlupgrade_path[MAX_PATH]; -static char defaults_file_param[FN_REFLEN]; -static char logfile_path[FN_REFLEN]; +static char defaults_file_param[MAX_PATH + 16]; /*--defaults-file=<path> */ +static char logfile_path[MAX_PATH]; static char *opt_service; static SC_HANDLE service; static SC_HANDLE scm; @@ -301,7 +302,7 @@ end: /* Shutdown mysql server. Not using mysqladmin, since our --skip-grant-tables do not work anymore after mysql_upgrade - that does "flush privileges". Instead, the shutdown handle is set. + that does "flush privileges". Instead, the shutdown event is set. */ void initiate_mysqld_shutdown() { @@ -327,8 +328,7 @@ void initiate_mysqld_shutdown() */ static void change_service_config() { - wchar_t old_mysqld_path[MAX_PATH]; - wchar_t *file_part; + char defaults_file[MAX_PATH]; char default_character_set[64]; @@ -346,59 +346,32 @@ static void change_service_config() if (!QueryServiceConfigW(service, config, size, &needed)) die("QueryServiceConfig failed with %d\n", GetLastError()); - int numargs; - LPWSTR *args= CommandLineToArgvW(config->lpBinaryPathName, &numargs); - - char commandline[3*FN_REFLEN +32]; - - /* Run some checks to ensure we're really upgrading mysql service */ - - if(numargs != 3) - { - die("Expected 3 parameters in service configuration binPath," - "got %d parameters instead\n. binPath: %S", numargs, - config->lpBinaryPathName); - } - if(wcsncmp(args[1], L"--defaults-file=", 16) != 0) - { - die("Unexpected service configuration, second parameter must start with " - "--defaults-file. binPath= %S", config->lpBinaryPathName); - } - GetFullPathNameW(args[0], MAX_PATH, old_mysqld_path, &file_part); - - if(wcsicmp(file_part, L"mysqld.exe") != 0 && - wcsicmp(file_part, L"mysqld") != 0) + mysqld_service_properties props; + if (get_mysql_service_properties(config->lpBinaryPathName, &props)) { - die("The service executable is not mysqld. binPath: %S", - config->lpBinaryPathName); + die("Not a valid MySQL service"); } - if(wcsicmp(file_part, L"mysqld") == 0) - wcscat_s(old_mysqld_path, L".exe"); - - int old_mysqld_major, old_mysqld_minor; - get_file_version(old_mysqld_path, &old_mysqld_major, &old_mysqld_minor); int my_major= MYSQL_VERSION_ID/10000; int my_minor= (MYSQL_VERSION_ID - 10000*my_major)/100; - if(my_major < old_mysqld_major || - (my_major == old_mysqld_major && my_minor < old_mysqld_minor)) + if(my_major < props.version_major || + (my_major == props.version_minor && my_minor < props.version_patch)) { die("Can not downgrade, the service is currently running as version %d.%d" - ", my version is %d.%d", old_mysqld_major, old_mysqld_minor, my_major, - my_minor); + ", my version is %d.%d", props.version_major, props.version_minor, + my_major, my_minor); } - wcstombs(defaults_file, args[1] + 16, MAX_PATH); /* Remove basedir from defaults file, otherwise the service wont come up in the new version, and will complain about mismatched message file. */ - WritePrivateProfileString("mysqld", "basedir",NULL, defaults_file); + WritePrivateProfileString("mysqld", "basedir",NULL, props.inifile); #ifdef _WIN64 /* Currently, pbxt is non-functional on x64 */ - WritePrivateProfileString("mysqld", "loose-skip-pbxt","1", defaults_file); + WritePrivateProfileString("mysqld", "loose-skip-pbxt","1", props.inifile); #endif /* Replace default-character-set with character-set-server, to avoid @@ -406,7 +379,7 @@ static void change_service_config() message. */ default_character_set[0]=0; - GetPrivateProfileStringA("mysqld", "default-character-set", NULL, + GetPrivateProfileString("mysqld", "default-character-set", NULL, default_character_set, sizeof(default_character_set), defaults_file); if(default_character_set[0]) { @@ -416,15 +389,16 @@ static void change_service_config() default_character_set, defaults_file); } - sprintf_s(commandline, "\"%s\" \"%S\" \"%S\"", mysqld_path, args[1], args[2]); + sprintf(defaults_file_param,"--defaults-file=%s", props.inifile); + char commandline[3*MAX_PATH + 19]; + sprintf_s(commandline, "\"%s\" \"%s\" \"%s\"", mysqld_path, + defaults_file_param, opt_service); if (!ChangeServiceConfig(service, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, commandline, NULL, NULL, NULL, NULL, NULL, NULL)) { die("ChangeServiceConfigW failed with %d", GetLastError()); } - sprintf_s(defaults_file_param, "%S", args[1]); - LocalFree(args); } @@ -483,13 +457,13 @@ int main(int argc, char **argv) for communication, for security reasons. */ char socket_param[FN_REFLEN]; - sprintf_s(socket_param,"--shared_memory_base_name=mysql_upgrade_service_%d", + sprintf_s(socket_param,"--socket=mysql_upgrade_service_%d", GetCurrentProcessId()); log("Phase 3/8: Starting mysqld for upgrade"); mysqld_process= (HANDLE)run_tool(P_NOWAIT, mysqld_path, defaults_file_param, "--skip-networking", "--skip-grant-tables", - "--enable-shared-memory", socket_param, NULL); + "--enable-named-pipe", socket_param, NULL); if(mysqld_process == INVALID_HANDLE_VALUE) { @@ -503,7 +477,7 @@ int main(int argc, char **argv) if (WaitForSingleObject(mysqld_process, 0) != WAIT_TIMEOUT) die("mysqld.exe did not start"); - if (run_tool(P_WAIT, mysqladmin_path, "--protocol=memory", + if (run_tool(P_WAIT, mysqladmin_path, "--protocol=pipe", socket_param, "ping", NULL) == 0) { break; @@ -516,7 +490,7 @@ int main(int argc, char **argv) log("Phase 5/8: Running mysql_upgrade"); int upgrade_err = (int) run_tool(P_WAIT, mysqlupgrade_path, - "--protocol=memory", "--force", socket_param, + "--protocol=pipe", "--force", socket_param, NULL); log("Phase 6/8: Initiating server shutdown"); diff --git a/win/packaging/CMakeLists.txt b/win/packaging/CMakeLists.txt index 67d22b15ab9..c0670a171ba 100644 --- a/win/packaging/CMakeLists.txt +++ b/win/packaging/CMakeLists.txt @@ -23,6 +23,7 @@ FIND_PATH(WIX_DIR heat.exe $ENV{ProgramFiles}/wix/bin "$ENV{ProgramFiles}/Windows Installer XML v3/bin" "$ENV{ProgramFiles}/Windows Installer XML v3.5/bin" + "$ENV{ProgramFiles}/Windows Installer XML v3.6/bin" ) SET(CPACK_WIX_PACKAGE_BASE_NAME "MariaDB") diff --git a/win/packaging/ca/CMakeLists.txt b/win/packaging/ca/CMakeLists.txt index d09fae1918c..7dd30123587 100644 --- a/win/packaging/ca/CMakeLists.txt +++ b/win/packaging/ca/CMakeLists.txt @@ -18,6 +18,7 @@ LINK_DIRECTORIES(${WIX_DIR}/../SDK/lib) SET(WIXCA_SOURCES CustomAction.cpp CustomAction.def) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql) IF(CMAKE_SIZEOF_VOID_P EQUAL 8) SET(WIX_ARCH_SUFFIX "_x64") @@ -47,4 +48,4 @@ FIND_LIBRARY(WIX_DUTIL_LIBRARY ADD_VERSION_INFO(wixca SHARED WIXCA_SOURCES) ADD_LIBRARY(wixca SHARED EXCLUDE_FROM_ALL ${WIXCA_SOURCES}) TARGET_LINK_LIBRARIES(wixca ${WIX_WCAUTIL_LIBRARY} ${WIX_DUTIL_LIBRARY} - msi version) + msi version winservice) diff --git a/win/packaging/ca/CustomAction.cpp b/win/packaging/ca/CustomAction.cpp index 1910aa4c1d3..af2602348cd 100644 --- a/win/packaging/ca/CustomAction.cpp +++ b/win/packaging/ca/CustomAction.cpp @@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <strsafe.h> #include <assert.h> +#include <winservice.h> UINT ExecRemoveDataDirectory(wchar_t *dir) { @@ -547,49 +548,6 @@ LExit: return WcaFinalize(er); } -/* - Extract major and minor version from - mysqld.exe, using commandline in service definition -*/ -static void GetMySQLVersion( - wchar_t *cmdline, - wchar_t *programBuf, - bool *isMySQL, int *major, int *minor) -{ - *major= 0; - *minor= 0; - *isMySQL= false; - int argc; - wchar_t **wargv = CommandLineToArgvW(cmdline, &argc); - if(argc != 3) - return; - - wchar_t path[MAX_PATH]; - wchar_t *filepart; - - wcscpy_s(programBuf, MAX_PATH, wargv[0]); - if(!wcsstr(programBuf, L".exe")) - wcscat_s(programBuf,MAX_PATH, L".exe"); - - GetFullPathNameW(programBuf,MAX_PATH, path, &filepart); - if(wcsicmp(filepart, L"mysqld.exe") == 0) - { - *isMySQL = true; - DWORD handle; - DWORD size = GetFileVersionInfoSizeW(path, &handle); - BYTE* versionInfo = new BYTE[size]; - if (GetFileVersionInfo(path, handle, size, versionInfo)) - { - UINT len = 0; - VS_FIXEDFILEINFO* vsfi = NULL; - VerQueryValueW(versionInfo, L"\\", (void**)&vsfi, &len); - *major= HIWORD(vsfi->dwFileVersionMS); - *minor= LOWORD(vsfi->dwFileVersionMS); - } - delete[] versionInfo; - } -} - /* Enables/disables optional "Launch upgrade wizard" checkbox at the end of installation @@ -603,7 +561,7 @@ extern "C" UINT __stdcall CheckServiceUpgrades(MSIHANDLE hInstall) wchar_t* service= 0; wchar_t* dir= 0; wchar_t installerVersion[MAX_VERSION_PROPERTY_SIZE]; - wchar_t installDir[MAX_PATH]; + char installDir[MAX_PATH]; DWORD size =MAX_VERSION_PROPERTY_SIZE; int installerMajorVersion, installerMinorVersion, installerPatchVersion; bool upgradableServiceFound=false; @@ -623,7 +581,7 @@ extern "C" UINT __stdcall CheckServiceUpgrades(MSIHANDLE hInstall) } size= MAX_PATH; - if (MsiGetPropertyW(hInstall,L"INSTALLDIR", installDir, &size) + if (MsiGetPropertyA(hInstall,"INSTALLDIR", installDir, &size) != ERROR_SUCCESS) { hr = HRESULT_FROM_WIN32(GetLastError()); diff --git a/win/upgrade_wizard/CMakeLists.txt b/win/upgrade_wizard/CMakeLists.txt index d23c6b0a607..fad67a207de 100644 --- a/win/upgrade_wizard/CMakeLists.txt +++ b/win/upgrade_wizard/CMakeLists.txt @@ -18,9 +18,11 @@ SET(CMAKE_MFC_FLAG 1) # Enable exception handling (avoids warnings) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") -MYSQL_ADD_EXECUTABLE(upgrade_wizard upgrade.cpp upgradeDlg.cpp upgrade.rc +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql) +MYSQL_ADD_EXECUTABLE(upgrade_wizard + upgrade.cpp upgradeDlg.cpp upgrade.rc COMPONENT Server) - +TARGET_LINK_LIBRARIES(upgrade_wizard winservice) # upgrade_wizard is Windows executable, set WIN32_EXECUTABLE so it does not # create a console. SET_TARGET_PROPERTIES(upgrade_wizard PROPERTIES WIN32_EXECUTABLE 1) diff --git a/win/upgrade_wizard/upgradeDlg.cpp b/win/upgrade_wizard/upgradeDlg.cpp index 97c40f53d94..f650407f245 100644 --- a/win/upgrade_wizard/upgradeDlg.cpp +++ b/win/upgrade_wizard/upgradeDlg.cpp @@ -14,6 +14,8 @@ #include <string> #include <vector> +#include <winservice.h> + using namespace std; #ifdef _DEBUG @@ -75,7 +77,7 @@ vector<ServiceProperties> services; <unknown> , of executable does not have any version info embedded (like MySQL 5.1 for example) */ -string GetExeVersion(const string& filename, int *major, int *minor, int *patch) +void GetExeVersion(const string& filename, int *major, int *minor, int *patch) { DWORD handle; *major= *minor= *patch= 0; @@ -85,20 +87,17 @@ string GetExeVersion(const string& filename, int *major, int *minor, int *patch) if (!GetFileVersionInfo(filename.c_str(), handle, size, versionInfo)) { delete[] versionInfo; - return "<unknown>"; + return; } // we have version information UINT len = 0; VS_FIXEDFILEINFO* vsfi = NULL; VerQueryValue(versionInfo, "\\", (void**)&vsfi, &len); - char arr[64]; *major= (int)HIWORD(vsfi->dwFileVersionMS); *minor= (int)LOWORD(vsfi->dwFileVersionMS); *patch= (int)HIWORD(vsfi->dwFileVersionLS); - sprintf_s(arr,"%d.%d.%d", *major, *minor, *patch); delete[] versionInfo; - return string(arr); } @@ -122,19 +121,6 @@ void CUpgradeDlg::SelectService(int index) } -/* Remove quotes from string */ -static char *RemoveQuotes(char *s) -{ - if(s[0]=='"') - { - s++; - char *p= strchr(s, '"'); - if(p) - *p= 0; - } - return s; -} - /* Iterate over services, lookup for mysqld.exe ones. @@ -157,8 +143,7 @@ void CUpgradeDlg::PopulateServicesList() static BYTE buf[64*1024]; static BYTE configBuffer[8*1024]; - char datadirBuf[MAX_PATH]; - char datadirNormalized[MAX_PATH]; + DWORD bufsize= sizeof(buf); DWORD bufneed; DWORD num_services; @@ -184,70 +169,39 @@ void CUpgradeDlg::PopulateServicesList() CloseServiceHandle(service); if (ok) { - int argc; - wchar_t **wargv = CommandLineToArgvW(config->lpBinaryPathName, &argc); + mysqld_service_properties service_props; + + if (get_mysql_service_properties(config->lpBinaryPathName, + &service_props)) + continue; - // We expect path\to\mysqld --defaults-file=<path> <servicename> - if(argc == 3) + /* Check if service uses mysqld in installation directory */ + if (_strnicmp(service_props.mysqld_exe, m_InstallDir.c_str(), + m_InstallDir.size()) == 0) + continue; + + if(m_MajorVersion > service_props.version_major || + (m_MajorVersion == service_props.version_major && m_MinorVersion >= + service_props.version_minor)) { - - // Convert wide strings to ANSI - char *argv[3]; - for(int k=0; k < 3;k++) + ServiceProperties props; + props.myini= service_props.inifile; + props.datadir= service_props.datadir; + props.servicename = info[i].lpServiceName; + if (service_props.version_major) { - size_t nbytes = 2*wcslen(wargv[k])+1; - argv[k]= new char[nbytes]; - wcstombs(argv[k], wargv[k], nbytes); + char ver[64]; + sprintf(ver, "%d.%d.%d", service_props.version_major, + service_props.version_minor, service_props.version_patch); + props.version= ver; } + else + props.version= "<unknown>"; - size_t len= strlen(argv[0]); - char path[MAX_PATH]={0}; - char *filepart; - GetFullPathName(argv[0],MAX_PATH, path, &filepart); - if(_stricmp(filepart, "mysqld.exe") == 0 || - _stricmp(filepart, "mysqld") == 0) - { - if(_strnicmp(argv[1],"--defaults-file=",16) == 0) - { - /* Remove quotes around defaults-file */ - char *inifile= argv[1] + 16; - inifile = RemoveQuotes(inifile); - - char *datadir=datadirBuf; - GetPrivateProfileString("mysqld", "datadir", NULL, datadirBuf, - MAX_PATH, inifile); - - /* Remove quotes from datadir */ - datadir= RemoveQuotes(datadir); - - GetFullPathName(datadir, MAX_PATH, datadirNormalized, NULL); - ServiceProperties props; - - props.myini = inifile; - props.servicename = info[i].lpServiceName; - string exefilename(argv[0]); - if(!strstr(argv[0], ".exe")) - exefilename += ".exe"; - int major, minor, patch; - props.version= GetExeVersion(exefilename, &major, &minor, &patch); - if(m_MajorVersion > major || - (m_MajorVersion == major && m_MinorVersion >= minor)) - { - if (_strnicmp(exefilename.c_str(), m_InstallDir.c_str(), - m_InstallDir.size()) != 0) - { - props.datadir = datadirNormalized; - index = m_Services.AddString(info[i].lpServiceName); - services.resize(index+1); - services[index] = props; - } - } - } - } - for(int k=0; k< 3;k++) - delete[] argv[k]; + index = m_Services.AddString(info[i].lpServiceName); + services.resize(index+1); + services[index] = props; } - LocalFree((HLOCAL)wargv); } if (index != -1) { |