記事
· 2021年1月29日 4m read

コマンドでジャーナルファイルにある特定のグローバル変数を検索する方法

これは InterSystems FAQ サイトの記事です。

%SYS.Journal.File クラスの ByTimeReverseOrder クエリ と %SYS.Journal.Record クラスの List クエリを使用して検索することができます。

それぞれのクエリの役割は以下の通りです。

 

A) %SYS.Journal.File クラスの ByTimeReverseOrder クエリ

ジャーナルファイル名を取得できます。ジャーナルファイル名の降順で結果が返ります。​​

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

バージョン2018.1未満のバージョンでは以下の方法をご利用ください。

USER>set rs=##class(%ResultSet).%New("%SYS.Journal.File:ByTimeReverseOrder")

USER>do rs.Execute()

USER>while rs.Next() { write rs.Name,! }
c:\intersystems\cache\mgr\journal\20190620.003
c:\intersystems\cache\mgr\journal\20190620.002
c:\intersystems\cache\mgr\journal\20190620.001
c:\intersystems\cache\mgr\journal\20190610.001

 

B) %SYS.Journal.Record クラスの List クエリ

特定のジャーナルファイルのジャーナルレコードを取得できます。

バージョン2022.2以降でお試しいただく場合は、%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)
     ・・・ 省略 ・・・
^["^^c:\intersystems\irishcom\mgr\user\"]TEST(4)
^["^^c:\intersystems\irishcom\mgr\user\"]TEST(5)

バージョン2022.2未満でお試しいただく場合は、%ResultSetクラスをご利用ください。

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)
     ・・・ 省略 ・・・
^["^^c:\intersystems\cache\mgr\user\"]TEST(9)
^["^^c:\intersystems\cache\mgr\user\"]TEST(10)

メモ: A) で取得したジャーナルファイル名を B)のクエリ実行時の引数として指定します。

 

B)のクエリで取得できる内容については、クラスリファレンスをご参照ください。
%SYS.Journal:Listクエリの取得内容について
 

A)と B)を組み合わせたメソッド例は以下の通りです。

/// 第1引数: グローバル名の指定(^を除くグローバル名を指定)
/// 第2引数: ファイル名の指定(ディレクトリは含まず)
ClassMethod SearchJournal(name As %String, filename As %String = "")
{
    if $get(name)="" {
        write "グローバル名を指定してください",!
        quit
    }
    //現在有効なジャーナルファイルから指定のグローバルを探す
    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 "ジャーナルファイル:",jrnfile,!," ファイルサイズ:",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,!

    //ここからジャーナルファイルをオープンして指定のグローバルを探す
    set rs1=stmt.%Execute(jrnfile,"GlobalReference,NewValue",,,$lb("GlobalReference","[",name))
    
    while rs1.%Next() {
        set glo=rs1.%Get("GlobalReference")
        write " ",glo," = ",rs1.%Get("NewValue"),!
    }
}

以下、%ResultSetクラスを利用した実行例です。%SQL.Statementで実行できないバージョンで実行する場合にご利用ください。

/// 第1引数: グローバル名の指定(^を除くグローバル名を指定)
/// 第2引数: ファイル名の指定(ディレクトリは含まず)
ClassMethod SearchJournal(name As %String, filename As %String = "")
{
	if $get(name)="" {
		write "グローバル名を指定してください",!
		quit
	}
	//現在有効なジャーナルファイルから指定のグローバルを探す
	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 "ジャーナルファイル:",jrnfile,!," ファイルサイズ:",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"
	//ここからジャーナルファイルをオープンして指定のグローバルを探す
	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()
}
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください