private void ParseFormula()

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);
      }
    }