go to post Eduard Lebedyuk · Jan 30, 2020 From InterSystems IRIS adoption guide: Python Binding Applications using the Python Binding should migrate to PyODBC. 2019.1.1 does not have Python Native API - you'll need 2020.1 preview or 2019.2+ container release for that.
go to post Eduard Lebedyuk · Jan 29, 2020 Have you tried sending the message to several recipients directly? Not CC but TO: do m.To.Insert("mail1@domain.com") do m.To.Insert("mail2@domain.com") Or you can send the same email object to several recipients one by one: for to = "mail1@domain.com", "mail2@domain.com" { do m.To.Clear() do m.To.Insert(to) set status = ..Adapter.SendMail(m) do:$$$ISERR(status) $system.OBJ.DisplayError(status) }
go to post Eduard Lebedyuk · Jan 29, 2020 Check Apache POI integration LibreOffice integration Apache POI would be faster and more specialized, LibreOffice is the best bet on converting arbitrary documents between arbitrary formats.
go to post Eduard Lebedyuk · Jan 29, 2020 cpp directory was renamed into iris-callin. python directory should be there in your dev directory. InterSystems IRIS also offers a brand new Python Native API. Check out community Python Gateway - a new and easy way to interface with Python from InterSystems IRIS.
go to post Eduard Lebedyuk · Jan 24, 2020 Here's what I came up with: Query ClassListAll() As %SQLQuery { SELECT Name FROM %Dictionary.ClassDefinition } Query ClassListNS(namespace) As %SQLQuery { SELECT Name FROM %Dictionary.ClassDefinitionQuery_SubclassOf('%XML.Adaptor') c WHERE 1=1 AND EXISTS (SELECT 1 FROM %Dictionary.ParameterDefinition WHERE parent = c.Name AND Name = 'NAMESPACE' AND _Default = :namespace) } /// Should be rewritten to return only non-empty namespaces Query NSList() As %SQLQuery { SELECT DISTINCT _Default Name FROM %Dictionary.ParameterDefinition WHERE 1=1 AND Name = 'NAMESPACE' } /// do ##class().ExportAllSchemas() ClassMethod ExportAllSchemas() { set rs = ..NSListFunc() while rs.%Next() { write "Exporting: ", rs.Name,! do ..ExportSchema(rs.Name) } } /// do ##class().ExportSchema() ClassMethod ExportSchema(namespace) { kill %objlasterror set schema=##class(%XML.Schema).%New() set schema.DefaultNamespace=namespace #dim empty As %Boolean = $$$YES #dim rs As %SQL.ISelectResult set rs = ..ClassListNSFunc(namespace) while rs.%Next() { set empty = $$$NO set sc = schema.AddSchemaType(rs.Name) write:$$$ISERR(sc) $System.Status.GetErrorText(sc) } if empty { write "Empty namespace",! quit } do ..AddImports(namespace, schema) set schema=schema.GetSchema(namespace) #dim writer As %XML.Writer = ##class(%XML.Writer).%New() set writer.NoXMLDeclaration = $$$YES set writer.Indent = $$$YES set writer.SuppressXmlns = $$$YES do writer.AddSchemaNamespace("s") do writer.OutputToFile(..NsToFullFileName(namespace)) do writer.AddSchemaNamespace() do writer.AddNamespace(namespace) set sc = writer.DocumentNode(schema) write:$$$ISERR(sc) $System.Status.GetErrorText(sc) } ClassMethod AddImports(namespace, schema As %XML.Schema) { set rs = ..NSListFunc() while rs.%Next() { set curNS = rs.Name continue:curNS=namespace do schema.DefineLocation(curNS, ..NsToLocalFileName(curNS)) } } ClassMethod NsToFullFileName(namespace) As %String [ CodeMode = expression ] { ##class(%File).SubDirectoryName($system.Util.ManagerDirectory(), "Temp", 1) _ ..NsToLocalFileName(namespace) } ClassMethod NsToLocalFileName(namespace) As %String [ CodeMode = expression ] { ..NsToFileName(namespace) _ ".xsd" } ClassMethod NsToFileName(namespace) As %String [ CodeMode = expression ] { $p(namespace, "/", *-1) }
go to post Eduard Lebedyuk · Jan 23, 2020 Interesting article. Note that comparison with 1 would always be the fastest regardless of where it is: Here's your code on my PC: Time for If: .037652 seconds Time for ElseIf #1: .045029 seconds Time for ElseIf #2: .057766 seconds Time for Else: .053267 seconds And here's a modified code with comparison to 1 third: ClassMethod Run3() { For i=1:1:4 { Set time(i,"start")=$zh For j=1:1:1000000 { If i=3 { set a=1 } ElseIf i=2 { set a=1 } ElseIf i=1 { set a=1 } Else { set a=1 } } Set time(i,"end")=$zh } W "Time for If: ",time(1,"end")-time(1,"start")," seconds",! W "Time for ElseIf #1: ",time(2,"end")-time(2,"start")," seconds",! W "Time for ElseIf #2: ",time(3,"end")-time(3,"start")," seconds",! W "Time for Else: ",time(4,"end")-time(4,"start")," seconds",! } Running this code yields these results: Time for If: .109513 seconds Time for ElseIf #1: .048419 seconds Time for ElseIf #2: .029746 seconds Time for Else: .059306 seconds Regardless of where comparison to 1 happens it would be the fastest one.
go to post Eduard Lebedyuk · Jan 20, 2020 Why is select * from MyTable where MyFieldName like ‘%[^a-zA-Z0-9 !”%#$&”()*+,-./:;<=>?@]%’ not a solution?
go to post Eduard Lebedyuk · Jan 16, 2020 Please post query plans. The most important question is - are they actually taking different time to run?
go to post Eduard Lebedyuk · Jan 16, 2020 Ok i will try that, but there's a way to check how many Java Gateways are running? There are either production gateways and system gateways, they are listed in SMP - System Administration - Configuration - Connectivity - Object Gateways.
go to post Eduard Lebedyuk · Jan 16, 2020 a. Check that the JAR you import has the new code. If you build in a separate directory and then copy the JAR into a final directory it can fail as java locks loaded JAR files on OS level. b. Try stopping all running Java Gateways before copying the JAR and running UploadJar. Do not create new gateway for every import. c. What does zw %objlasterror report after (4)?
go to post Eduard Lebedyuk · Jan 16, 2020 Thanks! Turns out PackageDefinition Queries are not based on PackageDefinition class.
go to post Eduard Lebedyuk · Jan 15, 2020 Create this class: Class ABC.Try { /// w ##class(ABC.Try).PackageExists() ClassMethod PackageExists(package = "ABC") As %Boolean [ CodeMode = expression ] { ##class(%Dictionary.PackageDefinition).%ExistsId(package) } } Test: >w ##class(ABC.Try).PackageExists() 0 It also won't be available in GetPackageList. ABC.Try can also extend registered or persistent to the same effect.
go to post Eduard Lebedyuk · Jan 15, 2020 %Dictionary.PackageDefinition does not contain all packages, only ones with immediate tables (see Solution 1). If it did, calling %ExistsId would be enough.
go to post Eduard Lebedyuk · Jan 15, 2020 Adapted from @Krishnamuthu Venkatachalam answer ClassMethod Rename(oldClass, newClass) As %Status { #dim sc As %Status = $$$OK quit:'##class(%Dictionary.ClassDefinition).%ExistsId(oldClass) $$$ERROR($$$GeneralError, "Old class does not exist") quit:##class(%Dictionary.ClassDefinition).%ExistsId(newClass) $$$ERROR($$$GeneralError, "New class already exists") merge ^oddDEF(newClass) = ^oddDEF(oldClass) $$$defClassKeySet(newClass, $$$cCLASSname, newClass) // Set class name $$$defClassKeyKill(newClass, $$$cCLASSstorage) // Kill old storage do UpdClsDef^%occLibrary(newClass) set sc = $system.OBJ.Compile(newClass, "/displaylog=0 /displayerror=0") quit:$$$ISERR(sc) sc set sc = ##class(%Dictionary.ClassDefinition).%DeleteId(oldClass) quit sc }