1

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.

user74952
  • 35
  • 2
  • 5

4 Answers4

3

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.

KiaHusky
  • 46
  • 1
  • I know this class, but we can't use a regex ("*"), you must give all globals as a list. – user74952 Apr 16 '12 at 13:43
  • I will try to figure out a way to get the list of globals to backup. – user74952 Apr 16 '12 at 14:08
  • @user74952 - To list the globals, see http://stackoverflow.com/questions/9793241/what-is-the-current-preferred-method-for-enumerating-the-globals-in-a-namespace – psr Apr 27 '12 at 17:27
2

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.

Community
  • 1
  • 1
DAiMor
  • 3,185
  • 16
  • 24
1

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.

kazamatzuri
  • 413
  • 1
  • 3
  • 12
0

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
SSH
  • 2,533
  • 16
  • 21