記事
Mihoko Iijima · 2021年1月29日 3m read

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

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

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

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

 

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

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

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 クエリ

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

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

USER>do rs2.Execute("c:\intersystems\cache\mgr\journal\20190620.003")

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 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()
}
00
1 0 0 9
Log in or sign up to continue