powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопросы по доступу к метаданным
25 сообщений из 34, страница 1 из 2
Вопросы по доступу к метаданным
    #34755027
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Пытаюсь сделать небольшую утилиту для экспорта данных из классов в файл-скрипт с sql запросами, а также для последующего импорта из данного скрипта в базу. Возникли следующие вопросы (попытки поиска по форуму и в документации оказались малоуспешны):

1. Как можно выполнить COS-код из .NET ? Или как из .NET обратиться к методам системных классов Cache для которых не удается сгенерировать соответствующие объекты через CacheNetWizard ? Используемый .NET CacheProvider как-то странно документирован, описывается только малая часть классов и их свойств/методов (в основном про простую работу с объектами и запросами).

Очень хотелось бы из .NET получить дерево классов БД (как в утилите CacheNetWizard):
2. Как получить список Namespace'ов на сервере?
3. Как получить список pakages внутри определенного Namespace?
4. Как получить список классов внутри определенного pakage ?

5. Есть несколько взаимосвязанных по relationship классов. Насколько я понимаю внутри этой связи используются ObjID таблиц. При удалении/добавлении записей в таблицы ObjID меняются. Как грамотно сохранить связи между объектами? Возможно есть способ принудительно изменения значений ObjID? Или можно сделать связь на основе значений других идентификаторов сущностей.

6. Как из ClassMethod сделанного на COS можно вернуть результат-запроса в виде набора из нескольких строк (также как это возврщает Query)?

Заранее спасибо.
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34755161
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще в догонку :)

7. Как в .NET с помощью Managed Provider'а работать с системными классами, например с %Directory.ClassDefinition ?
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34755181
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при попытке сгенерировать соответствующий proxie-класс для %Directory.ClassDefinition происходит ошибка
Код: plaintext
c:\TEMP\trhvezgd. 0 .cs( 3459 , 66 ) : error CS0102: The class 'SysDictionary.IndexDefinition' already contains a definition for 'Extent'

8. Возможно ли создавать proxie-классы для классов системной библиотеки (%классов) ?
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34755310
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Советую Вам сделать набор собственных классов Cache' для реализации функционала Вашей утилиты.
А потом уже сделать proxy этого класса в .Net.

Посмотрите документ про API по конфигурированию Cache'.

Вадим
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34755317
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду, вызывать системные классы из кода Ваших классов Cache'.

Вадим
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34755906
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторСоветую Вам сделать набор собственных классов Cache' для реализации функционала Вашей утилиты.
А потом уже сделать proxy этого класса в .Net.

Пока так и приходиться делать. Просто мне кажется странным отсутствие возможности вызывать напрямую из .NET системные классы.

авторПосмотрите документ про API по конфигурированию Cache'.

Посмотрел, спасибо. Но описанное там не помогает решить проблему с получением списка namespace'ов.
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34755931
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел ответ на вопрос
AndreyBark6. Как из ClassMethod сделанного на COS можно вернуть результат-запроса в виде набора из нескольких строк (также как это возврщает Query)?

ответ называется User-Written Class Queries

решение выглядит приблизительно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
/// Получить список областей (Namespaces)
Query GetNamespaces() As %Query(CONTAINID= 0 , ROWSPEC="Name:%String")
{
}
ClassMethod GetNamespacesExecute(ByRef qHandle As %Binary) As %Status
{
	set list="",result=""		// s (list,result)=""
	for i= 1 : 1 :$zu( 90 , 0 )
	{
 		set list($zu( 90 , 2 , 0 ,i))="" 	// получаем в переменную list все области
 	}
 	set n=""
	Quit $$$OK
}
ClassMethod GetNamespacesFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer) As %Status
	[ PlaceAfter = GetNamespacesExecute ]
{
	set n=$order(list(n))
	if (n="")
	{
		set Row = ""
		set AtEnd =  1 
	}
	else
	{
		set Row = n
	}
	Quit $$$OK
}
ClassMethod GetNamespacesClose(ByRef qHandle As %Binary) As %Status
	[ PlaceAfter = GetNamespacesExecute ]
{
	Quit $$$OK
}

Нормально вроде компилируется, но при выполнении этого запроса почему-то происходит подвисание. Так что ответ на вопрос 6 можно считать не полным :)

Ответ на вопрос
AndreyBark2. Как получить список Namespace'ов на сервере?
вроде бы такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
quit:'$zu( 90 , 0 ) 				// выход, если области отсутствуют
	set list="",result=""		// s (list,result)=""
	for i= 1 : 1 :$zu( 90 , 0 )
	{
 		set list($zu( 90 , 2 , 0 ,i))="" 	// получаем в переменную list все области
 	}
	set n=""
	for {
		set n=$order(list(n))
		quit:n="" 
		write n,! // выводим области на экран
	}

Продолжается поиск (и ожидание :)) ответов на оставльные вопросы.
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34755992
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Bark
Нормально вроде компилируется, но при выполнении этого запроса почему-то происходит подвисание.

Подвисает? У меня выдаёт ошибку при выполнении.
Код: plaintext
1.
set Row = n
Row должен быть списком, т.е.
Код: plaintext
set Row=$LB(n)
После исправления вроде нормально работает.
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34756006
LenRover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получить список namespace-ов:

рылась в документации нашла команду do ^%CD. На запрос надо ввести "?".

вот пример из терминала

DELTA>d ^%CD

Namespace: ?

'?' for help.
'@' (at-sign) to edit the default, the last namespace
name attempted. Edit the line just as if it were
a line of code.
<RETURN> will leave you in the current namespace.
Here are the defined namespaces:
%CACHELIB
%SYS
DELTA
DELTA2
DEV
DOCBOOK
EASTLINE
KZ
PITER
SAMPLES
SBARRO
USER


Может, поможет...))
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34756040
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле решение выглядит приблизительно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
/// Получить список областей (Namespaces)
Query GetNamespaces() As %Query(CONTAINID= 0 , ROWSPEC="Name:%String")
{
}
ClassMethod GetNamespacesExecute(ByRef qHandle As %Binary) As %Status
{
	set qHandle="",result=""		// s (list,result)=""
	for i= 1 : 1 :$zu( 90 , 0 )
	{
 		set qHandle($zu( 90 , 2 , 0 ,i))="" 	// получаем в переменную list все области
 	}
	Quit $$$OK
}
ClassMethod GetNamespacesFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer) As %Status
	[ PlaceAfter = GetNamespacesExecute ]
{
	set qHandle=$order(list(qHandle))
	if (qHandle="")
	{
		set Row = ""
		set AtEnd =  1 
	}
	else
	{
		set Row = qHandle
	}
	Quit $$$OK
}
ClassMethod GetNamespacesClose(ByRef qHandle As %Binary) As %Status
	[ PlaceAfter = GetNamespacesExecute ]
{
	Quit $$$OK
}

Кто переменную N за собой таскать будет ? Вполне вероятно что она всегда при вызове фетча пустая - вот вам и бесконечный цикл.

Для передачи между этими тремя процедурами данных используйте qHandle!
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34756088
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр КобловRow должен быть списком, т.е.
set Row=$LB(n)
После исправления вроде нормально работает.

Спасибо, COS у меня в стадии изучения, поэтому правильнописание хромает.

LenRoverрылась в документации нашла команду do ^%CD. На запрос надо ввести "?".

Спасибо. Это практически то что нужно.
Осталорсь только перекинуть эти данные в .NET :)

PtnКто переменную N за собой таскать будет ? Вполне вероятно что она всегда при вызове фетча пустая - вот вам и бесконечный цикл.

Для передачи между этими тремя процедурами данных используйте qHandle!

Огромное спасибо. После чтения доков по Cache у меня почему то сложилось твердое (и видимо неправильное) убеждения что все переменные он делает глобально-надолго-видимыми, если им не делать new и close.
После исправления по вашему совету, подвисать перестало, но к сожалению в результате выполнения запроса в программу приходит пустой ResultSet. Помогите, пожалуйста, довести до победного конца :)
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34756111
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы так подправил:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
set qHandle=$order(qHandle(qHandle))
if (qHandle="")
{
	set Row = ""
	set AtEnd =  1 
}
else
{
	set Row = $LB(qHandle)
}
Quit $$$OK
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34756113
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот 100% рабочий кусок, но рабоает только в консоли
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
ClassMethod GetMyNamespaces() as %Integer
{
	// Использовать так:
	// d ##class(Operation.ABMetadata).GetNamespaces()
	
	quit:'$zu( 90 , 0 ) 				// выход, если области отсутствуют
	set list="",result=""		// s (list,result)=""
	for i= 1 : 1 :$zu( 90 , 0 )
	{
 		set list($zu( 90 , 2 , 0 ,i))="" 	// получаем в переменную list все области
 	}
	set n=""
	for {
		set n=$order(list(n))
		quit:n="" 
		write n,! // выводим области на экран
	}
	quit  1 
}

Осталось правильно переделать в запрос, чтобы получить результаты в .NET. Вот это пока не получается :(
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34756142
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ура!!! Заработало

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
/// Получить список областей (Namespaces)
Query GetNamespaces() As %Query(CONTAINID= 0 , ROWSPEC="Name:%String")
{
}
ClassMethod GetNamespacesExecute(ByRef qHandle As %Binary) As %Status
{
	set qHandle="",result=""		// s (list,result)=""
	for i= 1 : 1 :$zu( 90 , 0 )
	{
 		set qHandle($zu( 90 , 2 , 0 ,i))="" 	// получаем в переменную list все области
 	}
	Quit $$$OK	
}
ClassMethod GetNamespacesFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer) As %Status
	[ PlaceAfter = GetNamespacesExecute ]
{
	set qHandle=$order(qHandle(qHandle))
	if (qHandle="")
	{
		set Row = ""
		set AtEnd =  1 
	}
	else
	{
		set Row = $LB(qHandle)
	}
	Quit $$$OK
}
ClassMethod GetNamespacesClose(ByRef qHandle As %Binary) As %Status
	[ PlaceAfter = GetNamespacesExecute ]
{
	Quit $$$OK
}

Большое спасибо товарищам Александр Коблов и Ptn

Вопросы 2 и 6 закрыты.
Остались вопросы 1, 3-5, 7, 8
Еще немного, еще чуть-чуть.
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34758646
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Bark1) Как можно выполнить COS-код из .NET ?
Если небольшой кусок, то xecute.
Ещё можете посмотреть в области DocBook класс DocBook.Utils метод ExecuteCOS
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34763247
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр КобловЕсли небольшой кусок, то xecute.
Ещё можете посмотреть в области DocBook класс DocBook.Utils метод ExecuteCOS

Спасибо за ответ. Но дело в том, что команда xecute - это команда COS. А надо выполнить произволный COS-код из среды C#.NET. пока получается получить доступ только к своим классам посредстом сгенерированных для них прокси-классов. А как выполнить произволный COS-код из кода C# пока остается загадкой.
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34764102
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я что-то не понял, но что мешает создать метод в классе с параметром этого метода -- строка на COS.
типа
Код: plaintext
1.
2.
3.
ClassMethod EXEC(s As %String) {
 xecute s
}
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34764372
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр КобловМожет я что-то не понял, но что мешает создать метод в классе с параметром этого метода -- строка на COS.
типа
Код: plaintext
1.
2.
3.
ClassMethod EXEC(s As %String) {
 xecute s
}


Все правильно, это просто я не сообразил о чем речь.
Хорошее решение, но оставется проблема взаимосвязанного исполнения блоков COS-кода. Т.к. судя по документации xecute выполняет только одну строку COS-кода. И что особенно неприятно
Код: plaintext
Each invocation of XECUTE places a new context frame on the call stack for your process.

т.е. как я понимаю к переменным инициализированным в предыдущем запуске xecute не будет доступа в последующих запусках xecute. Что с этим можно сделать?
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34764395
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ставьте ProcedureBlock=0 в параметрах вызывающего метода и все будет видеть.
Правда про new не забудьте тогда
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34766357
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Вопрос
Andrey Bark1. Как можно выполнить COS-код из .NET ?
можно считать закрытым.
Хотя решение не идеально и позволяет выполнять только небольшие куски кода, скорее даже одиночные команды. Но это лучше чем ничто.

Поиметь более прямой доступ из C#.NET к системным классам Cache, кроме как создавать свои промежуточные Cache-классы, а потом и прокси для них, видимо невозможно. Ладно утремся :)


Остались вопросы 3-5, 7, 8
С благодарностью за полученные ответы предвкушаю последующие :))
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34766459
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3,4 Наверняка есть классы в пакете %Dictionary, которые вам помогут.
Но лично мне удобней ползать по глобалам ^oddDEF, ^oddCOM

5 не понял, что вы имеет в виду. Возможно вы путаете ID и OREF объекта?
OREF меняется при каждом открытии объекта и идентифицирует его только в пределах процесса.
ID постоянен (его кажется вообще нельзя изменить легальным методами)
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34766814
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.3,4 Наверняка есть классы в пакете %Dictionary, которые вам помогут.
Но лично мне удобней ползать по глобалам ^oddDEF, ^oddCOM

Спасибо за наводку, почитаю.

Блок А.Н.5 не понял, что вы имеет в виду. Возможно вы путаете ID и OREF объекта?
OREF меняется при каждом открытии объекта и идентифицирует его только в пределах процесса.
ID постоянен (его кажется вообще нельзя изменить легальным методами)

Речь именно про ID. Представим что у нас в базе лежат данные для двух связанных по релатионшипу класов. Мы экспортируем эти данные в какой-либо файл, вместе со значениями полей ID. После этого пользователь продолжает работать с базой. И внутренние значения ID продолжают расти. После этого нам нужно загрузить в базу ранее сохраненные данные, но так чтобы сязи между ними не потерялись. Но при их добавлении они получат уже новые значения ID.
При этом Cache не позволяет (насколько я понял) принудительно задавать/изменять значения поля ID.

Встает вопрос: Как грамотно сохранить связи между объектами? И как их потом загружать?
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34767262
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Как грамотно
Грамотно так не делать :-)
А если уж так делать, то тщательно продумывать протокол выгрузки-загрузки-сихнхронизации.

Если вы выгружате данные в виде глобалов, то они назад закачиваются в точно таком же виде, с теми же идешиками.

Но это чревато, приведу пришедшие в голову примеры:
1.Запись индексирована по полю А, при выгрузке индекс выгружаете вместе с данными. Запись в базе изменяется, создается новая индексная запись, а старая удаляется. Если вы восстановите глобал поверх новых данных, то у вас будет одна запись данных, и две индексные записи с разными индексироваными значениями.
2. Класс А имеет поле АА, указывающее на класс Б, класс Б имеет поле ББ, указывающее на класс А. Сохраняем данные класса А в глобал, меняем данные классов А и Б, и восстанавливаем класс А. Что имеем в ссылках - непонятно. А с учетом того, что они могут быть индексированы - вообще ужас.
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34767298
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, не закончил, если не хотите заморачиваться с восстановлением целостности данных, то выгрузка-загрузка оправдана только при удалении предыдущих данных.
...
Рейтинг: 0 / 0
Вопросы по доступу к метаданным
    #34767642
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.Грамотно так не делать :-)
А если уж так делать, то тщательно продумывать протокол выгрузки-загрузки-сихнхронизации.

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

Блок А.Н.Если вы выгружате данные в виде глобалов, то они назад закачиваются в точно таком же виде, с теми же идешиками.

Нет, данные выгружаются в подобие sql-скрипта. Точнее планируется так сделать. Осталось решить задачу по сохранению информации о связях. Можно сохранить например существующие значения ID, и значения ссылающихся полей (ссылки на ID). Но при импорте из этого скрипта возникает проблема восстановления связей (поскольку ID не обязательно идут по порядку и могут, в общем случае, быть разрежены).

Блок А.Н.Но это чревато, приведу пришедшие в голову примеры:
1. ...
2. ...

Честно говоря, вообще не хочу с импортом глобалов целиком связываться.

Блок А.Н.Да, не закончил, если не хотите заморачиваться с восстановлением целостности данных, то выгрузка-загрузка оправдана только при удалении предыдущих данных.

Пока так и делаю. Но не знаю как связи восстановить и загрузке в чистую базу.

PS: обсуждение очень способствует пониманию проблемы, спасибо.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопросы по доступу к метаданным
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]