SPOOL - El dispositivo olvidado

Primary tabs

This is the translation of the original article.
Caché

Hola a tod@s,

En recientes conversaciones, respuestas y comentarios, la redirección IO (con el famoso código) se veía como la solución indiscutible. Sin duda, es una solución potente y no solo permite registrar la salida, sino también hacer captura de teclas en la entrada.

Pero creo que para simplemente generar un registro (log), supone un sobretrabajo. Si solo necesitas obtener un texto o descargar sus variables u objetos, entonces SPOOL debería ser suficiente.

El principio se remonta a las raíces y algunas utilidades como  ^%IS,^%SPOOL,%SPL* programadas en un estilo bastante antiguo, tienen más interés por su valor arqueológico que por su utilidad. La documentación sobre SPOOL es muy completa y explica casi todos los detalles.

Para el uso diario, deberías saber

  • Device = 2
  • tiene un documentId entero (default=1)
  • tiene un lineNumber entero (default =1)

Para iniciarlo, se hace OPEN 2:documentId USE 2 y tu redirección está hecha. El resto de WRITES ahora terminan en el global ^SPOOL(documentId,lineNumber) y cuando termines o tu job muera, CLOSE 2 completa el redireccionamiento. O puedes volver a tu dispositivo primario con USE $P y mantener abierto el spool para otras salidas.

Si quieres añadir a un documento existente, se tiene que obtener la siguiente línea a escribir como inicio para el OPEN

    set append=$s($o(^SPOOL(documentId,""),-1,val):$p(val,"{",*-1),1:0)
    OPEN 2(documentId:append) USE 2

El DISPOSITIVO SPOOL ignora cualquier READ y devuelve "", así que la forma más fácil de sacar del spool es tan solo listar el global:

    FOR i=1:1 QUIT:'$DATA(^SPOOL(documentId,i),val)  WRITE val

Os muestro un pequeño resumen de todo lo que se necesita para usar SPOOL para depuración:

SpoolDemo ;Essentials for using SPOOL device in debugging
   ;
   ;; if we have no idea on free docId
New()
   SET docId=$INCREMENT(^SPOOL)
   QUIT $$Open(docId)
   ;
   ;; we insist in a docId
Open(docId)
   DO Clean(docId)
   OPEN 2:docId
   USE 2
   QUIT docId
   ;
   ;;continue to write to docId
App(docId)
   SET append=$SELECT($ORDER(^SPOOL(docId,""),-1,val):$PIECE(val,"{",*-1),1:0)
   IF 'append QUIT $$Open(docId)
   OPEN 2:(docId:append)
   USE 2
   QUIT docId
   ;
   ;; dump spooled output
DeSpool(docId)
   FOR i=1:1 QUIT:'$DATA(^SPOOL(docId,i),val)   WRITE val
   WRITE !,"*** done ***",!
   QUIT docId
   ;
   ;; clean Spool

Clean(docId)
  KILL ^SPOOL(docId)
  QUIT   

 

Espero que os resulte útil.