Tradução: Listagem Remota de Globais usando a NativeAPI para ObjectScript #2
Como observado no artigo anterior, a Native API possui algumas limitações.
Portanto, fiz algumas pesquisas sobre uma interface mais semelhante a um terminal que me forneça acesso como um console ou o terminal IRIS para permitir meu $QUERY em um global e outros comandos úteis que não são suportados/mapeados na NativeAPI para ObjectScript.
As ferramentas básicas estão bem preparadas e disponíveis.
- Connection() cria uma partição totalmente operacional e estável para mim.
- Function() permite chamar qualquer rotina ou método de que eu preciso.
- similar a ClassMethodValue e ClassMethodVoid
Apenas não há um método CommandLine e é necessário algum código já preparado.
Minha abordagem simples: Envie o código e rode eXECUTE é apenas uma linha de comando para copiar.
;; routine %ZX.intx(%rcc) try {return$xecute(%rcc)} catch%rcc {return%rcc.DisplayString()}Se você não tem acesso a alguma ferramenta de programação, você pode usar esta Stored Procedure da MgmtPortal/SQL, para instalar:
CREATEPROCEDURE %Zrcc.X()
LANGUAGE OBJECTSCRIPT
{
set %rcc=##class(%Routine).%New("%ZX.int")
set %rccline="x(%rcc) try {return $xecute(%rcc)} catch %rcc {return %rcc.DisplayString()}"do %rcc.WriteLine(%rccline)
do %rcc.Save()
quit %rcc.Compile()
}
E em seguida, você precisa do seu objeto de conexão.
ClassMethod Connect(
serverIP = "192.168.0.9",
serverPORT = 1972,
namespace = "USER",
username = "_SYSTEM",
password = "SYS") As%Net.DB.Iris
{
try {
set%rccon=##class(%Net.DB.DataSource).CreateConnection(serverIP
,serverPORT,namespace,username,password)
set%rccdb=%rccon.CreateIris()
}
catch { zw b } ;; do some error handlingquit%rccdb
}Agora, alguns exemplos preliminares usando o método Function
CON é minha CommectionObject
USER>write CON.Function("%ZX","","quit $job")
1920
O terceiro argumento sempre retornará algo como %RawString
E se algo falhar:
USER>write CON.Function("%ZX","","set x=27,y=0 quit x/y ; will fail")
<DIVIDE> 18 x^%ZXe este é um simples Listador de Globais Remoto
Em seguida, fazer uma cópia ou renomear é uma tarefa bastante trivial:
gl ; list remote Globalset global="^dc.MultiD";; adjust as requiredset a=CON.Function("%ZX","","quit $LB($D("_global_",%rcc),%rcc)")
Write !,global," = ",$li(a,2)," $DATA = ",$li(a),!
if$li(a)#10 {
for {
set a=CON.Function("%ZX","","q $LB($q(@$zr),@$ZR)")
quit:$li(a)=""write$li(a), " = "
,##class(%Utility).FormatString($li(a,2)),!
}
}
Write"-------done----------",!O foco está em obter todo o controle local e apenas uma chamada por nó da Global
Teste:
USER>do ^gl
^dc.MultiD = 5 $DATA = 11
^dc.MultiD(1) = $lb("Braam,Ted Q.",51353)
^dc.MultiD(1,"mJSON") = "{}"
^dc.MultiD(2) = $lb("Klingman,Uma C.",62459)
^dc.MultiD(2,2,"Multi","a") = 1
^dc.MultiD(2,2,"Multi","rob",1) = "rcc"
^dc.MultiD(2,2,"Multi","rob",2) = 2222
^dc.MultiD(2,"Multi","a") = 1
^dc.MultiD(2,"Multi","rob",1) = "rcc"
^dc.MultiD(2,"Multi","rob",2) = 2222
^dc.MultiD(2,"mJSON") = "{""A"":""ahahah"",""Rob"":""VIP"",""Rob2"":1111,""Rob3"":true}"
^dc.MultiD(3) = $lb("Goldman,Kenny H.",45831)
^dc.MultiD(3,"mJSON") = "{}"
^dc.MultiD(4) = $lb("","")
^dc.MultiD(4,"mJSON") = "{""rcc"":122}"
-------done----------Claro, há muitas outras atividades possíveis além da simples listagem de Globais.
Você pode dar uma olhada na antiga Global ^% para ter uma ideia do que a programação com XECUTE + $XECUTE() pode fazer.
A propósito:
isso não é uma contribuição para o concurso ePy. 😉
Comments
Qualquer necessidade de correção na tradução, por favor me avise na DM.
🤝