Artigo
· 2 hr atrás 4min de leitura

Scripting com .Net Core 10 e IRIS SDK

Um dos recursos mais recentes do .Net Core 10 com C# 14 são os aplicativos baseados em arquivo. Este recurso permite que você execute código C# em um arquivo .cs simples, sem a necessidade de criar uma solution, um projeto ou qualquer uma das estruturas relacionadas.

Por exemplo, você pode criar um arquivo script.cs usando o bloco de notas com o seguinte conteúdo:

Console.WriteLine(“This is a script in c#.”);

Então, na linha de comando ou no terminal, você executa o comando:

dotnet run script.cs

Há muitas informações sobre este novo recurso do .Net 10. Para trabalhar com o IRIS, podemos usar a opção de adicionar referências de pacotes NuGet diretamente dentro do arquivo. Por exemplo, para adicionar o nuget para InterSystems IRIS, você inclui as seguintes linhas no topo:

#:package InterSystems.Data.IRISClient@2.5.0 

using InterSystems.Data.IRISClient;
using InterSystems.Data.IRISClient.ADO;

Isso permite que o arquivo inclua o pacote NuGet do IRIS e use o IRIS SDK. Por exemplo, abaixo está um arquivo .cs com um script para verificar o status de uma produção de Interoperabilidade do InterSystems:

#:package InterSystems.Data.IRISClient@2.5.0

using InterSystems.Data.IRISClient;
using InterSystems.Data.IRISClient.ADO;

// Este script espera o namespace para conectar
string irisNamespace = string.Empty;
if (args.Length > 0)
{
    irisNamespace = args[0];
}

if (string.IsNullOrEmpty(irisNamespace))
{
    Console.WriteLine("Please indicate the namespace to connect");
    return;
}

// Abre uma conexão com o InterSystems IRIS
IRISConnection conn;
IRIS iris;

try
{
    conn = new IRISConnection();
    conn.ConnectionString = $"Server = 127.0.0.1;Port = 1972; Namespace = {irisNamespace.ToUpper()}; Password = SYS; User ID = _system;";
    conn.Open();
    iris = IRIS.CreateIRIS(conn);
}
catch (Exception ex)
{
    Console.WriteLine($"Cannot connect to the interoperability server. Error message: {ex.Message} ");
    return;
}

try
{

    bool? isInteroperabilityEnabledNamespace = iris.ClassMethodBool("%Library.EnsembleMgr", "IsEnsembleNamespace");
    if (isInteroperabilityEnabledNamespace ?? false)
    {
        // Os valores válidos são especificados na documentação
        //https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic.cls?LIBRARY=ENSLIB&CLASSNAME=Ens.Director#METHOD_GetProductionStatus
        // E os valores numéricos podem ser encontrados no arquivo de inclusão EnsConstants.inc
        Func<decimal, string> GetStateDescription = state => state switch
        {
            0 => "Unknown",
            1 => "Running",
            2 => "Stopped",
            3 => "Suspended",
            4 => "Troubled",
            5 => "Network stopped",
            _ => "Unknown state"
        };
        string currentInteroperabilityProduction = string.Empty;
        decimal currentInteroperabilityProductionState = 0;

        IRISReference currentProductionName = new IRISReference("");
        IRISReference currentProductionState = new IRISReference("");

        var status = iris.ClassMethodObject("Ens.Director", "GetProductionStatus", currentProductionName, currentProductionState, 2, 1);

        if (status.ToString() == "1")
        {
            currentInteroperabilityProduction = currentProductionName.GetValue()?.ToString() ?? "";
            currentInteroperabilityProductionState = currentProductionState.GetDecimal() ?? 0;
        }
        if (string.IsNullOrEmpty(currentInteroperabilityProduction))
        {
            // Caso a produção esteja parada, a chamada a GetProductionStatus não retorna o nome da produção
            // neste caso tentamos obter o nome da produção ativa
            currentInteroperabilityProduction = iris.ClassMethodString("Ens.Director", "GetActiveProductionName");
        }

        Console.WriteLine($"Produção ativa neste namespace: {currentInteroperabilityProduction}");

        Console.WriteLine($"Estado da Produção: {GetStateDescription(currentInteroperabilityProductionState)}");

    }
    else
    {
        Console.WriteLine("O namespace não está habilitado para interoperabilidade");
    }
}
catch (Exception ex)
{
    Console.WriteLine($"Erro ao verificar o estado da produção no namespace{irisNamespace}:{ex.Message}");
}
finally
{
    iris.Dispose();
    conn.Close();
    conn.Dispose();
}

A execução deste arquivo com o parâmetro indicando o namespace no qual você deseja verificar o status da produção irá verificar se há alguma produção no namespace e seu status atual:

PS C:\IrisScripting> dotnet run ScriptTest.cs INTBUS
Produção ativa neste namespace: Integrations BUS
Estado da produção: Running
PS C:\IrisScripting>

Este novo recurso abre uma maneira nova e interessante de executar scripts ou pequenos programas para automatizar tarefas a partir da linha de comando.

Discussão (0)1
Entre ou crie uma conta para continuar