Artículo
Eduardo Anglada · Ago 12 Lectura de 3 min

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
10
2 0 0 46
Log in or sign up to continue