go to post Julius Kavay · Apr 11, 2024 I'm not sure wha you want to achive, so I ask a puzzling question: do you want to create dungling object? "I want to remove the object from memory even if it is still referenced in memory", as I understand, would free the memory used by an object but let the object referenc(es) intact, so the reference now would point into nirvana. Is that what you want to do? Why? Can you a little bit elaborate, what is your target or the background respectively?
go to post Julius Kavay · Apr 11, 2024 The other way is, to put the classname into a variable and set var = "MyPackage.MyClass" do $classmethod(var,"Main") set x=$classmethod(var,"Othermethod",params) // or, if you have an instance set obj=##class(MyClass).%New() do $method(obj,"Main") set x=$method(obj,"Othermethod",params)
go to post Julius Kavay · Mar 28, 2024 If you process thousands of time splits, it's a good idea using %List or just a simple %String instead of JSON - you can have a time savings by factor of about 10! /// old line set res=[] for t=t(0):int:t(1) do res.%Push($zdt(t\86400_","_(t#86400),3,1)) quit res /// new line set res="" for t=t(0):int:t(1) set res=res_$lb($zdt(t\86400_","_(t#86400),3,1)) quit res /// or set res="" for t=t(0):int:t(1) set res=res_","_$zdt(t\86400_","_(t#86400),3,1) quit $e(res,2,*) To see the differences, try loops like this /// with JSON s h=$zh f i=1:1:1E5 { s r=[] f j=1:1:10 { d r.%Push("abcd") } } w $zh-h,! /// with %List s h=$zh f i=1:1:1E6 { s r="" f j=1:1:10 { s r=r_$lb("abcd") } } w $zh-h,! /// with %String s h=$zh f i=1:1:1E6 { s r="" f j=1:1:10 { s r=r_","_"abcd" } } w $zh-h,!
go to post Julius Kavay · Mar 28, 2024 /// start, end: timestamp format /// int : the interval in seconds /// mod : 0 = use the time value as is /// +1 = round-up the timestamp to a multiple of <int> /// -1 = round-down the timestamp to a multiple of <int> /// /// return an JSON array: [time1, time2, ... timeN] /// ClassMethod Intervals(start, end, int = 15*60, mod = 0) As %DynamicArray { set res=[], t(0)=$zdth(start,3,1), t(1)=$zdth(end,3,1) for i=0,1 { set t(i)=t(i)*86400+$p(t(i),",",2) if mod,t(i)#int { set t(i)=t(i)-(t(i)#int) set:mod>0 t(i)=t(i)+int } } for t=t(0):int:t(1) do res.%Push($zdt(t\86400_","_(t#86400),3,1)) quit res }
go to post Julius Kavay · Mar 25, 2024 You can edit (or enhance) the above code to give you all matching elements. Below I share a code with you where you can choose the result data type (%List or %String) and the result scope (all the matching elements or just the first match). /// Find common items of two lists or in two delimited strings /// (as used in a $piece-function) /// /// itm1: first list (as %List or comma-delimited %String) /// itm2: other list (as %List or comma-delimited %String) /// ans : 0 = return a comma-delimited %String with the first match found /// 1 = return a comma-delimited %String with all matches found /// 2 = return a %List with the first match found /// 3 = return a %List with all matches found /// /// return value: according to <ans> argument /// /// Hint: the "$d(var)," part is only needed if the <itm1> argument is /// of %List type and can contain an "undefined" element like the /// second element in $lb(11,,33). /// ClassMethod FindCommonItems(itm1, itm2, ans = 0) { set ptr=0, res="", all=ans#2 set:'$lv(itm1) itm1=$lfs(itm1) set:'$lv(itm2) itm2=$lfs(itm2) while $listnext(itm1,ptr,val) { if $d(val),$lf(itm2,val) { set res=res_$lb(val) quit:'all } } quit $s(ans<2:$lts(res), 1:res) }
go to post Julius Kavay · Jan 31, 2024 You have right, I overlooked the [ character, sorry (usually one posts a piece of code and not a piece of picture!). So the above line would be if jsonobj, jsonobj.statusCode = 200 { for i=0:1:jsonobj.value.labReports.%Size()-1 { set pdf(i)=jsonobj.value.labReports.%Get(i).%Get("pdf",,"stream<base64") } ... // do something with pfd(i) streams }
go to post Julius Kavay · Jan 11, 2024 In general, $extract() and $zstrip() are your friends.If you want to strip ONLY the LAST character, then use this set data="abc,," set $extract(data,*)="" write data --> abc, If you want to strip ALL (same) trailing characters, use this set remove="," set data1="abc," set data2="abc,,," set data3="abc,,-,," set data1=$zstrip(data1,">",remove) set data2=$zstrip(data2,">",remove) set data3=$zstrip(data3,">",remove) write data1 --> abc write data2 --> abc write data3 --> abc,,-
go to post Julius Kavay · Dec 21, 2023 If you know which record is locked (i.e. ^My.Global(123) ) then you can identify the locking process (and therefore the user) in a simple method Class DC.Lock Extends %RegisteredObject { /// For a given (global) reference /// return the (exclusive) locking processID and username /// /// ref: a global reference, for example: $name(^My.Global(1,2,3)) /// /// For other lock types (shared, remote) /// use the infos obtained by info_types OWNER, MODE, FLAGS and COUNTS, see /// https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_slock /// ClassMethod Who(ref) { if ^$LOCK(ref,"MODE")="X" { set pid=^$LOCK(ref,"OWNER") if pid { set job=##class(%SYS.ProcessQuery).%OpenId(pid) quit {"pid":(pid), "usr":($s(job:job.UserName,1:""))} } } else { quit {} } } } For example: set ref=$name(^My.Global(123)) lock +@ref:1 if '$test { // in case, the node is locked, // check up, by who is the node locked set who=##class(DC.Lock).Who(ref) write who.%ToJSON() --> {"pid":"2396","usr":"kav"} }
go to post Julius Kavay · Nov 29, 2023 Just a short update, the problem is fixed in IRIS 2022.1 and later versions.
go to post Julius Kavay · Nov 21, 2023 Take a look on %SYSTEM.OBJ class do $system.OBJ.Compile("your.classname") // or to compile a whole package do $system.OBJ.CompilePackage("your.package")
go to post Julius Kavay · Nov 13, 2023 /// Use the propertydefinition-class: /// Open your.classname || propertyname /// For example: set def=##class(%Dictionary.PropertyDefinition).%OpenId("Sample.Person||Name") if def write def.Type
go to post Julius Kavay · Nov 1, 2023 the above approach ist the right way. And I do not see any problem there: First, in the very first line (of the question) it's stated: "I need to develop a tool ... what data is being consumed by a certain process, ... to build an automated test scenario.", which means, this will be used during a development and/or test phase to gather informations about the touched globals (for automated tests). So the performance is not an issue. Second, the suggestion of Paul Waterman can always run, assuming the process runs with the required right and flag. One can always provide the required conditions.
go to post Julius Kavay · Oct 17, 2023 Some twenty years ago, SOAP was a hype and catchword like today ML, AI and Python are and everybody (includen me) used SOAP.At those times I used tcpTrace (https://www.pocketsoap.com/tcptrace/) for debugging. I can't you help more than that.
go to post Julius Kavay · Oct 16, 2023 Your example shows https but you try a http connection. Is this a mistake or a typo?
go to post Julius Kavay · Sep 25, 2023 Usually, you get a <COMMAND> error, if you call a (class)method as an expression but the called method does not provide a value Method SomethingErr() { write "Hello" } Method SomethingOk() { quit "Hello" } do ..SomethingErr() // this is OK do ..SomethingOK() // this is OK write ..SomethingErr() // gives a <COMMAND> error write ..SomethingOK() // is OK
go to post Julius Kavay · Sep 25, 2023 As an addition to the above said set mydir="C:\dir1\dir2\newdir" // // creates newdir ONLY if dir1 and dir2 exists write ##class(%File).CreateDirectory(mydir) // creates newdir and, IF NECESSARY, the intermediate directories dir2 and dir1 too write ##class(%File).CreateDirectoryChain(mydir)
go to post Julius Kavay · Aug 17, 2023 Some remarks: // on Linux, it's a good idea to limit the ping count set cmnd="ping -c 3 "_host // if $zeof isn't alway on, as on my systems the case is // we need two more lines set cmd="..." set old=$system.Process.SetZEOF(1) // turn $ZEOF on open cmd... ... close cmd do $system.Process.SetZEOF(old) // reset to old state
go to post Julius Kavay · Aug 17, 2023 Four short lines of Objectscript code ClassMethod Ping(host) { set cmd="ping "_host open cmd:"QR":10 for {use cmd read ans quit:$zeof use 0 write ans,!} close cmd } // some test do ##class(your.class).Ping("google.com") Pinging google.com [142.250.185.110] with 32 bytes of data: Reply from 142.250.185.110: bytes=32 time=25ms TTL=114 Reply from 142.250.185.110: bytes=32 time=26ms TTL=114 Reply from 142.250.185.110: bytes=32 time=19ms TTL=114 Reply from 142.250.185.110: bytes=32 time=19ms TTL=114 Ping statistics for 142.250.185.110: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 19ms, Maximum = 26ms, Average = 22ms
go to post Julius Kavay · Aug 5, 2023 also, you could try the $SCONVERT(s,format,endian,position) function (Format: F4)
go to post Julius Kavay · Aug 4, 2023 set name = $name(^A) for i=1:1:10 { set name = $name(@name@("TEST"_i)) } set @name=""