go to post Julius Kavay · Nov 2, 2022 You are just one letter away from solution... set db=##Class(SYS.Database).%OpenId("/trak/base/tc/db/ct",,.sc) //................................^^^ Id, not ID!
go to post Julius Kavay · Nov 2, 2022 The problem has nothing in common with Cache or IRIS, it's an OS setting. If a network drive is not available (for example the target is switched off), Windows waits an half an eternity. You have to ask your sysadmin or Google, providing your Windows version. The very first hit I found is this but it's somewhat old.
go to post Julius Kavay · Oct 20, 2022 Nice, merely your insert rate is somewhat low. About ten years ago, Cache inserted in proof-of-concept project 112000 rows per second. Seen in this way, the (708000/20) 35400 are a bit little...
go to post Julius Kavay · Oct 20, 2022 I do not use Ensemble, but I would try using the JSON-Adaptor, something like this Class MessageB Extends (Ens.Request, %JSON.Adaptor) { Property ClientId As %String(MAXLEN = ""); Property message As %Stream.TmpBinary; } For example s r=##class(MessageB).%New() s r.ClientId=12345 d r.message.Write("part1") d r.message.Write("part2") w r.%JSONExportToStream(.s) d s.Rewind() w s.Read(s.Size) --> {"ClientId":"12345","message":"cGFydDFwYXJ0Mg=="}
go to post Julius Kavay · Oct 20, 2022 REST-API is not my daily bread, so show me a few lines of your (problematic) code and I will try my best
go to post Julius Kavay · Oct 19, 2022 Your solution is nearly perfect, here my quick (untested) version. ClassMethod Encode() { // You read N bytes (which MUST be divisible by 3) and write N*4/3 encoded bytes // 3 * 8190 = 24570; 24570 * 4 / 3 = 32760; 32760 < 32768; to avoid (slow) long strings set CHUNK=24570 set NOCR=1 // don't insert CRLF after each 72 written bytes set encodedData=##class(%Stream.TmpBinary).%New() // adapt this to your needs: %Stream.Whatever... set request=##class(%Net.HttpRequest).%New() set request.Server="..." do request.Get("/...") if request.HttpResponse.StatusCode = 200 { while 'request.HttpResponse.Data.AtEnd { do encodedData.Write($system.Encryption.Base64Encode(request.HttpResponse.Data.Read(CHUNK),1)) } } QUIT encodedData // as an alternative, you could return a string or a streamobject set YOURMAXSTRING = 32767 // or 3641144 if encodedData.Size <= YOURMAXSTRING { do encodedData.Rewind() quit encodedData.Read(encodedData.Size) } else { quit encodedData } }
go to post Julius Kavay · Oct 19, 2022 Assuming, fields which contains commas are quoted ("aaa,bbb,ccc") and (for the simplicity) fields does not contains quotes, then something like this should do the job ClassMethod CSV(filename) { s old=$system.Process.SetZEOF(1) // use $zeof instead of error trap s result=[] o filename:"r":0 i $t { u filename while '$zeof { read line i line]"" do result.%Push(..fields(line)) // ignore empty lines } } c filename d $system.Process.SetZEOF(old) q result } ClassMethod fields(line) { s a="", f=0, row=[] f i=1:1:$l(line) { s c=$a(line,i) i c=44,'f d row.%Push(a) s a="" continue i c=34 s f='f continue s a=a_$c(c) } q row } A test output: USER>s res=##class(DC.Help).CSV(fn) USER>zso res (0).(0).............: 12162 (0).(1).............: CHAPTER I (0).(2).............: Certain infectious and parasitic diseases (A00-B99) (0).(3).............: 003 (A20-A28) (0).(4).............: Certain zoonotic bacterial diseases (0).(5).............: A28 (0).(6).............: Other zoonotic bacterial diseases, not elsewhere classified (0).(7).............: A28 (0).(8).............: Other zoonotic bacterial diseases, not elsewhere classified (0).(9).............: N (0).(10)............: N (0).(11)............: N (0).(12)............: N (0).(13)............: N (0).(14)............: (0).(15)............: (0).(16)............: (0).(17)............: (0).(18)............: (0).(19)............: (0).(20)............: (0).(21)............: (0).(22)............:
go to post Julius Kavay · Oct 11, 2022 Oh yes, some 45 years ago, 2K (for caretaker and despooler), 4K as regular partition. Nowdays you need 2GB or 4GB! Just a factor of 10^6. And yes, I feel as a real developer too. The problems solution matters, not the tools.
go to post Julius Kavay · Oct 10, 2022 At least, you are one step further (in your initial post, you wrote "...because the code is hanging at Set tSc=Httprequest.Get(HttpURL)..."). Maybe the provided MAC number is wrong. The MAC Number CC:1B:E0:E2:3C:10 belongs to Cassia Networks. Is that the right number? I know exactly nothing about Cassia Networks and Cassia SDK... sorry.
go to post Julius Kavay · Oct 10, 2022 This is just a hint: your Get() argument should be URL-encoded (colons are not allowed in an URL): Set tSc=Httprequest.Get($zcvt(HttpURL,"O","URL"))
go to post Julius Kavay · Oct 10, 2022 You are mixing two different things... Property Data1 As list of %String; Property Data2 As %List; are two very different things. The first (Data1, equates to your DataObj.Services) is an object while the second one (Data2) is a simple scalar value (in this case a string which in its structure casually matches the inner structure of a $list() respective $listbuild() function). write $listvalid(oref.Data1) ==> 0 // NOT a list write $listvalid(oref.Data2) ==> 1 // a VALID list write $isobject(oref.Data1) ==> 1 // a valid (list)object write $isobject(oref.Data2) ==> 0 // not a valid (list)object $listnext() does NOT work on objects (your DataObj.Services) is an object
go to post Julius Kavay · Oct 8, 2022 For a string like "hallo" Cache will use 5+2 = 7 bytes. If that "hallo..." is longer then 253 bytes then length_of_string + 4 bytes will be used and if your "hallo..." is longer then 65535 bytes then length_of_string + 6 bytes will be used. But there is one more thing, you should know: the sum of the lengths of ALL properties, except the array(like) properties, can't be greater then that famous 3641144 magic number (if you use the standard Cache Storage). Array-like properties are those, which are stored in own nodes.
go to post Julius Kavay · Oct 6, 2022 Use this link as a starting point and consider using either $FIND() or $LOCATE() to narrow down the string you're looking for and then use $EXTRACT() to extract the href value. By the way, it's enough a short example string, posting nearly the whole page is an overkill and wasting space.
go to post Julius Kavay · Sep 30, 2022 Hence I wrote to OP, quote from my answer, "you ask WRC for a 'WriteStream()' method"
go to post Julius Kavay · Sep 30, 2022 According to WebSocket protocol, the maximum payload size is (2**(8*8))-1 octets, if I recall it right.
go to post Julius Kavay · Sep 30, 2022 The documentation of the %ToJSON() method is correct and yes, you can do do obj.%ToJSON() merely, this works only "on devices without protocol" like terminal, (sequential) file, etc. Everywhere, wehere the data bytes goes direct to the target. WebSocket isn't such a device. There is a "header part", with information fields like the command, masking, the length of the data, etc. You have two possibilities, a) you ask WRC for a "WriteStream()" method or b) you handle the whole WebSocket by hand (is not impossible) or c) you change your application logic and send the those messages in chunks.
go to post Julius Kavay · Sep 29, 2022 OK, somehow I miss the question. Do you need the VT100 escape sequences (see here, Table 3-6) or something else?
go to post Julius Kavay · Sep 29, 2022 You try to store a whole stream in one property of an persistent class, that won't work! But the solution is already there, see this article
go to post Julius Kavay · Sep 29, 2022 Yes, it would kill set $p(data,"x",2E6+1)="" set dynArr=[].%Push(data).%Push(data).%Push(data) set stream=##class(%Stream.GlobalCharacter).%New() do dynArr.%ToJSON(stream) try { set x=dynArr.%ToJSON() } catch e { write e.Name,! } write stream.Size,! write $length(data),! The output is <MAXSTRING> 6000010 2000000 As Steven Hobbs wrote, the limit is only set by the size of the (virtual) memory.