【IRIS/Cache】ゴミを残さずクラスを削除する

はじめに

スタジオからクラスを削除すると、内部でストレージ情報等が残ります。
そうすると、同じストレージ名を持つ別名のクラスが作成できなってしまいます。

これでは、クラスのリネームが出来なくなります。
これは困る。綴りを間違えたとか、よくあるネタですよね。

今回はゴミを残さず、綺麗さっぱりと削除する方法をご紹介いたします。
当然リネームもできますよ!

先ずはスタジオからクラスを削除したらどのような状態になるか

下記手順で検証を行います。

  1. 検証対象のクラスを作成する
  2. 作成したクラスを削除する
  3. 同じストレージ名で、クラス名が異なるクラスを作成する

では、検証開始です!

1. 検証対象のクラスを作成する

先ずは検証対象のクラスを作成します。
作成条件は特に指定はありませんが、分かりやすいように下記名称で命名しました。

 ・クラス名「developer.data.Delete.cls」
 ・ストレージ情報「^developer.data.DeleteD、I、S」

ついでに、データも100件程作成します。

2. 作成したデータクラスを削除する

次は、1.で作成したクラスを削除します。

スタジオであれば、クラス名を右クリックし「クラス’xxxx’を削除」を選択し、確認画面で「OK」をクリックすることでクラスは削除ができます。

この時点で、データクラスは削除となりますが、グローバル自体は残存している状態になります。

3. 同じストレージ名で、クラス名が異なるクラスを作成する

データクラスのリネーム作業になりますね。

作業の流れとしては、新規クラスとして「developer.data.Delete.cls」と異なる名前をつけます。
適宜保存した後、ストレージ情報を「^developer.data.DeleteD、I、S」に書き換えて、コンパイル実行。

クラスをリネームしたい時に行うシナリオですよね。

では、下記条件で新規クラスを作成し、コンパイルまで行ってみます。

 ・クラス名「developer.data.DeleteX.cls」
 ・ストレージ情報「^developer.data.DeleteD、I、S」

コンパイル時にアラートが発生します。
アラートの内容は、ストレージ情報が既に使用されているため、同じ名称は付けてはダメって事です。

残存しているグローバルが影響している可能性があるので、一旦グローバルを削除して再度コンパイルを実施します。

やっぱり駄目でした。
グローバルは関係ないですね。

クラスを削除しても、内部でストレージ情報を持っているため、そちらを削除しないと同じストレージ名を使う事が出来ないようです。

削除したクラスのストレージ情報を削除する

既に削除してしまったクラスのストレージ情報を削除するコマンドを実行します。
引数は、「削除したクラス名」になります。

w ##Class(%ExtentMgr.Util).DeleteExtent("developer.data.Delete")

ターミナルで上記コマンドを実行した後、先ほどエラーが発生してコンパイルできなかったクラスを、再度コンパイルしてみます。

04/23/2024 18:06:30 に修飾子 'cuk /checkuptodate=expandedonly' でコンパイルを開始しました。
クラスのコンパイル中 developer.data.DeleteX
テーブルのコンパイル中 developer_data.DeleteX
ルーチンのコンパイル中 developer.data.DeleteX.1
コンパイルが正常に終了しました (所要時間: 0.317秒)。

コンパイルが無事通りました、ではデータが作成・取得できるか試してみたいと思います。

s obj=##class(developer.data.DeleteX).%New()
s obj.num=1
s obj.name="Russell,Ralph W."
w obj.%Save() // -> 1

グローバルも無事作成されたようです。
名称も、元の「developer.data.Delete.cls」のストレージ情報を引き継げたようですね。

グローバルを残して別クラスに引き継げるか?

ここが気になるところですよね。
では、一旦「developer.data.DeleteX.cls」を削除して、「developer.data.DeleteY.cls」を同じクラス構成で作成したいと思います。

クラスをリネームすると思って下さい。

コマンドで確かめてみます。
※リネーム過程は繰り返しになるので割愛致します。

s obj=##class(developer.data.DeleteY).%OpenId(1)
w obj.name // -> Russell,Ralph W.

データが正常に引き継げた事が分かります。
これでリネーム作業も容易に行えるようになりました。

削除前のクラスをコマンドで完全に削除する

まだ存在しているクラスをコマンドで削除します。

下記コマンドを実行する事でクラスの削除を行います。
ストレージ情報とグローバルは削除しません

w $system.OBJ.Delete("developer.data.DeleteY")

第2引数に「e」を渡すことで、ストレージ情報もグローバルも全て削除されます。

w $system.OBJ.Delete("developer.data.DeleteY","e")

では、ターミナルにて実行してみましょう。

実行後クラスが削除され、グローバルも削除されました。
 ※「developer.data.DeleteI」が検索されていますが、中身は存在していません。

ストレージ情報も削除されているので、一番最初に作成したクラス「developer.data.Delete.cls」が再度作成できました。

04/23/2024 18:33:10 に修飾子 'cuk /checkuptodate=expandedonly' でコンパイルを開始しました。
クラスのコンパイル中 developer.data.Delete
テーブルのコンパイル中 developer_data.Delete
ルーチンのコンパイル中 developer.data.Delete.1
コンパイルが正常に終了しました (所要時間: 0.376秒)。

ただし、グローバルが削除されたので、データの引継ぎは行えません。

s obj=##class(developer.data.Delete).%OpenId(1)
w obj // -> null ※レコードが無い為、objはnullとなる

終わりに

クラスを作成した後スペルミスを発見した時は、即修正したいですよね。
そんな時に使用するコマンドを2つご紹介いたしました。

お互い性質の異なるコマンドなので、状況に合わせて使い分けて下さい。