記事
· 2023年3月13日 3m read

永続クラス定義のデータが格納されるグローバル変数名について

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

永続クラス定義では、データを格納するグローバル変数名を初回クラスコンパイル時に決定しています。
グローバル変数名は、コンパイル後に表示されるストレージ定義(Storage)で確認できます。

例)

Class Training.Person Extends %Persistent
{
Property Name As %String; Property Email As %String; Storage Default
{
<Data name="PersonDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Name</Value>
</Value>
<Value name="3">
<Value>Email</Value>
</Value>
</Data>
<DataLocation>^Training.PersonD</DataLocation>
<DefaultData>PersonDefaultData</DefaultData>
<ExtentSize>0</ExtentSize>
<IdLocation>^Training.PersonD</IdLocation>
<IndexLocation>^Training.PersonI</IndexLocation>
<StreamLocation>^Training.PersonS</StreamLocation>

<Type>%Storage.Persistent</Type>
}

}

 

DataLocation:^パッケージ名.クラス名D
永続クラスのデータが登録されるグローバル変数です。

IndexLocation:^パッケージ名.クラス名I
インデックスが格納されるグローバル変数です。

StreamLocation:^パッケージ名.クラス名S
ストリームプロパティのデータが格納される変数です。

 

例外として、31文字以上のクラス名を指定した場合、グローバル変数名の文字数制限を超えてしまうため、ネームスペースで一意となる適当なグローバル変数名を使用します。

Class TestPackage.VeryLongLongLongLongName Extends %Persistent
{
Property Name As %String; Storage Default
{
<Data name="VeryLongLongLongLongNameDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Name</Value>
</Value>
</Data>
<DataLocation>^TestPackage.VeryLongLon92A3D</DataLocation>
<DefaultData>VeryLongLongLongLongNameDefaultData</DefaultData>
<IdLocation>^TestPackage.VeryLongLon92A3D</IdLocation>
<IndexLocation>^TestPackage.VeryLongLon92A3I</IndexLocation>
<StreamLocation>^TestPackage.VeryLongLon92A3S</StreamLocation>

<Type>%Storage.Persistent</Type>
}
}

 

ストレージ定義未作成の場合、DEFAULTGLOBALパラメータを利用してグローバル変数名を指定することができます。
(指定したグローバル変数名の末尾にD、I、Sを付与した名称をストレージに定義します。)

Class TestPackage.VeryLongLongLongLongName Extends %Persistent
{
Property Name As %String;

Parameter DEFAULTGLOBAL = "^Test.LongName";

Storage Default
{
<Data name="VeryLongLongLongLongNameDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Name</Value>
</Value>
</Data>
<DataLocation>^Test.LongNameD</DataLocation>
<DefaultData>VeryLongLongLongLongNameDefaultData</DefaultData>
<IdLocation>^Test.LongNameD</IdLocation>
<IndexLocation>^Test.LongNameI</IndexLocation>
<StreamLocation>^Test.LongNameS</StreamLocation>

<Type>%Storage.Persistent</Type>
}

}

詳細は以下ドキュメントもご参照ください。

 

この他、2017.2以降からストレージに定義されるグローバル変数名をハッシュ化したグローバル変数名に変更できるパラメータ:USEREXTENTSETが、パフォーマンス向上のために追加されました。

ストレージ未作成時(クラス定義の初回コンパイル前)に設定することで、 ^EPgS.D8T6.1 のようなハッシュ化したグローバル変数名が設定されます。

Parameter USEEXTENTSET = 1;

 

USEEXTENTSETパラメータを使用する場合のストレージ定義について詳細は、関連トピックをご参照ください。

 


関連記事もご参照ください

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください