Tradução: Listagem Remota de Globais usando a NativeAPI para ObjectScript #1
Esta pergunta originalmente apareceu nos comentários do post:Download globals from a particular server
Este artigo foi inspirado por uma pergunta recente feita por @Evgeny.Shvarov.
Download globals from a particular server
Não se trata de um código de "clique e execute", mas sim de um rascunho que requer ajustes para atender às suas necessidades específicas. Você precisa adicionar...
- suas credenciais de acesso ao servidor,
- seu tratamento de erros
- nome da Global
- o primeiro conjunto de subscritos como %LB() valor padrão do bloco=""
- o último conjunto de subscritos como %LB() valor padrão do bloco=""
- um novo nome para a global, se necessário, padrão = "" >> nome não alterado.
Se nada além do nome da global for fornecido, o resultado é uma cópia pura.
Atenção:
Este código é executado relativamente devagar e cria um grande tráfego de rede. Contexto: Como o $QUERY não é suportado pela Native API, é necessário um contorno longo com IsDefined (também conhecido como $DATA) e GetNext (famoso $ORDER)
Vantagem:
Com essa abordagem, NÃO É NECESSÁRIO qualquer outro código ou ajuste no servidor remoto.
E essa é a única razão pela qual estou publicando este exemplo.
Uma melhoria está em andamento. Fique atento para a parte 2.
Class nacl.GVC
{
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
}
/// tosubscript stops loopClassMethodView(
global As%String = "",
fromsubscript As%List = "",
tosubscript As%List = "")
{
quit..Copy(global,fromsubscript,tosubscript,"")
}
/// rename also works to local variable arrayClassMethod Copy(
global As%String = "",
fromsubscript As%List = "",
tosubscript As%List = "",
rename As%String = "*")
{
#dim%rccdbas%Net.DB.Irisset subs=..Args(fromsubscript)
set stop=..Args(tosubscript)
set:rename="*" rename="^"_global
loop
if$l(subs),$l(stop),$p(subs,stop)=""quit1set gx=""""_global_""""
#; write !?20,gx_subs just for debugset x1="quit %rccdb.IsDefined("_gx_subs_")"
, dd=$xecute(x1)
if$l(stop),subs]]stop quit1if dd#10 {
set x2="quit %rccdb.Get("_gx_subs_")"
, val=$xecute(x2)
, tx=rename_$s($l(subs):"("_$e(subs,2,*)_")",1:"")
, tv=##class(%Utility).FormatString(val)
, x3="(val) set "_tx_"=val q 1 "if$l(rename),$xecute(x3,val) write tx," = ",tv,!
elsewrite"^",global,tx," = ",tv,!
}
up
set down=$s(dd\10:",""""",1:"")
set x4="quit %rccdb.GetNext(1,0,0,"_gx_subs_down_")"
, nxsub=$xecute(x4)
if nxsub="" {
set dd=0if down=""set subs=$p(subs,",",1,*-1)
goto up
}
if '$isvalidnum(nxsub) set nxsub=""""_nxsub_""""set$p(subs,",",*+(dd\10))=nxsub
if$l(subs,",")<2quit1goto loop
}
ClassMethod Args(list As%List = "") As%String
{
if '$listvalid(list) set list=$lb(list)
set ll=$ll(list),subs=""for i=1:1:ll {
set sub=$li(list,i)
, subs=subs_","_$s($isvalidnum(sub):sub,1:""""_sub_"""")
}
quit subs
}
}
Comments
Qualquer necessidade de correção na tradução, por favor me avise na DM.