Escrito por

Sales Engineer at InterSystems
Artículo Eduardo Anglada · ago 12, 2021 3m read

Escaneo y división de globals

Este es un ejemplo de código que funciona en IRIS 2020.1 y en Caché 2018.1.3
No se mantendrá sincronizado con las nuevas versiones.
Y NO cuenta con el servicio de soporte de InterSystems.

En la mayoría de los casos, un global que se utiliza como almacenamiento predeterminado tiene solo 1 nivel de subíndice que representa el IDKEY.
Para un índice de globals podemos ver 2 o más niveles de subíndices.
Las matrices, las relaciones de herencia padre hijo o las clases persistentes que extienden una clase base, son ejemplos en los que vemos más niveles. Aunque todos estos globals son bastante uniformes.

Y después vemos globals que no están relacionados con clases o tablas como ^SPOOL,  ^ERRORS, o ^%SYS, en los que la estructura depende de varios niveles de subíndices con un significado especial.

El análisis de esos globals no convencionales es un reto y el simple hecho de descargarlos no necesariamente ayuda a comprender las dependencias.

Este ejemplo está orientado al viejo chiste:  "¿Cómo se come un elefante?" ==> "¡Cortándolo en porciones!"

Esa es la oferta:
Por medio de una sentencia SQL, se puede mostrar la estructura de cualquier global por niveles.
Tú proporcionas el nombre del global y el nivel máximo que mostrará, y obtienes los subíndices relacionados, $Data del nodo, la cantidad de los siguientes subnodos y, si está disponible, el contenido almacenado en ese nivel.

Por ejemplo: SELECT * FROM rcc_G.scan where rcc_G.Scan('^%SYS',1)=1

Reference       Level $D SubN  Value
^%SYS               0   10 25
("CSP") 1 10
("CSPAppSec") 1 1 64 ("CacheTempDir") 1 1 "c:\intersystems\iris\mgr\iristemp" ("DBRefByName") 1 10
("Ensemble") 1 11 "2020-04-25 18:37:18" ("ErrorPurge") 1 1 30 ("FIPSMode") 1 1 0 ("IRISTempDir") 1 1 "c:\intersystems\iris\mgr\iristemp" ("JOURNAL") 1 11 0 ("LANGUAGE") 1 10
("LASTSESSIONGUID") 1 1 "EÊcRù¢GM£ô"$c(127)"¹9¾ÒÆ" ("LOCALE") 1 10
("ModuleRoot") 1 10
("NLS") 1 10
("SERVICE") 1 10
("SSPort") 1 1 51773 ("StreamLocation") 1 10
("SystemMode") 1 1 "TEST" ("TempDir") 1 1 "C:\InterSystems\IRIS\mgr\Temp" ("WebServer") 1 10
("bindir") 1 1 "c:\intersystems\iris\bin" ("shutdownlogerrors") 1 1 0 ("sql") 1 10
("sysdir") 1 1 "c:\intersystems\iris\mgr" ("tercap") 1 10
26 lines

SELECT * FROM rcc_G.scan where rcc_G.Scan('^%SYS',2)=1

Reference                   Level $D SubN   Value
^%SYS                           0   10 25
("CSP") 1 10 1
("CSP","LastUpdate") 2 1 "65553,44452" ("CSPAppSec") 1 1 0 64 ("CacheTempDir") 1 1 0 "c:\intersystems\iris\mgr\iristemp" ("DBRefByName") 1 10 9
("DBRefByName","CACHE") 2 1 "^^c:\intersystems\iris\mgr\cache" ("DBRefByName","CACHEUSER") 2 1 "^^c:\intersystems\user" ("DBRefByName","ENSLIB") 2 1 "^^c:\intersystems\iris\mgr\enslib" ("DBRefByName","IRISAUDIT") 2 1 "^^c:\intersystems\iris\mgr\irisaudit" ("DBRefByName","IRISLIB") 2 1 "^^c:\intersystems\iris\mgr\irislib" ("DBRefByName","IRISLOCALDATA") 2 1 "^^c:\intersystems\iris\mgr\irislocaldata" < 60 lines more >

SELECT * FROM rcc_G.scan where rcc_G.Scan('^ERRORS',37)=1 and id['Jour'

Reference                                            Level    $D  SubNodes    Value
(65588,1,"*STACK",1,"V","%00000","N","""JournalState""")    8   1    0         4
(65592,1,"*STACK",1,"V","%00000","N","""JournalState""")    8   1    0         4
(65592,2,"*STACK",1,"V","%00000","N","""JournalState""")    8   1    0         4