in Configurator/Core/Ini/IniTemplate.cs [855:1039]
private void ParseFormula(string currentLine, StreamReader reader)
{
// Assign value to variable.
var templateFormulaExp = new Regex(@"\[(?<var_name>[^@]+)\]=""(?<formula>[^""]+)""((?:,\s*"")(?<options>[^@]+)?(?:""))?");
var m = templateFormulaExp.Match(currentLine);
if (!m.Success)
{
return;
}
// Ensure element applies for the current server version.
string variableName = m.Groups["var_name"].Value;
if (variableName.Equals("VERSION_MAX", StringComparison.OrdinalIgnoreCase)
|| variableName.Equals("VERSION_MIN", StringComparison.OrdinalIgnoreCase))
{
try
{
var versionString = m.Groups["formula"].Value;
var versionParts = versionString.Count(character => character == '.') + 1;
for (; versionParts < 4; versionParts++)
{
versionString += ".0";
}
var version = new Version(versionString);
if ((variableName == "VERSION_MAX"
&& ServerVersion > version)
|| (variableName == "VERSION_MIN"
&& ServerVersion < version))
{
// Skip comments.
do
{
currentLine = reader.ReadLine();
} while (currentLine.StartsWith("#"));
}
}
catch (Exception)
{
Logger.LogWarning(string.Format(Resources.VersionProcessingFailed, variableName));
}
return;
}
// Process formula.
// If manual server config type is selected, we skip STATE_CHANGE variables.
// If other server config type is selected, we skip DEFAULT variables.
if ((_iniServerType == ServerInstallationType.Manual
&& variableName.Equals("STATE_CHANGE", StringComparison.OrdinalIgnoreCase)
&& !variableName.Equals("DEFAULT", StringComparison.OrdinalIgnoreCase))
|| (_iniServerType != ServerInstallationType.Manual
&& variableName.Equals("DEFAULT", StringComparison.OrdinalIgnoreCase)))
{
return;
}
else
{
var itv = new IniTemplateVariable(currentLine, variableName, m.Groups["formula"].Value, m.Groups["options"].Value);
if (!variableName.Equals("STATE_CHANGE", StringComparison.OrdinalIgnoreCase))
{
currentLine = reader.ReadLine();
if (variableName.Equals("DEFAULT", StringComparison.OrdinalIgnoreCase)
&& currentLine.StartsWith("# ["))
{
while (currentLine.StartsWith("# ["))
{
currentLine = reader.ReadLine();
}
}
Regex templateOutputFormat = new Regex(@"(?<disabled>[#\s]+)?(?<output>.+)=(?<default>.+)?");
Match m2 = templateOutputFormat.Match(currentLine);
if (m2.Success)
{
itv.DefaultValue = m2.Groups["default"].Value;
itv.Disabled = m2.Groups["disabled"].Value.Contains("#");
itv.OutputParameter = m2.Groups["output"].Value;
}
// Attempt to set values from template, just the basics.
switch (itv.VariableName)
{
case "BASE_DIR":
if (itv.DefaultValue != null)
{
itv.Disabled = true;
string defaultValue = itv.DefaultValue.Replace('\"', ' ').Trim();
if (defaultValue.Length > 0)
{
BaseDir = defaultValue;
}
}
break;
case "DATA_DIR":
if (itv.DefaultValue != null)
{
string defaultValue = itv.DefaultValue.Replace('\"', ' ').Trim();
if (defaultValue.Length > 0)
{
defaultValue = defaultValue.Replace("\\data\\", "\\");
defaultValue = defaultValue.Replace("\\Data\\", "\\");
DataDir = defaultValue.Trim();
}
}
break;
case "SECURE_FILE_PRIV":
if (itv.DefaultValue != null)
{
itv.Disabled = true;
string defaultValue = itv.DefaultValue.Replace('\"', ' ').Trim();
if (defaultValue.Length > 0)
{
SecureFilePriv = defaultValue;
}
}
break;
case "CLIENT_PORT":
case "SERVER_PORT":
EnableNetworking = !itv.Disabled;
if (EnableNetworking && itv.DefaultValue != "")
{
Port = uint.Parse(itv.DefaultValue);
}
break;
case "CLIENT_PIPE":
case "CLIENT_SOCKET":
break;
case "SERVER_PIPE":
EnableNamedPipe = !itv.Disabled;
break;
case "SERVER_SOCKET":
PipeName = itv.DefaultValue;
break;
case "SERVER_SKIP":
EnableNetworking = itv.Disabled;
break;
case "QUERY_CACHE_SIZE":
EnableQueryCache = !itv.Disabled;
break;
case "QUERY_CACHE_TYPE":
EnableQueryType = !itv.Disabled;
break;
case "INNODB_HOME":
InnoDBHomeDir = !itv.Disabled ? itv.DefaultValue : string.Empty;
break;
case "STATE_CHANGE":
case "SQL_MODE":
case "INNODB_LOG_FILE_SIZE":
case "SKIP_INNODB":
break;
case "SERVER_ID":
if (itv.Disabled)
{
ServerId = null;
}
else
{
uint val;
ServerId = uint.TryParse(itv.DefaultValue, out val) ? (uint?)val : null;
}
break;
case "NAMED_PIPE_FULL_ACCESS_GROUP":
NamedPipeFullAccessGroup = itv.DefaultValue;
break;
}
}
_output.Enqueue(itv);
}
}