Тихий экспорт глобалов с помощью %GOF в Caché

Я хотел бы знать, можно ли использовать «^% GOF» без взаимодействия с пользователем. Я использую Caché 2008. ^%GO не вариант, так как он слишком медленный. Я использую ввод из временного файла для автоматического ответа на вопросы, но это может дать сбой (редко бывает).

Я не смог найти программу этой утилиты в %SYS. Где он расположен?

Спасибо,

Ответ: Использование "%SYS.GlobalQuery:NameSpaceList" для получения списка глобалов (за исключением системных глобалов).

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)

Единственным недостатком является то, что если у вас есть пространство имен с конкатенацией глобалов, превышающее максимально допустимое для глобальной записи, программа вылетает. Затем вы должны разделить список глобальных переменных.


person user74952    schedule 13.04.2012    source источник


Ответы (4)


Я бы порекомендовал вам взглянуть на класс %Library.Global() с выходным форматом 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", Перевод как %String = "") как %Status

    Экспортирует список глобалов GlobalList из пространства имен Nsp в FileName, используя OutputFormat и RecordFormat. OutputFormat может принимать следующие значения: 1 — формат DTM 3 — формат VAXDSM 4 — формат DSM11 5 — формат ISM/Cache 6 — формат MSM 7 — формат блока кэша (%GOF)

    RecordFormat может принимать следующие значения: V — записи переменной длины S — потоковые данные

    Вы можете найти его в документации класса здесь: http://docs.intersystems.com/cache20082/csp/documatic/%25CSP.Documatic.cls

    Я никогда не использовал его, но похоже, что это поможет.

person KiaHusky    schedule 13.04.2012
comment
Я знаю этот класс, но мы не можем использовать регулярное выражение (*), вы должны указать все глобальные переменные в виде списка. - person user74952; 16.04.2012
comment
Я попытаюсь найти способ получить список глобальных переменных для резервного копирования. - person user74952; 16.04.2012
comment
@user74952 user74952 - Чтобы перечислить глобальные переменные, см. namespace" title="какой текущий предпочтительный метод перечисления глобальных переменных в пространстве имен"> stackoverflow.com/questions/9793241/ - person psr; 27.04.2012

экспортировать свой глобальный в файл

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

импортировать глобальные из вашего файла

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

Расширение элементов определяет их тип, они могут быть одним из:

  • ЦЛС - классы
  • CSP — Страницы кэш-сервера
  • CSR — файлы правил кэширования
  • MAC — макросы
  • INT — нет макросов
  • BAS - Основные процедуры
  • INC — включить файлы
  • ГБЛ — глобалы
  • PRJ - Студийные проекты
  • OBJ — код объекта
  • PKG — определение пакета
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.

ссылка на книга

редактировать: добавление -d в качестве значения qspec подавляет вывод терминала экспорта. Если вы хотите использовать это программно, это может помешать.

person DAiMor    schedule 13.04.2012
comment
Как я могу получить только определенный узел глобалов? Например, все глобальные переменные выглядят так: ^BACKTR(INDX,COMPANY,1,,) - person Malcolm Salvador; 02.04.2016

И просто для полноты картины:

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>

-> приводит к тому, что c:\temp\test.gof имеет экспорт. Вы можете определить до 65435 глобальных переменных в вашем массиве (в этом примере они называются глобальными).

Но я бы порекомендовал вам пойти с ответом DAiMor, так как это более «современный» способ.

person kazamatzuri    schedule 14.04.2012

Чтобы избежать ошибки максимальной строки, вы должны использовать индексы вместо строки с разделителями-запятыми:

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
person SSH    schedule 22.04.2012