Как заставить Intersystems Caché использовать новый скомпилированный класс вместо старого?

У меня проблемы с загрузкой и компиляцией новой версии существующих классов. Во время их загрузки на них нет ссылок. Класс "Test.Extended" расширяет класс "Test.Base". Класс «Расширенный» вызывает ClassMethod в классе «Базовый». Проблема в том, что даже после загрузки и выполнения принудительной компиляции обоих классов вызываемый ClassMethod из "Base" является не методом нового скомпилированного класса, а его более старой версией (подтвержденной написав в консоль).

Чтобы скомпилировать оба, я использую следующие команды из терминала (f: означает принудительно, c: означает компиляцию во время загрузки):

NAMESPACE>w $system.OBJ.Load("C:\Test.Base.cls.xml","fc")

Load started on 01/27/2009 10:10:34
Loading file C:\Test.Base.cls.xml as xml
Imported class: Test.Base
Compiling class Test.Base ..................
Compiling routine Test.Base.1
Load finished successfully.
1

NAMESPACE>w $system.OBJ.Load("C:\Test.Extended.cls.xml","fc")

Load started on 01/27/2009 10:10:34
Loading file C:\Test.Extended.cls.xml as xml
Imported class: Test.Extended
Compiling class Test.Extended ..................
Compiling routine Test.Extended.1
Compiling routine Test.Extended.2
Load finished successfully.
1

Нам нужно, чтобы эти два файла были загружены и скомпилированы системой автоматически, но мы не можем этого сделать, потому что система продолжает использовать более старую версию. Кто-нибудь знает, как заставить Intersystems Caché использовать последнюю версию скомпилированных классов?

Спасибо, Луис


person Luis Soeiro    schedule 27.01.2009    source источник


Ответы (1)


Вот несколько вещей, которые можно попробовать:

Вместо того, чтобы загружать/компилировать каждый класс отдельно, загрузите оба без компиляции, а затем скомпилируйте оба сразу.

Как это:

W $SYSTEM.OBJ.Load("C:\Test.Base.cls.xml")
W $SYSTEM.OBJ.Load("C:\Test.Extended.cls.xml")
W $SYSTEM.OBJ.CompileList("Test.Base.cls,Test.Extended.cls","ckf")

Флаг «k» указывает компилятору сохранить сгенерированный исходный код для классов (файлы .INT). Это позволит вам увидеть, что на самом деле сгенерировал кэш (в Studio: View->View Other Code). Ваши методы компилируются в теги с префиксом «z», поэтому метод ABC становится тегом zABC. В скомпилированном исходном коде также есть отметка времени, которая может помочь подтвердить, что он действительно что-то сделал.

Флаг "b" тоже может помочь. (Включить подклассы).

person Clayton    schedule 11.03.2009
comment
Что-то подобное сработало для меня. Я загружаю каждый класс без его компиляции, и они компилируют их все, используя флаги fabr (принудительно, включать классы приложений, включать подклассы, рекурсивно). - person Luis Soeiro; 19.03.2009