コマンドでジャーナルファイルにある特定のグローバル変数を検索する方法
これは 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() }