Artigo
· Ago. 16, 2023 3min de leitura

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 handling
  quit %rccdb
}

/// tosubscript stops loop
ClassMethod View(
  global As %String = "",
  fromsubscript As %List = "",
  tosubscript As %List = "")
{
  quit ..Copy(global,fromsubscript,tosubscript,"")
}

/// rename also works to local variable array
ClassMethod Copy(
  global As %String = "",
  fromsubscript As %List = "",
  tosubscript As %List = "",
  rename As %String = "*")
{
#dim %rccdb as %Net.DB.Iris
 set subs=..Args(fromsubscript)
 set stop=..Args(tosubscript)
 set:rename="*" rename="^"_global 
loop
 if $l(subs),$l(stop),$p(subs,stop)="" quit 1
 set gx=""""_global_""""
#; write !?20,gx_subs   just for debug
 set x1="quit %rccdb.IsDefined("_gx_subs_")"
   , dd=$xecute(x1)
 if $l(stop),subs]]stop quit 1
 if 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,!    
   else  write "^",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=0
   if down="" set subs=$p(subs,",",1,*-1)
   goto up
   } 
 if '$isvalidnum(nxsub) set nxsub=""""_nxsub_""""
 set $p(subs,",",*+(dd\10))=nxsub   
 if $l(subs,",")<2 quit 1
 goto 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
}
}
Discussão (1)1
Entre ou crie uma conta para continuar