Escrito por

Sales Engineer at InterSystems Iberia
Artículo Ricardo Paiva · ago 23, 2023 3m read

Listado remoto de global usando NativeAPI para ObjectScript #1

Esta pregunta apareció originalmente en los comentarios de la publicación: Descargar globales desde un servidor en particular

Este artículo se inspiró en una pregunta reciente de @Evgeny.Shvarov.

Descargar globales desde un servidor en particular
No es un código de hacer clic y ejecutar, sino un borrador que requiere ajustes para cubrir las necesidades de cada caso de uso. Para ello debe agregar:

  • credenciales para acceder al servidor
  • nivel de control de errores
  • nombre del global
  • el primer conjunto de subíndices como %LB() bloque default=""
  • el último conjunto de subíndices como bloque %LB() default=""
  • un nuevo nombre de global si es necesario default="" >> nombre no cambiado

Si no se proporciona nada más que el nombre global, el resultado es una copia pura.

Advertencia

Este código se ejecuta de manera muy lenta y crea mucho tráfico de red.

Es cierto que $QUERY no es compatible con la API nativa. Con IsDefined (también conocido como $DATA) y GetNext (también conocido como $ORDER)
la solución es bastante larga y aburrida.

Ventaja:

Con este enfoque, NO hay necesidad de ningún otro código o ajuste en el servidor remoto.
Y esa es mi única razón para publicar este ejemplo.

Esto es un "trabajo en progreso". Estén atentos al número 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