Question
Evgeny Shvarov · Oct 21, 2022

What is The Global With Persistence Data For A Class?

Hi Devs!

Is there a way to get a Global that contains pesistence data for a class?

In early versions of IRIS it was classname_"D", like ^Sample.PersonD. Now, at least in IRIS 2022.1  it is something random.

Product version: IRIS 2022.1
0
0 160
Discussion (8)2
Log in or sign up to continue

When doing a create table, it is indeed a hashed global name, but when defining a new class in Studio, it is still clasname_"D" (unless the global name becomes too long).

The parameter USEEXTENTSET=1 will alter this behaviour (in class definition or CREATE table statement) :
Global Naming Strategy: you can use the USEEXTENTSET parameter to specify shorter and more efficient hashed global names for data and index lookup operations.

You can use %Library.CompiledStorage to find out what the global name is for a class : https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic....

I added the way to find out which global name is used in my first reply  : try
 

write ##class(%Dictionary.CompiledStorage).%OpenId("MyPackage.MyClass||Default").DataLocation

There is a faster way without opening the object:

Class dc.test Extends %Persistent
{

ClassMethod Test()
{
  
  classname="dc.test"storagename="Default"
  w $$$defMemberKeyGet(classname,$$$cCLASSstorage,storagename,$$$cSDEFdatalocation)
}

Storage Default
{
<Data name="testDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
</Data>
<DataLocation>^abc.1</DataLocation>
<DefaultData>testDefaultData</DefaultData>
<IdLocation>^dc.testD</IdLocation>
<IndexLocation>^dc.testI</IndexLocation>
<StreamLocation>^dc.testS</StreamLocation>
<Type>%Library.CacheStorage</Type>
}

}

Result:

^abc.1

In System Explorer -> Globals check "Show SQL Table Names". You'll see information on how particular global is used.