Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Найчите плиз работать с потоками в Cache ObjectScript / 11 сообщений из 11, страница 1 из 1
10.01.2007, 11:57
    #34245102
ks_0987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
Сабж собственно. Такой класс:
Class user.test Extends %Persistent
{
Property pr1 As %String;
Property pr2 As list Of %Integer;
Property pr3 As %CharacterStream;
}
В терминале делаю так:
Set or=##class(user.test).%OpenId(22)
set or.pr3=##class(%Library.GlobalCharacterStream).%New()
do or.pr3.WriteLine("11111 1111111 1111111111 1 11")
do or.pr3.Rewind()
write or.pr3.Read()
do or.pr3.%Save()
do or.%Save()
Здесь вроде все нормально. Делаем
kill
Set or=##class(user.test).%OpenId(22)
// а дальше, как прочесть???

write or.pr3 // ничего не выводит
write or.pr3.Read() // ругается <INVALID OREF>

set s=##class(%Library.GlobalCharacterStream).%Open(or.pr3)
write s.Read() // пусто

set s=##class(%Library.GlobalCharacterStream).%OpenId(or.pr3)
write s.Read() // пусто

ну как с ним быть?
...
Рейтинг: 0 / 0
10.01.2007, 12:38
    #34245281
ГР
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
Из документации тынц.

Stream Properties
If you need to store large quantities of data, such as images or PostScript files, you can do so by defining a stream property. Caché supports two kinds of streams: binary streams and character streams. Binary streams are for large binary objects, such as pictures, while character streams can be used to store large amounts of text, such as a chapter in a book.
Some examples of this are:
Class MyApp.JournalEntry Extends %Persistent [ClassType = persistent]
{
Property ItemDate As %Date;
Property PictureOfTheDay As %Stream [ Collection = binarystream ];
Property EventsOfTheDay As %Stream [ Collection = characterstream ];
}
You can manipulate a stream property using a %Stream object. This object maintains, for instance, a pointer to the current position within the data. The %Stream object's Write method adds the specified data to the stream at the current pointer position. For example:
Set entry = ##class(JournalEntry).%New()
Do entry.EventsOfTheDay.Write("Slacking.")
The Read method returns the specified number of bytes or characters in a string. For example:
Set events = entry.EventsOfTheDay.Read(100)
For more information on Streams, refer to the Streams chapter.
...
Рейтинг: 0 / 0
10.01.2007, 12:59
    #34245371
ks_0987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
все равно ничего не понял. Как прочесть сохраненый поток?
...
Рейтинг: 0 / 0
10.01.2007, 13:42
    #34245551
ГР
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
Код: plaintext
1.
2.
3.
4.
5.
Class user.test Extends %Persistent
{
Property pr1 As %String;
Property pr2 As list Of %Integer;
Property pr3 As %Stream [ Collection = characterstream ];
}

Записываем

Код: plaintext
1.
2.
3.
Set or=##class(user.test).%OpenId( 22 )
do or.pr3.Write("Text")
do or.%Save()

Читаем

Код: plaintext
1.
2.
Set or=##class(user.test).%OpenId( 22 )
Write or.Read( 100 ) // читаем первые  100  байт
...
Рейтинг: 0 / 0
10.01.2007, 15:07
    #34245939
ks_0987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
ГР
Код: plaintext
1.
2.
3.
4.
5.
6.
Class user.test Extends %Persistent
{
Property pr1 As %String;
Property pr2 As list Of %Integer;
Property pr3 As %Stream [ Collection = characterstream ];
                                                         ^^^^^^^^^^ сервер с этим не согласен, и компилировать не хочет
}

Читаем

Код: plaintext
1.
2.
3.
Set or=##class(user.test).%OpenId( 22 )
Write or.Read( 100 ) // читаем первые  100  байт
        ^^^^^ может or.pr3.Read( 100 ) // все равно не работает
...
Рейтинг: 0 / 0
11.01.2007, 10:22
    #34247677
ZvezDuke
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
s obj=##class(user.test).%OpenId( 22 )
s tempstream=##class(%GlobalCharacterStream).%New()
d tempstream.CopyFrom(obj.pr3)
d tempstream.Rewind()
while 'tempstream.AtEnd
{
   s length =  300 
   w tempstream.ReadLine(.length),!  
}	
d tempstream.MoveToEnd()
d tempstream.%Close()
k tempstream,obj
...
Рейтинг: 0 / 0
12.01.2007, 09:37
    #34250660
ks_0987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
ZvezDuke
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
s obj=##class(user.test).%OpenId( 22 )
s tempstream=##class(%GlobalCharacterStream).%New()
d tempstream.CopyFrom(obj.pr3)
d tempstream.Rewind()
while 'tempstream.AtEnd
{
   s length =  300 
   w tempstream.ReadLine(.length),!  
}	
d tempstream.MoveToEnd()
d tempstream.%Close()
k tempstream,obj

Пусто.
...
Рейтинг: 0 / 0
15.01.2007, 16:46
    #34256412
ks_0987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
Давайте так. Вот пример кода, который не работает поробуйте подправить так что бы работал.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
s or=##class(user.test).%New()
s or.pr1="qwerty"
s or.pr3=##class(%Library.GlobalCharacterStream).%New()
do or.pr3.WriteLine("11111 1111111 1111111111 1 11")
s st=or.pr3.%Save()
w st                    // Ok
s st=or.%Save()
w st                    // Ok
s id=or.%Id()           // Запомним id чтоб не мучаться
s st=or.%Close()
w st                    // Ok
kill or,st
s or=##class(user.test).%OpenId(id)
w or.pr1                // Открыли тот экземпляр который надо?
w or.pr3                // Пусто!
w or.pr3.Read()         // Ошибка <INVALID OREF>
...
Рейтинг: 0 / 0
15.01.2007, 18:30
    #34256834
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
Вообще, первая строчка определения класса должна выглядеть так:
Class User.test3 Extends %Persistent [ ClassType = persistent, ProcedureBlock ]
а не Class User.test3 Extends %Persistent
Вот точно рабочий пример:
Код: 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.
35.
36.
37.
38.
39.
40.
Class User.test3 Extends %Persistent [ ClassType = persistent, ProcedureBlock ]
{

Property pr1 As %String;

Property pr2 As %Integer [ Collection = list ];

Property pr3 As %Stream [ Collection = characterstream ];

ClassMethod Test()
{
	s or=##class(User.test3).%New()
	s or.pr1="qwerty"	
	do or.pr3.WriteLine("12312312873897123")
	w "pr3=",or.pr3,!
	s st=or.%Save()
	Do $system.Status.DisplayError(st)
	w "st=",st,!                  // Ok
	s id=or.%Id()           // Запомним id чтоб не мучаться
	w "id=",id,!
	s st=or.%Close()
	w "st=",st,!                  // Ok
	kill or,st,tmp
	If (id="") w "bad ID",! q
	s or=##class(User.test3).%OpenId(id)
	s $ZT="err2",$ZE=""
	w "pr1=",or.pr1,!                // Открыли тот экземпляр который надо?		
	w "pr3=",or.pr3,!
	s tmp= 100 
	w ">",or.pr3.Read(.tmp),!         // Ошибка <INVALID OREF>
	d or.%Close()
	w "quit",!
	kill or,tmp
	q
err2
	w "error: ",$ZE,!
	s or=""
}

}
...
Рейтинг: 0 / 0
16.01.2007, 15:26
    #34259084
ks_0987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
Maksim UMВообще, первая строчка определения класса должна выглядеть так:
Class User.test3 Extends %Persistent [ ClassType = persistent, ProcedureBlock ]
а не Class User.test3 Extends %Persistent
Вот точно рабочий пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Class User.test3 Extends %Persistent [ ClassType = persistent, ProcedureBlock ]
{

Property pr1 As %String;

Property pr2 As %Integer [ Collection = list ];

Property pr3 As %Stream [ Collection = characterstream ];

Уже проблемы. В Cache` 5.2 коллекция может быть или list или array. Точка.
Maksim UM[/src]ClassMethod Test()
{
s or=##class(User.test3).%New()
s or.pr1="qwerty"
do or.pr3.WriteLine("12312312873897123")[/src]
И получаю <INVALID OREF>.
Оно и правильно экземпляр класса не создан.
...
Рейтинг: 0 / 0
19.01.2007, 08:46
    #34266897
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найчите плиз работать с потоками в Cache ObjectScript
Мой пример работает в Cache 5.0.20
ks_0987
Уже проблемы. В Cache` 5.2 коллекция может быть или list или array. Точка.

Так в чем проблема? Там просто немного отличается от 5.0.20...

ks_0987
ClassMethod Test()
{
s or=##class(User.test3).%New()
s or.pr1="qwerty"
do or.pr3.WriteLine("12312312873897123")[/src]И получаю <INVALID OREF>.
Оно и правильно экземпляр класса не создан.
Да, в этот момент еще не создан.
Все очень просто, нужно перед работой с потоком сохранить объект, тк
для записи потока нужен уникальный ID объекта.
Код: plaintext
1.
2.
3.
4.
 
set or.pr1="qwerty"	
set st=or.%Save()
do or.pr3.WriteLine("12312312873897123")
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Найчите плиз работать с потоками в Cache ObjectScript / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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