Artículo
· 8 ago, 2023 Lectura de 4 min

Cómo encontrar una variable global específica en el archivo de journals con un sólo comando

InterSystems FAQ

Puedes buscar variables globales específicas en el archivo de journals usando la consulta ByTimeReverseOrder de la clase %SYS.Journal.File y la consulta List de la clase %SYS.Journal.Record

El funcionamiento de cada consulta es el siguiente:

A) Consulta ByTimeReverseOrder de la clase %SYS.Journal.File

Retornará el nombre de los archivos de journals ordenados por el nombre de forma descendente. 

USER>set stmt=##class(%SQL.Statement).%New()

USER>set status=stmt.%PrepareClassQuery("%SYS.Journal.File","ByTimeReverseOrder")

USER>set rs=stmt.%Execute()

USER>while rs.%Next() { write rs.%Get("Name"),! }
c:\intersystems\irishcom\mgr\journal\20230725.002
c:\intersystems\irishcom\mgr\journal\20230725.001
C:\InterSystems\IRISHCom\mgr\journal\20230707.002

 

B) Consulta List de la clase %SYS.Journal.Record

Recuperará los registros de un archivo específico de journals.

A partir de la versión 2022.2.0+ , puedes ejecutar la consulta con %SQL.Statement.

USER>set status=stmt.%PrepareClassQuery("%SYS.Journal.Record","List")
 
USER>set rs2=stmt.%Execute("c:\intersystems\irishcom\mgr\journal\20230725.002")
 
USER>while rs2.%Next() {if rs2.%Get("GlobalReference")["TEST" write rs2.%Get("GlobalReference"),!}
^["^^c:\intersystems\irishcom\mgr\user\"]TEST(1)
     ・・・ omit ・・・
^["^^c:\intersystems\irishcom\mgr\user\"]TEST(4)
^["^^c:\intersystems\irishcom\mgr\user\"]TEST(5)

Para versiones anteriores a 2022.2.0 , puedes ejecutarla con %ResutSet.

USER>set rs2=##class(%ResultSet).%New("%SYS.Journal.Record:List")

USER>do rs2.Execute("c:\intersystems\irishcom\mgr\journal\20230725.002")

USER>while rs2.Next() { if rs2.Get("GlobalReference")["TEST" write rs2.Get("GlobalReference"),!}
^["^^c:\intersystems\cache\mgr\user\"]TEST(1)
     ・・・ omit ・・・
^["^^c:\intersystems\cache\mgr\user\"]TEST(9)
^["^^c:\intersystems\cache\mgr\user\"]TEST(10)

Nota:  Especificar el nombre del archivo de journals obtenido en A) como argumento cuando se ejecute B)

Puedes consultar el contenido de la respuesta de la consulta B) en la referencia de la clase.
Veamos un ejemplo de un método que combina A) y B):

/// 1st argument: specify the name of the global(without ^)
/// 2nd argument: specify the name of the folder(without full path)
ClassMethod SearchJournal(name As %String, filename As %String = "")
{
	if $get(name)="" {
		write "Please specify a global name",!
		quit
	}
	//Find the specified global in the currently active journal file
	set stmt=##class(%SQL.Statement).%New()
	set status=stmt.%PrepareClassQuery("%SYS.Journal.File","ByTimeReverseOrder")
	set rs1=stmt.%Execute()
	while rs1.%Next() {
		set jrnfile=rs1.%Get("Name")
		set size=rs1.%Get("Size")
		write "Journal file:",jrnfile,!," file size:",size/1024/1024," MB",!
		do ..SearchGlo(name,jrnfile)
	}
}

ClassMethod SearchGlo(name As %String, jrnfile As %String)
{
	set stmt=##class(%SQL.Statement).%New()
	set status=stmt.%PrepareClassQuery("%SYS.Journal.Record","List")
	write status,!

	//Open journal file from here and look for the specified global
	set rs1=stmt.%Execute(jrnfile,"GlobalReference,NewValue",,,$lb("GlobalReference","[",name))
	
	while rs1.%Next() {
		set glo=rs1.%Get("GlobalReference")
		write " ",glo," = ",rs1.%Get("NewValue"),!
	}
}

 

Si en tu caso tienes que usar  %ResultSet, puedes ver el ejemplo a continuación:

/// 1st argument: specify the name of the global(without ^)
/// 2nd argument: specify the name of the folder(without full path)
ClassMethod SearchJournal(name As %String, filename As %String = "")
{
	if $get(name)="" {
		write "Please specify a global name",!
		quit
	}
	//Find the specified global in the currently active journal file
	set rs1=##class(%ResultSet).%New()
	set rs1.ClassName="%SYS.Journal.File"
	set rs1.QueryName="ByTimeReverseOrder"
	do rs1.%Execute()
	while rs1.%Next() {
		set jrnfile=rs1.%Get("Name")
		set size=rs1.%Get("Size")
		write "Journal file:",jrnfile,!," file size:",size/1024/1024," MB",!
		do ..SearchGlo(name,jrnfile)
	}
	do rs1.Close()
}

ClassMethod SearchGlo(name As %String, jrnfile As %String)
{
	set rs1=##class(%ResultSet).%New()
	set rs1.ClassName="%SYS.Journal.Record"
	set rs1.QueryName="List"
	//Open journal file from here and look for the specified global
	do rs1.%Execute(jrnfile,"GlobalReference,NewValue",,,$lb("GlobalReference","[",name))
	
	while rs1.%Next() {
		set glo=rs1.%Get("GlobalReference")
		write " ",glo," = ",rs1.%Get("NewValue"),!
	}
	do rs1.Close()
}
Comentarios (0)1
Inicie sesión o regístrese para continuar