%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()
}