/// <summary> /// Ejecuta un script SQL interpretándolo antes /// </summary> private void ExecuteScriptSqlParsed(ProviderModel provider, string fileName, SentenceExecuteScript sentence) { List <SqlSectionModel> sections = new SqlParser().TokenizeByFile(fileName, MapVariables(GetVariables(), sentence.Mapping), out string error); // Si no hay ningún error, ejecuta el script if (string.IsNullOrWhiteSpace(error)) { // Recorre las seccionaes foreach (SqlSectionModel section in sections) { if (string.IsNullOrWhiteSpace(error) && section.Type == SqlSectionModel.SectionType.Sql && !string.IsNullOrWhiteSpace(section.Content)) { try { provider.Execute(CreateDataProviderCommand(section.Content, sentence.Timeout)); } catch (Exception exception) { error = $"Error when execute script {System.IO.Path.GetFileName(fileName)}. {exception.Message}"; } } } } // Añade el error if (!string.IsNullOrWhiteSpace(error)) { AddError(error); } }
/// <summary> /// Ejecuta un archivo de script SQL /// </summary> private void ExecuteScriptSql(SentenceExecuteScript sentence) { using (BlockLogModel block = Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, $"Execute script {sentence.FileName}")) { ProviderModel provider = GetProvider(sentence.Target); if (provider == null) { AddError($"Can't find the provider. Key: '{sentence.Target}'"); } else if (string.IsNullOrWhiteSpace(sentence.FileName)) { AddError($"The script filename is not defined"); } else { string fileName = Manager.Step.Project.GetFullFileName(sentence.FileName); if (!System.IO.File.Exists(fileName)) { AddError($"Cant find the file '{fileName}'"); } else if (!sentence.MustParse) { ExecuteScriptSqlRaw(provider, fileName, sentence.Timeout, sentence.SkipParameters); } else { ExecuteScriptSqlParsed(provider, fileName, sentence); } } } }
/// <summary> /// Sentencia de ejecución de un script /// </summary> private SentenceBase LoadSentenceExecuteScript(MLNode rootML) { SentenceExecuteScript sentence = new SentenceExecuteScript(); // Asigna las propiedades sentence.Target = rootML.Attributes[TagTarget].Value.TrimIgnoreNull(); sentence.FileName = rootML.Attributes[TagFileName].Value.TrimIgnoreNull(); sentence.MustParse = rootML.Attributes[TagMustParse].Value.GetBool(); sentence.SkipParameters = rootML.Attributes[TagSkipParameters].Value.GetBool(); // Asigna los mapeos de variables foreach (MLNode nodeML in rootML.Nodes) { if (nodeML.Name == TagMap) { sentence.Mapping.Add((nodeML.Attributes[TagVariable].Value, nodeML.Attributes[TagTo].Value)); } } // Devuelve la sentencia creada return(sentence); }