Пример #1
0
        /// <summary>
        ///		Ejecuta un script de powershell
        /// </summary>
        private async Task ExecuteContentAsync(BlockLogModel block, string content, NormalizedDictionary <object> parameters, ExecuteScriptSentence sentence)
        {
            PowerShellManager manager = new PowerShellManager();

            // Carga el script en memoria
            manager.LoadScript(content);
            // Asigna los parámetros
            if (!AddParameters(manager, parameters, sentence, out string error))
            {
                Errors.Add(error);
            }
            else
            {
                // Ejecuta
                await manager.ExecuteAsync();

                // Comprueba los errores
                if (manager.Errors.Count > 0)
                {
                    Errors.AddRange(manager.Errors);
                }
                else if (manager.OutputItems.Count > 0)
                {
                    foreach (object output in manager.OutputItems)
                    {
                        block.Info($"{manager.OutputItems.IndexOf(output).ToString()}: {output?.ToString()}");
                    }
                }
            }
        }
Пример #2
0
        /// <summary>
        ///		Procesa una exportación de las tablas de esquema a archivos CSV
        /// </summary>
        internal bool Execute(SentenceExportCsvSchema sentence)
        {
            bool exported = false;

            // Exporta los archivos
            using (BlockLogModel block = Processor.Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, $"Start exporting tables from {sentence.Source}"))
            {
                ProviderModel provider = Processor.GetProvider(sentence.Source);

                if (provider == null)
                {
                    block.Error($"Can't find the provider '{sentence.Source}'");
                }
                else
                {
                    // Supone que se ha exportado correctamente
                    exported = true;
                    // Elimina los archivos si es necesario
                    if (sentence.DeleteOldFiles)
                    {
                        DeletePathFiles(block, Processor.Manager.Step.Project.GetFullFileName(sentence.Path));
                    }
                    // Exporta las tablas del esquema (mientras no haya errores
                    foreach (SentenceExportCsv sentenceCsv in GetExportFileSentences(block, provider, sentence))
                    {
                        if (exported)
                        {
                            exported = new ExportCsvManager(Processor).Execute(sentenceCsv);
                        }
                    }
                }
            }
            // Devuelve el valor que indica si se ha exportado
            return(exported);
        }
Пример #3
0
        /// <summary>
        ///		Ejecuta el método
        /// </summary>
        private async Task <List <BaseSentence> > ExecuteMethodAsync(BlockLogModel block, CallApiMethodSentence method, HttpClientManager client, CancellationToken cancellationToken)
        {
            List <BaseSentence> sentences = new List <BaseSentence>();
            int result = -1;

            // Ejecuta el método
            switch (method.Method)
            {
            case CallApiMethodSentence.MethodType.Post:
                result = await client.PostAsync(method.EndPoint, TransformVariables(method.Body), cancellationToken);

                break;
            }
            // Trata el resultado
            if (result == -1)
            {
                Errors.Add($"Error when call {method.EndPoint}: {method.Method.ToString()}");
            }
            else
            {
                sentences = GetContinuation(method, result);
            }
            // Devuelve la lista de sentencias
            return(sentences);
        }
        /// <summary>
        ///		Convierte un archivo Excel a parquet
        /// </summary>
        internal async Task <bool> ConvertAsync(BlockLogModel block, string source, string target, ExcelfileOptions options, CancellationToken cancellationToken)
        {
            bool converted = false;

            // Convierte el archivo
            try
            {
                LibParquetFiles.Writers.ParquetWriter writer = new LibParquetFiles.Writers.ParquetWriter(target);

                // Evita el error de await
                await Task.Delay(1);

                // Crea el directorio de salida
                LibHelper.Files.HelperFiles.MakePath(System.IO.Path.GetDirectoryName(target));
                // Escribe el archivo
                using (System.Data.IDataReader reader = new LibExcelFiles.Data.ExcelDataTableReader().LoadFile(source, options.SheetIndex,
                                                                                                               1, 10_000_000, options.WithHeader).CreateDataReader())
                {
                    writer.Write(reader);
                }
                // Indica que se ha convertido el archivo
                converted = true;
            }
            catch (Exception exception)
            {
                block.Error($"Error when convert '{source}' to '{target}'", exception);
            }
            // Devuelve el valor que indica si se ha convertido
            return(converted);
        }
Пример #5
0
        /// <summary>
        ///		Ejecuta un paso
        /// </summary>
        protected override async Task <bool> ProcessStepAsync(List <JobContextModel> contexts, JobStepModel step, NormalizedDictionary <object> parameters,
                                                              CancellationToken cancellationToken)
        {
            bool processed = false;
            DbAggregatorManager dataProviderManager = GetProviderManager(contexts, step);

            // Procesa el paso
            using (BlockLogModel block = Logger.Default.CreateBlock(LogModel.LogType.Debug, $"Start execute step {step.Name}"))
            {
                if (string.IsNullOrEmpty(step.ScriptFileName) || !System.IO.File.Exists(step.ScriptFileName))
                {
                    block.Error($"Cant find the file {step.ScriptFileName}");
                }
                else
                {
                    DbScriptManager scriptManager = new DbScriptManager(step, dataProviderManager, parameters, Logger);

                    // Ejecuta el paso
                    if (System.IO.Path.GetExtension(step.ScriptFileName).EqualsIgnoreCase(".sql"))
                    {
                        processed = await scriptManager.ProcessBySqlScriptAsync(step.Target, step.ScriptFileName, cancellationToken);
                    }
                    else
                    {
                        processed = await scriptManager.ProcessByFileAsync(step.ScriptFileName, cancellationToken);
                    }
                }
            }
            // Devuelve el valor que indica si se ha procesado correctamente
            return(processed);
        }
        /// <summary>
        ///		Exporta las tablas de una conexión a una serie de archivos
        /// </summary>
        public async Task <bool> ExportAsync(BlockLogModel block, ConnectionModel connection, string dataBase, string path,
                                             SolutionManager.FormatType formatType, long blockSize, CancellationToken cancellationToken)
        {
            // Limpia los errores
            Errors.Clear();
            // Carga el esquema
            await Manager.DbScriptsManager.LoadSchemaAsync(connection, cancellationToken);

            // Crea el directorio
            LibHelper.Files.HelperFiles.MakePath(path);
            // Genera los archivos
            foreach (ConnectionTableModel table in connection.Tables)
            {
                if (!cancellationToken.IsCancellationRequested &&
                    (string.IsNullOrWhiteSpace(dataBase) || dataBase.Equals(table.Schema, StringComparison.CurrentCultureIgnoreCase)))
                {
                    try
                    {
                        // Log
                        block.Info($"Start export table {table.FullName}");
                        // Exporta la tabla
                        await Task.Run(() => ExportTable(block, connection, table, path, formatType, blockSize));

                        // Log
                        block.Info($"End export table {table.FullName}");
                    }
                    catch (Exception exception)
                    {
                        block.Error($"Error when export {table.FullName}", exception);
                    }
                }
            }
            // Devuelve el valor que indica si la exportación ha sido correcta
            return(Errors.Count == 0);
        }
        /// <summary>
        ///		Ejecuta los comandos de una cadena SQL
        /// </summary>
        internal async Task ExecuteAsync(IDbProvider provider, string sql, Models.ArgumentListModel arguments, TimeSpan timeout, CancellationToken cancellationToken)
        {
            using (BlockLogModel block = Manager.SolutionManager.Logger.Default.CreateBlock(LogModel.LogType.Info, "Execute script"))
            {
                if (string.IsNullOrWhiteSpace(sql))
                {
                    block.Error("The query is empty");
                }
                else
                {
                    List <ScriptSqlPartModel> scripts = new ScriptSqlTokenizer().Parse(sql, arguments.Constants);
                    int scriptsExecuted = 0;

                    // Ejecuta los scripts
                    if (scripts.Count > 0)
                    {
                        scriptsExecuted = await ExecuteCommandsAsync(provider, block, scripts, ConvertParameters(arguments.Parameters), timeout, cancellationToken);
                    }
                    // Log
                    if (scriptsExecuted == 0)
                    {
                        block.Error("The query is empty");
                    }
                    else
                    {
                        block.Info($"{scriptsExecuted} command/s executed");
                    }
                }
            }
        }
Пример #8
0
        /// <summary>
        ///		Descarga un archivo del blob
        /// </summary>
        private async Task ProcessDownloadAsync(BlockLogModel parent, DownloadBlobSentence sentence)
        {
            using (BlockLogModel block = parent.CreateBlock(LogModel.LogType.Info, $"Start downloading from '{sentence.Source.ToString()}'"))
            {
                CloudConnection connection = GetConnection(sentence.StorageKey);

                if (connection == null)
                {
                    AddError(block, $"Can't find the connection for '{sentence.StorageKey}'");
                }
                else
                {
                    try
                    {
                        // Descarga el archivo
                        using (ICloudStorageManager manager = new StorageManager().OpenAzureStorageBlob(connection.StorageConnectionString))
                        {
                            string fileName = Step.Project.GetFullFileName(sentence.FileName);

                            // Crea el directorio
                            LibHelper.Files.HelperFiles.MakePath(System.IO.Path.GetDirectoryName(fileName));
                            // Descarga el archivo
                            await manager.DownloadAsync(GetContainerName(sentence.Source.Container), sentence.Source.Blob, fileName);
                        }
                        // Log
                        block.Info($"Downloaded file '{sentence.FileName}' to '{sentence.Source.ToString()}'");
                    }
                    catch (Exception exception)
                    {
                        AddError(block, $"Error when download '{sentence.FileName}' to '{sentence.Source.ToString()}'", exception);
                    }
                }
            }
        }
Пример #9
0
        /// <summary>
        ///		Procesa los datos
        /// </summary>
        private async Task ExecuteAsync(BlockLogModel block, List <BaseSentence> sentences, CancellationToken cancellationToken)
        {
            foreach (BaseSentence sentenceBase in sentences)
            {
                if (!HasError && sentenceBase.Enabled && !cancellationToken.IsCancellationRequested)
                {
                    switch (sentenceBase)
                    {
                    case BlockSentence sentence:
                        await ProcessBlockAsync(block, sentence, cancellationToken);

                        break;

                    case ExceptionSentence sentence:
                        ProcessException(block, sentence);
                        break;

                    case CallApiSentence sentence:
                        await ProcessCallApiAsync(block, sentence, cancellationToken);

                        break;
                    }
                }
            }
        }
Пример #10
0
        /// <summary>
        ///		Crea los archivos SQL de creación de un esquema para reporting sobre una base de datos
        /// </summary>
        private void CreateSchemaReportingSql()
        {
            Details.Reporting.Tools.CreateScriptsSqlReportingViewModel viewModel = new Details.Reporting.Tools.CreateScriptsSqlReportingViewModel(this);

            if (MainController.OpenDialog(viewModel) == BauMvvm.ViewModels.Controllers.SystemControllerEnums.ResultType.Yes)
            {
                using (BlockLogModel block = MainController.Logger.Default.CreateBlock(LogModel.LogType.Info, "Comienzo de la creación de scripts SQL de reporting"))
                {
                    // Crea los archivos de esquema
                    try
                    {
                        LibReporting.Solution.ReportingSolutionManager manager = new LibReporting.Solution.ReportingSolutionManager();

                        // Graba el archivo
                        manager.ConvertSchemaReportingToSql(viewModel.SchemaFileName, viewModel.OutputFileName);
                        // Log
                        block.Info("Fin de la creación de archivos de scripts SQL para informes");
                        MainController.MainWindowController
                        .ShowNotification(BauMvvm.ViewModels.Controllers.SystemControllerEnums.NotificationType.Information,
                                          "Generación de archivos SQL para informes",
                                          "Ha terminado correctamente la generación de los archivos SQL de esquema para informes");
                    }
                    catch (Exception exception)
                    {
                        block.Error($"Error en la generación de archivos de esquema. {exception.Message}");
                    }
                    // Log
                    MainController.Logger.Flush();
                }
            }
        }
Пример #11
0
        /// <summary>
        ///		Ejecuta un script de SQL
        /// </summary>
        internal async Task ExecuteAsync(IDbProvider dbProvider, string query, ArgumentListModel arguments, TimeSpan timeout, CancellationToken cancellationToken)
        {
            using (BlockLogModel block = Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, "Start script execution"))
            {
                SqlScriptExecutor    executor    = new SqlScriptExecutor(Manager, dbProvider, arguments, timeout);
                DbScriptsInterpreter interpreter = new DbScriptsInterpreter(executor, Manager.Logger);

                // Ejecuta el archivo
                await interpreter.ExecuteAsync(query, null, cancellationToken);

                // Recopila los errores
                Errors.AddRange(interpreter.Errors);
                // y los pasa al log
                if (Errors.Count == 0)
                {
                    block.Info("End script execution");
                }
                else
                {
                    string error = string.Empty;

                    // Agrega los errores
                    foreach (string inner in Errors)
                    {
                        error += inner + Environment.NewLine;
                    }
                    // log
                    block.Error($"Error when execute sql script: {Environment.NewLine}{error}");
                }
            }
        }
Пример #12
0
        /// <summary>
        ///		Procesa una copia de archivos
        /// </summary>
        private async Task ProcessCopyAsync(BlockLogModel parent, CopySentence sentence)
        {
            using (BlockLogModel block = parent.CreateBlock(LogModel.LogType.Info, $"Start copy from '{sentence.Source}' to '{sentence.Target}'"))
            {
                string source = Step.Project.GetFullFileName(sentence.Source);
                string target = Step.Project.GetFullFileName(sentence.Target);

                try
                {
                    if (Directory.Exists(source))
                    {
                        await LibHelper.Files.HelperFiles.CopyPathAsync(source, target, sentence.Mask, sentence.Recursive, sentence.FlattenPaths);
                    }
                    else if (File.Exists(source))
                    {
                        if (!string.IsNullOrWhiteSpace(Path.GetExtension(target)))
                        {
                            await LibHelper.Files.HelperFiles.CopyFileAsync(source, target);
                        }
                        else
                        {
                            await LibHelper.Files.HelperFiles.CopyFileAsync(source, Path.Combine(target, Path.GetFileName(source)));
                        }
                    }
                    else
                    {
                        AddError(block, $"Cant find source file or path '{source}'");
                    }
                }
                catch (Exception exception)
                {
                    AddError(block, $"Error when copy '{source}' to '{target}'. {exception.Message}");
                }
            }
        }
Пример #13
0
        /// <summary>
        ///		Borra un blob
        /// </summary>
        private async Task DeleteBlobAsync(NodeStorageContainerFileViewModel item)
        {
            if (item != null &&
                SolutionViewModel.MainViewModel.MainController.HostController.SystemController.ShowQuestion($"¿Desea elimina el blob '{item.Text}'?"))
            {
                using (BlockLogModel block = SolutionViewModel.MainViewModel.MainController.Logger.Default.CreateBlock(LogModel.LogType.Info, "Comienza el borrado de blobs"))
                {
                    // Borra los elementos
                    try
                    {
                        ICloudStorageManager manager = new StorageManager().OpenAzureStorageBlob(item.Storage.GetNormalizedConnectionString());

                        // Borra cada uno de los blobs del nodo
                        foreach (BlobNodeModel blob in GetBlobs(item.Blob))
                        {
                            // Log
                            block.Info($"Borrando {blob.Blob.FullFileName}");
                            // Borra el blob
                            await manager.DeleteAsync(blob.Blob.Container, blob.Blob.FullFileName);
                        }
                    }
                    catch (Exception exception)
                    {
                        SolutionViewModel.MainViewModel.MainController.Logger.Default.LogItems.Error($"Error al borrar el blob. {exception.Message}");
                    }
                    // Log
                    block.Info("Fin del borrado de blobs");
                    SolutionViewModel.MainViewModel.MainController.Logger.Flush();
                    // Actualiza el árbol
                    Load();
                }
            }
        }
Пример #14
0
 /// <summary>
 ///		Procesa un bloque de sentencias
 /// </summary>
 private async Task ProcessBlockAsync(BlockLogModel parent, BlockSentence sentence, CancellationToken cancellationToken)
 {
     using (BlockLogModel block = parent.CreateBlock(LogModel.LogType.Info, sentence.GetMessage("Start block")))
     {
         await ExecuteAsync(block, sentence.Sentences, cancellationToken);
     }
 }
Пример #15
0
        /// <summary>
        ///		Convierte un archivo
        /// </summary>
        private async Task ConvertFileAsync(BlockLogModel block, string source, string target, ExcelfileOptions options, CancellationToken cancellationToken)
        {
            bool converted = false;

            // Log
            block.Info($"Converting '{source}' to '{target}'");
            // Convierte el archivo
            if (source.EndsWith(".csv", StringComparison.CurrentCultureIgnoreCase) && target.EndsWith(".parquet", StringComparison.CurrentCultureIgnoreCase))
            {
                converted = await new CsvToParquetConversor().ConvertAsync(block, source, target, cancellationToken);
            }
            else if (source.EndsWith(".parquet", StringComparison.CurrentCultureIgnoreCase) && target.EndsWith(".csv", StringComparison.CurrentCultureIgnoreCase))
            {
                converted = await new ParquetToCsvConversor().ConvertAsync(block, source, target, cancellationToken);
            }
            else if (source.EndsWith(".xlsx", StringComparison.CurrentCultureIgnoreCase) && target.EndsWith(".parquet", StringComparison.CurrentCultureIgnoreCase))
            {
                converted = await new ExcelToParquetConversor().ConvertAsync(block, source, target, options, cancellationToken);
            }
            // Indica el error si es necesario
            if (!converted)
            {
                AddError(block, $"Cant convert file '{source}' to '{target}'");
            }
        }
        /// <summary>
        ///		Convierte un archivo parquet a csv
        /// </summary>
        internal async Task <bool> ConvertAsync(BlockLogModel block, string source, string target, CancellationToken cancellationToken)
        {
            bool converted = false;

            // Convierte el archivo
            try
            {
                LibCsvFiles.Controllers.CsvDataReaderWriter writer = new LibCsvFiles.Controllers.CsvDataReaderWriter();

                // Evita el error de await
                await Task.Delay(1);

                // Crea el directorio de salida
                LibHelper.Files.HelperFiles.MakePath(System.IO.Path.GetDirectoryName(target));
                // Escribe el archivo
                using (LibParquetFiles.Readers.ParquetDataReader reader = new LibParquetFiles.Readers.ParquetDataReader(source))
                {
                    writer.Save(reader, target);
                }
                // Indica que se ha convertido
                converted = true;
            }
            catch (Exception exception)
            {
                block.Error($"Error when convert '{source}' to '{target}'", exception);
            }
            // Devuelve el valor que indica si se ha convertido
            return(converted);
        }
Пример #17
0
        /// <summary>
        ///		Crea los archivos XML de un esquema
        /// </summary>
        private async Task CreateSchemaXmlAsync()
        {
            Details.EtlProjects.CreateSchemaXmlViewModel viewModel = new Details.EtlProjects.CreateSchemaXmlViewModel(this);

            if (MainController.OpenDialog(viewModel) == BauMvvm.ViewModels.Controllers.SystemControllerEnums.ResultType.Yes)
            {
                using (BlockLogModel block = MainController.Logger.Default.CreateBlock(LogModel.LogType.Info, "Comienzo de la creación de archivos de esquema"))
                {
                    // Crea los archivos de esquema
                    try
                    {
                        // Crea los archivos
                        await new Application.Controllers.Schema.SchemaManager(Manager).SaveAsync(viewModel.ComboConnections.GetSelectedConnection(), viewModel.OutputFileName);
                        // Log
                        block.Info("Fin de la creación de archivos de esquema");
                        MainController.MainWindowController
                        .ShowNotification(BauMvvm.ViewModels.Controllers.SystemControllerEnums.NotificationType.Information,
                                          "Generación de archivos de esquema",
                                          "Ha terminado correctamente la generación de los archivos de esquema");
                    }
                    catch (Exception exception)
                    {
                        block.Error($"Error en la generación de archivos de esqu{exception.Message}");
                    }
                    // Log
                    MainController.Logger.Flush();
                }
            }
        }
Пример #18
0
 /// <summary>
 ///		Ejecuta una sentencia de bloque
 /// </summary>
 private void ExecuteBlock(SentenceBlock sentence)
 {
     using (BlockLogModel block = Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, $"Start block {sentence.Message}"))
     {
         ExecuteWithContext(sentence.Sentences);
     }
 }
Пример #19
0
        /// <summary>
        ///		Ejecuta el proyecto
        /// </summary>
        private async Task ExecuteProjectAsync(BlockLogModel block, string project, string context, CancellationToken cancellationToken)
        {
            JobProjectManager manager = new JobProjectManager(Logger);

            // Añade los procesadores
            manager.AddProcessor(new LibJobProcessor.Cloud.JobCloudManager(Logger));
            manager.AddProcessor(new LibJobProcessor.Database.JobDatabaseManager(Logger));
            manager.AddProcessor(new LibJobProcessor.FilesShell.JobFileShellManager(Logger));
            manager.AddProcessor(new LibJobProcessor.Rest.JobRestManager(Logger));
            // Ejecuta el proyecto
            await manager.ProcessAsync(project, context, cancellationToken);

            // Asigna los errores
            if (manager.Errors.Count == 0)
            {
                block.Info("La ejecución del proyecto ha terminado correctamente");
            }
            else
            {
                string errorTotal = "Error en la ejecución del proyecto";

                // Añade los errores
                foreach (string error in manager.Errors)
                {
                    if (!string.IsNullOrWhiteSpace(error))
                    {
                        errorTotal += Environment.NewLine + error.Trim();
                    }
                }
                // Lanza el mensaje de error
                block.Error(errorTotal);
            }
        }
Пример #20
0
        /// <summary>
        ///		Graba el archivo de comparación de tablas
        /// </summary>
        private void SaveAssertFile(BlockLogModel block, string fileName, string provider, string pathVariable, string databaseVariable, string sufixTestTables)
        {
            MLFile fileML = new MLFile();
            MLNode rootML = fileML.Nodes.Add("DbScript");

            // Log
            block.Info($"Start generate file '{fileName}'");
            // Crea los nodos de creación de los archivos de pruebas
            foreach (ConnectionTableModel table in Connection.Tables)
            {
                if (!string.IsNullOrWhiteSpace(DataBase) && DataBase.Equals(table.Schema, StringComparison.CurrentCultureIgnoreCase))
                {
                    MLNode blockML      = rootML.Nodes.Add("Block");
                    MLNode nodeAssertML = blockML.Nodes.Add("AssertScalar");

                    // Mensaje del bloque
                    blockML.Attributes.Add("Message", $"Assert table {table.Name}");
                    // Añade los atributos de la sentencia de comparación
                    nodeAssertML.Attributes.Add("Target", provider);
                    nodeAssertML.Attributes.Add("Message", $"Assert table {table.Name}");
                    nodeAssertML.Attributes.Add("Result", 0);
                    // Añade la cadena de consulta
                    nodeAssertML.Value = GetSqlCompare(table, pathVariable, databaseVariable, sufixTestTables);
                }
            }
            // Graba el archivo
            new LibMarkupLanguage.Services.XML.XMLWriter().Save(System.IO.Path.Combine(Path, fileName), fileML);
            // Log
            block.Info($"End generation file '{fileName}'");
        }
Пример #21
0
        /// <summary>
        ///		Exporta los archivos
        /// </summary>
        internal void Export(DeploymentModel deployment)
        {
            using (BlockLogModel block = Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, $"Start deployment '{deployment.Name}'"))
            {
                (NormalizedDictionary <object> constants, string error) = GetParameters(deployment.JsonParameters);

                if (!string.IsNullOrWhiteSpace(error))
                {
                    block.Error(error);
                }
                else
                {
                    ExporterOptions options = new ExporterOptions(deployment.SourcePath, deployment.TargetPath);

                    // Asigna las propiedades
                    options.WriteComments    = deployment.WriteComments;
                    options.LowcaseFileNames = deployment.LowcaseFileNames;
                    options.ReplaceArguments = deployment.ReplaceArguments;
                    // Añade los parámetros
                    foreach ((string key, object value) in constants.Enumerate())
                    {
                        options.AddParameter(key, value);
                    }
                    // Exporta los archivos
                    new DatabrickExporter(Manager.Logger, options).Export();
                }
            }
        }
Пример #22
0
        /// <summary>
        ///		Graba un archivo de pruebas
        /// </summary>
        private void SaveTestFile(BlockLogModel block, string fileName, string provider, string pathVariable, string databaseVariable, string sufixTestTables)
        {
            MLFile fileML = new MLFile();
            MLNode rootML = fileML.Nodes.Add("DbScript");

            // Log
            block.Info($"Start generate file '{fileName}'");
            // Crea los nodos de creación de los archivos de pruebas
            foreach (ConnectionTableModel table in Connection.Tables)
            {
                if (!string.IsNullOrWhiteSpace(DataBase) && DataBase.Equals(table.Schema, StringComparison.CurrentCultureIgnoreCase))
                {
                    MLNode blockML      = rootML.Nodes.Add("Block");
                    MLNode nodeDropML   = blockML.Nodes.Add("Execute");
                    MLNode nodeCreateML = blockML.Nodes.Add("Execute");

                    // Mensaje del bloque
                    blockML.Attributes.Add("Message", $"Test table {table.Name}");
                    // Crea el nodo para borrar la tabla
                    nodeDropML.Attributes.Add("Target", provider);
                    nodeDropML.Value = $"DROP TABLE IF EXISTS {table.Name}{sufixTestTables}";
                    // Crea el nodo de creación de la tabla
                    nodeCreateML.Attributes.Add("Target", provider);
                    nodeCreateML.Value  = Environment.NewLine + $"\t\t\tCREATE EXTERNAL TABLE {table.Name}{sufixTestTables} STORED AS parquet";
                    nodeCreateML.Value += Environment.NewLine + "\t\t\t\tLOCATION '{{" + pathVariable + "}}" + $"/testing/{table.Name}{sufixTestTables}.parquet' AS ";
                    nodeCreateML.Value += Environment.NewLine + "\t\t\t\tSELECT * FROM {{" + databaseVariable + "}}" + $".{table.Name}";
                    nodeCreateML.Value += Environment.NewLine;
                }
            }
            // Graba el archivo
            new LibMarkupLanguage.Services.XML.XMLWriter().Save(System.IO.Path.Combine(Path, fileName), fileML);
            // Log
            block.Info($"End generation file '{fileName}'");
        }
Пример #23
0
        /// <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);
                    }
                }
            }
        }
Пример #24
0
        /// <summary>
        ///		Procesa un script
        /// </summary>
        private async Task ProcessScriptAsync(BlockLogModel parent, ExecuteScriptSentence sentence, NormalizedDictionary <object> parameters,
                                              CancellationToken cancellationToken)
        {
            // Ejecuta la sentencia
            using (BlockLogModel block = parent.CreateBlock(LogModel.LogType.Info, $"Start execute script"))
            {
                try
                {
                    PowerShellController controller = new PowerShellController(this, Step);

                    // Ejecuta el script
                    await controller.ExecuteAsync(block, sentence, parameters);

                    // Muestra los errores
                    if (controller.Errors.Count > 0)
                    {
                        AddErrors(block, controller.Errors);
                    }
                    else
                    {
                        block.Info("End script execution");
                    }
                }
                catch (Exception exception)
                {
                    AddError(block, $"Error when execute script Powershell. {exception.Message}");
                }
            }
        }
        /// <summary>
        ///		Procesa una importación de archivos CSV para las tablas de esquema de base de datos
        /// </summary>
        internal bool Execute(SentenceImportCsvSchema sentence)
        {
            bool imported = false;

            // Importa los archivos
            using (BlockLogModel block = Processor.Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, $"Start importing tables from {sentence.Target}"))
            {
                ProviderModel provider = Processor.GetProvider(sentence.Target);

                if (provider == null)
                {
                    block.Error($"Can't find the provider '{sentence.Target}'");
                }
                else
                {
                    // Supone que todo se importa correctamente
                    imported = true;
                    // Ejecuta las sentencias de importación obtenidas a partir del esquema y los archivos
                    foreach (SentenceImportCsv sentenceCsv in GetImportFileSentences(block, provider, sentence))
                    {
                        if (imported)
                        {
                            // Log
                            block.Info($"Importing '{sentenceCsv.FileName}' in '{sentenceCsv.Table}'");
                            // Importa el archivo
                            imported = new ImportCsvManager(Processor).Execute(sentenceCsv);
                        }
                    }
                }
            }
            // Devuelve el valor que indica si se ha importado
            return(imported);
        }
Пример #26
0
        /// <summary>
        ///		Procesa las sentencias del script
        /// </summary>
        internal async Task <bool> ProcessAsync(BlockLogModel block, List <BaseSentence> program, NormalizedDictionary <object> parameters, CancellationToken cancellationToken)
        {
            // Ejecuta el programa
            await ExecuteAsync(block, program, parameters, cancellationToken);

            // Devuelve el valor que indica si todo es correcto
            return(!HasError);
        }
Пример #27
0
 /// <summary>
 ///		Añade una serie de errores a la colección
 /// </summary>
 private void AddErrors(BlockLogModel block, List <string> errors)
 {
     foreach (string error in errors)
     {
         block.Error(error);
         Errors.Add(error);
     }
 }
        /// <summary>
        ///		Obtiene el generador de archivos parquet
        /// </summary>
        private ParquetWriter GetDataWriter(string fileName, int recordsPerBlock, BlockLogModel block)
        {
            ParquetWriter writer = new ParquetWriter(fileName, recordsPerBlock);

            // Asigna el manejador de eventos
            writer.Progress += (sender, args) => block.Progress("Writing to file", args.Records, 0);
            // Devuelve el generador
            return(writer);
        }
Пример #29
0
        /// <summary>
        ///		Exporta la tabla a CSV
        /// </summary>
        private async Task ExportToCsvAsync(BlockLogModel block, string fileName, DbDataReader reader, CancellationToken cancellationToken)
        {
            LibCsvFiles.Controllers.CsvDataReaderWriter writer = new LibCsvFiles.Controllers.CsvDataReaderWriter();

            // Asigna el evento de progreso
            writer.Progress += (sender, args) => block.Progress(System.IO.Path.GetFileName(fileName), args.Records, args.Records + 1);
            // Graba el archivo
            await writer.SaveAsync(reader, fileName, cancellationToken);
        }
Пример #30
0
        /// <summary>
        ///		Sube una lista de archivos
        /// </summary>
        private async Task UploadFilesAsync(List <string> files)
        {
            ICloudStorageManager manager = GetStorageManager();

            // Sube los archivos
            if (manager == null)
            {
                SolutionViewModel.MainController.SystemController.ShowMessage("Seleccione una cuenta de almacenamiento");
            }
            else
            {
                (string container, bool isFolder, string remoteFileName) = GetStorageItems();

                if (string.IsNullOrWhiteSpace(container))
                {
                    SolutionViewModel.MainController.SystemController.ShowMessage("Seleccione un contenedor");
                }
                else
                {
                    // Sube los archivos
                    using (BlockLogModel block = SolutionViewModel.MainController.Logger.Default.CreateBlock(LogModel.LogType.Info, "Comienzo de la subida de archivos"))
                    {
                        // Sube cada archivo
                        foreach (string file in files)
                        {
                            if (!string.IsNullOrWhiteSpace(file) && System.IO.File.Exists(file))
                            {
                                string targetFile = System.IO.Path.GetFileName(file);

                                // Si es un directorio, añade el directorio
                                if (isFolder && !string.IsNullOrWhiteSpace(remoteFileName))
                                {
                                    targetFile = System.IO.Path.Combine(remoteFileName, targetFile);
                                }
                                else if (!isFolder && !string.IsNullOrWhiteSpace(remoteFileName))
                                {
                                    targetFile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(remoteFileName), targetFile);
                                }
                                // Log
                                block.Info($"Comienza la subida del archivo {file}");
                                // Sube el archivo
                                await manager.UploadAsync(container, targetFile, file);

                                // Log
                                block.Info($"Finaliza la subida del archivo {file}");
                            }
                        }
                        // Log
                        block.Info("Fin de la subida de archivos");
                    }
                    // Actualiza el árbol
                    Load();
                    // Log
                    SolutionViewModel.MainController.Logger.Flush();
                }
            }
        }