Search code examples
mysqlinstallshield

InstallShield 2014, Custom Actions and executing sql files into MySQL


I am building an installer for our product which works well. I've managed to build custom actions to install our services including a MySQL server.

The problem I have is executing a sql file to build the schema structures.

I have a custom action which uses mysql.exe and the command line arguments: --port=### --user=### --password=### < "[INSTALLDIR]db\EmptyStruct.sql"

It tries to execute this ok but the cmd window which pops up, during the install, just runs through the mysql.exe command line options, which says to me that the command line it gets passed is not correct. However if I run the command manually after the install, it works perfectly.

Does anyone has any ideas please.


Solution

  • I'm making a few assumptions here:

    • You have a Windows Installer exe custom action that specifies mysql.exe and a command line as you showed
    • You are expecting the contents of [INSTALLDIR]db\EmptyStruct.sql to be redirected to mysql.exe's standard input

    This will not happen. Behind the scenes, Windows Installer's exe custom action support uses the CreateProcess API and this API will interpret command lines literally. However the redirect < needs special handling to actually perform redirection.

    To get that behavior, you must use a layer of indirection. For example, you could run cmd.exe as the exe, and give it a command line that will make it interpret and run the command line mysql.exe --port= ... < "[INSTALLDIR]...". However, if you didn't already have a command prompt showing, this would cause one to show up. If you want to avoid that, you could write a custom wrapper that performs the redirection for you, either as a C++ DLL or, say, InstallScript action.

    Alternately, if there is a parameter that tells mysql.exe to run a script from a file, you could pass that instead of using redirection. I wasn't able to find evidence of such a parameter in a quick web search.