go to post Vitaliy Serdtsev · Nov 2, 2021 I did a small test locally (for Caché). test.py: print("success") exit()From terminal: USER>w $zf(-1,"python C:\tmp\test.py") 0From Studio Output Window: w $zf(-1,"python C:\tmp\test.py") 0Make sure that your service for Caché/IRIS use an account with administrative rights: Windows User Accounts Changing the InterSystems Service Account
go to post Vitaliy Serdtsev · Nov 2, 2021 It should be like this (see Work with multiple sql statements): DELETE FROM TableName WHERE ID = 2 GO DELETE FROM TableName WHERE ID = 3 GO DELETE FROM TableName WHERE ID = 4 GO
go to post Vitaliy Serdtsev · Oct 27, 2021 In this case you can open the original article and take the code from there (and/or translate it with another service, for example Google translate)
go to post Vitaliy Serdtsev · Oct 26, 2021 See my old article on my blog: Examples of generating and sending Email using the Caché DBMS (this is machine translation)
go to post Vitaliy Serdtsev · Oct 15, 2021 ClassMethod testvalidator( class As %String, value As %String) As %Status { set validator = "(out){set out = ##class("_class_").IsValid("""_value_""")}" xecute (validator,.sc) write sc,! quit sc }
go to post Vitaliy Serdtsev · Oct 15, 2021 Use $CLASSMETHOD and you won't have such issues: USER>set sc=$CLASSMETHOD("%Numeric","IsValid","BLAH") or ClassMethod testvalidator(class As %String, value As %String) As %Status { set sc=$CLASSMETHOD(class,"IsValid",value) write sc,! quit sc }
go to post Vitaliy Serdtsev · Oct 15, 2021 Set object = ##class(%ZEN.proxyObject).%New() set object.city = "New York" set object.Target = "TEST" set object.Details = "TEST" set object.RefCode = "123" set object.Reason = "123TTTT" set string=object.%Serialize() ;write string,! set anotherObj=##class(%ZEN.proxyObject).%New() do anotherObj.%ZENDeserialize(string) write anotherObj.Reason ; ==> 123TTTT
go to post Vitaliy Serdtsev · Oct 11, 2021 codemode = code: ClassMethod AddWater( s, t = {$lb("",1,22,333,4444,55555,666666,7777777,88888888,999999999)}, r = "") As %String { f i=1:1:$l(s) s r=r_$li(t,$e(s,i)+1) q r }codemode = expression: ClassMethod AddWater( s, r = {"" s r="" f i=1:1:$l(s) s t=$e(s,i) s:t r=r_$tr($j(t,t)," ",t)}) As %String [ CodeMode = expression ] { r }Required mapping ISCDC.inc from CACHESYS: Include ISCDC Class dc.test [ Abstract ] { ClassMethod AddWater(s) As %String { f i=$l(s):-1:1 s t=$e(s,i),$e(s,i)=$$DC(t,t) q s } }
go to post Vitaliy Serdtsev · Oct 7, 2021 For more details, see the documentation on Caché, for example: Namespace tab of the Studio Workspace window (and not Project tab) And more (see screenshot)
go to post Vitaliy Serdtsev · Oct 7, 2021 Connecting to Remote Servers Installing a Development Environment Using Studio (Class Browser) Workspace -> Namespace
go to post Vitaliy Serdtsev · Oct 6, 2021 Those experienced with encryption systems for databases may have concerns about encryption having dire effects on performance, but, with Caché, these concerns are unfounded. Encryption and decryption have been optimized, and their effects are both deterministic and small for any Caché platform; in fact, there is no added time at all for writing to the database. Managed Key Encryption: Protecting Data on Disk InterSystems recommends using its encryption management tools: When built-in hardware instructions are available for encryption-related activities, these activities are considerably faster then when using software-based encryption. The encryption management tools use hardware instructions when they are available. The encryption management tools can use keys stored on a KMIP server. The encryption management tools can run in FIPS mode. About Encryption Management Operations High-Performance Encryption for Databases in Financial Services (PDF)
go to post Vitaliy Serdtsev · Oct 4, 2021 But in new Native API for IRIS there are no proxies, just class methods/functions are called from app and I think, it should be pretty the same as calling this methods/functions from terminal window. Introduction to the Native API Using .NET Reverse Proxy Objects The Native API allows you to create instances of ObjectScript classes on InterSystems IRIS and generate Object Gateway proxy objects for them at runtime. Your .NET application can use proxies to work with ObjectScript objects as easily as if they were native .NET objects.
go to post Vitaliy Serdtsev · Oct 4, 2021 Yes, most likely this is a feature of the API. Here's what I found about it in the "old" documentation: In some situations, caching may not be desirable. For example, if an object is opened with Concurrency Level 4 (Exclusive Lock), the lock will not be released until the next server call. To destroy the object immediately, you can call Close() with the optional useCache parameter set to false Closing Proxy Objects PS: by the way, for ActiveX, Factory.ForceSync() method serves the same purpose.
go to post Vitaliy Serdtsev · Sep 30, 2021 I did a test and that's what found out. It is assumed that the data has already been generated. COS Class dc.test Extends %Persistent { ClassMethod Checking(CardNo As %String) As %String { s tmp=..%OpenId(CardNo,4) q "test" } }If executed from the terminal, the lock is removed automatically immediately after the method is completed: USER>w ##class(dc.test).Checking("1") testC# // ... string json = iris.ClassMethodString("dc.test", "Checking", "1"); // here the lock is still present db.ReleaseIRISObjects(); // or iris.ReleaseAllLocks(); // here already more is no lock
go to post Vitaliy Serdtsev · Sep 29, 2021 ProcedureBlock does not apply to your issue at all you didn't initially indicate that the issue is with C# use ReleaseIRISObjects Example: IRISConnection db; IRIS iris; IRISObject person; // ... using (person = (IRISObject)iris.ClassMethodObject("Sample.Person", "%OpenId", "1", "4")) { } /* or person = (IRISObject)iris.ClassMethodObject("Sample.Person", "%OpenId", "1", "4") person.Dispose(); person = null; */ db.ReleaseIRISObjects();
go to post Vitaliy Serdtsev · Sep 29, 2021 And if so? ClassMethod TestLock() As %Status { New id,obj Set id = $Order(^ZUser.NewClass1D("")) If id = "" { Set obj = ##class(ZUser.NewClass1).%New() Do obj.%Save() } Set id = $Order(^ZUser.NewClass1D("")) Set obj = ##class(ZUser.NewClass1).%OpenId(id, 4) ; in case of usage Not ProcedureBlock you should ; kill obj or set obj="" (and all others variables with this object reference) to release the lock Return $$$OK }
go to post Vitaliy Serdtsev · Sep 29, 2021 COS: Class dc.DPasarela Extends %RegisteredObject { Property STREAM As %Stream.TmpBinary; Method PostMsg() { s s=$tr($j("",$$$MaxStringLength)," ",$c(0)) f i=1:1:5 d ..STREAM.Write(s) } }C# IRISObject STREAM; MemoryStream stream = new MemoryStream(); string len1, len2; IRISObject pasarela = (IRISObject)iris.ClassMethodObject("dc.DPasarela", "%New"); pasarela.InvokeVoid("PostMsg"); STREAM = (IRISObject) pasarela.Get("STREAM"); while (!Convert.ToBoolean(STREAM.GetBool("AtEnd"))) { stream.Write(STREAM.InvokeBytes("Read", 3641144),0, 3641144); } len1 = STREAM.GetString("Size"); // 18205720 (3641144*5) len2 = stream.Length.ToString(); // 18205720 (3641144*5) // =========== AGAIN =========== STREAM.InvokeVoid("MoveToEnd"); pasarela.InvokeVoid("PostMsg"); stream.SetLength(0); while (!Convert.ToBoolean(STREAM.GetBool("AtEnd"))) { stream.Write(STREAM.InvokeBytes("Read", 3641144), 0, 3641144); } len1 = STREAM.GetString("Size"); // 36411440 (18205720*2) len2 = stream.Length.ToString(); // 36411440 (18205720*2) byte[] bytesS = stream.ToArray();
go to post Vitaliy Serdtsev · Sep 29, 2021 COS: Class dc.DPasarela Extends %RegisteredObject { Property Value As %Numeric; Property Title As %String; Property Message As %String; Property STREAM As %Stream.TmpCharacter; Method PostMsg( SessionId As %String, Msg As %String, bytesS As %Binary, STREAMin As %Stream.TmpCharacter, Output STREAMout As %Stream.TmpCharacter) { set ..Value = 5, ..Title = SessionId, ..Message = Msg_" "_bytesS do:$IsObject(STREAMin) ..STREAM.CopyFrom(STREAMin) set STREAMout=##class(%Stream.TmpCharacter).%New() do STREAMout.Write("bla-bla-bla") } }C#: IRISObject pasarela = (IRISObject)iris.ClassMethodObject("dc.DPasarela", "%New"); byte[] bytesS = new byte[3]; // In real world this is a BASE64 encoded JSON bytesS[0] = 233; // é bytesS[1] = 234; // ê bytesS[2] = 59; // ; IRISReference refSTREAMout = new IRISReference(null); IRISObject STREAMin = (IRISObject)iris.ClassMethodObject("%Stream.TmpCharacter", "%New"); STREAMin.InvokeString("Write","blablabla"); pasarela.InvokeVoid("PostMsg", "aSession", "aMsg", bytesS, STREAMin, refSTREAMout); int aValue = Convert.ToInt32(pasarela.GetLong("Value")); // 5 string aTitle = pasarela.GetString("Title"); // aSession string aMessage = pasarela.GetString("Message"); // aMsg éê; string aSTREAMout = ((IRISObject)refSTREAMout.value).InvokeString("Read"); // bla-bla-bla string aSTREAM = ((IRISObject)pasarela.GetObject("STREAM")).InvokeString("Read"); // blablabla
go to post Vitaliy Serdtsev · Sep 28, 2021 See %SYS.GlobalQuery_NameSpaceList(). Example: select Name,Location from %SYS.GlobalQuery_NameSpaceList(,'*',0,,,1,1) select Name,Location from %SYS.GlobalQuery_NameSpaceList('SAMPLES','*',0,,,1,1)
go to post Vitaliy Serdtsev · Sep 28, 2021 and second, I would like to read the doc everywhere! For example, I have a 10 hour flight, and want to work. And in case, a server only has a local LAN access, then you have no docu!). I fully support it. But I'm afraid now, apart from reading the documentation in PDF format, you can forget about local documentation ("DOCBOOK" database) with normal search and navigation. It's a pity..