Question

I would like to know if it's possible to use "^%GOF" without user interaction. I'm using Caché 2008. ^%GO isn't an option as it's to slow. I'm using input from a temporary file for automatically answer the questions, but it can fail (rarely happens).

I couldn't find the routine of this utility in %SYS. Where is it located?

Thanks,

Answer: Using "%SYS.GlobalQuery:NameSpaceList" to get list of globals (system globals excluding).

Set Rset = ##class(%ResultSet).%New("%SYS.GlobalQuery:NameSpaceList")
d Rset.Execute(namespace, "*", 0)
s globals=""

while (Rset.Next()){
 s globalName=Rset.Data("Name")_".gbl"
 if (globals=""){
  s globals = globalName
 }else{
  s globals = globals_","_globalName
}

d ##class(%Library.Global).Export(namespace, globals, "/tmp/export.gof", 7)

The only drawback is that if you have a namespace with concatination of globals exceeding the maximum allowed for a global entry, the program crashes. You should then split the globals list.

Was it helpful?

Solution

I would recommend that you look at the %Library.Global() class with output format 7.

  • classmethod Export(Nsp As %String = $zu(5), ByRef GlobalList As %String, FileName As %String, OutputFormat As %Integer = 5, RecordFormat As %String = "V", qspec As %String = "d", Translation As %String = "") as %Status

    Exports a list of globals GlobalList from a namespace Nsp to FileName using OutputFormat and RecordFormat. OutputFormat can take the values below: 1 - DTM format 3 - VAXDSM format 4 - DSM11 format 5 - ISM/Cache format 6 - MSM format 7 - Cache Block format (%GOF)

    RecordFormat can take the values below: V - Variable Length Records S - Stream Data

    You can find it in the class documentation here: http://docs.intersystems.com/cache20082/csp/documatic/%25CSP.Documatic.cls

    I've never used it, it looks like it would do the trick however.

OTHER TIPS

export your global to file

d $system.OBJ.Export("myGlobal.GBL","c:\global.xml")

import global from your file

d $system.OBJ.Load("c:\global.xml")
Export items as an XML file

The extension of the items determine what type they are, they can be one of:

  • CLS - classes
  • CSP - Cache Server Pages
  • CSR - Cache Rule files
  • MAC - Macro routines
  • INT - None macro routines
  • BAS - Basic routines
  • INC - Include files
  • GBL - Globals
  • PRJ - Studio Projects
  • OBJ - Object code
  • PKG - Package definition
If you wish to export multiple classes then separate then with commas or pass the items("item")="" as an array or use wild cards.
If filename is empty then it will export to the current device.

link to docbook

edit: adding "-d" as qspec value will suppress the terminal output of the export. If you want to use this programmtically, it might get in the way.

And just for completeness' sake:

SAMPLES>s IO="c:\temp\test.gof"

SAMPLES>s IOT="RMS"

SAMPLES>s IOPAR="WNS"

SAMPLES>s globals("Sample.PersonD")=""

SAMPLES>d entry^%GOF(.globals)

SAMPLES>

-> results in c:\temp\test.gof having the export. You can define up to 65435 globals in you array (named globals in this example)

But I would recommend you go with DAiMor's answer as this is the more 'modern' way.

To avoid maximum string error, you should use subscripts instead of comma delimited string:

Set Rset = ##class(%ResultSet).%New("%SYS.GlobalQuery:NameSpaceList")
d Rset.Execute(namespace, "*", 0)

while (Rset.Next()) {
 s globals(Rset.Data("Name"))="" // No need for _".gbl" in recent Cache
}

d ##class(%Library.Global).Export(namespace, .globals, "/tmp/export.gof", 7) // Note dot before globals
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top