Запустите объектный код $ COMPILE, не сохраняя его сначала в глобальном - PullRequest
0 голосов
/ 11 июня 2018

Caché предоставляет функцию $COMPILE для преобразования массива строк исходного кода в объектный код.Параметр object позволяет сохранять данные двоичного объекта в переменную локального массива, не затрагивая глобальные массивы.

В документации объясняется, что вы можете заменить данные в ^rOBJ(routine) для подпрограммы возвращаемыми строкамив параметре object, и это изменит программу, которая запускается для routine.

Мой вопрос: могу ли я запустить массив object напрямую, не изменяя глобальные переменные (например, сохраняя строки в ^rOBJ первый)?Мои строки кода генерируются динамически внешними приложениями и не могут быть предварительно загружены в подпрограммы.

Я хочу ограничить доступ вызывающей программы ко всей системе.Доступ к модификации ^rOBJ означает возможность изменять подпрограммы приложения, управляющие системой.Это также означает, что мне пришлось бы поддерживать несколько временных подпрограмм, следя за тем, чтобы они очищались во внешнем процессе, даже если задание неожиданно завершается.

В настоящее время я использую XECUTE, чтобы просто запуститьстроки кода напрямую, но я бы предпочел использовать скомпилированный код, так как он быстрее.

1 Ответ

0 голосов
/ 28 июня 2018

Я не смог найти способ запуска $COMPILE кода напрямую.Однако я нашел обходной путь:

С XECUTE вы можете ZLOAD обычную пустую подпрограмму шаблона и затем ZINSERT ваш код, который нужно скомпилировать, но не ZSAVE, чтобы изменения оставались закрытыми длятекущий процесс.Затем возможно DO в локальную версию подпрограммы "буфер подпрограммы" (очевидно, скомпилированную и все остальное), которую вы только что вставили и запустили загруженный код.

Из моего тестирования я обнаружил, что еслиЯ возвращаюсь от XECUTE, $ZNAME к процедуре вызова, и изменения, загруженные в ZINSERT, возвращаются.Поэтому важно, чтобы ZLOAD, ZINSERT и DO были расположены в одной строке XECUTE.

...