Written by

Question Arto Alatalo · Aug 12, 2019

How to read global via Stream interface?

I have global with binary data, structured like:

^a(1)=<binary>

^a(2)=<binary>

^a(n)=<binary>

What could be easiest way to read it via Stream interface? I.e. to pass an adapter to a function expecting Stream?

Comments

Dmitry Maslennikov · Aug 12, 2019

look at this exercise, it may help you to get how to achieve it

  Set id = 1
  Set streamGN = $Name(^IRIS.TempStream)
  Kill @streamGN
  Set @streamGN@(id, 1) = "some binary data chunk 1"
  Set @streamGN@(id, 2) = "some binary data chunk 1"

  Set lastChunk = $Order(@streamGN@(id, ""), -1)
  Set @streamGN@(id) = lastChunk
  Set size = 0
  For chunk=1:1:lastChunk {
    Set size = size + $Length(@streamGN@(id, chunk))
  }
  Set @streamGN@(id, 0) = size

  Set stream = ##class(%Stream.GlobalBinary).%Open($Listbuild(id, , streamGN))
  While 'stream.AtEnd {
    Write !,stream.Read()
  }
  Quit

0
Arto Alatalo  Aug 21, 2019 to Dmitry Maslennikov

Nice, thanks. But it seems that this way will work only if the global has an ID as first index. 

0
Julius Kavay · Aug 13, 2019

If you have your binary or character data in (sequential) global nodes, then:

  • create your own stream clas -in the %OnNew() method fetch the data from your global

and voila, you are ready to use your data with stream methods.

set ^mydata(1)="abcd" set ^mydata(2)="efgh"

set ^yourdata("id",1)="1234" set ^yourdata("id",2)="5678"

Class Test.Stream Extends %Stream.TmpBinary { Method %OnNew(Global, initval As %String = "") As %Status [ Private ] { Set i%%Location=$select(initval="":$$$streamGlobal,1:initval) do ..Clear() for set Global=$query(@Global,1,data) quit:Global="" do ..Write(data) do ..Rewind() Quit $$$OK } }

set stream=##class(Test.Stream).%New($na(^mydata)) while 'stream.AtEnd { write stream.Read(5) } abcdefgh

set stream=##class(Test.Stream).%New($na(^yourdata("id"))) while 'stream.AtEnd { write stream.Read(5) } 12345678

0
Arto Alatalo  Aug 21, 2019 to Julius Kavay

This way involves copying of the data but thanks, can be useful in some cases

0