Enrico Parisi · Feb 18, 2025 go to post

@David.Satorres6134 , in the class EnsPortal.SuspendedMsg,  DeleteMessage() is an instance method and cannot be invoked directly.

Anyway, what it does is simply invoking:

Set tStatus = ##class(Ens.MessageHeader).%DeleteId(pHeaderId)

But, as explained in my previous post, this leave orphaned messages and should be avoided.

Enrico Parisi · Feb 17, 2025 go to post

I'm no sure it it makes any difference, but....what IRIS version are you using?

Enrico Parisi · Feb 17, 2025 go to post

@Jeffrey Drumm , it's too late, he has already deleted the headers so the bodies are already orphaned.

@Kirsten Whatley , there is no query using the Ens.MessageHeader that can return orphaned message bodies info/reference. The very definition of orphaned messages is that have lost the link form Ens.MessageHeader.

Do you know the MessageBodyClassName of the messages you have deleted?
If it's a custom defined persistent class, can you provide some detail of the message(es) class(es)?

 

Enrico Parisi · Feb 14, 2025 go to post

Whatever you use,  portal, code or SQL, I'd suggest NOT to delete the suspended messages. If you delete a message, only the message header will be deleted, leaving all the associated requests/responses orphaned.

I suggest discarding the messages using SQL.

Be careful doing so with a single update SQL statement for 2M messages, with more that 1000 records lock escalation will lock the entire Ens.MessageHeader table/class and your production will have big trouble. To avoid it use %NOLOCK.

Using Display mode:

Update %NOLOCK Ens.MessageHeader set Status ='Discarded' where Status = 'Suspended'

Using Logical or ODBC mode:

Update %NOLOCK Ens.MessageHeader set Status = 4 where Status = 5

Enrico Parisi · Feb 12, 2025 go to post

Embedded SQL build the cached query ONCE while you compile

This is no longer true since some time/version, please check relevant documentation:

Embedded SQL is not compiled when the routine that contains it is compiled. Instead, compilation of Embedded SQL occurs upon the first execution of the SQL code (runtime). First execution defines an executable cached query. This parallels the compilation of Dynamic SQL, where the SQL code is not compiled until the SQL Prepare operation is executed.

As a result, some assumptions, even in the main post, are no longer accurate.

My suggestion is to read the article in this community from @Benjamin De Boe :

New in 2020.1: the Universal Query Cache

Enrico Parisi · Feb 11, 2025 go to post

That's not the WebGateway port, it's the web server port, so you can change it in the web server configuration.

From the port you mentioned (57773) It seems you are using PWS (aka Private Web Server) that used to be installed with IRIS before version 2023.2 (if I recall it correctly).

Since you are using version 2024.3 my guess (I can be wrong) is that your system was upgraded from a previous version, so the PWS is still installed.

If so (you are using PWS), I suggest to install a proper "web server" (Apache or, if Windows, IIS) and use it instead of the deprecated, no longer installed, PWS.

It has been announced that future version (2025.??) PWS will be removed during IRIS install.

Enrico Parisi · Feb 11, 2025 go to post

Well...it's still valid for old versions 😉

You may want to edit and add at the beginning that IRIS can use VSS with a link to documentation.

Enrico Parisi · Feb 11, 2025 go to post

Yes, absolutely true, if you are not using an old version/product like Caché/Ensemble.

Windows VSS support was introduced few years ago, maybe with IRIS?

So, if your backup solution has VSS quiescence enabled, you can simply rely on it and you are good to go without any script/freeze/thaw. It's authomatic.

You can check messages.log file during backup, look for something like:

[Utility.Event] Backup.General.ExternalFreeze: Start a journal restore for this backup with journal file: e:\intersystems\iris\mgr\journal\20250210.004
[Utility.Event] Backup.General.ExternalFreeze: System suspended
[Generic.Event] VSS Writer: OnThaw
[Utility.Event] Backup.General.ExternalThaw: Resuming system
[Utility.Event] Backup.General.ExternalThaw: System resumed
Enrico Parisi · Feb 10, 2025 go to post

Backup.Task is a system class located in %SYS, I'm not sure if creating a Backup.Task in another namespace (hopefully!!) address his issue.

Enrico Parisi · Feb 10, 2025 go to post

That property contains the last run status of a specific task, so first you need to know what task you are interested and then open that task and get the last status, like:

Set BckTask=##class(Backup.Task).%OpenId("FullDBList")
Set status=BckTask.LastRunStatus

Enrico Parisi · Feb 10, 2025 go to post

What are you using to read the csv file in IRIS?

Can you provide a small sample code?

Enrico Parisi · Feb 7, 2025 go to post

To support longer then 500 lines you may use an hash instead of the actual line.

Enrico Parisi · Feb 3, 2025 go to post

If you want/need to keep the generated .int, then:

set sts = ##class(%Routine).CompileList("*.int","/keepsource=1")

or

set sts = ##class(%Routine).CompileList("*.int","k")

Enrico Parisi · Feb 3, 2025 go to post

Please follow the documentation starting from Visual Studio Code (VS Code) Introduction

First thing to decide if you want to use client-side editing or server-side editing. server-side editing is more similar to working with InterSystems Studio.

Then, if you encounter problems, please come back and provide details on what you have done, what the problem you encountered, any error you get etc.

Enrico Parisi · Feb 2, 2025 go to post

I think/guess you are using the wrong port number in vs code.

Vs code uses the web server port to connect to IRIS. What port do you use to connect to the IRIS Management Portal? Likely you are using port 80 and/or 443, the same port should be used in vs code.

Enrico Parisi · Jan 22, 2025 go to post

There is no such a stream you are looking for.

Data is sent to the browser (via WEB Gateway and WEB Server) as you write it from your CSP page/application, IS NOT held in a stream and sent "at the end" (what's the end BTW?).

Enrico Parisi · Jan 17, 2025 go to post

Hi @Stephen Canzano

it's my understanding that none of the counters described in the doc page you linked is incremented using UPDATE, nor can be modified by user code/SQL.

Enrico Parisi · Jan 17, 2025 go to post

I doubt it's possible to change the prefix in your use case (using virtual XML doc.).

The produced xml is perfectly valid and compliant to the xds, changing the prefix makes no sense.

Enrico Parisi · Jan 16, 2025 go to post

Can you provide some more details?

What kind of object holds your received "File"?

Enrico Parisi · Jan 16, 2025 go to post

You should never concatenate query parameters in the query text, instead use placeholders and parameters.

Like this:

 set tQuery="SELECT ProvId, AllwOpenSchYN, IsAllwSchedYN FROM "_context.EpicClaritySerMycTable_" WHERE ProvId=? AND Market=?"
 set tStatement = ##class(%SQL.Statement).%New()
 set qStatus = tStatement.%Prepare(tQuery)
 set rset = tStatement.%Execute(context.ProvId,context.Market)
 do rset.%Next()
 if rset.%SQLCODE<0 { 
    $$$TRACE("SQL Query ["_tQuery_"] FAILED")
 } else {
    set tAllwOpenSchYN = rset.AllwOpenSchYN
    set tIsAllwSchedYN = rset.IsAllwSchedYN
    set tProvId = rset.ProvId
       
 }
 

Suggested reading: Dynamic SQL Best Practices

Enrico Parisi · Jan 16, 2025 go to post

To me it looks that the remote system (147.185.133.137) it's connecting and then disconnect before sending any data.
Maybe setting Archive IO can provide some hint, but I'm not sure what happen with Archive IO when no data is received, like seems in this case.

I would try to test/connect using something like Postman and see if it works as expected.

Please note that %GlobalCharacterStream class in deprecated in favor of %Stream.GlobalCharacter class.

I'm puzzled by the line:

That method convert an object to a stream, but in fact you are passing a stream and it seems you expect it returns an object.

Also note that this two lines:

don't do anything, you can safely remove them.

Enrico Parisi · Jan 14, 2025 go to post

Connecting SQL Server to IRIS using ODBC connection

I think you actually describe: "Connecting IRIS to SQL Server using ODBC connection"

Enrico Parisi · Jan 14, 2025 go to post

To exchange (in/out) ObjectScript collections (arrays/lists) and streams to/from Java using the new $system.external interface you use the "magical undocumented" %getall() and %setall() methods.

You can get some sample code of using it in the Open Exchange project samples-dynamicgateway-java.

For example for streams you can try something like:

        w !,"TRY #"_$I(TEST)
        #Dim argc As %Stream.GlobalCharacter = ##Class(%Stream.GlobalCharacter).%New()
        do argc.Write($C(40))
        do argc.Write($C(41))
		Set bytesArrayIn=javaGate.new("byte["_argc.Size_"]")
		Do bytesArrayIn.%setall(argc)
        do test.testByteArr(bytesArrayIn)
Enrico Parisi · Jan 13, 2025 go to post

Hi @Ashok Kumar Thangavel , you also need to use lock to properly implement ACID, something like:

LEARNING>lock +^myTracker("onSomething")
LEARNING>w ^myTracker("onSomething")
1
LEARNING>ts
 
TL1:LEARNING>s ^myTracker("onSomething")=12
TL1:LEARNING>w ^myTracker("onSomething")
12
TL1:LEARNING>trollback
LEARNING>w ^myTracker("onSomething")
1
LEARNING>lock -^myTracker("onSomething")
LEARNING>
Enrico Parisi · Jan 13, 2025 go to post

Sorry, I forgot to mention that to implement properly ACID you need transactions AND locking mechanism using LOCK command.