go to post Julius Kavay · Jun 18, 2023 For routines (*.int and *.mac)- first, this is ABSOLUTE necessary, EXPORT your routines (to an file, to source-control-system, etc) for example: do $system.OBJ.Export(...)- compile the routinies (which will be already done)- delete the *.int and *.mac routinies keeping the *.obj For classes (*.cls)- first, this is ABSOLUTE necessary, EXPORT your classes (to an file, to source-control-system, etc) for example: do $system.OBJ.Export(...) do $system.OBJ.ExportPackage(...)- compile the class(es) (which will be already done)- put the class in deployed mode do $system.OBJ.MakeClassDeployed(...) That's all. But DO NOT forget for the export, in elsecase you have to start over with your routines and classes by zero!
go to post Julius Kavay · Jun 12, 2023 As I started with MUMPS, $H was a few days ahead of 50000, this means, I wrote my first programm (MUMPS V4b on a DEC PDP-11/34) even before ISC was founded. I have never made a direct use of those functions but, if a recall it right, they are used during the installation process (database creation, etc.) . A quick look into the oldest docs I have (Cache 2.3) says nothing about those functions.
go to post Julius Kavay · Jun 9, 2023 Correct.But (in case of need) there is a workaround (assuming, args is an JSON-array of arguments): kill tmp set tmp=args.%Size() for i=1:1:tmp set tmp(i)=args.%Get(i-1) set resultSet = ##class(%SQL.Statement).%ExecDirect( , sql_whereClause, tmp...)
go to post Julius Kavay · Jun 9, 2023 kill args set args($i(args))="arg1" set args($i(args))="arg2" set args($i(args))="arg3" ... set resultSet = ##class(%SQL.Statement).%ExecDirect( , sql_whereClause, args...)
go to post Julius Kavay · Jun 6, 2023 RemoveDirectoryTree(some_dir) works, if it returns FALSE to you so- either your Ensemble instance has no rights to delete files and directories- or you feed RemoveDirrectoryTree() with a filename or with a nonexistent directory Try the following: write FileUnZip,! // this should be an existing DIRECTORY write ##class(%File).Attribute(FileUnZip),! // this should be 16 (on Windows) write ##class(%File).RemoveDirectoryTree(FileUnZip),! // 1=removed, 0=not-removed
go to post Julius Kavay · May 23, 2023 In some way, I wonder about your question. This is a very specific question and a correct and accurate answer can be given by Intersystems only. If you take a look on the articles here, the most of them are about other lanuages, new technologies etc. but none of Cache/IRIS internals. If you look on the questions, very often they start with "I'm new to ISC technologies, need some help". Do you really expect an answer from an newbe? Or you really expect an answer from a Kubernetes, Phyton, Angular etc. developer? On the other hand, you are an Intersystems employee, so why don't ask somebody from the developer department? What about contacting WRC? I would be ashamed to ask such a question here.
go to post Julius Kavay · May 18, 2023 My solution, assuming that B is originated from A by some number of left or right rotations ClassMethod RotationRight(a As %String, b As %String) As %Integer { f i=0:1 ret:$e(a_a,$l(a)+1-i,*-i)=b i } ClassMethod RotationLeft(a As %String, b As %String) As %Integer { f i=0:1 ret:$e(a_a,i+1,$l(a)+i)=b i } write ##class(%Dictionary.MethodDefinition).%OpenId("...||Rotate...").Implementation.Size gives 40 (for RotateRight) and 38 (for RotateLeft).
go to post Julius Kavay · May 18, 2023 I have no idea, from which error you talk. ClassMethod MyRequest() { set req = ##class(%Net.HttpRequest).%New() set req.Server = "msedgewebdriverstorage.blob.core.windows.net" set req.SSLConfiguration="Open" set req.Https=1 do req.Get("/edgewebdriver/?comp=list") set rsp=req.HttpResponse if rsp.StatusCode=200 { write "Data Size: ",rsp.Data.Size,! write "Dumping the first 256 bytes..." zzdump rsp.Data.Read(256) } else { write "Return Code: ",rsp.StatusCode,! write "Resp.Phrase: ",rsp.ReasonPhrase,! } quit rsp } The output is just fine... no errors. do ##class(...).MyRequest() ---> Data Size: 1832857 Dumping the first 256 bytes... 0000: EF BB BF 3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E <?xml version 0010: 3D 22 31 2E 30 22 20 65 6E 63 6F 64 69 6E 67 3D ="1.0" encoding= 0020: 22 75 74 66 2D 38 22 3F 3E 3C 45 6E 75 6D 65 72 "utf-8"?><Enumer 0030: 61 74 69 6F 6E 52 65 73 75 6C 74 73 20 43 6F 6E ationResults Con 0040: 74 61 69 6E 65 72 4E 61 6D 65 3D 22 68 74 74 70 tainerName="http 0050: 73 3A 2F 2F 6D 73 65 64 67 65 77 65 62 64 72 69 s://msedgewebdri 0060: 76 65 72 73 74 6F 72 61 67 65 2E 62 6C 6F 62 2E verstorage.blob. 0070: 63 6F 72 65 2E 77 69 6E 64 6F 77 73 2E 6E 65 74 core.windows.net 0080: 2F 65 64 67 65 77 65 62 64 72 69 76 65 72 2F 22 /edgewebdriver/" 0090: 3E 3C 42 6C 6F 62 73 3E 3C 42 6C 6F 62 3E 3C 4E ><Blobs><Blob><N 00A0: 61 6D 65 3E 31 30 30 2E 30 2E 31 31 35 34 2E 30 ame>100.0.1154.0 00B0: 2F 65 64 67 65 64 72 69 76 65 72 5F 61 72 6D 36 /edgedriver_arm6 00C0: 34 2E 7A 69 70 3C 2F 4E 61 6D 65 3E 3C 55 72 6C 4.zip</Name><Url 00D0: 3E 68 74 74 70 73 3A 2F 2F 6D 73 65 64 67 65 77 >https://msedgew 00E0: 65 62 64 72 69 76 65 72 73 74 6F 72 61 67 65 2E ebdriverstorage. 00F0: 62 6C 6F 62 2E 63 6F 72 65 2E 77 69 6E 64 6F 77 blob.core.window You have to work with the Data property of the response object (which is a 1.8MB stream)
go to post Julius Kavay · May 16, 2023 For Task2 (hamming distance) and Task5 (double chars) there is also a solution without using a (for, while, etc.) loop .
go to post Julius Kavay · May 16, 2023 Or just simply "The problem with computers is, that they always do what we tell them to do and not what we want."
go to post Julius Kavay · May 15, 2023 Class DC.Samples Extends %RegisteredObject { /// partition an array into two subarrays /// return [[even], [odd]] ClassMethod Task1a(x As %DynamicArray) As %DynamicArray { set t(0)=[],t(1)=[] for i=0:1:x.%Size()-1 do t(x.%Get(i)#2).%Push(x.%Get(i)) quit [(t(0)),(t(1))] } /// partition an array into two subarrays /// return [[even], [odd]] ClassMethod Task1b(x As %DynamicArray) As %DynamicArray { set t(0)=[], t(1)=[], i=x.%GetIterator() while i.%GetNext(,.v) { do t(v#2).%Push(v) } quit [(t(0)),(t(1))] } /// hamming distance of two strings ClassMethod Task2(x As %String, y As %String) As %Integer { if $l(x)-$l(y) quit "<Error>" // strings have to be the same length set r=0 for i=1:1:$l(x) set r=$e(x,i)'=$e(y,i)+r quit r } /// encrypt an string ClassMethod Task3(x As %String) As %String { quit $tr($re(x),"aeiou","01223")_"aca" } /// check a string for identical chars ClassMethod Task4(x As %String) As %Boolean { quit $tr(x,$e(x))="" } /// double chars ClassMethod Task5(x As %String) As %String { f i=$l(x):-1:1 s $e(x,i)=$e(x,i)_$e(x,i) q x } }
go to post Julius Kavay · May 4, 2023 Suppose, you have a class my.test with two methods: check1 and check2 then after running the above methode: do ##class(your.class).Transfer("my.test", "check1,check2") creates two new classes my.test.parts.check1 and my.test.parts.check.2 so what do you mean with "give the destination package a different name, maybe the original class name" ?
go to post Julius Kavay · May 3, 2023 For a handful of methods the manual method is likely the fastest... in case, you have a real big bunch of methods to copy put this "short" method into a class and let it run... /// Transfer all or selected methods from a class into /// individual classes /// cls : the donor class /// list: list of methods to be transfered: "method1,method2,..." /// or empty to transfer all methods ClassMethod Transfer(cls, list = "") { s old=##class(%Dictionary.ClassDefinition).%OpenId(cls) s:list]"" list=$lfs(list) i old { f i=old.Methods.Count():-1:1 { s met=old.Methods.GetAt(i) // grab the next method i list]"",'$lf(list,met.Name) continue // skip if not to copy s new=old.%ConstructClone() // duplicate old class s tmp=old.Name // grab the old classname s $p(tmp,".",*)="Parts."_met.Name // create a new classname s new.Name=tmp s new.Abstract=1 // make the class abstract s new.Super="" // remove all superclasses s dup=met.%ConstructClone() // duplicate the old method s dup.Name=met.Name // but keep the old name d new.Properties.Clear() // remove all properties d new.Parameters.Clear() // remove all parameters d new.Methods.Clear() // remove all methods d new.Methods.Insert(dup) // insert the copied method only d old.Methods.RemoveAt(i) // Remove this method from old class i old.Super="" { s d="" } else { s d="," } s old.Super=old.Super_d_new.Name // add the new class to extends-list s st=new.%Save() // save the new class w new.Name,"-->",$s(st:"OK",1:$system.Status.GetOneErrorText(st)),! // Possibly compile the class: do $system.OBJ.Compile(...) } s st=old.%Save() // save the old class w old.Name,"-->",$s(st:"OK",1:$system.Status.GetOneErrorText(st)),! // Possibly compile... }
go to post Julius Kavay · Apr 27, 2023 COS does not have a pointer operator so instead of "unsigned *rx and *tx" (those are char arrays) in COS you can use string variables. By the way, C counts from 0 to N-1, COS counts from 1 to N, where N ist the size of the character array respectively the length of the string. Class DC.CtoCOS [ Abstract ] { /// Encode a whole string (and return a string) /// Use the below $ziswide(str) function to check for allowed characters ClassMethod Encode(str As %String) As %String { f i=$l(str):-1:1 s $e(str,i)=$c($a(str,i)#16+32, $a(str,i)\16+32) q str } /// Decode a whole string (and return a string) /// Use the below $match(str,...) function to check for allowed characters ClassMethod Decode(str As %String) As %String { f i=$l(str):-2:1 s $e(str,i-1,i)=$c($a(str,i)-32*16+$a(str,i-1)-32) q str } /// Encode a characyter into a string (variable) /// Use: do ##class(...).Encode1("A", .res) /// write res --> !$ ClassMethod Encode1(chr As %String, chrs As %String) { i $ziswide(chr) throw ##class(%Exception.General).%New("WIDE",,,chr) s chrs=$c($a(chr)#16+32, $a(chr)\16+32) } /// Encode an integer (byte value) and return a string /// Use: write ##class(...).Encode2("A") --> !$ ClassMethod Encode2(val As %Integer) As %String { i val>255 throw ##class(%Exception.General).%New("WIDE",,,val) q $c($a(val)#16+32, $a(val)\16+32) } /// Decode two characters and return one character /// Use: write ##class(...).Decode1("!$") --> A ClassMethod Decode1(chrs As %String) As %String { i $match(chrs,"[ -/]{2}") q $c($a(chrs,2)-32*16+$a(chrs)-32) throw ##class(%Exception.General).%New("RANGE",,,chrs) } /// Decode two characters and return an integer /// Use: write ##class(...).Decode2("!$") --> 65 ClassMethod Decode2(chrs As %String) As %Integer { i $match(chrs,"[ -/]{2}") q $a(chrs,2)-32*16+$a(chrs)-32 throw ##class(%Exception.General).%New("RANGE",,,chrs) } }
go to post Julius Kavay · Feb 9, 2023 What does a nervous twitching guitarist has to do with this developer community? I thought, this is a community of professionals and not of script kiddies. It's sorry to say, but under such circumstances I do not want to participate here. Just to make it clear, I have nothing against a video which demonstrates a Cache or IRIS feature, or which is a recording of a webinar or something similar but it should have something in common with development, with the database or at least with the lanuages or tools we use.
go to post Julius Kavay · Feb 4, 2023 Just open the class and see, what it does.Because the class extends %Projection.AbstractProjection, you could use it in one of your own classes: Class your.class Extends %Persistent{ Projection Test As %Projection.Monitor(MONENABLED=1);} But don't ask me, what the class does or should do...
go to post Julius Kavay · Feb 3, 2023 Create an abstract class and add it to all your classes, where a list of properties (for whatever reason) is needed Class DC.ClassInfo [ Abstract ] { /// Return property info: %PropNames(all) /// /// all: 1 = Return a list of all properties<br> /// 0 = Return a list of storable properties only ClassMethod PropNames(all = 0) As %String [ CodeMode = objectgenerator ] { s (prop(0),prop(1))="" f i=1:1:%compiledclass.Properties.Count() { s p=%compiledclass.Properties.GetAt(i), s=p.Storable s prop(s)=prop(s)_$e(",",prop(s)]"")_p.Name } d %code.WriteLine($c(9)_"s stor="""_prop(1)_"""") d %code.WriteLine($c(9)_"q $s(all:"""_prop(0)_$e(",",prop(0)]"")_"""_stor,1:stor)") q $$$OK } } For example Class My.Person Extends (%Persistent, DC.ClassInfo) { Property Name As %String; Property Age As %Integer; } Putting all together write ##class(My.Person).PropNames() --> Age,Name write ##class(My.Person).PropNames(1) --> %%OID,%Concurrency,Age,Name // That way, in your application, you can easily check, // if a property exists or not if $length(##class(My.Person).PropNames(), ",", "TestProp") -->0 if $length(##class(My.Person).PropNames(), ",", "Age") -->1
go to post Julius Kavay · Jan 27, 2023 my short test now USER> USER>k ^kav USER>s ^kav(1)="some", ^(2)="data..." USER>ts k ^kav(1) f h 1 TS K ^kav(1) F H 1 ^ <INTERRUPT> TL1:USER>tc USER>zw ^kav ^kav(2)="data..." USER> shows something else... the deleted node is gone
go to post Julius Kavay · Jan 27, 2023 If I interpret the situation correctly, you started a (direct mode) job in a terminal session and want to stop it without loosing (i.e. avoiding a rollback) the already deleted records. I think (but not tested) a simple Ctrl + C should be do the trick. After typing "Ctrl+C" you should see <INTERRUPT> TLn:yournamespace> Now type TC+<Enter>. This commits the already deleted item and you can exit your terminam session with the usual Halt command. As above said, not tested but maybe some of the Gurus here can agree (or disagree) with this procedure.